From 33c4ec5998552929bf5bf2c81fc19b28dd14a7e9 Mon Sep 17 00:00:00 2001 From: Ashin Walpola Date: Tue, 4 Aug 2026 17:58:07 +0200 Subject: [PATCH] Phase 03: real CAM UPER codec + ESP32-C5 TX/RX serial link - Firmware: rewrite obu-firmware TX loop to be serial-driven (no on-chip timer), add promiscuous RX + GeoNetworking/BTP unwrap (gn_unwrap.c), add binary UART framing to the phone (serial_link.c/.h). Drop local cam_encode() - CAM is now built on the phone. - Kotlin: byte-exact UPER CAM encoder/decoder ported from cam.c (BitWriter/BitReader/CamUperCodec), matching SerialFrame codec, real UsbSerialTransport (usb-serial-for-android), CamTransmitLoop (1Hz base rate, event/geofence boost, ESP32-C5-only), wired into CamUseCaseRepository for RX and TripRecordingService for TX. - Add V2X message retention: persist all CAM (own+remote) to Room while recording, drop otherwise (DB v2 -> v3 migration). - Add jitpack repo + usb-serial-for-android dependency. Fixes: UsbSerialTransport now uses SerialInputOutputManager.start()/stop() (this lib version manages its own thread internally) instead of manual Runnable/Thread submission, which didn't compile. --- .idea/vcs.xml | 27 + V2X_MicrOBU_Android_App_Requirements_v10.docx | Bin 68914 -> 0 bytes V2X_MicrOBU_Android_App_Requirements_v15.pdf | Bin 0 -> 544842 bytes app/build.gradle.kts | 2 + .../com/hawhamburg/micr0bu/MainActivity.kt | 11 + .../hawhamburg/micr0bu/data/TripRepository.kt | 28 + .../micr0bu/data/cam/CamUseCaseRepository.kt | 59 + .../hawhamburg/micr0bu/data/db/AppDatabase.kt | 37 +- .../com/hawhamburg/micr0bu/data/db/TripDao.kt | 11 + .../micr0bu/data/db/V2xMessageEntity.kt | 51 + .../micr0bu/data/mqtt/MqttRepository.kt | 27 +- .../data/mqtt/ObuHardwarePreferences.kt | 36 + .../micr0bu/data/transport/ObuHardware.kt | 32 + .../micr0bu/data/transport/SerialFrame.kt | 138 + .../micr0bu/data/transport/TransportType.kt | 9 +- .../data/transport/UsbSerialTransport.kt | 206 ++ .../micr0bu/domain/asn1/Asn1UperCodec.kt | 42 + .../micr0bu/domain/asn1/BitReader.kt | 37 + .../micr0bu/domain/asn1/BitWriter.kt | 41 + .../micr0bu/domain/asn1/CamUperCodec.kt | 260 ++ .../micr0bu/domain/cam/CamTransmitConfig.kt | 43 + .../micr0bu/domain/cam/PhoneCamBuilder.kt | 71 + .../domain/usecase/UseCaseDetectionEngine.kt | 16 + .../micr0bu/service/CamTransmitLoop.kt | 124 + .../micr0bu/service/TripRecordingService.kt | 32 + .../ui/screens/ConnectionSetupScreen.kt | 40 +- .../micr0bu/ui/screens/DashboardScreen.kt | 59 +- .../ui/screens/MqttTopicViewerScreen.kt | 69 +- .../micr0bu/ui/screens/SettingsScreen.kt | 111 +- .../micr0bu/ui/screens/V2xLiveMapView.kt | 173 ++ .../micr0bu/viewmodel/MqttViewModel.kt | 16 + app/src/main/res/values-de/strings.xml | 16 + app/src/main/res/values/strings.xml | 16 + gradle/libs.versions.toml | 2 + its-g5-receiver-firmware | 1 + obu-firmware/CMakeLists.txt | 9 + obu-firmware/NOTES.md | 19 + obu-firmware/main/CMakeLists.txt | 16 + obu-firmware/main/cam.c | 131 + obu-firmware/main/cam.h | 35 + obu-firmware/main/denm.c | 153 + obu-firmware/main/denm.h | 67 + obu-firmware/main/dot11p.c | 57 + obu-firmware/main/dot11p.h | 31 + obu-firmware/main/geonet.c | 85 + obu-firmware/main/geonet.h | 44 + obu-firmware/main/gn_unwrap.c | 114 + obu-firmware/main/gn_unwrap.h | 39 + obu-firmware/main/main.c | 316 +++ obu-firmware/main/serial_link.c | 199 ++ obu-firmware/main/serial_link.h | 63 + obu-firmware/main/tx_custom.c | 196 ++ obu-firmware/main/tx_custom.h | 15 + obu-firmware/main/wifi_patches.c | 49 + obu-firmware/sdkconfig | 2509 +++++++++++++++++ obu-firmware/sdkconfig.defaults | 1 + obu-firmware/sdkconfig.old | 2509 +++++++++++++++++ settings.gradle.kts | 3 + 58 files changed, 8438 insertions(+), 65 deletions(-) delete mode 100644 V2X_MicrOBU_Android_App_Requirements_v10.docx create mode 100644 V2X_MicrOBU_Android_App_Requirements_v15.pdf create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/data/db/V2xMessageEntity.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/data/transport/SerialFrame.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/data/transport/UsbSerialTransport.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/Asn1UperCodec.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitReader.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitWriter.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/domain/cam/CamTransmitConfig.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/domain/cam/PhoneCamBuilder.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/service/CamTransmitLoop.kt create mode 100644 app/src/main/java/com/hawhamburg/micr0bu/ui/screens/V2xLiveMapView.kt create mode 160000 its-g5-receiver-firmware create mode 100644 obu-firmware/CMakeLists.txt create mode 100644 obu-firmware/NOTES.md create mode 100644 obu-firmware/main/CMakeLists.txt create mode 100644 obu-firmware/main/cam.c create mode 100644 obu-firmware/main/cam.h create mode 100644 obu-firmware/main/denm.c create mode 100644 obu-firmware/main/denm.h create mode 100644 obu-firmware/main/dot11p.c create mode 100644 obu-firmware/main/dot11p.h create mode 100644 obu-firmware/main/geonet.c create mode 100644 obu-firmware/main/geonet.h create mode 100644 obu-firmware/main/gn_unwrap.c create mode 100644 obu-firmware/main/gn_unwrap.h create mode 100644 obu-firmware/main/main.c create mode 100644 obu-firmware/main/serial_link.c create mode 100644 obu-firmware/main/serial_link.h create mode 100644 obu-firmware/main/tx_custom.c create mode 100644 obu-firmware/main/tx_custom.h create mode 100644 obu-firmware/main/wifi_patches.c create mode 100644 obu-firmware/sdkconfig create mode 100644 obu-firmware/sdkconfig.defaults create mode 100644 obu-firmware/sdkconfig.old diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..f6cc838 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/V2X_MicrOBU_Android_App_Requirements_v10.docx b/V2X_MicrOBU_Android_App_Requirements_v10.docx deleted file mode 100644 index b2aa5ddaeba4232293e697ed89926a45da8412e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68914 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%0D%4tG<9?BL3_|W9EL8KxTZSh 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 diff --git a/V2X_MicrOBU_Android_App_Requirements_v15.pdf b/V2X_MicrOBU_Android_App_Requirements_v15.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1de338418bd5fbcb72510da961ff16b244d4c5dd GIT binary patch literal 544842 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

Gt|PQz}uWi7K_Gv1er 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 z ziT~$7DE+nt7s{UdYYmZu+;3dUGZp%%-U-AQJMoE2S*4AxM~oZDzB0uDNM7B3WJilj zgKokJ^~`3+ghY#_^)S}Sn`-@uVxQ3*onkFI%r>m#snl_a%mgt;-?^8H`J*mhayxKr z+dQ_0lEz1jHt@QzlsGKhTIhv~j+ISDg&s~uUFN!+JbV6YpT0kFH#*d^-Byfg&20G;IS#m&V2gH)#1I3H%y_j=|N#b>I6vpX?M0`#`>?egWe-? z(2S4CTqbOJ6L7wrKi62jCFm^WpkG}*#VR2=9Ewx6vWHrx(>?atJCW^zj-H+J^?6#~ zZ(Hhz#1SyoYLj2Ab|C4!4_~+8%yM{wBSs{Es&8cjPc;GP*Kq=W{881fLAmnDI{*UA zIWqo-6PS07Cc9wf$SX|_GX*)*CncD38j9y%+puxkH+t=v^$YAzu$|+3YvQ^|e5Vv4 z{L(8oDDmrS4{)B?7d-fL+j7!_Y})!!G4JP{aW{a1o(+l^?Myb^etC@{i z^`z1O4Q=QG$oU0}&mSLFnrZD$KB{V_`K*-)dGltkX52Ft(K~mrl2IV2XpN8YN<=v% z=qQ|Dp8gOl)**Js%)v|4vJKELe+;nv-IyuoL;OKZ#*}?V1^_9?YJh(hJLlu04w2L4 zM%Tbzia-OA$?f|lLnA-veuxjRG+q>U6*_GxUFuC6np&kCfMuaS!J1Iy5~_t71ltX1L8B$d!33Bov4FygPTlt^#)sal zBF|B$_vI9MMG?9S{#762-2&{m&-bCXtdz#I4nGM1Z@*u8=GdP3FFi{f+M zzB%^M&GJ0OjHa7yD~&ZjYf$1?Ct?QfYvw-nfd}i_l)FQtztv`P7UN7PeY>79`WNhpQaJ!Xtu5rB2Yo%je6Utja|-SZi*6;{Vb5@wxUusj~hC z?m-j|TpSnhhgqXyVL+z_~_hh*gSt%*^)S6{Z2<0n+90vgguWm=2t? z&Z{z|hb}nTRsES(rV`Zp4?m#swG(9YevDx&Gf|B_w!-cn6H5iLm}6ngJVuFZw}bhW90Ey(P*Y2o{yHuyx8oB^cxg;rb(b^3Pl4`p8VEBft9TDv>=ux2#0tgux-w_h0= zD*O-nZ8pqQeJE0nhn?wk zho3iqe0%JNfmrBx4~?|tCC)F77xVvx1(2?|ibl;H7@i-;1bkCap~V;0aW0CAEBT^m zP~A4ej^7U5Ij}-V0lPy+K^^$z!_5O+RFkbz5^3_^5L6owI!0htAv8lbO7NT@MdP;i z_27QsthY@Ic#HasNWc64ITd;L1r+x8Y-D%(YgvXTqHC8$!l-)3o5sam(p2jM{6s_HB88O{&vxam64rg2^BUxdSw$YT9nFM%ww#Ardvon zD74fZ-L~;qR!3*MMUekMoDyIv{kO6yI2vZ}C zBB83(Ky{xGZydvbA8a$*4ya1ed37xnRcM2|OlL+-aLL-B3E;J1$?~zMTWmNz-qE*D zldO)0DmAavxj~B4nw}B!RO~JV>!gga6sZ`=Ep#Pt)JnRTo=jD4kvexx3TP$SfNiQ` z721%;bLw1AT6CWRmc~+zH(ey1!`}@ZWr`&Me29lWukTSZg7$CScX(KaEa6=qo%LK2#(WH-zuhS&isQ*4@zTFJ$F=@uv z!OvETe=e~itTwiLwFgnDYn*ct^=1}MUL;kmBjz#ktKhNo_6c;~nTG0YaCZD#8CW-XF52fVtXOsic2z3ZK z7ynW+ex9CGaO58@QaA=YOjK4l8h6tQoQwCUc=n;mJPOTp0+w*#hb_YZHrD&~2ZK?@ zTcO3HqaFDzG1XQ(ZmuQgROWkFL+(qq*2_++VD(E;+m7Q73opE+ZY&VRdsbS$ZbB7- ztr6&GYgSbjZ^yAT@zCK~>~jP=9bUKBHKXj{<1VShD#YyIv4wUfX z!|tt9Q%t1{`aJWrH1c?Xx*FTY0ntyGI&a!lM~~~o%Kh2O{Z8#nsz1`2%}!TXFB0z` zD;SorAN_VE#~-?;y3SUu2I61rRdU3-M+{lCDCzg!PR&F;89N=)v#M`v&K>kv$+;!V z9J`>YonSSo=vDLHJTnrce;%@h@XHmdYyQ0MQWuT29FRy@%fM|t@Z9(Xi9fzjFd0i|stAcq$%v9yHEmTICu`Ybc8&gFeeTdr36nL4yy$!W7 zlcq29hMxP`TaISCi?)pBBR$(TB7l`dHX8Cy#t#% zYfAdO1ll}$A2-ZWnTvGOG-Hw(`|A*?uJgjTVUcoclnNiCix~Q!VU_-SB>~v~D=DH(O#g>i{Qr$2%F6ctHc(vgS~?%F zHSUyIeS=*1YFb;%B<@y_WLE;@&lj|E~#E!eHwJWtbOjlx^~taF{ojwDs`TZ*`J$px*e2w^fe`vnQ-;ZR4tCs$N96p%`1h{>JapoYK2H2x zu|>&fJaV4XU_4U|uzn*ug)`dUZHT1mMgCwI{=Q%5)O^+W`hDlYK^X{qtqyZsk8wy4 zcmcOg{p$F$L5>h-JG848N51S&eR_1Od`tfvYoV`_NMba}AhSs%?TQFK0YJ^uLDA={ z$@V+n$UfXXeVaU+F-gg@!T5M-KY6Ow-#9)w>Igf1A8XlUbOtn1gWa2OnfT}2@6;0s zq}~jU&^6={&~nLZ4n5?GIOrdz0X=1ZxuwG{xVCqm5+daGSxn?H&+ond^a5_WIJ$3& zPv>26HhjsadyPlhU4}X7Q5rearA9n2>P#iNx<4qEMWVH+U;j1{qHLzn=q z&R^yg<$jxWO?fQ3C6=Hz>M5ET;3zW)nLz)LN)iV*)kbJCa`@LBhr=`;eXytk{jWZ( zy1!WPXZgAj3h#DGqqBESS~!yFvDWI=0xE`Dxi8JROnSu&;y+Rc6vBM^fhYseO!d45c@mt$2&au4KVTT%u*1L zn&XV3&-DARIce0_i7!hW%rXhI^zkguNd(Q1ev6ufK63akC1VeX;>00EzY;|~bqU&P z7fF&@)+!oSe^?GPN_tByIiI5=wXA@O0JMCE?v2b{y?*Xd-q}TIf8By+A~%pahdWGefZFi8Pj34a-PU#D)q1 zwN3Jvq;A;YJd5lD1LarbdA)k}cAWS5ReLbPTk)(kKkgySwRQ0y0-Ou!lBL>RL--tW z$hd`6$DD`NRKJqLguWaqvBdbm%C4bfc7-r!T^^)mu&v0=RU@&vPnVKk{eE^0aMMt) zj%1oL%T=c@IGRwEG%CzVo_kxdSnEQq>w|qxDFzb*g^wkm<;NWI@0G{sXhX1pYNDksBe$u@(1Gt{_5>2Qm)(&>KKngo{3G1vw9eDE`Gb z1jp5785p=gF%clwK=&AmDk=KcpQAZ#sT2% zdOsTXFX^89M#FRu95*ppij?P8(ja@S;i3huS z=czswm>@2byg{(~R!!ALaTPR`<1WM(74UXie=4b_sc#8fvV##>wIIM@BCLw6?JKx? za$*~Cd<;EGw=uG=@?-s>uUot-26L>1BTsi^s`W2C1!I(*w63TiU|R5Rm%Tkq8~SIY zFf5WOsUzI(1mdp-gZa|qFCKq9&9cX zPV_EsIaEJylWP>sXqh4wh)oGu5W^prBC6n8^pcCMM=tX4OB>@;{hCPE@)nyJ)Ke;Y zjo%bi<<76})A<|(9wf~GgeG!v=xHHj;5702Kcz!Z<@yN541Gb6FtCC~b0 zmyJ#TLRbfj7Bc}^t1!)-=$eu3HAyxNO91k^*TrdGi5qsoXvMy3+u!C-16{DOu)<^w zr)S8Ub9xnZF{<@gLJA~H!r2a!ApHLcIa6|;3u#aNk= zBw7`P=&{ad)as(CQR(z$?}H@~dzMGE^;K8CaYF3GC3tb_3lwlD&qSbHu~7_?pMsXz zvxh@Elr}~2X43(-P0rf8W!G&+76`1-QV~vG@Mw6M{t8|MJ(EoQOf^~xTW0%KMa?U8 zaoW>NLeCj8<*t4K{P?h;E~K<{kI6SJ4NU~jt%KvY`d@|wl zPr@(lUid6#`P^Cwvj28OlgcIbs-`56=W>OG-Xuv5h%kCjxzf+tqSiJCHSxEyuXxeP+j^AFxOKdry;amFbT*C;58_%(&6 z=wSnF2IU_znoHq+5GAmvgAngVnlPDu<52Gj;!tm&em7Ivjpsx1^}J%1UC{u_Xt}(Ug1J^$a~5_To79p7tfSaDAP_YuYC_>H?39%V)noj| z#)E^n%sQOF%HbL8IU0#cmYmNWDZOyDOdLrJGSU$5xDuEHprpHv)ZgTrqY7cY1*jh z7pRzrftl7GOBuMVDwB?4A(9mEb7U<@*cLGQ%W9)?kH@uVDQ8bZ=FUSJ=Kgt3 zisOU*a9mMCJ6BDJUCK2)q~F!dmjoA!I6aX+V26os_p>mIeMX@cq2B6^R&~LL zni>?Q%&GI+CtXa$n40UCVp(7(Bs5}j<{|;#?Kqj7%K2QAtbme*NR!rI@f#8gkUJUY z0TY#Yu&T#qKpgX;w!u0Z=ldfG^g)`zh5@TG_Zb_TqR8{4f2czDI@&37Q}i}XqW6n9 zCDa|MC-ZJkO%82rWv~GSXrftx=4EcY*@Sa7h?KsrvR4!Fx>NE_y{;-{zab($YN(NG zwlD=Pm=lX_$qr(938}tpa+J*Uau$03y{aC~SL)0bX0}0hzHD4&AAWcF&5v_+kFaa( zb9;Eg2XmA;BgBZ*@)wig&S*;u()l{_6&NGGY_%=#WfqI#G#-#14f($OcJU6&HQM1D6xe(pa{kOn9M zhr@aX31#|T90f2$2B+zPdhJ(3c=@UJYNll;A|>`U;4KV}4-|R;AP0+py9pK5;!zCo z7qDrP_2v8QquTe@qOM;EE-Xir5kT}ZZzrc}iv?0y-yKpJK#BWtOEW4g?B}oKv_bOn+Q3G)NeGA{gNMUGri2yYc zz|SrtG({_l^kphQ@Bkbq;*0c3RmgAy1WhyrNiJx1Hg{^YxjQw95lDybIDytPU&6aa zJWebfmCyql(ho@fPRQZDTz;IJp{$H7BQ{QPmVx2Ie8))upri?d9+B>{8KN}rc{3VY z|0*NhG?SY&aH=}BvmMchkZ8db?P&FGII%8sEvqx5pb?cn1fKW>R=}(<&OqpLr#SZt3*7UVZXT@^@pH z=c7)vJ2lsQUlmliNl6%ISWmn!s)?)7ChJUvT`RKTtTfC+QhD^0+lvME+mkJWC zSGbt#O*;eLCHsBF^PBqM6;d3m<w343Vz0A7Cy0D5N0T(;uzmH7YX_tWiTk((exm> z?0|>u%l;CDp98nm0r`s-AYO6_Zu-_zg-^qc+j5Lq1YfXJ%68A;sa^m!8^+5(b4S*nuoupQAZ;&z z$Z9UqA~!qAq|mZsV55lXrLGm1-uxP8E#X{w)7l)jbq*EXv-Bfx1i_lm_5+fg$9^v1 zeZb(>!Hn%D{DbBfjm@@elyo!1i|KUpsFNG#FCPB3`W}S3=@^S$g|QFvIdXli-8CS) zAMXMq^RVmQ5a}&C+J(@r&W+Shq+gBaRO!7F>!<7Hnj*mRq2b1Qk=?y%sqQ`C3){7h zky5wJ3O*h3nnt{18U56&B5vv3l2H{~q(7CM$WJ_&p#{4U)Q@W}5npkMGF$HU;XOgf zV5eJ`Y@Rn6WAyo>*L@J@HFnUv)r!ESw_&rJ@K7=67G|^d{FftRz35GN=E~PiZ?}^6 zWiNE_ju1g6Xsah24~_S5fKre1jCTrXn#!$MT1jKZfbz?t>8!y{@-FlPvZ;cd!rOfD zH?vGPAuh`*Da^wVKB~gLw_N{nrSnZD5m$5{(x+m7eRby9HU~|cWh~E|L@#-j-=y6+ z-!I+VGdeZk#^XDW(}wfg*eE(kp3@?-soiCLvB;g}01zl`uDgTmseU$En*F^GqgKn> zHjdxiJUjEQU>Q05{Tq7jV_eKCIs;&}+Zq5S%doB_PXq-> zd5rUQdur9j2AroKa$a~6CCO{?20U`!%4NF&^?YS~TGMi4r)#|&(h`v5Jp1uG#tR&C zeHmc)XteJLd?vgJLyB%esJJG2vC9{4q|<)hr|kp|jCPGKqsxjhiOcKFCROf!pR9^2 z*TI^Zh&e?>>123sBQH>xw{1+U1<~^^!y@AQDGgBcs##L^^XJtHN7iaSf0V%?49vg7 z47X9&R?CDZq`KfRH{WrImavuwl!YMRAqPxhk9Ifx@E+POI;A}VjC3MuW8JIideI+s zx!R*YELjm%sb|j@p}uTYjz`Wl*qgh7HT!Yq1Q)@4g|4JG52|fNRo(>+w<=q((?AnM z2j7t06uH^2E7KR7A+y8KAR2Gya!*<<6m~Y|8sRXl-QsS`?YX|YUEP`~;SC6my+R`U z62n}R5S)m2f_3e?S4SSaZM_qGt8G~?jRm-7lhBXizN3rQjgA82#sU4dWBgnj$C*PvkS>*dT!#>7E?mNt%1R_Jc`cx=2nMbQkm)t zBgh+0E-7zr6{%FMpExT{uzkg!W55ZJT8@TER{1GfBHlm5jXq$UInf8GftxZz)qVY6 zq&@+0%eQR$@}T{=r{_4&c__fT3EFQL$Rr)ZG`isx&)lhTBO4S+ZSQ!OgbablY2TY z`a=j7L?n`+;pJ~aO4#6jC1+$dl>&+0QcgZ4Z^7k7w-ohifMtGCiuLWlP zdf4o?KE*n?a(cjqO4oy>+X0Z1PzfZUF_+%~gA~^|ms}h2)j8T2|rj!le&|wDC06kc5m88yz@*kiw4M&nr2gxOGA{ zdeE5ewGl4I3lJ#RHLn0wY320_tQFhDe^p+ypc4dU0F?C$)p&;LmKp|gk7g?d)-c0ohec?fblP_gXCq+xpJV@p8vnb;8`=LWs}7j{1Gw|Q;*I|?`u}d_W@BRb4^jXB zv~pu}ChdS6^0Qn|R$v^sHSO?@1L}FlNy6cnnjFcz$LPQtNw~L%(ne{i?|lC5^!lhL zPN$hfahV1*&UiN1whu3?2*{@w~BQi{T^89=HAQ@OZc9;(jyr zc6S2kYmeE(Z?0!CE?277Jh-~JxuWF!xMIIO-brMYp7j@(L{r2}waHAEP&HlHz26T9 z^$WAh$FG7{!p zeFPTfX}fS1>FxgxqxpyPANLKjk3QPdZg7Rl*P>-~J+O|VfBxjc+^|8PDA zB8lS#%)Jz1*vl0S23GKA(xX3I?5+88=F|I_@keWo9-g=+nU&ypWS-2IbQXZbXl!V@ zu)T43xqcFQvG(%y^>xKO%r~8;cfIwQC4=?EZR^NhZ|8NtX&2ZrCiB;E=B-$@a9J=82 zcI)ajOz`3O@kw6M>vi>R+LR@03#Z#3vPx_~GyMaa(Akl$SB za^9Pnb`Skda9aszj9&UKlkn$sk+SPBU*`2;#;Yp&G~NAi85QfDq?dCH<~`(jOmF^W z^t1Q!H;!(3T;H8s>D)su_%p)uiQdGi&~q3>v9?K%3;$5zWW%o{-ki$oSBTI4;L{_W zczM{6HVhj$bbw?Qt=T;R3598rJrK0;6|Vv6Y+8mWBds$ptpFx7<4qJQYvG%X-0u$C z*II8dG|`23Shq?-JqjT&bYr0v27U`EVPn%5GUMOO6KvOpoPR^UC6jk?6PgCjb#^dv zFH-xn^QR0Xb1%RK8m8(rW^sfFoZT*}b|JkGy;#pxsaCkUNRPvV89VT`oP{Uh96@+> z{!G@4pk2v61AQLr%nFX;KV(aCAX7@_&AoJ64i&1U8xUwihk5;RDbxb<{g@}^ji+L{C3ERp8>HiW-iZ5oLYP{q`SM)Q|0y zEBL}E{vPf-+i_C)L(*#`m%{&p^ia0Hg4RXKuYKE>Z)Ci0edv6gO6JYS7);x&SY8{Rz!FMFpZE2sk*nAM^mIt zAl=HU)AOlmGt#o|gkYoFVU68y!?yu0aJ#)?Xh9ukS+RXr=wAuZSZS{Wiv;Nrs$aht z=wXYm;xj5+?}$q?ac)TStg&OU`t;|l_|pGo`HYljT*%ulQE+{clqtFvuMm2FGynWM z>sESE@U){Wc~XNKFqy$?x>noXUmK*4=Xx~YSLsnsAH)c+1(EnZKKyMguxZefgRf(o zu_{5m6;^t1_^}tAsvRCfKc+^VDzu}YCvu1~jA=x5NGunLXdWwaD1w2`{m7~$og*mV ze!b(%e8ilKZEF!Q2;4W2OT#ZMSwJQpGd~gz+CbRLj-0!n7?@R#_9V*7c8`f03f1r{ zuTT^tG-Zi128WJRWh7v~B=M#5Qf$((4hF~vf|}iHYpfq%X3cU?>RE6EwBm2V3dOFB zqsUU4)nLj|eU+j$2F??eTI}!1pL)<8?r)b@6+6uacN%O3g6|~&WmxAkHVv4GQDsQ1 z4Y2KzZ7dbG`W*4M*YE_hk?>%i!Hjbquf@^*OAwM(%+vlL>;1c)Ie+B38iHxrQ;ePN&7*hUgO~d)ZI&?P&H71<<=^aUvsPm!c@5=H1X`^U{{qnCyb#$ zVKUWq8k>}`A331#A#BuG+51qtPN!kqPt|DJ9k@kiIsqMj*ada2Qv8gy9wwM;Brb@n zU+<2%^iL?nAdS2M7E@BHRQU)-WhzZ>l{`WiSK1il5_cK^6rc4Y&*yYN-d`|Gr>Z)I1&&J>Is+`Hg{H;%>V@ub>LXI7;eiyt4g|daxh`{$~{8WD!p} zxNs*MI8>k@2%2yMTnG@v5j?G`Ojw5Lb?i*}Lhi>L0CA|#2pu{}4<1+1m54EiziA95 z=|dQQp+!q!+89QmmX(NGjwL-zwF+2HefH4|S!LD`7R^4{jRMyY+2 zP8e6N_moo&mnP9&NOFA?*J|jFlKexiVqF0uS~Fz2T%KcMlEb1ul@2QI!&popv!HGE;UJ?B z{K3rV>e=BSO;VlpuiOJ_EB_hk$w^KG6!YOOtbf1RkPj0=;h2-_*na)1#e$cBzOH!) z0ljfrbgLV5NtYs$AZWIRC0&Kj8pJ5&XgMT@_aW@q>evJ_qlq2&>>-4=k-4(arqaBC zf8AiaSWmF2_oQCuv3#iq#SK`J+=GkAHh3=4YHaYh-eW^YPNtaI!z^l>*}wYcih z$u4Xhh-YbMUXvnT7MSuD7NRUERFt;97T-;np>kRJ`1=^U{?YOXqMU$jviS38A%r>&e;f4u82KDs7yV-2A7AtTt*zr1o4!!sg4vabVgPZbPBdr6*t!Sg-tgL1`)$7W z3GNwyaH#+uXg6%U>4+C#w28l8a)?+PJ8s>aW=j7;ngco`m3DZ@n@N}&SZ&IQxLx3q zQ*Q@HVr5B^OIY9cGRn(*{y)fj=O4|YuwApPF5A^*+g6ut+qP}nt}b@j)n(hZjknCV zIDNj8bLM37C3AlGGMUNz13TGSD{JpO_qy(@QQo>hDSArqw=f|zJWdHh3qkj9IGnD+ zlYff(aaaIthC8^2@qSxY2xAWK$C?PBdMsJMoRsT=)g4#yQ*ST-SWYEm1`nOfO5}j> zk)cH7K-PS(u?mCLZ7OKvJ2-EuJ1>`%I0?JZI&D#uI#w^bL4BY=y#E`N=WB_`obY*{_BsMdvx1%N$4Z&5sj+1mB<^xSk z?VuPR#!*Bkh@z$SlXIh8zD;eEUZl3RdzjIXFGv+bMt1`|nxL?mj_eR&qP{75(^s1k zpD%ti2^rXRE7c6Js{&;7X-P*~)a_o5Ot=$$63Ze~8ZhOIE>7-M%P|n9y@-L^r4w5` z&|C4l1LJAVrnv~hi~@Gx)A=#lob|3(bU4K2_h{fEluY& zm6v%7tk874yCQUJAtEaGD$|s#tSW(Ka9JWETX|kD5Z+#|*(TaUMz{0p;&V8dyEDph z)<0+Ln`!|fnTqSrbP;Ypi+;h{m}C<~K+ZZj)XDFzDB?vB55PttcDvvv85J#hXHa!e z=`qC54SoH?hbG-jdRZ-vScd1O?N(mT;B5p0vmk@r$1ALq==X;#avKpS^QROoq063U z-mccR+N2VVi%pgXydwP68^Nq(oVSlOs(cS_4fdu)T@SE@x#^T>wj0K6X^|m z4L*zCyLx;ISQLA>U`l39l{uw1k!U^c=Lyo%*rl4P^{aOg$#YcPqVMVQYaFwvb1jU{ z2Vh!MC^=P?SPJ|MtLz>{7ocKFZ`{RUSYZ$G)~T#rMWy*W9&Fdff&12{b{m7iY$Dcs z?S|I@vE}1_7Z2`%T3e~1-qKZFN%_@!zoL~mmsQ-VGraZ2R3xbK0HR= z2K=~7S?>&M8&f{Ts;sFle0B}WPModCn+{NJ%7(GY?lCCDGh_I!0lqKEpI#~b$dL@d zCGO5YpAtM(=T=hxYc20S+3g$VZR>V^4Akzfl$_w8@>~JW#bFb~q01Vdd=So~m5}25 z=W15k-ln2L?(9a!t)XKYE4R)+UGSz8t5-dCR9H}L9EY+0|%oDF&>wi@(oqQQDhMi&`yZ3rv}h%(P`S_kH#BYR7t zbz>hT@0OU^IAMpt^s@cp+NpD`AHOw1<+jGya!Fwag)$Yh3CElxlOu4ggrpd&u%VKw z-o?vK)cN}CF2gXKAUIVM%Gm}p-??qDwpL2)+}gz;uWlsR6v7nqAjFZL(ed3_S` z46IbTp${`}{h@rI#XDi-k#y<0gYkqB0glJ;))$D29`4StAD0)h3CrAYD-4*#$vJM{ z4W&tqocB{3LoWWd1#AuE^j=rzYNI>%@qW&EEpQP+b<(-U6^G>wm7TQvaIk4%@;cg% ztA-`2!ZCUqF9|2lePMa?+}eUe2e)SJ3@bOHw~_C^uPe?f9$8+#<)>$2Mx zhrB3?bX<72!YGL2x*v_rs3zzU3?BY?VNgXfP~<>^2eiW6e@@f^M@UqsulYts?fvrC zBQE4Q_RVJqmiwFnlyTutt*z^_Yz$t-yR~EuMtdod8=6RGLjbNS*LxdaO`KX2@e0py zwgRpZ?q~P}81uVRaf?E?6uz#J{d1r?M-AJTCDQn)N3&O0L460WK>n5WLp0+S@801~p%A|kFS$68hMx^n>t+kU z`Iwk_rg)08iT`~x$Tt#c;-BU#9k{AW_jVpPm6&e1NU=F}DYIX-FvhncCUwWa?^_Qx z*M~PUumzTbSG((afg#DmEAwMg$Pa3*dmbS-YWEW*Cc-j0$k9LH7_;D^8%{u3Ma?RP zPg2!i1z|)hdgUr#iv{QL3fWA^&!n9{;*H%+asEaberKqj=r2;RC4*^@R6fd4OmX3l z2+9he$bjOQ8h0O^X@&?fr1Zi8q?5iHrRHyS6N>tG_7WPQVY5U2#=vNy)?zjDDd?!8MV|m+cmZ4 z5!}27TPI3m>J%dj>00W-nC!mK74cuzX-}LOKnZ#{y|;dI=68~^R-waBN-^ps)NVM>Y`Tu>$HqK$y_q(--50+iDD9}?tH?m*L4)hl_~`ujm#4hS zn~~G>9T*-{B&;J=vkDF(TVS~Nr)61f0Uf=z$2l$DP#Hl)_LG6cvuxcQ_I;%uNG2X# zyD}rE69yA#l@Y9F&qG&S`M%(Q=#1Ncp6~ou`4#@pGM@hrq&okV_J#irPyEkR=YP+> zz`@MK@!wF5|0UJYyL8zUPyW89`9}Kl?mVCl0fya$eX2|@nC$6s#g)|6PUB!56HKLL z6LSQYin?tO@Nk{qAD9Xys#Mz;4RL2V^?10-zs;XgeED-oXeO@{H{m=UB+*Iht)@y$Lq%KFW|An z4R-_VoHi6pK*|%XY=bU z5nQg3WSr=>a`GW?cILe4@?9`ziIgzU?4(KRdtEDE<$Qw1TRzz$O_^myDS#e)el-o{mhxEio0YHhwA&I3_Bc3?SB$`_cY89PI6&+V`&vE9i zFE0?%=Ie!(KO~Plo|)_}Ee{qedU0sB=F6@u;O2luOk;QG;-AmSbyy+m+$1+zT`=rB z>4=UyvI0@Na71iB>;uZ9;Gy$0u0&$zTKjv2e)-TIsB!l$h-561tFUL$AR4UsIdMOb z=KC)1uTebjzv7{J@uKE|x%9_ChHEb@SfpM}3D~flg`274$;eLm9SdA_Kpvess?O)8 za4Vyb|EN!F>Ig!6YR?TuoPCs?U!IN|&AY^DH%E(Cd_+M@^azf)Yd`S!O|PA6t{6N} zx&;}zea!Nf@BFe!FGJ76VXV~0>n6B;+WG)xRjaVSP5;JVbVir|Mt2jQj^Hf74=*W^ zFZ)XEf+(oOkPb)8%e0;`6q#CvxRUz`D|L2`6wpl^2E*r5&Yu68*5hB~W@QXhWnPJi z?mP7AU>Aj(;Xk+U3y(u-VA-SYjanPDczS0fJS0&~Cxo6j4%&XnbI7c`Nw$w2cNE$$ zcT<6VxTHNsv5P`DnQeM;XZ*S)V>VE3n^y8H{4|F0`V%f9Oz4IgnUEN% z;)*{RnF_d$H)((sT&Zcn(UZv)3G=z{dso3(6j#9^vO7;lz1EZLD(NvW2=(G$ZKH25jnBu~d`@xC-2h zL_V&ajNvC?>2FHk>*&l`HK$tvffD%%qQ^o$CX>as!d(}*l(k(d3dpoLQNpg!!H+I> zq@bDEgWSlfVJ`>rfVm&Lx8Me+B$_-1^{m5cd3((Vd%jY=DIu3lHf8J!ITYHCW@t+b0uS7WZ8%KQV)k0i$n&acW~#NT0G zgLaXMEn9y*!aft!K!kE#Ne{l?PUUwFv?Ie+{}KBRgB62(q;zDTuT6V}CAgxnFPO9N zvk5wY!`H;4rQnF-rs|Yz&qbWMn~AE}uosED8l$PdJC5JmV9ptZdGBK&;Lh;{z`B zic5zH%#fW9kpO3$dl4_-&o`OD?_mLaMyS4E*!OHB4S|gO%qFex{Lq?8cd{R6`bmp@J#{54)8r2B07+{u#N^z?%+4|oQa7jf>nzbu!{XYR=W)yc{Z+c6i_Sq<&zz*f*q6>{!v$> z72?A>WtELwVEeo7lM3~-#-Rm==Wn=2a5aj>iy%4#>u=-)PqzzP{x`lt z7z;+#F`<4sd{j%f#$xTbUc|9pY6ZGy!p+2@)caUZ2jy2T>OxpeoZv8?D`CcBggUKM z9%oI&=vhV768RVq^?xeqi7jkRf`&iq8Et7xpikKmE(n0-UtG%Ld@N}gmF{AN_^hv( zBx9C4Ke_&LoFvuJ;3$`q*SaL`Qr9ZiMKX$!QTq|h?I;E`-WB8)met8$Y-FH6E2*l~ zWPn=HR1|-*iI?3%=1^!v1Gw2EGM?$fr^4Gv9y5BjLGq_w0s~JKB+!sBdPL`%ey}1<3c6 zd~nYr@uX$$86@{X7SNO48*Wt6yN_dJgy_I(s$`FkWvFw9MY?7>3=x)I)p-^;HmWNh z3C%v3BN8y(;MPzdI+?GpGtk8W$JfIG_9(+4$~Nm_3H&~vz{P>346Gk^ytvc6b2E5 z^39~w-;n})3-*78aYo)!949%4%e+nb-PVSnvVOGb)aVoikTlIZY(oY1W?CvSY?OC8qW2nx&Ii{Ynu;qm6-P8hRm$6 z5BS&9UD=Hq9~vCyGwAD;{TfS12E%w%bzW%7IEcuEUzsDZrh}jsirng+)?3NS6sRu+ zvRxHN)UlS?RHH&VGjrB2{zZ9bV#=GM`^uZ|f~wr+jKcp^GBo49Q#4aOWYN?c2sfrF zgN8KislSP0am*e%HA>eMohI;xs3T3O{B7V_zgg4Q1G)zM75ntPB);3w6&~FLW9api;v7*u_4_mRO3yri{vBQCE23 z-=>AGwS=6Gvv)l_MJ^CTAeVEHhvPlhVLd>={n-}6M4<-DG0+@#v0z{WM%@o_0(-@_ z>s90P_IDfnWWsOj7`J&r`gTgXM#i3+0)J=0n^cLdre1{g9gB&L!$CbW1tKbEE0yH_ z0i%c6a&;$zT&i(TZn3u~rX5_N;#_zVh@qwR7@T<*jruDtJ&q_k zr=$>>S-u*9FtYOA6rwl`zrIpdJT`+Mav)?xWkN}~j`k1YYfYG~G_O(LHIgN4x_wKB z#F@q&Phdnsfjwl^Tdv>nIr9jy%8HZklAg~e>G!+7%p3Diq|)oNg42;;1BRYBn(4Fq zR<`(Y9wrBbyxdb6wJKLEG!`S!GYjQf4W9oHbA%CGw28Bo+C{LTbF{iW$tnU90t|Bl zqk3-U-7a|L0~YOC0?vWm;Et_ou`^Ll9e2g_SSl7NY<(R@nP)T@wGx`;y%8=e{FxH; z5@3BY3henMDQIac*cBumDVE=qxX>maS$YvVRvd)afi$uBHKId4bE6s)6s+ywKHX)u zn%?MkU^aPk$8MZ?_S9vDo4I@EjB}dCH!kSXxH`{N=LMB{8o5428HMC(M8U;4aUH$e2*r>^AAA@fi2NM9HWvmCSwF_B!g z=(aF6d!eAh1+@&`Iyf3Pi>Bubp@TC1GBxXYM4j%+jr8-tFSFE|^J0={!w0^?VuB2R;9^y!S~$o^^Y`QE)slCNrVI3M>EW{&hi8dg~#2%-T)4hMY( z?I-Uzx+G4TWQm>IXux#)@K7O%4TU@=gw?4uz(v))q%_#76~m{ooCl+G|g zo3~7JgM=dtgmBB0dhH)E&6K-G=@oD>Z3jD%Hpnx_*xPEF=_8zP8C7l2NPfGtQ@8zxeRH`!IA{#FMe zbX))97b8!stA^@CorXeuZxW*vSdWRv>_T+7kN`E*a<6a`QsPnH|6?Do>vcwYuCd1& z{@)*Q8OinRhI#~se>2udbO< zsP^4eqwnc@pmmM~tF1>MA^HuLDO>f@vyWEe^cdWI#!1MjW(=C)#D>34|9d&JnKDn{ zPSl|%wW?~Lcx#vcg2O!{tc8Eu}>ht(jLZzy^#{3K6anv%U zXD!J^+#+4;wyL^a(QkS%H{3x6S-3l`27j`~cyiV1Fz}WkYcdMUV>~027bOo6HO(%^fa5&oPdQ$^fv{CkP@VVE( zVvlp2R>RMwc2I}Wb^=g8R79D>+b7)n{iSw9xEu;~)(`(@ht?H_5JJitbDyJ1ZPF*ttU`1~71(ZD8Ebj;1ps5eFD_ zcm#fQOC`yeJQI$X!kdz2z;*VVw{Rn_L^C>mb2?(ds{U zL~y$#D#wyQV)WR<>p!%cvEI>`J{_kHZ+BZEZ5RZfipQJyslxX&2h~G))TkYKRp;Wv zu;65k;U}NFX?1p&yC>=9kqew-s|tUA&-D5o0>q7hNYoWPHgm?Pl=#>6MSi1|w5Y74lBexs$S<}xH;qxu6#t!T z64o7&iQPRTr+}|gbCnhQ>`TIbbbPmGDG_e;2>MkN_qX29NPxurO(~`@hM$VF0jE~a znv9ITwc%S%kX=Dzo=jqvY>20)IkgMQy_;(KhfUy>06c>YSmx6Y z{G+Y)R`5GS2u)5vR1+jA_74cgCl1w*+O|&a*d&_MrhE7f1d%3g-KEJVwQ*;k!;0$L zL+aJwNG-GQHK>@Kz+FnORQUm>m<`k)Iiy>xy~V3#6i3D$dM;~cyoJOj`X-&@2t!?s z=c(j?8@dzrR*!MTsmY9Mf}yT|TlDE7>&ui;B?iNZ6ni-ANVn3>Cg&jF?8C1o8^hJ+ zfEt|N2is$GWe7;6yk#Yw^Y`fB64`^IF%Y)|k$OZ$1$yT>3lQCa(U_e*^?ARGhKNAlK7QXm4K#?u@Yr7k)G)y z72_G$qcVqx#FxG=Gj166ds9fObMPEq;T8fqb;7Up5|nm+b`P%2>nG!;Cm8D}2U_hX z^|{+V;n}!XRmOvwH?;e|yTM}@^6JY?+=2`lTlSPzz%n1bg7L~Fo7iQ6?n;^|1{)5L znO?^&5E6l?@^SWU*=1)~ac`U1QUu8v{_&2WEx9cls^|%3#cW{Sv4;t}?Lr+!1Q_oi z;nU*TbvA}u@*AMKyR^HCR`R!~3>8nLcsrxSM4R0>1^Zkfb(+^!0`>USf-H^Qq&EY9 z@7CHOxSn-;KpFY99U=?Ux95;I3hQtSg@AimxHFc?nUgSU3Y9+XM;3)?s=4j#;%_Ph zVpS%0tWum!Eh{GJL#Y>rBDS8AtzM1T9pyj_f@W#{A+9jkjSB-Bty#zM{?hb;L~04G zap&h}CLBa%-1MSOuFsUHIx zW!(|%mUi|N)-K&r!cmH~EBqS^kt!3P2dR8dtlR^1G*JBD=thi|t>E!tgyA#dJmG1> zOiQuIRupcMh?PBgRm8nwilgC5i1T-wI6g4mtWoTHocP$`d-g&Prr82!6_mR3GAEMd zS(Z~6lS9G-A_YLSob+#2wsXhcYCRrZu92(|Ryx>!hS_(#t;rN4AJ*o9>dfUG&s86T zN56*YRI=kX0FESFCheyY263AX$rHauz3-L+=Mt;#EPKS)w7lgo!%X0g(K>Ut-;L}p z-0;kno+q(x-6Xu+IJ0SAMF<$?;VND6vRNDg&7DMEQ>!Df(&~MJx{xplXX_Kw`CVgE1dvidKTf&GWU z;D6>S|9dhpW+wLktN1|E&S8@S`OCiVd%s7G#!$Lsr=ch?uURhK%g)@4AQ3Z!WHP=} z%9*}h@7vF-xpTaXc^DvsmydUbU`wiHr4^(_Z^sC zTeL&D<{eX|_HkB|hF(Ue3!13(@oS(E~+PTneNH*K!jTmO$8D~LtdaDzxAL!y?V%D zRc|+L!gcem+l7^^M~k2%$Xlq=Rg340>qxVX@7Vee{1cv1?Mj6|6?RV8cX>F793tX$ zF&^y}69xIHTNgLPA6|Uk{evAi2{Tfl$Nh`)i1Fe6B*tg^Fc~3O4?mdXg#;%jSrinC zzgcD{1!&~C)e=X<;LIL|11q1NtFXET*qUvKG{B~(d+Ju77WORwyl zp~-8RBEFeDVe~qX06Bu!oR{NHX#~YvU7Qt@d!DRjwrOly@jR@S)!dIK9hk zVdcYs(5lq)`W5BOI*RL4*G{WWe0NGxDi>=4ZcD{A?0ECvB80s@ z;*)qZ_0u6reVfXLKZa(g1}K8S7}v#c|LR(&Sxn6KAfNcOJ-Z7K8mgop@~|o@i9=v__}7!7FOP zzi{ivDLS&PBWnFI1Tz?=!#&A+ynl`kvUA}wXVWzf7yu;HOh~EjA2v%v; zW;$ipDKXSVE7?!Vd|L=4lj#B+1a+GjFw!JMFLp^)%6aj-)U|$x*(f|l)jbzaoibq1 zzBj_B_Q+Q{F8UoW7o;`Fri$x0|711%d*mVO|Mn8^H8w)e_|mN>oINZlQCtQf1d?%QG8CbsQS&AEt6(^@u8 zcq&mh*;(D*8?z&}eyZ!gt>;gG`2JzOCUA_^y^~+E-F$^KaUb!7WBwddUN+MYTVIzA z>@kY(g2p6JPTCLr{qdfek220JnCuH_cX~GepB~O!|IavU7{&hw2KoQ4L!9fs)L!!+ zDfj<4#Q)>b|M$ovJ2TUNh#>!$aGYS>`HNRarhkOyf*T}IV46HVk`6ZgFoV(mjV`m-*XiT#IA-uKouSjM)BQc<;q*Zuq#5e4mm*?} zr6v?nomWoXY^C9bNJcf>0o7#0$6r&e`rLy}qnAyh9)I9LMt`rUI%0A?_6IzcuxDa@ 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%0DD61=(o8cMe*C_-6_?oD5r41YWZ`m&ker5I*U$ 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%0Air#t+#+1)A0SD2?GW3?u+YB)hX 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

7!~g{Jo8&Lo=m1~=vJWVB-O;4yA*c_%Z&RZ2-; zo*QIxRe{*Gc@G%Y%L2)TRk&A?USgA541%GGV645zI2Mjpnc-MC-e8_%Ya_0h3Bieu z%h$}44cH@UGAFL(nfN`qwUK95#51H-%ZIL}Lta6J;&wDumH0j$wy` zoMXW#*t%u~mV$BC=PF-MgMH&qtabMO0~4lr$fXq1lt`kG$n9~jJL%Sb5-t4GhdYl= zr@%>arB0_aICWCF!kDa7=)UXH$>qm+oqUY=KGMm1@16U?E~tNp0)SUX0Iw#&n`~+d zGRpVZ+`!yG_V|%QTXLtqz&y&GDD9d$#2wd)k2CwLGu2T*>kHizDW;_!@9?$|Dk#so z%YtVLx!2&HqA^cA%CT_Nk0h)%HG}J^MYZH7@}22P$R?QAum$Y4fCc6?ULY4#3YigQ zPqdQd2LxtPGO04tk+EFegYJm(9<+E7e){1*HOXhln&)mwf zaQG>PV^>@NhfB5DyRbpJ>|?vg&8PAP_k5MG$y_pHz)=?mG@Ao)P^GarT(gh7$^u}& zyd!GS(t=-3ZiOi}Ac|&%Mgv6gh)UT!#rCmQEmqh9AV{nI^QMxDC5-+$uo+v31IT80 zy}^f_jkk!&lq?0N|P@%2jlFM{&WSb5B!PY_s)pp+|8d*ta*87A?9YA7FaiPYpq ze*p3U8${s z{906N4PoKy<)**cVk{a#TGeo5w}PNy`N6v51Gu^pyvXW%7fd^&L2OiQ?^ z1g~LjMoM>&{8Tmlj@i7soBmB7)8gCwX7|WVZ~7+qhUWqXntcPOArraFFlB26QV8Kx z^x#9?3D# zy0WvM9q-!fG*|~Z-yK|-O0^&Q#^U@_H@E8iZN9d2HtY?x@4TlPFMCOyUcbD&e>PK2 zTle48#-y#&yC#3*i`(S)-#)s(-$@?}dPCdO<9ANCx-Ev3CzzrXlz-EX-u{JcZQ}WaC{tY7Wa0nXj7-G zH5Ff5FVe++jcwaI-D#4+wG6n>Tlv&banEL7e572C3MC}*@^CpWWQf-kk%Z@;+TE%& znAKXHNd@zGM!V6mX@7NpJRj1I-S_OxM_;_JtPl6b=jFJKN51?%Dk~`r-@C8R5Fc!V zbLmsSt9(YhNMtek;!>fVY^g(3^Cb-p*ws9iHJER$9t;zV0D}=$Fe)}t!oMjnLa?U= zrFSkQM?$4qLI-FNndTvHaba>E!~fcoD32p&YlmZJ)Nqw_&FTex`k56g>L-WroM@B^ zmB{5UR&Lxlozhr-EM!P1;(;rFA}7UZ!c6#yZ({V{;6(69khbu3^(zpmjOg{PRmfEs zsp=(ak#G^_^?+u1vYP=Z&nvuecLcam^pagyK{R}WOYn6ze2o)^inqgqo@en zGR<1`jnF-WmI9avvVS#gjIF&r3HV*34t>8A(?UvSdRpRn@QvjL1ZdxBKnx&1SW@se zC?E##H_{w2V9li)t_Xycrh(YP`Qc%p|4#y{SBP!I9xSCV5F^yWxh=7s7s1O7o_;_l zWDQVqN(rpN-hNMTsIqGsQfX?ylP54- z8j0+t;+L_-p6ct>+kA497*ple&ZJ~zXPxuZS4ZTUP)tEGTComdTWHfFL zcZT%6w>&&XZ+ zOrQ;zi>P)AYXsDXC2&qGg;WBZAT}XCkLTOV3Cu6?3gAG?$_~R7iZbab?koF}Ho1tT zrE;kxX!WN(8o?hk3Y6CFJFzt(Q>gU@HQXjZY)Uc}`hTodAc916n*I zgC~uwcsyQ0AsP|-)5-_AhR3+dt#5qC{0wmt%nthbqP!t zX&tJQ%f2PpJ_uUYc(jc_{FS|u_eLA)-mHtAJ5R%?-k#b_%+~XZ6Q5~&rSnGibwmK zL=f6u6hZAROp&Fvds$#a(uO@Rep~YsJRS=~W%gt-#yCP7M?mAqU4ScC7q&p0$1VM9 zw-mv{uGxCzCGrE{u;@t1xzUjjs`4Hf=`SU_E6J+8L0TF?p7T70EQkzw&`0QXpiQ!! zXGfvqvBZv!44~08?8@N;apEx|HgZMQ^G(cr?;|g8;@7Z?0<3oHP%3{ERfxbf8B6P6 zDu1lzu|SXvi(4nHK33`8F_h6ICr8Vn?YCFFb>AhJU*)^3{iHsh-mz`MksgS(4Ye47 zQ&ScEKfv`YaS?G{i@6Se@UGx$&aShY32a*PD0Mo)BSf1?H0&cmesF=-K9hI4R=;;Q^uN&fX+!y2KV9J`8ZxPq8~h`XU@2>Z}} z38)CMNM1p7bQR)c%s|HV5UVqyA|o;~A|+c8%wrSe^0%5Im&4%3lU9(521s<@N=Wn< zDFwvvy`Uw=763c#7fJG*b|iR_r1+{?*qg?aHC+QbpB4ULFcfl$)s8?g6slGgdo5rn z^e=mk{>^Pi{@dZs{Lyb61+QIy>+C-`0YVwSvv6>NIXL7a|IgtU9vt2LnWfvn>j-!~ zS-JP-eEY6@$42hmlW(897j;T5pQe8Vs0TYG&kCKA{>~vbm*?Z{vBNo@;A4C=f1Ko&>mdw7p%7EH$rIl>6ZSuxqAPz$A|CP*JlK=-SU5( zp6T0n62;G_QTz<4djVT^Kwhsh0o632PzepD$Q&nNPeu!o!-Ckb!`g589oB@M*MuF` z6h(zOTv2XHctyGtq>p2y8}?-A#-RJsyeC6w$q>$Sq)_dxV?@`DS~AeND_Sz@fDqRn zW6PnYdri_>iF9`Fsa>(saJdEU3215-QZFwFlqE06^Fgi9o3S#A{&(D*flFR%Q8e{U z)TNE4NjVkDw9`zq!t!B1t#^-0v@ z<+BNNpn|O*Y2#<9Rowy2>>(0N3H41%BA3am?vUA@>F5crwua$>p1fP_54lw$nxt>G zc=U3)TxLpDyFPkutv$T2b115%WeSB{15vsruW;0>fF>1EhyBL%Xkm0>^zPATN5u_L z=KsM%m?J?OfbF}+RS@S0+MN7((TnlS5t2C+TOQ6Fwpc*R=zNj<543TK0=kf@B62Ii z+Xxu1pn6tCsZzh_QoO6*qTj7w(9;;U{AUnbe8ln&HV8GqavrXH7J@`Kz?C;d+r@BK z>KCkD@h(f~b$Xwk*3dj;`Ogqu`H0x^j$kTkVCAs4<>TO$Q?KUc?j6r;AI?}5B8W$x zDBRH9GL&^ji(9r$7Nha06H_6kCvKL~G^&RPbXL+W#ke_EoZ2>BjFOsR7D$QJZVGvg zz{z*|oQ7a$IMN>T1`_=@^mXj1w5kkdol0xbK~zhN-C_)8T+xo0FVNDrmB8E-&x?-` zUn2g1v9`L&pA-9uoq*;8!~*%&QYdab@c<0gdbD=!{J{PJqgHDi*e@EphZsA-c)8=H z?wtoqqwh{_nc6+IFh!@PQd8S=uS5=xY=5UT_JEeNGmpTiM~-K$#`ZrQTyV{!WZUbP z40xs0fJ^*!zl5Mz7;>Zi1asWWvG_t$qkuD0x+&ij;0(If!Q3k>xLRrZJ1n@KUCXg{ zM*av2rsVvbx3Ui~p~pU7V^en1Za-=@zswu*x1ncro#lV=JSCEpx@9nqlLtCR8kxMYh$Och>bEBh7HekbeOsqaZf*G$L~j=oM0^53Z_z82 zS|J6{*bUfLiWf&*K2H|hTen-uV{)Xrw9zpgq zPUwS4-XwIh?#MYoni1OY8DS8 zv2d)UEONX2GuF6H>+LXi|9yfCB~TnrnlF}WEhH>(ImJI#sC#HJhrnz!J#Z) zn#JkhOE7g`>k;QkXUD@3jEZgc0%-zGCj`37d*=Y4FsoXsn!!~PIB_^gatd)DQ?jGy0cu%?BC?}>of|U>J7}$ zoAhe6dOdcKq_FM8@|EWHM!Fl=n=cTrB2L|WY!Gs4?w%-2zHL6fS?7Q(i$v~?Om6Oo zSS*o_&68r{z}$($Ck`J_a1WR7VU96_QO6v203v~i&drR$GUDg^#%g`9n15NE6#|@t z775Sq4JmzrlMXcS!wQbA4SisaV-GMhWyH#vu|7Edd6vHb#(hZOlzxE+oxYaN+2*Qq z%?j1P{#y25x?3ccOQdF$hxcl0y|)HG&g{1~a8s)HN1I58Oy|F=_H9f z9EVj{o7>7c4^u{tDz{k@N=YjrCZN<=AXeX6X7?nj~ zR2GH1)I`x@LR5zqamhcP$MLO~_vF01CkI|XKoK$g<=bdecs@k-@^PORb(_puU$iUSe2UVtY_xvr=$Lm>5w95~D0#LD) zRP$KkS3W3O;R3rC?Qs+Kk{ukBwFQN=HRm6+i$H?TN%JT3Jls|7brM%pJJPPQv*-;U{%sbRi|UP;Cs1 z7MK9)#v5m8Z41zbl^y{X(L>QENQ$PGFCzp=Pt2|nEx#%f!@Vf2?x0aFS{BiNrW8iM z)9TSn>Aw=m6)Ne6{~aPmiewrEyV#0wN{b;_#;U3*-M4OWk7SxnffMAc$+8u53!`^ z9;j$_ULCxYNQJLcL>Jo9O48^e25^x`YiBD(0Z|p<%K(o32m<9KcEKwF|8s5@uhL0s ztP{{JF%)PME;jrszF#C>exFubV;*mdT}6MFqMoJIj=0Ag1@D&s2y7ehPhA1vc)m$d z|C^E99Bs z?h|Yi-cd3IkbpSQ%uyf#Y2xcx0@?r-^bmmtTDBClX}u}Z26W*(#9XwIR^ED9gpVww z9BN7n%-z9r`UtW+NOmeor4Ob@AfJ`WwoJSNw^^#_Ybg-CD_6R%VwF)tULe1zF{(whL?K;1OHN4O9=b}Cc6kokwdK?F zNtD%I#ME;FN_0S*43|0Jr2^|4asUJy%oE{SW%3MCWui! zjR*JZN?>yW%?gCpYdnZg&OuW6X-tVOBiwE}(q04IHR3ijla$KcDQU|(e0oZ9Qm&(y z|4yb0c{~A=TuhSm2NHe2=L+d1%g^idVwFil=0yetz0+*dh-sNt{ZWc~!>AO)IT2cl z9RxxBn7%+HFyi?OgbqBZ1@5;NL3?DT!7=UfAvq-v>o1bjx9yBJiqbNpHR#dV%d>Fz zZ0EVK9Uk&L3yu*-aT;dyI&num6!l|?Oe6c~4YLzUJo)+MyLCpm&om`c>Qz$s+46Dn z8!`|Nlpxfo%OB8KEOs4r&>w~{&JvA9@6*_<4&6sjNOewvB8I5%Q$?|pND@87=aA1P zHTPU3Z&)H=rS(N}N71bfpYi#e=2N~DnMoB>R4S!#o{24XJ+3%LALZBo(bn&JgkaxT zdKdPE&#>U+l=&1(q;#p@r)U)o&W}0Iu(3r&*W)Z2gUR(kVr8*Oi zTUrY(so|t0=xlMR4Q74NWi)wg?#{9FXH^!TB^nJy0j*d-tFKCoM1<%fb|P9SyqTBC z?Jy-sK3dchMz2EC`dnbqKCd~NJ1agWB%tzn9@rld1s)Y>eU8P)iF0RJaHNoK%CCZ_ zS?#-Ed6)88P%}<8QD24lV6JQ`X>$g27L8b@-uc~B(%U`=k$1t9+r)Mv zLrn4eZG|s_C)O&=Pr3tN)-KXdwZ@*79)mzp5G=E{xmMBQHb2R_wSh0Q+QnA-DYjJ_ zdzzIVTd}Pc+F`85(T0U_31%yLV#-E|q=6fIAAB@1dZ6Ewh()YQ2@TDYR1quq%hl15 z#6UzTm4XPnU2RY+Z2l)cKXG(4BvI=13XMUdG#L~kzjgPX-8Z>|ay{(nWWZD1CD8*r z)`1a)&&ll_FOf4Klu4406m@#)gvBveUJ z|Asj@kZwy)e5$W>bRrRnkSVcDM1wg|ygZ#s`Pv7Ap;CuG(E;997Si6EW@M?^w zS#XXh1=L(bI%#m8Fa9Ogw`h}}VQt51n|DF|Zrt&zhWceOuMmPd<`;F?VO&0Ch;MF- z6taGWLZ%5M+PZva&O}EJ4V6G3^pI$HDA*n{QX;}(k8WzQD77l1!)4c~eI*A+5I<&z+Xe<}WnWDZW5|BNSIUIP>@?^^q*HO(8 zw0^Z5zp2+stw?CH`lPK|!fi&K7sK&E>W&7Xa%;kpJZW zvbkNh&aSBrhfFS0n+Td{A>XI=1D)+7s>DsiuW&|Zk{lvpgn^s_Q`#^&eW5J@zQWE; z7s=^!Qeq4mGbgc?yrCEii%#c{#3oM{&0EZrnK`9RN$F1D)~Hmz;;GI>-*$5QsiKec zLBL#@lJVV66cV%CB9;*loO5r?a(N!|_4S`aWKRtB`8L84FSg}Hr&(|T^W~q(x=Ls96br8dM9N31>4pp0P$0o0$bm~GbT7{)@--};jce#T*ObtMZ|T|+ zdWnR8N9|Y3M-3W({|z19Zi7M{@jafZw!4CrBcseM1D@8X%NKN5?1BF6Iak_zUa99ohBmGd&Hae8(32H?@vs;V_TZ+j#)GCElXRuKc${gtq#0J~lmPm&$ zHsDdG9l>6!C7(z$Ij2Ny`>RZs-W@e%+I8;G@5;>!mpigV_p^YoY$FCav8}Ih|ZSBfM{%e_CRp{^>lhRC|D) zQsO_OO6($*UJLnC@NfipL$YPwGOjz$7Y9CtPW&S{y-|@uirCelgK0#1%6y;@p$4bUJpTC`3dMr zkMYT$o{OspIE`3A)K2Vx&oZDS+Q`3vd!7M;Tfl=o54=PLc@ge>1}iZaT=RNCu6VJ+ zd!M2D>c%4)YBg)F4c$bXy6Ux>QlrH}?U5Q>7K=+S7yr|0nOYJl3=ULIBiDTWhe}z4 za3z=jxrtx}-jpaLG<;&2$?)9ry9O z)Jn4*fz35Fw+DmP>|9%Ao6VU^r)@psZKm~Aef4|FrUL&q=Tcp1SH!LiZJO%lCGiBH zRx7`AR!CpBYZ}6(c`mvbvicST0^!O+Xw?vDG*QiSY{L-^b%YyGqyF^JqMd*YHG)U& z><*S=0uk&%zdgG<*E`j=!kSg!Bb{FJNa$gJB^w4l*Vn+)7=hQt@7QW0AA!4=0WVXo zus@+)41O6$3k^HAYVA(|r&%2QvJf6zy5{OohkB=O#gg>thZ%Van zikaZ+_%{0e!G)=0v^rlNJTloDADyqn${ik8d%3lx)b5^xcgvC=P+tXi3!|Ky@hW~s z@&8FX5BN5YGtqAcunS z#J1cLr?@3f?8K2JQWDO3Nt}0fs+D)n&vtV8*}0T=$^DWjx#V5!*fGI3vkQR5QqFnL zw7A&C>~ePIoB96V%s1b_;@1gQjuz2D6Ne6m>;!3^RUIuEI?#{n%4$PLFIqV(NmtuC zF!ky;TJKs{s*4ZXI;kB=Q&pwcP!vE?saF6`K(N2LOtlk@E4I#tfVbUSRts&Nj=4U+ zOk>sNmq@s`6$Loz3T&RBimJn*z5{}-v5LzDknlK*FF0Au#nGhD51#%PpvS-f4>TI*R`4xY)KfNqQY*%>bm$NJ1 ze*`ZzvAK!cXrr$I|S-lV0*xHTA(&g2a4`jtHrORWdv%i%G{Xry#Xtg(7QiCig54MiOdLA#v7NeMw)y|MB@Q)N?U%I8Q7)Yxi0CWZvx zkd(eGWUm3HM^~y6KjzN_c!p)=2Ax79Csk_J<*_&o25&m*Y4q!5as>^(;pC)3rSO?- zZeCw5?5FJp<#mR95~&ewq6Nfl_rO|LX;{WS<9XD`JgS-Te_A5;QI~~~2rvKXl{W+% zUuU1ucpl9fHE9j=XjU^L@qfBt;tP&8#W-z(dAHvBSz{qVV;^2a&rr19=48jWY-AWl z-b)p1-+RCrbC09aR6!9GiQy_e51@w_-GNp>>*pp?N)iP4b(3Hl{h_*sB^b3J)30DB zNG)JAao=W{TWro&s7*Mx4EN0%W*sk-O#IUJ1mdPxg#>cP3#*L#63(o(?N?1Q>DSCL zVJD1kwLw9K_tZ8FRO>0g%UYv~iYJ^Kd_`4LGUjUp)q(a%}nhC;Ctty#wm3IvKUS?5{J{NFwH9Fky%kiqQ;PkhgN%OH?z|BqJk`h z00Qt;9M#7wD%K9_V|J~XmEy#UIIVSAEN&f*Um{7F%A(a<)D(Ui!|%kTDl@4CoF!)! zd8HIaFOV`)^v`lmE+sMHZFXuj=#vsDg@gB~!d}Jy8N5dea=oxl#^J2iheFx_c$qZg z)T$e_Qb{tYO~H{!PNI#?hLT#`?432w7vD_W?6tJ9nXs8zac48Q%b8Gz>+f5=>+AZL z_FVh@SAE1!0Fjj7#20X>#%VG;bu#P_itWK=T6m_V@uvt}!kM%N3n#&Dz_9C3iOQ(c z8I=@%62lIoQcf%;hE=XAraf|b{xd6urc^PdLX*qUCq)5}Qu#5aa0Xki7tqpHP=+C7 zUZe{bx`^;d8PL|UAP;^J10&C&_b%$05JTtCi@-K?xEbH9n<1^UTnVCtVti$lkd$n8 zf#_GKUo|;_>I(|oBN68&B5{qUqEKvx0@6z)SU-uX946kTkz&{1gv$Wgn;a_Y`KKwA zb(oA+PKqCy$EB=UXR@;x^*HuBnOs6(pgI5G2cVl1+_F)5Ua9~WDGB-YZxC>dOQMkd z4YmgKU2F=JfU~$W7=m6{kVjw4BykW_2=lR(2S_t^kf}H~ABL zd3seUzBKhv*b+D%$5&=vR_)`q5%*UbtSn0Oz9m7GHWLr*7UCi74vgZgJa1!B5@Qt% zAyv?4F+Ho56PQHKoXn3C`69qsF4m zFOmu^T+fT(7qKTu8^Qn^m`5_ARLZd)M2%2b&pAXV%c02y7Uwr0sh`ydJG2Sgp`O#> z@SF2l7EklgyT|myn$nJzS6e)bqD|gdtiltESD=%{PfO#(x8hz;w9e~|7LNIE!CVmz z>|5k*>vJ_Bi`rINV!(puIpIsKs&_x-Z7Gh7Ees+1?Uq;b^;)3q{ z8RBwb`Dy+vd^X`gyU9~)pM6Yt_U?7h-hGW{cUL9qD*cH%fBrnkzuy+!nK2CsoRfUc24L%VfOIZuc5x=+WW|4*W&AT24|xwfrsN^qU#R>~}f?Muss4 zpe1u<`3ic5*eT?&PONP`wi|IEIxKO4QB{KcP9q?*s+Wsa*9CYnZHBv)n&9;{0~V2M zW%^+W=(Y4_6@_w?rp#h?X(Te4zRYT=Fvw(v3X8Q&FGHhn=N26N!j|PKnj{%k{(-~l z;TeYaSgl?oO&h(S{a5CHhR!2DN6d&-(CduBf~a1H@kJJxH24fOo9S|4x=rIT`U(7D zV4sG>aynb4y@d4v3kboEpQr8qFv%jJ%OD#}L2AUEbG13__(j_0HujJ#Xi1k-mj%}`Sk3TSniZN8xO|P=uc_k?<$L}4 zhx6-oiWh)Ln&fg*0MzcIAeV}!eVI2mkEW| zsxvy(1ci+e3XM%?bf^jPPYPB_NE8|cbzH&9fShQBeZuU^5p02Y;~#kbOE?3b&pS8* zNBkArLsp1m%8_V6J50 zzLBL_Be67u>F}VM%kNNw|InwT3Si~F=dsxY1W4*zm!pO<*<%izohu z{p9VrxwroHM|%m1!YNwN|2Kjh{s!dGiL{9QwOaHCQx{fBz~gzCQ#ITM5xSxvCR)s~ zzow97c%hJG*a(XrBQbR}f|bZjuSS1ksT+vla*auCvMNw=bjOYz1g5eWbQVsE?LCSa z=idIwYg43@!bpabe;@tQkKaVU^gWr12Dzn(%lST#-`kg2^xMQDDABMuMz2DjKq$ln zegn;h;paesBGBpgPj8CK^ei|Rg{D}Z+N+l5w|csIIthi1R~t19UX=;x`Cz6J14yj{ zltmDqd^-Q-GiUQ(`6A8HBqYKuUp=!hI=1-2SGE9q87FBNuk1#UyBCGr)rh5OM{hc( zW06ak8Yq1doUkTZ$R5a?O3WX)z=!^u!n5J%i-xL96~=&m%VblaL|5mA9s*~r24EFP zvC2%4M}IN8aOSHZGobiD9>0KYJ9`Eld|IZYNt^)L{mKiAKt@k36F?&W1EcU0$QU@k z5uE=It{#2D?{@iUvn*7f!|SDDEYsNpYqjfuc?5{5(u*V2hvV_YK~%)nBpYwlP=#_K_;BgO^KGcB9^|m1&&Swm?hB zPSa`z)V17U(uUJp6P07r^DU{l@t&v^^|1DUy>nNiSr=@tj&_FhN8GJbExwH%X>(-n z_)vLGi%*^Z1-do9YixT}Y_O-z-88qowxWGkvSD&`q{cTiyxnVV>+ScI(Fz$b99V_1 zF1vS!w=8UvV^ZE|w6U~Q>23_V>U{>iuc>bm$INxfcE7JJoi4LReY`o)xa5s&OSw6# z&k&fHoCrEnsWg77P=CZSaSPIo>_p~}!^J28nSBRIf=(s}jFun~>-h#2M`%Qg>5*+n zC3+=IJLqi=$2J;|jpwlXv=%8ZPiFQ7EeDO{fV5-e9rp0WBhAGVn7m`=jSoy#Vt3u`%E_KOd^ zhAimyhFEO1EKm|SkSvMx1d6+8DIuA6vpvIccSnr+=)t!7<`N?%i@?y$XK zsG;Zf+Q`nWedU1$ha&$5>JMz{>#1;Ml5t}u+gn-IJQ(%&_4N8WPqlld<8GibNldDg z+cw{uN>-yXp4S*vG8rSY#Y2urxwd-i5$qO)J5c9x)`bIlQ^=*&dt*x%t2V@JHC}IT zcdyr6Q(cXHw@~Mj9JLH;`*!3JkA7kfpSm@%!X_9Uty6?M$ z`H^YBS^kAn!xNxM{w*zMC#Fxa?5XJqqT754{VfteBB(UYYY&lAr}0C_o9L6ob`SU& zzWdLI9vwLLKTsJmj5MQi&`pG{gaknl_EQIyXGo~TsZnuV2#|(EK_=iwt|%C1wUHe7 z6V|NuP(O$tRBDrfByM_Z=&JX=e%80$-yVmW{+7Th2z{PLCCEB zsCD4ABl~}MtmXLhmPTh~`;OXlmv`iWy~8(eDqouQ_04znf372W{rvu5SyRA-{!&xf zQXSn8(AL-1j&=C|_88&pm>KMH*X*7cs)*kC#ebgpB8r|FsU5uTB%GR4 zO0|ihqiqwHzI@-l`k8;pzy6Jz-@5eKrf?lak%Zi!)|faM3@+2#(z!wJOZH9HHBWEv zv~T@+?jOsp+A=e-+$Dg7DTl1 z_@xuKUc4?2kGJHmi=Qj&xqfr+e4n?h=h)`nBYj>>bMQN#8s7BacaCP^@$`3Y-u~!p zy79p2?b{!j1IGv9sQL2y7)5vit2GK-Y+!PjX#wHnOb*Q~SVn+xoJuWShBF9IRWHcX z7WmC#R`?1IBbQ7$aqw6|QKBrx%M0_b7)9$G2E9Yaybo9U;1sZXDhW9UsK~CC7-evz zP{Ppo&_fJlCC&&spl@O%hC)jd^5i6-u)9F{HX%nu0@7pC7i!DF50c1Xw=XgdN5Y&# z6KPo;r^l(_s0y_1`m@xS;J^y~csQZ2UKwFp1a}05TbOL|9tz%cE(`7w99p4I4kz@; z1+UgZ@XGR)?zK=oRH>hqK%U3%B578(lu+oEQbNWmP+iAxt%k4eu5H@g6=o<#3dl~% zHEche*?Rj($kaMN_&cmx%F^TpwOI`$*T(A{Mvd&ZjpO}oPER^$a(EmRAaJE#rBIc* zcu&tvdt`F@y7q6%#GR}L@_GCQP(H)RePa34Vx4J4|5k5*#@pZT&EQIF4x7G+C^bn< zlCR65e46gw8eDd{$nH@-hZ@h46Jl6_(3ONrT+A*^8Hvl2)Cr-?E(mvb3%4t>TV28B ztndI5J^_gCL?MPi$X|#eaIH9Vu=G~^VT)I;R-QT=j^EI5__>+3`R#Rb31Cjpg)os# zGi{k&t*)xgH}u>nXJrH_WtrK`bf?D@?Tp1HWX+~Spw+vUX`+UxKq`@7VU9KEROK*g(L)eOAcv6`^?sFeBxv^J zP{VoE7(GsmA%&3KFtj8PM`+5!R&`NKsDddkWD808Ld@+#SV_w5E;)cjOVU`348}pj z+KoDi8jbo@DO~#F)JT?cj9Nj#%^=Xfl3HiL?yj~eUuE_AeONw#zR}?-e-mzDPfF#I zH-Uf|w04U{g*VHfSu15_AKdH4%Rk7AQ56t;Kj8o^Fe^$}9R2ZmZ;iJ`Zq8vH=McFg zhawC0^<*rEHk_*()~^Uv!PRor1mxLznEHGcB(H+$7qeBvq<*y!75yvAuO6SEb`!PJ>)6VSa`b?v&obUsnz5g zog2z#o|>*bf8gnvI#$PPJx&!M65e8Pv`%-X#+qz6NtntpmBS&`STtqc{KEtuo46D9 z`zMyK;6EiDNDb1C>=k-XUowZaF3L?Nd2J4ByNJkx%XM{R8F<}unxRY%)fF|sN}&|} zPi1wWL4m{?n0hg*86si&6_rqOIV}|lQM)c&vt(TupJMoQZU#!?lWCe(Ms zGlx7q%^^;TQgRtxk=R(f7D83@g^Jk#MaMU z-|6kj-u;Cgo1gpqJ$oBvN;PK%CbvqeR4IE;etDF&@oZwxJ>$up8MneUk0Ncz0dc%Fh#3(r;>C<<+Qzztc?>#s32Oxk zK8>}e<#cTW>0dGqwJen?ch%1D;8$_>i3JIb{-vyOh-_I}Rk4Y6>i)x~ATD_NK-CWn z0Zl~UebKQT|55VrGy8WvK9}_M9&B$MOFOIge0pl~zOkUQc}GLXY`6EP^ZO6Xn-klU zdk*>CZF}2N<0<>cPu+Y6+Ozex;ec=8`o84Uwr-cbt$#Gua%{LZG;pvfwsXq{ySr=a zPHbY!#N<{_OEO`rJ-PH`ushx4bR;vKRTKO7gBCCf`h^_OJYgh*>=9akwHmen80548 zw15kqbl&BX#9#xcf~rP$R_B*s!<6q$iHM_z5EmFyM*}K zU`y-#iSV4Zdh_w;W_|sw)f$?h)Yq-r)ddYVO$zS}kV8S+m2@N6>8m`KOh9VOh{vjsBzf+xk{=_ZM z?)HTbK7ZomvwM6m@X6_cu6@l`zEL>ZFm<-Tga^M3nee+O1|OYC)$f0Buy6z|_G_Ri zJWlw4UKu~^iLjT-Pg_B#P0 z4IIxg)JsK({NQ6U&IJ3S!{E(63u>ia^a_I{dEi3G4StYl4!dEI(T6Bd{E3CiQB`ym zLl&C!Du4tDD`Cp>S&)>9u0hAuJ9n<-#)?&#L#)Hb&yt|0T8b)ltOTc7Im&kpSF0v= zC3kh#C`d*|()!f!d}`>_P?fRu$nX^`0;p#_GNvZ_+sk@~9bTuDvuI3CeVNX_T09NPV6aGw)mT?rv2k<7#&pHTjTLEJ33U2?K#L7r1E-G(wAi`1YT4l+ zJ4f{&nHGh+J7Xd(Zgx~HXN3o>RrJ@Q#n}HNES_#U^4x*uxxso?O5sX{EV_B7HM6_b z<==cm?{QFG5{gmE<^)uX3`FZEdTMC6S`a5C%K9zyEyH(?08|`qXqo8`+&*~!-nh@EO`tXa<))N*B6nRx{iC6R#xurF``4fx9f zDehPyMMHrU(Z2vvq@5!ka}c(C0`ecwg|$}&MIjxGU}rd=6;lGmSo;riBK}LQ`m|Kz zgp2lNORvH)9~i3%y+UXm0lPD7XHTp2`6tkPBl^lZPP7@cHWRPFdn9sU&8qZ+yGoq6 z2k3)G1WvqhEhjF5{)>RLb z!^Ny{--qpv)%M!ej1CudO=x_i{p8tfV|Gha1)Z{_jD)W2nBLGbI}r2?d~92CutI>w zB(&1B>b%w68J>A&CUI`xlQZ>dBd<_!CQfbUq(+<3p4r#cv@>OwuZ2bui%#4PWZ?kN z3ttD!7(q55-!8-mUw$cVV6oouF4TWCg-)f=mJ}LEp=BvFmBU)nTDip{zcGsLkD}dC zv_6XZqbTUDS}x2Yr~?!_T%gU0VR$cs#~@)jD$gyypQgcyynZ+&~)w-5Sb%09uE+9Hm z4XKpBDwXnTflB$mOQoghJ^YLSr9qN4l$l%=97dtPU3yTX0Z97iYapq&tU>@%9N7e< zv1i4?C0Au_p@P??=@<_!v6CmJrM z2^Yg!tiB?I#}4NJ{Tj7iVSdpo1kEUXc7SiaIgC%6ARB|?h5=vUFG$ICLYg`lNkL~t zd+UT73m4&ybuVHq2(tY80ujCqI>LzN&dygxn~aS{`{eOZ}*|L#!*1>y9AQ2f(v6iX1YB;vDR&lW@iA)H}1(+ zy4v=(rgkRnr*1!a8``tww&7sqrt5nPEI%+BYdtmySpHC|cE^@ZhrseXD_g@xNb`*e zd*sB@Q^D@$q|@Fc(EI_=H*EsF_cH>`w~8ZeYiYh^u^e{apf5ysM z>*gu;5dIV-d?n~lr$0L3zm+)r+|0qJv(ft5=VsyYYu=8@`qn)yE>Fi~ z13Y53fXEU{>>XPQnY$p%5R&Z=o@T)xa4zIq?~ZOmq_k`5OhC?k8%HMr5YQ=@Tm> zzPA=fd?OcX^;B>Q4);dSQhUYW-o&+sdn0LCR=fia_C^7*?=1}WCayl%8~^)*y?T&I zsY1GRr&6b&NLsD)(~h3)^17pWia3bMo78X#);^*n>P7O%|}MQgubQb+BuV2 zMgeBj*^CCoYppZGJx*6c6>oN#B%DR7&~gfu&8n;F-kpf-p1*7RQyv({0mxgq!0opc zxxMZ~+@4PBi{Snqfc9TO=AP2OCraSoC-$_lfb8!q7T>r>K<&#JrZO{@tRHH$Ia;UN4@1L_pcT?=WP8e`smz3G2ipQL_$Mq-RU8!P z#$y9MTeK(8IG!m(D>q!XDWEc#V8}$R!w4|U6v}uj+k!?)Y1FEXO41Z=^Eu)^-sCco zN~4C=sT8cuqII`SHq~rx3D7uMnHd7Dx?=eQ{1j0J05x0~)eSq@9J;*dAxR{ZL!V8v zdXG8$E)j65RJ3ysy-!$35>h81udjjiv2e z60KbiV{GNCfO$wlyB58R(%SttSJ0;T9B58d{&6h-DRe*D;B@_>=&JV%Qf1}U7T%!5 z1{ftRhLSlZQ5muRrJqA)pIH7Q&I1z4h&$iIbtcc0n7v+P_PQLZO3SO7{v8NK)oy;3 zJY56Vg&R~^N7KJ&g$a;5T9XO=Jq#O5$mFv8oWfwTsz>kN6-BpgKQ$U+I4#X^CXLFVlyG{^ zQP&q3AI3?Xx1;}LF-wJk1dS~JdlW}ef8Q*Si9^eO!1saPs0Qf8tT@gK)SsN_D$#!Q8dSdPR-D8W9WiJ008ismaOHlVN*$XEVS-V_@{2ox`_p_w$j> z4QbE_elWhfrYmgFhWi>Ow>ymS;Y?<0HNduQ$(Et04rQA6cX`X(#v6nE8`5@TBHdk8 zx2wxvo*Aw4cV!wZmd5rz^be_CU3tWAtEs9o21fF#in{8s$r_JDERH&_!BQne;n)O9 zvImr81Zfvz$DXwVt5mays8mP_whFaRr!&?6C7AhjS(zj_WqMb#zSmea{Hq6PgY|#O zmSujO6_QI#?`9=e>oJJ+J;vJM-&KStZeq}*^t4PrxVv&=lSfHW7$KoaSw*5Z+qXlWMc$Nq&|Mz(ZQ%(rDAAStQP~ zjsdZ9V7jzSZhn`WD*x*`JWR_u^SfDYiY))@RmhOICK>isjy|-%?a-EF1?L-i=)k@Q zhJDYQVgs>Me@JbP4#ZOfK@L+N|Ni}bz=Xcx!EGP=-u-=D_k92E`6qS-o3amY2gg7% z`!Hz9p8yS|3eaH?=_`)^sxR6&4&fOMuzk}P+~d|RvF6L4V<23{x5M~0w+gR?pvp-tCyu;$;>1( zlYQU!4MLj`2uN5G0s&MIPyrF2KlQ1sF) zRXx))2?6f&y%)5r`qVi+r@r%@^Zmc`edqh=?@$^F1qaZ5crg@qr%w}`;aip9SZJvi z3@HBR28gFJ5Kn2T7Y&G?JK_3OJJX&E8oPAg#gaesz9#j_B!31<{?z}0`I(;I27`2Fll^ZWC-XC% zip&r8{I-Uh(DuK5Vwrz7n=Tgm>i%51@|nBVcdebCWKnP=4HWvpu9bbAtEYv%)3yxx z@`(@<`*srLu)+z!>Z_as@in)u&4EQru3MSq&1M59In9FAs53)xR+`_Qot|@OG?dj3 zMxoe;fIxDY4E28}$<(|H5kIU~=Pr`^I8xT(6qNeZF|->8r9M#=2(JD2nG7BM8Rq|>+Ts2$ zTzk>tqMj32#wc^LQ_!+TwqwK9Lyly2@veE9;gUP%*l_)VaHMNClJaZdEa{tU&8@1| z+#c1MTR!SMtCV*tQr>w^Dc@wx?Sn5v*Dt1xP|OEoq85Dj)H`rwH4;yL)hIFJg8l)P z)2V`5%oY+HI?r9MW|H)`8ruheW?sNPp=)D%gtJ*%MCp4+B7`^Qf%ziC~;*R#5( zbza$(T6+De6<05aZTn2mnqJ?tE7q)DY01oNU9!aQYF|<*&&u1k?YLkYu-y99z_d;M zx%o4?UG|Q?SuK@~L&@mCs`8TSa_+8yIpFQy*|V$OVm4)qZm3&A9fh3JmMv6*Gw07! zWmS*L?@N^3AIRpWBRtWKxSfwp`+YE|Yk#X{i~TKKGqb<>a)-+4!D+w8CfxS7YAsuI z_O}`W{F57RHB*hZJz`?;g4;GEhAUCgKx$d2cDK#U&%bCW1k9!0k>uLFvjgeXH?JSL za8X;3zt;un)jlV0k+U<~r|%#;rrmhWt|bKnFB%;lvqOMfV(eUh^&kSVnMD^*AKr)O z!H)g;jZkt&y5_{w!$o(f;nPP45G*7{6yC9rS;!_nGJAwzoTGp_A}kEU%VBznD!<3x zRQy{6^z>LwScp77m?Je<;iL9yhN#T_ejb8wn)l zT|9H?WitchzT4kBuy)CP?|=Kw_YbXIa{v3^;%_I& zHQ2Iwljm&4S@{z<^&#tQd&8;kgJtKpNp7e$b*>xAGVq;gQfrVpmu&A@^TpK}>x})M zIYDNTfp)~?mJK@5Yc+dqHX~qGefhEtsnqPwU@#WYOCAevlXx)_c9vINKG<{Rtp|6$ zYA~r;iKyL>N=;VU(iyuwE1ImdEVk1A746zAw8F0{TYge2Evr~*|BAPL79uMxJI=WO z?46(89XlV`*>~a64oOc_MxHIr+djSF(6_r`rQI>^(6@f1XjFH8asTE&lgMtP!I;A%_NutVOMt1t{L6u&+lMKy0A#` z=lejTq0JcoZJEG-#s>cT$5AV`&_Y71xNZTn_#+|UQN>EjR@qup?X#i4rpW6b>D8w( zo1W8~v9(rz>aB6FzUOFjAma_?ef)E>jJ*0*f_uQexUc>Ol9L*AMlzrkJvQ0rc1h&l z^hSf?*!Rl-`Rb{eDwl1ed58lqZS4JwjpM+=_}))T)sX4=D*|=%?UPySBcLE|!$Bzc zR}2N`BU|lce)`mCP&=^$ggyLvx6RG+=#Ug#RhW4H<{9Vk@soW1h#h(Pf$v=KogE#b z&Bk)F+blXnz0GY8_HP^MS<~&)U`Ib8;5V4C&GrtG1faa(b5K`MJ^e^6^%S8--=_9J zx;3Go#VQIaBNPO6p!8Aae0K3!P!M_sQ4o6gPw{EfjF~(x2mglAeHY2@g>a}0hjo)j7)f^%Hp9PH z3s&F7LVh7K;~0+AbY~mX|A#(W&0UjY5n^ki9ewnvz_ijIm~vO~8!I znPxk>dz4Hg1z$=2vtbl{l1x_(j2{k2m7q}a$f^Oh$TD*o zlEBgK1)PKyn@FF+R(*mYm~@Lv!61<)41(fvWBVlv$1T3Ox;aZJHexpA({wdJO621} z3LGp=6GqWc&t^aKgMF9Zvn7?Q{ov{=;PnT*E7dhSw|HB()!VmusC{vF+-@MhaQoj6 zuU~rK``^0leSAHz{;o?Gw>jqB^jPgn&tKgc?q74!bwtD83}TfG;P5Df!(I^ffUp~c zTp;WOVFy5=xNRVTN5_PsljjgEjA%e|fI!425^BD!gi7*+n#CcZl02b?KTnK8B*c5| zsF9sTpRAT96P&fvy2h&~AvDOyERn zELFq_pi@6m4agHw?N>LpN_vmi;7@4LZ%iPSvu&3A(_Q7L*KcPOS2+;@G>rymbgcFt zw;)$J)l&|mwCC`c7!$1^ZwZI&81!9n%b|-f=)?OmC#f$Z)CXoLa%BZ1v>Oq6 z1<30mDf4LA$zy8g5w-JB;8Ym|3+LEnFuRKKVMJk-C`!ICjuiD`Blje3=|U}C>U4lG zGJPC}|3?l)$I$A+t8CA!Gl@sTEyKa%D=6)GrHaGGR{)+C>hw@NGClRD2!kQu+*o8suOuS{=fJXl3Kmoxp+sl*{2X(wEUJWZ5EG@$4-TA ze*~h{#f7$I)h4vMye*DSpTx0Kp#aqb8FETy(IqNc)s^QVUyU3@ATKFs72q?~)lQV` zBMo9LARGhXD2TX0)CEF#`Ha{>#0H{P5Ve4)89*2TnIueuum+@D0I#JcWi3rx?eNBm zmRPIG2I%?_9DS=hlMzQxe^~Xv8X}tZBH}3#rPL9T5EM}$0`XB&B4UI_SxGfefT3xx z!AV8nV~r-4JvWS2b4#SuY>26XR6K#N6ElCxzke>+rd~p>k!B@j->E-wqLD^%gupLo z+1ug`fW~3mGqa^C)q-0Q@+m?8jmLkN3}P6+VrB zCivEQ|8qyD(4{RNG(3}AKs)HuP%c_Sa#LLfNtiKV?v_lx{zpJdt z5?o^$DF9|kqJk0LRu@4GHzYL)5xo8<=J;JW$&onPXeEkDk{#SiR9oT4EXt#FiHN4B zR!yN4XmCXUG&#h*jve7FDk`z4X_YMMZ^G+uj>9(CrGG{!7R8g)-Ku8t2RuXMLl2H(4zyMmT{D>q2P$U`~($I5x9(3e~^XKQOR31RF2z6G1=lujS;Nyi%aWOoG zWNi_xo*Qs>R0Tg&m5|39)S8l5UDA)MOXu7YJ(tT{Ys2F$HNUULY(O4wY`l9x z@e_Ew&Af?xWYK|d-gsVx6-_3e)9U1D!6cybEWTW2%S{W<@OLX$HVj14Xsm|FG4faR zA4r{shRE>iup~r24=$m92TQbS$xQM^ax1Q*Q%m|_tL3;vua-o}=gH&r8?eNnmJGr= zi|Aj$5=Jdq2}|z6tys0B09&oYb-3}rHAdcv>loFN0a&shm+)%II&uVT)LsZnOlrw8 zSh5P2$fyMCfC=(f=agxz%LnHqf5P@5uW zs!fx&cFAAG7F@Mt@fGu;@%iXFH}(~0cA%v&n3P?)fmC52WqNGYZQDA^TW?>x;`VKw zty^#3yl_XqCpL6mAH2GwL+9Z*r>Aq^5^}h4V*6nt01h6*8@r=GKI*=VzCt~*t!(b9 zC${BdHT-DR2{@4ZX(CKn1 zYh>shKtlo)69)Eh=IK^)E2L?wvUC10r09Fc(}8q=D2|fTs*J(*dVDumdWO1OIb74& z$;Gra#%-_H;A5)vObu30^da0|?G(Sfk339cCAV^XJ;@?x5WSK4TA@40R4b86+OO9b zw3ODAtPI6_*Y@~~nWe+qz#LAv#pBg*R!OwV5_?B(PPNsZ?J`@(nc9&% z%ek4>sSvld$*XD{-)a%OC6}k>UOYWJtIdygSQ$?1FZ3s7EwJZ@aziLenMTLx1{W^t z>JInj15l+TDVl4k3`KiZcYEf{jt`dHmiA>`eom5ftY9-)-6pft)#l0iMJ*4t95bh# zR>`!=Hrehmnv4d{X6D_c8L6R7B1w7jRX779r*q_Sa$t(x9X!z3cfAJL-R+sDRb+P= zbH%yr?shTrbgilC6cG5y&c{$i@;GO_R4?L5psjx&#pNPtofdfD$c7#6xP!Zt zLw)5ar_oR--oMU~=*`CZGIn!nMlo7)ngrPjE`~T*!yD`WDrfA|&l?Qps~h@5dR}4} zs3Jr8t`khW5NwV6b3R^gvVz$*v!1u{9{({C_$rH$j9&?9a2K388KSD}vLBAMje;K> zW9)V&I|>d}Z3IJ<#1i?J5-1%^Ch6c)((bM&o2apR=M?*TvUIQpD@wtqYSM1H>&cIx zM`M}Le7t>~yem9X8(Orz>f*emxfjl~Ws`nRkJdcBBb@WJ&n?=4e??{b+AilUyuTDp z&-TjUwn(fT6f$jVXT;k!er{fF^ZLbo5n9i2R*PgY(t5ov(zi5k_Jpg;yMyJBY&Q?C zXth}*MaUTiI0x22&hRN&LQuricNO0`@E*i57RvOR^Rw&~Q+JcA2FhuAt%e_+%WqCa zY~(tM(rfC!p-`|qw_l(@rv61EM`;-?_z#HMXi~#lOeXf!SM>%hT=b24a+l8ymwi2L zv|-=51bHVMJ0HE<%OY)2b8ukmz`({{@2ug)tMBjWt@a3kLS&aij&;W)<)An` zd)6?x;4>(7(Tt4=DUodtw9G7fo%z9J@A`0JJ?PK0^dG)mnDz>`&HoXYjdZ%2vnJUH1&toM>S`=PS+IG1J?Y2|%z;vYghDXpgkbFF7eO znl5^#ukUh2hPR`M;JlSIN6O(yIVA9bQZzN|m$@zL7Waj$3&`23I@rj z5A`iAwym3yXy5p`&b}4x4r{FF4wOPNifX^Eeh6$NUui_ML$UVu;8=TCqgZ?3fuj~5 zyPxPCn+Udd1QpnO$CT*BC=gL2So7pyd+RElUF{mc+AV@bFp!~gNHT>>0iZY9B$I=q z$cHZd;F@dyu^VaYq=we??Adqiz`*`}dwWTUXP{0Ad$$bsZWZobsS#^$50145nHiaMzCAs#XC&H8xctBNU-QAGD9JGtxn%F&efuF#wV!^6+)UmvfmW*~GvQ@K z2XGt`_WIxqJ49at83;})$UINK{IrTz57mUdbm&kGKK!I7O~}o`=@$$QpEu1H7`R|~ z?gdrnO=6%m5-J5m8NNrn=re*Dv-d17WR_kvZ}`d;rPh^~54SJv^tjs>whych`tpMa zsiqNB)l@};XalxG@x4YL6i0`ss}XGrn7GaHsv%}QRD+eM(xDoxGmcp!p9Zr!jZA$b zC!j!(EPGv~;5D{pg5{VK>P|F8^RaSY2vXK1C5GG90uOI2yB!d-%7Vot7%mT$GA)i+ zL6i~flFVk&Y~oynfkdFUe|CBv#;j?`J0g77`NWqRnDuDYI5ayv)EOQc3U^W{uf!`= zKf#sD2{8w9_xJk}AaSox5X?Rw-M`mo2IdD;_QIGdE1uj5|JSepPdQBjf2BWnf6bS; zx7PRt+WbI+1(hF|a%5L?j$PW;$;6x3qlFk&j1O(;3HFvEg4STryOUkXP~In)Vm&R> zbc~W5-Dhz)PaT=`sltFFFE} zE$lR+46B07YKrMlR+I$|C-bbp=^0rvI#S&cPa)yaYn*ZH6Ky{I0ohG{5o6g+6Ik~8 z2A17hHCbaWUj}6ES25}yX5R#y-Fa3&()(*obw44Vm7DM^h45@Q$Ies}oayTS3%LgX zjZXV#inoRA?wEs_$r%4kKKs*Ar+X*zwLk&-cWU73Bw9@(1GZ^&N(z?xE*luE|AN4n z;#AA%so(f5g~sZOkCx&0_*+b%M+4tJEtI9 zZ|R;Ite?mptR=3Zt@n?wSLcie6rBWYt&?!AoS1ojHQASO!$pABY7Mq%XWCbaT8D-+ z9X3gj&0rC0$bzkts(!x%k!DwV`b`(OG6F8$Q=_!=-f*Ckv$?oyEZUn%Q z8zS%?{5xbC&M1V26c6}F5h*T=)ylxZegM*dK@;ijc$^mfz<&>1qT50HeP^S=xRj6Q z?ykZ5g8v@0X1Cw>5i}Uz9XczTjW&bXba2|*u7P#k9`EqwE6u5>heNJ3Nc&4T^ZiK~ z_~xX$7ZhzbX1jcSZo!*&dr~g`mGr{iNNV1$;n~-1=%95hD~Y0+)97?sZ)q@UGW*IS z`ErLW6h^W(lRu^AiYEog5fdjsz)LEMeYMIF7Fsj`(?R=HEMj@c?30izZ8sgP;b)VO zEY*n0+#E4kAW1#_KE=u?#)U{~09}8UH5yrP9H+-#Xf#VErp}?|Ut{3(;Iz}@wNtDG zV%P{AvjQA5%wDncLCE6bH=7J_y zWlewI%68{a*Wkkck?HEpm%GdnmnezBV$c@%Nd|WzKCOHpK3H&DQ`Mw9myC*nFP8BH zdvhLpsxwrYYnHsIm7(Eq05%JOG!5eH7+N6L?Y>F$rQFV>M_?Us zueTqp8QH(NQ^#^fiT67gmVuldGnqZ*p=3s3{*JbhtXcA>oUVk&D4~7OcJeZEGwmUD z8Z%r1Zh$3uav!*scEA#gTGB<{Kss?9t6GwVtwda6Q%lU`KC+uO!xFn%Qh;@28nV2` zp_b%eNgB6uswF|#O2BnoYDomvDd0M8wIl>f{J6w}N(gXz=IMW8J3K zd09PEFYA$wNCdO>I4n9q@kUdVf}@YekOqxhAwilqyUkV?OX;coG;eWPEG~}H>kS4S zrALXI40={e>3CFqV|Zpw(B@2xC$>Ft^2AOiwr$&XGO=yjwrx-BWMbRiyu06C*Y5ez zIOkMXb#?cTuCA_|33hRSb`WMtVhUG46e-BBH>+gf3q;=5UV{p;f|jSady-d{jyTYQ^Rhr@EQI%v^cZ>4lc zb>+#%w`q2h1VfwiXwE$4Dy_Su_WP>7%TYMX7E3X>WToWjG`=-L!sK ziF&=sTehV0EG>?|Jh3OSr+`9#vxz-o0ZNdg?~jH4dvguKX4|i;hZ^i5EEry6j2jvl z@QES=qGBE62MfiTsH5+2o+UaZyvyq3zA;iSAH&-PI@3uKZR>wW-iEvw2t-^TnnB*5 zJ`8wuNilL~6lIit>u~8jE%a%X$w38pl_f&XMZQ5d*`Wx~>DMqMolU4){3T}b zAPUXgWBW^&ut)q0-iI%`%9nbSAP!;9mnb|ukWXNxfWorXEHgtl!PN$Ie(=Pm&>q{xmgcx(27S80H&O0Ei)dSCJoJ zg>edpx~}tu`uQpR>}k7qCA)V;J(?p&_qx6FWV-M=li&%Q@(Hxgq#lJ^FuwQw4c9GJ zIh01MvBA%DL-7oPS_^3XM!}9)7mXPr^u=v}Hsl?Y<5S#A%Jh2K$L!?4ysT9KAR{VQ zU|V&U%VJi%0I4~Ka-u?r)AHvg#-p*|-!?{Ztr-fAcjZFb$1*ciPtsLuN88%8weMh) z`83^{x!K9jbGCiq!D%K#33ygA^E83eUrHa47GS9Zct2IwkLM|LyaS^R& zqN=(bHIHU;+`K%g@|REDnF{+9!~!-`A^3*9nDC~{WW)ma$zsk25RGWL@TWt*u^1^@ z^DIas1>`B#IN@D6PQcRDSXp>VcF~I6>Z#*eWDOp0RArrTtIOb`=bLXxv%*2u8qPdW zZE^G5gZ55Hgqc|V2Cj`PCs~XUkQ7RoI6B+rn%1T=0Etn~4wdxDcS^xlv-#BAO3QnjAQmm*OqS)^+||+;doY(JnMsk8N_LQWXpICr!$ROn`rw zbm-;!yaI|)GFekXik$azjNsE&N6DvLq6J(_qT`sbbY$f-HwE+-ZaaTTe*JuWDQTUt zSvjid<26l++(y{Fw^3oYTjm*Et0#)u_iGUyacp0;`bZ%3Agxz z{$fQh68FXdiUG5d>92Fw)nOj+ul5-fFwk|+JyL7;U>_R!h_jvh(7Cw_YY(w^m)Lju z$2K(6PwQd(43k#)&V@-05IhA>B7LIf{n7J>A5uRCqPdLE|FDBfHQTE?pWRR#M+Lh`IFF5wl*GONZuyMe*YHDe*)6 zy3JGF9|(YXtQLBOs==tRrjN{L76u$?uJc+!h`bM~1U=T6?im0(egU}Fary<)M5c_5 ztV0a`;FY;~U78Szp7TQzI{DgfMo?-MWQa(%cKUb)7F>?vn8Xm|)ZJdncQ!B%WtDyB z797JDxn&|8rIPPb#yybDT^1y&oC*sXCDYXco)xS5AJ`7qL<}~r zp@`7Wqtr*@McW_UoSfMD-|kBxTZ(7673TEmofzxyK5AXi;?LGwl-4ifho0^!5q!-D z$<8ks+F272D%Izj8aEcrHZN<3Am@*JE^VDB5fy8!@I$g)Sh(B>6DBkjVd%=Hj>EB5 z=x{!1K=u)xP=7O}ibtlUV{&}T(!>~8b4r*uaiJZ;zBQEZb9E;jyux8Fuxa*QOLG7Q zE^cK9{lL0d4%)xBKWAp3QU3IE54t{o?nwG$5Pri(v1X|Cjh`jD&O@`x*TS?DoN;i` zueo1na?S?VVI^P4#q`Q^M7MAHd!tse3k-q>&bA^;Gd*Nh7);JY4+&Igv1Q?M?t97@LR?nxJa_0|6Yc550Vpej-K)P$vT7S>`_zJ zlF?RG_qKR2ckgCEid1!6%hFH9F`Igr*XX;RPKT*145u&^QTF_N#!$O|r{#lG(DtFf znt@y}gkDW#JBTW9d36}>u`FK4YF%tz|o`uzzg5r}D% zj7<{ij!GlCIz;3Q5_v43gq)EOZz8*kw;3{1Ihz@*)JHyx$qoyRquEX|MTQD;eT9=H zqq-ur{KZcl4a3>>k8wa}{>qZ0Vco>h0h`AYCU--@cFqGeP!g7Psb@CTeE)54!3zpd z05VyWU-!B93I`%uS^*{06R21hg17YZKAl)UC=1e1q|>TbmCJ7%fR4`w(kez_3F<*$ zZa~ya9gwa+2tngyDEMO1w|LC@u~rtbGnu@Q_Elr?WXA_Q{Y4cXGP=_U%HT*bqL&Sy zG+UooSC_~Zec6e@RvQ3=ufwa3C`+|ZpHp>MDAm4~NHCL&6HhK8sGei(fCLALk8lc? zh^p#x)6NG1s#PpRZTsU3;*U(DrksdT4fp1uYv@{z0{w{;dWd;o90%x&=Ci{!0jbBs zf+4Dd#iAL@^=I16t!ftfGs;|l|3pA#~dCT9}K!6 z!zMhW$SAviXa}z1^ObQDnCU{=xE~x1CM-Vp>Vp zwE*VA=#aaW>9bCSj#XoZhHdl>nGmqP;D3#wWvOn(*932JHzeWe;JaF4aQ$L9rOsl#XxV#GKNK6>Ix0uoasDr0bXc zhcFi4ybR$s^$cq2^5C<7Y0o^odb5H=Wu%38H>jmMWP^sF_eiz5t%m^rNR>=EL32dVM)wc4_n?rn?-z+h~k|!S^`!+zaN+q_kZ{2;-8egh@7ywPaZX)r{=~sV^ZL#v`ND zjEJijZ(B9gT!*pRvwg^eTaUGLu|MS{gukumk)UmT2|bduNuSnP8w=tYgB-$A5&~W- zB9#_hbS#$cCV1)|@%$76*Fr8~d7TY&Ml_|G$%zT(;nvGkJqfC)30X_CIhvH1ttmrx z3+CBlm1@bY&ryV}x~a%+DhaBa8VU<)aRdcpqcx+SUJ@W)@?}RazD)6(B-GpUJK4E9 zpAgb66O;+^Np`=eQK6{q=N;oFztMr!p-nT@^`~{)0*?aT;Myln$#tinYa~e0)S|`- z;!|SlmgVfg?=ukj48>SV>8HUKyYaYa0%ilT*tftw3O%LHU)Do?(D6tJO(fG$xzExB zE)ms5b0%XID&=MBYQ~gH60!PF3lhTbmn&=OlT&m$V5Nz4|0O?ZZR^{+WGLUHjX|ry zDM;eLL|{uOBn{sW7D{c%bZ?%V&{C;gT^fB+$U;U~s#t3!Wp~$mlD&2PL*>^AL%w29 zW0@2&=vz+JFbnRQEDJaG_>7lEDE<&B|3F(CeM;6())R+%^KgEduBUoFI91Nen5^pL zWuPYG;F6!g+k%*>}pR2DuagXguP#n@vX2w$55PbLUoQutp=$?u{ z@+n!2a|IqZp6?Qqr?llH;IPT$DeHP=SCHhSi*Mz6-mGt6qrHGhOLM<0js6Yz%ozu~ zHX2KUw|R=|MYQ6 zYyR+lNg8Mv)NHbXQ!TMGc#-&Uu(E)t!9d$7Bc`6H2>sPpBSl7lEezANo5OcPy`iOD z=~Jg|8anU0Q$cytp4yOp-?)+Zc3)RXOG`;f%agXwf|Zb%kY3r1)#0@{^lB8T(OZ4U zN?}qbJMGSxJtJ9&di#vF6Ocgb`+SUKyGuB7n=R#q0@*^uYQr#DG>`+f+ z>+EVSKeJSpJn*+ZcIu!VRi`*Y-Lc*wDvfG2JtcZuI!s1TM@Gke%h~;s+gK;tA&NhZ zwBvdt5jV|3QZ?a(m|ZshX$EYYRI63$Rb@-^YrV@zJ^VfAUu!iQsOM6O(*jzl^EjBa zj`CZ0RzZg;#Qm_F_x5db`Q&rwX@CD=xmT19tfk~Bm*nGCtceXx>3P-Iu9Wk7`mG^K z!a{oCBwASUAg`pTtU)^^Ls2O!y|=KAf`o>IfQLo6OhP;=n?9{Y+4Qnq_(nM^a>eR7 zjLq+zUKlFii)=CZF}Okd(wJ${@xv+VgW{mn;B<5{WSA}Y?yuSQ0(&b*wcC^y&KNSlA)Ht~Ex z$JEipMVRD91fnAoM=6rAOzKvg7h1EUfjmoGfjg9_Mq!@MO2miQ6NasHkv3Zy_NDB^ zL#EG#HX7St*I>1W6dUc}#9bVNJc{AI2gnm=&S*>;HxnskaMybAFQpHasUr12dX3py zK5lh#;{7@4HWTUI3+)5e>ss@8pj*ej%(XP$)*x{!xBa8r6MmbEwb_`x#W=sqx{<-s zZQ^-l_5sI}Gb+e($~9HQ#rhI!jhAt>Y}51CFV=G%c_UjE+tP_Kja8iu#_rC^X&cSO z*6QKLPC~vq^BbYf;duYoXxB}EKDl~7Fhx& zI^3>|V-qfX(2l*=OT}&66+PbcmeZu>YDOYrfRZ$IIc=kr<>8Wb^c5pCnZ~td0~6<@aSyv>&+$F zD%zRD9gc+J$y0HSVRvYd8=LkFSfyz^1H|PK&?L=hvWICm_zM)HDL*p!Oe4Kzv806U z+{}7QK8H6hR#&mM^A|ZQQBQMj<1f*fp-23c?s~5YKfkSj{ii=sJrJQ{^&o zb?7(dSI4p8K+;KwE4VWhDRJm>@gRYMHaAAUePQ}LdMzrxsYC{0T~@oYHt5~bwv8EC z3yuc2UU8~KmAHp0!V~P2mW9NjGWLKix0Oy#dYg;(^YUGqDET7QBW33OrF-R)p_J;H z?SX1(cVl-i50B!V>+oonB+3KJsIg&W!+4b>y~wdrv+)`0Q*8B%qIBNAqH9GdSViZ0 zO1!56)1F-^S=Hoa`Y(vZ`fN^M7-=*A3+j!YGNm#H4Pi}v;UY~}e%ZnpC8d@G|N3!z zXYj4nc>>(&KSurNhWD8|&khp6LYZg3$?_ z$VPiH`XKo*+cL8nfKvR1wn7nxX%8hH1waWMhOL}0-_zFOP8vNQNys~qs;EV4TVSb1 zq&_g(d86zO?HT-rRq*T6tn-yB8M8ZF*}jP~pzH)|ETZS{NEr(Tvw*z)rQW#uV-(ve zPf!R8XVzgY5fd#}bQi5m%+&0U4qN+dp9F$C4!W@IX(iwR`S{!kn4C)SBt25tkzmS1 z7=2y5wlk5YxBy#O?q+jyslI!=LRGk82FzKwM>Cw7W4TmtD;Vf{d}gN`Z&^RHE2yXG zg`8kBD{HXouVNSmdj{IgDD)`tawx0FJSPYpyiXVW)Vu)2|>48$htYK8Q#%z5Bzsye0a!YLO|%kh$94t|^kh zx#5lddwHVN-cZV}(=dB=H8bUq*izN6eO02;B8Hd2ZD|eb(|Y5fA+Js;TKomKVyW~b z{{=eDP612RLCpnX)$0BX+v`gl%uZ_1Ppz)9HK*mjz2|Gi!_JoNCh_eaT(o#N?Q7~I zkFz^@&Ka<@)BeNtPV={~o#v7|h}5a7Rg5XjP!;I9w6HyV?>xKcDD?Kz`Vk}@@u73a0%#*N{YD_51$ zG8b!|wcj4ojWi?WOzA48qbj!L>inqdH#j%(E94D1qepy-THPIk7)UzWC$v~=;ctMN zstgNCu_~QZpr7PErdv76o!~Kpz+n`Ijpf#>-f+xIX2Im*eT#Vh`zeC(FJ`l*pbXbl zRXiWksnltlKmf@=_m}zsUbx$VW-DwASKeH}Fmy?H-mt`#Cz);M&UVT`-@FM@JgVTqA5Mm8|wOTQnTIi_(-Vu{9l zwdmR|JHw21N1srgFfJ*_+qA-^B}cz?RGX>!S$QkCwe?ZFPK_Uao$-ufEroRoh&$jp{b#GVwID+FWtHU|ZY9 z;$zlNPfd@^@iMy2H=NtCKX>k|;{q1ttg$%vwQaxLHoCuNRCiUkY_zn;wELd6nH)YTU8?g`WJl#lXG~?#W@)o@xHNk=ySf-HQH@=yZ=b_@Hay~I zX|g;$!xgc49f({+AzV=>?FV~r_n5CrZ)N!S-UYnvJ#C|j!AjxD;kJJC@<4u`^qRtZ z-SjF#X7gNsfYReXANYN7s$nL@G;i#_{cgKS);wHwzv#5zV&!AG%IHCIn0UXqBgpyM ze=oR`#ie3z-2LkqGL7$Xv*fR-y76kJl#iTLDnv&0YC!_DpWe7sZ8 zV&BrV?eh3&GfL9J=OE;`e*N%c=DsPDhClK`o|5vr968sqGNtiuznSOh-9SbWn>x%QGWl(W3H#(;AdvVmL!S8}UUTc*YP- ztQIv=Zs^M%CuvxX*aiDwnK^|=tc==!!~WX;J=03G2JPCC(OgM0j}#Y+nKk8~6SJZI zd&hgK3h5NbgIOQ2@Rk<@s`~mnFGyoAH<{hvMeT+uidqOx*t60Jz<=8U$`h|sWhVNX zJ}^ro;d2T}aE>FqD(-x%fIg@LnN3crU{K>@k-%OYp8G89OGVicS|vUJR<($MoO#A&Ll00_I59?Km<1$if<8- zO2DWo?@AtpjSQWju#a3-Ji8Qr^Km~a>`gn;G%AHFd|x10KOwyuJ(o-rH9$+e@HlrS zR8eB5C345Mks;jJV!k$jdjKRcwqUpAc-2xMMR^nMaWiKgWw0pe{uOrytwD0iPSkX> za|}`D%2$cV(@1_yMjeF||8pM6Wvn3vE?w>9nbrKAk#j&wPB$)n;;8aR@nE!+RdGhm z+&wbx$slDqIK@QZhV0HiYg)L$>1ii-i(IE^7ng|H58Xk#ZQ;l{WwMq`;W5}G;_o#7 z(xI*TK(+l8A|w4tf##*)D2&LRO(x0*sc2Mdg1v;LG(~$&GyJ%``$1EzTQz+uM|Z7v z#IY>{%=w(!uGD4xyG=2xXAz6URzRp{DfHNk18#)(bR*XLiJjqcU#0Mc6UAJartpU9p#Ce@pe8pVjIq%7Ri3hsGv>h zz@q_{r;)(RKl@9PGd72kCTwXRMXFpUc!7J!9mZV(TupLIfhxqSAtoZ-2_&vow{<); z0^IjH(i^Z+!Bw^SO9e_89gPZ8VBT1~DWSYHDcqL@>brnb!XsxR8f~t{Yc!okMz5l< z$P>gc^>O=G!B=@5IFsXONm4_EdA&&91O`DZmx3T#tBY%0V_tOAPX-IW&fP`P$z7HE z<6@@iIZsCnZIXTEU+>>GAM)gMMdF&<**1au#ZsfEIm_w?82kr_s;Aj+7tyUDn)Y|P zmjRJKo!!oi){V_6<|DHvmB}CXQW(?FslspaOpygDnbzM2<&BuJrxB$ktn<#LC>O!U z*yNA1F-Q2gwt0?PTqJ)D9U6aLc>cv`YmUOoGi=Oj`MFk~^Vo%C+Hun%Z6R81)|WHjOqgdXQdquZKFq;#(Ei=Kx z&$CV@O`C{xl6Joe64ic!#K9G~?QO>Pd!$7!L)hB06z-xF!`i$6J2q~DRCCBBaHdvC z&`aq4EI6>TUJfElDFd+w{rxiFu<#3h0e%iGA49cSK@yUpi!}_Zt~mogs1liHQJ{)Q z2|7R}k!`nxWVAYmH=_MMn9pK*kWa-t z6Qz@eHfxJDjOlU*xwgR3WNJ(#GyBOk^z^mQ@TN}QD#NMMN~H`xHj?!QrqXqrX(wyP zZ`AB2kBk0D%gIZ$_XHPx!{yw+7qzR}yq*F78rH$z?n}L`CV79c4>k0sZkpb4au5FI z98TS|b!PWArd261TsR{%R0}d^;~ZpHNkQmx!`tg`bza-aL@~kp6z^kWI(1zGuff^l z)IyPik^Xoz*E+!l{ZTV<`H%#y?W4b8^DyIf!P{pUf(FkwT>CQVZ@UIl&sqU#>@ap8 zIe&GXE4e(`xEYbm+mYk)4~1KY?VZ0-_)4b4QzaEl>l@pyZtdNFfb1FC(kxg~uK?Dt zZ6rv31nfc$chq+KY-A{!(ld=PO?@AwxT>0?j}^2e+yljn?)RgHe#G()iO|K8x&E+V zFn&)25|eJ_HDe~)M`jY7rK+e$!*i-t8n}3 zW-%p&>q4cb!b+pN5ulp5u1#&?b@0g%G31Q=|e<|1_A|MDTymWn?+6 z{2E}+7|MlDnc`p)nNwTZx)8WV<&qebg0_stuP&}iRfF;k^q;wMUKzwpg3QgMd|Lbs zjmiatnG2kx*NK-hyi`w_x5kSoG)0pqTG4~&mVjaMLHHHSz{QZznAXU}6DP!=PLw%x zI7kGa&Y2J`59ve~5rr2xzGoBvTgVu?NgcE4HMe3NEtA`b996PT&oya^vltiuEppo8(M{4+H2$vq+iPe1c>v(Gnd8 zPMVELg;u1C1B((+d#Y&Z*W2(343S)MAsXg{lT8L0pLI&a835o`dM;3Sxqyk(-Fv?f zm8`ZFH~8(`XvxJBcbC*tSa~RLB-UU~tgsBZA>s0*Vnu9DZ}`lg(PgbK6=$Am(YR&v zFa?wbbp+~@0aCitgJH0$;F9ODmSyGOF(DD@$TcK!*q~5Mxm&zmC~}R2aT(jBGzD;V zN0N$bCvV5lj{PIvHp{yIx9!_M6G`8Uzbu6J4^Qx}P0dX(!pT2zG17vjv;(rb1Oq@c z?lnCiTA;cv{EJK@YV#^e7HJxz?jKs<08m{Y0?WhQm({G9XQ$>T_!bwZCy43x+OqWD z&cH^*oOtJGqkj}swXH!58=|Z~XtUTGnO&V-;cOUSFSG-A3TIrLERbGlJ_5991vis@ z@@z|cYFu;S23qphv#YZoeIn#9rIXycx*X`=t;L_F8JJtvD^pqr9iYyD%&6=zlof>B=JZ2^Ntbduev^7L!_q(CL zTVkD`UJ#iy-ai5!_x=K?-yj20Y%a0Qm|&AXtABzNcJ*LvqGYz_r?~i^d8`fUKv@v= zlb8uahd`_ev^O@Zx6dyBXk+iRSGT%v@;|l&_XS=5PQM&$&_Zj_M0M$(&AN36J?LN4 z`R`c*jx8Z(mjQHHQw23RLftlm^I_dCh~5{3uWNnZ6nKPe?l+rXR~f0AX+`*%_tieZ zw8OI0AKO1wJtAA z*M4$@o$`^Lyc)vt9K&WtJ`)$lp5e$(Dh(YyugdtF2Ixs#%|VBADwQeLdWhzXDAShO zlXJ|BDV-VghPM^oM_@-%SIlM~?>OfQeVxo>MrDS#UzWbE!BcIIv8}jC1bc#`kT%)djJBCu zl8uDU1kdy*hwVMvL!Z&BBcG}5nXYNR-mZzBVaNBgPCws(nf>j3$>%#SxG(bVAm50q zz3oHS>#OUI7uOf{&zW~_U%#FJ-^AjCF&&Z|D!!%s%r;miG z5}?n9xz>B_0qleZ*g_6K_FXgSxqS-)K0x5NGokkkf%%!_>`+&kF=1rds^Egq65SQ1 ziSVBskb-=e5WUw>n7mNIIX?#y^q#GO?+lpPpaaXj*R(#Nru+gUwujR1P&qSPFA7@| zH3zmLkr$#DAMaq89=&#am|H)CbHD~h`mQVfBlSW8_<{!8`tJyT&cN{a^2bf~l#KG9 zCJQkx5I`BGLIe-#slf(c=&^$Z?^j26Za)!XZh;3QB-j#y4P5P(=lJco1HE!q!&BGC zlK<%AVY>X;0b;iI+5H4uLH?&-QcNFMfbWms9*6-x{~g_xs?6lgzM?w#YAC>2Z!HQy zwAT&>VA^+$4(!AM#02ad^6LU;`IdHm5{@Oy9uc=X($ z{_Fa;IP-eXpul%<%ujp(eXXb)oM)u03Bmr|ilP^pXS(hP?}V*h&%l*I&QVF<^)Fy2 z9N-FMK(rUJZITZ(cqU*A;rA7r-ZKp5C!23ie=lDy@TP{c{AC%<`W+{n=uW@(9$O*@9OQeZJ6Z#Q}WJeh|zp$lx5v z0Vcg?6rdLhfd2Lj4aNt`p1Bh7c`97OM`(7G3+|7>Nz<(w{FLG}%(;xI(uSTTL3>8iKC}R{fN~yeSB>DozP3ZCXL~@%f zCG;3GE;ia%cK|lhXvo|`kMOq~uNRGfoy0)7lkUrwKKF5~f$rR~8)B7`g}mx1Qj&&} zT!H*erG&lAIk-wGx8FS4&CvpkNEKpIRqkf&62dp|M5IJp?cZf`C@R{5IXW9 zJ3<3Ii&u2!JQHbYqaOzxs31pb_*=g0QjWiR9RU*sG6M`$-C^e>_PGY?Xat0iKhY6* zb5$8NibPNd=wtCge7qiQO1fA_Rja=`=|*LLu6MT^EnJk4)_!2 z$=TJO>BBtvD+TZe7XR}TEr?53R=R({>-h60&t5n{wYoe2eklAbgr1%$j%%2}Ajs|(qpIr_f#D5k^7eRhfE`H{nl<9EtG*yaxS^Zn>C5iPU z99)kxhiP1EUkY&33)Q2GXI>1nSi1g-WsYj2kv5M|QNn1!?^H;)NUBu9gPKuHN-b#= zK#@{Xs5@J6SIEVh$~m9woq5W0sC|%qfRsJc6yCBDpHi3 zpIa?&muM~*_|6QPgU>#niYl@NWgXgyrBCWIYYh4=#QP1xm%r2KEomn7Er2l%ya1M@ z<$fd@LSf_(KZT(^;<#G8SYIR=OJ5|~$PL){CuN7oXcMc1cvGkFc{6VrD*i?dk%~p2 zIAZ@||9J^go^qWA9M%Dd{|g9%ctdd-_Eu*wwwr!7=?MQqTy8reVgsv_6A@vxiw14m z<#AuYob!IZ@GUBql2fNULkz~DI6YO{slUpIg`v!zedmeW{H9X$@7My3&4!VfZRh9f zJi(T~1uRpLqo9Ium!+r7txbi|<|go9MObfCtcVuPe_ldQWmu6Gpfy+ul<9{hV{$K@ zs&oH}&7l7vS%Kn(D_Cq;Q;R=r5f9VBA`FA?)R^)+eD_lH@wxli6t9dTdnFt=kMxFl zB35GHjP3NgfMw=%NI56BF;C-WmL!mOO~Aj1)T1#}K1R1&zhO$K<)I5L zl?$Ehl}?|Nii1D*<>v5IO3^Ac(jhQ*Vh*rJ$g#t@M ze=-n@078+Fkm3|1;vhgI{~#Jb5&eZC3J(2#yuvV%NQA>fQIRO&2&zMoD2YXcBE=LV zLXl!q6kx8}Ol5g5!M!V*zTSN{*Ljb4T}>`0xtSafCtU=ioV8-``wmL&sLMO_6MmD~ z2`X9-gSeE5OvcLa5_ORZ$P?FI1uIg>qX`dr=74g;XH4y5qGoh0k)yWol%<)9<&zIf zKL?1jX6(954#cdNwQg#AKJn}gx2|raZZ>k>3X2R&d6l8A^Gj^Z*`ew zxpLyD;JreT_kd>!tw_pE-z`{Jxfpu8N15yMA-SO9Yp%$z^cvO-X`H>#Db_f5^hPnY zjVViww8>Ub3)pv;JEE7A#ifHG*!(=SgKBQnV=QG@Nt{1d=E2k-^9mi2;OL-tK@1K(zTF*(swIDs> z9OGJ#kR>#}ZJ|4@zs$;F|hrY_>eI%8F26B)q!X=7SIFpKks z>Y`M5T9iEqE%Iipt|0jL@4oa#D*EFueOF{1=Vk*fvW5M9BfV353Vg#0HdhLyb2*AB z7x$Q5hGASDi2}*6-bVA`db+;e>XrAkulW+U^YD=2psa9FdG0BZ8@_$z$ZGUB@|rJM zPc$@)j)MIDg3@e=mfO2$G)h!irXGW56pw{(^wI{m(FQlI@R4~mkDWyvg@3$ms3roG zpDh%fO3w@C$7ZUV(}f~@17!>Th4*(+jZne|c%*-iEke-^Wz&m_i|&k|=0!{sw$yCp z)eS9>Vp1A-1^z4#SM`EsV0=W%mv--LtsryTT(@>1iZ7$N6{Seg_npp3&ha3HhosGEdQ;XOWa26u5;zy1vkPs&oQrlTBuPjL3N!T zvRoO@*eP+7j%1?=VwCnSi?9#f%P2=90{i!aM;&EWnZ*RYgUSLg8tRd0$Q)2Y4#GW^ zne=^PKY!K^8WqU^|C|#~ZDtk8aJwt)O*4eQnHN%HRM3Ft(Vl&2pO-oe+uuFCis^Fe z7o(*baAjdiYAQ%p zJYP~m8RUg?6TGE2a=b7$T@^UsX&BJ=0p5Zm>hZd2x70^{zWcGlt!3kdiU?f{20`= zNU23YjiIV(%d&;Q4R$qM)^>!e__Hr~#b(u-`iSF03ZC;jB?&gS zl@pe(FA!JQw?#GI8X$Ai2&Uw^x|3J;uaS~x+^A@JFI#rr8puw3Xyo0KQ>D2w(gq7o z2xbwfJ!dMNrx!Vj#yc;wZz`zsB|-ToTPmN-S?y)T{Ci zKg}+6fzR$99(gByL3X@UTkWLuJnxq+ZEhyYI?89r5>_5ZLx*Te?#h|e#gHN$u7Twh zmZz2$<$`&5BF57uSafbhyNi}6-;pNgA6-hv%End~TiQL2GFy($uP?6^jGL4nlszjf zuFHq11D7Am@s!ugJMo9kEa4F9h2T_876X(i_|<@O;Z*TkS2NlmO|b&u*&&GMxzu38 z-l^8qL{W48%F0c`&~rPbbhn&+XYH6~uWC-_uK@ZsI5Vq(MXVHt<{f#~;q?kioiElA z){*GjN)B~L|HZ!3g><@r`EU?Qzr@-gEHzX@qEH|heWi-w3o3^gbkOa5ZyJ!|z5 z{+>rE*>%Kuz%O6d_d10Snz`k-kOD@{f&18CNuLzhGQiKRw8%k)_zI=Z_$e~dGBMp* z{qpS;d3DP4%-bzDS2IX&3diH}D&K8TR^IWMzn-VM>b6aZLi24}lo+BzPZq9?*ll+sP zHLUg>Dg0u6J?aXzp|@4xMxu9u?1pa`Fa;B-!|h<7;%xrlH~IS) z-n)5iWZkV!x7Cjt)LfCwCkPNqcFO6BQV${LCRt_gsU?JQbBu6{5ff$o%&OMwXrK1q z2zFnNt8lY@e>YbEaW5plMc8q5=({=eLT!wy6s*GW3RDNy0|~CfrzfTILYzhjNH(LV z>{W0Gazt-l+67x7`NaaNl{s2L;FjZ+lh7X}xe?(Ecbr{mzmo{ zk8!t7fmtUxPgt^3l^jdzJ}l2j)Jb&(2O*b@{Z4Rw*}i2=q7fK0>YNPN)v+!-Ek-y|^br>CkzD$G?rTS)u1txt z9A5k2@a#vgigZ<{gN(1a%U|HVpmGM5*)_E>39(-^{yu0>tbN>Y>K3RK0M&`Vi0E=F2U)(G(|f zl~n4FNSJ=!+yr96CfuN2lfL6e`kp)pvqK;Klf9<%0@J0?nchbBvP0SM%e%7G!$s`_ zq#{`EAh63M*};7Jbr`cO^vVy7ycEp#xDG*YLb#gjJzW%CqjrMe@CT**W4;8g|KoYa z{LCL6#;33|-t(3W{Rw9i%#}xr`4#+6$qf^|m(vXotkVDLUrsIFV=sTHBJ+Y`+gS?x z;ZG`aK?Fy%{eIX<&Yk}BAJla`yVai`o`N|)pSBXfNFd-_xuDS%voUGP1lf)wO~)RA zAU?3hK-lbHRehA?FSK{~=^w$U*SuaJzRFHid;XgL=(Ld3J?sr_S`}ADid;m-L-?*gwg(I(+VNd$Lt1X zVtA$#Fm((S+&^K5o-&|$ZTgJ*S==a>U(YE!=^#Z$LzXGco?}P31Jl2#KHvz0dj=hY zg^47-5@iRrBhU{cFiueCXGgt5*YB-9Kpq{=F60(?E!mF}SOPtRbqppTs>gPpW(-g9pA4~;=!#!0lm0RT3i*C(2g+lAFoNq75zQ|xNj1w{^7zU}o%_xD!TMPP#{%)lb8lRT&P7sX zQu$X>?0)R%_3H%rLO;ZsiGY@bHbt5y)B4?-SnFRKZwI&I(JvjS3GIq} zIXyE@d40+9_lQ)A2vBK@?1>(H)9mqgsZ-BN3#ufcY( z`e8$}SRnIKfbqcJE8(@Y`jGu}f#!i-P;bcaLY@3L672rK3}8y_A3G|2${nlzmq1Bq zRm5tM^ZY9E4Vl)MYp5M@Q0Jt-;uO#YP8Tck1*+2prnS|jWbc6|B+0-FMz14qbZvQw*anE%!wiy$`> zoooGZoZC*QWz+v(0B%5$zdyo(ghL2334??=g!zO;gwqJi2xk+{GonF^GopTijl;cf zC`Kp4Fn-9Szd6aGzx)W&-vLut2ag?eK30Hi?OQluJDt~-(8yDj&Y9N_*d{T z-u+>wV6Gc0f2?ftS2DbVhjQmO1lkj%J z@LyuwL0(Yh|7Q)=#1z7-n;{Smpj^h^BQ-EHx_=V-e-b8Mg8hCF^`C(MKkN<;_ywNy ze~IVvU%`-{fh%xrBO3GR3Sw7W!Wy1|>6!ddDCk5V_{n!Mbf>`5%c2Tx@a+HNtpdw_ z099xUSN#O5@T$8!s?ZMF{{-uR$6yXT4)fqinEx|yg}#sbSI{Uq7oNb9Pr-tpfvfNw zRDiMf-bsIpI|-io2{TH8*dK*IcP|vU_Xkn?v8W`g1Jn^}zFMlzS68U()$Qs&^@w^> zs3KCd5uHU(F+hwE`Jz?(ObF?&BVZC)(4_lj_Ov4Dtj$g`RRxg=d|o%5%_j%yZ7` z_QrYhya&CfebU#;*VWhCm*bn~tMKjdos?cVLavk>(l+S< zJxw2^=jnU(TD{(%;UDA=`V0N#{)PT^{wn|8$b`s&k)@HFBX>t0j64>3u7$frT#Gd= zwnX)d8WvR)H7n|5OK;1BmK|EAwJd14re&z*ftGbG&qO<-qodnJr$%Q)4~h;(7e<#y zFO05?-WVN8EprZA>FW?@Wa%*L2d%z>D?m@@%KAUe=4 zkQ&Gc3;F*X!? zAhs^{Oq?SwI<8$@YFtL#ptxXMVO)9K!nn$~jd7v4195e6XW||4(edr#Q{yw@2gL{D z3**b<7sgk{Z;TJcABeAuKa=1{h)!sikeZN@Feo9IP?%7jurQ%AVPirl;Xp!N!kI)z zVsv7=#MH!$#6gL{#KOe##D$5Ki5n9`i3bwv63?`9w2E%ku2m{Vvc}AEhU0|z<7S=! z7JiL|cWB0KmUIU|Vj)B*&G=Qz%skm`E`QB1^ZT#gZssZ3=J%%*Tlic{{&g0<)51@i zd8Z*3zRALC&AhYI-2Se;&FMFfH1qUB7Jj%H$K5mC^8Oy3iK`e}MTUELJFpG+#D;z@ z8e_?J;itVy*v@9VfNjO)a^G>3?FqJL!#2ZaZbe2nb1yUM%)HN9Gr!wuE`PUWmfh3N z%=_sU9%o&7&}&(yaP`l@`9v!uMPFg=QSzKX9QrePFePA2Rc-Rc1c2kC~6EGxMOg8OQbq zqlgC}6}m$PoM|WY%vwd_w zv+CLX%_?Q*5|4t8|DrD8w+v>>b2FRgW;V~wZ1!8(JU6q~v)#^iFI!$C+1#saR&|V* zZ35eC*zz15)0-`~V@!~3A@!!2za3k~cCNYK;}VE_aEojU9iR)O;YqwN48#-LNIaKO znQ>hEIQAst(%A9}9mlng+mzO;|whZJv{7 z@PuP#zmgZQ@L}d&QMHt<7>GpWMsBGp!{j z^L(E?-&{vg2Xo1ySr&f6tk#sF^kyfILDO0crxvm0v75qUH)V0yPF>2DSKCzfAycAWuI9+i(}n|EoRN4U3-urHsLL^U?P zcUHg4t%XNRi0uf75XN0(voWWXc^sY0+s$@ATlT>7cqHeYGi$vd*~0r+d$fRO-+~q9oKG*m zRG)>sOD*JGa$zdXP&??jFDKCtSLykpS!{XUEn$zmgm=p&8?1h4$xgO4=GDJcr<|r% zEag3WDeu`!Q_X($nStij{LDTYD_3J1yEev-RDPM8Ew74Y>@AmZ#J7A!*gnUjSTU6? zdyfkA9yUuGpI;reD|lpIP_4SZz^na*8f(f*o*gUaQp)$XdnM0_mE6u3hp=77mREZv z#~78o+gEbUm9^#(f5~m(DWvQ7%<-3aX1>I&UB!F;Dvpa+9cFusEuU_FXEWEby4=F6 zEc~#Uzr4&mx@&q`&uFjkDqc6t_?wrelCQQgd+k?qX!bW&-x+H!4G+d`jBVK0rrRoSb+oV7Y=a5`4PwEA8`!#5tsjn%h#}%ugNjDu;%Q) z+QN@HTKu>(TYlrm?881j$d=D#2M4en#+D=ggS`4a;qsqw`A^upe1e|Z(QGyzD!2N? zL+nEiZ8WcdPv!p=7ktWn__Qlq{$AqK`C)t5#+Lo~VOH-j$M2uOkA?Mh4f7UGx8+*GMpJSH(H} z`QotsLN)IeUko*Wd-6q*IiCHZq}g|7cvDwu;VaGg>nbhWnr`_{t8TM}Z)wJ{y?@(e zJ_jFLX5mXMe6hKI$1LacV{6Q(j$<3l{Hv}OZrPFRvn_m=IsdoGW_~i?>|0K4X%@9% zdrlp+q}QAI=|Ro%V|}MBGwXDvc|SP4(yYhnHJ0+LEqs+Ff2Em!XGuTP!Ce2DjuviB zpWUoJ?9UlX`_HVh@a^XQpKWL1W6k_r!2JGyl$+mop{s@OG4qQfEqtDZuQTbT;7)1g zM`-73UEj5j=k~qx5^US=pg(tPK@L~%;V&-iu zysg8+(=2?WnO}9t%-dV)Z$H?=hg$epv;OUK&HS3qX5Qh9x%~B;%{*m*g|9X9P6JK; zUg?x?=JUHXiyHAdrJCo{aj~!&@6GxbNv3WeynN!VtZn>E+ns4TdSD5+pYt4N1W;1^+ zWaeA;nfY6Xo5fA|WY00v{-*9ZZqi%bbJmi6#?0SWEj-G?vn|~0Pt^C%H;a7m$zG?q z{=IGscVa2yFCwy(ry-~;qhE52zzdWG$^!Ivy4`QQ7vmO(_bwUo_Le(kmE4X`9Lm?q z*O;$fsYgG0QaOpE{hjh12-!pS0GqsB-j0!y5%Z|x4$<4FO^sAr;uEY}7^h}M_^@P0 zFwS%-822uN5Y)msB?{Z%#8yRl?*rA_+dBa9F7N$_#%yVdy;31fehEU=u}yy?8p16M zIcGzA@22+lrS{%K?QKZuM=AGGO8@35ayPZGnp(JrTG)`Xms0jo%6>{Qyggoc!1Smd zP*h#jQPq~Hs_sJ!hGe7at5AK{-OK> z78p|lo>m>I0~V@Y)eDPMzv_p@YP1>+OVoHZ9+s+Cs#n4@>ecGiuuM%+`@^$pfjSAc zs*}~pP^C^)r@}V%A$1yTSIg8g*r`6EJ_2v43)BS=QWvR<;B9rK`Vs6BKAbh@MHkTp zE{L9@7hDu~iMte4JS(16gss5#ykfIw*|U_+_EGjx$_@6>_R&fg`xyHe?Avh z7}-U35doPhQ$?)oD!Ym}*-ds6@iI-Oi3HhQb{B~;tTrDTd$>JJ0MNSdd z%IR{t=pbjv8R9xQQ_d6}ai$$tjDwm3z*5aihI~V0$T#Ji;!e3$ZWX=d zHn~mQC3najqK|w_z9sIKZ_BquU-^!FN8BUdmG6pv@;&*UxL3X}-xvMmpXHy$eewhO zffyh^lpl)w#6k=qqSaIFOjWf zXc=OR)?4c>#%g`EK4P5KPwOXgwEkLuF4G_87Ky9FypbgRni9BtvHds8U4bg^( zd~K*UR7}){X~RT;mZ@cmN!kc)gecTTY9qyDEvN-Wk(RAxiz(VzZLFB8%<~$y|!K~);4Gx z#1d_zwoxqAHffv0Gumctvsk8W(YAIEL66a6#2@rn zJyvYg#tW_`E5TfC`P>(ye5zDM69{;2QO_lm9hK7F6~ zlfGZyFRJtd`T?;`uhDD7cKx7!Q0&kT>4(Hl{jh#myrtLbwIZY+(T|9?^`rVxu}iPh z>%=?ym-?4tw|-1NCf?PL>&Hd4enLMX-qY*#da=iE^V`Jxeuv*7_WGTEr}(qq?RSfP zey`svKJZJw6#KD5y75mi#{89cW@sU5;A1!M90e?Vz?2q%uiG%(Ge}eeL-^$-g z9P(e~ze;@SZ|`p}4*Re6Un4$?i;qhepQ9TdPCGHs9;_(mlykTrUsNvQK4@3%V51$w zPCJH!c8mx$PK^Vn+D2^yE;U(A2Dj*q`?SYC!af4L_L26H;IjwqL6G)rdp2nHe0x6V z_5ynW`0a)ELWq<}G6`D9HnI)wR&8ZlXerytb`UL-WirIbYveT$kR4M~IUt zG6mx04e|y^kT=R3AyM8WZ-Q3xW_dHTmbb`TAW7aTZ-p!5ZSpqUca2EmN{S@f$~)zq zaFu*OJ^<}xmdt|oa+Dke$#S$D4Ohz?nFH6zT$u~k$~>6|9b|zlfa_$TEQF4-NEX5M za+;h5DY8VCKqpxy%b>G-L_PvH$VcU)&_&LXbKpifSI&i0`J{XjZjw*Qr=Y8RT0RXo z%SCb#bdyWu61YV^BcH*@<5~GE+$x`w&p~(jynG&RlP|~@AYHyFUxXg=CHWHcl)sa| zgWKiH@@42He=mOzcgS^e9c0M$ay{HBH^>dpTW*va;V!vJZh}5?v)l}K%RkCLLSNd+ z@1dQ%A4UN?;a-daLeO9C!Z_eQxf|n#0kRt7hWq6nj2i~Zy%;b2Lhi$OVUXO9@xm|V z0gQeI%NmS+ekBiL^fN>rmWScj^0+(>L*+N}8+br|E5C(d@{~LUzmea`?;w+ZCvJRC z)rF#l7jSObl?Rju@bM^R6rPD+x4jOkV6I}(aDP$+Prjjjm{g&)x*F$Iv@NOE}0@rl1lUyZa3tcnF zPIf(vb`s_*BU|8_Np_N}oNS@%5weqAkD@Kae6z_GxE>=r$u);;q3dz7lU+}sos9YB zku7jNNp_NJKG{OoQ)DN*ib2KHQp8EFS%`(Mxrmeh4Mm=&o=+3oG+S zR%R|{mWVnyC&MRu_w@311fS&?^Hk#(fVMw%&Aq)6!BROCHY zWDhIyJ}a`975OtO@&PNdpB4F#6*<6)e8h@;%!(XjMLyxVa)_1rl$ANm%6!Jk)Uq<4 zvm#%xB1c(~zpx^8tjJ$kk!n(8A1P8pGv&y?smR}0kz=gLSFFf!R^)3|Az;oqdSQ$5jm2oR!W!!358Mk0% zz9dCXkRqo^k#ojOF}@Kt+D*TR7z|e{`_$(|UvaMpiqT@M7$+u*Nn)~?A|4WWE)}!I zV`7eYTs$j|h%dxZ@fT4i{wlr{e-p>VSK_$%TAUEyhoT5M!fJ+pLLW~58L=kvIu_y+wm?jLvuC%qaU1e)$Yj5-nTl5`3!?$ew zm(<3;W`k*1raf^*`7q)oHwHshOH8}@BFHqt1g+HSRV z2d}M%tp`X=@1vLfQL!U9WlB}vXnSU_;eNr4Lr2uP49Nd@F0aFLuOgMh%2vjjyqS`VJ_yQhCMpQFos7EC@%C!YtK02ASF z^c?tPm;zH_8ce6B+-9Msn1iF<53!ZZhXt?@^~PdY0!v{Td<4s31!|FxVHK=~HIM;o zVIAs}4X_b5!DiS3TVWe&m>sYaK7n1Z8}`6n)Hk2OKKLB=!x!)+e1+QQ8#n;p!a+C$ zhv5k7qGNCzPQXbx1*hRV)J$jKES!V$Z~-pDCDc<_;41t8*W|mZ;3w2tzre5X8{B}K za0_n39k>hk;66NnhjK%e*XL=x0dL3~@fUex-h{uz(|J?gj5p^kcuU@jx8`klTi%Yh z=P&bDcn98*cjABHop~4jDu0c4<=yy9ewZKONBJ>+oS)z)`6+&yf5*S)XZTruj-Tfj z_(gt+U*=c%RYm7N@N0^}f8^KsPyA>83;&h>#&7VO{1(5>@9?|)9>32Y@Q0|Xn8FoB zQ58+`C_?cnF-mgWlgcUOwDO%=S}mh~t$w2(P`_0V zs)y9W>Jjy*dQ3g8o={J!r_|Hxck1`*8TG7sPCc()P%o;N)XVA>^{V=VdQJUNy{`VG z{;d9@{;K|_-cWCC>n_uMPt!Kyd=^^Q_)N`7cE3f(Mq%yZA4o<+T-yG9vwv|@fXoq zbP=zL*F;y*O>`Hpiyoq<=q26|y+t3<7mqhZe=$G|6obTIF+{v2hKgZgxELWuinql( z;$1OHj22_Wdt$8ks~9KV7vseQF;VpTg5i9UF;A$#V2By*e&*mz2Z~x znb;>j7yHE*;!E+B_*#4;4v25XL2*bN7DvQUaZDT+C&Wo{N}LwoiSNZ3aaNoY=fwqa zQCt$2#T9W?{2;E0AH{X?llWQO61T-2aaY_E_r(M8&4Wtl`dj)?eV9Jn=x4lX^fv|=1C2q(U}K2!mNC>A zZj3NS8gCo#81EXRjM2sz<2_@nG1-`6Of{w%(~TL%Ok=#n@_WGqxK$jGe|O#xCPi<1^!PW54l*@ul&V@wM@d zalrW2IA|O;zBA4k=Zp)+CF6?mqw$mRi}9=Rn{mUqY1}ey8+VMm#y#VK@z4a5ncP%N z)znOndB!|zo-@yz7tD+1CG)a*#k^|%U|utSG_RXKnLnGqn7^98nK#Uv<}LHKdB?nK z-ZSr;56p)?@G&3vDL&Pw`8+=1^ZH_Zy3g>LKA+F;%jUCu0bkH(`y5}$7wgOJi}Qtj z@xC0s1m6?BoW3W0xqMIga{He4CHnICl6+HqQ+?BX(|t31Gkvpsvwd@XbA2EB=K1FP z7UbxVV`z>MWCv+ai}scV@);cUDD4={QflI8;9I2*js^}X=}J>LqO?$2!ZEVFCzP&A zS2&6GaWI@x#wp|AjQlk>I7{Pzb7bGnlYP5D_U$6sw@b%Ew z!BrT>KhqtzxuF2m#SzqGv<#b3Yh$DaT15X|I$J_#a<|fgSV%B-*((G8!nQKh(#peB5_2*MB<6y$O7xJFxF-XUIG{| z%}WF4Re4oVcnw|yRQ>{g0W|%6{eAH08F~f?{knb~!{gc_{`G&z_PQ3`Ce21PsZvgjcCp=FX5wF=tO+GOSGqs1CS_Ol7vPH8nWZD#vFX)WLUCwB7p zR`LV1kB=>5wAJ~)W+k(%All1GXxF2yWd$6S$T3Ogh(wM@>fwmwc4Rzq7e^y6;YegU zjYVeQNaPN-+842p>;ll_W6i$%s643dSs{lvHt92tAF?}t@Zui+iQQEKkSeHx2(3yW}El_C#<%$ z;~&{=)bTGc&O$gDj%RtnVf9!;c$)4%$;(=>_K=^w!d`)5tRw3P#o1q27kHMv#`;1D z_9mMEmDyxA4O+0(>FpT7H@e%MYf18hnvHU$g4kpl@Bp>jJ z9Q8e|5=>W2B?vPVM{!`D600P`e5HU=2sSE3l*+J`Mga$C6!0z0>kg{3)i2<(7SIAL zPP?JqU}5c+c8kSpceFb!hX)IcC3xQUjAl=G-t)ZAa(gCtCb4HclReW|e$NcgB38(= z#IuT(_N?*jVwF96JYTX#o`ar)tcB-@=NN10IpI0Q+TeKMK5OrJh~tGJB2|=TYsK@T z9NX;8=S^nYyal|4*bZ+IZxOcJo9azvd%PvRCD~rN1IIq~miLxtpLr{KE3$pws@|&X zb8iiA4YuD~+gqD`;ce(`$iDP8_BLi;dDFe=>}zjJZ(H__x1+ZsI~=3NsO*T|MsLfG z>h1Lo?6}@Z@4-&%z4Tt}3R>DJ>?&H?E$lb6w71v;gBwk`Fq#{Ed24fq`8^-#tL3Z3 zclbv8Ci9({cYNV&bs6p4G-oeIBx|B13`&6~G6qSaXI(g2-4DrKhNFWI$(R3aiu|_; z|2u()yzeYO%a3g*g{7d`E5S-&nAKP{G%~eVEl}AcHi_;#+XJn&crAyPpgp1G)SlFG zX-{dnwWqa2EsvI@J)`B-@@dIheyxC3P)pGYX@#{ST2ZYS`-UB0-?D@35If9{u%ql4 zJI+q9lk5~b&Awybvoq{0JIBtm3+y7h#4fWd?5e7$s&YfQsoYX-D|eK;%01=2@<4g` z-;t@975VcIkV0>nlfP#x*O25J%@umLxk~T((XjO7J>G@z@M5W!!tr7mJai~4e@BFV z@7{!3c=(|)9@*$!P8PJlBM9yAu%QDU4!v0?L~k?84g>KBV;|)Z&$2NKa$rx5hbLH0 zmJ@Q){bEmIudN5Uu-B%;Q?xsroBHe1tTXEjiF5~99@dlff+W_T^~aw5HhUZLv3J=h zNM>W%SSWz~crp~ke!Ln|*jBa;3b9>mHxyy}*ghym>sH07|E1DsyC$t(wV>6jR#|Im zJ0ojq^Rc9!;6->5966@)R2(^0=9O{eSd-Vpkz*Q9!;xcS-WW6-|Fj1Wj(q-tBgc{Y zJK)tv>0`mr=jrpo(iiGWAgCYI4?(PcL_ZF3`YHVkj;Y@?2EbEjMTSD6v=ERFEyOIy zFZDSTLVbP^il7!h0nef)KLx3%%g?}bsL#(q37mUffRd=wFF`5P>sO#O>h>R?4BZh~ znm5bJ%cqgNNDZ0Om6wvdBz{-sNa6KxmZMURG|G_&$9d@>C|_P2#dU)i%9l?0@=?Bm zlrKkLrZ2}Ft<={*4$5OL%42T*f_@2-^eg(0m@k>r6v}B4%4sU)v;^A04{@F_A7>lo zDA!de*VWKI-GEwXo$k}KcpOLRog%xqwXuJ;qZ}=id1PtS?;%S9v?j_~2Ub2y##uuq zpBHknzK1>F56YqpFN0+vOGKqQ)~H-OR4#(b#Y^Q9gX7=kpi}7>RO=>{kxzd~e+m3J za~}ZNa9%bJ>wdgG1rl&}wgwXQwfYuF#W~uKP*(p*zXk1aEHMJQ;HY6N^ufI>V6$s^6y|hwSW!O0ya_$*hDR0Gqr#%)B?7mh5r$@p_Ts$wxgxL z4?EDVdtg6~b>iS4j&GiVlQ^bHhVwW&G2j}GG6L`u+WL5$37{s#nNl|ZIk$w0auovV z%R3pNfzi*b0{iirC)fvcpRe+`M(C+5z?qF~b@ifZWYOaqfrj!I93wIg5u zkcae;AU)(IJrqNFNGCmHkRCEg5BW(CWg|UgksbQmi7Y${afctSb4P(V|NKHTDAe zleO&9SJ!B9HF_`4e4vP*Ob0zuGdHYCa<6T&E9O}-}hSNKkx>~f9MTLAIC5@ z`Q@@Pil-CHhngT8+If!u6+kx~t-TyO6hgNJD~xVSRs`KvtSGvzSuu3mFdRo<-kwFb z9ZN;GJ$nw_msv%54+*P;?q66HbUWjCfn%2y)nQsZ#eq#mV<2V%!MVe3O1r0+Xn~WIGn{f|F4hs1+gW?VOvkcwp5s#XG_R$!IqNWk}V^@75j+%Hf%ZhZP^O)TeFqqw__iZ-=3`^ z|7GtJ(#JgJls@M2N%A*&bCJK<`xN>2y}8MM;C-6>hu%c#V~+EXUyeRK}YHk75+(KC&UWZCNL?s?eC7zv1JdR2{OeG#qC7y#y zJb_A_ftn5Ixd?@H1yE0C+2jlKILNn$$|s%kLQ%BEkrgQxOKmMXwUIa(w+w}av(7rm zmLzpA>XV7oR>+k*ZOoFt)xbhHvtgu(IO!LuXH#hmT;TB zd!pM=#u48`GMVo9rt$4DlsI^sHDZm~ORNcdk#*3UpzTV}Ty^F>`2aqWPf#W+3ze1r zd;a_W2mXhsou}#3^%?q1eU?63pQF!3O}$OuuJ6!y>YwPl^xgU%|4l#lD}L3l`8|H& z_v*LxJNjMyo_=3{pg%NFX&Qeu#u@J$|W0SGj zIBFa>P8z3;?~Sv@dE=sS*|=(4Gp-vyo5J*(F{W-BrfK?2znRUv#?pj zENT`ri<{4yspfNL3A3bG$}DY`F`qZfn&r&$W(BjNS;?$yR`HvDpWp8f`fb1CzvaK} zzvIv0Pw>l~&?K5U0?igR9Cy@0i`a>GMw{OQXN4y3kF!D_Jx$=JIbb%L*;%xv8&Fm# zD=5PlhK0LY|wRn>gyj`3_{4^Bo)=oz%}kJ~`{bvCv4g{H1W_zZxpxoc##Y z#(DcOs6&>&E?NE;$nw`C%U_=?e;Qf-24wjglI3qimj6Yv{Ef--H!&Wd&40^$kpMBkTbgd|9va|uiIm0+rbb5)KY+2ib6H)q5AYweP*Nj zw5UDDyy|aKIfIW zk1gl(;6!F6^rV@!4Y(!WHpZ-0G!}d;SA4~@NahGq&I20KSaESgQU=2w0wY~AInI0) zX1ipl=W%vAJ|dH0_LgN~C0dC9Rz52qN>VHw30TisIMT76x1NU>tCCd>@jGvdWo~rYrQQu9Vxay(2C{Kv`wu}cyh)TSYOG$eCeRh?PLxR>^;fj}@#d~x` zZ~S;L4;T40d7gE}dXDwZt|9r7AC%`=S6~jAEQQ)pvQ;SCis_ooMny@dqZCIhd=ww& zO672rk3)G6-j@%GinA(z6-i(DbYYaVFmFQhO3tgY!cp=#jx~nkH-)G0;%xI{0uMOm z9mk0ZcX&L{6;*CHwnid9IUm;_yT`6`F1J+hgtFaojM5$+xe_&%7+6K^mm7L97Rp?@p1QQBhZ=V$W~KDgk`q++Sux4@5pDRVH;1j8d;5?fR%1Fhl12ciddtpQBaiH zduC6@5jR*`j244ewvs*GYGdI@#CpZ*1Rkri)dhRXYgRWft=FyBA)D3H>I0V5&+3Q0 zuD>-9Vy(f}5C~gCt)Y;^8g7k*1Z%W45uUUrTXQiT^H6Wdrwcfys8LoA4Mbv;aWRTZ zqqt%yE`#FoQ(W07E{Ea@QCx8pS3Jd)!+O_x7jkCBIEP|f48^Ra7;nieErxNBn?`OO za+{DlB=ad%)C=;zXVHz#(s-jmMUB_ls!2?~MkQ`Bj-_9ve}f9V$cD#XAkHLgRq^9!a3S+x`74 z6*VTu7L*6wJXR9AN!ByyK4YQww(_DT<)}}S(M`5+u4d(zEypT=T9aD^NyDaCIAgO4 zSvX^}3R^g1vx-(3Sm_X)#gHF~m_{T$;5K@~`#Cc&crhZ&)pGOfXEkzT(vO zdI9sN!&^8{Ou|}BN3Ai2EnwT(adv}SJegPKEqHI#wM+OeewyD=93@4muC!6!R3<9R zl~0wk$^$h{EvnX5UseaHlhsw~e)XcpwFE6ytEY9+hHBHbwc6L(RgcG$%TvnJ(DSNi zq-VBgqvxRKy3j?UC@Y$X?qZafC$@^C;#aTVo7Y>>+sxa`JJ!3%yVHBpdn+awQy`{l zOskl_G2>&F#q5dsKIWbts~6U5>g{j@H%VWq@6*rYXf@s_Zqzk87($=;M3RXl zyGVW_`HAFrkpe^t5Gmjy1&I_SQqVfIGaU#WCe<6 zNg^d(q!f`-L`u0xX(FYGly;FaM9L5;<08)!d7jAgE>f0ASt4a!q#TiQM9R5Hc_QVB zly{K|L@E%e;35@?R3uW-MJf@gM5L07R3=iHNM#qPLZk|jDlSr$NL3jIyiVkGBCoqh zPa-{u^mLJ4M0yeF2qz{okMEbZ$KO+5z^mCE^MEVoy?;-<; z3?MSVMFtWXNMxXk3??#|$Y2*4LSzV$AuckM$WS6fU1T_s;Y5bJ$Os}Mh>UQNkwiuk z8R;UUh>RjK%0)&K8BJugi;N*MhR7Hfd5_3@MBa0eu|&oa8S5f{CGuAye|3>@M8**r z=OXVDd7sGpE;63Tcp~FnWCD>1L?*b%L?RQ3OmvaSL?#oN>>^W$Od&GGMWzy&N@S{w zOd~Rl$TSz3PGmZf=`J#Z$P6MgTx2GZnM7u~$SfkWh|F@4*+ga&ne8HTh|D1}$3^B6 znM-7@i_9Z3kH|b1nNMUsk@+sNfXD(O3tVI&k%dGSy2v6Ti-;_8k;Oz76ItvcONcBX zvcyG}5?M-Qsf#QlvW&x~|6It#eD~PNhvcg4H5?M)PrHgz_LS~SY$LLb2!~K) zHAc=>8O>IcX||f5W~&8hwwi*o)mBiHR&0vXicJYxu_;3$Tz06L>}06MFKXLaa|Rt4yc=KFHJ z+^U2UpgFq??IzZRR?t0?&e^a8*1#V48jizxxDI!4z8=eRv1FE+j>&SBAu_|C zLMskaW!Y$l0ZsT^XhckPJGjkFNCikP`tSUa+gDA#^CFCo{Xc~x5d zSr(Bca-660sgbq&M^ZnJ1%(gCBOzMOZml6lUF0}Bi`RAKynvmEj!RmXy$A}%zKcC@ z$x~TbP%(CSoOh7~mWb|hS~Y(x^)Nr}sBe#!%3n*u&^xf9Y@SOle@jVW^;l;%-X)j6 zw4}=WLRmxRDj)jY8CBjp#7eO?E+X&6(3na`E>_XS$I|J%d*+@MyT(gJ$%pfF zlrNxtw8zq}ye92gakiD4QSv6TXUiQcu185L^4ys_R%{$Q86{7a-(vDE$>UK{huuL* zD)qMIkL7TWeV@5c#g;`$&&xiSO4yBu3gTdN&@TUrs0J*qRt z&>!cvnl%vnj|cnDU<`2@+Fq|U1MO{$H3!?aj(uhx_PPaVK}~BdS~6dxU(|}U^cYH& zyw_c`x?n2=?3+C?J<<|!YazB!#ae|H(?jW=29I~3GJ8&Eau+;W+eddLxgE%zhvlO{ z5+1TFdx89uCFam>e7i`WS@GZAFXv?IhT!$X-2v(-D(Dz`y@9|FZX6E@yOiiT^W&|M0qQD*A_eNlJ7#zU!Cob zSc*qdd3Re;wwA4QNhhN;fh}MYUDBZ_^PoD3%e1YWrgyrI&e()1e+aS#(u4(AUS2p0^e zgbRfWhl_-Z${pIku)t{Ap$*b6!KL6xAPxIvFBplMbsyYd5qlNH9uUkP#Q8%oJ|byM zlGag@CL}?d5zG;hyhM@~QQt`?NvkMHQ9VhGb7upg6@5q;PEt%c1K-bWLoq z8M;Z7vViQR!8R1ChNT{PQkY_PDAfUqGeqeP(l_HG@wcV0WU6fnMTVMPYDv5%4j>qh z>GEPcNuX1&;B-HvOtVd{Y#ltseP{a6WEGMV=lftLS9 z__A(TkVmXeYE-V)NSo&hZ6x-k%+RujSA|#6y%9XnCaC?xcr&$S3i@T~kYQ&;q;Xho zc_T-r{P!jHN2!)0@+Sgo1M33o0~-Px1DgVy16u-H1KR@I13Lmc1D^zT1$GDa1oj3# z4SW_Z7A_usHk=xME?gp9GF&QLnnIN+1xl$-DRm;Db`QKB=n?1{=oNS)&>MA0-#|b7 z*08|vzz8gXw^5_K8yFQB{fGL3W12q0v=+lSoXqy_Y;iU@n+P3Z3iFO`4$$rMpYv;3* z?fiBDyP%z77qSc6MeL$>6}zfk&8}|Ouxr}2?Amr6yRQ9$UC*v>r`ZkchIS+SMZ34% z$L?$Qv){D)+XL)@_8@z(J;a`1PqhDLPqII-C)@Mw1@=OFk-fv-X@6qxvUl5i?7jA< z_9gqWeZ{_N|6pIUf3&aLKiNM!+)*6W(HxIc$*JsAajH7ioa#;ur>0ZOsqNHp>N+nt z^_==nn$y5(=rnR(bkd!!PB*8!^SaZ+>FM-BEk4v4<_vdcJ9C`5&WFxCXTGz*S?DZ6 z&At}(`g&)pv(4FwpRLY8=a6&QIpQ33jycDj6V6HJlylno&iURs65|s!Bmp>|gAg(8m!@JPdFeJB?wS)6{7V@1wQq3zMA@&U-N3S?nx>`OXGsBP_<2 zv;~$@`&s7vKlZ)^ys9GEzs|W!76K&QeYOB02_dY303qxMh@hy1En(lnz6gSdJOo9C zr-Gx1A|fIn2s*g4x}XArgUg_!fao9sBBFx}xB!vmRsZhcaz*@)INuxe`#<=;&P}CH zFV)pmzpAc2ceC0~GTQQBbDuxik|R*qGR-m~ghb!oe|&U=~O_qKRj=tJ)f?+yBg zx7FK9yS#V3cj+TMaZDT+CE`bMLYx$*#A!*=kfyvwj*_G0wQ`IcE3cE| ze)*|9 zAU~4_KjRS&3n>OnPMJ){<>g=&#{Sglm6)M~ZHO0W{GQdW{x+A3p} zwUVtAOIXrUmSx$NW4V@R)wlA!joz!?Chslp9dDbrQzJdBIAO&tta25sa$T%)L#%RB zta59ta(k?DXRPuNtnyH-@@TB`by(#|Sj{O|!C6?rd$D$Nuy*%j?dD?b9*D%I+`ig! zsg?dp-X&&=yTvSVkGNON7Wauc;(jq#JRs&wy#-KPT^Ba`(iSN0ZpGaRuEmPGYjJmX zEAH-Y!QH(O+}#4j-Cb|Kd*{yo&+I*Gt(`sRoJn$WR+c`3vQ-}Rb4 z43Nqqqr4}vGn~B0uRH9Hiaty|sGpc&gK0bT*Ue87*yB)6`Ggd(cG^gTh zCi4-#y}bRL8>V(erbLwSA*T{uN{w-VQ?-x0AhSXI`abe=&jzhfJjs~{lxM<8X#4zIK1GfR_Lcny&&Z(ozpVH#xM`B zDMD}Zr<$7{Tw%WNS?h7yjRejDuYW0vt_L^Tl?Z9Z*%&6g zC_@W0KVxdjXORH%g)r+_2kR_C*eMZwe(hJZ_m?l;%w#R^?G|#WKUh;gsl+uY*hmt^ zwBT7AFp~R5W(t*~x0QiSw6BGHO+pveIfEtr@J z#tN(3vMa*rhtyQ%nsA_1MO}k_{%D7Ga2U9^zM zds&Z>h=Ox@i19J6TSQn3y+w>{zhDtSu}%hP3)S+FgRW$2b`QUJ$UBR8QzvjANA>Y~ zUTM4RF;AD}_6o$rh3a!4A6FUp=F#TN+Mj+WcK19msv6&ImUu}{6Y-=BZ9q;=Gom>a zS>0Bd;+khC>{&WwX%#VD?O}afEyYR*I#m5O4W!p8Mp}reK7%?Le<)*;GeuYpH`A1> zZgDAF1fR&GXo|MgmMo#4I(luiFK0+rZs2TiS?0VpYh<+ibQidgDgAlIj4tI1=P#1Y zBK`_z%F1cfTR@%>SOfL2u^QYKT7QiDKt2!{5g36PmbHIP+pX-?k3%S5vW<``kC)@b zm=dUvkqI}9(-WWVv za1fiqfl81KS(Zwo4XKV&gU#fK1e;w~Hs%rFS*k0+;(z zuQ)cm;PZTZ{69)^Aj4N6_HN=bFmSqGK77c6sR|Z$-LO_U8QsvYC8(zYOB87b2?O9b zKNvFyz>$=MAbe3WBQs}NT2FL001mF}0A|ykHR&?HTR) zzborzgc7D4$VDcg-wKI_gb#?*feDZrXQN8bWa}Yqrxo-msx;eeQPn`!$-k-@=UZ?U z74ntys!6taB0OskN{qIzG-;0VmKEdQsWWcycE4NYvmyf)aKrE$Z70e~m*lOfo9o=P zI?GF%*I&}LwO*^<7uI+UiSk>PL{1SpHeTjl5^I`z>XGNwmRgrk7QnoAL}l_zQl}KI zE%J?u?)6{Y!XwYP`C>cP;oN9Xey7!sE86o7VJ{4;w}`%%qT=krqn9Q}aJx`aJY zXGt_>Ym*MBt}PDpuVaZdLGEcgRy4ewIM?Qg%X4qSzPht>^q8G(Ypl{{_2B^?kKNbS z0;P4^Gfvi%w#iMIXfHeZN9Cd(?~HYj#kT%GH!l2=P!)_AH=q=7j%J2`vHQlRO#}W| zpH}2iy2PbcRr^tzwnL-AwRZ1Be{{ZEIrAcg4YDltD4pV3t1A8|y$G>HAEkLZG^}d8 zp{ZDZ9U>iZZFKdUipjT#OiS*W7;~uGJaH9p4E50}GJW!I&wBt?5EzW;J2R?HQaclD z4G4||eSao0JPD0QEhqtgBj^l2ih06^%O;GXt7@s5=_zR}nCc}k-)L!YpvP#HW=5DX zs4%V&Q%2B>@ugN(4lUZ0@rB239Q@a!IKX$DBX&nRGGfa8$eQS@YI_Y^-^G>+vXp>9 zWgZPsB;6m{w>F*?tGr9NH|d8?^|cb)G*T%p zQfAQ}$8H9@m9;kMTSvPSXMDFQKqk?j)GKKctm&jTw%E0x6i-xN%m49_S*R!y{^2uI9#Ew=S#F2}Q5&U}vtw=AWg4plwrh!bg7 z$`oZHHA(3?Kjsv(Ja^2L#cOnF_2tS_Db4*VC&Vo}?c?GqS^6ZK%2Kr?2uj2coYQnG zELQFLGG0fc2#;jRs}PT%`}MCUP^oFKSUU7AL=l*^0w&UiC_K>AFd{?(MsQZltHHnV zv?kad!o5Olo&V$3lSG%>8y9;}{APdZ{4ACJY!-7`$Y(-e%BuW?X&*y3)WaZD(ye*$ z^uFU~=gFzl`9r6Zhrhvmv5~*Q_ypH^Kbd!k+?ZyVoV}Wb(ux@+eb$h~jbf%GVin!2 zQXs@8_Yh;Fr=>Jvr|v1%`%NVIiiwxf(^YesnNmZN26xei;ZYg-IpQs34&tw6ven^h z(JAcL583A9t8gwAcbwF8uusjNDq@@}%4}BIm9A|YGd*ca3JflFFjct<5Cs~_WcOv; zexKrmG0)PTb1Kh>wM8?}9Jh6#^-|EAwZT3$s0oxgt4doo5*f zi@B!LMmpZLzC!D3o)5tbIQ$xdROeq~drOzodBBkx)d1rb6T=on2O*4&+NjNqNY_Pc z4pi%Gx>fUJyl7}7Eje{#-E?~A-wLu~+28f;DExHwwtP7L)KY)K->DqBhSV$kH*p4Yt(lJUDi7%@ql?;E-B8fg z0s|l_vtB)2baIg&5T|_u*8Wv(Xw4jKhg&F}{wi8PDp42uD?dS<_Tb5*lHs!Db7%8l zRty4Du%whb3TZbHt3A~u>4xKb=bAXQojAO#D-#_=C4T(Q8Z;~*QFo8F9Cb>1nDClc zN*XOI1peZ`^eK1fXCWx&k#GN@A;^q^?L>lNy_&>y**VwH#W3B;A*x=8xvI!%vbmti zNhR|kXGf{iL%#J};J#)FOj4~+O1!$NKC^vv~!6L}(R zHDnxWQXWemshZ7lyA{$%6N_9)MQ}0?X9q|@=w~>8iA%Qazxb=zYzg)87+oDML7mR= zf?yzG?` zGNoeg?YNM5_xX%gQluGx{;3+l=9U)aOyA2J!AkH|s%X`%dSffQxJiO>|QK@{updy(;A z#1UIcyH=mEbW9?l1&awo4iL9&w7Dt{_H;z+iZW4ZRX=XVVu`M2Oty5|NJexz0v>>& z>?0bVbB;v?pG9cFHIZ$_S9Pr=7doTsC(D?MC>$evYS0YbcNLYzwG_5|zwWDX_tE+A9w zV9QHr`+01j)M6Son6f)=zty@{_u93)!|i zs?DC~;bzne?3GcWZLeuhZv0|kz4P=7lXyeHdZf@h;mQ5GRMxqi!*na*SyVn*o2eB^g7vSz(RI;cIT6c5yrl;J)~lgsqD*yF zmDBhX(gJE3?r%226rIN&m`AUblMV}EoVTVe>XNLM)OsXx?Af2~?#mweGi2p4t7!j| zBgi1)uI>+Qai+U&iBw6Zyxl@X%+ewQvE zY~zGzmdC%_e*;xC>h5TMNtHtG0lDW3%SR5t)e{Ne&dW;xnBZRR&ItHWqd)v1Exv@E z8pgK7Y0XE;w^ujF2SwfY9+Hi!B_EXZt3@TVWXLtySSj=GCr!?up(4bxpd^V5d6+nw z@#Ae56TYR@;|c7l8QMLyvx_@Jgr#-bQeE?W_VAk=(kWD{BShy=CGtajb4-96h% zsyM2#1F!;PHQAJSZ|>TzM_dfL!95*)*p}mREy|P*#*^ZgEn1kjf|gSn)-;y;dZK40 z*J4+=zXX5E<29gdZ=0X8y>Dfm710+=ViP0Fw<-OkAx+0+kXPC1qh zo)!8cG=@9w>zFY^kO7Gr;~v;2{P5GVhN|vkGrtx{QT1)5{~OyW7LPR3UdJNm8 zV`0cJX<;5snbYW#ip_E}DceO}ZfPUeNP#NGafldGANh)-(aW>gCtsHLJjh#mi$MH! z*L(S~Ms$Ybx0bm2?@Qg+mFuf|jBOzGfQrJOQXmwCF2+MXaB=8l;6tCQl0a`#{}uh= zr3nWAD-s9xEa>#@T?qbl>tD;*sMDF6YW#7RF|SsRrvjGtpDqnzmxEjVS?#`m?Oh?4 zcQ4HeL0o9G-zAGQc0FR(Zo*dR5Q{vlivfw~Ibqq*;rJ!&X72$!O?llbKfLSn9J~Fs z!)T^n#&`#g9=t0<##Trl)UmuPuT5AB87D`Ys~GVb*W7p{Dp$`^%<46?W0Wjo^`a_P z+TDoN8VTxfG@`Cge~vY$t&h`A`wjRdp0KCti6EV+Jvc9n_|57oOrCSuKB%7cuIe1K zNwi)n>3Da(L+Sm#Y4y*tFbH z-PFiVjkVP(T?c7`5!SiVnya4qpH_2&&b4e!Lv10b?_TaK)=kpN3TIUhh{y6l8GY@o zf&jWa1yY)M!S8@BvOw?#8sM`}C|TzwdVd;38ozSQsyNcpQ83J4%= zhWcfTs!Xuc&Q!o+!iwC0OA-TR^5Sg{+x0i)3@c%M`JCW-W-8d^o;@MkI%W->yaRcy ziuX=a<)~h83Hd;d^)yDqg1rz87Bz=%$POYveTC$gaM<|T` zEj^<(jv$rhm?x0Tru!lu_^uo#fC7$mgDd7t73e0(XSuj%?*#< zvWTqrf3m;N!4>Jb(nSyS7ueoPW$0yAgyN5_Ig=6k)x9DrDDLiM;9)SU0)7N5X+M*s z1^c_l4Zb4?9=E#=Y;?Tf{pD>fjp?nufAoaKy{CD4-qdow6I*JH-NPJ*+8&?*ht2OJ zmQEzQ?=H#iow2QDI<{`D)fm`R!%aJ3?@)}d*uQI@nSSooJ*7(jt7<`96yDjA9sF4Y*@QEf-jss~iNbaC zrXp-vA8mf@)PLsxx&9n1Whdj*L#?M38!R1JJv}R_nL3<0T#z$nIzf)v!01}$PQlIM zGz?Lhu9h@!7#ueq7FRzeugc#q-A+D(v;qp^&gafPn>VoE9hWQdqMVnqkx?ZKHzUqU z-rY7fkx^SEtdSHg3flb^6V%OtB{5^J;Au9?EB?wR@$%&Q81JW3=uiHo6;@mP{ZIfm zX2~=(J7W4JwXXlPVtvxpdZ*RsjWW#PP>iU7&WOoC`*?(7_8p59UvZ*$I=|Br`A#<6 z$+F@j7jWm!v)q+>eW03&xhTC@l#teqIoilK|Ck{dX0=z0ToK%L*hGOBPl{3I1~npv zijMlzcB3&t%i}}b-z>WP<551*v7y4D!RnvMB51TCI7tnKx)R8(#Tb^fc*Ct#9gwsb z$*m zBCC3=>783yR}$k+_l>^KxRP!$Y!l;*8)Z|@pO(g1H?<~hB+gHQYot~yY2SlxiJE`v z2C2->m3;g1cCM`(lY$3=?QyR{G$>A|FD5klcw>E=t^Qb+Jmjq}RHuSf%YK6iIN{I} zuPH{9k`N^uuf!#vu5S^C^~Q*+p^=mI0>2jNhZ4=9)oxOwYknbqHWjmZ`k)xb%O> zYvM0@bniyxFR{V7mYsPE8*=mkV>d;rjQ`?*!MTGeZ@CM z*o6Tdv7`^-0yYA1;pE|ea2mIqW4c1$bB~>PPjfSzsMh2DIFSyGQ#!$|cc(Z}QjX#5 zN2y8^rw!9e^oa1k+ zN0(Ag{?v_H$J10;FWg)eaY#PKiZFWe0v7m_1;a;3ye7%B_DF0UxWSN?3q<3d>*RW{ z$MTB(n;|F*XeQU#zS_^gDVe!DNqZo0Kz^Wd;EdTm^vq?~UHIC(^jv@G=*V>U5JhO)0 zpeV`@D!K(av4u7eB+s)ZGXsX`u|%KYlZ$c3h!vx8#{?C>uqMCfhZxc11);|l5dKHW z6neu$b8SwW8;iF5&;ZCWWjOM~e!mmHn&Y^uXyOlP(A`y!2sSwl3xBsr@9`;I;K zF7LL=lZkCkgylPl*8bZ_S#RS8#3hdRGQoRA8FcIZ61x+B345l1}Cyn+>&DiCRX{BT5+4_Rlofd$$ zgNCPCQ9a|98?MNYvgc4gBR51w;nrLKchEeo(uqHlq+*;~+L9QK6wGb{<*yNRhA4)9 zFI;!hhHu{FLKZ9y-@<+ma)C_X9&V?>!%7_XW8dHT$1$4nOg-^QN1~_TDE7YLkHEdT zwto9yMo~P>cvmLQpZf1C)F;4ih}*d)p=)52#Uj10`P`vK4KH)aYv(HYJ@eJEd#>&>f%0SxoY|72t${J_w zk4yXJe>3X+5%TlV*Js@C&$!>7 zalbs{hIX^Tdz&&mjB%f(oYrfAjB7Uny4j$-_j~I!sBZM}M7Y+C&+0iAiOu7REZc(L zwjQb$pZZk)i|-8<)hq#A@JO+e3hJ-u@g*=9ZpoD~=z-)yH4}|?32oo6y3w|Z%EfAd`vn{eUpB3(#=iu$?ec)pBZRtSkXgZd)B^|bD*&OinP=by2*7V%W z_ts<{jP`hyYIjwz|-_Xz0&pfqm9S@lT zTJ;AY9(x3S0dWC|1Caxz3AqWu1>ObW4jvOW6s86#8buaS7H$K-jov}Q(9Td~JE8BU zk3A3&=o)w*xctQ)8jN&?c!qq2LJ04J!;OXrlN2;6!lx;ij#q_Wg*Ab|iOh-8g4}}O z_8lAA8#*fZZ?JJNMzBgSdyqS{IqV@c4s;rH-uIgCHE=Zuc8GRxc1U&zez+SL{J8v> z{OAmDN;HDWgifNC1!s!)igx9{%RS5G%6-de7U)$8@$vDo@NqIxJ7_r=UA&KKX3l21 zW(sE-Af;_;1+E1#1&jsN1-1n!qMf3zq6Q&7@V+>7a4Ot{^6*g(R^05mfNX*(6fUGz z_*Mk>?>K+FLtg*DhDnAFhf;^w!*AjD(DPGw{pezN6Y~)Fkn_;SeTM^$QJnLXU51h>4j*%V1yI=*zk4QXt}|5nyAu=66W?i zNAhyPLJ`fCq*8zqrXeOYt~iv$|J0`<8sSUm4;uKl|FgUuR~W??;(ZaM(3mmR`+9e( z#PpK~YTuUzr*P@MTrIo|;aW;a??_1Rf0_$vF4N%rACHb1|BmoOI}h)0QfvZAgS zox?S#O0qFh-tPAz|3^7s)vf7xBO<*m^BnCo{L?bl`Wh@EV#Xl3^}fa}%np8v+ad^(v2lMnuHfgr%E zds9*g9C$OW`|$e%#szNb0m?K}K`UlU;;DBtEU#$u^TGe5<#p${=VRViB;!CueYX|u z!~XG~`QHDQ-Zz?QsEe{AooJ-H$zT4>`_kA)eh5PEe@Tu~1jjgGj~%wV+M#sci`JGd zlXTxnGQZEt_}|Sz)ZwyU-C2db3L@>8`$aUD53U-Uop$np?T(8zSZ{2S{}o$uFpJ0J^ZE>s*sfWi_qEsfbqnMTPwZYa8|S;rSujBevti; zazY>d^5qLzLqK>y_yEj`>F-r&DKavtZ`cGFcP_zgxTs2nMtu(1?uVpQV#y}*zm!oh z{M34ZdggFmWqx^re*Cv*Isk!9$kFUIG^X7?>DdAhC8AHee(4v-%L+%ITDIvpa2n|{ z57gd{$1H-1_E-f2nW?hSE?@3Fs*uFG!M5+~Yx3Y0eUY6x zzfzod3Z)5Jh34L{5eY^OnN`#ZNwy}it8!qB zYG(LmF!i2QGJ->@c;G8wNJT}0a!*=tT+K37+8pRoFKw>rRIC4cRQ&_K{$k(gnZEAg z2~$B1FD0J-nL(pOi!P^RZip_2RC)6xD)A)~k4~>}?#b3d{WqsDjj;vjY9O^gl#5i zRMWaI;#5`%5!xn&*clbrT1RN6q|`b?46d9b1MOT0 zC8h;U4B2=MbzlZpvk}nT>d0tG9?4lWC{6D%dG~TjBs{U3S zfzl!i|l8_-Uid}|jilKdk@!N0^hA>Vx!Wg?u4R7OK z#s3i}v(acW(fygA{5w_}Uqoq=;JI5xFJkFwQ9Dv@?Ck$KwsjR#bIYWsRZ0$lbGNF; zo)s?bv2aH*vMjrv?XAOw$i}k@_)#AV+zDCX&s0V|5$X1XUa-3?TikbLH?!np8Ulqr zvKhcqo4!t^lTGyEYhtCI6SSD&x!uLNT~^c5%m%1S381@7JSdI0HkCobE#T2I-w7r~vPlAy_0!y{B>}B!?}ifv)AC%E&=Vfhe4!LzsaXXu<4D1@Krddh zl|QsZZ4T)=ru;+opFx9=TGflnP{}*cXfcnD>0ALT?V&7E&A&qP{{I%~BOeQNi+K=& z);#T!7nMrs*Z*%qKGT#Fg=*z@pjw4cv-Evg@v5&<;+XiGEv}x>ywb7RP))f+w3M@?x3sw=0Lh+a zG_QJXIMqF*O)w9xS!*@_LUOHDRC863eA5$tKcTtooe>*FzBu_M-9&as2xzLM{?5^wS46BVZFLh=i+zC4`eUYR?KvHbNZ?u7|l4;pSAVyFTcDe1Pbk_CopbswBGD^rS2Y* z9C{CJW*gHa{m^rtthKz}2Fp^SLkJDld2YDj#?4;=++vJU?z2?mWqUBd#4(^##SdQPQ8!glsaHkiT#6P| z_8PL1`UtWtzj;3lJrlOXXsX>2F-I)6gbCGzq|^i~xXTOb8$RvI6MP9IzQmg1w5L=0 z*!F@wuYYd(1DykjWrEGOCX9FzQ3!|mATDZ~(I4n>wW=KgzoP|+Ar#Hvn337PE*m^| z>n+KtOLjC?Iy5aFG%c(OHYKGy;-k;fvKF*G^v`k-ocR77?P|VJRh>Vx<$s+iC*2jm zxmUake3eb$Ye)!?K#-*7;qT@BWDJH5S*vmV$R=eCnMTD%u+fRO(h^9er#*J3Gs)XH zePn1EeOeAvr3`3Wb*)#qm`e?0i$47>5y1t*-;MS$?ou+u z#K(w^!1V=(p$SXv9gHv}hOq9BC*_g7X+#K_*5oLlgV5MS4H3{u4)tRtXolxfjWIyG zt7F$t0%~#E9%egU*NLpQht#ri=*XjK{GkXKrPK(uJGCLdET1UE7s~b)1^+Qn)qePS zHrX?3B7)0W>waz`h_CXR|Va=k9 zf!>1oHSe2-E5LMulgCX|$F=Dmqk5+yG)zhUcV8K;ijhr+iC~rDFv2E@ z<7MO+gk|Xe3`}6WWkB*#OI%KMM#nIVpBb6?wYv7F!Q}j>XQ3oNQ!;aG@YjN`#k%Q# z@MuYDXs4)dc>b7C0DK}WklsD0n33wI>ByMA4qMxw!3b2 zxGhKwl{Fo2Rf6+hxTS@W&vyicU2(@)nf_mmPIs%Ng=$xSVl}O+B*nZKazn!^IjD2B zMa4THz5@N6$*)$1*><$XPkOs3jt1BzuU$)?)o%LV`5Al`ZUQ@~wE zk4#dn3~@qsLUu}ao^CvUV6LR~%&n!ZcACC0!Hh%`oUOdhoO%<$R%U%Zwh80>XXkvu zofmJS*&HEnXlx0z%a`sz@Gtwq))^ib;_eux;wYfpWxo5Y_YoU@5wV_##+;FtkZ*iV zsr6Bj3(=-9*X-~y_6r9DXGq~w;#2-pALB< zzkW91S4#{u@m9-|HBnVdA!}h%isBONTm{>oF6QzL>=9-vTR-BQ3+wr1K%p_?Kj)v=b4U4tE>*UE>^2v7kxJ}xb2~S;=SnA zMNCtEqiZ93EbmPFV$aA8C5xdJq9I!39F7NaYsnNZe`tk@--Lbk*VF9d=ouYh<{MPN z36fcre0`hP40dDa|~i>bsDqbX7clO`zWX){%MfYNh3H~4};D`i{VzfrD7 z=PsTwGxwY?hJcbXL3|aa#m1qIUW(6If>Xvjb)(oRqqY4Pte5}Z>3r+_x^t@!OOR!A z=mdq%>F*yJnCnv;YSqhnl(|xTBa{_BPkiPoE6a6Om-iuSC~3YCwmg5wh04xkY@An@ z)ylk|Ntj;Iy@6-eH2Ol_y&uIIp&q7r|5DsL(musjHMF;j(_H5&y;jrKdOUpVVSbB< zc1M84zRxM!(`uhZ-9?2U+1|Gl>YWz4qn&G`bcb0iza06BbuMXK(yuks-_whCa{eNr zSZgMIK~1cPn~_BA6_h3spS!Dn(Nt!=uUM%3E|-(a8>1?nlhcv@P5FGGq*(gI7f2vA zxiATwj!y+bK&iym%7~=|g3hL&++Q{emBt7V!?ag0hY-= z&+9LM9S@6J`jr!n>l*{n9T~mUj>PzdY9MnWJaFp?FbMg!NDE6KE`GsS?Bw*&5c*(h z|9RXjrq)Dqg!GM=)GHsy$y!YwWe<9Z;sNf<=3tYZlVz1Lg;bIfK)QAb{jq_#T&q69 zP_K@3<%N>;;iBBb4!-sz;=j-JY0a1UU z6elh8Ee2LbkaT-%KesMcvajqW^Qu4n;dMiH!FD}EI}&*-x5qz$G-jXf znK8;CSeB}*RRS01@vRw~TePXGJ0YYpWk_?OmgLQ|YuvVloN`&f$$4x`cZ=~RthM(w zeB17akQTM|((dB!iu1V#t4r&=NbuzH+G9se+A@$B%@@ZrOxd>^SXb3;0q2zrE=mR- zp6uRBnO-Pq1BJ?K7r9cwC6J$e0(V;98WIS}3AK+@kE%i6u#cM0qOYqDlJBH%wJ(vc zo^Q89-kjpreUHsX8OIRUU#{WSKJ(X$YtJ5|Evqf#p2?mvU*@Ne%u+z<_6OlkQSiVZ)fO!rCbNQf^i1@0P`Aj zZ0PTR>H*-!CH$iQ75Qse@N(dCFnJ#$3&zBk#{OADWNw&=ufsvlhEST{<^Q7&;tELW z2X1p*NnBAmz;I(^Lr=jR2Hf_q_d##}{NMjECK!8ITL(A~SPzsoOkEgWLqr!56kX(+ z|1P05f`+!~uKcc`u0*a#9RN=(Z7@FHbP)vM1z~EwE(a6z#cWeKus?A>eQSgELHB|8 z!S{jLfET2fir#}SETJrPMLT!QchBbn;vCVh#UXro|N1T!+?U^nI>+K5XNYTwk4uaz zk_pT9Wwlt%(B(&16H+u>H03#j$H>RYG5?3d*JI3d!gSdV=u#Lvip{TF&}Q+uff<1r zdkuY6eS~v-EJ6;j?PQR6C?y^t4KlwBTX=M>I^UD)l~Dg~zkSdaOfP~T$s4H$*^}{A z(e`k^LQo!z5CWuE7Wa+JgT|xHWi4TQcDw$G;}pHJa&hv+PS5JT&P%(yYJAUr)zmL3 z9j{C7ok~e9rIosktBtu$$m7S8-BtJYYd=a52}~=j0rJK79&{hTllIm9HbH+*KbK6| zIeZV+22q|F1cOQIyc$_u^3s-Brg7g=+gth7{|x7h@-j(b^!E+mnfURKBIF6y zY^BXu-P6StazrZ72D^c9@%1qnw$Hu)vG1`Tr4Ob5e0zKw`3mbw?Fw+^dWGab{d6$R z)QRAOu;Ke+THRvES0}Inb@p8!(d`Rgu>WAL+=DMN@weXpPy)mH$+wlRaGxljQcN5O z(@|n!5&C{QeBnmxg3A6T|FLR%7~tIRS!S?Q0jvMt5-dRgQon?uaUI;s-Qi=^(=9OF z%q#p`*!P#9zu%IAmd8GkVZ*{LDY#|3=Eokcqd#sQx%X<6dGum2uVj3A$Th&N=G%hO z{a@OXyDnv})E#=#W4&JyH%Mt|4*NG9f?9)aM@Q>T_iJ;ob`n;{k}C;{)ACzG06xhk-&s=;&i8a)Y&h* z@djJ`TwRvsdd+yBggQt$5WcOjkZ#g#@@e|X0m#Iz#x0qZo)zZ6 zMH2rkrODCGh(qB{i$MN5eTxX`MywFZy)}-K4r|FNSk)BLU$23(Z4HZ|` z&wI?Tn0A?-ae_I)tPdjzvoY_GjE3H>zHy0To{~)!+XWXf3o!>Vn>qmsfpxTGbTg<3 zWDMdp?ym1&v9Mv|B#0wWz}1PSjwy>Si!qO`26=;CL9n1OP$NhZ0=rKQDq|xHbewq_ z;HHq&;EKf`j%JRjjjoM3j6SS(uM)s@zpoWaZI#eYFyR5g0jaXlw+iYpir!zM-Bn*| zq_?8V)O}v2V@9hj$47Xc?EeWnLT5>q#`6qP5o^hDCgF@A-ylDy`_S(F!qA8Z3@sY# zIPR|~=mKJ~HKN&@#htqBv|z@hIKk2*m+~XMIq_Rb@mpE(TWRrIdGSK=@t;3PKY#!H zC<=KShI>{(zsaN86OtM6&y5#KkN+ei^`{~A=O*>1Aob@U^=BacH2wKe8S=I)v|k6J#w1}p6PrugO0 zp{TtiNDHYSQ`5bxmgE8NoKuKZk8$V(is$~)2^7v1(Fv5!F{{0#NcS>1Z#*$H>s?=l zWb-$4mHN`e4s3O8HS1O@W|dCPVOzLcuvTm86xlB1F11*$H|MPB&xSIFFOxMXmPDy~ z)k}I))libdu_;qViHm!cLh%25z53xQ)+$Tzx@V@q(!Y|SWk2*qj_=q z{4IiUU713Z4hO0L)-q(_Sp#VFLxbhc*aSmPzf1>-Dk52jr^KrYtZ-dxcqMWw`ystn z37Jp+m(RF?HP{mQl`*sXCx$NV9k_Zm#1d(p0rvYkQobK#{s|o0wO1OyM0=tx$zpcg zVYO#z+?XmsQ^t#0Na{&B(^mCsY#*qV!%T+v`nZKJRJMks`jTYl8jhV zLvCX(PIGdR$B6b4_3vFO<50&&*7>%fbVxMe0M|Lj6I2cI+2u42te?>|!NiMV)U2zeK4S8W$Cc+EfWanE@SqP~iFgAt5?G)zCK3dU@Wl-*`MA^NfBjauLG zb}`isGjHE}eg(&K?ZkLufRnj)Cp{6si3TG&*HIqU^*#Q0%y^%iEd3O_IUu#gOd-B>@d_%V{$U9c)>mI8hXKHd?4%JY7%U2%3X+7GYa zB6pGZrn~PzIC1>oF2_2rFW!{F!H;|0Po`a5y?>^68lMRT)24S@Z=T;cdjgpEqCC(H zCTf%FrT!o4zB(%IWm_`|1b2c52oT(YOOW91?(PnaTY$!C+=2!tcyM=jcZbGZg2Qy~ zIrpu3Yu3EEbN{&OoK@Yw{%Y^4UAuRE-PKZZC!W#4;*LGGlXGj1ml_|n;qFC8+;@5B zrrVA<;*I??dsh5Tc%~fxo6fIkyIpp@&eIPCk#6+-Epcl-r#m;%aeevYHCx*R6h?A2 zCdcZYvjV+)hUw~Nvw=FDjg__~pPS;Z^?5ZIUGNU+HFGEEf+0It)5-Nh{!6juq16wx zev{g7s~}a zW*T7P*;i)JHD6=R*%YZWCR!0g7chXUcR62b&DSJT>t&5jYZ$(8JZvg8Pk1Ejg43iW z8WDd!3t3!Rf$Q|GFR=>iNVhh2r7vuO#)aSWD{nthY)tz+{x3K!+8n>1&ept3?d+8@ z)-0ZBydAX_lp<31te!zOCS#Sm^OukhvmCXcr}UQo=Z@!r=N{eIiO%^UYgkVaQ6!`C zDvo*CUldC{tA2EXW_M1H?$2*t2-bRE7#8<^&wMX@&y#N3?p&Uk z*GLwR)b6Yvou6UW2G-u$+-P}m_@=gX-JG>}5wF>K>wBAf8+%)Nn|j-NTN6Tl32CiB z(FiUjgZ%TAe4Tfla9wjve6iG*=k1SlPi)P3-Sh&sQ}rosbB`+Gb&x*_jHQ3MCPU3! z*?A$Z<$B)!{vJyJbtlNu4`&l6T~i#>2UF%&`x770sYUM|{gbx{;7&98*1Y+GZzw)? zg7hpk_mLHWUCl`ni#W(!HP$wR3EDB`_JVv#+fD zYuaJ-g(}eJajoC5L!}1LwJwBzR(Bu0a)D|J;O)@Ww>xvJU`$5&1@#aB)lS>t zx304O;mp$h6DRb0gx_Cw%HIZW-92utbF9~`yRP4?!=H%_P`zf8hxOLSNT$2%>u!9A z`)t!?K_I(izZf*do>se2ja*>E`PUYirSp|ep`^L2S3?yLavrx^z{-BMU-bKHi=1Zn zr?`(hEpTL;>=y&47}8uesu2rxIRDzBe}tMS?bmuWYymIlafbz}tf&2Az|>z_UpRm_+M`rp*#bU0=(O4 z+gtUy=TVPPQC^ip!}^B^zVB%TB|`lS&YAC0INC7B58-{^Llmj{=4WQk{MZCqNXt`j zMEQ-G>tCI$|HtcUl-pagz{s8(=I?p&ji16r za#(3?&4w$6pARYijKHN)e>Dny*^yjy2-8dp&1+9u|3*8q0b#mPyC$Nz)($?O4@nl5 zxRX+8<`K`bHP-chE+4JpJ_a5tR*jBgJ~rhDPSm@wcMp_;GbGq8!^5pULX0-V z8!yq@<<3^w0zWea(bTW1y=NT>Pwll;zk*eNM=X~m^6#6v5Xx+H0Nb`cGM6JVX$u2S zO0>PLo4>t|D3K)Asv231_!H0!>tW#h80<=44;>F4RRNE(onmN*jNxov2HtvQ-Fsy{ zYUf^dA__}{cd~EtKa$-1dg13c47X2vw-G|$iLM1CtA!J@Mvt5)t!B8;A=&f8?7&)g z99H>03obI*q~5d)zcR4rzD48vRON$W0fP&sW~$W%sl%tu$S*lL4NYv)nQJ&L_?)}3fBbH?WU+RVjNPYi zWpf;1*})YjR5+3V+=EVgiehEXYcw#CqF1GhDOS=fCjI`WrV5sm>nl<&lUQx$3~AD- z1OoEDgMAOyP83H$sY%6}uMvW{i&0Na#1F3g8R!d9r*8b3rBCy)4+iZ%)*U|QEBD)v z2Ramc{!w3}{8&2rm>4%>f+J~6zbbWj*~8;PA$~!PCnr=PClrwoQs zQi|<;%!0}y+tlL2o;?Q)QomrKG;#jY(a8UFg_El1l+Lv0_ccR~x1BFg+>^W_JOLBMSci|IqTf+{ z1C|vP5YKgUFLYi*x=#QWz@+wihubet?gM2KUsfWYU*5SEXkB>xwGO0P2m6)TLXs%w zQhy|lDO*LAOEJX#NYp5jq}9N1GBECp>RF9p3MAdI>*7Zvdo&UzOMEYqq8yVWz9rFE zw)tM+7ZQiadycAZF591B>=aR{lmmzb+OS^5nlrbT;Db@q2}QL;`i6Draj3okDa;F^ z3DSfZEw@2t22Pwb`cwXhK1?xg-MmOiBbo#$_D)UwAI-3lut^l#CIg`8Kg-3Fb143A zx3DC-opRDso(R@R0O`imssodT53N5t)tDoP;UFm4F(-|5k~+r1kba7c1tW7Jv;=F{ z?e1~jDD=i#cy@@TjR`ArKL*rWotcP6f8arPzL)usa&q*9XLdSvTl|#a_3JsJ>c;Hx zZMsYU!UN0bYUVjVH~oEdN8BcPI)05os}~Ur@0`?jP53&%9t!dUG`&Z2QnJx>leGQ2 zWW>=|bAB4@%J$faL!aytPqRagiB9lODDQh5n~x;j-cWuq&OLD}`5L<>wb}Nt7n5)? zsEpB4op9knaLT^E@?vm0YV=fs=oQ63W@ks8_h>$J`2e5yZtoqmW-ciX8m_VY>z_(l z?+URRx=->RT2CMDc~(4IA8r6^bxc9HMiESqQzvnSnzgqe*a5fCVbHK)?2>Oc_OP4Z z)-io~b-6tB^qG^3x8QMf*UO#Ik#kLA#W&%c_6F_z@IqTR@x@W}hOJ>&dyVX_?|@kA zrC$zuK56KT|9L5P;$?$2QE)BKr|z9z)vk`T+W0vDgICfX8iH|GfV3e7id;S-qJs+VvOk{8= z>hb+P+*6SE)mrlQiPyE(MEb$`rN4Jk&NB3dd;sBb)XkVEN{PXb|So}$iCk4KFlqP^E5YwW>Q@oyU-~&Jvt*|;_xxZPJtX-cD?}GHO5W7zP9j} zGqbu2WU3Y2#$wi^9M8K9THdu1EK1`l-L&Wt!8MR+)FyD4f9(RZa-o=$By|oOqH=W* z+{yI2gI{QFv{xQ|Du=ef2?BSCrRb_UE=nRK%z<|ExP9>gkxzWH5{{&>pP@& z-8)KSC;i{G>wecR{at(Y5lGi6#QXBTwE$A0XY6%D9ar@q2yd3o2c_S8xV-2(s(Z$@ZI`kHt@nZ0-V^r@a~=%JSbzX$L`Uevzy@ z@aDsMs!{l9fSpg?E#K`<@klwulF#5arSYMogJA6{K zwE;wzvkA2BgQyrF5pB{=i$0cwc(beQBN${7_%}^Yl=Q{#65>h+W~n46w~4ds*>auD zt~g%WR;;4q>zx~hONX#*b;=wM9YI=21j~)f0a{6(j)xa)%Z*<2bqqHSbq&sUMi32zZjoVDD@69Iu+v*3pYXLrsz2H!BPB;xH^aB#izoq?^6Pdp?G(NaRPERedcko!AG zsSK^8Oo$g|5V3}>&hwi(2L8U%Aw5V%bV!LCh}l@Jq&7&SV@`(`h>$GA>~HM^M62j< z==j;!cB#h2$EEu4_z};RV-aHfWMVXP!)5HZ(6i>!tlrz^vv1H+%hKJ#L~B_(|JX6# z@uRz~-rA^Kv`bYw|I*z{S7qnlG(9^dUMHQhQHj)v&5<*lOPD$C<>*C`Q^qO{eA{%s zn4=frjnf&(cyv9H`USSjBa2ZWp9qaS7?{{LpB9g#?8_k<7}z#`PAQ0+nqV7f*w&t= zZAjJ*yWlsN?qAazql(nBF*VtNidmct^9)EmE zYYV2jOWM}ExVbJLXxlm6Sc~-?TH9%(e93tEwkER*DjIkgcu=6fQ+lQ>tlLzjKA0$~ zEt+5}^(aQaw!F61!32+)#cwm7t{f~KWWJy;mZoY!X+mk$ff>swPd}b+pKi5mw>)}# zMSDfJMWJdbDBC7zB@`|e)mYvw9Zwu6JnAI%?qp8Dk`fYz$qMggmy4}Mv|@Vm-z!{A z?H%tWP1t3-X7h^@cjwik-$Xw29=qxDaJGJa7Jk%!G=DUH1n`g&VMT@Nh4=L-ZE2kQ zyJ<92tiC%9x#=eS35x12*hD<%*tF|e1Nox8aQe_byFV7+)}5bj4V@<_=1o^k7fiPS zlq}>e#P?Sx&nAWP`lRF%GU!2cAchlaiBX)J_;HwH0nbU@E6v4J$V{gKnZ=}EIUJL~ zTJzLZY1nbCy)PcLkS%a!VW&LzS^!jpqNh1GQyW)tS4vj`_n*9hkeMJknR$>i-p0-L zovy+GAD=M1Gg`lhP2lXC-(z@xYZdGpXPo+ZMSG=kuX3+BF>7+q;2qT}$NybzFIZ#= z9b^%jXc4FyF3Q1bHIkt)eKga|P~;dOjd~K&iHzOh z9eK!By?oxG%z3?h=1A+>wA@?D;A)>av}PYSl)k)ialX^PV>Q8BI#i09EvBWmIJ3v1 z_LQ&0o?f{hFH>O6Z8AljD!Tv}{A-I?t?wCaxs9gqQb*?jz4?< zm(BdQso2(<6&4+TaR8Kg>5-9Qr(dWxo{Ig8gU7a-{hxZ_LBctb1x37veng>)+|xmEQY@7t=)Iqz@FT0MWeeCHWV-ej=YnCIEa%U*IkK-Zuj3tJ>7emFUVv9Ec%c{5vy#OiO82H!X00K5&9Tc2dN#M$w~L5NfQ7U zquzv~yIQUEstS+p$QB!bUZ?M{eD@qi*NiNREW7?Z?s4Ez@5Ge~MBk#DqMo9fqNJ&;si3L0 zs3S4t@2tQBU_7upm>jGEMh4q}b-++2I(*7}3VdqM9(SqW z)A%;MXN9{0aNSTF-An$X>|GQXl_pOzXR>LsZn6xi1gUIU=S~>hF_@D;Nh_x&sw}F~ ztE^ibQ7&CNTtrt$S6uSLy6C9z=m$XA8Y~W01`C1-66{o3weAGKeF=3m{N;~D7fXYu zv`MsTMG2N;mYJ3>2Qo7PGbA&f#a+dyD#Yb{D&Do+mE4Wowf7#*hR&MKvd#+5BF;L_ zQf#Fs#e+rVM8z3Dbc_%1!gBd6xb1ItDKm*Obpt%$ZK_%p^{$&ah9{&bZ8=OaqSPkA;u5j}L3? zW?PjWe2&FxGG|xIo+^K(E`F}zpXDn|Iskc`daQXg@m28E`?x+~Uc(+n&1RPH>kumt zs}L*smh!do)$kR!es3*l&2RnDn$udas!(@LcCB=ccx^Y`rt)I@1ba<9w^sDh{9Jr* zci2|0SEgs7jL%EpjsHZz!3M(?#Cl?bWXCh@)_ktKwb0w&yVpD4dk6{zS%A1eA|Nb~ zGl(8k{j;2epw*$oA>ZN0x#`vt=#`e5gHoz=xIul zC9W>miGh(AT>%7=fBY9j+p-=wPn<2OmH%3KKOi!s#XGHg=qDua*k?lTu*x`K`p2V> z29)rhCFUhMWiec0EB*)30PPC#xdVVF{R`!!1b{hRuwas7kCi)p^gGKw9e3(zmeW2D zcP7Jk#C_7nWQHuMedflrvhTF}G>s``SyubpjTyGz3HB)(zu9JK?Xx$gLnb6!NU}7B zpX7V)={8246u|BYEM9vd(EP|w!MFU8li@NcboGf>FbXmWnUhyQZc^!rl~-tN(&>t) z}9ZP55=7|Jfu(*Fr`Nosdj8Q7n3m)?m0wrlBUDloJRwz_Vy!e5j*)itD z^~wHbfMyghVe@x$`p-Z&@@;PIxpDi+=Em(Aa|g=i*^OHOxYGs9CN%);=|a1c?f^cW zFF2DT045#5e+*f_S45})*mQ*ECY=Giko6FgGJyXYrvzLl<4plLD>66ZzsDyz)bW7o z02kikSel|AS&7^S7L672RJ@{5Q*4v0Tydij7SnUXiv4BND({e{8h* zSP|1M`sO$OH^8}<;UAsRA=)9T<_G%79y>2?NEZ6{0yMHt3pRf@r~eG}e}Ys9i`UEl zGN~l2KQ`HX{29|Nia`Lu{{}dh{*ys}lIk71;=H&4Ss>_d1!zVcW^Dd$PX8I`{|KpQ zEaq5B{>67HYU|uao7{?+PEiB`2>v&~`Fq1ZI^$1Lv9eFjiyM)FKz}PhBWu56^LKOl z&p`iYNcAIIXRPX98~!Y;bDL~(f5!BR;uApdzX8sV4F2ehKS_ne&OG0*PZj|BTLGF; z+bNsBo6~;=`aeag6c^s5f9W$7p0#nKjd4XxhbRmI1pgc0yxHK7&hX_Wcv5-!+`38D zRIlP?oKzhawXfJ1!LSRa)$9@TGAX`QFW)@3Br5;?y+zlTH;Utoo4~y}v@dlZ8?xpy zXK6n&dw~C(6MSs^xT*tiEmmJAB09}`*z?i#`8vn1&id%;)e-6Y_Os@Z`Olo5NbJ8C zP){SQUHZE@{b!(Eyu14*&H-;AD|aUb00`-lYu~5#0NeqixmA1C+`*%HmwR4~Um@$G z_Y50>40%I)j*b3hxy5^yjX`C3hkG84ezv)(d!~(nws}i?E{y>vxzrVJ%>>lodtT*s2e?T&JgGJwk}`#r70DB8Uno_ar>RGV;y#G&~|R3UKyBJVLQu zs^=$MmVVw|HcPGLoKB(cW$t0!8%!+!e}tE84EMJcLotHq7R`zY6@9W`(0g{r`F?}H z7YMstbYA+qIsHeVbIPJ_Ik_`rzhmxy>8yEpD0LGZr=c+~!2koNDNEg+!+aW20{podlcwjyJYAXN1JTj<<+_vbSpe$U4*AK-znUcZ4B@4S=l z{PyL-S8o*U1E>9gjXsm}4%Ym`LQ^&s6f6p^afOdcahqM~jFtCFafU(8Un7mUURf`h z&;R9^o^WGeLicR@-9AZ+4(cJHN5N{I*p+RI*y&7;N9Jld z>K>D~Jn>}kb$!No+>?RKq~{&HUZ8LR4=%_irllNo|5 z(H4oD{SlAwlQ}34dApgVtLW9T;A@l?rPE0=kGj>In*)Uwxzjn=t7N`H)cr0GZMi)O zZ(-t@zAFcB!OZD`D+_PY%$eOQcW(i`X(bO$y~(6&EN>OPskv)pZ>6z4t^3-H87J<> z8tng(5P_gdn}4Glw+H^w_3{5C!=R{1PNl*^p|vtQ4M76vFOy9@1=}wD<-GbcR{wD_ z;IC-L{NLXl`0WxwjW+*AH*SBc_}%r>FR35~JukZ_JI$QZN%Up9c56Cz zYGpoctIw@l>lbQ=Eko=+jTtS^UNxRhc74}+sqQPAgM=^YL@V_!PS)t={@ZS^RK?w zT5FooBvdC{)Gh^YTr;U|r|8*5zN{bpTD3b$*P?rdUrMQ2Lq;&MHFg3xni$yp1KJr{ zA|o)dbFqB*^x+>^>jN`0yUvIIreyu6l81*;)WRBI;>aj!Z2&M4HZig@Her-Du{8sj ze_&@~=j8k|!}Nifos)%yosSP0;h(L!r5&Zi>nqR9d>!+&`!!%pLGtkNTaq;M!p++^ z;z7~CFJEerC<>#ap)rsphC3-zKZ|G|Xx7lws1_GWi%x$iEG#Vbm+J9etHJ1Lc^h{( z*0L)DhyJAXQfv9*YCHOH!t2WK>K^5f4EIXED;UO9Ek0q6PIJwX7Ovy^Rc9QQ2}{2A zilRF+oIt}X!;=zsuDdzk#Yemyn{Lf(&=5X1z7aqGVQ6sfUTYboL7ehL3dt@@SvuWD8f)_qI08zWDFd0huYe7es@ znLPlm{5Z|T>k_~r;KuM?=&O?EA~!w(-`c$eWjpBGDK0rUCyQ!0}UrXi%arX<@K)}Gf$58PR^G$w2wx62VGs*TqDC<^ikUf174v+ zwR>e1+jsN%%5;(*c9(xxd?oGT(`?GP<%xAXh1$lWZXCum+*>J%<_CSauMY?0&8H96 z;{%jY2i36(X4@HIKZwr1V(;&+4;g-aRVlLlgz&*4KfLJ+BFwSM;u~w`3@Tpan=t)X z6Gb@WAW;mqQ^DF75^-+ARJO`mv(Y${=-06~lekxNp$vG?{6ldrRsjprB+{5(#;l!6 zXD_+{A^Q$F-k=xkiAVggX-08?%1g$%Wvs7;&#h}nK7Nt!0aM|HFV4A$`i)Z5M$(5( zwNKAtGf?Vh+Pv?<-ocZ9|VbW=f0Ku2Od#zJ!Q+?cN?)*|?H z{_TsJo0u1rD!U-vuwn;?6nz9TyT|tn_9;@lNaOy`kgTImxj-BB(8H#vd$;)=RGy0A9 z@b()^QGr}>il&AFU!HYk6JXK-lQM!4kE6Dpit;lp%S=MrwlqLEFmS#EyK2CE{ID8d z;@yX;P7Mu4Pn~OB(2#~oLeJzV3@dBIr)f_URuv+hUfQ`!!;1;>6?Mmf!dP3HeIf?x z`R&k8Otea6_Jgb5VA%#e^-l%ZTR8Eb4~MU8DcfWj&1lEuZ_@f}5!r5cW~4!{U@ z;EO~VtZVSRZsr1O4_Dqod;+{T1&ini?qxpr=Lg`l#G9y)A6Q!t!k^UD>vX9bva<$0 zd&=5~H1LvSMK0+h*bNn@Zq8iRZmY7Ja_XH7Ew@-WwIO5AnL)F0rQ*vLT}vXXTf`~< zw3u>VjYhIdsaj60yzbnQyhlpLyKE2E|e(dmCplvw7;i&z@&T8kFm=w2WY1wk( z7*S6U-=KO0-qF7c@<#U=*rCgLV;;SLUp-n3R*AP$zV zu7r){qZ&)veX0W%m-#KBE97TH?(}I(g_C}r);ssc0ot^SdEB*{=Fzn08+555ctHJYUGL?&CT%rbD3 zo*uhF0ZCT9&KtlQ0h7VFDd%XKe3i87BP!_k$^t~NAz5=3ztK=+&d{z7ok!yMsS**} z@=2@Anf>!&T7B?xmDR#>a{1l8>X?)2n1=k2n$`k2n^+!|@B6&w=&uWYK+d-}`X)iV z6(u~p2?fD%Dmj$}Z!5tvFlN`yG9?ZLlOOsaEAS?{=cbtXLHRYx{fr2&iI!cKNp{{ZonM(7V z1!MHqX?5RSf{{Ni)~v2D-;6UUBseD#og&#_-?B)uo)64A#NNpO;?| zxRnJFxHbONdu7W4ZT*JzSGaN2TWiuqR%0h80!;1PLTmt&ZXK2*rd9@@{jozcYVO>cV!m2|DBRKRo+`%gnsR!w9avMQK zZ=1eoDHzHOKKb~{*mUwee9?JhTN5XbGwlJwbGxyMD==#KA$>T(Gt-py(+>p2Q&UpL z=dNi)XuI?!K;1ZHE`%O80lPw&yu7QHOx3cxrsM7QHHUs@Q`V?fQU`abP3hLs!cHK~ zuA8=trP84xA$Zyb!FlJhDpaf^-is&zy$|Nna=@_fql>DT>?G_)KS6r(j5=dZ9osl3 zY904V9>r&klyk}H`jm#0BT0%13yA^K@BypgUYPUXo{@zkam%=CXJ=No3~o8LFWw0Z-WY#6v$s}S-F*HT+hTyw7D7-QsB07;n!n&$)uvUqK#sD`bmvR zDqrmjQ;=dtGrN5dG88*k{uLjY!y_&8MJqNQmaUL93XA3kqXHWmMcx;#gQh}^Nba{o z(Rr}f*3(0fc6~xE+p{PQ!vp7YzB-%G(HmLdX~q8xieNJy5B0t2>EpWZX}jBGL0h}s zWI@-%Y$f%QaMzPRaOyMz1_0&YGvxh|SBnC7$7QvH%O<<RQ_V62Xz;JjRbcWn~#_tEI z@Vl7o=sqIz;#i|(X;PfQ_Us#Uo!|I8Nj8x>VLClJxjQvG@jLf{Ge8w!0uT!b2I>l; zW~GjcaDv7q_Rf0Vku1Uw!Px+n;0w?+;pu^SKyn~tpwEh_NFM)ENJ&RZ_c2YHGt{2c z;C0q04llNX6sO;(%yp7!v>o&vj2$#nOjGno%Hfa0ACxikG4s)j;FRDKfCz$I1_)UZ zpT4bA#A8sPN0Lc@l>QJw8GoBCiM9o21m6QB6(q^}8ZFmPw(ThH&qza{#AQ58VT{fU zj|T(@;*%sqLw4AU^^UAe1 zLN%D~!etJ^5QJm*Pe7BdK=X$)^$*q0Wk-hQ#dC(H7Z8euBNh1YDtMg|2^|K04Fd%e z1^rp}mSBTmwe*ZFGv*8nukE9kz-`(Y-o}RwrA|s9ghZWvz%~p%QZMn_ulJs7I2*#v zVs3Ldegx8P!DqFMhVM7&J5yUjs3Al`2me8&YZ2uSy5}Owq`DN%!fr7sK7MCBY`@;K z)n=a2Z7@#HvnZchbSeQU;UC~U;pOC8`hM*5V?GN9_(q&jUEhQ-W+VL!rs0t$?IbGvGJ3a%@|GHo(t?`+xF^e0dYG z&r|I-htZ39)3j5j_3T>+|7~ZK*zz7?X5eiLqZh*_j9xv#`DdESz%Xq&k+K}pImK1G zAKPs4jVY44BDcsY^|AJWj9%=UjzvCr8;YIethsth1K~fmMSzIj8%}6A@&hBlOZZeT zgPIV%yUqhN0&fFKlF`e+^a##59Ckv7NX8@K?uB?)>;#^;u(XZUARhBldoO%#up7&s zTc1!NYW9h!cRSD8hS0Ilb+)Zg3)HpC^pbpC_G*|1;sLROooEaEHEJP8_A}8n%=B88 ztw0OWHMdgumgRJ@yl;R9`2kj8QjTtr2lWAYVVh{n{QPD;+_m5|qC7{AEPL2mSg<}H zXLnaWwmsaTx6!H5psVny@Mb-14dj7y;4=MLq1>RD5hXTi4r3Ng)0^a$`eQX( zVyspoS_-@jP_)xf5GpI9BBUbPo_XVAXDIM3kXw*`1G>}8KUiLxC-tY5J`}m z1QabPPErpyP|Yp@O(`HXj`q=C9Boh7{{beK*ct9x2yk>+IF@xH=8b*LSUC2b4|Mnvu#}c(2TO4LqDWUx=Cr9r@0X-O3tNj!3vWx(^@&)( zbMNYLi>F7P&x@_A`Ds0T0)YqP30Bu9J)myK;4pm4&iY_R5rf>#EJIX&afMXcnMu-_ zY0`%s7x=2CgC=1*XEQZLOLAJBX)JUli^IWVM^}jg6=yf@Iu|!nX8@q&w7zxA59Rni zGMu~H1{ZUMP*lpqbB1}0UeautCBo4 zYZyGBg(YJR`*(hL0@AB1&g6_7_w#EVPPws)~U>77{WLe$4xw zVubW%j@}}l!)~$d+}DqC{$x2BsSj{aG&|~0cWBY6=q-tApc1Xz6v`E=CcDqxJItvQ zu`1;ued`=#3y1Yth#eTxKyngYAhe1!@ufczZNekw+T)PDn02VJ|Nh5}-Hde=!jeBR zoDYq93RW{!J(+qXOjY%EhLIDj*{+HvJ&IJMNJ_F1bFO$>IjNPs+U{}v=_?*WVS!!D9V}3`$iyjH|T{r7bT0WvlN{m)iG4hoYX#U}WHG=jtja>I%arkK>Y)SAgTo3GGGd z>8UO&$Dtn+fj;TYS|QCL#K_@%!*I}}`Uz@eWqDW;(LE+2GXU^%D)Q`2`WT=7@`Bx7 zI{eG|rXSSL4s|khQYeCW$1gIj2m1-IAL5&84->T3salVC5(vBD;D+6bCM}P;+YWVx z@`%M3+~wwYEm)66oBOohR(o4uyhnG;Tp`{h02}k_S?D<`$oAY9h$DOkHr#b&E9=Z&=kDR zI3le9R!Pv50ewlpwLNwk;%HMy4 zl5%&uDqxBH#5S02F(2_3&UG$8sZF z{mQXnv+NAp8uvn)=!Q4coFDIjDAfW>Y%uVeP6AvwT+DMLwA$%Y@<7o{i@Q!M0PI@t z!_{h`y+zRJnTshU(n=?2$XxKS?qb!-N)4Xdak)A_uFs(B*;Jz~c7RPh7D9!2bhR$$ z{ZWE)=ZTYO(5lb%@J^2>zXaN9_j#jH?u>`H{AS#~Sd2%K#mg4xs!O=hb+hh$f_Fg# zCORjgJ!eQX&^5Jrf4o%plfgZ6#^hIwv-;{#@-v)WFw~w!Z`7Tn7ZNd2AHVzs>^kP{ zyVlLIfHS;RO1<`^8L-QdH+-DfyV4-^dwa)dB>Gi@i0o+cuUO6OzcOP-N zF+LlDi_ok6QBGL{^xsJfM(d;dzoqr5*b@UM2RjM2#$f^?c*yF22u8q9&5UG$R3xGm zTP=8$-H0e80^;vuaCpdT;{gd?d^DYg-4&%TiuBXZ%6VIl;Q z8kETUC(=pp8hP;SfE^P%tksch?8P6l>T#A(yR`C7`&JhhwMgFA-oETG5;PjvCjsi@ z$&N&#paY22igfI|u#W{fRhIT&G{vuc^V1LbzjJN#f7rfjgN~~f(e&S4ryoI54_Nd2 zG)>>)&ru8QLFM<&o@e^#O}IV1?%`G-Wo=RtLFLtrks`E)+Z&{MueruPbK&q6-2=Kw zo5UTUH0_KXw$*pQ+4USzPhabJY?`;=s1?*0>O2fFGW7u7Jb!d5CGaEA9vKn)+9Q4R zTQWU%UVRuM!UbihNFalmVMV`9V2=@{#M`^`?047|(ij?=(YkjoiONjLAIl_@KQYSD z8h;ey?!`rlC0mWv{-9NC#vQI?RE-}XJBfcq-D4s<7PcQMmy)e$xTTma-CwW1y)Lx4 zE|h5%fSUQ8n!j1{PMPmIMOqr8qN?SVnrtJC z2VR{^%<7l)JQMCVyh=I0CC5NO5qE#p8`9Q?i9uEdOC}88(7I0H*%m!lpo5SHl?UZt zNx1M114G9P0iM&=#-Mf&5LB^Jh{wNsvCBZ@!OKTauZ!!u(TZ4r>YXk>qvU(=qeh2C z$8ZxYm&rvkK(4bX>6m#wUQVMn3r1x(&Zu~O)79`Sv>5F0aqGLKr>UE&q;i}3E<1&$ zqqK%bXkb06<}yjN`gA;&LE@&ij01fwwhbbcPXQZpPY)73b*Le&mSSuwhvVzL>Gw{r zd*4NDAflm{dCyyq$+&=fQ@XRv*tR6WCF;ejSNC6 z8hFX43=r5YS$p;4;%|<(NK`>2{U5M=AEqm2k`gVX=p+c2$r5v;Ts2vy>gS$gnMY3nU9F}5%Apw!pD$5`GXl6s1?7RywXL7BCmgU z_rRoi@z@^Yo}X(hHJU@&pGcXeLvXHWY%C14H_ppN_1`|%zzcM&U}fQC;G%T*koWSb zEdIa%r&gAKmz{XdB+`c?T0lv;$V1UJ9zaqS+B39-C^^;Dwt(!Tm?NhUk&z#g~|BoVFAlH$7d+-Bq*N zq@#BWN#2q3V0Ms1A!}0ZJX^>9(=%#aYH4T0m5)Kn5-wZIr?5N(rkWK(9;MF#kkbwP zA}0Ni7GKwMT{_Gh+ipc!8*YE2S1i-;@e>seqQbGL-`t_U}oeE7IkSA>20R=?@Mg2*1oX1qSCQ;Ph@|y&DQOEtbe((ij0v?T&Ka zjP_#PWNJAtL%)_Q(kNhAk`4$2tGGL*hWDm3Gp?m@vL`$Z9Xj9ceodc5tk+u{F!N@x zYEwT&@y9J5Fc@T#z#afPwM@|svtA=!E>pPn0+QIYGq6VsLLPuJP7|GRfoZ%@!(#RO z&vTo5C;|?!sg*w6y^3k*qigKk4h6mXOn9ByTS8q^RTqW?o{q ziQ!O3;C>Z8MPjBlM%;QC<48t~b%g!GmNt5C@MbvSuW70(CT8+kzESE{OzSD!;rq>! zMdq|^Xq-bR;;Czv+eJ!fUhqI@&deu?JBngttYbYY6 zq!=AE&%r$>Q3a30@Qjv=caU9dYYA@WZR?k;rTQjn-k^-snr(-NflS;0BspTPZPd&% zvf@#!y|_l<%*+Uz5d!CLsmtC3_iR$x=e_HOg_nxJu4SSZb?`mIeXlv5yl#gWcL`qC z$2%Po>=k^!K=VVwOQVT&y~bVv)>ItL*|ospxa>#mkG&f2JI;#TD6WdHMBQJYfftwY$UN59`sc?2Z`$U%JJ`qY4S1a;K0rX{nw>X~YgR)gtg%JgW) zFi}G*^^XC0HZpUV`XM%O?Q&;DXDu7A49g%Q;*c5Zb&17P-)zP^tj{f0cjrSxs^!Jn zNxqVv4xYpQf#--qyQ5LbjFFkSsm79HD5JWqW!@W)5(^7)JB-$Pb=s$zm7EiAxgH#U z1qvr_N3WYLv_2C1z?F#Z@hb&zEq_y2R*%liwvXr(5A^eTD!ej}9Gw$;pDs%@g?aKwe%g|w;BWdeKJPd_{c*-9M&@eIFPMIE>i%mAjWQEqwl!?PE6$46+XqzHv?1YzL#; z{itvO7b&%+d6~UuHOu6YbT`-S>C75~D*nZpoOuu*PcGMO79%;3QaLOY))UFyY)iWA z!5unl0|(vq{sx-qS0t-O8A2Fa_+QbJi7VOS9+xn!Dwy;BA zaQr%WdNxUMSs7^^;49gd66#^HS)*tj=zG^xH@PE-6*oQ9%aBzzVZ`Tjv${ba4(q5K z;_6N68CgmuPE|JrqHU84yXiZ)yD-R!hKH!ykmWv!R8u>=zKR)2sE11_OnTFHgF>1^ zq_T+*7v>=vYQ^-Nf-z_CNJd^346mR^?EnQ71JF8<&1X9$)Jr7uE+^qph%_a*p#jCp zl{T?k-g*DPK;1F!hJyQoQHsIH|y{q*l$g5w3 zezVQF3=2OCk^4J=GyK(e8-(7*?{WMD~kO8u^Jb)Ef^baIf9 z;i?7rda=Qd^6Y-3S(t^ci|<=O>aCKh=sPM}Cr=K&Io0=4`fsC#1Hd=yRGL3cIXnyy zGG%BpB@WMc@a2;Xknu@I3jA(JXb)Gy=qptTD&AXJVdbmpmjss!ag5qA^)B5eH`X)G zdug3FD4)NpS?t;s_O89eW4nl{z0_^IT>Clnowg7b|TdSTIGiYv>jALyw~?u_ z1lH9?)K!E%WT|oeAbTR5_dXt!HN7lw-rsB@sSr!O)2vEg;^HB|-%`wz=Ezs2ExlQ% zGY?EeEmwqEBRhho`)sM}w^V>GHrf7Qr+h!g*Gtd#{Q1(jpbBbA=9At6o1cze1pW3F zuLIz&WaDD3?ZNYwGv)Tg*ofQNO(!yK_H;E&>Fo zp0@ZVH<-v=bj7F(R!_Hj)4 zo9p?-x%2C+R7)&9)C;|_vkbU+lx14b;L4b7sPqZ7YMIi)XR^~fS-yK0uuqn1N&+Cj zv4G=};77t(v}j#&6j=q1Xt`CCVt|XroGYDF&~Ee{>I(jqs>LSXvBIh@Ao0iA@P?1* z*jL*PtYtaS<22!r8EyQx+KbEiUOCAL@L^h2B0#vldAFvvp*0=-!0= zgAXmi<=R^crwbD-oENHuyk+oYzh0%nj|8@|zqzrTJ4=$n^mVPfT*}|@G?Vl!-zd}( zsS^#p$kkA2PRhh->`A%xtWat2DZp66ncqb#_!mhl zUwyW!4QOK?T8bqCc{xg(i$>kBY0Bw6a$6kvnh1>MpLvJqv?=eJBfI;D-h+W%`Tg%gwsNzFPfquU?-^Qe+6B!@Uv!iI4}0GNA60ey zKlh&9B%5pwAwbC6Dh-eiR5fLp=s`w}(B2a(S;(zY!gzUXM{z&cT^M8=E-`Tl$&N*|wXU?3t zyIJw^x@Xgz1AIm`)ga-zY7DP)Qyhoms*Y=>@CbgY+Z{B|rbux>b1h)bXa9w@IL(lQ z=C1SR;auY*Wh`1aBhHS{dGc{M^SfvUO($M&Ll$>nkABKHXRpnD zbVf9tGLg@BP3Oefa*DB4ka9(Mt*Ut5XFqct=UCCe>DdP^(@gF@7X;b~b;SBmkPhFP>6?+isPAFt-)m5yjp!S_4TN)4lPs0i(b&>0u*qa3jm z^%0cg3PB@X*KS7pQtV4_TL8mpi~{Vff-K9a??HIA1Z4r+=`H%>l_99>uLn>T43Afe zt-?=n>-tYS~>P##CP+s?_%mt_g^2skY1Ob_Op;Z%_ENV zp7lQaqemsA=~suK9E^4qG=3h!RWc({{XyONhd@Zw#=uQRuFpy%$Yvh64IJy6<(?SG#i~&or8RQ zJqZ6l;52vTgkfLGBYHD(H;nE#TZQMB$Jn2kD(>%mc zAger@amDEfDWvEPd*2kD;W5f0JPD7duWh6+O;N3#XODz?X}UjzSNcp|bk_5T6Wy!A(uI0OEmzdEG#_Xq0y0Y}K=_vL7LUawZ}8B-GqYUS>rJJ8^E zo1>HAjLAP6T*H*b*F1JhbhOcTachDK|)aetX zF^VHTkoFUEQ(?UAe=ovP_ zIr?xcf3;TS8ABb12MW2zhp@3{oI6M3X?6^1wGQ6|%~_9&8unYK&xa%j95|PNC#W;( zcGPP1b^0*a;~2aW^h`wakRK=1pijx6;R4i#$I`>cS>p(xW9~rC>5%H(G^WdQBQQ>%3oYyE_#A_**Xfs?ex$(XaR+ls>YZ7RU?*Hj zZ9u^957mT1b-~_Ux_I4=fG?-Esc8+m|)1w44yi6(B84qRP#pw<%#VRuy%XrfI~iVR{n`2$Tas`U}F&!hvx!&UDL zW$RJefNit&HcbQIvNhItoHY@iHR7NipVM3K(zkMx_kJG+P?o1tc(+8DV-M%^HoUoT z3t%_|LjjL79H&hKPLbztQLQJ6uNg9AT<3;BY#)qWX*a zP#q=*ms_8vZd2p-))^VagoPm;HrE%#L))juQ{_RQbK>JG(dBBtzKL{~nd)q<$`M3g z{l3!)q-hbdI2PQ#oJP+$Po3N4apd>|W4h>C7qt8}r{>)Nru%lk;kFEC=2p?fM0&OCF zhS_?G_f+fBO@!3d^B{;(_IPsuc&)ohxPdL$@)79{X$05U; zhM6WO8f*Nu=b59v4eA3vbjD2`xcrz}$(ONiXQ(N_n&TLQ-{ql=*E<~Ijw*kHJK`Mn z`9u1a3FmkZZ{u*J@U38teoR!k4LjEnG0}iNd@zK;V-Cwks{e2 zHqNrV@^sT-#T5nFT3&f^g-%Fec^P)E(}^w0s1s~gS`h9X;*PW+|M3odQGJ|ThZcVDP|%a*#mYPnGRR;|z;CFtLN zu#mmp)`}|vN-DHb=0H0!5IUnpZ@k{mWLs#my#j4>&_e$vN508+c7$zPwC#Yl-OwTr zuMafY?u@WaLEBDf+XF2M@Or7yR%sVun})X8XnQ?c48-ddCfoW5+YGerg0?rJMHyZn zp~p*%4Ps(no%(nD{pZvVr~Y;7oA?`Jg_x-1^fvxXin2hI^$0bzsfsP!1@&PCTNDmri&Jdz`|;h=598{s!FVN)9H>ZRwXuCcQ@9q#LE43NATz4 zb^7nSUEl4x6@TNRl{i}z{xqE0x^?TRhG?r29ku%h>L5;4;+i_+-r}gYxOgS5#r|IV zdmR~ngxGjz(L0OYUGzrs8_D))#opW>b{Jz-Vz9$7Q+8FgM{P28X{RpjQn9z(pT0l+ zNS`Bpc6)bw^{Krv=Z!h9*&w>qPY8IkwE=GbIKlv8 zz>TlLmFnxTi`cv7d!|{G1gzgyE|Yn ze69a0<%*(2K`vP*V*F=gpM&W6Z4NAkM=+PZ3~#^(un+#Bs7f^4#FjSb3>mn`^zUHY z4G+OG%-XNOHr$c>;gEtc4t>e8CFb88$i$taSBG<92|S8yz6l?~-{2d?qS*9(jdrad z4r}$xsD|-i<#i7{49hW(Z-lpC7aV}Y3Wh4?6+P?d_I7O11J9XTu@apE_re;if4+nN zQQ~l1wO?6<1_>4A{q$N-w{C+>*r6xY4WqFpZiK0DA3P2Ex7Hqqqi_=b41a--;O~l^ z?c3nVaUJH7%i-7f+&mtB5A$FxJcsMF626Cj!6tYccEe{%JliLMgkG5E+QDt~d_E2C zhi6~|=87la82kvY!aMLWe6GmTGf?1))34h=TWA5-{C30$t%stYRNy?HcHSHR=lVM-&epTm%El%LZW$U0Hs! z28+n1Ew)U+EZq&y%#K(e{}!ghEO-F^054$s5%46OfK%`qybGVe7fJ%PvB3>^(q>@| zJPBsN0vM^Zr0dC$f-BqyuEi|c39Irt_#K|Hcfvwg4}Zc8`YTus|Ae1l3%m!P!k0=S zdyt9|bR%@f3ic|jq9?;0nDrOIAK^tjg-5|t@B?m#*WrEmD}1H@d-Be1L1)xN!fAxF z3Fi?mCR|Rq+Uf9yqSh0Btz&c|VQ<1J!UcrO2+2PBS;CEk+X#0!9YJ^Wr-TOxza%_N zc#QC*jxj(O<#g88#n=fm39|^h5%wW0B^*UKmT)}bWWqUwFB2XjJgK8ChA_$H^^CE# zBg`i3N!XWgAYmopNW$9)s|md>pTE`?ARJFPnQ%JcY{Gj97Z5HXTwd+*Ic%#4*AhNU z_#)w^>VU&(+e-Kz;U2=z2oDqfpku5`XeUha_&lLljj#h@HeolyUY?-e8=Fg*kB&QH z2NF&qTuZoL$GAj7vWX*`xWR-&2}gN-^|f(Tgf)ad!Vuv^!l{Ha3Fi>b^ZK3MxJ86Z z30DxVCR|7O0^vr&t%PqA?jYP<>vnnK_7Z+Zc!=;Q;SV@SAnufob_-!FVFFjgu@A^25>RrpC#NvxRdZR!ecs03t?;!cbrTh zOeV}E>_C`J*p0Av(BrF?eF+N*O9;yehZBw_bP4b9$7ZENeToVj- zy+&>ze3@`F;WonUgu4j$5*{QxOn8Fu6k@j)QG|BFM8agkOv3hr*@WE*`w-?6mJn7V zUfW_6VHIHwp^q>`IFWD~;cUWrgo_E66Rt+=-eNuBX2KnW2MCYqn4l8I5K6+3E6~w2ulb@5qc4OCQL%?l`viZ05)MB;UdDNgewSF6RsoNK=^X7zAl)snQ$B7 zcEX*6dkFUv9wa;zYz)>U9M!RluE)CS z2CRo}#ESYRtVHuJ!v4a&vyc{kEwCzEg!TP}zf!RFYR1dX!1#;8Th4<5Yu7le!+-f# z3RIpK2cO2a_`J}F_51{^v44xz?C-GpoPtjSzsHLGcC3VFU~J!k_3)iokv>2?{lC&e z!Dk;GGtYsE7lr)@`xE997El&c`M(&V8Z?ElQv?EGIa%rNr#5LujJ+sqc~O{g29}-| z6D|V(e>feYU&=t7)H0tqmIcb-lp*39t!!`M{P|y>7@A|gtGl%Iva^ehy5@A}->;^(4rl{!?dRvXlr z>H>A8x+GoYQJbT7L>-7a8m&erMz@RZ7TqtpJi016 z5Irqse9WwvMYd|&RNK9=me|&@?PI&g=EqjXx?)4Ii(!?3RmL zKHG9j%bkf@;_$?oi8~SxBpz+0wn}W(u2r{ITUzaGUER8&^}Vf^wTW%hzD@Tw`E4rO z%xSZw&E7VL+nh?0NtsDGNx4a-Nu!f|Nt2W2CM```o3t@$d(z&d!%3&w%C?zpbK2&% zEp0oxt*`CmwsYGqZM(MZ#R~88GADhXPnBEnVFe6nYo#znWHm(Sk3Cu6%(!%(lwLb-K38;>9cufL&o+Uw;B8IoNdx~82j&h(4_xhw9iR3={Y9dG@qO;M!icrlRnU- z2aNvrSZ}=FbGuQ`%{A$LBXm4LbNiX@&nI2Q`YJIz!@gBvnb(2tSTNTmVLjP_uO47| zh~X7e|weqsf)YGKXa@OWx})&Lge{mb{9t1uQw*UF(djyVo08a=%A< zYsk4kUc$Y+$dY5z&9Uj`*mQH=s^-|NZq2ei%Wf=rk5u!ls+rYlAIr%s=dk1$tzONN z{ixo?ayQK;BHxZV$nuDB-Zhg+kArlq>a(Fc^ued`5~#$dHWzrqZEAS*8qOp&OIh*` zt>MvYc=VcGEI(s;G%P*9QsS7l=7=0yXwu6~dZkHUYMjH^$hF1OXWTZU{kUDE3$Ww* zriXnP$G(l@xE^`vwVGxe0wa@x@|3do)|J|aWvsw0J$r*Sqk34sjk?Z?roAfp28QsUxH_u|UydTcw=YBq=?&nkT{zVj_ zR!G2eS^xWgj|mau%7SMlLbS#tJx7_*1P5?wr%_?aS=_c)?7t|?=gqZuZ@}q@8=l zPFT-X{d&&K>v{jK@5M6zY&q*WJ}I8#lj1qfOBIfdO`q*^RsBhbB)Zfz2<(Ovu{iDWb{|`nQcka&c^MpLh*)@i>SXxPm=a5q<&yP4~c+0&0XB0px2K4y>haQi*neh;52doV(yA|mvY-sU{{$!M0Q zUGd50|6Q%{3H$yDv-K(02A?wfpK_-9l;6Yn>pYhH1hki*oc2yK`?QZMf_*tge)pmG z(Gj!RH{5i;j`TD3%szg?-p6@s-*lGqS*|=sJAR7U$Gc}A?|}XMY_`9(A=6?E?=K0< zzilv{AO}qEs2ni8!*QT{#QSLY;`5#+eYny7^N}XqeBW!*P45eSUI&KvslN0YpN+p7 zY|=|jdWmstM_+N9!UgIrQh~ zT+{s(M*aKP2zwmwdsAe6ADN3Rd_U6uHdFi2CViC2exy-9X1afDzj6Fy2TZ!@{_)(1 z@o+xJP5vJrWzrjr^FOi2sQ)w5sQ>V`vHz2%s_Mr>M*ZK@jQXi$lb&zVT}Hl6?KbK^ zEuhn|Nmrn!p}qdexluPhIVSyz+3 zz^Gqt(%Zdg(vKMRE5;i2_V*g~D^25fu$%M*lb&hhze78to^{ZuU%lGcKF4R&yF{7v zDx=;t#*puot{sf}y@w+zN&Nk8gE3x?8uO8IG{&UI8u!CdW4=_5PBzBJ(PxeN@$p9e zhdxIAUtrY#y~UubFw3Zm62tt|s00I_s;j}MyJs48-#nwB6dgZK$cx;&i`g34ctc#bxR@e_G75!h)i9xSg+iwBYUSuyvEVfr5>eWSa zZPpX|$S*;t3Fy;TB)7`1QMN(-A0)TRU7(`28*!`LgSZXn8XJBWMD9mlH{spCk=!Z| zpxli5-$`zbu>6cIKWEE>Z21LSHu-xq`CCH%4kCY>?v&DVI>B>lD6wFY(N-fM%{E8oDE5A`faF;S$nGN?S ziU?!R zY*iPk3*ilQh58X}6Y&@|KZ@?6JDd{zL_Yi^ibb)aiigF+im-$%k17_c)9O^ZS>0B* za;alv19@d~WsPwefTkDnUtc})2rI+=Cs9DPOu@$in<=fah;uPhSJ;7d} zPO$&VzEpiC-W5Mq{XTw5{2cY9RAr2ak(bNMMGJX_yh0?%E9I4ibUB-b`q`R z)$(f5T6UJ5MH|^gb`eSP8hMRqE4$0?B3bs7Jw=M_C3}ff*<1D&X|j*(BhqEA%oQ23 zuk0%_Wk1qCCtcDdu8`HTTC|rnvPN7fYh|tIApO!WI?CV3 z--s+(FY84o*(e*uRdRxyAg-2EJlkPAc)xkxS&J>_D#SX?KU$R(neTq>7}>*X@JO!St^<#KU@ zTp?G8K60g8DQ=Xjqg5q;%axmM)KKgd6be)5m$|0D|KOY$W#KyH*9MUi|}zAB34Yw|TQP`)l-7dOi{V zN4_J<ej~pT z!{rfqM2wI})ojJ!B8akk`rUAX8p1uZPRz4e|!iOZ^CS)=ie(R|F)L{)|&{4Xj8?xjWIR-jOuk^xI(kFdzwXBnMkS#+p1f6ArY=9g&UXF(@aU$H2)*Tl z@z;DxRoMF2&fT82g1{ zOtFsD-x*cfsoh1PWjLgt<9+RUuox@N)vz93gw604?0`LR0KV408;&J^lw!Ay2Vo1^ zLbeGc>unQBHrRekveEWClp%aInPkW|g=D>LD#-@h?@2b=Zbw; zcN${7Z5CpKZ7yQtf56BCH1nWs0W-6ZnOVflJjl!}W@a8@MwT!m4>Kc=FeA&Dkw=-4 z<;=)q%*f-+$Vz7931(y!Gx8)e@)R?&h8cO98ClDWJj0C4$N2|sONo&c#K`LZkdZ$y zBkP%wKQbfFG9%A1BhND zUS~$$U`DnvBX2SzZ!sf(VMf*wBO54EHW4FR|3gOJVMewyBkwXJ?=d6qGb0}`BRiRq z51El&%*aQ~$j8jc9%kedj+IZDnZGhKdzqPi%*=jf=5Nf%-@+dV5zzk6mhe-8B|d!N6Wm;`n)S=TOnMJc)ZfR$^!qVPyrKN+VqdqhA=r};rdlUSgZN75DHJ#CT2 z7Ay7lri2&ofTgu11Ff?xSr8Y|EC@ws~CryE-i_iI!Ft zt0l@3ZHckiEU}h2i`^1$k(L&g1dINDmj&lG1)bE}sFoWoxnQ^CS@J;Qy*`j8R*F?( zjd(_E5wDA_;tjD)yeZxie-Uqsch1Im%1ddtr_IE+Hu1Q49Q%DjJb@lPC7wdo*9y$0 z$lq%?>H+Z&kSQ;wya>r@)6%9vO4^LH88|By_ed(XeFEF8McbFe%i596>$8q> zmiZF52bf#E-33M=wbP>p+gU^E^Jje5@_%u69$-=w+X6mS-90ti-81w|_bfZhiiohn z0t+m-k|gIOEFie#q`(CQ1SCil0Tqyoz{Mr!jDTdxAW6hT&PomWxLP7?!|N_ym^0a?~Q9!b(^Lt6>eSg>|S?K7$Rg5jMeQ*aBNo z!)%8g@Hy;+U9cPWpuYJ6_Q991AHIUG;TzOG-@ySm2#4S>9D$>#i;lwyI0>iVG@OC& zQ8S%|b8sFmz(u$Omr+k$g=_F5T$gVKf}c@q{R+Rq?{E`t!ELw$ci|q~hX?Qw9$|B5 zygpCk4R}M|h`-Dm^CtWip3a-{X1qCX!CUfHyftsb+wyk2J%5$I#yjwiyc7Qu@65aK z*ZCW~EAPgq^CSEyKgN&q6Z|AU#ZU7y{CoZbKg-YY^ZWw8$S?8B{0hIyuPHkJkzZE~ z{u95!f9AjNU-@tRcYc%K;N(rOv?TlG8jfO=3pq#jm}s7KXf>T&gidQv^5 zo>tGO->W~UXVr7+dG&&NQN5&IRUH%e^@jSh`iuIj`kVT@dQ-in-d69Z zch!69ef5F*P<^ENw4kUUDvC;?vZx}eifW>|s3B^KTB5e7BkGEmL_JYoq=^Qip=cyt z7L7#{@rpP$VyXBv{z#Bp&#oD`?TX>mq;FMbeb#W`_aTo4zBbCWrZLNyZOk#|8uN_##sXuZvB+3rEHyqcmKn>96~?E= zN@JC=+1O%iHMSYsjUC44#!h3e@rCiFvETU0_}ci!_}2K&IA9z!4jD&`?~Sv@dE=sS z*|=)_Wc+OWYW!yWZrn6(8Mlo)#$Dr{ao>1oJTk##CN~vRH8s;?o;A;z=gkY|Me~w* z*}P(2HLsaJn%B*r%p2y<<}c>2=5OZj=1udKdE2~W-Zk%;_ss|9L-Uaje9Xsvicj@v zK95iMyuKKp?lXL*&*$^|viU4uz!&t{KF1gG#rm@Q;(TFWyf23@!S|Fer|)TBF5ff0 z+`eahd3Ao4hnZ8-R*}gfxxxRV6`8hh|7@A`^*+E(fpc(mr zd>ThRO7rY9l$z)b98~I{H*i=ytRw=jfYxc72b2o2SqmeH)scpPMarw%mNBw3d98w3d7|dJDhM zy^Xn{Ak;+XUI)%8la~eqo%%@Jr(~hF=*!$|L3&WP^ypD zcw+Fs&;2@vyZnZWWFuk`3AjickuZ^XBIsFQJr=>*EWt|v#{RPsfpp(k<|TkXr(Qd`P) z`PioNE^d2jT4ulunzrefAv4y@ZpN8mGv3T$CYVo|InAfdT;?-oZu40)kD1p@G@mo` znfcA6KeWQ{{;?hQ$M|)>@ef(!#eZv${n`AMKkzqJd6%)<*h98?-yd4%!)Tw68pn;3 z#_7j)+8^uBPPY2T|I}JP_*;AJkMoE9@&A(5cG+z6!N1#TqlT}`I1AxWIG*JLht*>Z z;aOU<&&OJ@_E3Pm#$JPBtRw3P#o3=&7kHk%!TLf8_BI<2m01Rx0xj4o_7$|@-FXk_ z&wKIyFo+N2gJA@JhYyDj_hu`r%i-#_LPIBI*EBbcg~N)Vnqu5iP4?Q2T+@A5CiR?K~hGz;Z;F;!G$O?NFdsed2p4Fb6tg>gf=WEu;bI5au zweTGE9A_;(Cq1WG8}t?)u=buu=q(HpsiHJnD_#`k*d}j&ZxY+;E$A)GwtI_ui?Utb zRBtNV?Jemo$@a+gH@4SX-dmo1;jQSc$o6@wdaJT8y*0cw*nV$qZ*BIKx1qNo``X*s z+n9ahP4}j=Z@n$OZP|C;j^2*!NQ@ezvZHz%y)8SYx7Rzc6M84T2Rozp(tEM1XlEy} zYiMUTv)|Fq-ewOCZZze>Xm0f7t<7oX4}73+lrMvC&%8edN2yC`#iluXH6mFZC1E)F z_e6Y;M7lShqqUtw;ZpPp=1?sE+Zg$8BmQ?1H+h#%0agH8O)^VHb60|uz%;9|YG_<) zv09+AiEJX>rL!AaYw=nREkS!q%c(uB<rhzz(uQ>@YjRjPxux7z?kIPad&+&~f$~s!^xu)Gm=%@N41`MWf(_8zQ5(%V!t zEIoP0wfv16FP3U4^b^bArbAiW40hQDh0_ySePy)wX z7ojBT^2<;P_4!pOjXM2DtRs2%huq$vA7sNLA7pD8Ts^A^jE--BlZE14aZ|+vF^v|lOO>{Wvd~NzE+K3Cij} z>$jmj`VhmR3wjGV6$s@b6(gwSdp41#F-eu#sB8 zCTanjsRe97%l;E=MeF`EY(oqG0Jft&_rQMiapK?*`ZdqMDfDHM-~xIj23$w)A^<<5 zjgQ9>0BS-UA$0?gV@jwfXCI)xyzdJd82!vDupf_kihWFXMJi8fgr0E$9MQ;DS1+nY z7CxyFXb5GqWE{#vQdEsBl(W|QWPLWCd5gXqTiYE&wqKOe$UF0To}nu#5;;4~_WmoH z6^{&&9s<%sjP#H~dPpTbq>&!-kRB4GhrFbRVn`3^q=yXBLni4VKk1=tq=zihLqXC* zHt8XU^iYWOPRp<~|>mMInmQ(fY}_IV(wV3s#EamaH_ztymd~TeBA_Zo|q_+?JK2xE=O98MkK@ zD1Mbyrnn=kN^xhjs4{+oy+m<_mR-i`YAuf9HCkB4{(D|S#+vOlW$c;l^-;Xh>!)~= zHygzdycWd|y#b0Jd4n=W@5QFLTsB7M>BRD*Cdh_%p5uQ7F-%8mFMWr?7`9+VFl@<+ zV%UnMVAz@!!>|oQKLYdiJcjL9Du(UZ3mCr2D$09DSS1Yq#HwJ}8T|#0xvGv~S5^bV zZmcGT-C1o6GguuAC$qX3PSPCUnBNeFYcx6YanFktgE_@kjro*!gm3hszkzx5$h)Du z0>g)1FNTl2F~Biz=>2%hLH?{aF7$x6VJM7*aWENX!(vzo8_XLV6SrenTe#av+j#H-E67E#=sEvC2yTS9S5wv^&l>=TOH zuw@jtWy>jU%~nv{j(tjTd$y9|SG`Zk81tA@#+b{eDchpyzcm>@$E5{ICzgWVvX4=tO4H=^*j1q{hoebf1p3q9~r1LjXxV>jgO3R#&~0b@fTyF z@v*VmSYxa;)*0)K&x{SmMq`t4%s643GR_!380U-&#wFv5am~1H+%SGIh3Pe8Ox-k0 z)AX5sGn-k!ENB)olg+|r5wob7Viq%to6no6<_l&Cv!q$dENzxCUo^{_<;?PC1+$`A z$*gQv@tc01-|r9lZNKBc?Z4x{>(Aj&@XHm@L>e;!jT1HWJ8Gdt?8G~x&F_KZL6i5# z@t}|Hz4p`SFB^^NESk#=D9e@Q5cGWFSq8Rejb{ynJhwcz(CfpI4rG@j9rTV)>E|K8 z9PgknGy*MuDID>yf=W16KMJ*RynY<&kmavSmj5NP{PoE4*C)%LMwY(;S^kD(`5Tet zf0-Aw9@mggr3qA; zF;tF0D#sjDj(I5Og(&B#l=J$O^M>T%G|n71YP#m5K3o&ztZ+rh8QuQ>x)uND?J=|M zUu!eTJz%iy`gMtZE&7}QRI+9{)U%Bh_ykz-9QThy^}=+k6rfyX_a^bYj`YRMY4 zWI-(%EfD%&p?`FC)!I%^JJI^Jua>VCIFV5aJ(pu`1#ZcANieGw`GQa6im!MU$@C!Q zIG`c)$rgG7*7Fv6 zI@XKUix6W~vTEUX>RNTdwi;Lsz_FTIO(A5pv|2(erBYiyXYzMakw@xuq(R4&r?8N$ z4ZeY2!5X@OpPO`Ti={`+=i+t%WykPyCQ3e9DabdVY#V-dXUSFGi}z9-J{zSA@v|(8 zFa@mLgs5-J^Pq>Q#4EX! z#3$cp*Z5c@Xw4O_crdSx2nrSnupQlCSw8xu10e=8(x!s2wF+ ziLxztT{GFpDCty`qQ}BV^0BU~9ES3-DDT1h@! zlst}OjiLXh@MK<`ZF)lBA;-L7*e zPvqNLiGTU&8g*0xB(SnL(x?|1)4d#FnXSGywtCq+@>^-x#*?f@ zRwF2ArCZIR5cQFw)<|n4q)>a$?8)eHgQdl2F?eJv+2gG?7J4GqYgQ-lSe>md*i+uH zx`AoEX}t;Ate#dMu&jPoKkRk=t$`404Yr0r*cxgLg&fu}YXl@%qpS(=w3T7a#_O1i zdP6={!10P2W%bZNE1u4k!}`Gb0CHxX zaTc9%5frnQ;CV}CX)!zpg=rMlp|A;sLo%P~L%ksXdmh8sER8n`RMdE#t(wH-`*4!z zeKxU>i}*{Js|K`JFKe$p?O}VeDqB@a(-om(;vi4t7^y`cAN6Fveq=xDNH&wMq!|4| za}VeXgRq^9#4+han2Mu`g|G}(<9K2l?1ud~qBsU;-~x^*eu3NYkf}I2wOA}m!0~B5 zmduLd2(>(`%4*{nwF!FX?f!a{iW-w+3(AXOUMms9MC&;WpR-VVTlr9va@40u7$#Xb zR1@Dcz zb}`?{&+xm7qa-WUl{U)T$^>PZvR65$JXGV<6t%Ycsyax`P*7C3k`?~tx_s#Zg@*VO0 zf}Urhzx?A79F{$nk_>&tDJ=Gw$hM5-mq!u`pOCyn@)F7GB8fy2i6pwnb3~pa@|=t0 zBa)9uJ{QSPBtMb-E|NqfiAa)*6d+Q7NC6iqNTeWsPk)lM3x=0F<6e1}uQjAD3BE?*!IFaH+io3}3M4l(|yo;m~NhOl% zA}eX^ z6(Ut!q$-iBM5?+-H6qoBRCAH)M5+_1?jkja)F4vBMQReMNu;KW)FM)gNG%tsO{6xF z+AdO;NL?azT_lZ28j&;?X+Wd_kp?c(h)5$Mja*#41yCGM^evo(;1(dbg~dI%TX1)m z;O-8Kgy7EN?(Xgqd~sM{ad&qJ5a989Uw!rd?^X5GJ$<`tX6n|=R8RNmb1AZJO2{SNA7VhsX+ z0f_3E(tz^BLfXOK0sUbpE}$*35G?$20C`x{H`YFJ2~2!x)56Fo0BZ!81{Yu6lpQp~ zbWH|A5BE6)n1n@e1Fpm;H6nv7|Aq#QYGG?*PXO~I5G zbi~9O2u1<0>6uc2(!|W$!3=rxa0bfyIdMUx$gMQK8 z0oa6BQr1Jop%~hdrdg4d)b-h5Z`{Wyu!WeQ3kX$=^UKmEfH2&aqJBo46JtrtG$GQK zsy+>Dj=S{36dA{=$xSaO6*RKQv`>V!#DjBxAN!P2susAihm z%1lSe}gOYeu!R@H)J3-w&JK`YW#f;I>|(gG~zf7aoGB- z_lwXGcle}^0aw;IZ2?4Pfe#@6C(XX|U3-#4j6zk4l|zO#nqszqf=!Awfr52VJ28JX zBcq9n*~Y;Sy8gSAjk%aT*|eyR{X}=H;a(p`_ER&Z%TvB3(G>oqBv|YzrWRzT_&?W%tx@I^IZ^`SiuA`T`9;?c zmf!EtY-uu1;>UhgC~FBo)1qBQ_8gWH!Kb#Z9O0HsX0AU+tU*F?`RycXz>+H)S+)ve^oG&UEb)793rIeL5Y z;U0!&4wr{n#M>Au>dGrO9OUDJEy!K=h=ArrmD;jdxBB~Z+Hk=Qw3$gw?w3>5ylNkU zM@8?4R<)-j{eM(q2Ezbu%AI?be@;X)Q3!O>Qd~Bm zm)KTf${M*B>Eyc!8Y|WWj-TicaDUcmyciNV=*PT0-or&*<*PMc=Z9^r`djBq*Ol_5 z@IO_X4kBGS-3nqqT^)=VfpWI&JfRpn4x4ZHr0DlKy{X$@8@mi_2$omyY;cT$tB+Qw*ALoJcFX?t&Hcg_mU_6Q_B>+uz( zM6rK?N9ujI*7@jWO5RjO)ECQAzlI&YXjYjwe#(bLNV7rQjx^Z7dem*<-fdjE0lND# z7ZG9qzK-gSbTlvGr}$7?zaHEA52)}bk9Mr6Eb27(QBDY3eae`kYAqC1KJIt%nJk6NUE_k9}5g}4RyL|LyB{Ij`BD!ia1F{?F?Ep41w&glIO#oJ`TYsC#rujgYRf;g^jS0 z=vB4U?{$>6bq1SaY{+#jb5(P(gme83KQt+wx;WYG>~`(*PqR$J9(LiYU}|9*;2#nn z;~XDVxR&FRx*5? z4|OD)O4Ny0G7i#2%NQDiKEqPiYmP?+NrE+HMs3bh<6yW0WA(Y3hgS0nAE3i4V2&I7bVDOC^4@RsVG&85xw@QIjfcyH{; zz8sPqhBBJaKyw3|GJa&IVYcFVe*RL8Sq-ywnSM#YAZr^P(Cd00qO9XVnf2@z_rk|0 zQ!LDD52;}yq*T93-=oqDxiK3ttFR}rj9GxtO{eSJ`TN>E!{A;nj|S22G*zM14A~@T zQl7awQ%tD4s#6~NRR%GnjRPZv$Nb5BwYeC;zMMcIzXM5VjVf7OocQUxr$;T9#Vc zTAo_UT8>)AT7g>fOD{tULrp^uLq$V}%}B>O$E(Ymt+`9&EzGU>EtM@uVtJ=ZF8%zG zOqNvn8jJ&+_h)Z7Z`gIDTM2y#*ED+1oxP!!A$Rg0V5zboLKI5Wlc;a+ReJXy8^(|W zN7j{&hNY!L+xT(qZHAAI%{(h+-HT}4#6IMU9E*&L0)NeGC2K8eHQ&W6E;g4p+c%#! zEqYOVqkH9hCwdust9tEv&w7b_rvmu`JAQWr0)GPoe|~;gil|ynKdTEqYcjE2n_mIon_8dOSl|;nsT=8PTEnkHs!Z+?toqkzZ`hld;bO4DbV{GDKPW8 zI9YqJbaMuK{{z_3)&IJ>Zgo-bu>w5px;J}{@SX2Af3y7A;$QEuD74bU{l0KCKSLC& zI#PD3=2Xr*pLwi+T2ib!R(3Y$bj-`lbC>y~kUsmz>X6;pz#WoRt-w{%aZ^0oe{^*F zgHdqKYXN_M+|`_?A&X~H&mx;`Lwl1!Y@!?I?#bICvSEHHAct|1?4Z_VfajRVC5DeW zGhveUpwVUMas9EE=Ooi*k`MRCRUT1Z(6nk^W?qSC+mERr=g@4_J;Xg!%8+d2J>)%f z%3!1rq|k^U1B4_5f0A|lb?kMlSJr>>e+~cAK#yj7?|T=N;qMWR>5=^K`C%1T$ey)n ztZ^IYMZG%e)(9Y{9;X=7tJ$WC!OiyoAZ(|(zY*y#uG61qy3@lL3j8RJ1bop(m9ukJ zsHAyK$H@4Tjt8Qt#|+NNef$S(7BCEb$&L8QO3&KIKIcS1W|QIvIJT(R2-v?IM1y~f zTQq6Rsl<_doYPZ;Aa~xomM{^`T+#CroTmiNnam&Lqyn z$|TIh%_PiZ{rH=sN%e^>fZ&EE~ zW&LM_XSz?Mp8)-#zYBf=0Dx~alchU-RCIIz-s)B|K>xRI0N&PL$X~Qyj~_^wH2?Sy zcy;$azM*HAxTqe@%DTDD>(0*~L{JYTY}3~1RASf+^41yfGonS3Z}VMs{T2B~6BA*w z-AaQY6ppoB$W5sr8y~{HC&eQZlWel9#iL-rJUm9Y`7AHF~gzd@bH4-A%zYrnpPerg@%_Gx~DP<|XXMgg%;Zoyb3-w5ZgiUR_>rT<%S$ zIIoGSCOR+0p&_rPIxoke$v9_LUSwUQQ$b=~N>Ch9fni-pP$W^2G3V;mke+w09y#x8 z9p3(vQGIOA`RGbHbTStq&t=$g7ZmAtruN`%(8;!0Vov0nPs~aV*9o4TL4Xhg#tsO0>8(lC- zDlz0JF@ZfWfxYNkW*k^v3vAL2YU<#^%y53T9xH=XkyD0o%2$SjBjKX9;}`}c2K zI(l|Z-X`kD;4#`WqJMqi+`>;4JBIm~z@Il-c3u8kMipDVeN-u}JbqLqNxiu|zr5VK zyuCcnx|~Q|)=g8~`WHbdT$wS47OFB=IjwbhdhveQ^8nsjbKs?U2PO1M1I~E&8LwilW_kn!@}BF%1+*@CWDDB23Hg&1BkRW6wura z6jQ>L1z_lTgi(#?dE}zaZ$}U^?RF`6pQ*ap7LT><`n}-9^*l5%)3BIkDEi7p|G-moOf=XUO@GO^FH5s~b;q^{)F+is*j+s-0M_qxyp9n3{D zLS*N%s!l&1kKLCrO&B6CrS5A@RNlLG%=aFPJm>_r)r3|iK?`n6T~ZoSq3u)c4iJe4 z!Wve);B)V}6uIEVpA_*={I9>cjUw)`MvZL;{6wi)Vb(sKwl%=B#Md2Z-IMnPj0B8) z4b9lQqU}=k?#CsPDB41%DvDCT7d6{dr7DqAOj7{tH5~tNBUIQ`{E09P}C1Si7Z35<`t4ob4HO^1AntBa^|Ykm)VMh*B9B!kJK}g6OOcAA*n>+^2PUS z)zK%J6lzIXMadfEMI6^0bI52ql%vxmuq?Wl=PBdOo1!%5ShFyBWf43PoknRz?e|eR z))L>-iPL`Ex3D>^&|#VTw*Flii%Wi$M&HHBH8Ijc;~H{V-_|^|O0R1|g05?FpNShT z{?**Zhjh>iIBsy`T$kyzgH-ohvY$Ju%WlX>O=9P}j5*OgE@o7J_AbwNO!7e~TjJPj zt1EUMTSVNrG0scB@;|BjAIrz@FFvcQm&{w0k2Fu^64^bMCO7*gj&W0mAG7vJ7sEw4 zedd_M3nj3M5|v-%^aXtNwp4`}RMFRwju$s|5Q8%#(S~o6f!rdyk|CZ>YP^o(iH)VAnlqmkS>*o^Ca6f`nGn>YuB2@Vqg)< z8om0v+w9%Ubg6Kx(a%qJsl=Qo=^PpaNTWc!V4hI9931gM33k&r7(7cv(b$Bq@-*@+ zj!21PLg;_l4N&htAuo+~_i3<>t&KO=5WD6Gl1bzI%h?k@E={iuuG#_S^TUc2gG~|3 z8R#0SOX-j6t1Z6~)K*(Eq}R%E;7({4>(mR#eASGo(5kP-UZ~GHr{Q(VfLZ*3cv0wq zITQMgJjG~r7~x*IX^?c_dQ^*`1Rr0xlLAKN>f15P`Gm3Jo5pcp_KPtA!YW^sz!R4x z5pX$n+BADm`3dHE%+0FnKIDklrrwRb%VN#8Di=Kyn2Gt+EANUGO=7RzQaLk=UH#p= zE#`!vYmJ?2;&8{j6<^|KOS10R;Q`d`gy3cE$sVQvYrD$c8#(kyT zE}G09_<&?mx-xrahGJ3k>}Em%Tq7kY=#1^k8akYVlog>?Z6vtWFi@`2kMTc@vQBlW z2tSNE_jjpiJ;*qf1H#6M&R?&wr$&M)2OyYnh`> zzKibaG8n|vt(cp}8XeH|m^a6=g*Q(x5rSm@VX?k+U4(GJW`iwz7iFVnEmfm%cWA#g zm^RlqY%d`9$UL{Bxz)+QOnHvF;mt}@kNXtdm>U+5YC}eR61+$ zgg9VVxvFRsCrLM}&z4Ka#8|~ey2&*m;a450W^vc4@Q;&w%JC09of)_>kB#|8RAH~g ze2!QkVNEhd=Yge$6CoBbMm+wu6ljF6-OGBP>m6t3@_}1l5>tM6Ozd9iv%`tYBW>y< zJ;8#w2bgozxbQu_4uN{QueP5Iux|VcI3Tck{i)eqq}d(W%T)25HDx+H$Fe_4>lPt7 zq!c4*u45!KZ9ww9pjYq|Ay*dbUCUnsh_J*zHQefJCyzB?bS3ccw}56#-&N-NxVG9q zOpiFvQ0*psRTg`<woMaaHzD1V_FCwj>*wE$PPF^BD!cd->0|jJachm4+we_FuS!C&?d#M#)%b{zFzg7D zOxIKEuX{+>cQQ!Fgq zO6f-Q6vW@#!7E>+Oqo;-(Y7!vmrEX@D@Qu1Os5MiFEv(|o1atTNV-eew?uVpq+++V zb7aBQtAt_NXTjYm6J)nVKJh;BP9CSV?a&Eusp{hD;wodjIVEo=0ufaqBeqX>{=z|H zNjB`kyQhKm$NHOL{QSx?i4l093tuU_f=5U+;s6v~Xl~YBX%pzuL|LcIi65bFLEbPl z|8(%>GAhiA7xUQ*tKbp*6qfV4_(Ul5;$g$w@_>I)q_V!zwdQ%#&)kF&uHO}mZ+}1? z23(WJ_ZFMJDuhrU<%s14=SvdY_k)XKF?aBKVY4*dWG^x_#Q>FZVUD7O+ zJmwDU)civ2g(}mFlM*s0H4rtX^;Y{TVpdfERhDVSIunzr(_f)9I#}ePIHPiBQ*rOk zQjA&aKNqR?%~}iPZ)PMfBdU~17YJpP7T1b*1%`J8v7VKjmXyZ7biVMLEnTc!sG0#= zx-#m|E>15>BO1oFCDgM*vqH<#ZwhZH)IGA@vx^BPsVuPOT@73e3WyE_4g|{gP95Eq z?9L=b`V$TVu#N@u(P0DjL{E!cjZHN+aW)Bm$}0~~Ts;;{JyH=a&Ab%05sz#yj{4Ky z_-}~B9Z-N>@THuQD71y+8Kvq`rK=H+CVs7IY`c$@M9I%wiAE2hNSH+R4}6wzGpZBm z985m0HANi)S2FF5f}G*>sSa3;nGEMH5$-JJYSThkt^XztjZW=au#5OH_2h?N6F#EK z&r%z@Ch(V`w5K_Vkxgt1u>K}F5MT|^U^7S+pCTK*uU{@~p2qpsun<7C(QIE!HN$s~ zd@g$%@DTB!`E=MRa5vR@kJj28-$XCcK`>qY(Q@Hiqm9)egyImw8YM4tH95ztDr})M zoyJ)!Eq*wH;s9?0esirB2gC}z(0o+h&GPQ*ZSZK5pxs}Z?YxQH6@zv)?0teJJk0=zTplINCVT}2{_Jk7Km z%umlJWA<7>p*}|HR@^k`omIYELM+m>s(;QTQ9-?yFgN7FA6lh|UIVXx{=QpQx#K5C z!&f1?zCeqU@|kK%dT@lTKF9u@sqfM+6*IP_%&LkQ|6;P&G_np>zsb*j)uwLdB&OQv z+UP8!z(wy=w+)N~K9aSD@o+t@N{M$~O>%_9CH>XEMuDo&QF9~(BoT-Iv<|+x|*C{Rf~mK{8P+EGI4Uvgl)|vRUo%MUo;itZQrM_ST!( z?ux3Sv2V)cH7N^`1VEEcmbqQcs?0zdZ0(vl{=~XwZBmtbQ8d|3EXPl)ieN<0UZOK5 z*galLM^BOmr-En6x9k7!oj+#>!_R6f?+(@mw_YN-R4++B$xm5dL|Kj`J9RA$875js@g#XI9vK)7*}t=0#pIgT zaZJPuf0@Z-V;`bB&(VL`SA*fpn!E{jlRLoWhZ}mRzR(ZNwd$*nsO(#ByRX~XGD-Pe zlKnwZ06V=HF3wSYG0s-$G%gwn=nX7Sj7R(ZDgp7rLc-@=a z|9q#bEzQqO8`wDH4&A%lQ&}7JST&Rw_t-fUjp48P37?&zpT!=@08_eBco#!YMNe7$ z?fgYyqda;_?C)dU5uYchy?)+q@u*?A4C?bQ1RIlGxDm4;z*G&F@y%ydo}DX4E}C17 z8>F*5OAj5>qqhSBf-xQXio){fgzYVdf?<-?0EAFXh*r{jgsdj?q zy1$lijGNb3R@I{G~Wo%K9T5o^Ep}MkuP4F7{jWBkTFhMZ{rTbHOz9uuY1U^d+UbK z`LN>;H*RqI^dI)=Z||KP){MXJNJZmc`S51fgdAiTex11VapB*O86;tWRY z%JAZDkbX&q@b_grt*hIL6%gTk$IG;b9a*^(4*nZ$j`uw2Uv?3Ma2zsnd%x_<}JzX~A5dCsNuR2ADkbYcn*+QxDA z&$p^)nD0-iWbf2PZ+Zc4eYYD$i4@ugT!|~e_qn+5X4RRYx@@3^F-w~v{+=fNo<$wi z>^+|WX^py#r|`wG*Ab&D;-n#MJN(Rfs*_H3%&={G2?Amv z8^%mc(9J4C=7EO!sw=q}x!+IN^e(#X@AG(~0=+)^1<+bXgA!;RBUDEa9+ajNHogmB zReeX^?}&_5l@yc)7dFl=W?Bqd8?c}B*0Z?`gW3mx$ITez3$$!bz~g&iV(wV6#NJM6-xV8UpjptTaj7LW|5}(wr zQk=PD-}o3X-qFs&n&^{V_-i!6Dv2fW-TT0pT_*+KnMv?Ow-2tS!k%lPDtsg2GKHuw z3(E~$9@ge#RzyB4_MjPNDU9(Z7`i|6<1p>Z9t7p(#rp69shTI`Y9A#Xb6#e?0F=`8 zb)5_ZO>O8fAgr)*8_!kr}}co zcfzUZ{Ln~wV1hb2bwwGsHe+bQ{57|B)vtv42ySip;Sp;%1r7QwQx0V6iY4xX>WG_p zYksV(vJ^0Z+{P$maf&oBUgWLNMyk=gtWhh^%#E%A6&0*};9*?fV(o} z6IEt!4@uw~h$u|a=^BI=UWD(((ulUmVsULNC>|u8(}$t3j*?lM#;uP0Erw7`k98pV zL>#H1Y1L=M+1`)O-<4@bcx1hVhyngakc3gP!89si2d`_5$-yGhGo=%G!}%-j(MLPv zMtwv(i@Y=2Mt$rmjlhXF4WF^9bd?;hnv|2adE8y()nl}_K;1P)kA~Pb#q*t4^wGf8 zc0v3I%@9_{hqD}Uok?(2_eeYXNfW8lZjmwVjbF4@zjMXZo_v!W&+!J3$IL$%9JL(61W!B- zRiGmhi5{${W7DR|e&28SBMV{nndR8w^{7uC80g-Mc_*Gz)0TNl(-|pzo>RZB7`=34XZ;E_`Ui)-O*rO z&2E_cnG&pl^#_*wVcA{j`durDZ`m>Ds$Rrv!^C@$#2XJ|6N_*u{3V%^Tq1bo?t$N3e8r48Qr0p57l&t62OqqH%`UY>lf_?EL^>pfl`fc2YbT^MX#2P|NE@z?G z4B+S~M0E|C%(i{`Jo1+Cgf*tfAv;X(r$_{`xi8uHL!Aw4UU0!bE?KCwz&=1y7s_~w z;q>|H8gL&iF$y{*oJela7Me(MSsG$U7^5+$PNZMrtOnW8hzL^W6hPi(SQNtFSF6OO z!w8Z^=4vaCtG$(20q~#dM8g;Jew$NIFf4=mCd?;hbj-r+r> z&TwmG_Xtuq3Wkqkk#l}G#v(^E91szETN$a=6U~`P3MQ5lWPWv5aZxqwImx)GJR&j9 zaOf+~5y;a%TM!()Q}GY&%s9SbT3bl6VrV()gpgT|n;woP9@=U=Hq304?!GFRHw@*- z)3JNltGN*Vwa-Io|LqNt(*Zx7pz@j~&RpQKwi65vQJBQk4S23Dnsz#za{00EOsF*! zFZG>T;-ry}BksH2DBOtLIJv-xp98xmsx)1DW}syE(ah)OSqZzZNn@WL7}uZC+jW(1 zbmyY@pP6VvO=vCxoIfWXGMYY^HQo^{dy{f>^OX$Y%y|-X2nt7EOqE?BS$75ytSIe- zx>$Ec5IE!yg_d5u>$WrpIV~6a38{zwN*+>=o+ylBCPb5mH)@d^WI_Wk93GkH^HJuXc0@_R zNK==syahgTdyb@#FaC=wLJolOR25^EmL@kPhMT-%*N|;G>Y%O#U`}XpyabhUPoAt)+y6|NlN>eS2g`A_SXZ! zV?mj#^Pj6dm*5=7oXvE_HpQ#I3+*=AF*)vBN{}}0vGZSrL)07lVN=XMsy8urk(k7*H$|cD&tC;98}8njpjFgyRV8s%DG|0^*I=lu zXtM!t{T*xFB#cw?=D~hlN`8?@4`m)rh;jYXu?y7y$|~XV#e2fo@}o&^8+MCLxkMT6 z=(wzF&z8QzxzP|u$a9ti-8p&`$ER~;33QPM?w!E6XDsqxwLpk~xKnnoMr|UlF`?da zq)EnTbK;pdzP;?rO8t|D68yTX5Cm^`N&cHJ*LBMEqw9Loul2ZTLZPu^7X@x=nt7hR z%s&0(x3tynr?;mr`Nfm3y9h|T2+Lp$*EsS+GRayZ=g+es$&~1KWo2+dMF@X80k~jH zoJ1dHcZNfZMBn7yG!ZV#mlmx-?8WWQINb@YEj;Qvlz<(7m~!b)&)q%RA?GF!c@?LA z?n3R$O!bjR1i(^(C|=X@sdZWx@; zr~nK0nD6Gj4axb;p30Z)&X^6^O~DA$6ZFXd;qpfSE~lq5S||7eGiz@o!zF-_CzvBn zH8n7^uN_QV85)(yzxx#`sbBtZ2p8Uqni%tEUG|HFkEq$8kyC2?UB-mg0SPW;WtL+2tZf&n zRa~HpE-rQRQ}LQ)r^~}=mm1o`@n{86k|?$#Ik$Y1N>wSKP>@(9Ct&uUTxPUJ9~$__ zzKPjsp!FjBd>y*AA?e&eRR(XXgDNi9?~^SFN0M7dlhfFJsBC3`t`@T{^Q_q-J!75b zvT==GOc#U%xF>U(gccWD9T)ovEXf6yLRUapW6HdjXZBTMNH7`>(1NCo?g!Z zE}L|2!!E)gc^TdJY{&~}#mvv>g4y%sqguwZzQjD54HWU%+67DZBVq}SS|!Vsz=zn2EZbf7ePq^?0>VlG;VAgAFtbq+Yd#^?z#-OrM4So^ z;`$ZD6%@o362ui8)bg2YB_QLhcY?lmqJnITm~2a*Y%4hK(mw9;JnoVt?lL>>(je|~ zJ?`=~?lK_m()iN%JB1Gdg%1sd4_>Pf(JJXjL{enL90bIi&xkoFh&i7Sd+;&+kSYFY zNc|;}`b$c-byH{lU^szeG=XC>k!(0Y^2hoJp~a;e)hM$i!|s*E>$h2LX8E9?Gl<~F zJpPS*0dMX1J0l~4KYi>$!B!~9v!CztXir6D7eh5_(W{I|m;VSh2K!pVKTnfzHB=jl zd1iY5WQQo>*7}QEe~?`;FjrF;*PLqN;P;noX=FqA60`3NXp+7=sIC}X^N5WVFx3(#aZX6(t? z&78CFcknZ-TzumP8G3OvR+;P%c)9@wTRh#A>&CmwqW6Zo%ewdGyS&;8=4okkCD+Gm z00*O8@0!jO(1}J{63YQ+TeQrW==B%MQSxg9N-x5$Xtg2WAQ1Lqtu@ibZhMO3BX!KX zd>{Z@;}oM*cfP8VgnnKIy64>~62*1PhwosOd%9%I8N0)AMG*Vo?#37UAnBGkT(R*L z|2HmS_rQ(-`9-+Sy2(`Z_n{9%c%1_#w=Q9*FZ!^>t?GK^TrrtrY-c=hX3R^GO#{C1jlzTKB*ihJESZa8S&j+6`5SS2{(3sGxkpyw{i1kQU@m7g^7+X17 z8C%&}sXf1Y(s)v6Vdg9O(D3YrKz=Oc9p|ko6(~h2btr`@8NDlg(y&vo)3FP()3P(N zv$@(F#!Ua7-k!dmE}u5ZYs!nxo5)-Ep)0!bgHN}XiEymS0>Tqd+wgji%nBt_&Yqzw!MJOcs)Y(Iuh-cG?zmQJ33 zI-WM3x}FxEKmU$hf*hqY@l(D~Z?CrAww60JZ66PDgxO#&0IJ>eI$F^fB#BpHX+m>N z3HQZI*_6@5+Y%pW791D0S}saO z4d&3?xdQNTNg7RP{yTV(1jQ=vntXl46Bm^D4?Y)wB`+RdX|7-XkNYAvzk)9ncpjmM zoI2U_d`qarB*}xgw?>na2SqJa|5bu~DJ`VGDWv}&a{ZXi^k){DwmNafY9)>(8aw!)1AMp|?|9WvjpBX>RYm9)_e z=VyjF;GJS=d&~=`I!OE2r^ydPg}EVG$rExIWf+(qkA+5d6}`-`1V;V z{aVkD*Bhi=x01{+GqV1-kasv-@~o^7`6@`fCrU#q!Gpf%lh}@HkM43D+m_W6nEcjP zjsJNG@4W>5&#+i8;q8tMef!A?_gK#YPKg$YL!G6USQ)hJz{}asCyHcMG5Oz7SQ+&D zAH_0*L$kaO$PN8OruMB*TpT5^WHhzGMU5U2%y?N+nS9F^+H}J5kxP+N7stgR-Cc6$akT( z`;#%yBED|?`yu?|cKyB?veEf)squ!6AK?4xb8`wxK^W^xhKe|Q)X*$@y12)5-&_B> z*Dq=1U8jzA3y*-TqSQI{H5kCBcnWF|15Y^k(3*9O@#!=C7TW7fJeb>o+@+Oq+opA+~QiS%B~ibW=B zyqZO0YP`CI?enCRcU%o>?RrJwFNZ(dNnezKYoh}da!o$PI)bW#$m8ctE|1W~r{;xSzIs#cwv5NYs( z$(y~6h8|ZSUC&kkT{D?qPy0Gf_frf!bs$OWhs1Y>o7sr!|1s~=gL?)xRNUCNy@%a z0Hu3ZBsKqX;m4n0DoDyQWHPj3w81n*UwGg%wV%9kJh@tN^pJ1@>Jxv==g_IWl&MaA zd$X8KFLN}ZTTP8v#dPH7#=rdoo9k*)?)*Q>v7&r`bBWQ)?Ej7umaOOICnbAe`tm({ z)0vg^%IsWo$$M;*k9o|>vQ=@ORF|yno6|F*U+3@|k*`ma4{94_+Q|el-mm#D=Ts59 z;#JMb%D-Iet|UVCS#_}JrOf!fN#p-ARP{nl8h0hoXnr z{jIBx6|2-=Xsz7+6Di)$QZA%k`SkyvEZ%M8|9z+*+3rjH+B@V0O?vQq3e=x)JzA2w zgwA7~QnHEqYl}J7(v2n>t6R*qxwIOp2&;IYIaO^?ew*&5KRT9cri}IW%{aQUl|>q$ zrt$W{`l>x>71R!T1|^1OL6K~VnwGp*oonw>CYT4IHrh>6sBRAG>Tc+A+v-v;$9VA` zy1TsD`*~CzJ6c(B9KEVUlpIHeqtS`bLZhS1oQm+p zosCWsN=XXuWsLCGK8!S@wabi!!rk>yEh~BNq{+v&5=xa|r-on_mr9=P!}nJ=qMflG zC;Y~t&JEeG;mz)ZTWcOnQ)Q9@;SqWk3+3iB59gh1*^l&IN@m=z{JLNKy5BUW>}FKd zM5xAlaA2*ekXgqSvHY@>P93xP$tIw5O&%)04PLihlY{KG(IvO7wPPvHzv0}yyy&35 z((9t$G`bA@%hEwTY1HU{($|UpYb8nX%GX4Yq-euI_qL@IO;^%Hp#CacHN^7{4*mt` zM614CXkot;3G9<7wrPN_6A2>4^($P8sD*vboD zSDv62qRmz;RKz+IZqeH@p_ z#n6)R5~=dXs7DlOwj7Qe$~`IL)kgo8^MkzN*;=Tw3PB{TPQpLnPFIrZOtwxuNxoU~ z%vH!cXS&R}{2QG5h@YY95m+!WkvUvoK8mc6{gayQYz?n{eutbyf|Kc|G(a~r^_kI|`#bdh zTP1_3Tq*NF9f7e<{_M}&&cY*+5z|rax0VfoETc-=ArF$E4-4)`cFn1&F}3N1BQg$J zPzsfa06dERu0sP&E4qH5R2_bjzUfkZpnjq`7AS6951*2DCR`^ii|Kc`d)K=M0v=4# zz-vt1%GJtk&jYJ>`IXTnzRtvh7Sypr2q0NoN>B!1e^Tw)^R;G4GD<@0I_;J7Ipfe~ zj=!o#8M)~P{?L3rN`l(=AwsOE@F9wVKQ!!AgsM>|rq2;h8q%jji+b_KjV#NXZR%~P zOD9$Fp2MJe19q@al7ms;V_N|1>#ap$YY?5 zNN4v4OW&vlYlhR(k`S*;W8KlFEx+d|I*#+VkaJ_yLs_r7cZkrkDJIgD?4${|BikW4 z2(wa7Yx5P?hc~2SVCyL=wbA83Wxi3sR$e$RQpLS9$VYqA(3i)@SB#09(a5rc5v$+^ zl&QIiDj$-Pb4Q&D3+-t;1Fie3I{iaAs^7x<<%>#bCa zf34rkxTy<$`Atn>LcXWNV#~;>SWUP>krHl~!2UGyIApdd{8$YlzhQv!(T`t9mc_&} zj{_fqEti(Xhrr9?*U}M0ZTgw;@BnzJHk$X*lAw;Np8PHw$%K@5V}&JZpl3D<48}ek z;0bncHZtk*)|iHqnKL$s#ao1;Sw0h}T#)00A5O-^#^xMF)Q7*^=oO9V~}y- z%A(<$;;!s<;WxR1+2C9A z_8_JL&aR|&g^NP^GFjjD^y<99TM}JCa{IZ2Y15vu- z7zJW^OKW#)&ay;aGPh5NMG7)m@0l2b%YrF>RLodY$h@auppdYEqz~jaSu*xn66=II z>cm3Hsj3uDup&7NQKd6Ei=(B@mZLby)h&^ie`ks^7vjd3-vYcbcv714?4&rBW17hi zX3!d8$`qK3ao=V5+0NvwA?J;JJUM6u{ZfqH99`*i#RZ2nDxu~x3@Rxx1v^p#>5?~K zSoWO#geOndGVjdF%B(lDW|3J+;!hyu^6HD@$Grux>dWg)z1ISa}ir3RwekRnjtIOUz(E2sMEo%FoUU|t4dH> zeQ+R5WGb-?cp$@l`_d-}03-$@PX*fL63Zwx{j{TL1>?eAO{EG+WWM(SYcwV5iDu@E z$F;#T^&vDS*ySuq3*Wx?iPMub%w~yugqhy54d#|lXbwDUO1Gm$gdD(J*h1T6)~J#} zqyQ8`dAF(buP;|5+~TqTEGu$lzYQl?1`=Vf1;v9WDPb=O6=Nn%w&`yn;LHO zta4OyV9ho0JNyGl8pQb+xMopPJ&D|=s^MV#{D;^}#8(OShHZjvmSGGjN%3{M8Mccl z9E8@IX_j?>~5*Dv%Sn9IsK|6S# z=9a*kMZB#SjwvA3aqOkX@OxGJ61Z~1sQDs1lJ}D#fiQ~O#9L0!=!{Gu9-mu8-#>$LF0)_AuZRM zXHm&A#e&0CGqV)#S_(I0jWyhQ+4={-E8HU;zt(n(Ip#SQ{G-LsJ_QzY!H{n0CLvjJ ziGW)zAI8Cn{(~)A~#I zc#Y^GbZsI@!+^>rYWDsOG}M@$u2k#=R6k$wfmJc7+D zgO_y(EC{-RM;-Dfs4^XJ%eKGpUhhfMyeYwEY0(%r5 z1i)GAsbf-_H>+`wdogiqg;c$yk$P+2c913`>d00ac&GVbE&AqixEk`H6ahO3!WK5GMPHN zzImLtKDVAeCJ<6N`~7Bz{we%h<%b|&wpbi#tRMu&&(xmK2$?V1(7o}l zxxVM-=6%f-SCP*KY81>9WX5dY7%^3FX`z&$%_6cqI|#(+2sWauV4Z(qgUW@N8pza< zwEo?Q;pBY<=RC3vS{>q2AZbVRdan^}1^YbGA*w54bD&^Hh7n5z_dLoW+9e8m=ePCG zC#WZ~4g~IaJP0JO3@{83qYCYg70uaH1b*ishoiICK zXrY%OL7zjB;9KHQ$e)qFnEQtH?VvNHQ>sI%6JyzX5QY$< z9a3f@m82EYk7*Xg^??=V7 zvq+}sIhYgV7K6($qG*rAaK&&3d$R&2Tyj+{bS#J2%MMof2R zkT8bd+ed+W3HUzS;ghVBjVTYQE~)N*ob!@04esLRneKhdiz-iDpAxxk`vp_q_!QhW z?FSlV^~8GG7VZ|77Gdvq_XgJwCny_O-Q?d5U$qmhlKC>-dtOJKq;AxA@psuLk1Y}U z(zYKj2!6LcDfpQRUpn|w-6k@a7Ffup-d&ZMi6-E`-%(!D^RK%`iEa-WT@aNL8n4jTic<2|Cxj)w;w|U0(g7{lhCyf!vP^fB?<@aVM1RIBphTvt) zYx!4CGLJDl0`eo28`ztP8g((|=n3up6x`xF0A8~0_WfZ(k25kM#49z_w*$4?f<^({ z-y(Xvm-lFS$P$Lv$9OtZJ0!NJU$&jijiH7WxS9^lL^Ql2eiHl)Fbpx>uBk+BBb2J@UCq8C_Cjv|zLvRMj#mylaUb#fP^rd) z)&4tLsfDd-nq@ys^V(i!Tj$h@8e+R|)*;WTI?7SqqTMOa9msZ;6xnPlIhtabGEy_r zpuJG?C4{_wVkW0+a@u;QzGU(Ry!&&l?^}B1XlW`4i(|jri^bWkS!iA13`T z#B~uKHhGVekB^2FQ2YY1uH`Ku!(Pqv=4&EfZkAo^8^L=6U-I@$;STccgKM$twd3;W zXv#WKnea#yn#XNuT$q;Fi^^aQal$EVQ)yrRoD0Z=B-}5cOEoPG_$9iR(63%1RW6optV{WpKWE``ESn%YR zAyHD1Qc)OvCV!;BtXyzkcJG@1B48+tk~Zggb*hquy25>toZ=(_<)v$WlUON1847mxHW#a35x5A<0MA zVwhlJTc&hr&%GhhjUGtjhx5r=SLY_NjnGfUUEI{`?dMfLTRzpruWaLps_@b`F(U5d5<#hU+^Bcf6o#NOLs0m;+z?c0h+KNeFD2pW z1KpFO%42-)Jy7Om{Kr`)?M}P&5V`!2-_Hc$gaqNV1mPbE!oL!PlM7HCv9LYt!vDfq?L_9)Ntz&B~rQ{wF* zmg*Aaz^qvn>v9*+tyN&n#v+(1b5#SPnAnyxrBCm3^#*!b04SHeDg?C4Vx=u8Z6PN5 z7EHyc-B!v9D?@toQcP3nVt%q`GF*Yl>P;5mZ8gPn5SQdOl;aw36hyYQxpg- zZ0Y(gi-Rg3M6a=I2~6%JKEjhC*P7YNptG9uY>uQ5ERBCL(Pl1;Oi@s0ty*df1*u_} z+^P4^`*O~!9@44cK0yV^x9(@Uc>HQvgAGX|H#G50u4lRleDP08y%`F}4Yyf-Am4L7 z5?Kzoou%h0Z$2t3cjNYP_tp2g^ zeb>?gEGne`9Z8T|8 zD$6+@GQKrW)W&ngEFKy&otgJ2;VbU6syf$Z($MX*`*JalRMOU>`yHO?RvULVfzxDE z8*NravbSordbJ*hQgv`%?L}oFM^8Sg_^bq1sE%Ev4Nh$WWte&-FRPMwFx#yf0i~+M z>%gIpUBT2=VbXfD&a>y)Nlqniw1;o0td@;Nxa>G~3H-SJ^+*lJ_{xEX1uYv!)+8c{ zJ~p{%?jqVgdJ)FUm&fGjg!KeJ@4zz-gXrYsN*Rw>^ONwjGg*P2Zh@{GHd#9JH0O9-fiZ@2diaHK zvgX#_>3$1x`QZ3oZ6tnVJHb+9`w$q|=eotY<+6p*^C{77RxN3(IwE5clpB5eGl%ZZ<%Rs==Mr4+cvrwL%hxr}jJLk#{>^YY8d#x$MlHc?)GIt>fNM z8FZkH`n;{&oVB%15E6@j**q_jD54Col@qUMeT{7c&#R@S85>dJ&5&86 zA$XzNFq(X>I|$hdA9l0fsz2wyPT!u!{scIBaT7e)pl_?qKbzqadpfE`3(tmctgp>I zn|@&=sLe8)dSRSg(UvVi)bFHC)||96oMLA4KD7r`iz0O-zv5tCjVnsQoPA#2wbf$u zwsKg@FKH0D;u~9Vl10CrQT0NU4QBl5!*1n`O@+l#a23ORVpXe&W+nEak_}b!Fa2)G z%1OqE!D|b&1qB=IX6-s}8#;zB!}CldX2T1mhg`1w&0>;E36=Zeso;;v9wX+(^H#3- zy4}ZSy*5nEAuGf1c&6bGRyL$wp{2=j)AKnth+dJlUsLDJE_u8HY>kz|lVFyY=u1Nx zrsI`+3uuQdHpF)fUU3gmtv!!p21#+V^Tjs&UJ8=BCiYeJ^O%=hOM|P%&GXGR+)I>; zYd$u@{2i+%Q20pzA%~Qgtam{^LqaB*)hzQOgi%qXW>WLYgmF?Hx~D^{4IOuDAC0)Q@hDY)>eD-`j`kBe?Ed9+Cax+k4$k>Lr#Q zFxPt5cA9U<+LEDLccoaRF(omj<0a#zEG0@MfwREbgo$pCIGy$H zxnB<(ymu1Kdd^}W}Q`?}eI42{I3WO9) zGk-i0R1Jh~qZg6ikOxF?YdUz`F}3gn@Jo<0P-dT52h?^T8;Mn5&lA`n{C&ZN)~R7c zT){L?cKFN{#mm37Q^?5hM5RJF9q zzNPK3@38NLc0fDh*JFM-B3S*#MDBR=QT^;H%-T#9Ccb^DSA2l zxk+PxsM?3;sN0fU@y=l}1SFJpxlx1l=O#UsfPnnA`)o~#gwIqv)IMS`Vre`Bb-vTW z&NX_89;o~gndluN(??7Vl|4i1fbap-$Hc)J6j@?Rj^FUXCF^`}x_Y&$O)?e`tpB zQSA!m%Q7zfknbN3Eta;Ah3dFej-ZdEmL?5q6h_vCPi{*HDaZVzXIV?n+ijG|V^oLY z6#^O~qrw-NSyUrbljOuPB*M3F&4rIr!!dNo+>T=h76)iNG}UbI!Zw7(_SS{PFiwTD z`mQrSv)?Nf@WyQ|_n$;&wwSbN{-nJ}Jx%L;Z#66X_Lm6#EnIA+hNrM zDi!f3JV@X=xVu9F~RY~-O*#8ii=EQg zNz&6M`9s5Q=7k=1Ds*x)Uev=p@WMEgk?~fJLr(jVOe%l$t5s{CXKu3@-E0~+)39~y ziW8CkaVUaaW0iDv!n5xOrGC3{E5(?WM@$NjNo^7R9d* z7D1%jxk=f1))a&*tX1UwZo<(}UjfQ0^2}4;8l5{w^viDlhxx#V&1#H+ota{r2}E)P z^5=X0F(%sLwlO5?BM9dHxScz{(cbzCeURfTlI08k5uKfz^8xbVU(m20;)>CBvhPve zOZ5P~8H=_c37|&?k_(4puPS+w$_KE1iZlN1GWA~QbWGXXy{BImtdCfNwXmPyDs#U< z;BP7NUM{l4xH(fY+rgaq+nh6b?6jA+Y_eEMD*>kU1*Y{z3rt$BXz(jTHW)Yu@eRKg3z<14myNP#3v!Jj_nYm7;53}m!YLA-)=d8V}7oFZD z?x9L9NBu;ehQRkbBoDP>TBgJYhqv)kruI^%Bx=p-1<)T8Y+Q(-E?HM3k}c4W|*~bB=;XNG`mq~-L zks4UK^$o4Vvdgt#2S>)`3mVba|PvIdujE!;h|MpVO z{#xmc=dov8;#h(kmT?*#VR@#CT_fU=*i7bJ)}MB;LlUPLGx|pNCthm$eWapIYeV1g zUO$;k8I5fM zUzy*BC`Jf;IT;eart(Cy)uxTSx;}3(-+$h(fsr0$K2!9OuUnF zKZB{eJ)uO3y8EFTM%n6}xuyGkj`m-xSH(eoPPEuhdO8EcXWZtn*Q)Mg7`&goOCHP4 z-R{Nx1;3*|J!B@y-@6%BCft^xx3;u67Qj1=RLlceN}^q1w59=*CdlX^Z<`X|8e%7v z7sISi$LW09y}WLUnKR==Y%SctC+`UOzJO~*e84VZPY{YOX%vq3S!gO^6XG8FZRh%=ShD_E^>Jyk9pPgt!*O%f z-hRDgO#9`;MHF#n%gupF@G{?d9dwoT41{+4IM~X)Qg3(2BJ4MZ*xYt<=ZF3-CQ3W1@72|~O?33oTLPQ=}ry_xPWQMh3b@9$l%n@_O( zT*cN-hSU?S8Mu8Mq}Id|Lzbe>f^4{lajW$An`e$SGh%!9bR9+OP!edr-gUuQSd2;o zo9q=l6ifKYv|mp>w9;aaD0W_Hdvm>om-qoMku2;-Y2`MATXj!%>RRuk?IBth0xx=Z z2Is|mfY&~+gV)wfg4bTqO^e-eE5Og}o`aWYzUO_%U1JaL!1c!YlbuzvFv|AsB@?`H z-!9S_cSmYW0ubd#mvRXCU7OZa+b zzck(C@~zpO19*dy@K(ZflkInBcXS(EJka6XaQG#hy9DQA!nqN;$xt}g3x3JI+;l$& zZ!SqUS$Mp3_zK=NBAoONUg?`|GWq804hy^&9(e!6aEah04B?~@ctvbG{fv&%;TSkq z+)m%Oq{XFCSD<9c@1OYX4Q?iFf$+#0!JIQ@v9nF5=9>u;wYyk1RY| zygwUvXZQ_^?yFlV{%rkT=rZmRoq?PZRiI8TB`HTv;AH1-Jkn@Pl!xq`$;nOX7^(h1 zv~1PMLZeRrEP~!>uRfDH@=v`p)p*fBFr3Wb3`}9B-Rt;9_bw++ue(?kdP)xo$ zivmY&+P0Fn8s3*}`t_dEcNQ3Z-s>8ZNEb9=Ko$;0bki$4)On4H!<(%k|#neLro$za3qtD7V6(QmR=;#OjgY+*d8NHwl2 zy-2%at11>Vn1jF6=o8RyFW|SkKwyFUW5-zRSjDD3*p>MJ9U2MN(-vqaY$a^fZi#Zs zb_=gRHGmnMa;-vNh}5bcO$T@aCoSKU*Bb)ihm7n0)bo~vVgM?Hd2rHD+sM4xuN6-o z)}=a?0=WYWk=tLbqCXO};A?bg@O&h}aqY(5C^%_4!QHUk(BJUcc-Uxg5aprsrcWap zL*ENJ@21`;au91^TE@E!;u3gGhBh9w_Ocz%m-}Aidh6ukWN)LqYc04PYYlZ=(<<>X zQ6$kgQI3I zmtY`DxtOKzNl2>50;B}v!DK!0Na26=a8D3J6kukaXryAoGQtw}Ic^jD5Pg{4t@bVN z?K7WPA@O$Ueh|xK2!s-V;FF-38#CDt!3E$vu%*kli)Q8;<|!o}wfrL@%nK&q({984 zo1%1rzI4)a!N{R`@|gU^(etB-06y*k*w%3h+G27|bLaP?;YH0C_|Etv6_*8<1@Ej3 z*V=f&HTIT%Yy@K%ESe7W!->oLPMlYb_jufmdflYVwPd4w`%3^<>_= zlmDsbFryXY%JJ?Q%b4 zrM|V%sj%$KNBWZ^8-K`}WTR7MIharVCr56ctU>YZZzC~j)S_qZxHFHh7X2;O4@K6< z1+2h7*W-2|OOA5UAkm+Q?A zS%m!d5c%6qb{p>cmqNyc`A#cwVB0JU=9R= znKM=ut|k)ppgTL&RU%sVOJ7A^2bE^N!P;$aT+3o>JOh~Om};2XnTnWdn<|*9QkNYT z4#*nts_`oGYI>BO9SvR43zyvIo>dRA(6^V}mz{+S@z4BTEWj+ND^_-KzbM+Tok=aK z*MOF+>OSaQWbJp)^cO2>v}>d*r|YL{>Z|E1>uav4tSGO*Q}sX0P|m2%lxwzYKPX<@ z&5*16>G16wET%2qFaB68S`1#STP)L28lAgCg%>if3XZB|Cr;}&qrnzUf zZZn!n_AbOOa4(!M=Jwah{K_A@ZR(eYf zg^t!+V|}er#a&3OGQeJOXYMab#rvNYx-*J>{mcUOP&>+ZJd>yjTZoG9cvA1J8KbZZEFQ< zRR+5w%R!A*zG=QmzB$j*i=){q9brbLAt&`C8rw0%yvPV&?+*uj&RRHXbjB_t6>@5%YU`9!y`{_Yjo=VfNsPd&iz40)7}bgs)E&S(bFY?AVQcnU%Zf%`Q#qN<`yAc%rMs(A_pMz`8ftGpFjdoz~kRR z)Brkt$z%{7fLdQd6T}H%(wCY8VE`ys#JNFC00#IP43t6xKv|J-n_K~4DL@Q60)b@!7xu z&)3>m?+--2nm&n-gRX{M5s6e3!g-|d$(<6glLmkn z9*vKuKNkM4WYXp4sbjdmjG6PjIS@^#VZ%c0GYiaH>0|cEF{m@;LnKk>bpc)!I*sI< zxEnHyxSNF1i{c!*UX%6DTe|7>;d7_a^>Ogw5*YP@3uj*1i1OQC3!xteOq&1Ig#L%3 zJ%#_jk4&<~y8_vwg8X2eeGA2_$p@Iar$1S42-w&&h%B!k?C2SgkqZP{dIo3Y?O9mD z^(dbC&)J_09(+;}*CE-pG_VAwG@=ZPqT>27Fa71Og$#l8E*Ji4LjPUSIjb?(Z}<|0 z#DJ3!0J2ZgSnl|wHq3)Bwe8d11U^LX7AIZGF#jCF0C=u1jX&87c%?6!Jh=lv(wEVk zoB?3y%gs$*01#KCxhF>fXe+YylSdr+uU16drt|^aD`Kim$!0YnsEc>=^hJePNqoOR zJ^*2#M6%x~5DL!}vMebGt7lrqZ(0bQ=dX+`a|o}_B3zFP=KqxaL#1$tWo)P_<6vB8 zT(>XhrHv`SN4?=v`D-CLXC#_Fe>I{1q3D7uN}=zHdE*n70KRmQ%sh68GvKXH##lbf z1TRd2FS$*8Z!#I;eT%C934clgzJp9OdCC;Pt1qHCr4HcK7n_@M0SK;q;+|3fu&;>L zPuT+aqbx<;Cei`;D}OlC$9aTDSpl+(cQ3823i6_N0pu%6hIuGp5zkQgraiE-XCxVr z7A)f#o{?`3*7l4}`a_Qw3;)zW*ktXIL?x!P$!&>hi4sEKnwpn3p^S>+_-i2r0-Y|I ze>I{1q3HdGP^BzY2s?l%UD15P93p>9k}i=6tcIWgFn!|2@>nK4V5WSTZKC)S-vQYA z^2rl<07895&51++p1#7|L@j_+Ux|C-UzcjcD~cw+CP)Fa@Ew34L5@5xOG&SS-#_RV z?|6u<3Uhc@q^>}kkmvA?pxGf1Y|jL;oPNkF&mZuhI0&IYi0hQxWiiib2d`~02v?!;??|~S1MgFq^X0%Q8SN#izCFoqLopYq83u!( zVz5MxANGv)S2Q@lvfRHJyDaYj?Ai3qE;kiy*7V&jZwc&5 z1PVI-%@1L2NQ&zw@@)`Nh7phE0aN{3Uo7_CMD6C~cr>?-6V2@kh zg|7dLfk7EV;94_3`9w%Cc5-z9t0b|O)6f$(ac(L$T6Z-Fp{-0S7&=+R^ zBC@iCQfB_=>jAhP=gj{p`-k?U67$+@SHzwFeLe7@Uy_$=s8TsP%E>0dB!`4}Xa286 z+L1}WTKNAZGR$wOG=8O_ip_s(CS4;?>z%Qtgvgf#9EPe5!ub=JW42c( zew1iy88<9{b!y2|3c4@YT8;(F;vzj3wSrLklqkUpg+P0^qK5knKBe}s(l!v1PdOqn z5^-<#f77NVSn%5L`ahzQY+%^)9~S=XU~%F)CP7U7rw0r-@6u>ULmB9zNrZc!W~Bs| zuTU3IYzI1O5(5H&$5Sg!Qdj#zE9D^1PgwgD>66`_;xYRrV~`dy(3YpD(mtJFsX449 z19a{w!m>}@TA~RnG5{TTirMcowU)ZU%2q*lx1Y$ZKoc7V3ID;=QKihh_}{bXz)*#9 z6&#rVF>QoL{n-H-x}#I0T={2*|FLNULxJ>o;NP1z{74g`tR^LU|64E{^tZvV|74b< z#4ikf;vTv1;|z3Lvw7l%$(VaQoj*M8Rj-oYW%@0@f!8!jNgB57#@Fm+;)v@r&likq6)e>G*1 zH?=bdSiECn;}R0WK>e5c?rHk5omSl+(SxDBsH96`j=zRoUw)fp8!%qcszY(Gp=M{S zQce?F^{v9^OX)zqc@jR=y`9qMKYIluMp-fmn2a~k>l%7%+%Xu>r@7vu;H7EDpIT7U z@lZ#V#!nPzMKl3@&m6|hBhdJ9T^XY3I*>ub<89yxx#R4!Pm9A*E3)m}_z-9y-|~}C z1pjcFchYB3vFn~!s4nz#^5Z>mA99Es$J>R8prXQD9gB=So$uR^5Pr_c%V7ssVS(`G zvi+uptE-V6=!)1vqV`z=X~H|+0NR#vy5N*TZ{KGqclNaZp1QdHOX}kK$j<%`)v>-~ zW&Oy*^M7h@ln>2aZRY1wW6aM%DvJ16x0j9asaGa6uf~Ij_UOL@Gs)OG=v>zifU)WwOXIYWvORb*}7@g+mRpEEzY7G{)2 z?jnKrZWrvml#Y3yo-&{Aq0Yyxh@YMrk+~wMl|U;r7Ra9>p8Ge%H4QF6Pm+C_Z4hYj zDQ&BrKTsvMxcg!;yAynR0nJm#MLsU6!m*c9y;{efWqWmfJlp!UXX<^V4FP1fSE2D zU!n`UH5&HUFFe$ z#fNMAsr2jl-tU{?5?sCYn<+i1T>HgREk5Kj$j`Wf{&tI3(M69V@+eoV`LHH&&Gb4R|M79UdE&4 ze64nwEo~`rl~A}iGnISGQdCq@p))irD;FMtigtFstyi5;{n1NA!%Wgs$4d6>K380| ztL3^u%Op~y92Y5r^7AZX`F_%LfSvk>*trrqV8h|30F$>_x{0whR?IQ;E%s>oY zFP8Nh30_-JS`XEXsIAA(X-2ty28F6OG^yMG3U9A?o8)PBbc24QEPsmA(3H^zQ7c6^ zZW($=(ytkHvE#|zW10kRGHaUzVmuQM!boBh>_`b|h4_apDqCvfXUVgA>|@_3$Vye% zck<0R#q6?a3cP)*yYuR7!B%!dY^g^(ru3G8Awl{93@cGOlW&swk~5q|p81kzpWW8E zEL#q@!EF_6nvI*C=8Qtf!m@L6 z>ZSJsiJQ#Ee_7hs=b-Bi@09P8>3=V}GJd1WM>XAdROwdu6{{$rfOfjLz%P7Ro^EA{ znp4s)b|q)2nU(uz4t-5b3YNLqVzkt%|A?7oO|=|Xv5R)q%4Cg^0HNfPRP@*R+{i}u z9n-D+9t)%XJ!*?jdiOS;erA}wHUWN?y90cERV&>_!XTQMhNCk@ouf2t31kdW-gEle zJ*?=ExZf4&KAqBctgMQW2f8RqvHy`biS?Y}lhApmUbt8e_)LKu0m(95evW8Nsng1` zP)9{nPJAttSAtlR&0EG};d4rH@&nB)6m;?$V;j;-B8K2KoBUU8Og4dJ;?w%XP1y}E z1hqpt&6sM7^|;e{c{$^&;>Het{rYLJ%49+<+{@)0ZuKGMQSM{jn7!*<0o8?bej?ag zE@ZjN*g1JxV6n8fF3%bBZMvb5AW&rgzK>Zb0`!hK!n|55K^ORwZVC^GdUFjlkvKv< zz|cyJ6wOsHD)dsQsV5%YWoh_8!Yij)X>9h>EMG^J58sd#CDX)U`9lmc8j_ye-tMIG zRvPc}I>r{;LbLI*)ggftx%!E{8=%~K+#o3%RgROGYLPSvRHS0oJ#jvYldTV(iqV zQA+NmA?zwHJPRauhV++B$COURFwMkh!%XsSE4?4IGK3alzkVd#CEP@p4D9^P{t|iY zS@5>QHij;pk0kAZJYeEg4L*U*riGHBO{G8Ym-Thj&wJ-gdU8^TmdZ+eS$R?_!uzq^ zJ)uAGc964aYCp-Di#0X1)KHhi)D#cP>Zert2HyWaSEK!vkzE zgTybFGxDNb`ExO6^5&>Zp5>p6ff8 zNag+y@HbHPOtTJO({z8;krf`&`vq60+{Xf2T0ytw9Wx}T-9;URTT@f9)Q>(}sanLw z-_8Ay{2Vdmm?7DCtN7I1)7$jqlvNqv!A`#8{KE1AXB#M=gS4!EhI=@g=FZWAT5yZ{ zZm*!(MRvvU1BD>I9C|z%eN~W^&5GZvs5=ONVWuI|YFUZ1Zc*oFpBa{dk?vf>bE3nB zg$4JZ2+l9eP1Pfp!D{h-)N&)J&bJrZ!Z`i{sFm)Qy&KLPWcGaO28ISozzQSqw7_lX z3_Mwpq4C%)wuf3O8wIbjo&Qwl6k6H4)_1K7AaVPeZTD@e`U3|QMfJkgH$BC_RrJt! z-C5S5L5%(bsf#|IQ)Il9$Im>RytXg8UNBAqYxq5RPYyP%KJ*3nkd1XY=e}56|GKU2 zAd1h8z9aoaL(&bc6aIwj%k2~^Q-(z6M1B~E(11-AWJSU5^k%lpEBJ-PD`D8%FUd4W9vAtLEtW-G2;OT{Lc$3h3oCWc;Wy<@3Z9_`LII+Vhj_*1#rDUy^ z-(P!^^D1?E-~`%oXT-atIkU0;kaRc&SQU5r8gZ8`kJ~4Qh}wQ) zovp27osORi@A(ZrVHQ84c2c+piEJo};Q3Of;f=kDe;>-m6#;%tp5|^*W$GlC`>yK! z6mFv+Tkw%!a3|P;MBYtHK(cR$${O#a5_Z}eS<+WWc+MeSM%_H%>x9+kkw((%`lBVge}|lpGy+rtbocVti6>236lJfaDhoH2Pqj};^?xwS)oaaVp&hscV|O

yjbpj69ZQ$p=X8$brX&DRg#L&W+>xQ~M zQg4ud&@6JzZc47M!|fXBUhE$4q>ASg-!<1}0OrOsZ~C@pn2rhjBhH&2ghhllFuxIB zI`h+DN*;bC1H^_jN>zL*3)K1WmTlvWCKCzmjUKC;=+lc=-LkFG<-6ACuR;Y!+M~=| z32+87J38CH-|ZmDsry3@3X8O)VS9nf6U#_jQG$&h8p2L)!QAJCvRgbXf*5z{`V zw{xF88(d#SNRdt}*dwakxlV}a zf0+KZ7fL>!FLd8>*bOx&J23xlo23ZtDHl|BI5V0KQ_R?7Gl2!fe+tfW_wckVhUgtN zg)M4;q-qc3ace(o@+-?hhr%Voc6+>?vm2HCm8c)Lfn3;QfmCU^h8OPHUApcWeIk5} z{K!(EUNJqsZ@AY7o5*h-I7tqT=vVN+Ap zm$ngnM(q}WGM?}6{XN=)Z9RuB@tUkSx4zc8En-`k`hFUlbcLKOvFDr zc&ELNAnz2dQ%<(w*nio7z91R!?zvAL1&t)_mySqdW>|v4dXyt=L;1$i2-ay0ZYB2* zrRbii4%3ve^f3Wv8dAz6kNmQ_y1K=1V_f^ngjJ`NhR%tjoCEgM#*6Irbb&S7kJVulsO`0h z<#h&@q*bdncsSeNSsNR9&$=R)mz_L}jqR9eSva=gyZnu1%NPgI(42N0wsrfbI_UFs zOJ+ZwF4$N?1}!Zig&(RvGU0VjtD*nq9R0JNAC$cVtxWR*)x{2g+LoRu3}DjVl?A1FK02HVE?->U zV~BpaNSlyv{id!FTRcL=%FE<3nf>PchlKiY60?k+-n(JBk)RaSZM|0JodE5wJ%zO4 zA^YMK#-jOz2_~V^``Ty%(qHp(^%67nwffRGCQv-uW_t&M*3~PuJuPoR4If6zkMG8OTKVm( zcg@b0PvfcDo7wwU|9k3blxE}V5Lm}6$ z5@Zo0+w=mw>dO#`lZH}@EGB-_yysO_=XE^?)x|1bzI#wxPObLDe7R;7WeX3g%+?W; zmvl@SAzq6iCb!-mu>{Njh#sWoenP`w&n!qP6PXw}Xz;gbxA)$Tunfd7425Xr2q+EF zqQzG-M2-&An&Glx7-84z0xFyl~{c-^?c_Z+iSjiDDqDM5PP&y;|H)h}&J3k_AW~M$a^tt?zMP zqwQ{W!~<>4zrbP%%ZEcFo+5r`;OCVB6&TO8POCBbk84#?j)h$Ij}d_lw_tZvQ*}$* zm#YuD98S=uJV%L4kneqBP5omVk=KUS2!_JbeiL54FEAgP5{~SAy}XdqDUd;;%c+&p zOS#GJl!?6M{PK9#2(fKgxS*5uTF6^GFiJeY(At4fEzX&U1SO&Y0VA50#mN;T1LZA6 z>SGi0I^>0;C|aPzEsI>&TjT=*AC$n0NTCrU#6Wvv2XtA~t-H@}XkOFuaij!#Y`Sr# zgt$7kBBNEii%a8YP8*S?^kiCAJV)*E1FaKSyr$)tA6Njm5RsrUcXM;_V0vQMTRRA} zbMHFA`_tWeOziB_7V1;E+ZrY$;f@fB={ikjofkifG3;Nzc}d$VW%5HHLil?x1uAeX z+q|Oo0e$RCQ#M<*`RVpZz&XK_B62eOwFWA&*@8_9wXoe=LB;BJ=bmyHUs^ce^FDxK zif_%IC5WnU69425Av(67``t~eV#M_JOJ1Rv!qtPsMM0nA&!4R{17wY)9TiSz0Fkh( z>lT&KSe%zCtFpsYsD&2k{e&k-KCM}su6gzo2QO`=@{_gb>2u^}T@(*Q#e968hpY** zrRGX2JnyeC|E;96wsauEO<$a>>DDADQaH!``bXM4uK=P*AqZ6dB2U9q%j)WaA31mC zxx@kmFR8E6zy^kF^z-EH3k-(mK+1vynbwT9PJbNgE1m!{;5IplLojkqMzFV!>_F*@ zTw|pHCf?6sbHzLh3FVsmZtEnjWWa6)BtaiUWmcadf1FR@ey_#es^xOUYyAz&*=z6?W8(-18`~@#3=q(duJX{Rkim2oDJs!5dr1GEe8b7p7%xu6@)a0P$P0a z91aQshv6tlYNq0dcr9;gPANI2207t8plFH%ImFd0QFF?P6sH{CXJd6`ukZc6H~)Bl z|KuM9i|1KuJ!|^xXYI9~{o(YJ{s93ASHFvn>)0kTeZ`N%ZZsM|T zIOiwTW_%ic&BOotd)1#Te5dZdifof@`<#2#+SY3|?zM^U)W}>pk@xSl)+Oz6wMD~@ zxwQRc=*;t{`7NdLw1akoV>6u7Ndr-1_|Ol*3WCTyN*R)p=obm#eor_KPiz z*mL>)L!|@6!YJAZnRN1ScJ(cz`ktbX2YEJ%f3?jM`|?@=D^C98+T!*jx3!x~(n3SB ztW$12h#LK+$P5^I=d!cIzSVti zzhAW2X;kB}V;;A@dw$a8y3v8APUp*auXiuMU%qhet+9=BYMk2>^osA(7Gvgr_-XJ* z_fwvRKfZ8m%Fj;-?nkvJtteNm&Xbnw|x-Nl{t3TEY+S|Ao__0knj_yUOx+ge7TE5!?cE~l{%v_}t@O0V zC)Yau>{xr#d9~Q{vSmYu?NQUWI3~0&jgMb2Y0dqwol5*?HojBV^;+;xizECjnSt$s zs&#+rnBM5Z;(On=Z5F!fb!)>T-^5Mc7qYwL@WrmhgQj*_-D`fkg#+iO9qHRy@Z!$o z{`^RyFj4t?*WZg<*z^664fRd#5iNq(l^*50U-;L=VJm`^Ltl@-IxY6IQ)_FwN;?Kd z&VH@1Q@3Ga`$dU|XVvQXMaCQ_`^NXC6`MZUWNEr6WL^7fql3?MEV3g zF?Y+nRpUB#|9DboZ#8}S(N&Ju=FJ;fwtuvFpIrP|tv8OWd3##yw11Z0&-L}b_qU5F zrbDfpPDo5!o!{-wm<|3zYh_9Ut)G56?Y?it=zl!PxMrQX=tld)s}}5Q``OkeZgn=e zP4dlOz9b_3>$d56r$66tD|*zJ5puTaV4tQ>4qV+lIJk$^^qD#M%df^n-um0&EiGdA z_et7*I;rKHjow>458Uf;&a>;S^^L5@Glo8zzg_hoGjVHjgEjZ~HLI?6X@0VwyykMJ zMoa!F6`#Ktv$diZ=XxrjB5(Vx&Vjy{E-#Jl`CW!fp9zomsclz(yd-7wth*~343akr z-wrtbftookE9z40k$G>AG%bA+y*09URkdqfPRwq6T&d`m`%CVQEu~ZZclC(eKP0pH zn!x?@S4~~`Y0#QQT5w#Skn8q(+{1%*dHKbHe?2Y#Fll<<(mNwM94gMfyVCu9$&zkA zPda_3(9`|!joClm=$&?|UfU02XB^#DrZzk3`1H*WE<{|~R;^9i545Gws-0uotfuA- z$u9R!9=NgV%CUmphpx@^+I8f}J9mS-{8G}gx@YX8XJLLLnHpId{63b>Yf~89UAvmW~#M!W{*CW%wZNS#xpo5Aj3Z+F*%Wn@yJL_NJ^t9=APyl zTeQ`me%6!yJUuE!?85>*1z*lbF>#(j4gsk#vHrb6!+uku-vT{{+U?2yetzlc>AvZL zuPt?mAE#-WpNaS5c^{JSNgJ7DH)r@HrFs3HL#Q>)k{Xw6kFzCt=sB9BZFG3u)6?U( ze3M_uH!01xvSPj#TcRKR!H@G5{Pc|IXa9FnZ85_w*3_Wxah6nDnl0A8XRXJ3w$vDp zSX-*cABi4eO!EOLs;#}q@)@FtT<(*Gm+L|ar<;Y2}{V)#Lwlg!Zx)|eoB>TqjiZC^f% z%GUYw>bsStFVVLv1lZz3t|t7;|dO zOIG5yTwbycJEj6f;2)(T-&wogW z3rZeIGd9U5#%9TQUJXin{zIjd-;26`b`AcWRf)-e)U(POoMBF;I+`l$NOhzlR@K!FrIap7X|zOJtS^(>3%bB~kN<;z4*v&bc>Gn!pK9g5n(MFT`cp0Nr-c6+ zU4J##pK5_WCH&Xu`g6_o9Q(AdKu?N)Y)l0Gdt-x+p9XrS)3(Kb+HKKZ*gy%5OG{2L zkEG|DK5_O0tB3AR>-!~?$@7D&iplhXc;$XeR4;3+U+=g~s|PvhCcpRkd2k-02S32W zub0hcr(aASz5Kc)#o9cC=Rbz_3kX$JO$^awm7^!7PV~S;PfIU8ECv1V5|sacJ~t~! zVwHWKjQP@OYeAo%T1+Z?awch)<@4w|Q$IR;_Tv%eX_E&#*RDMxeH@))FP$1~9_-z= z_SBJgn+;A^+73DV!B^$u?@MO_hizYXZSKzRlHyiAoh$pC+&N@eTwLDY~X{xQ!XeDr{Vh#?(hiS97 zFF$iN>t-WIIcP`TH)pcW7CF`))mzPTyIB9x;^gb@Sr?xA&QGzF6{kj}4fu7>0jXYk zj(2vKvc;)S`J^Lzyn~(ItY|%IOjy~p)Tn;z(id+Sb??-}gZmQ(d_F(tlyA6m(=prg z9%W}qBiba47-qf`T(5m`ztZx&Js+hx)~@iGe>HhJ zX}Nmfxp5iIr!@1Z(Y01*|1>4SrG~DCimJ^av zw_)L6x9MIfHFNefoggU!8doGEogNAyg6WOen#C!=eq=qOUbA{<3dEh#3A!1JzA-@IC@?il|8%s zwKva=+&0$_~;$oO^d{&>!N)bv~BK069~KByLa{=LW9gKj%NEeg(h ztLF*RaM$H!gMv>Sj(R_)O?kIF!xXPk5rso7j`HbdXS17AE-OoluEehA z;+y?*%H7bfJ$scLzPr|UV$PxOoI~tFC)bDB%ff=ZmPH&qFl4XT)rFgWjIvlZ^XQe> z3Gy#gAgzw;LM$KEm{+e)VL~-MOOu{u-PphLOPWo|Ze0{2oo`w;ZO*c)eg% zToQ0|?1`R1OS8YKD7OZ-{cOnR(<2TJji1H0ZJt;>t7t)HmpeV)rG~00bajcFJ~*ti z*PNM0hgxb1zqll3j|%IXJ8S0Ay0Oh0*xbM0X4}ARq1L=r>tX#xnITVNoOeu)wv*lz zYQZ*MGn?#tJlJx4agax_((q{7Pw!R~M%Fx@>wfxJwHureyNkZ>61#Wxk;GPC#TFi% ze8;RQLo&IZc#krVV92)0gIX>NB?5A&XN& zl>5au!jwk8T#Iu0((JSPBPrkaRFQw_D?gh@-|e8-!)@}1?2 zpV#fUVcXUE`w6Zot&;Zn6u56Pi#K;YX*Paqa-*9?qYIp8oU4|-FC?S!h1;fuMV1W5 zp65~mvRai_FS_6oFlh)^?WpCofqSOSnLN9^?ZDk1mirGZoR?9a z$k&b>8b7zTcTM4rvT?IHZQjkC*4BVSUdzfO2=I=%vq}!H7~1E}N6yb@4-L!}y-%3B zx;RbO$LU0UBIx6^^Ne2fE6pi=*6a{MONJev6y7YFY?v^G7YoZIAXYEoP|<=(GdbS>n&Mva!z zvS5m87jD7LL!N=DPvJ~6b1UC4CpK7A@R*^-D7{jc$~LjLiqUAX2dW&idotrE%> zm+n5t2cL$fGSzvpPhm_&;pa+7~Ix@qwQ zmy#wzuJ@(TR>c!FQ~OJW-_NN>^Sa%HOrJZJj`pJHsAdE5S~uPOT2RE3iErdPepYwu4eOlNxs+xE7yQ{O`&8r<*crD6xShUaTX%+bke>&ANt%ev|a&xQv z-l-aAkGXFzd3}3clSlFoL8~9$>z>cayPKBQpJy4CFl9}i&!fSv*T>$-3mj3DQ~K)G z!S{dQnX!#`1yLPlve^-mr*FUiM?O(lPU`|rPqobFW-7gF(b*>Zrq1)K;T-`cm zQ^Vbh)#{VVlHIbrxSIRVMb-Z@@|0!srGq_orKl}hT?m~&;drt`k9~7h_aW!p=4Y)- z2|6--*0p&T1M2UqRnXYE>`_r_9eH+pH|Gnl_0M^m=Kdb1g4ez~7oWZBt^U(~HaXl^ z?geeze1BeYjikM63S2gwYxw=dGbzqt7kYd@o-1&@UpBDLmt*p>D^`tJ5-_$-dEi4E5T*1n%}wUML#@?yZOYrZSw5fZQnfav@NGg zMg!aV!uWZC@5LvrYj~+&PUw@#qg{u){t8I&?Vk>G+io z&U|&^*^NQ_S0|kmpLHLdd)ykorg52lm3-E_V%ed)?=L=Ha(jhsZg20{u}#B2_xdK{ z$I0nmZ0ok@oVM%47LzF>pvBHPYOmtVi~ z*2q5XtGlB8zhEok315*bqI~8xOXw~b+75m<;*t@e5fcJ?wP-M-fB3=N zvWOc)GwlAW+#C4iCS>J>f2@~yV7O!8$8MW*mQV$LD7iW`V{iLZGU)H&+YZ(5$2Gkl zQYqCs&F+8A)tb{Ie6H6IR({Ppm-v#%%iG7iwsOQp`ord&jPSKyKg_&%V7Q$+Zb44d z@VV64v(_}ebtQ3qLH)~4ef!VYZ0)e-*!j#^(>u@~cSKyeVh>e6c3V8XE>&bt$yI)N zu*Ocs-0MP=*QC= z2Sh&Iv-QTov-RFfjC`==akZo~o5s7Y-#Mbj-C@VfR|2!lKlNPH{(Ju>z3W{#l^FLh zSlHaz2YR#_sn*yA4kq0h<>>#<|8XYXLzW~#^3ebGdm^1P(EoWP{gKAWbezDDCMrxC zCn%y(j#Qca1VttHw`zWZCedZas%aw6k#B5FlUX@|BX8XxCu&R?q9QW&Q)Gc$_o}*@ zB=Ag{!ZG=2nqsUUwWwxn7fu#6+1GUli1 zon#mXswgsjshQ|ay+KYh38Jx0HG%f8jB*0KMl_}=oMyB`qb4wv!Rdq6(9V=5h=zGY zqe`N6vdS2zG}UCNA6=~GjpL8fBx4(J91VO!yHJ{FTq8J6RTP75oId;vwsE|uvS|`0 z8S5<2sUTy10;d@JoK|to*!G;D^2WC31X?1D?I+NZXly@G)J%ps$cYkfTdjm16B^$!2vs{k62w`2d(X_9I%7dXGV?(cJROsVg;)U z?BIbNGh^!p2gPvI#IeOk@(|{fH9Lvf9 zJ2YSi#U)~OfgQwiRu0%fet=PqCy$#=W9^`W)Ig54g9kjP2X~;$+QHNF8e13E4muCa z$^oA9fag5781D^97umkX%Cm)-s3*b2qc+LZ!^ML0(`FU&^pg#c5 zc^=pSc+LZ!^ML0(J)<*q0X*mFd6$&~cF+zID+k6E;5iR?&eL-&lONzY4|vXtU|a#7 z(?c~V1K0t0&eJnBTR$*AL|_NtIS+Ww1D^AM=el3U)CKUIr~Nfn4%h*B&I6w7dninP zG8k8Y=e!KY72vtPx5SnK>;OEc^Tj|H^atQMuK+s$&w0Rep7ubQIs=}Q0|(?lf6zWF zn;)8!)Uc z;JE;JPPxd3=B0RNmWA+dD^JQo1Z_4fu$ z9|4{Vfai3j6X>$@L*Msi%K-fW{Br^DTmU?$jc>LLz;k`?m8lEhxd3=B0G`vPAjl8& z2jIEB|IF3}*a3Jh0G`t(Bb%R*-Q)z&u5Z=-KiaPo0M7-$a{>700^qs6SI^i6cup^n zfE=&`@LT{qr#rJCKhPh5=d{rebb%d!=K|n4y?9~s13cH?X)? zxd3=B0G`v%JX;3fxd3>s@82`F0iFwh=K|ol0C=vyk7CLIJQo1Z=?w$W1^oedE&!g> z+X;{#=nvqZi-70!LX^o*1Uwf3&qcs<5%63DJQsm~PAA4eUD)|SZ$w!+z;hAsoZgZG zUA8~y%_)#$=Q-V92Xep;z;hAsoDK}I`2n7bfafCMxd?bpFT6n+zz!q3X>Hei-74=9 z=@NR-{dNiP zTmn3o0M8}Ba|!t8beM##AMnp5z;g-gw@ZNM65zQ6crF2+>u0T)J_0i50dCz;ikw2IRoF0z8)h&*^j-$PbJwz;g-koDR0I`2qi20z8+1 ze=Y%@OMvGR;JE~NPKVXl`T?Fxz(1FajMw`T@LU2smjKTtz;g-s=Mvz#1b8k1o=bq| zbYqll1Hf|$@LU2smjKTt;Gau?=Mvz#1b8k1o=bq|65zQ6c&?w@Wac#BxdeDF0iH{M z=lU5}rVPMy3GiG3JeL5^B_q4(xl^EdNkfz9_3!i9bkYsf1H?lifam(z zMy3q_&n3WfI^_yNJeL8_Wx#V8@LUEwmjTaZz;hY!Tn0Rs!G1ek ztY_N~@LWH)&a^Y&IUVu`a$sD6{dPKm3Ut}|Ap@S%NmZcBa!>|5mjTaZz;hY!Tn0Rs z0ncT?a~bel20WJm&*?BWYcJrr40ukbHnN+i8zIyNMqbK* z=lVSY#x}rn8Sq>NJeL8_^?My`8DLxip3A^LmjTb|W(Qja;JFNVPAA-fF6a-yb2-XB2x&Z&2g24hgUA&faeO} zxqk1MDFg6a0X$a#&lSLP#ptu^^#eRt0M8Y`a|Q5R0X$a#&lSLPy4=UM0pPg;c&>o` zb_MWU0X$a$&sD&4iVVxtPX#c&-ATtAOV!;JIpKx9;Q6crosIsDS4x;JFHTt^%G@ z)CR^j4e(q8Jg4XmK$jg?8sNDeOQ6bpBYQPsp3z+w9QT z8sNDGc&>r{b`9`c13cGlW9!F`D-G~m13cFN&o#hv4fy98;JF5Pt^uBFz(3aj&o#hv z4e(r#|H8Bj;JF5Pt^uBFfaeT8sNDGc&-7SYk=n(@Xs|P}*unB#4`RjkCChV?19q@Hr%*${4wmO6 z2kc;ZPIABwmggjA7(@DVBCV%1&S|9oadw8}fE}!VPT`S&9W2jD4%or+oaBHVEYC>} z^asmxk^^?IJg0zUzz!q3DFB3t#v0RBEYB%FUA0M9wV za}MyF13c#d&p9KzDKI#=e@RO*=nueiilWQf0eH>xcDL@xAP4L)vYYxyB-S#01b7bO!_lJ@7+1hQ zr^xnf{Q%EFd^kNyH_$bVHGM7so`d*sBxk6z-UhV3Fl_*M&I6u<_;6GP=nvqZgZOat z*a^lJ;5iR?4&uX6eqdYyp7Vg`dR%s9-2go2fq%{eo`d*s^hgcnIp8^O^u?*)^m~g; zzX6`}fag5mIS+Ww1D=EUaO4I6I{?o?d^pkt^8@gl2mU#T4@dcd`2lzi;=_^a0_*@h z=K;@oz;h5Et}=c*Gp+#7nOJbt=lb0=W1oZgaP+YN)(#LKj^x<+0pi1v9LsY7_~#%# zoc`egW*!Mf#?u-G;=@rIumkWM#D^nYc3gq@a3p6~WA%2Xb&_dkBjfct1D=EUa3lxp z06Yir;Yb(Q0eCI|{~W}Jqx?XB0G@;RaP&|E>;V2bh!01)zz)E35Fd_o4Sl4yJ@C)< zd#=X01>(aI^jHq+_d1w92RsMy;V3^aKY)J@;=}0xX6p=i4&uWR1VDcn8Lzh$;5mp7 zM{>Xpz;h5Ej&y+?Mt0NOqOV%8?F@J>0RJ4shtnr3+kSxO^pzkW2gViPIekrt)dl{! zU}QJhtJ3<%j4R-uQ^SBVKz{(9)5o!ZF6a-ya}Xa+|8fhPAK*EN4@bJd4kNqucA>Gs zw2RSa*T*j4IfxHO+jXpe4&uY{2 z88fyOh!01)EYCrFIFe)S0P*4UFN!m5Kp$vg(*Vy!u-^{i!_oGsq0YL!G^ZJR0nhbs z<`~y|5Fd`p0CoVLgZOZ?mCKGR5%3(uha+8sZ8V-id^k!otWC5*VWRg2OdA0IT>l0X z(*}U&AU+&zNgKwRUO&Kd5%}jK;5mp7NBJ3St1JWb2jIB~cn;#jaU$4n2l3%Z4)lkS z-Fn-Dcm5zg9OVb>06Z4~&qc7`&cuw<+Y0a;#D^m}cD(}e;Ybej2k_59d^may!EzA9 zha)*Kt^m(Ld^pktb^xA>fafCc&p~`RdUXQq06Yir;YgR|2Z#?xa=;GYpEI%GX#CNJ zB0Kkie-7fq(JLUZUICti_;92P<_F+8h!01)hPj~IL2bpXVSwi#J{-Na0(JoZTm(D^ z@!=>x&>vvG9mIztU4w1<($AU+)B$BruyACBZ$o`d*sB**p#h!01vFWGqx;=_>~yIz6# za3lxp0RFiIc+P&$)kOILI{?o?d^may%gzt|dzHp#0T3UKbb%d!=O8{D>4I@(WH*f$ z-LGKA3*b434@a+)fgMJlo#r5j4@YTWei#{FsSE4?JO}aN=+!nDSAgdrJ{;+Sc@F$@ z5Fd_o!TbO`2l3%ZmwiqI@!{wdJs4Mj=MvyKh!02kf&KtI2l3%Z7t9afpM&^tbgTf_ z0ruNLd^pkt^8@glKG4a|H{hRx_;6GP=nvqZOMvGfJ{*0y6pSmta|!UAi5aKQ52Mds znFjg;@EpX4<0Qay5Fd`@fE~a;2l3%Z7xV}4&n3Wf5Fd_?m$363#D^m}cD(}e;Yf}h zS0Fwd$+32T_;4i0_6LX$$AS28l*Y~v5Fd`@*!}?V;Yg01=O8{D$+7D$h!00{?EC=n z;pk`&umkWM#D^nY&>w*3AU+)F0y_ZDWx#U~AC8VA0XqQCW#FI7faf4S9F+ma72r9D z4@bJ7KLF1`d^irohodwwu7H0I;=_?HumkM3gZOZy3+wzJk{yB&bN5|K|dIfk6;=_?HnCF1!AU+)Fg7pgUTn7F*h!4ks_;8d4 z#uebX40uj~-x!|DfagriIASA+4@bxU06zfFQG7UhcCK0%I(VeV$*=NEO=)`El&WbI z-J8}mW17BiQ6-IDFzbGbA&qnyIqEkU)@8TKK zXus3&?R0Y3^|&)t<>*GH@w^H-)B1U-Dsp-n?GG8!X!sfOBgeVQx99Dt=C}lFY6FLW z0KeXGnN|;u!pHgbvf1n&WSK`Vzb;9!HV>-2{$psrfKa-vFNV-HOns}olh{e69XC4A zK=Ej(>ouuk(Elzmz#}NAfkT?zoNCWVwZ=AZpzfnRp#~0bywSO5SObUWiPVM-9R9!5 j&hMR6>j;nMmGX<~WsU7^PxN@+ZpMn!XEh}4w~GG{_sxcJ literal 0 HcmV?d00001 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9a3ad3f..3bb7d68 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -73,6 +73,8 @@ dependencies { implementation(libs.appcompat) implementation(libs.osmdroid) implementation(libs.androidx.core.splashscreen) + // USB-serial link to the ESP32-C5 (Phase 03) - CDC-ACM/UART driver over Android's USB Host API. + implementation(libs.usb.serial.android) debugImplementation(libs.compose.ui.tooling) diff --git a/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt b/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt index 13ff90c..0058ecb 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/MainActivity.kt @@ -82,6 +82,7 @@ class MainActivity : AppCompatActivity() { val tripServiceState by tripViewModel.serviceState.collectAsState() val showBatteryOptPrompt by tripViewModel.showBatteryOptPrompt.collectAsState() val useCaseEnabledMap by mqttViewModel.useCaseEnabledMap.collectAsState() + val obuHardware by mqttViewModel.obuHardware.collectAsState() MicrOBUTheme(darkTheme = state.darkTheme) { val view = LocalView.current @@ -133,6 +134,7 @@ class MainActivity : AppCompatActivity() { state = state, mqttConnectionState = mqttConnectionState, activeTransport = activeTransport, + obuHardware = obuHardware, usbCableConnected = usbConnected, obuStationTypeWarning = obuStationTypeWarning, obuStationType = obuStationType, @@ -145,6 +147,13 @@ class MainActivity : AppCompatActivity() { } }, onNavigateToMap = { navController.navigate(Screen.Map.route) }, + onNavigateToRecord = { + navController.navigate(Screen.Record.route) { + popUpTo(Screen.Dashboard.route) { saveState = true } + launchSingleTop = true + restoreState = true + } + }, ) } composable(Screen.Sensors.route) { @@ -239,6 +248,8 @@ class MainActivity : AppCompatActivity() { ConnectionSettingsScreen( mqttPrefs = mqttPrefs, onMqttPrefsChange = mqttViewModel::updatePrefs, + obuHardware = obuHardware, + onObuHardwareChange = mqttViewModel::setObuHardware, onBack = { navController.popBackStack() }, ) } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/TripRepository.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/TripRepository.kt index c4106bf..31db081 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/TripRepository.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/TripRepository.kt @@ -3,6 +3,8 @@ package com.hawhamburg.micr0bu.data import com.hawhamburg.micr0bu.data.db.AppDatabase import com.hawhamburg.micr0bu.data.db.DetectedEventEntity import com.hawhamburg.micr0bu.data.db.RecordedTripEntity +import com.hawhamburg.micr0bu.data.db.V2xMessageEntity +import com.hawhamburg.micr0bu.domain.cam.Cam import com.hawhamburg.micr0bu.domain.detection.DetectedEvent import kotlinx.coroutines.flow.Flow @@ -90,4 +92,30 @@ class TripRepository(db: AppDatabase) { /** Emits events for [tripId] ordered by timestamp, updating whenever the DB changes. */ fun getEventsForTrip(tripId: Long): Flow> = dao.getEventsForTrip(tripId) + + // ── V2X messages (Phase 03) ────────────────────────────────────────────────── + // Retention policy: only ever called while a trip is actively recording — see + // V2xMessageEntity's KDoc and CamUseCaseRepository.processedCam's collector in + // TripRecordingService, which is the only caller. + + /** Persists a domain [Cam] (own or remote) for the given [tripId]. */ + suspend fun insertV2xMessage(tripId: Long, cam: Cam) = + dao.insertV2xMessage( + V2xMessageEntity( + tripId = tripId, + timestamp = cam.timestamp, + isOwn = cam.isOwn, + stationId = cam.stationId, + stationType = cam.stationType, + latitude = cam.latitude, + longitude = cam.longitude, + speedMps = cam.speedMps, + headingDeg = cam.headingDeg, + yawRateDps = cam.yawRateDps, + ) + ) + + /** Emits V2X messages for [tripId] ordered by timestamp, updating whenever the DB changes. */ + fun getV2xMessagesForTrip(tripId: Long): Flow> = + dao.getV2xMessagesForTrip(tripId) } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt index 5a5d8ec..49b00a1 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/cam/CamUseCaseRepository.kt @@ -6,6 +6,9 @@ import com.hawhamburg.micr0bu.data.SensorRepository import com.hawhamburg.micr0bu.data.mqtt.MqttConnectionState import com.hawhamburg.micr0bu.data.mqtt.MqttRepository import com.hawhamburg.micr0bu.data.mqtt.UseCaseAlertPreferences +import com.hawhamburg.micr0bu.data.transport.SerialFrameType +import com.hawhamburg.micr0bu.data.transport.UsbSerialTransport +import com.hawhamburg.micr0bu.domain.asn1.RealAsn1UperCodec import com.hawhamburg.micr0bu.domain.cam.Cam import com.hawhamburg.micr0bu.domain.cam.CamParser import com.hawhamburg.micr0bu.domain.cam.ObuGnssParser @@ -18,9 +21,12 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn @@ -61,6 +67,8 @@ private const val OBU_GNSS_STALE_MS = 2_500L class CamUseCaseRepository @Inject constructor( private val mqttRepository: MqttRepository, private val prefs: UseCaseAlertPreferences, + private val usbSerialTransport: UsbSerialTransport, + private val camCodec: RealAsn1UperCodec, @ApplicationContext private val context: Context, ) { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) @@ -87,6 +95,23 @@ class CamUseCaseRepository @Inject constructor( alerts.filter { enabled[it.useCase] != false } }.stateIn(scope, SharingStarted.Eagerly, emptyList()) + /** Ego bike's latest known position/state, for the V2X Monitor live map view (Section 13). */ + val ownPosition: StateFlow = engine.ownPosition + + /** Each tracked remote road user's latest known CAM, for the live map view (Section 13). */ + val remotePositions: StateFlow> = engine.remotePositions + + private val _processedCam = MutableSharedFlow(extraBufferCapacity = 256) + /** + * Every CAM (own or remote) this repository processes, own outgoing included — for + * [com.hawhamburg.micr0bu.service.TripRecordingService] to persist for the duration of a + * recording session (see `V2xMessageEntity`'s retention-policy KDoc). Deliberately separate + * from [ownPosition]/[remotePositions] (which only track the *latest* state per station, + * for the live map) — this is every message, unbounded, since a recording session needs the + * full history, not just current position. + */ + val processedCam: SharedFlow = _processedCam.asSharedFlow() + init { scope.launch { mqttRepository.messages.collect { msg -> @@ -130,6 +155,17 @@ class CamUseCaseRepository @Inject constructor( engine.pruneStale(System.currentTimeMillis()) } } + + // ESP32-C5 path (Phase 03): remote CAMs arrive over the serial link instead of MQTT, + // already stripped of 802.11/GeoNetworking/BTP framing by the firmware's gn_unwrap.c - + // this only ever sees CAM UPER bytes. No-op stream on the CiT One path (the transport + // just never emits CAM_RX frames if nothing's plugged in over serial). + scope.launch { + usbSerialTransport.incomingFrames.collect { frame -> + if (frame.type != SerialFrameType.CAM_RX) return@collect + handleCamFromSerial(frame.payload) + } + } } fun setUseCaseEnabled(type: UseCaseType, enabled: Boolean) { @@ -151,6 +187,7 @@ class CamUseCaseRepository @Inject constructor( if (ego.stationId != 0L) _ownStationId.value = ego.stationId lastOwnStationType = ego.stationType engine.onOwnCam(ego) + _processedCam.tryEmit(ego) } /** @@ -176,6 +213,7 @@ class CamUseCaseRepository @Inject constructor( isOwn = true, ) engine.onOwnCam(ego) + _processedCam.tryEmit(ego) } private fun handleCam(payload: String, timestamp: Long) { @@ -188,5 +226,26 @@ class CamUseCaseRepository @Inject constructor( } else { engine.onRemoteCam(cam) } + _processedCam.tryEmit(cam) + } + + /** + * ESP32-C5 path: [payload] is a [com.hawhamburg.micr0bu.data.transport.SerialFrameType.CAM_RX] + * frame's body — `[rssi: 1 signed byte][CAM UPER bytes...]` (see that type's KDoc). RSSI + * itself isn't consumed yet (no UI surface for it on this path currently); only the CAM + * bytes are decoded. + * + * Every CAM received over the air here is inherently remote — this project's own outgoing + * CAM never loops back through this path — except for the edge case of the radio hearing + * its own just-transmitted frame (promiscuous capture of a local TX). Guarded the same way + * the MQTT path guards against reprocessing "own" CAM: compare against [_ownStationId]. + */ + private fun handleCamFromSerial(payload: ByteArray) { + if (payload.isEmpty()) return + val camBytes = payload.copyOfRange(1, payload.size) // payload[0] is RSSI, not part of the CAM + val cam = camCodec.decodeCam(camBytes, System.currentTimeMillis()) ?: return + if (_ownStationId.value != null && cam.stationId == _ownStationId.value) return // self-heard TX + engine.onRemoteCam(cam) + _processedCam.tryEmit(cam) } } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/db/AppDatabase.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/db/AppDatabase.kt index 69c9608..0c5c850 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/db/AppDatabase.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/db/AppDatabase.kt @@ -12,8 +12,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase SessionEntity::class, RecordedTripEntity::class, DetectedEventEntity::class, + V2xMessageEntity::class, ], - version = 2, + version = 3, exportSchema = false, ) abstract class AppDatabase : RoomDatabase() { @@ -33,7 +34,7 @@ abstract class AppDatabase : RoomDatabase() { AppDatabase::class.java, "micr0bu.db", ) - .addMigrations(MIGRATION_1_2) + .addMigrations(MIGRATION_1_2, MIGRATION_2_3) .build() .also { INSTANCE = it } } @@ -83,5 +84,37 @@ abstract class AppDatabase : RoomDatabase() { ) } } + + /** + * Adds the `v2x_messages` table (Phase 03) — CAM retention for the duration of a + * recording session, see [V2xMessageEntity]'s KDoc for the retention policy. + */ + private val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + """ + CREATE TABLE IF NOT EXISTS `v2x_messages` ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `tripId` INTEGER NOT NULL, + `timestamp` INTEGER NOT NULL, + `isOwn` INTEGER NOT NULL, + `stationId` INTEGER NOT NULL, + `stationType` INTEGER NOT NULL, + `latitude` REAL NOT NULL, + `longitude` REAL NOT NULL, + `speedMps` REAL NOT NULL, + `headingDeg` REAL NOT NULL, + `yawRateDps` REAL, + FOREIGN KEY(`tripId`) REFERENCES `trips`(`id`) + ON UPDATE NO ACTION ON DELETE CASCADE + ) + """.trimIndent() + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS `index_v2x_messages_tripId` " + + "ON `v2x_messages` (`tripId`)" + ) + } + } } } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/db/TripDao.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/db/TripDao.kt index a6f7365..6021a78 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/db/TripDao.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/db/TripDao.kt @@ -37,4 +37,15 @@ interface TripDao { @Query("SELECT COUNT(*) FROM detected_events WHERE tripId = :tripId") suspend fun getEventCountForTrip(tripId: Long): Int + + // ── V2X messages (Phase 03) ────────────────────────────────────────────────── + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertV2xMessage(message: V2xMessageEntity) + + @Query("SELECT * FROM v2x_messages WHERE tripId = :tripId ORDER BY timestamp ASC") + fun getV2xMessagesForTrip(tripId: Long): Flow> + + @Query("SELECT COUNT(*) FROM v2x_messages WHERE tripId = :tripId") + suspend fun getV2xMessageCountForTrip(tripId: Long): Int } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/db/V2xMessageEntity.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/db/V2xMessageEntity.kt new file mode 100644 index 0000000..76b3094 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/db/V2xMessageEntity.kt @@ -0,0 +1,51 @@ +package com.hawhamburg.micr0bu.data.db + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.PrimaryKey + +/** + * One CAM processed by [com.hawhamburg.micr0bu.data.cam.CamUseCaseRepository] (own or remote), + * persisted for the duration of an active recording session only. + * + * Retention policy (explicit user requirement, not derived from the requirements doc): while a + * trip is recording, every V2X message the detection engine sees is kept — the ride is the + * source of truth for later analysis, so nothing here should be silently dropped for storage + * reasons. Outside of a recording session, nothing is written to this table at all; the + * detection engine's own bounded in-memory history (see `UseCaseDetectionEngine.remoteHistory`) + * is the only thing tracking recent CAMs, and it can (and does) safely drop old samples once + * memory/relevance bounds are hit — there's no trip to correlate that data with anyway. + */ +@Entity( + tableName = "v2x_messages", + foreignKeys = [ + ForeignKey( + entity = RecordedTripEntity::class, + parentColumns = ["id"], + childColumns = ["tripId"], + onDelete = ForeignKey.CASCADE, + ) + ], +) +data class V2xMessageEntity( + @PrimaryKey(autoGenerate = true) + val id: Long = 0, + + @ColumnInfo(index = true) + val tripId: Long, + + /** Wall-clock epoch ms this CAM was processed. */ + val timestamp: Long, + + /** True if this was the ego micrOBU's own outgoing CAM, false if a remote road user's. */ + val isOwn: Boolean, + + val stationId: Long, + val stationType: Int, + val latitude: Double, + val longitude: Double, + val speedMps: Double, + val headingDeg: Double, + val yawRateDps: Double?, +) diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/MqttRepository.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/MqttRepository.kt index 8a7ca8c..aa5b111 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/MqttRepository.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/MqttRepository.kt @@ -1,5 +1,6 @@ package com.hawhamburg.micr0bu.data.mqtt +import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.data.transport.TransportType import com.hawhamburg.micr0bu.data.transport.UsbNetworkDetector import com.hawhamburg.micr0bu.domain.denm.DENM_CTRL_TOPIC @@ -16,6 +17,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn @@ -52,6 +54,7 @@ private val SUBSCRIBED_TOPICS = listOf( class MqttRepository @Inject constructor( private val prefs: MqttPreferences, private val usbDetector: UsbNetworkDetector, + private val obuHardwarePrefs: ObuHardwarePreferences, ) { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val clientId = "micr0bu-android-${UUID.randomUUID()}" @@ -72,13 +75,25 @@ class MqttRepository @Inject constructor( private val _topicMessages = MutableStateFlow>>(emptyMap()) val topicMessages: StateFlow>> = _topicMessages.asStateFlow() - /** Active transport derived from persisted prefs. */ - val activeTransport: StateFlow = prefs.prefsFlow - .map { p -> - if (p.activeTransport == MqttPrefs.TRANSPORT_USB_C) TransportType.USB_C - else TransportType.WIFI + /** Which physical OBU (Section 13) is currently selected. */ + val obuHardware: StateFlow = obuHardwarePrefs.obuHardwareFlow + .stateIn(scope, SharingStarted.Eagerly, ObuHardware.CIT_ONE) + + /** + * Active transport derived from persisted prefs, overridden by the selected OBU hardware: + * ESP32-C5 always resolves to [TransportType.USB_SERIAL] (a UART link, no MQTT-over-tethering + * broker exists on that hardware) regardless of the CiT-One-specific USB-C/Wi-Fi toggle. + */ + val activeTransport: StateFlow = combine( + prefs.prefsFlow, + obuHardwarePrefs.obuHardwareFlow, + ) { p, hardware -> + when { + hardware == ObuHardware.ESP32_C5 -> TransportType.USB_SERIAL + p.activeTransport == MqttPrefs.TRANSPORT_USB_C -> TransportType.USB_C + else -> TransportType.WIFI } - .stateIn(scope, SharingStarted.Eagerly, TransportType.USB_C) + }.stateIn(scope, SharingStarted.Eagerly, TransportType.USB_C) @Volatile private var activeClient: MqttAsyncClient? = null private var connectJob: Job? = null diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt new file mode 100644 index 0000000..37f5199 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/mqtt/ObuHardwarePreferences.kt @@ -0,0 +1,36 @@ +package com.hawhamburg.micr0bu.data.mqtt + +import android.content.Context +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import com.hawhamburg.micr0bu.data.transport.ObuHardware +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject +import javax.inject.Singleton + +private val Context.obuHardwareDataStore by preferencesDataStore(name = "obu_hardware_prefs") + +/** + * Persists which physical OBU (Section 13 / [ObuHardware]) the app is paired with. Defaults to + * [ObuHardware.CIT_ONE] — the hardware every existing feature (MQTT, DENM test trigger, CAM + * consumption) was built against. + */ +@Singleton +class ObuHardwarePreferences @Inject constructor( + @ApplicationContext private val context: Context, +) { + private object Keys { + val OBU_HARDWARE = stringPreferencesKey("obu_hardware") + } + + val obuHardwareFlow: Flow = context.obuHardwareDataStore.data.map { prefs -> + ObuHardware.entries.firstOrNull { it.id == prefs[Keys.OBU_HARDWARE] } ?: ObuHardware.CIT_ONE + } + + suspend fun setObuHardware(hardware: ObuHardware) { + context.obuHardwareDataStore.edit { prefs -> prefs[Keys.OBU_HARDWARE] = hardware.id } + } +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt new file mode 100644 index 0000000..6c1cf52 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/ObuHardware.kt @@ -0,0 +1,32 @@ +package com.hawhamburg.micr0bu.data.transport + +/** + * Which physical OBU the phone is paired with (Phase 03, requirements doc Section 13). + * + * The two hardware options differ in almost everything downstream: transport, CAM origin, + * and whether DENM triggering is available at all. See [com.hawhamburg.micr0bu.data.mqtt.ObuHardwarePreferences] + * for persistence and the Settings > Connection screen for the picker. + */ +enum class ObuHardware(val id: String) { + /** + * consider it CiT One — the primary Phase 01/02 hardware. Full V2X stack onboard: generates + * its own CAM autonomously, exposes an MQTT broker over USB-C tethering, supports DENM + * triggering via the Use Case API. + */ + CIT_ONE("cit_one"), + + /** + * ESP32-C5 — a "dumb" V2X transceiver (Phase 03 second OBU option). Sends/receives raw + * ITS-G5 frames only on the phone's instruction; no onboard CAM generation, no MQTT broker, + * no DENM use-case engine. The phone does the work: builds CAM from its own GNSS/IMU, UPER- + * encodes it, and pushes it down a USB serial (UART) link — see + * [com.hawhamburg.micr0bu.data.transport.UsbSerialTransport] and + * [com.hawhamburg.micr0bu.domain.cam.PhoneCamBuilder]. + * + * **Placeholder hardware option as of this writing** — the actual frame protocol between + * phone and ESP32-C5 firmware is not yet defined (pending translation of the existing + * ESP32 C firmware's logic to the Kotlin side). UI/settings exist so the option is visible + * and selectable, but connecting will not yet do anything real. + */ + ESP32_C5("esp32_c5"), +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/SerialFrame.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/SerialFrame.kt new file mode 100644 index 0000000..e03e7d6 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/SerialFrame.kt @@ -0,0 +1,138 @@ +package com.hawhamburg.micr0bu.data.transport + +/** + * Binary framing for the phone <-> ESP32-C5 link (Phase 03). Kotlin counterpart of the + * firmware's `obu-firmware/main/serial_link.c`/`.h` — frame shape and CRC algorithm MUST stay + * bit-for-bit identical between the two, since neither side validates the other's version. + * + * Frame format (both directions, symmetric): + * `[0xAA][0x55][type:1][length:2 LE][payload: length bytes][crc16:2 LE]` + * CRC16 is CRC-16/CCITT-FALSE (poly 0x1021, init 0xFFFF, no reflect, no xorout), computed over + * type + length + payload only (not the two sync bytes) — see [Crc16CcittFalse]. + */ +object SerialFrameType { + /** Phone -> ESP32: raw CAM UPER bytes to GeoNetworking-wrap and transmit immediately. */ + const val CAM_TX: Int = 0x01 + + /** ESP32 -> phone: payload is `[rssi: 1 signed][CAM UPER bytes...]`, already stripped of + * 802.11/LLC-SNAP/GeoNetworking/BTP-B framing by the firmware's `gn_unwrap.c`. */ + const val CAM_RX: Int = 0x02 + + /** ESP32 -> phone: 1-byte heartbeat (0 = ok), independent of CAM traffic. */ + const val STATUS: Int = 0x03 +} + +/** Max payload this link carries — matches `SERIAL_LINK_MAX_PAYLOAD` in the firmware. */ +const val SERIAL_LINK_MAX_PAYLOAD = 160 + +private const val SYNC0: Byte = 0xAA.toByte() +private const val SYNC1: Byte = 0x55.toByte() + +object Crc16CcittFalse { + /** MUST match the firmware's `crc16_ccitt_false` in `serial_link.c` byte-for-byte. */ + fun compute(data: ByteArray, offset: Int = 0, length: Int = data.size - offset): Int { + var crc = 0xFFFF + for (i in offset until offset + length) { + crc = crc xor ((data[i].toInt() and 0xFF) shl 8) + repeat(8) { + crc = if (crc and 0x8000 != 0) ((crc shl 1) xor 0x1021) else (crc shl 1) + crc = crc and 0xFFFF + } + } + return crc + } +} + +data class DecodedFrame(val type: Int, val payload: ByteArray) + +object SerialFrameEncoder { + /** Builds a complete frame ready to write to the serial port. */ + fun encode(type: Int, payload: ByteArray): ByteArray { + require(payload.size <= SERIAL_LINK_MAX_PAYLOAD) { + "payload too large for serial link (${payload.size} > $SERIAL_LINK_MAX_PAYLOAD)" + } + val head = byteArrayOf(type.toByte(), (payload.size and 0xFF).toByte(), ((payload.size shr 8) and 0xFF).toByte()) + val crcInput = head + payload + val crc = Crc16CcittFalse.compute(crcInput) + val out = ByteArray(2 + crcInput.size + 2) + out[0] = SYNC0 + out[1] = SYNC1 + crcInput.copyInto(out, destinationOffset = 2) + out[out.size - 2] = (crc and 0xFF).toByte() + out[out.size - 1] = ((crc shr 8) and 0xFF).toByte() + return out + } +} + +/** + * Stateful streaming decoder — feed it bytes as they arrive from the serial port (which may + * split or coalesce frames arbitrarily), and it emits [DecodedFrame]s as complete, checksummed + * frames are found. Mirrors the firmware's byte-at-a-time state machine in `serial_link.c`'s + * `rx_task` exactly (same states, same resync-on-mismatch behavior), just processing a whole + * chunk of newly-arrived bytes per call instead of one byte per loop iteration. + * + * Not thread-safe — feed bytes from a single reader coroutine/thread. + */ +class SerialFrameDecoder { + private enum class State { WAIT_SYNC0, WAIT_SYNC1, WAIT_TYPE, WAIT_LEN_LO, WAIT_LEN_HI, WAIT_PAYLOAD, WAIT_CRC_LO, WAIT_CRC_HI } + + private var state = State.WAIT_SYNC0 + private var type = 0 + private var len = 0 + private var payloadIdx = 0 + private val payload = ByteArray(SERIAL_LINK_MAX_PAYLOAD) + private var crcRecv = 0 + + /** Feeds [count] new bytes from [data] (starting at [offset]) and returns any complete, valid frames found. */ + fun onBytes(data: ByteArray, offset: Int = 0, count: Int = data.size - offset): List { + val out = mutableListOf() + for (i in offset until offset + count) { + val b = data[i].toInt() and 0xFF + when (state) { + State.WAIT_SYNC0 -> state = if (b == (SYNC0.toInt() and 0xFF)) State.WAIT_SYNC1 else State.WAIT_SYNC0 + State.WAIT_SYNC1 -> state = when (b) { + SYNC1.toInt() and 0xFF -> State.WAIT_TYPE + SYNC0.toInt() and 0xFF -> State.WAIT_SYNC1 + else -> State.WAIT_SYNC0 + } + State.WAIT_TYPE -> { + type = b + state = State.WAIT_LEN_LO + } + State.WAIT_LEN_LO -> { + len = b + state = State.WAIT_LEN_HI + } + State.WAIT_LEN_HI -> { + len = len or (b shl 8) + state = when { + len > SERIAL_LINK_MAX_PAYLOAD -> State.WAIT_SYNC0 // can't trust the frame boundary - resync + len == 0 -> { payloadIdx = 0; State.WAIT_CRC_LO } + else -> { payloadIdx = 0; State.WAIT_PAYLOAD } + } + } + State.WAIT_PAYLOAD -> { + payload[payloadIdx++] = b.toByte() + if (payloadIdx >= len) state = State.WAIT_CRC_LO + } + State.WAIT_CRC_LO -> { + crcRecv = b + state = State.WAIT_CRC_HI + } + State.WAIT_CRC_HI -> { + crcRecv = crcRecv or (b shl 8) + val head = byteArrayOf(type.toByte(), (len and 0xFF).toByte(), ((len shr 8) and 0xFF).toByte()) + val crcInput = head + payload.copyOf(len) + val crcCalc = Crc16CcittFalse.compute(crcInput) + if (crcCalc == crcRecv) { + out.add(DecodedFrame(type, payload.copyOf(len))) + } + // CRC mismatch: silently drop, matching firmware behavior - a corrupt frame + // on a link this fast recovers on its own within one beacon interval. + state = State.WAIT_SYNC0 + } + } + } + return out + } +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/TransportType.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/TransportType.kt index c3a76e2..182c2ed 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/TransportType.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/TransportType.kt @@ -1,3 +1,10 @@ package com.hawhamburg.micr0bu.data.transport -enum class TransportType { USB_C, WIFI, BLUETOOTH } +/** + * [USB_C] — Android USB tethering (virtual Ethernet) to the CiT One's onboard MQTT broker. + * [USB_SERIAL] — direct UART link over USB-C to an ESP32-C5's serial port (Phase 03, no + * network/MQTT layer involved — see [com.hawhamburg.micr0bu.data.transport.UsbSerialTransport]). + * [WIFI] — developer/legacy transport to a Wi-Fi-reachable MQTT broker. + * [BLUETOOTH] — planned production transport, not yet implemented (either OBU). + */ +enum class TransportType { USB_C, USB_SERIAL, WIFI, BLUETOOTH } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/data/transport/UsbSerialTransport.kt b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/UsbSerialTransport.kt new file mode 100644 index 0000000..b4bd71a --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/data/transport/UsbSerialTransport.kt @@ -0,0 +1,206 @@ +package com.hawhamburg.micr0bu.data.transport + +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.hardware.usb.UsbDevice +import android.hardware.usb.UsbManager +import android.os.Build +import com.hoho.android.usbserial.driver.UsbSerialDriver +import com.hoho.android.usbserial.driver.UsbSerialPort +import com.hoho.android.usbserial.driver.UsbSerialProber +import com.hoho.android.usbserial.util.SerialInputOutputManager +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import javax.inject.Inject +import javax.inject.Singleton + +/** Connection lifecycle for the ESP32-C5 USB-serial link. */ +enum class UsbSerialState { DISCONNECTED, DEVICE_ATTACHED, PERMISSION_REQUESTED, CONNECTED, ERROR } + +private const val ACTION_USB_PERMISSION = "com.hawhamburg.micr0bu.USB_SERIAL_PERMISSION" + +/** + * UART connection handler for the ESP32-C5 (Phase 03 second OBU option, requirements doc + * Section 13). Unlike [UsbNetworkDetector] (CiT One, USB-C tethering → virtual Ethernet → MQTT + * broker), the ESP32-C5 has no MQTT broker or IP network at all — it's reachable only as a USB + * serial (UART) device, framed per [SerialFrameType] (see that file's KDoc — must stay + * bit-for-bit compatible with the firmware's `obu-firmware/main/serial_link.c`). + * + * Built on `com.github.mik3y:usb-serial-for-android`, which auto-detects CDC-ACM (what the + * ESP32-C5's native USB is expected to enumerate as) plus common USB-UART bridge chips as a + * fallback, so this doesn't need to hardcode a specific driver class. + * + * Baud rate is fixed at 115200 to match `SERIAL_LINK_BAUD` in the firmware — if that ever + * changes on the firmware side, [BAUD_RATE] here must change with it. + */ +@Singleton +class UsbSerialTransport @Inject constructor( + @ApplicationContext private val context: Context, +) { + companion object { + private const val BAUD_RATE = 115_200 + } + + private val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager + + private val _state = MutableStateFlow(UsbSerialState.DISCONNECTED) + val state: StateFlow = _state.asStateFlow() + + private val _incomingFrames = MutableSharedFlow(extraBufferCapacity = 256) + /** Every valid frame the ESP32 sends (CAM_RX and STATUS) — callers filter by [DecodedFrame.type]. */ + val incomingFrames: SharedFlow = _incomingFrames.asSharedFlow() + + private val decoder = SerialFrameDecoder() + + @Volatile private var port: UsbSerialPort? = null + @Volatile private var ioManager: SerialInputOutputManager? = null + @Volatile private var pendingDevice: UsbDevice? = null + + private val permissionReceiver = object : BroadcastReceiver() { + override fun onReceive(ctx: Context, intent: Intent) { + if (intent.action != ACTION_USB_PERMISSION) return + synchronized(this) { + val device: UsbDevice? = intent.getUsbDeviceExtra() + val granted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) + if (granted && device != null) { + openDevice(device) + } else { + _state.value = UsbSerialState.ERROR + } + } + } + } + + private var receiverRegistered = false + + /** + * Finds the first attached USB-serial-capable device, requests permission if needed, and + * opens it. Safe to call repeatedly (e.g. from a "retry" UI action) — no-ops if already + * connected. + */ + fun connect() { + if (_state.value == UsbSerialState.CONNECTED) return + + ensureReceiverRegistered() + + val availableDrivers: List = + UsbSerialProber.getDefaultProber().findAllDrivers(usbManager) + val driver = availableDrivers.firstOrNull() + if (driver == null) { + _state.value = UsbSerialState.DISCONNECTED + return + } + + val device = driver.device + _state.value = UsbSerialState.DEVICE_ATTACHED + + if (usbManager.hasPermission(device)) { + openDevice(device) + } else { + pendingDevice = device + _state.value = UsbSerialState.PERMISSION_REQUESTED + val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0 + val permissionIntent = PendingIntent.getBroadcast( + context, 0, Intent(ACTION_USB_PERMISSION).setPackage(context.packageName), flags, + ) + usbManager.requestPermission(device, permissionIntent) + } + } + + private fun openDevice(device: UsbDevice) { + val driver = UsbSerialProber.getDefaultProber().probeDevice(device) + if (driver == null || driver.ports.isEmpty()) { + _state.value = UsbSerialState.ERROR + return + } + val connection = usbManager.openDevice(device) + if (connection == null) { + _state.value = UsbSerialState.ERROR + return + } + + val newPort = driver.ports[0] + try { + newPort.open(connection) + newPort.setParameters(BAUD_RATE, UsbSerialPort.DATABITS_8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE) + } catch (e: Exception) { + runCatching { newPort.close() } + _state.value = UsbSerialState.ERROR + return + } + + port = newPort + val manager = SerialInputOutputManager(newPort, object : SerialInputOutputManager.Listener { + override fun onNewData(data: ByteArray) { + val frames = decoder.onBytes(data) + frames.forEach { _incomingFrames.tryEmit(it) } + } + + override fun onRunError(e: Exception) { + _state.value = UsbSerialState.ERROR + } + }) + ioManager = manager + // This version of the library manages its own background thread internally - + // SerialInputOutputManager.start()/stop() rather than the older pattern of the caller + // submitting it to an Executor/Thread as a Runnable (which this version's class no + // longer exposes for external use - see the two earlier compile errors this replaced). + manager.start() + + _state.value = UsbSerialState.CONNECTED + } + + /** + * Encodes [camUperBytes] as a [SerialFrameType.CAM_TX] frame and writes it to the port. + * No-op (returns false) if not currently connected — callers (the CAM transmit loop) should + * treat that as "this beacon interval's CAM didn't go out," not a fatal error; the next one + * is only ~1s away and will retry naturally. + */ + fun sendCamTx(camUperBytes: ByteArray): Boolean { + val p = port ?: return false + return try { + val frame = SerialFrameEncoder.encode(SerialFrameType.CAM_TX, camUperBytes) + p.write(frame, /* timeout ms */ 200) + true + } catch (e: Exception) { + _state.value = UsbSerialState.ERROR + false + } + } + + fun disconnect() { + ioManager?.stop() // stops the manager's own internal background thread + ioManager = null + runCatching { port?.close() } + port = null + _state.value = UsbSerialState.DISCONNECTED + } + + private fun ensureReceiverRegistered() { + if (receiverRegistered) return + val filter = IntentFilter(ACTION_USB_PERMISSION) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.registerReceiver(permissionReceiver, filter, Context.RECEIVER_NOT_EXPORTED) + } else { + @Suppress("UnspecifiedRegisterReceiverFlag") + context.registerReceiver(permissionReceiver, filter) + } + receiverRegistered = true + } + + private fun Intent.getUsbDeviceExtra(): UsbDevice? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableExtra(UsbManager.EXTRA_DEVICE, UsbDevice::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableExtra(UsbManager.EXTRA_DEVICE) + } +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/Asn1UperCodec.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/Asn1UperCodec.kt new file mode 100644 index 0000000..0d3bf3c --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/Asn1UperCodec.kt @@ -0,0 +1,42 @@ +package com.hawhamburg.micr0bu.domain.asn1 + +import com.hawhamburg.micr0bu.domain.cam.Cam +import javax.inject.Inject +import javax.inject.Singleton + +/** + * UPER (Unaligned Packed Encoding Rules) codec for CAM, used on the ESP32-C5 hardware path + * (Phase 03, Section 13): the phone builds outgoing CAM itself + * ([com.hawhamburg.micr0bu.domain.cam.PhoneCamBuilder]) and UPER-encodes it before handing bytes + * to [com.hawhamburg.micr0bu.data.transport.UsbSerialTransport], and UPER-decodes whatever the + * ESP32-C5 forwards back on receive (already stripped of 802.11/GeoNetworking/BTP framing by + * the firmware's `gn_unwrap.c` — this only ever sees CAM UPER bytes, never raw radio frames). + * + * On the CiT One path this doesn't exist at all — that OBU encodes/decodes its own CAM/DENM + * onboard and only ever gives the phone already-parsed JSON over MQTT. + * + * The earlier open question ("does Kotlin have a UPER ASN.1 library for V2X") resolved to: no + * library needed. The ESP32-C5's own transmit firmware (`obu-firmware/main/cam.c`) already + * hand-builds CAM's UPER bitstream field-by-field rather than using a schema compiler, and that + * turned out to be the right reference to port directly — see [CamUperCodec], a bit-for-bit + * Kotlin port of that C function (plus a new decode direction the firmware never needed, since + * it was transmit-only). A schema-driven library (OSS Nokalva, Obj-Sys, `alexvoronov/ + * geonetworking`) would only be worth revisiting if this project ever needs to encode/decode + * message types beyond CAM. + */ +interface Asn1UperCodec { + /** Encode a domain CAM into a UPER-encoded ETSI EN 302637-2 CAM byte frame. */ + fun encodeCam(cam: Cam): ByteArray + + /** Decode a UPER-encoded ETSI EN 302637-2 CAM byte frame into a domain CAM, or null if unparseable. */ + fun decodeCam(frame: ByteArray, receivedAtEpochMs: Long): Cam? +} + +/** [Asn1UperCodec] backed by [CamUperCodec]. Stateless — safe as a Hilt singleton. */ +@Singleton +class RealAsn1UperCodec @Inject constructor() : Asn1UperCodec { + override fun encodeCam(cam: Cam): ByteArray = CamUperCodec.encode(cam) + + override fun decodeCam(frame: ByteArray, receivedAtEpochMs: Long): Cam? = + CamUperCodec.decode(frame, receivedAtEpochMs) +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitReader.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitReader.kt new file mode 100644 index 0000000..eff48a7 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitReader.kt @@ -0,0 +1,37 @@ +package com.hawhamburg.micr0bu.domain.asn1 + +/** + * MSB-first bit reader — the decode-side inverse of [BitWriter]. No equivalent existed in the + * firmware (which only ever transmitted, never decoded CAM) — this is new code, but follows the + * exact same bit-order convention [BitWriter]/`cam.c`'s `bw_put_bits` uses, since it has to + * unpack what that packer (or the real firmware using the same layout) produced. + */ +class BitReader(private val data: ByteArray) { + private var bitPos = 0 + + /** True if at least [nbits] more bits remain. */ + fun hasBits(nbits: Int): Boolean = bitPos + nbits <= data.size * 8 + + /** + * Reads [nbits] bits (MSB first) as an unsigned value in a Long. Throws + * [IndexOutOfBoundsException] if the buffer is exhausted — callers decoding a fixed, + * known-length CAM structure should treat that as "truncated/corrupt frame," same as any + * other malformed-input case. + */ + fun getBits(nbits: Int): Long { + var value = 0L + repeat(nbits) { + val byteIdx = bitPos / 8 + if (byteIdx >= data.size) throw IndexOutOfBoundsException("BitReader: buffer exhausted") + val bitIdx = 7 - (bitPos % 8) + val bit = (data[byteIdx].toInt() ushr bitIdx) and 1 + value = (value shl 1) or bit.toLong() + bitPos++ + } + return value + } + + fun getBitsInt(nbits: Int): Int = getBits(nbits).toInt() + + val bitPosition: Int get() = bitPos +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitWriter.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitWriter.kt new file mode 100644 index 0000000..b6d9bf0 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/BitWriter.kt @@ -0,0 +1,41 @@ +package com.hawhamburg.micr0bu.domain.asn1 + +/** + * MSB-first bit packer — ASN.1 UPER is a bitstream, not a byte stream. Direct Kotlin port of + * `bitwriter_t` / `bw_put_bits` in the ESP32 firmware's `obu-firmware/main/cam.c`, kept + * bit-for-bit identical since [CamUperCodec] depends on matching that layout exactly for + * interop with the firmware's `gn_unwrap.c` / ESP32-side (de facto reference) understanding of + * the wire format. + * + * Not thread-safe; one instance per encode call. + */ +class BitWriter(private val maxBytes: Int) { + private val buf = ByteArray(maxBytes) + private var bitPos = 0 + + /** + * Writes the low [nbits] bits of [value], MSB first. Silently stops writing (rather than + * throwing) once [maxBytes] is exhausted — mirrors the firmware's overflow guard; callers + * that care should check [byteLength] against their expected size afterward, same as + * `cam_encode`'s caller checks its return value. + */ + fun putBits(value: Long, nbits: Int) { + for (i in nbits - 1 downTo 0) { + val byteIdx = bitPos / 8 + if (byteIdx >= maxBytes) return // overflow guard, matches bw_put_bits + val bitIdx = 7 - (bitPos % 8) + val bit = (value ushr i) and 1L + buf[byteIdx] = (buf[byteIdx].toInt() or (bit.toInt() shl bitIdx)).toByte() + bitPos++ + } + } + + /** Convenience for callers passing an Int/UInt-range value. */ + fun putBits(value: Int, nbits: Int) = putBits(value.toLong() and 0xFFFFFFFFL, nbits) + + /** Number of whole bytes written so far, rounding up a partial final byte (like `bw_byte_len`). */ + val byteLength: Int get() = (bitPos + 7) / 8 + + /** Returns the written bytes, trimmed to [byteLength]. */ + fun toByteArray(): ByteArray = buf.copyOf(byteLength) +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt new file mode 100644 index 0000000..9d6fefa --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/asn1/CamUperCodec.kt @@ -0,0 +1,260 @@ +package com.hawhamburg.micr0bu.domain.asn1 + +import com.hawhamburg.micr0bu.domain.cam.Cam +import kotlin.math.roundToInt +import kotlin.math.roundToLong + +/** + * Real ASN.1 UPER encoder/decoder for CAM (ETSI EN 302637-2 v1.4.1 CAM-PDU-Descriptions + + * TS 102894-2 v1.3.1 ITS-Container), covering exactly the field set the ESP32 firmware's + * `obu-firmware/main/cam.c` transmits — [encode] is a bit-for-bit port of that C function (same + * field order, same bit widths, same "unavailable" sentinel values), so a real ITS-G5 receiver + * that understood the firmware's old locally-built frames understands these too. [decode] is + * new (the firmware never decoded CAM — it only ever beaconed a bench-location test frame), but + * follows the identical layout in reverse. + * + * Unlike `cam.c` — which hardcoded every vehicle-dynamics field to its ASN.1 "unavailable" + * value because it had no real sensors wired in — this encodes real values wherever the phone + * actually has them ([Cam.yawRateDps], [Cam.driveDirection], [Cam.vehicleLengthM]/[vehicleWidthM], + * [Cam.accelerationMps2]), falling back to the same sentinels only when a field is null. This is + * strictly more complete than the firmware reference, not a deviation from it — the wire format + * has always supported these fields, the old firmware just never had data to put in them. + * + * Not yet covered: PosConfidenceEllipse / AltitudeConfidence / HeadingConfidence / + * SpeedConfidence / CurvatureValue / CurvatureCalculationMode are all still encoded as + * "unavailable," same as `cam.c` — none of that is derivable from what [Cam] carries today. + * `CurvatureValue` in particular *could* be derived from yaw rate ÷ speed, but that's unstable + * at low speed and deliberately left as a follow-up rather than guessed at here. + */ +object CamUperCodec { + + /** Encode buffer size — matches `cam.c`'s `cam_payload[96]`, the known-sufficient size. */ + private const val ENCODE_BUFFER_BYTES = 96 + + // TimestampIts epoch: 2004-01-01T00:00:00Z, in Unix epoch milliseconds. + private const val TS_ITS_EPOCH_MS = 1_072_915_200_000L + + // ASN.1 "unavailable" sentinel values, straight from the CAM/ITS-Container modules (also + // documented inline in cam.c against each field). + private const val HEADING_UNAVAILABLE = 3601 + private const val SPEED_MAX = 16382 // 16383 is the type's own unavailable value; stay under it + private const val DRIVE_DIRECTION_UNAVAILABLE = 2 + private const val VEHICLE_LENGTH_UNAVAILABLE = 1023 + private const val VEHICLE_WIDTH_UNAVAILABLE = 62 + private const val ACCEL_UNAVAILABLE = 161 + private const val YAW_RATE_UNAVAILABLE = 32767 + + /** Converts a wall-clock epoch-ms timestamp to a UPER GenerationDeltaTime (TimestampIts mod 65536). */ + fun generationDeltaTime(epochMs: Long): Int { + val itsMs = epochMs - TS_ITS_EPOCH_MS + // floorMod so this stays well-defined even for epochMs before the ITS epoch (shouldn't + // happen with a real clock, but avoids a negative/UB result if it ever does). + return Math.floorMod(itsMs, 65536L).toInt() + } + + /** + * Encodes [cam] as a UPER CAM byte string. [cam.timestamp] is used as the wall-clock source + * for GenerationDeltaTime — pass the actual moment this CAM is being transmitted, not some + * earlier sample time, since GenerationDeltaTime is defined relative to transmission. + */ + fun encode(cam: Cam): ByteArray { + val bw = BitWriter(ENCODE_BUFFER_BYTES) + + // ---- ItsPduHeader ---- + bw.putBits(2, 8) // protocolVersion = 2 + bw.putBits(2, 8) // messageID = cam(2) + bw.putBits(cam.stationId, 32) // stationID (low 32 bits if stationId is wider) + + // ---- CoopAwareness ---- + bw.putBits(generationDeltaTime(cam.timestamp), 16) + + // ---- CamParameters ---- extension(0), lowFrequencyContainer present(1), specialVehicleContainer absent(0) + bw.putBits(0, 1) + bw.putBits(1, 1) + bw.putBits(0, 1) + + // ---- BasicContainer ---- extension(0) + bw.putBits(0, 1) + bw.putBits(cam.stationType, 8) + + // ReferencePosition + val latOffset = (cam.latitude * 1e7).roundToLong() - (-900000000L) + bw.putBits(latOffset, 31) + val lonOffset = (cam.longitude * 1e7).roundToLong() - (-1800000000L) + bw.putBits(lonOffset, 32) + bw.putBits(4095, 12) // semiMajorConfidence: unavailable + bw.putBits(4095, 12) // semiMinorConfidence: unavailable + bw.putBits(3601, 12) // semiMajorOrientation: unavailable + bw.putBits(900001, 20) // altitudeValue: unavailable + bw.putBits(15, 4) // altitudeConfidence: unavailable + + // ---- HighFrequencyContainer CHOICE ---- extension(0), index 0 = basicVehicleContainerHighFrequency + bw.putBits(0, 1) + bw.putBits(0, 1) + + bw.putBits(0, 7) // 7 optional-presence bits, all absent + + val headingDdeg = if (cam.headingDeg.isFinite()) { + (Math.floorMod((cam.headingDeg * 10.0).roundToInt(), 3600)) + } else { + HEADING_UNAVAILABLE + } + bw.putBits(headingDdeg, 12) + bw.putBits(126, 7) // headingConfidence: unavailable + + val speedCmS = (cam.speedMps * 100.0).roundToInt().coerceIn(0, SPEED_MAX) + bw.putBits(speedCmS, 14) + bw.putBits(126, 7) // speedConfidence: unavailable + + val driveDirection = cam.driveDirection?.coerceIn(0, 1) ?: DRIVE_DIRECTION_UNAVAILABLE + bw.putBits(driveDirection, 2) + + val vehicleLengthDm = cam.vehicleLengthM + ?.let { (it * 10.0).roundToInt().coerceIn(1, 1023) } + ?: VEHICLE_LENGTH_UNAVAILABLE + bw.putBits(vehicleLengthDm - 1, 10) + bw.putBits(4, 3) // vehicleLengthConfidenceIndication: unavailable + + val vehicleWidthDm = cam.vehicleWidthM + ?.let { (it * 10.0).roundToInt().coerceIn(1, 62) } + ?: VEHICLE_WIDTH_UNAVAILABLE + bw.putBits(vehicleWidthDm - 1, 6) + + val accelTenths = cam.accelerationMps2 + ?.let { (it * 10.0).roundToInt().coerceIn(-160, 160) } + ?: ACCEL_UNAVAILABLE + bw.putBits(accelTenths - (-160), 9) + bw.putBits(102, 7) // longitudinalAccelerationConfidence: unavailable + + bw.putBits(1023 - (-1023), 11) // curvatureValue: unavailable (not derived - see class KDoc) + bw.putBits(7, 3) // curvatureConfidence: unavailable + bw.putBits(2, 2) // curvatureCalculationMode: unavailable + + val yawRateCentiDegS = cam.yawRateDps + ?.let { (it * 100.0).roundToInt().coerceIn(-32766, 32766) } + ?: YAW_RATE_UNAVAILABLE + bw.putBits(yawRateCentiDegS - (-32766), 16) + bw.putBits(7, 3) // yawRateConfidence: unavailable + + // ---- LowFrequencyContainer CHOICE ---- extension(0) -> basicVehicleContainerLowFrequency + bw.putBits(0, 1) + bw.putBits(0, 4) // vehicleRole: default(0) + bw.putBits(0, 8) // exteriorLights: all off + bw.putBits(0, 6) // pathHistory: empty + + return bw.toByteArray() + } + + /** + * Decodes a UPER CAM byte string into a domain [Cam] (always `isOwn = false` — this is only + * used for CAMs received from other stations; the ego's own CAM never round-trips through + * this). Returns null if the bytes aren't a CAM this codec understands: wrong + * protocolVersion/messageID, a CamParameters/HighFrequencyContainer/LowFrequencyContainer + * shape we don't decode (extension in use, RSU container instead of vehicle, or a + * specialVehicleContainer present — none of those are things this project transmits or + * currently needs to receive), or a truncated frame. + * + * [receivedAtEpochMs] becomes [Cam.timestamp] (wall-clock receipt time) — GenerationDeltaTime + * alone (a value mod 65536 ms) isn't enough on its own to reconstruct an absolute timestamp + * without also knowing which 65.536s window it falls in, so local receipt time is used + * instead, same convention the rest of this app's Cam pipeline already relies on. + */ + fun decode(bytes: ByteArray, receivedAtEpochMs: Long): Cam? { + return try { + decodeOrThrow(bytes, receivedAtEpochMs) + } catch (e: IndexOutOfBoundsException) { + null // truncated frame + } + } + + private fun decodeOrThrow(bytes: ByteArray, receivedAtEpochMs: Long): Cam? { + val br = BitReader(bytes) + + val protocolVersion = br.getBitsInt(8) + val messageId = br.getBitsInt(8) + if (protocolVersion != 2 || messageId != 2) return null // not a CAM we recognize + + val stationId = br.getBits(32) + br.getBits(16) // generationDeltaTime - not used, we timestamp on receipt instead + + val camParamsExt = br.getBitsInt(1) + if (camParamsExt != 0) return null // extension in use - unsupported shape + val lowFreqPresent = br.getBitsInt(1) == 1 + val specialVehiclePresent = br.getBitsInt(1) == 1 + if (specialVehiclePresent) return null // different container shape we don't parse + + val basicContainerExt = br.getBitsInt(1) + if (basicContainerExt != 0) return null + val stationType = br.getBitsInt(8) + + val latOffset = br.getBits(31) + val latitude = (latOffset + (-900000000L)) / 1e7 + val lonOffset = br.getBits(32) + val longitude = (lonOffset + (-1800000000L)) / 1e7 + br.getBits(12) // semiMajorConfidence + br.getBits(12) // semiMinorConfidence + br.getBits(12) // semiMajorOrientation + br.getBits(20) // altitudeValue + br.getBits(4) // altitudeConfidence + + val highFreqExt = br.getBitsInt(1) + val highFreqIndex = br.getBitsInt(1) + if (highFreqExt != 0 || highFreqIndex != 0) return null // extension, or rsuContainerHighFrequency + + br.getBits(7) // 7 optional-presence bits + + val headingRaw = br.getBitsInt(12) + br.getBits(7) // headingConfidence + val headingDeg = headingRaw / 10.0 + + val speedRaw = br.getBitsInt(14) + br.getBits(7) // speedConfidence + val speedMps = speedRaw / 100.0 + + val driveDirectionRaw = br.getBitsInt(2) + val driveDirection = if (driveDirectionRaw == DRIVE_DIRECTION_UNAVAILABLE) null else driveDirectionRaw + + val vehicleLengthRaw = br.getBitsInt(10) + 1 + br.getBits(3) // vehicleLengthConfidenceIndication + val vehicleLengthM = if (vehicleLengthRaw == VEHICLE_LENGTH_UNAVAILABLE) null else vehicleLengthRaw / 10.0 + + val vehicleWidthRaw = br.getBitsInt(6) + 1 + val vehicleWidthM = if (vehicleWidthRaw == VEHICLE_WIDTH_UNAVAILABLE) null else vehicleWidthRaw / 10.0 + + val accelRaw = br.getBitsInt(9) + (-160) + br.getBits(7) // longitudinalAccelerationConfidence + val accelerationMps2 = if (accelRaw == ACCEL_UNAVAILABLE) null else accelRaw / 10.0 + + br.getBits(11) // curvatureValue + br.getBits(3) // curvatureConfidence + br.getBits(2) // curvatureCalculationMode + + val yawRateRaw = br.getBitsInt(16) + (-32766) + br.getBits(3) // yawRateConfidence + val yawRateDps = if (yawRateRaw == YAW_RATE_UNAVAILABLE) null else yawRateRaw / 100.0 + + if (lowFreqPresent) { + val lowFreqExt = br.getBitsInt(1) + if (lowFreqExt != 0) return null + br.getBits(4) // vehicleRole + br.getBits(8) // exteriorLights + br.getBits(6) // pathHistory count (0..40) - not decoded into path points, just consumed + } + + return Cam( + stationId = stationId, + stationType = stationType, + latitude = latitude, + longitude = longitude, + speedMps = speedMps, + headingDeg = headingDeg, + yawRateDps = yawRateDps, + driveDirection = driveDirection, + vehicleLengthM = vehicleLengthM, + vehicleWidthM = vehicleWidthM, + accelerationMps2 = accelerationMps2, + timestamp = receivedAtEpochMs, + isOwn = false, + ) + } +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/cam/CamTransmitConfig.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/cam/CamTransmitConfig.kt new file mode 100644 index 0000000..a29e442 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/cam/CamTransmitConfig.kt @@ -0,0 +1,43 @@ +package com.hawhamburg.micr0bu.domain.cam + +/** + * A geofenced area where CAM transmit rate should increase above the base rate — e.g. a known + * signalized intersection where VRU-vehicle conflicts are more likely (Phase 03, Section 13). + * + * **Placeholder values.** Exact radius and elevated rate are explicitly "still to be tuned" + * per the user's Phase 03 spec — these are initial engineering estimates only, matching the + * disclaimer pattern already used for [com.hawhamburg.micr0bu.domain.usecase.UseCaseDetectionConfig]. + */ +data class CamGeofence( + val label: String, + val latitude: Double, + val longitude: Double, + val radiusM: Double = 60.0, +) + +/** + * CAM transmit-rate policy for the phone-generated CAM path (ESP32-C5 hardware only — see + * [PhoneCamBuilder]). The CiT One generates and rates its own CAM autonomously onboard; this + * config has no effect on that path. + * + * Requirements (Section 13): 1 Hz base rate, only while a recording session is active; rate + * increases inside known high-risk geofenced areas. Exact elevated rate/radius are not yet + * tuned — [elevatedRateHz] and each [CamGeofence.radiusM] are placeholders. + */ +data class CamTransmitConfig( + /** Base transmit rate, Hz, used everywhere outside a geofence. */ + val baseRateHz: Double = 1.0, + + /** Elevated transmit rate, Hz, used inside a [geofences] entry. Not yet tuned. */ + val elevatedRateHz: Double = 4.0, + + /** Known high-risk areas (e.g. signalized intersections) where [elevatedRateHz] applies. */ + val geofences: List = emptyList(), + + /** + * CAM transmission only runs while a recording session is active (Section 13) — this is + * not a rate knob, it's a hard on/off gate enforced by whatever wires [PhoneCamBuilder] + * into [com.hawhamburg.micr0bu.service.TripRecordingService]. + */ + val activeOnlyDuringRecording: Boolean = true, +) diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/cam/PhoneCamBuilder.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/cam/PhoneCamBuilder.kt new file mode 100644 index 0000000..9fc4bc8 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/cam/PhoneCamBuilder.kt @@ -0,0 +1,71 @@ +package com.hawhamburg.micr0bu.domain.cam + +import com.hawhamburg.micr0bu.data.GnssReading +import kotlin.math.abs + +/** + * Builds an outgoing [Cam] from the phone's own GNSS + gyroscope, for the ESP32-C5 hardware + * path (Phase 03, Section 13) where the OBU itself generates no CAM at all — the phone must. + * + * This class only does the sensor-fusion-into-CAM-fields part, which is independent of the + * (not yet defined) wire protocol to the ESP32-C5. It is **not yet wired into any transmit + * pipeline** — nothing calls this today. Once the ESP32 firmware protocol is translated to + * Kotlin and [com.hawhamburg.micr0bu.domain.asn1.Asn1UperCodec] has a real implementation, the + * intended flow is: + * + * `PhoneCamBuilder.build(...)` → `Asn1UperCodec.encodeCam(...)` → `UsbSerialTransport` (write). + * + * Position/speed/heading come straight from GNSS. Yaw rate is derived from the gyroscope's + * z-axis reading (rotation about the vertical axis while the phone is roughly flat/mounted + * upright) rather than from GNSS heading deltas, which are noisy at low speed — same rationale + * already used for remote-vehicle turn detection in [com.hawhamburg.micr0bu.domain.usecase.UseCaseDetectionEngine]. + */ +object PhoneCamBuilder { + + /** Placeholder station ID until real station-ID assignment/config exists for this path. */ + private const val PLACEHOLDER_OWN_STATION_ID = 0L + + /** + * @param gnss latest phone GNSS fix. + * @param gyroZRadPerSec latest gyroscope z-axis reading, rad/s (device frame). Positive per + * Android's convention is counter-clockwise around +Z; converted to the clockwise-positive + * yaw rate convention already used by [Cam.yawRateDps] to match OBU/remote CAM data. + * @param stationId this device's own station ID. Defaults to a placeholder until Phase 03 + * defines how the phone learns/assigns an ID on the ESP32-C5 path (the CiT One path + * currently learns this from `v2x/rx/obu_gnss`'s own_info, which doesn't exist here). + */ + fun build( + gnss: GnssReading, + gyroZRadPerSec: Float?, + stationId: Long = PLACEHOLDER_OWN_STATION_ID, + ): Cam { + val yawRateDps = gyroZRadPerSec?.let { -it * RAD_TO_DEG } // negate: CCW+ -> CW+ convention + + return Cam( + stationId = stationId, + stationType = StationType.CYCLIST, + latitude = gnss.latitude, + longitude = gnss.longitude, + speedMps = gnss.speedMs.toDouble(), + headingDeg = normalizeHeading(gnss.bearingDeg.toDouble()), + yawRateDps = yawRateDps?.let { if (abs(it) < YAW_RATE_NOISE_FLOOR_DPS) 0.0 else it }, + timestamp = gnss.timestamp, + isOwn = true, + ) + } + + private fun normalizeHeading(deg: Double): Double { + var h = deg % 360.0 + if (h < 0) h += 360.0 + return h + } + + private const val RAD_TO_DEG = 180.0 / Math.PI + + /** + * Gyro noise floor below which yaw rate is clamped to zero. Placeholder — initial + * engineering estimate pending real-world tuning, same disclaimer as + * [com.hawhamburg.micr0bu.domain.usecase.UseCaseDetectionConfig]. + */ + private const val YAW_RATE_NOISE_FLOOR_DPS = 1.0 +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/domain/usecase/UseCaseDetectionEngine.kt b/app/src/main/java/com/hawhamburg/micr0bu/domain/usecase/UseCaseDetectionEngine.kt index c3d47e8..875d2a3 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/domain/usecase/UseCaseDetectionEngine.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/domain/usecase/UseCaseDetectionEngine.kt @@ -49,6 +49,17 @@ class UseCaseDetectionEngine(private val config: UseCaseDetectionConfig = UseCas /** Currently active alerts across all remote road users, most severe first. */ val currentAlerts: StateFlow> = _currentAlerts.asStateFlow() + // ── Live positions (Section 13 — V2X Monitor live map view) ────────────────────────── + // Exposed purely for the map view; detection logic above never reads these back. + + private val _ownPosition = MutableStateFlow(null) + /** Ego bike's latest known state, for plotting on the live map. */ + val ownPosition: StateFlow = _ownPosition.asStateFlow() + + private val _remotePositions = MutableStateFlow>(emptyMap()) + /** Each tracked remote road user's latest known CAM, keyed by station ID, for the live map. */ + val remotePositions: StateFlow> = _remotePositions.asStateFlow() + /** * Feed the ego bike's own most recent state (from `v2x/rx/obu_gnss`, or a fallback source * — see `CamUseCaseRepository`). Out-of-order/late updates are ignored. Re-evaluates all @@ -58,6 +69,7 @@ class UseCaseDetectionEngine(private val config: UseCaseDetectionConfig = UseCas val current = ownCam if (current != null && cam.timestamp < current.timestamp) return // stale/out-of-order ownCam = cam + _ownPosition.value = cam remoteHistory.keys.toList().forEach { id -> remoteHistory[id]?.lastOrNull()?.let { evaluate(it) } } publish() } @@ -70,6 +82,7 @@ class UseCaseDetectionEngine(private val config: UseCaseDetectionConfig = UseCas val history = remoteHistory.getOrPut(cam.stationId) { ArrayDeque() } history.addLast(cam) trimHistory(history, cam.timestamp) + _remotePositions.value = _remotePositions.value + (cam.stationId to cam) evaluate(cam) publish() } @@ -97,6 +110,7 @@ class UseCaseDetectionEngine(private val config: UseCaseDetectionConfig = UseCas remoteHistory.remove(id) activeAlerts.keys.filter { it.first == id }.forEach { activeAlerts.remove(it) } } + _remotePositions.value = _remotePositions.value - staleIds publish() } @@ -105,6 +119,8 @@ class UseCaseDetectionEngine(private val config: UseCaseDetectionConfig = UseCas ownCam = null remoteHistory.clear() activeAlerts.clear() + _ownPosition.value = null + _remotePositions.value = emptyMap() publish() } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/service/CamTransmitLoop.kt b/app/src/main/java/com/hawhamburg/micr0bu/service/CamTransmitLoop.kt new file mode 100644 index 0000000..2e21750 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/service/CamTransmitLoop.kt @@ -0,0 +1,124 @@ +package com.hawhamburg.micr0bu.service + +import android.content.Context +import com.hawhamburg.micr0bu.data.GnssReading +import com.hawhamburg.micr0bu.data.SensorRepository +import com.hawhamburg.micr0bu.data.mqtt.ObuHardwarePreferences +import com.hawhamburg.micr0bu.data.transport.ObuHardware +import com.hawhamburg.micr0bu.data.transport.UsbSerialTransport +import com.hawhamburg.micr0bu.domain.asn1.RealAsn1UperCodec +import com.hawhamburg.micr0bu.domain.cam.CamTransmitConfig +import com.hawhamburg.micr0bu.domain.cam.PhoneCamBuilder +import com.hawhamburg.micr0bu.domain.usecase.GeoMath +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Real CAM transmit loop for the ESP32-C5 hardware path (Phase 03, Section 13) — the phone-side + * counterpart to the OBU's old autonomous beacon, now driven from here since the ESP32-C5 has + * no onboard CAM generation at all (see `obu-firmware/main/main.c`'s rewritten TX path, which + * is purely receive-and-transmit-on-serial-arrival with no timer of its own). + * + * Started/stopped by [TripRecordingService] around an active recording session — per the + * Section 13 spec, CAM transmission only runs while recording, matching the CiT One path's + * behavior of "no traffic until there's a trip to correlate it with." Internally also gated on + * [ObuHardwarePreferences] currently reporting [ObuHardware.ESP32_C5] — on the CiT One path + * this loop stays parked (via [kotlinx.coroutines.flow.collectLatest] on the hardware + * preference) and never sends anything. + * + * Rate policy: [CamTransmitConfig.baseRateHz] (1 Hz) everywhere, bumped to + * [CamTransmitConfig.elevatedRateHz] inside a [com.hawhamburg.micr0bu.domain.cam.CamGeofence] or + * for [ELEVATED_HOLD_MS] after an external event trigger (harsh braking/turning/stopping — see + * [onDetectedEvent], called by [TripRecordingService] from the same + * [com.hawhamburg.micr0bu.domain.detection.EventDetector] stream that already drives trip event + * logging). Both rate figures are placeholders pending real-world tuning, per + * [CamTransmitConfig]'s own disclaimer. + */ +@Singleton +class CamTransmitLoop @Inject constructor( + @ApplicationContext private val context: Context, + private val obuHardwarePrefs: ObuHardwarePreferences, + private val usbSerialTransport: UsbSerialTransport, + private val codec: RealAsn1UperCodec, +) { + private val config = CamTransmitConfig() + private val sensorRepository = SensorRepository(context) + + private var job: Job? = null + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + + @Volatile private var latestGnss: GnssReading? = null + @Volatile private var latestGyroZ: Float? = null + @Volatile private var elevatedUntilMs: Long = 0L + + /** Own station id for the ESP32-C5 path — see [PhoneCamBuilder]'s KDoc on why this is a placeholder. */ + @Volatile var stationId: Long = 0L + + /** + * Call when a braking/turning/stopping event fires during an active trip — bumps the CAM + * rate to [CamTransmitConfig.elevatedRateHz] for [ELEVATED_HOLD_MS] so nearby stations get + * denser updates through the maneuver, not just at the instant it was detected. + */ + fun onDetectedEvent() { + elevatedUntilMs = System.currentTimeMillis() + ELEVATED_HOLD_MS + } + + /** + * Starts the loop for the duration of a recording session. Internally stays idle (no + * transmission) unless/until the ESP32-C5 is the selected OBU hardware, and automatically + * pauses/resumes if that selection changes mid-trip. + */ + fun start() { + if (job?.isActive == true) return + elevatedUntilMs = 0L + job = scope.launch { + obuHardwarePrefs.obuHardwareFlow.collectLatest { hardware -> + if (hardware != ObuHardware.ESP32_C5) return@collectLatest + runTransmitLoop() + } + } + } + + fun stop() { + job?.cancel() + job = null + elevatedUntilMs = 0L + } + + private suspend fun runTransmitLoop() = coroutineScope { + launch { sensorRepository.gnssFlow().collect { latestGnss = it } } + launch { sensorRepository.gyroscopeFlow().collect { latestGyroZ = it.z } } + + while (true) { + val gnss = latestGnss + if (gnss != null) { + val cam = PhoneCamBuilder.build(gnss, latestGyroZ, stationId) + val bytes = codec.encodeCam(cam) + usbSerialTransport.sendCamTx(bytes) + } + delay((1000.0 / currentRateHz(gnss)).toLong()) + } + } + + private fun currentRateHz(gnss: GnssReading?): Double { + val now = System.currentTimeMillis() + val inGeofence = gnss != null && config.geofences.any { fence -> + GeoMath.haversineMeters(gnss.latitude, gnss.longitude, fence.latitude, fence.longitude) <= fence.radiusM + } + val eventBoosted = now < elevatedUntilMs + return if (inGeofence || eventBoosted) config.elevatedRateHz else config.baseRateHz + } + + companion object { + private const val ELEVATED_HOLD_MS = 5_000L + } +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/service/TripRecordingService.kt b/app/src/main/java/com/hawhamburg/micr0bu/service/TripRecordingService.kt index 8b3bc98..a2b7bde 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/service/TripRecordingService.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/service/TripRecordingService.kt @@ -24,11 +24,13 @@ import com.google.android.gms.location.Priority import com.hawhamburg.micr0bu.MainActivity import com.hawhamburg.micr0bu.R import com.hawhamburg.micr0bu.data.TripRepository +import com.hawhamburg.micr0bu.data.cam.CamUseCaseRepository import com.hawhamburg.micr0bu.data.db.AppDatabase import com.hawhamburg.micr0bu.domain.detection.DetectionConfig import com.hawhamburg.micr0bu.domain.detection.EventDetector import com.hawhamburg.micr0bu.domain.detection.EventType import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -88,6 +90,17 @@ class TripRecordingService : Service() { private lateinit var sensorManager: SensorManager private lateinit var fusedLocation: FusedLocationProviderClient private lateinit var repository: TripRepository + + // ESP32-C5 CAM transmit loop (Phase 03/Section 13) - internally a no-op unless that + // hardware is the one currently selected (see CamTransmitLoop's KDoc). Started/stopped + // alongside the trip, same lifecycle as everything else in this service. + @Inject lateinit var camTransmitLoop: CamTransmitLoop + + // V2X message retention (Phase 03) - every CAM this repository processes (own + remote, + // either hardware path) gets persisted for the duration of a recording session; see + // V2xMessageEntity's KDoc for why nothing is retained outside of one. + @Inject lateinit var camUseCaseRepository: CamUseCaseRepository + private var v2xLoggingJob: Job? = null private val detector = EventDetector( DetectionConfig( brakingSpeedDropThreshold = 1.0, @@ -266,6 +279,9 @@ class TripRecordingService : Service() { detector.events.collect { event -> if (currentTripId < 0) return@collect repository.insertEvent(currentTripId, event) + // Bump the CAM transmit rate through the maneuver, not just at detection instant. + // No-op on the CiT One path (see CamTransmitLoop's KDoc). + camTransmitLoop.onDetectedEvent() when (event.type) { EventType.BRAKING -> brakingCount++ EventType.TURNING -> turningCount++ @@ -296,6 +312,19 @@ class TripRecordingService : Service() { // Register sensors registerSensors() requestLocationUpdates() + camTransmitLoop.start() + + // V2X message retention — every CAM processed while this trip is recording gets + // persisted, unbounded, regardless of hardware path (MQTT/CiT One or serial/ESP32-C5). + // Explicit user requirement: outside of a recording session, this collector doesn't + // run at all, so nothing is retained beyond the detection engine's own bounded + // in-memory history. + v2xLoggingJob = serviceScope.launch { + camUseCaseRepository.processedCam.collect { cam -> + if (currentTripId < 0) return@collect + repository.insertV2xMessage(currentTripId, cam) + } + } // Start foreground ASAP (within 5 s required by Android). // Specify FOREGROUND_SERVICE_TYPE_LOCATION so Android 10+ knows why we need @@ -315,6 +344,9 @@ class TripRecordingService : Service() { timerJob?.cancel() unregisterSensors() removeLocationUpdates() + camTransmitLoop.stop() + v2xLoggingJob?.cancel() + v2xLoggingJob = null val endTime = System.currentTimeMillis() val totalEvents = brakingCount + turningCount + stoppingCount diff --git a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/ConnectionSetupScreen.kt b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/ConnectionSetupScreen.kt index 7d1858f..2103ce3 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/ConnectionSetupScreen.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/ConnectionSetupScreen.kt @@ -42,6 +42,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.hawhamburg.micr0bu.R import com.hawhamburg.micr0bu.data.mqtt.MqttConnectionState +import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.data.transport.TransportType import com.hawhamburg.micr0bu.viewmodel.MqttViewModel @@ -62,6 +63,7 @@ fun ConnectionSetupScreen( val detectedObuIp by viewModel.detectedObuIp.collectAsState() val activeTransport by viewModel.activeTransport.collectAsState() val mqttPrefs by viewModel.mqttPrefs.collectAsState() + val obuHardware by viewModel.obuHardware.collectAsState() val isConnected = connectionState == MqttConnectionState.CONNECTED val isConnecting = connectionState == MqttConnectionState.CONNECTING @@ -85,12 +87,13 @@ fun ConnectionSetupScreen( color = MaterialTheme.colorScheme.onSurfaceVariant, ) - // ── USB-C Primary Card ───────────────────────────────────────────── + // ── USB-C Primary Card (CiT One only — see ESP32-C5 placeholder card below) ──────── val usbContainerColor = when { usbConnected && isConnected -> UsbGreenBg usbConnected && isConnecting -> UsbAmberBg else -> UsbGrayBg } + if (obuHardware == ObuHardware.CIT_ONE) { Card( colors = CardDefaults.cardColors(containerColor = usbContainerColor), shape = RoundedCornerShape(12.dp), @@ -222,6 +225,41 @@ fun ConnectionSetupScreen( } } } + } else { + // ── ESP32-C5 placeholder card ─────────────────────────────────────── + // Real USB-serial connection handling lives in UsbSerialTransport, which is a + // stub until the ESP32 firmware protocol is translated to Kotlin (Section 13). + Card( + colors = CardDefaults.cardColors(containerColor = UsbGrayBg), + shape = RoundedCornerShape(12.dp), + ) { + Column(modifier = Modifier.padding(16.dp)) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + Icon( + Icons.Default.Usb, + contentDescription = null, + tint = UsbGray, + modifier = Modifier.size(20.dp), + ) + Text( + stringResource(R.string.conn_esp32_title), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + color = UsbGray, + ) + } + Spacer(Modifier.height(8.dp)) + Text( + stringResource(R.string.conn_esp32_phase3_desc), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + } } } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/DashboardScreen.kt b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/DashboardScreen.kt index d0c8525..ba4f2dc 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/DashboardScreen.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/DashboardScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons @@ -49,6 +50,7 @@ import androidx.compose.ui.unit.dp import androidx.core.net.toUri import com.hawhamburg.micr0bu.R import com.hawhamburg.micr0bu.data.mqtt.MqttConnectionState +import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.data.transport.TransportType import com.hawhamburg.micr0bu.viewmodel.SensorUiState import kotlin.math.sqrt @@ -59,12 +61,14 @@ fun DashboardScreen( state: SensorUiState, mqttConnectionState: MqttConnectionState, activeTransport: TransportType = TransportType.USB_C, + obuHardware: ObuHardware = ObuHardware.CIT_ONE, usbCableConnected: Boolean = false, obuStationTypeWarning: Boolean = false, obuStationType: Int? = null, onNavigateToConnection: () -> Unit, onNavigateToSensors: () -> Unit, onNavigateToMap: () -> Unit, + onNavigateToRecord: () -> Unit = {}, modifier: Modifier = Modifier, ) { val context = LocalContext.current @@ -207,6 +211,23 @@ fun DashboardScreen( } } + // ── "Start Driving Session" shortcut (Section 13 dashboard redesign) — straight to + // Record. Hidden while already recording since the banner above covers that state. ── + if (!state.isRecording) { + androidx.compose.material3.Button( + onClick = onNavigateToRecord, + modifier = Modifier.fillMaxWidth().height(52.dp), + ) { + Icon(Icons.Default.FiberManualRecord, null, modifier = Modifier.size(18.dp)) + Spacer(Modifier.width(8.dp)) + Text( + stringResource(R.string.dash_start_driving_session), + style = MaterialTheme.typography.titleSmall, + fontWeight = FontWeight.SemiBold, + ) + } + } + // GNSS card — tapping opens the bottom sheet StatusCard( title = stringResource(R.string.dash_gnss), @@ -236,11 +257,13 @@ fun DashboardScreen( val mqttConnected = mqttConnectionState == MqttConnectionState.CONNECTED val transportIcon = when (activeTransport) { TransportType.USB_C -> Icons.Default.Usb + TransportType.USB_SERIAL -> Icons.Default.Usb TransportType.WIFI -> Icons.Default.Wifi TransportType.BLUETOOTH -> Icons.Default.Bluetooth } val transportInactiveIcon = when (activeTransport) { TransportType.USB_C -> Icons.Default.Usb + TransportType.USB_SERIAL -> Icons.Default.Usb TransportType.WIFI -> Icons.Default.WifiOff TransportType.BLUETOOTH -> Icons.Default.BluetoothDisabled } @@ -285,24 +308,34 @@ fun DashboardScreen( } } Spacer(Modifier.height(10.dp)) - // Transport chip row — USB-C / Wi-Fi / BT with active highlighted + // Transport chip row — which chips show depends on the selected OBU hardware, + // since CiT One and ESP32-C5 use non-overlapping transports (Section 13). Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { - TransportChip( - label = stringResource(R.string.dash_transport_usbc), - icon = Icons.Default.Usb, - active = activeTransport == TransportType.USB_C, - hasCable = usbCableConnected, - ) - TransportChip( - label = stringResource(R.string.dash_transport_wifi), - icon = Icons.Default.Wifi, - active = activeTransport == TransportType.WIFI, - ) + if (obuHardware == ObuHardware.CIT_ONE) { + TransportChip( + label = stringResource(R.string.dash_transport_usbc), + icon = Icons.Default.Usb, + active = activeTransport == TransportType.USB_C, + hasCable = usbCableConnected, + ) + TransportChip( + label = stringResource(R.string.dash_transport_wifi), + icon = Icons.Default.Wifi, + active = activeTransport == TransportType.WIFI, + ) + } else { + TransportChip( + label = stringResource(R.string.dash_transport_usb_serial), + icon = Icons.Default.Usb, + active = activeTransport == TransportType.USB_SERIAL, + hasCable = usbCableConnected, + ) + } TransportChip( label = stringResource(R.string.dash_transport_bt), icon = Icons.Default.Bluetooth, active = activeTransport == TransportType.BLUETOOTH, - dimmed = true, // Phase 03 — not yet available + dimmed = true, // Phase 03 — production BT transport still under discussion ) } } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt index cae6f7c..c169be8 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/MqttTopicViewerScreen.kt @@ -65,6 +65,7 @@ import com.hawhamburg.micr0bu.R import com.hawhamburg.micr0bu.data.mqtt.MessageDirection import com.hawhamburg.micr0bu.data.mqtt.MqttConnectionState import com.hawhamburg.micr0bu.data.mqtt.MqttMessage +import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.domain.cam.CamParser import com.hawhamburg.micr0bu.domain.denm.DenmUseCase import com.hawhamburg.micr0bu.domain.usecase.AlertLevel @@ -78,6 +79,9 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +/** List (raw topics) vs Map (V2X live map, Section 13) toggle for [TopicListPane]. */ +private enum class TopicViewMode { LIST, MAP } + private val timeFormat = SimpleDateFormat("HH:mm:ss.SSS", Locale.US) private val ConnectedGreen = Color(0xFF4CAF50) @@ -111,6 +115,9 @@ fun MqttTopicViewerScreen( val activeDenmUseCase by viewModel.activeDenmUseCase.collectAsState() val useCaseAlerts by viewModel.useCaseAlerts.collectAsState() val ownStationId by viewModel.ownStationId.collectAsState() + val obuHardware by viewModel.obuHardware.collectAsState() + val ownCamPosition by viewModel.ownCamPosition.collectAsState() + val remoteCamPositions by viewModel.remoteCamPositions.collectAsState() // Sort: sys/ topics first (heartbeat/health), then alphabetical val sortedTopics = topicMessages.keys.sortedWith( @@ -188,6 +195,9 @@ fun MqttTopicViewerScreen( lastDenmPayload = lastDenmPayload, activeDenmUseCase = activeDenmUseCase, useCaseAlerts = useCaseAlerts, + showDenmTrigger = obuHardware == ObuHardware.CIT_ONE, + ownCamPosition = ownCamPosition, + remoteCamPositions = remoteCamPositions, onSelectTopic = { viewModel.selectTopic(it) }, onSendDenm = { viewModel.sendDenm() }, onStopDenm = { viewModel.stopDenm() }, @@ -213,11 +223,15 @@ private fun TopicListPane( lastDenmPayload: String?, activeDenmUseCase: String?, useCaseAlerts: List, + showDenmTrigger: Boolean = true, + ownCamPosition: com.hawhamburg.micr0bu.domain.cam.Cam? = null, + remoteCamPositions: Map = emptyMap(), onSelectTopic: (String) -> Unit, onSendDenm: () -> Unit, onStopDenm: () -> Unit, ) { val isConnected = connectionState == MqttConnectionState.CONNECTED + var viewMode by rememberSaveable { mutableStateOf(TopicViewMode.LIST) } Column(modifier = Modifier.fillMaxSize()) { @@ -227,19 +241,52 @@ private fun TopicListPane( HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(alpha = 0.25f)) // ── DENM TX Control card — manual/test trigger only, not use-case-driven ── - DenmTxCard( - isConnected = isConnected, - denmActive = denmActive, - lastDenmPayload = lastDenmPayload, - activeDenmUseCase = activeDenmUseCase, - onSendDenm = onSendDenm, - onStopDenm = onStopDenm, - ) + // CiT-One-only: the OBU's Use Case API (v2x-uca/input/denmtrg) doesn't exist on the + // ESP32-C5 path, which has no onboard use-case engine (Section 13). + if (showDenmTrigger) { + DenmTxCard( + isConnected = isConnected, + denmActive = denmActive, + lastDenmPayload = lastDenmPayload, + activeDenmUseCase = activeDenmUseCase, + onSendDenm = onSendDenm, + onStopDenm = onStopDenm, + ) - HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(alpha = 0.25f)) + HorizontalDivider(color = MaterialTheme.colorScheme.outline.copy(alpha = 0.25f)) + } - // ── Topic rows ────────────────────────────────────────────────────── - if (topics.isEmpty()) { + // ── List / Map toggle — the raw topic list stays available either way (Section 13 + // asks for the map "in addition to", not instead of, the topic list). ────────────── + Row( + modifier = Modifier.fillMaxWidth().padding(horizontal = 12.dp, vertical = 6.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + OutlinedButton( + onClick = { viewMode = TopicViewMode.LIST }, + colors = ButtonDefaults.outlinedButtonColors( + containerColor = if (viewMode == TopicViewMode.LIST) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, + contentColor = if (viewMode == TopicViewMode.LIST) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, + ), + ) { Text(stringResource(R.string.mqtt_view_list)) } + OutlinedButton( + onClick = { viewMode = TopicViewMode.MAP }, + colors = ButtonDefaults.outlinedButtonColors( + containerColor = if (viewMode == TopicViewMode.MAP) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, + contentColor = if (viewMode == TopicViewMode.MAP) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, + ), + ) { Text(stringResource(R.string.mqtt_view_map)) } + } + + // ── Topic rows / live map ───────────────────────────────────────────── + if (viewMode == TopicViewMode.MAP) { + V2xLiveMapView( + own = ownCamPosition, + remotes = remoteCamPositions, + alerts = useCaseAlerts, + modifier = Modifier.fillMaxSize(), + ) + } else if (topics.isEmpty()) { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Text( diff --git a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt index 7952d4a..a064d5f 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/SettingsScreen.kt @@ -47,6 +47,7 @@ import androidx.compose.ui.unit.dp import androidx.core.os.LocaleListCompat import com.hawhamburg.micr0bu.R import com.hawhamburg.micr0bu.data.mqtt.MqttPrefs +import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.domain.usecase.UseCaseDetectionConfig import com.hawhamburg.micr0bu.domain.usecase.UseCaseType import com.hawhamburg.micr0bu.viewmodel.SensorUiState @@ -162,13 +163,17 @@ private fun SubScreen(title: String, onBack: () -> Unit, content: @Composable () fun ConnectionSettingsScreen( mqttPrefs: MqttPrefs, onMqttPrefsChange: (MqttPrefs) -> Unit, + obuHardware: ObuHardware = ObuHardware.CIT_ONE, + onObuHardwareChange: (ObuHardware) -> Unit = {}, onBack: () -> Unit, ) { SubScreen(stringResource(R.string.settings_connection), onBack) { SectionCard { - // Active transport selector + // OBU Hardware selector — CiT One / ESP32-C5 (Phase 03, Section 13). Everything + // below (transport, USB-C options) only really applies to CiT One; ESP32-C5 uses + // USB Serial exclusively and has no transport choice to make here. Text( - stringResource(R.string.settings_usb_transport), + stringResource(R.string.settings_obu_hardware), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(top = 8.dp), @@ -178,47 +183,91 @@ fun ConnectionSettingsScreen( modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), ) { - val isUsb = mqttPrefs.activeTransport == com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.TRANSPORT_USB_C + val isCitOne = obuHardware == ObuHardware.CIT_ONE OutlinedButton( - onClick = { onMqttPrefsChange(mqttPrefs.copy(activeTransport = com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.TRANSPORT_USB_C)) }, + onClick = { onObuHardwareChange(ObuHardware.CIT_ONE) }, modifier = Modifier.weight(1f), colors = ButtonDefaults.outlinedButtonColors( - containerColor = if (isUsb) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, - contentColor = if (isUsb) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, + containerColor = if (isCitOne) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, + contentColor = if (isCitOne) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, ), - ) { Text(stringResource(R.string.settings_transport_usbc), fontWeight = if (isUsb) FontWeight.Bold else FontWeight.Normal) } + ) { Text(stringResource(R.string.settings_obu_hardware_cit_one), fontWeight = if (isCitOne) FontWeight.Bold else FontWeight.Normal) } OutlinedButton( - onClick = { onMqttPrefsChange(mqttPrefs.copy(activeTransport = com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.TRANSPORT_WIFI)) }, + onClick = { onObuHardwareChange(ObuHardware.ESP32_C5) }, modifier = Modifier.weight(1f), colors = ButtonDefaults.outlinedButtonColors( - containerColor = if (!isUsb) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, - contentColor = if (!isUsb) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, + containerColor = if (!isCitOne) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, + contentColor = if (!isCitOne) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, ), - ) { Text(stringResource(R.string.settings_transport_wifi), fontWeight = if (!isUsb) FontWeight.Bold else FontWeight.Normal) } + ) { Text(stringResource(R.string.settings_obu_hardware_esp32), fontWeight = if (!isCitOne) FontWeight.Bold else FontWeight.Normal) } + } + if (obuHardware == ObuHardware.ESP32_C5) { + Text( + stringResource(R.string.settings_obu_hardware_esp32_note), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = 8.dp), + ) } } - SectionCard { - // USB-C auto-detect toggle - SettingToggleRow( - label = stringResource(R.string.settings_usb_auto_detect), - checked = mqttPrefs.usbAutoDetect, - onCheckedChange = { onMqttPrefsChange(mqttPrefs.copy(usbAutoDetect = it)) }, - ) - Divider() - // Manual IP override - Spacer(Modifier.height(4.dp)) - var usbIp by remember { mutableStateOf(mqttPrefs.usbIpOverride) } - MqttTextField( - label = stringResource(R.string.settings_usb_manual_ip), - value = usbIp, - placeholder = com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.DEFAULT_USB_IP, - keyboardType = KeyboardType.Uri, - onValueChange = { usbIp = it }, - onFocusLost = { onMqttPrefsChange(mqttPrefs.copy(usbIpOverride = usbIp)) }, - ) - Spacer(Modifier.height(4.dp)) + if (obuHardware == ObuHardware.CIT_ONE) { + SectionCard { + // Active transport selector + Text( + stringResource(R.string.settings_usb_transport), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 8.dp), + ) + Spacer(Modifier.height(6.dp)) + Row( + modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + val isUsb = mqttPrefs.activeTransport == com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.TRANSPORT_USB_C + OutlinedButton( + onClick = { onMqttPrefsChange(mqttPrefs.copy(activeTransport = com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.TRANSPORT_USB_C)) }, + modifier = Modifier.weight(1f), + colors = ButtonDefaults.outlinedButtonColors( + containerColor = if (isUsb) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, + contentColor = if (isUsb) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, + ), + ) { Text(stringResource(R.string.settings_transport_usbc), fontWeight = if (isUsb) FontWeight.Bold else FontWeight.Normal) } + + OutlinedButton( + onClick = { onMqttPrefsChange(mqttPrefs.copy(activeTransport = com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.TRANSPORT_WIFI)) }, + modifier = Modifier.weight(1f), + colors = ButtonDefaults.outlinedButtonColors( + containerColor = if (!isUsb) MaterialTheme.colorScheme.primaryContainer else Color.Transparent, + contentColor = if (!isUsb) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurface, + ), + ) { Text(stringResource(R.string.settings_transport_wifi), fontWeight = if (!isUsb) FontWeight.Bold else FontWeight.Normal) } + } + } + + SectionCard { + // USB-C auto-detect toggle + SettingToggleRow( + label = stringResource(R.string.settings_usb_auto_detect), + checked = mqttPrefs.usbAutoDetect, + onCheckedChange = { onMqttPrefsChange(mqttPrefs.copy(usbAutoDetect = it)) }, + ) + Divider() + // Manual IP override + Spacer(Modifier.height(4.dp)) + var usbIp by remember { mutableStateOf(mqttPrefs.usbIpOverride) } + MqttTextField( + label = stringResource(R.string.settings_usb_manual_ip), + value = usbIp, + placeholder = com.hawhamburg.micr0bu.data.mqtt.MqttPrefs.DEFAULT_USB_IP, + keyboardType = KeyboardType.Uri, + onValueChange = { usbIp = it }, + onFocusLost = { onMqttPrefsChange(mqttPrefs.copy(usbIpOverride = usbIp)) }, + ) + Spacer(Modifier.height(4.dp)) + } } } } diff --git a/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/V2xLiveMapView.kt b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/V2xLiveMapView.kt new file mode 100644 index 0000000..6d282a4 --- /dev/null +++ b/app/src/main/java/com/hawhamburg/micr0bu/ui/screens/V2xLiveMapView.kt @@ -0,0 +1,173 @@ +package com.hawhamburg.micr0bu.ui.screens + +import android.content.Context +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.GpsOff +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import com.hawhamburg.micr0bu.R +import com.hawhamburg.micr0bu.domain.cam.Cam +import com.hawhamburg.micr0bu.domain.usecase.AlertLevel +import com.hawhamburg.micr0bu.domain.usecase.UseCaseAlert +import org.osmdroid.config.Configuration +import org.osmdroid.tileprovider.tilesource.TileSourceFactory +import org.osmdroid.util.GeoPoint +import org.osmdroid.views.MapView +import org.osmdroid.views.overlay.Marker + +/** + * V2X Monitor live map view (Phase 03, Section 13) — plots the ego bike's own position plus + * every currently-tracked remote road user's last-known CAM position, in addition to (not + * replacing) the raw topic list already on this screen. Reuses the same osmdroid pattern as + * [MapScreen]; unlike that screen, this one has no phone-GNSS-only fallback because [own] here + * always reflects whichever ego source [com.hawhamburg.micr0bu.data.cam.CamUseCaseRepository] + * currently trusts (obu_gnss / phone GNSS / CAM-topic-own — see that class's KDoc). + * + * Remote markers are colored by that station's most severe active alert level, if any, so a + * glance at the map shows not just "who's nearby" but "who's a warning right now" — the same + * severity coloring already used by [UseCaseAlertPanel]. + */ +@Composable +fun V2xLiveMapView( + own: Cam?, + remotes: Map, + alerts: List, + modifier: Modifier = Modifier, +) { + val context = LocalContext.current + + if (own == null) { + NoFixPlaceholder(modifier) + return + } + + val ownGeoPoint = remember(own.latitude, own.longitude) { GeoPoint(own.latitude, own.longitude) } + val alertByStation = remember(alerts) { + alerts.groupBy { it.remoteStationId } + .mapValues { (_, a) -> a.maxByOrNull { it.alertLevel.ordinal }?.alertLevel } + } + + val mapViewRef = remember { mutableStateOf(null) } + val lifecycleOwner = LocalLifecycleOwner.current + + DisposableEffect(lifecycleOwner) { + val observer = LifecycleEventObserver { _, event -> + when (event) { + Lifecycle.Event.ON_RESUME -> mapViewRef.value?.onResume() + Lifecycle.Event.ON_PAUSE -> mapViewRef.value?.onPause() + else -> {} + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + mapViewRef.value?.onDetach() + } + } + + Column(modifier = modifier.fillMaxSize()) { + Text( + text = stringResource(R.string.v2x_map_remote_count, remotes.size), + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp), + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Spacer(Modifier.height(4.dp)) + + AndroidView( + factory = { ctx -> + initOsmForV2xMap(ctx) + MapView(ctx).apply { + setTileSource(TileSourceFactory.MAPNIK) + setMultiTouchControls(true) + controller.setZoom(17.0) + controller.setCenter(ownGeoPoint) + mapViewRef.value = this + } + }, + update = { mv -> + mv.overlays.clear() + + // Own marker — distinct from remotes via a dedicated title prefix; osmdroid + // doesn't tint default pins per-instance without a custom drawable, so color + // differentiation for now relies on the title label shown on tap. + mv.overlays.add( + Marker(mv).apply { + position = ownGeoPoint + setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) + title = context.getString(R.string.v2x_map_own_label) + } + ) + + remotes.forEach { (stationId, cam) -> + val level = alertByStation[stationId] + val label = when (level) { + AlertLevel.WARNING -> context.getString(R.string.v2x_map_remote_warning, stationId) + AlertLevel.AWARENESS -> context.getString(R.string.v2x_map_remote_awareness, stationId) + AlertLevel.INFO -> context.getString(R.string.v2x_map_remote_info, stationId) + null -> context.getString(R.string.v2x_map_remote_plain, stationId) + } + mv.overlays.add( + Marker(mv).apply { + position = GeoPoint(cam.latitude, cam.longitude) + setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) + title = label + } + ) + } + + mv.controller.animateTo(ownGeoPoint) + mv.invalidate() + }, + modifier = Modifier.fillMaxSize(), + ) + } +} + +@Composable +private fun NoFixPlaceholder(modifier: Modifier) { + Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Icon( + Icons.Default.GpsOff, + contentDescription = null, + modifier = Modifier.size(56.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Spacer(Modifier.height(12.dp)) + Text( + stringResource(R.string.gnss_no_fix), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } +} + +private fun initOsmForV2xMap(context: Context) { + Configuration.getInstance().apply { + load(context, context.getSharedPreferences("osmdroid", Context.MODE_PRIVATE)) + userAgentValue = context.packageName + } +} diff --git a/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt b/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt index badfff5..5504a3a 100644 --- a/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt +++ b/app/src/main/java/com/hawhamburg/micr0bu/viewmodel/MqttViewModel.kt @@ -8,6 +8,8 @@ import com.hawhamburg.micr0bu.data.mqtt.MqttMessage import com.hawhamburg.micr0bu.data.mqtt.MqttPreferences import com.hawhamburg.micr0bu.data.mqtt.MqttPrefs import com.hawhamburg.micr0bu.data.mqtt.MqttRepository +import com.hawhamburg.micr0bu.data.mqtt.ObuHardwarePreferences +import com.hawhamburg.micr0bu.data.transport.ObuHardware import com.hawhamburg.micr0bu.data.transport.TransportType import com.hawhamburg.micr0bu.data.transport.UsbNetworkDetector import com.hawhamburg.micr0bu.domain.denm.DenmUseCase @@ -30,6 +32,7 @@ class MqttViewModel @Inject constructor( private val prefs: MqttPreferences, private val usbDetector: UsbNetworkDetector, private val camUseCaseRepository: CamUseCaseRepository, + private val obuHardwarePrefs: ObuHardwarePreferences, ) : ViewModel() { // ── MQTT connection & messages ──────────────────────────────────────────── @@ -48,6 +51,13 @@ class MqttViewModel @Inject constructor( val activeTransport: StateFlow = repo.activeTransport + /** Which physical OBU (Section 13) is currently selected — CiT One or ESP32-C5. */ + val obuHardware: StateFlow = repo.obuHardware + + fun setObuHardware(hardware: ObuHardware) { + viewModelScope.launch { obuHardwarePrefs.setObuHardware(hardware) } + } + /** True when a 192.168.42.x USB-C tethering network is detected. */ val usbConnected: StateFlow = usbDetector.usbNetwork .map { it != null } @@ -111,6 +121,12 @@ class MqttViewModel @Inject constructor( /** Per-use-case enable/disable state (Settings > Use Case Alerts). */ val useCaseEnabledMap: StateFlow> = camUseCaseRepository.enabledMap + /** Ego bike's latest known position, for the V2X Monitor live map view (Section 13). */ + val ownCamPosition: StateFlow = camUseCaseRepository.ownPosition + + /** Latest known CAM per tracked remote road user, for the live map view (Section 13). */ + val remoteCamPositions: StateFlow> = camUseCaseRepository.remotePositions + /** True if [stationId] is the ego OBU's own — used for OWN/REMOTE badges in the raw message list. */ fun isOwnStationId(stationId: Long): Boolean = camUseCaseRepository.isOwnStationId(stationId) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a68aeca..abbc913 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -29,6 +29,7 @@ Broker nicht erreichbar — V2X-Einstellungen prüfen Aufnahme Messwerte + Fahrsitzung starten Wird initialisiert… Luftdruck Höhe @@ -61,6 +62,8 @@ Bluetooth Bluetooth Bluetooth-Verbindung ist für Phase 03 geplant und noch nicht implementiert. + ESP32-C5 (USB Seriell) + Die USB-Seriell-Verbindung zum ESP32-C5 ist für Phase 03 vorgesehen, aber noch nicht funktionsfähig — dafür muss zuerst das ESP32-Firmware-Protokoll nach Kotlin übersetzt werden. Geräte suchen Suche läuft… USB-C (Primär) @@ -119,6 +122,12 @@ Noch kein GPS-Signal — gehen Sie ins Freie Standortkarte Aktueller Standort + %1$d erfasste externe Verkehrsteilnehmer + Eigen (Ego) + Extern #%1$d + Extern #%1$d · Info + Extern #%1$d · Aufmerksamkeit + Extern #%1$d · Warnung Einstellungen @@ -151,6 +160,10 @@ Verbindung OBU per USB-C automatisch erkennen OBU-IP (manuell) + OBU-Hardware + CiT One + ESP32-C5 + Die ESP32-C5-Unterstützung ist für Phase 03 vorgesehen, aber noch nicht funktionsfähig. Die CAM-Erzeugung wechselt zum Smartphone; USB-Seriell-Verbindung und DENM-Auslöser sind Platzhalter, bis das Firmware-Protokoll übersetzt ist. Aktiver Transport USB-C WLAN @@ -162,6 +175,8 @@ Trennen Automatisch scrollen Noch keine Nachrichten + Liste + Karte Mit der OBU verbinden und auf V2X-Verkehr warten Noch keine Nachrichten zu diesem Thema @@ -201,6 +216,7 @@ USB-C + USB seriell WLAN BT diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d7d671..49fd463 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ Broker unreachable — check V2X settings Recording samples + Start Driving Session Initialising… Pressure Altitude @@ -62,6 +63,8 @@ Bluetooth Bluetooth Bluetooth connection is planned for Phase 03 and is not yet implemented. + ESP32-C5 (USB Serial) + USB-serial connection to the ESP32-C5 is scaffolded for Phase 03 but not yet functional — it needs the ESP32 firmware protocol translated to Kotlin first. Scan for Devices Scanning… USB-C (Primary) @@ -120,6 +123,12 @@ No GPS fix yet — move to an open area Location Map Current Location + %1$d tracked remote road user(s) + Own (ego) + Remote #%1$d + Remote #%1$d · Info + Remote #%1$d · Awareness + Remote #%1$d · Warning Settings @@ -152,6 +161,10 @@ Connection Auto-detect OBU via USB-C Manual OBU IP + OBU Hardware + CiT One + ESP32-C5 + ESP32-C5 support is scaffolded for Phase 03 but not yet functional. CAM generation moves to the phone; USB-serial connection and DENM trigger are placeholders pending firmware protocol translation. Active transport USB-C Wi-Fi @@ -163,6 +176,8 @@ Disconnect Auto-scroll to latest No messages yet + List + Map Connect to the OBU and wait for V2X traffic No messages on this topic yet @@ -202,6 +217,7 @@ USB-C + USB Serial Wi-Fi BT diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 825eb1b..0dac085 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,6 +18,7 @@ activityCompose = "1.9.3" navigationCompose = "2.8.5" playServicesLocation = "21.3.0" coroutines = "1.9.0" +usbSerial = "3.9.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -46,6 +47,7 @@ room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } osmdroid = { group = "org.osmdroid", name = "osmdroid-android", version.ref = "osmdroid" } androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "splashscreen" } +usb-serial-android = { group = "com.github.mik3y", name = "usb-serial-for-android", version.ref = "usbSerial" } junit = { group = "junit", name = "junit", version.ref = "junit" } kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutines" } diff --git a/its-g5-receiver-firmware b/its-g5-receiver-firmware new file mode 160000 index 0000000..91d6511 --- /dev/null +++ b/its-g5-receiver-firmware @@ -0,0 +1 @@ +Subproject commit 91d6511fe6ce025c9768ddf38d37ea9d8969fcc9 diff --git a/obu-firmware/CMakeLists.txt b/obu-firmware/CMakeLists.txt new file mode 100644 index 0000000..e02013a --- /dev/null +++ b/obu-firmware/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.16) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +# No longer need -Wl,-zmuldefs here - that was only for main/wifi_patches.c's +# symbol-override attempt (which didn't work anyway; see docs/04-transmit-setup.md), +# and that file is no longer part of the build. Superseded by main/tx_custom.c, +# which bypasses the gate at a different layer instead of trying to override it. + +project(obu_firmware) diff --git a/obu-firmware/NOTES.md b/obu-firmware/NOTES.md new file mode 100644 index 0000000..fdaa5db --- /dev/null +++ b/obu-firmware/NOTES.md @@ -0,0 +1,19 @@ +# OBU transmit firmware - Phase 2 (in progress: HLN-SV DENM beacon) + +Started. See `docs/04-transmit-setup.md` in the project root for build/flash +steps and how to validate this against your own sniffer. + +Implements one profile so far: **HLN-SV** (aftermarket stationary recovery +vehicle), causeCode 94 (stationaryVehicle), subCauseCode 0, active while the +hazard-light GPIO is grounded. No location/alacarte containers. + +- `main/main.c` - entry point, the `phy_11p_set`/`phy_change_channel(5900,...)` + register hack, GPIO polling, TX loop +- `main/denm.c` / `.h` - ASN.1 UPER encoding of a minimal DENM +- `main/geonet.c` / `.h` - GeoNetworking Basic/Common/SHB headers + BTP-B +- `main/dot11p.c` / `.h` - 802.11 OCB (QoS Data, broadcast) frame + LLC/SNAP + +Known gaps, tracked as TODOs in the source: no real GNSS (lat/long hardcoded +0), no real time source (detectionTime/referenceTime hardcoded 0, decodes as +2004-01-01), fixed (non-rotating) pseudonym MAC, SHB instead of GeoBroadcast +(no multi-hop forwarding), unsecured (no IEEE 1609.2 signing). diff --git a/obu-firmware/main/CMakeLists.txt b/obu-firmware/main/CMakeLists.txt new file mode 100644 index 0000000..109d9d5 --- /dev/null +++ b/obu-firmware/main/CMakeLists.txt @@ -0,0 +1,16 @@ +# wifi_patches.c is intentionally NOT in this list anymore - superseded by +# tx_custom.c (see that file for why). Left on disk, unused, for history. +# +# cam.c is ALSO intentionally not in this list anymore (Phase 03): CAM is now built on the +# phone and sent down over serial_link, so this firmware never encodes CAM itself. cam.c/.h are +# left on disk as the byte-exact reference the Kotlin encoder was ported from - do not delete. +# +# serial_link.c/.h - binary phone<->ESP32 UART framing (Phase 03). +# gn_unwrap.c/.h - strips 802.11/LLC-SNAP/GeoNetworking/BTP-B off received frames down to CAM +# UPER bytes, for forwarding to the phone over serial_link. +idf_component_register( + SRCS "main.c" "denm.c" "geonet.c" "dot11p.c" "tx_custom.c" "serial_link.c" "gn_unwrap.c" + INCLUDE_DIRS "." + REQUIRES esp_event esp_netif nvs_flash driver esp_phy + PRIV_REQUIRES esp_wifi +) diff --git a/obu-firmware/main/cam.c b/obu-firmware/main/cam.c new file mode 100644 index 0000000..ac9674f --- /dev/null +++ b/obu-firmware/main/cam.c @@ -0,0 +1,131 @@ +#include "cam.h" +#include + +// MSB-first bit packer - identical approach to denm.c (ASN.1 UPER is a +// bitstream, not a byte stream). +typedef struct { + uint8_t *buf; + size_t buf_len; + size_t bit_pos; +} bitwriter_t; + +static void bw_init(bitwriter_t *bw, uint8_t *buf, size_t len) +{ + bw->buf = buf; + bw->buf_len = len; + bw->bit_pos = 0; + memset(buf, 0, len); +} + +static void bw_put_bits(bitwriter_t *bw, uint64_t value, int nbits) +{ + for (int i = nbits - 1; i >= 0; i--) { + size_t byte_idx = bw->bit_pos / 8; + int bit_idx = 7 - (int)(bw->bit_pos % 8); + if (byte_idx >= bw->buf_len) { + return; // overflow guard - check return value of cam_encode + } + uint8_t bit = (value >> i) & 1; + bw->buf[byte_idx] = (uint8_t)(bw->buf[byte_idx] | (bit << bit_idx)); + bw->bit_pos++; + } +} + +static size_t bw_byte_len(const bitwriter_t *bw) +{ + return (bw->bit_pos + 7) / 8; +} + +int cam_encode(const cam_fields_t *f, uint8_t *buf, size_t buf_len) +{ + bitwriter_t bw; + bw_init(&bw, buf, buf_len); + + // ---- ItsPduHeader ---- (SEQUENCE, no OPTIONALs, no "..." -> no preamble) + bw_put_bits(&bw, 2, 8); // protocolVersion INTEGER(0..255) = 2 + bw_put_bits(&bw, 2, 8); // messageID INTEGER(0..255) = cam(2) + bw_put_bits(&bw, f->station_id, 32); // stationID StationID INTEGER(0..4294967295) + + // ---- CoopAwareness ---- (SEQUENCE, no OPTIONALs, no "...") + // generationDeltaTime GenerationDeltaTime INTEGER(0..65535) -> 16 bits + bw_put_bits(&bw, f->generation_delta_time, 16); + + // ---- CamParameters ---- (SEQUENCE, EXTENSIBLE "...", 2 OPTIONALs: + // lowFrequencyContainer, specialVehicleContainer) + bw_put_bits(&bw, 0, 1); // extension bit: no extension additions + bw_put_bits(&bw, 1, 1); // lowFrequencyContainer present + bw_put_bits(&bw, 0, 1); // specialVehicleContainer absent + + // ---- BasicContainer ---- (SEQUENCE, EXTENSIBLE "...", no OPTIONALs) + bw_put_bits(&bw, 0, 1); // extension bit: none + bw_put_bits(&bw, f->station_type, 8); // stationType StationType INTEGER(0..255) + + // ReferencePosition (SEQUENCE, no OPTIONALs/"..."), identical widths to + // DENM eventPosition (see denm.c for the constraint derivations): + // Latitude INTEGER(-900000000..900000001) -> 31 bits, offset from -900000000 + uint32_t lat_offset = (uint32_t)((int64_t)f->latitude_tenmicrodeg - (-900000000)); + bw_put_bits(&bw, lat_offset, 31); + // Longitude INTEGER(-1800000000..1800000001) -> 32 bits, offset from -1800000000 + uint32_t lon_offset = (uint32_t)((int64_t)f->longitude_tenmicrodeg - (-1800000000)); + bw_put_bits(&bw, lon_offset, 32); + // PosConfidenceEllipse: SemiAxisLength(0..4095)->12, HeadingValue(0..3601)->12 + bw_put_bits(&bw, 4095, 12); // semiMajorConfidence: unavailable + bw_put_bits(&bw, 4095, 12); // semiMinorConfidence: unavailable + bw_put_bits(&bw, 3601, 12); // semiMajorOrientation: unavailable + // Altitude: AltitudeValue(-100000..800001)->20 (offset from -100000), + // AltitudeConfidence ENUM 16 values -> 4 bits + bw_put_bits(&bw, 900001, 20); // 800001 ("unavailable") - (-100000) = 900001 + bw_put_bits(&bw, 15, 4); // altitudeConfidence: unavailable(15) + + // ---- HighFrequencyContainer ---- CHOICE { basicVehicleContainerHighFrequency, + // rsuContainerHighFrequency, ... } - EXTENSIBLE, 2 root alternatives. + bw_put_bits(&bw, 0, 1); // CHOICE extension bit: value is in root + bw_put_bits(&bw, 0, 1); // index: 0 = basicVehicleContainerHighFrequency (1 bit for 2 alts) + + // BasicVehicleContainerHighFrequency (SEQUENCE, NOT extensible, 7 OPTIONALs + // accelerationControl..cenDsrcTollingZone - all absent). + bw_put_bits(&bw, 0, 7); // 7 optional-presence bits, all absent + + // Heading: HeadingValue(0..3601)->12, HeadingConfidence(1..127)->7 (offset from 1) + bw_put_bits(&bw, f->heading_ddeg, 12); + bw_put_bits(&bw, 127 - 1, 7); // headingConfidence: unavailable(127) + // Speed: SpeedValue(0..16383)->14, SpeedConfidence(1..127)->7 (offset from 1) + bw_put_bits(&bw, f->speed_cm_s, 14); + bw_put_bits(&bw, 127 - 1, 7); // speedConfidence: unavailable(127) + // DriveDirection ENUM {forward,backward,unavailable} -> 2 bits + bw_put_bits(&bw, 2, 2); // unavailable + // VehicleLength: VehicleLengthValue(1..1023)->10 (offset from 1), + // VehicleLengthConfidenceIndication ENUM 5 values -> 3 bits + bw_put_bits(&bw, (uint32_t)f->vehicle_length_dm - 1, 10); + bw_put_bits(&bw, 4, 3); // vehicleLengthConfidenceIndication: unavailable(4) + // VehicleWidth INTEGER(1..62) -> 6 bits (offset from 1) + bw_put_bits(&bw, (uint32_t)f->vehicle_width_dm - 1, 6); + // LongitudinalAcceleration: value(-160..161)->9 (offset from -160), + // AccelerationConfidence(0..102)->7 + bw_put_bits(&bw, 161 - (uint32_t)(-160), 9); // longitudinalAccelerationValue: unavailable(161) + bw_put_bits(&bw, 102, 7); // confidence: unavailable(102) + // Curvature: CurvatureValue(-1023..1023)->11 (offset from -1023), + // CurvatureConfidence ENUM 8 values -> 3 bits + bw_put_bits(&bw, 1023 - (uint32_t)(-1023), 11); // curvatureValue: unavailable(1023) + bw_put_bits(&bw, 7, 3); // curvatureConfidence: unavailable(7) + // CurvatureCalculationMode ENUM {yawRateUsed,yawRateNotUsed,unavailable} -> 2 bits + bw_put_bits(&bw, 2, 2); // unavailable + // YawRate: YawRateValue(-32766..32767)->16 (offset from -32766), + // YawRateConfidence ENUM 8 values -> 3 bits + bw_put_bits(&bw, 32767 - (uint32_t)(-32766), 16); // yawRateValue: unavailable(32767) + bw_put_bits(&bw, 7, 3); // yawRateConfidence: unavailable(7) + + // ---- LowFrequencyContainer ---- CHOICE { basicVehicleContainerLowFrequency, + // ... } - EXTENSIBLE, 1 root alternative (index needs 0 bits). + bw_put_bits(&bw, 0, 1); // CHOICE extension bit: value is in root + + // BasicVehicleContainerLowFrequency (SEQUENCE, no OPTIONALs/"...") + // vehicleRole VehicleRole ENUM 16 values -> 4 bits + bw_put_bits(&bw, 0, 4); // default(0) + // exteriorLights ExteriorLights BIT STRING(SIZE(8)) -> 8 bits, all off + bw_put_bits(&bw, 0, 8); + // pathHistory PathHistory ::= SEQUENCE(SIZE(0..40)) OF PathPoint -> count 0..40 = 6 bits + bw_put_bits(&bw, 0, 6); // empty path history + + return (int)bw_byte_len(&bw); +} diff --git a/obu-firmware/main/cam.h b/obu-firmware/main/cam.h new file mode 100644 index 0000000..4d20e70 --- /dev/null +++ b/obu-firmware/main/cam.h @@ -0,0 +1,35 @@ +#ifndef CAM_H +#define CAM_H +#include +#include + +// Minimal CAM (Cooperative Awareness Message) per ETSI EN 302 637-2 v1.4.1 +// (CAM-PDU-Descriptions) + TS 102 894-2 v1.3.1 (CDD / ITS-Container), matching +// the field set the working Rust reference (esp32-c_its-companion, feat/tx-cam, +// src/applogic/cam_tx.rs) transmits: +// - ItsPduHeader (protocolVersion 2, messageID 2 = cam) +// - CoopAwareness { generationDeltaTime, camParameters } +// - CamParameters { +// basicContainer { stationType, referencePosition }, +// highFrequencyContainer = basicVehicleContainerHighFrequency { ... }, +// lowFrequencyContainer = basicVehicleContainerLowFrequency { ... } +// } +// All vehicle-dynamics fields we don't measure are encoded as their ASN.1 +// "unavailable" value. Speed is a real 0 (correct for a stationary station). + +typedef struct { + uint32_t station_id; + uint8_t station_type; // StationType(0..255): 5 = passengerCar + uint16_t generation_delta_time; // TimestampIts mod 65536 (ms); 0 until a real clock is wired + int32_t latitude_tenmicrodeg; // Latitude, 1/10 microdegree + int32_t longitude_tenmicrodeg; // Longitude, 1/10 microdegree + uint16_t speed_cm_s; // SpeedValue, 0.01 m/s units (0 = stationary) + uint16_t heading_ddeg; // HeadingValue, 0.1 deg units (0..3600), 3601 = unavailable + uint16_t vehicle_length_dm; // VehicleLengthValue(1..1023), 10cm steps + uint8_t vehicle_width_dm; // VehicleWidth(1..62), 10cm steps +} cam_fields_t; + +// Encodes the CAM as ASN.1 UPER. Returns bytes written, or -1 if buf too small. +int cam_encode(const cam_fields_t *f, uint8_t *buf, size_t buf_len); + +#endif diff --git a/obu-firmware/main/denm.c b/obu-firmware/main/denm.c new file mode 100644 index 0000000..9840894 --- /dev/null +++ b/obu-firmware/main/denm.c @@ -0,0 +1,153 @@ +#include "denm.h" +#include + +// Minimal MSB-first bit packer - ASN.1 UPER is a bitstream, not a byte +// stream, so we can't just memcpy structs. +typedef struct { + uint8_t *buf; + size_t buf_len; + size_t bit_pos; +} bitwriter_t; + +static void bw_init(bitwriter_t *bw, uint8_t *buf, size_t len) +{ + bw->buf = buf; + bw->buf_len = len; + bw->bit_pos = 0; + memset(buf, 0, len); +} + +static void bw_put_bits(bitwriter_t *bw, uint64_t value, int nbits) +{ + for (int i = nbits - 1; i >= 0; i--) { + size_t byte_idx = bw->bit_pos / 8; + int bit_idx = 7 - (int)(bw->bit_pos % 8); + if (byte_idx >= bw->buf_len) { + return; // overflow guard - silently truncates, check return value of denm_encode + } + uint8_t bit = (value >> i) & 1; + bw->buf[byte_idx] = (uint8_t)(bw->buf[byte_idx] | (bit << bit_idx)); + bw->bit_pos++; + } +} + +static size_t bw_byte_len(const bitwriter_t *bw) +{ + return (bw->bit_pos + 7) / 8; +} + +int denm_encode(const denm_fields_t *f, uint8_t *buf, size_t buf_len) +{ + bitwriter_t bw; + bw_init(&bw, buf, buf_len); + + // ---- ItsPduHeader ---- (SEQUENCE, no OPTIONALs, no "..." -> no preamble at all) + bw_put_bits(&bw, 2, 8); // protocolVersion INTEGER(0..255) = 2 + bw_put_bits(&bw, 1, 8); // messageID INTEGER(0..255) = denm(1) + bw_put_bits(&bw, f->station_id, 32); // stationID = StationID INTEGER(0..4294967295) = 32 bits + + // ---- DenmPayload (DecentralizedEnvironmentalNotificationMessage) ---- + // No "..." on this SEQUENCE -> no extension bit, just the 3-bit + // optional-component preamble in declared order: situation, location, + // alacarte. "No additional parameters" means location/alacarte stay + // absent. + bw_put_bits(&bw, 1, 1); // situation present + bw_put_bits(&bw, 0, 1); // location absent + bw_put_bits(&bw, 0, 1); // alacarte absent + + // ---- ManagementContainer ---- + // This SEQUENCE ends in "..." in the real ASN.1 module -> extensible, + // so it needs a leading 1-bit extension flag (0 = no extension + // additions used) BEFORE the 5-bit optional/default preamble + // (termination, relevanceDistance, relevanceTrafficDirection, + // validityDuration, transmissionInterval, in that declared order). An + // earlier version of this code omitted the extension bit entirely, + // which would shift every single bit after it and corrupt the whole + // rest of the message for any spec-compliant decoder. + bw_put_bits(&bw, 0, 1); // ManagementContainer extension bit: none used + bw_put_bits(&bw, f->terminate ? 1 : 0, 1); // termination present only when cancelling + bw_put_bits(&bw, 0, 1); // relevanceDistance absent + bw_put_bits(&bw, 0, 1); // relevanceTrafficDirection absent + bw_put_bits(&bw, 0, 1); // validityDuration absent -> default 600s applies + bw_put_bits(&bw, 0, 1); // transmissionInterval absent + + // actionID = ActionID{ originatingStationID StationID(32), sequenceNumber + // SequenceNumber(0..65535, 16 bits) } - no OPTIONALs/"..." -> no preamble. + // Keep sequenceNumber constant across repeats of the SAME event - it's + // the caller's job (see main.c) to only bump it on a genuinely new event + // and reuse it for that event's eventual termination message. + bw_put_bits(&bw, f->station_id, 32); + bw_put_bits(&bw, f->sequence_number, 16); + + // detectionTime / referenceTime: TimestampIts INTEGER(0..4398046511103) + // = exactly 42 bits (2^42), ms since 2004-01-01T00:00:00Z. NOT WIRED UP + // YET - there's no RTC/NTP sync in this skeleton, so this is 0 (decodes + // as 2004-01-01). Wire in SNTP or a GNSS UTC fix before this is real. + bw_put_bits(&bw, 0, 42); + bw_put_bits(&bw, 0, 42); + + // termination VALUE - only emitted when present (per the preamble bit + // above - UPER never encodes a value for an absent optional component). + // Termination ::= ENUMERATED{isCancellation(0), isNegation(1)}, no + // "...", 2 values -> 1 bit. + if (f->terminate) { + bw_put_bits(&bw, 0, 1); // isCancellation + } + + // eventPosition (ReferencePosition ::= SEQUENCE{latitude, longitude, + // positionConfidenceEllipse, altitude} - no OPTIONALs/"..." -> no + // preamble, straight concatenation). Widths below are each field's + // exact constrained-INTEGER range size from ITS-Container.asn, encoded + // as an unsigned offset from the type's declared minimum - NOT assumed + // to match neighboring fields (latitude and longitude are different + // widths, which is easy to miss). + // Latitude ::= INTEGER(-900000000..900000001) -> range 1800000002 -> 31 bits + uint32_t lat_offset = (uint32_t)(f->latitude_tenmicrodeg - (-900000000)); + bw_put_bits(&bw, lat_offset, 31); + // Longitude ::= INTEGER(-1800000000..1800000001) -> range 3600000002 -> 32 bits + uint32_t lon_offset = (uint32_t)(f->longitude_tenmicrodeg - (-1800000000)); + bw_put_bits(&bw, lon_offset, 32); + // PosConfidenceEllipse ::= SEQUENCE{semiMajorConfidence, semiMinorConfidence, + // semiMajorOrientation} - no preamble. + // SemiAxisLength ::= INTEGER(0..4095) -> 12 bits (not 16 - this was wrong before) + bw_put_bits(&bw, 4095, 12); // semiMajorConfidence: unavailable + bw_put_bits(&bw, 4095, 12); // semiMinorConfidence: unavailable + // HeadingValue ::= INTEGER(0..3601) -> 12 bits (not 16 - this was wrong before) + bw_put_bits(&bw, 3601, 12); // semiMajorOrientation: unavailable + // Altitude ::= SEQUENCE{altitudeValue, altitudeConfidence} - no preamble. + // AltitudeValue ::= INTEGER(-100000..800001) -> range 900002 -> 20 bits + // (not 24 - this was wrong before), offset-encoded from -100000. + bw_put_bits(&bw, 900001, 20); // 800001 ("unavailable") - (-100000) = 900001 + // AltitudeConfidence ::= ENUMERATED, 16 named values, no "..." -> 4 bits + bw_put_bits(&bw, 15, 4); // unavailable + + // stationType: StationType INTEGER(0..255) -> 8 bits fixed regardless of + // how sparse the named values are. + bw_put_bits(&bw, f->station_type, 8); + + // ---- SituationContainer ---- + // This SEQUENCE also ends in "..." -> its own 1-bit extension flag, + // THEN the 2-bit preamble (linkedCause, eventHistory), THEN the + // mandatory field values. An earlier version of this code put the + // linkedCause/eventHistory bits at the END instead of the start, and + // had no extension bit at all - both are structural bugs that would + // desync any spec-compliant decoder from this point on. + bw_put_bits(&bw, 0, 1); // SituationContainer extension bit: none used + bw_put_bits(&bw, 0, 1); // linkedCause absent + bw_put_bits(&bw, 0, 1); // eventHistory absent + + // informationQuality: InformationQuality INTEGER(0..7) -> 3 bits + bw_put_bits(&bw, 1, 3); // low quality - no real sensor input, just the hazard-light GPIO + + // eventType: CauseCode ::= SEQUENCE{causeCode, subCauseCode, ...} - this + // inner SEQUENCE is ALSO extensible ("..."), so it gets its own leading + // extension bit before its two mandatory fields. + bw_put_bits(&bw, 0, 1); // CauseCode extension bit: none used + bw_put_bits(&bw, f->cause_code, 8); // CauseCodeType INTEGER(0..255) -> 8 bits + bw_put_bits(&bw, f->sub_cause_code, 8); // SubCauseCodeType INTEGER(0..255) -> 8 bits + + // linkedCause / eventHistory: both absent, already signalled in the + // preamble above - UPER writes no value bits for them. + + return (int)bw_byte_len(&bw); +} diff --git a/obu-firmware/main/denm.h b/obu-firmware/main/denm.h new file mode 100644 index 0000000..692a1e6 --- /dev/null +++ b/obu-firmware/main/denm.h @@ -0,0 +1,67 @@ +#ifndef DENM_H +#define DENM_H +#include +#include +#include + +// Full CauseCodeType enumeration, straight from the authoritative source: +// ETSI TS 102 894-2 (CDD) ITS-Container.asn, CauseCodeType definition. +// (Values 1/2/3/14/26/27/91/94/95/97 were already cross-checked earlier +// against a real captured DENM; the rest are now confirmed the same way, +// from the actual ASN.1 module rather than guessed.) +#define DENM_CAUSE_RESERVED 0 +#define DENM_CAUSE_TRAFFIC_CONDITION 1 +#define DENM_CAUSE_ACCIDENT 2 +#define DENM_CAUSE_ROADWORKS 3 +#define DENM_CAUSE_IMPASSABILITY 5 +#define DENM_CAUSE_ADVERSE_WEATHER_ADHESION 6 +#define DENM_CAUSE_AQUAPLANNING 7 +#define DENM_CAUSE_HAZARDOUS_LOCATION_SURFACE_CONDITION 9 +#define DENM_CAUSE_HAZARDOUS_LOCATION_OBSTACLE_ON_ROAD 10 +#define DENM_CAUSE_HAZARDOUS_LOCATION_ANIMAL_ON_ROAD 11 +#define DENM_CAUSE_HUMAN_PRESENCE_ON_ROAD 12 +#define DENM_CAUSE_WRONG_WAY_DRIVING 14 +#define DENM_CAUSE_RESCUE_AND_RECOVERY_WORK_IN_PROGRESS 15 +#define DENM_CAUSE_ADVERSE_WEATHER_EXTREME 17 +#define DENM_CAUSE_ADVERSE_WEATHER_VISIBILITY 18 +#define DENM_CAUSE_ADVERSE_WEATHER_PRECIPITATION 19 +#define DENM_CAUSE_SLOW_VEHICLE 26 +#define DENM_CAUSE_DANGEROUS_END_OF_QUEUE 27 +#define DENM_CAUSE_VEHICLE_BREAKDOWN 91 +#define DENM_CAUSE_POST_CRASH 92 +#define DENM_CAUSE_HUMAN_PROBLEM 93 +#define DENM_CAUSE_STATIONARY_VEHICLE 94 +#define DENM_CAUSE_EMERGENCY_VEHICLE_APPROACHING 95 +#define DENM_CAUSE_HAZARDOUS_LOCATION_DANGEROUS_CURVE 96 +#define DENM_CAUSE_COLLISION_RISK 97 +#define DENM_CAUSE_SIGNAL_VIOLATION 98 +#define DENM_CAUSE_DANGEROUS_SITUATION 99 + +typedef struct { + uint32_t station_id; + uint16_t sequence_number; // keep constant across repeats of the SAME event; only bump on a genuinely new event + uint8_t cause_code; // e.g. 94 = stationaryVehicle + uint8_t sub_cause_code; // 0 = unspecified + uint8_t station_type; // StationType, e.g. 5 = passengerCar - match geonet_wrap_shb's station_type param + int32_t latitude_tenmicrodeg; // 1/10 microdegree; 0 = placeholder/unavailable + int32_t longitude_tenmicrodeg; // 1/10 microdegree; 0 = placeholder/unavailable + bool terminate; // true = encode this as a Termination(isCancellation) message instead of a normal update +} denm_fields_t; + +// Encodes a minimal DENM (ItsPduHeader + ManagementContainer + +// SituationContainer only - no location/alacarte containers) as ASN.1 UPER, +// per the actual ETSI EN 302 637-3 / TS 102 894-2 ASN.1 modules (fetched +// from forge.etsi.org, not reconstructed from memory). Returns bytes +// written, or -1 if buf too small. +// +// Two things worth knowing if you're reading this against the modules +// yourself: ManagementContainer, SituationContainer, and CauseCode are all +// declared with a trailing "..." (extensible), which means each needs its +// own leading extension bit in the UPER encoding - easy to miss, and this +// code got it wrong in an earlier version. Field bit-widths below (e.g. +// latitude=31 bits, longitude=32 bits, position-confidence fields=12 bits, +// altitudeValue=20 bits) are derived directly from each type's declared +// INTEGER constraint range, not assumed to match neighboring fields. +int denm_encode(const denm_fields_t *f, uint8_t *buf, size_t buf_len); + +#endif diff --git a/obu-firmware/main/dot11p.c b/obu-firmware/main/dot11p.c new file mode 100644 index 0000000..abdbfbc --- /dev/null +++ b/obu-firmware/main/dot11p.c @@ -0,0 +1,57 @@ +#include "dot11p.h" +#include + +int dot11p_build_frame(const uint8_t *gn_payload, int gn_len, + const uint8_t src_mac[6], + uint8_t *out, size_t out_len, bool qos) +{ + static const uint8_t broadcast[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + static const uint8_t llc_snap[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x89, 0x47}; + + int hdr_len = qos ? 26 : 24; // QoS Data adds a 2-byte QoS Control field + int total = hdr_len + 8 /* LLC/SNAP */ + gn_len; + if ((size_t)total > out_len) { + return -1; + } + + uint8_t *p = out; + + // Frame Control: version=0, type=Data(2), subtype=QoS Data(8) -> bytes + // 0x88 0x00. This is what real ITS-G5 hardware actually transmits. + // + // Back on QoS Data again (previously downgraded to non-QoS, subtype 0, + // as a working-but-nonstandard fallback - see git history / old comments + // here for that whole detour). What changed: main.c no longer calls + // esp_wifi_80211_tx() at all - it now goes through + // esp_wifi_80211_tx_custom() (tx_custom.c, pulled from + // opentrafficmap/its-g5-receiver-firmware_txenabled), which bypasses the + // frame-type sanity check entirely by never calling the code path that + // contains it. Frame subtype is no longer gated, so there's no reason + // left to avoid matching real hardware here. + // Frame Control byte 0: version=0, type=Data(2). Subtype: QoS Data(8)=0x88 + // for the tx_custom path, or plain Data(0)=0x08 for the standard + // esp_wifi_80211_tx() path (which rejects QoS Data outright). + *p++ = qos ? 0x88 : 0x08; *p++ = 0x00; + // Duration + *p++ = 0x00; *p++ = 0x00; + // Addr1 = destination = broadcast + memcpy(p, broadcast, 6); p += 6; + // Addr2 = source (our pseudonym) + memcpy(p, src_mac, 6); p += 6; + // Addr3 = BSSID = broadcast (no BSS exists in OCB mode) + memcpy(p, broadcast, 6); p += 6; + // Sequence control - left at 0; en_sys_seq=true fills this in for us + *p++ = 0x00; *p++ = 0x00; + // QoS Control field - only present in QoS Data frames + if (qos) { + *p++ = 0x00; *p++ = 0x00; // best-effort access category + } + + // LLC/SNAP (Ethertype 0x8947 = GeoNetworking) + memcpy(p, llc_snap, 8); p += 8; + + // GeoNetworking + BTP + DENM payload + memcpy(p, gn_payload, gn_len); p += gn_len; + + return (int)(p - out); +} diff --git a/obu-firmware/main/dot11p.h b/obu-firmware/main/dot11p.h new file mode 100644 index 0000000..3b9026a --- /dev/null +++ b/obu-firmware/main/dot11p.h @@ -0,0 +1,31 @@ +#ifndef DOT11P_H +#define DOT11P_H +#include +#include +#include + +// Wraps a GeoNetworking-layer payload in an 802.11 OCB frame: QoS Data +// (subtype 8, 26-byte header), matching real ITS-G5 hardware, broadcast, no +// BSS (Addr1=Addr3=broadcast), LLC/SNAP with Ethertype 0x8947 +// (GeoNetworking's registered Ethertype). Output is ready to hand straight +// to esp_wifi_80211_tx_custom() (tx_custom.c) - NOT esp_wifi_80211_tx(), +// which rejects this frame type outright. `src_mac` is used as Addr2 - pass +// the same 6 bytes you gave geonet_wrap_shb, since GN_ADDR's MID field is +// defined to be this same link-layer address. Returns bytes written, or -1 +// if out buffer too small. +// +// History: this used to be downgraded to non-QoS Data (subtype 0) because +// esp_wifi_80211_tx() rejects QoS Data ("unsupport QoS frame type" / esp_err +// 258) and an attempted linker-override bypass (old main/wifi_patches.c) +// didn't work. Restored to QoS Data now that main.c transmits via +// esp_wifi_80211_tx_custom() instead, which bypasses that gate entirely +// (see tx_custom.c) - so there's no longer a reason to deviate from the +// real frame format. +// qos=true -> QoS Data (subtype 8, 26-byte header) for esp_wifi_80211_tx_custom() +// qos=false -> plain Data (subtype 0, 24-byte header) which the STANDARD +// esp_wifi_80211_tx() accepts (used for the standard-TX isolation test) +int dot11p_build_frame(const uint8_t *gn_payload, int gn_len, + const uint8_t src_mac[6], + uint8_t *out, size_t out_len, bool qos); + +#endif diff --git a/obu-firmware/main/geonet.c b/obu-firmware/main/geonet.c new file mode 100644 index 0000000..9fd2555 --- /dev/null +++ b/obu-firmware/main/geonet.c @@ -0,0 +1,85 @@ +#include "geonet.h" +#include + +int geonet_wrap_shb(const uint8_t *its_payload, int its_len, + const uint8_t mac[6], uint8_t station_type, + int32_t latitude_tenmicrodeg, int32_t longitude_tenmicrodeg, + uint16_t btp_dest_port, + uint8_t *out, size_t out_len) +{ + // GN Basic Header (4) + GN Common Header (8) + SHB source LPV (24) + // + BTP-B header (4) + ITS payload + int total = 4 + 8 + 24 + 4 + its_len; + if ((size_t)total > out_len) { + return -1; + } + + uint8_t *p = out; + + // ---- GN Basic Header (4 bytes) ---- (EN 302 636-4-1 clause 9.6) + *p++ = (uint8_t)((1 << 4) | 1); // version=1, NextHeader=1 (Common Header, unsecured) + *p++ = 0x00; // reserved + *p++ = 0x83; // lifetime (~60s in the base/multiplier encoding) - tune if needed + *p++ = 1; // remaining hop limit = 1 (SHB single-hop; matches CAM in the Rust reference) + + // ---- GN Common Header (8 bytes) ---- (clause 9.7) + *p++ = (uint8_t)((2 << 4) | 0); // NextHeader=2 (BTP-B), reserved nibble + // HeaderType=5 (TSB), HeaderSubtype=0 (SINGLE_HOP) per table 9 - this is + // the actual encoding for single-hop broadcast. An earlier version of + // this code used (2,0), which is GEOUNICAST - wrong header type entirely + // for a broadcast frame; real receivers would try to match the + // destination-address extended header GeoUnicast expects and mishandle + // or reject the packet. + *p++ = (uint8_t)((5 << 4) | 0); + *p++ = 0x02; // traffic class: SCF=0, ChannelOffload=0, TC-ID=2 (clause 9.7.5) + *p++ = 0x80; // flags: bit0 = "is mobile" station (clause 9.7.2) + // Payload length = what follows the WHOLE GeoNetworking header + // (Basic+Common+Extended), i.e. BTP-B header + ITS payload only - does + // NOT include the 24-byte extended header itself. An earlier version of + // this code wrongly added the 24 bytes in here too. + uint16_t payload_len = (uint16_t)(4 + its_len); + *p++ = (uint8_t)(payload_len >> 8); + *p++ = (uint8_t)(payload_len & 0xFF); + *p++ = 1; // max hop limit = 1, matches basic header RHL (SHB single-hop) + *p++ = 0x00; // reserved + + // ---- SHB extended header: Source Long Position Vector (24 bytes) ---- + // (clause 9.5.2). GN_ADDR (8 bytes) is itself structured, not a raw + // pseudonym (clause 9.5.1): bit0 M-flag(0=auto-derived), bits1-5 ITS-S + // type (5-bit), bits6-15 reserved(=0), then octets2-7 = MID, which is + // defined to BE the link-layer (802.11) address - so this must match + // the source address dot11p_build_frame uses, not just "look similar." + uint8_t gn_addr[8]; + gn_addr[0] = (uint8_t)((0 << 7) | ((station_type & 0x1F) << 2)); // M=0, ST=station_type, top 2 reserved bits=0 + gn_addr[1] = 0x00; // remaining 8 reserved bits + memcpy(&gn_addr[2], mac, 6); // MID = link-layer address + memcpy(p, gn_addr, 8); p += 8; + // Timestamp (4 bytes, ms since 2004-01-01 mod 2^32) - placeholder 0, + // same caveat as detectionTime in denm.c. + memset(p, 0, 4); p += 4; + // Latitude/Longitude (4+4 bytes, signed, big-endian, 1/10 microdegree) - + // fixed-width binary fields, not UPER bit-packed. + uint32_t lat_u = (uint32_t)latitude_tenmicrodeg; + *p++ = (uint8_t)(lat_u >> 24); *p++ = (uint8_t)(lat_u >> 16); + *p++ = (uint8_t)(lat_u >> 8); *p++ = (uint8_t)(lat_u); + uint32_t lon_u = (uint32_t)longitude_tenmicrodeg; + *p++ = (uint8_t)(lon_u >> 24); *p++ = (uint8_t)(lon_u >> 16); + *p++ = (uint8_t)(lon_u >> 8); *p++ = (uint8_t)(lon_u); + // PAI(1 bit) + Speed(15 bits), packed into 2 bytes: 0 = PAI false, + // speed 0 - which is actually correct semantics for a STATIONARY + // vehicle beacon, not just a placeholder. + *p++ = 0x00; *p++ = 0x00; + // Heading (16 bits, 0.1 degree units): 0 = due north / unavailable + *p++ = 0x00; *p++ = 0x00; + + // ---- BTP-B header (4 bytes) ---- + *p++ = (uint8_t)(btp_dest_port >> 8); + *p++ = (uint8_t)(btp_dest_port & 0xFF); + *p++ = 0x00; *p++ = 0x00; // destination port info, unused for BTP-B + + // ---- ITS payload (DENM UPER bytes) ---- + memcpy(p, its_payload, its_len); + p += its_len; + + return (int)(p - out); +} diff --git a/obu-firmware/main/geonet.h b/obu-firmware/main/geonet.h new file mode 100644 index 0000000..22a5531 --- /dev/null +++ b/obu-firmware/main/geonet.h @@ -0,0 +1,44 @@ +#ifndef GEONET_H +#define GEONET_H +#include +#include + +// Wraps an ITS application payload (e.g. from denm_encode) with a minimal +// GeoNetworking Basic Header + Common Header + Single-Hop-Broadcast +// extended header (HeaderType=TSB(5), HeaderSubtype=SINGLE_HOP(0), per +// ETSI EN 302 636-4-1 table 9), then prepends a BTP-B header addressed to +// the DENM service port (2002). +// +// `mac` is the 6-byte pseudonym/link-layer address - pass the SAME address +// you hand to dot11p_build_frame's src address, since GN_ADDR's MID field +// (the last 6 bytes of the 8-byte GN_ADDR) is defined to BE that +// link-layer address (EN 302 636-4-1 clause 9.5.1). `station_type` is the +// 5-bit ITS-S type from the same clause (5 = passengerCar) and gets packed +// into GN_ADDR alongside the address. +// +// `latitude_tenmicrodeg`/`longitude_tenmicrodeg` go into the Source Long +// Position Vector (clause 9.5.2) as plain 32-bit signed big-endian fields - +// NOT UPER bit-packed like the DENM payload's position fields, this is a +// fixed-width binary protocol. Pass the SAME values you gave denm_encode's +// eventPosition, so the GN-layer position and the DENM's own claimed +// position agree. +// +// Deliberate simplification: real DENM dissemination normally uses +// GeoBroadcast (GBC, HeaderType=4) so RSUs/OBUs can forward it across an +// area - that needs a sequence number + geo-area fields this skeleton +// doesn't build yet. Single-hop broadcast is simpler and is the +// best-tested decode path in the receiver firmware you already have +// working (same extended header shape as CAM). Fine for a single-vehicle +// beacon; revisit if you need real multi-hop forwarding later. +// +// `btp_dest_port` is the BTP-B destination port for the service being carried +// (ETSI TS 103 248): 2001 = CAM, 2002 = DENM, 2003 = MAPEM, 2004 = SPATEM, ... +// +// Returns bytes written, or -1 if out buffer too small. +int geonet_wrap_shb(const uint8_t *its_payload, int its_len, + const uint8_t mac[6], uint8_t station_type, + int32_t latitude_tenmicrodeg, int32_t longitude_tenmicrodeg, + uint16_t btp_dest_port, + uint8_t *out, size_t out_len); + +#endif diff --git a/obu-firmware/main/gn_unwrap.c b/obu-firmware/main/gn_unwrap.c new file mode 100644 index 0000000..4e39440 --- /dev/null +++ b/obu-firmware/main/gn_unwrap.c @@ -0,0 +1,114 @@ +#include "gn_unwrap.h" +#include + +// Mirrors dot11p.c / geonet.c's constants and layout, in reverse. Keep these two files in sync +// if either the TX-side frame shape or these constants change. +#define GN_ETHERTYPE (0x8947) +#define LLC_SNAP_HEADER_LEN (8) +#define IEEE80211_HEADER_LEN (24) // non-QoS Data +#define IEEE80211_QOS_CTRL_LEN (2) // extra field QoS Data frames add +#define IEEE80211_FC_TYPE_DATA (2) +#define IEEE80211_FC_QOS_SUBTYPE_BIT (0x08) + +#define GN_BASIC_HEADER_LEN (4) +#define GN_COMMON_HEADER_LEN (8) +#define GN_SHB_EXT_HEADER_LEN (24) // Source Long Position Vector, geonet.c's SHB shape +#define BTP_B_HEADER_LEN (4) + +#define GN_HEADER_TYPE_TSB (5) // Topologically-Scoped Broadcast +#define GN_HEADER_SUBTYPE_SINGLE_HOP (0) + +#define BTP_DEST_PORT_CAM (2001) // ETSI TS 103 248 + +static const uint8_t s_llc_snap_prefix[6] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00}; + +bool gn_unwrap_cam(const uint8_t *frame, int frame_len, + const uint8_t **out_cam, int *out_cam_len) +{ + if (!frame || frame_len < IEEE80211_HEADER_LEN) { + return false; + } + + uint8_t fc0 = frame[0]; + uint8_t fc1 = frame[1]; + uint8_t type = (fc0 >> 2) & 0x03; + uint8_t subtype = (fc0 >> 4) & 0x0F; + bool to_ds = fc1 & 0x01; + bool from_ds = fc1 & 0x02; + + // Only plain broadcast Data frames, no WDS - matches what dot11p_build_frame ever produces + // (and what real ITS-G5 hardware sends). + if (type != IEEE80211_FC_TYPE_DATA || (to_ds && from_ds)) { + return false; + } + + int offset = IEEE80211_HEADER_LEN; + if (subtype & IEEE80211_FC_QOS_SUBTYPE_BIT) { + offset += IEEE80211_QOS_CTRL_LEN; + } + + if (frame_len < offset + LLC_SNAP_HEADER_LEN) { + return false; + } + if (memcmp(frame + offset, s_llc_snap_prefix, sizeof(s_llc_snap_prefix)) != 0) { + return false; + } + uint16_t ethertype = ((uint16_t)frame[offset + 6] << 8) | frame[offset + 7]; + if (ethertype != GN_ETHERTYPE) { + return false; + } + offset += LLC_SNAP_HEADER_LEN; + + // ---- GN Basic Header (4 bytes) ---- nothing here we need to validate for our purposes; + // just skip it. (version/NextHeader in byte0, lifetime in byte2, RHL in byte3.) + if (frame_len < offset + GN_BASIC_HEADER_LEN) { + return false; + } + offset += GN_BASIC_HEADER_LEN; + + // ---- GN Common Header (8 bytes) ---- + if (frame_len < offset + GN_COMMON_HEADER_LEN) { + return false; + } + uint8_t next_header = (frame[offset + 0] >> 4) & 0x0F; + uint8_t header_type = (frame[offset + 1] >> 4) & 0x0F; + uint8_t header_subtype = frame[offset + 1] & 0x0F; + if (next_header != 2 /* BTP-B */) { + return false; + } + if (header_type != GN_HEADER_TYPE_TSB || header_subtype != GN_HEADER_SUBTYPE_SINGLE_HOP) { + // Not a single-hop-broadcast frame - e.g. GeoBroadcast (DENM-style dissemination) or + // something this project doesn't transmit/expect. Not an error, just not for us yet - + // see gn_unwrap.h's note on scope. + return false; + } + offset += GN_COMMON_HEADER_LEN; + + // ---- SHB extended header (24 bytes) ---- skip straight past it, we don't need the + // sender's claimed position/speed/heading here (the CAM payload has its own, more precise + // versions of those same fields). + if (frame_len < offset + GN_SHB_EXT_HEADER_LEN) { + return false; + } + offset += GN_SHB_EXT_HEADER_LEN; + + // ---- BTP-B header (4 bytes) ---- + if (frame_len < offset + BTP_B_HEADER_LEN) { + return false; + } + uint16_t dest_port = ((uint16_t)frame[offset + 0] << 8) | frame[offset + 1]; + if (dest_port != BTP_DEST_PORT_CAM) { + return false; // e.g. DENM (2002) - not decoded by this project yet + } + offset += BTP_B_HEADER_LEN; + + // ---- Whatever's left is the CAM UPER payload ---- + int cam_len = frame_len - offset; + if (cam_len <= 0) { + return false; + } + + *out_cam = frame + offset; + *out_cam_len = cam_len; + return true; +} diff --git a/obu-firmware/main/gn_unwrap.h b/obu-firmware/main/gn_unwrap.h new file mode 100644 index 0000000..f57ecb2 --- /dev/null +++ b/obu-firmware/main/gn_unwrap.h @@ -0,0 +1,39 @@ +#ifndef GN_UNWRAP_H +#define GN_UNWRAP_H +#include +#include +#include + +// Inverse of geonet_wrap_shb() + dot11p_build_frame(): takes a raw 802.11 frame as delivered by +// the WiFi driver's promiscuous RX callback and strips 802.11 header -> LLC/SNAP -> GeoNetworking +// Basic/Common/extended header -> BTP-B header, leaving just the ITS payload (CAM UPER bytes) +// and the sender's station id (GN_ADDR MID). +// +// Deliberately narrow, matching what this project actually transmits: only handles the +// Single-Hop-Broadcast (TSB, HeaderType=5/Subtype=0) extended header shape, same as +// geonet_wrap_shb() builds - the same "best-tested decode path" rationale documented there. +// A real receiver would also need GeoBroadcast (HeaderType=4, used by DENM dissemination in +// real deployments) and possibly Beacon/GeoUnicast - out of scope for now since nothing this +// project talks to sends those. Extend header_type handling here if that changes. +// +// Only accepts BTP-B destination port 2001 (CAM, per ETSI TS 103 248) - other ports (e.g. 2002 +// DENM) are silently rejected since the phone-side decoder only understands CAM right now. +// +// Returns true and fills *out_cam / *out_cam_len (pointing INTO the input frame buffer, not a +// copy - valid only as long as `frame` is) if this was a well-formed, CAM-carrying SHB frame +// this project can decode. Returns false otherwise (wrong ethertype, wrong header type, wrong +// BTP port, truncated, or FCS/promiscuous-capture garbage - all common and expected on an +// open-air capture, not logged as errors by the caller). +// +// No station id is extracted here on purpose: CAM's own ItsPduHeader.stationID (the first real +// field inside the UPER payload this function hands back, per cam.c) is already the meaningful +// application-level identifier - the Kotlin-side decoder reads it from there. The GN_ADDR MID +// this frame also carries is a separate, link-layer-only pseudonym; extracting and forwarding +// it too would just be a second, easily-confused "station id" for no benefit here. +// +// RSSI is NOT extracted here either - it comes from the promiscuous callback's own packet +// metadata (wifi_pkt_rx_ctrl_t.rssi in main.c), not from anything inside the frame bytes. +bool gn_unwrap_cam(const uint8_t *frame, int frame_len, + const uint8_t **out_cam, int *out_cam_len); + +#endif diff --git a/obu-firmware/main/main.c b/obu-firmware/main/main.c new file mode 100644 index 0000000..702e6a1 --- /dev/null +++ b/obu-firmware/main/main.c @@ -0,0 +1,316 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "driver/gpio.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "nvs_flash.h" +#include "esp_log.h" +#include "hal/modem_syscon_ll.h" // modem_syscon_ll_enable_fe_40m_clock() - see initialize_wifi +#include "denm.h" +#include "geonet.h" +#include "dot11p.h" +#include "tx_custom.h" // not called below - kept available for the QoS-Data/tx_custom path if + // esp_wifi_80211_tx's non-QoS frame ever proves insufficient again +#include "serial_link.h" +#include "gn_unwrap.h" + +static const char *TAG = "obu-tx"; + +// Phase 03: CAM is no longer built on this chip. The phone fuses its own GNSS+IMU, UPER-encodes +// CAM itself, and hands the finished bytes down over serial_link (SERIAL_MSG_CAM_TX) - this +// firmware's job on transmit shrinks to "GeoNetworking/BTP-wrap + 802.11-wrap + key the PA the +// instant a CAM arrives." There is no on-chip transmit timer anymore; the phone's send cadence +// (1 Hz baseline, faster near intersections/events - all decided app-side) IS the air cadence. +// See cam.c/.h - no longer built (removed from CMakeLists), kept on disk for field-layout +// reference only, since the phone's Kotlin encoder is a byte-exact port of it. +// +// On receive, this firmware now also runs a promiscuous callback (gn_unwrap.c strips +// 802.11/LLC-SNAP/GeoNetworking/BTP-B down to the raw CAM UPER payload) and forwards every CAM +// it hears over the same serial link (SERIAL_MSG_CAM_RX), for the phone's detection engine. +// Single half-duplex radio doing both jobs, same as real ITS-G5 hardware. + +// Target frequency: 5900 MHz (ITS-G5 G5-CCH, channel 180). This is what the +// working Rust reference transmits on, proving the C5 PA reaches it despite the +// 5885 datasheet max. The reference sets band-mode 5G, then phy_11p_set + +// phy_change_channel(5900) directly - it does NOT call esp_wifi_set_channel at +// all, so we don't either (channel 180 isn't a normal Wi-Fi channel anyway). +#define TX_FREQ_MHZ 5900 + +// ---- CAM beacon profile (used for the GeoNetworking layer only now - see below) ---- +#define STATION_TYPE 5 // passengerCar (TS 102 894-2 StationType) - matches gn_addr's ST field +#define BTP_PORT_CAM 2001 // BTP-B destination port for CAM (ETSI TS 103 248) + +// Bench location, hardcoded since there's no GNSS module wired in yet and the unit is genuinely +// stationary here: 53°33'16.8"N 10°01'20.6"E, in 1/10-microdegree units. Used ONLY for the +// GeoNetworking Source Long Position Vector now (geonet_wrap_shb's own claimed position) - the +// CAM payload's own referencePosition comes from the phone's real GNSS and can legitimately +// differ from this bench placeholder until the GN layer is also given a real position source. +// TODO: feed this from the phone too (e.g. a lightweight position update piggybacked on +// SERIAL_MSG_CAM_TX, or a new small message type) instead of a fixed bench location. +#define BENCH_LATITUDE_TENMICRODEG 535546667 +#define BENCH_LONGITUDE_TENMICRODEG 100223889 + +// Single source of truth for the pseudonym/link-layer address: used both as +// the 802.11 source MAC (Addr2) and as GN_ADDR's MID field, since the GN +// spec defines those as being the same address. Locally-administered bit +// set (0x02) per normal MAC convention. Fixed/non-rotating for now - real +// stacks rotate this every 5-15 min for privacy. Owned entirely by this firmware (not the +// phone) per the Phase 03 design decision - simplest given the phone never needs to know it. +static const uint8_t pseudonym_mac[6] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x01}; + +// Undocumented libphy.a calls that push the radio into 802.11p OCB mode on +// the 5.9 GHz ITS-G5 band. See docs/04-transmit-setup.md for source + what +// to do if the linker can't find these symbols in your ESP-IDF version. +extern void phy_11p_set(int enable, int unused); +extern void phy_change_channel(int freq_mhz, int bw_mode, int sec_chan_offset, int unused); + +// ============================================================================ +// ---- TX path: phone -> serial_link -> queue -> radio task -> air ---------- +// ============================================================================ + +// One CAM-to-transmit item. Fixed-size (no malloc) since SERIAL_LINK_MAX_PAYLOAD bounds it - +// simplest safe option for a queue this small and this hot. +typedef struct { + uint8_t data[SERIAL_LINK_MAX_PAYLOAD]; + int len; +} cam_tx_item_t; + +static QueueHandle_t s_tx_queue; + +// Called directly from serial_link's UART RX task the instant a checksummed SERIAL_MSG_CAM_TX +// frame arrives - MUST be fast (documented in serial_link.h), so this only copies into a queue +// item and returns; the actual GeoNetworking-wrap + 802.11-wrap + radio TX happens in +// tx_radio_task below, off the UART parsing path entirely. xQueueSend with 0 timeout: if the +// radio task is somehow behind, drop this CAM rather than stall UART frame parsing - the next +// one is only ~1s (or less, at elevated rate) away regardless. +static void on_cam_tx_from_phone(const uint8_t *cam_uper, int cam_len) +{ + if (cam_len <= 0 || cam_len > SERIAL_LINK_MAX_PAYLOAD) { + ESP_LOGW(TAG, "on_cam_tx_from_phone: bad length %d", cam_len); + return; + } + cam_tx_item_t item; + item.len = cam_len; + memcpy(item.data, cam_uper, (size_t)cam_len); + if (xQueueSend(s_tx_queue, &item, 0) != pdTRUE) { + ESP_LOGW(TAG, "tx queue full, dropping CAM from phone"); + } +} + +static void tx_radio_task(void *arg) +{ + (void)arg; + cam_tx_item_t item; + + while (1) { + if (xQueueReceive(s_tx_queue, &item, portMAX_DELAY) != pdTRUE) { + continue; + } + + uint8_t gn_payload[160]; + int gn_len = geonet_wrap_shb(item.data, item.len, pseudonym_mac, STATION_TYPE, + BENCH_LATITUDE_TENMICRODEG, BENCH_LONGITUDE_TENMICRODEG, + BTP_PORT_CAM, gn_payload, sizeof(gn_payload)); + if (gn_len <= 0) { + ESP_LOGW(TAG, "geonet_wrap_shb failed (cam_len=%d)", item.len); + continue; + } + + uint8_t frame[300]; + int frame_len = dot11p_build_frame(gn_payload, gn_len, pseudonym_mac, frame, + sizeof(frame), false); + if (frame_len <= 0) { + ESP_LOGW(TAG, "dot11p_build_frame failed (gn_len=%d)", gn_len); + continue; + } + + // Standard, well-tested raw-TX API with a non-QoS Data frame - same path validated + // during Phase 2 bring-up (see git history for the tx_custom.c A/B test that led here). + esp_err_t err = esp_wifi_80211_tx(WIFI_IF_STA, frame, frame_len, true); + if (err != ESP_OK) { + ESP_LOGW(TAG, "esp_wifi_80211_tx failed: %d", err); + } else { + ESP_LOGI(TAG, "CAM sent (%d bytes) @ %d MHz", frame_len, TX_FREQ_MHZ); + } + } +} + +// ============================================================================ +// ---- RX path: air -> promiscuous cb -> queue -> forward task -> serial_link +// ============================================================================ + +// Promiscuous RX callbacks run in the WiFi driver's own task context and must stay short - so, +// same pattern as the TX side and as the reference sniffer firmware (cmd_sniffer.c's +// queue_packet), this just copies the frame and queues it; gn_unwrap_cam() and the serial write +// both happen in rx_forward_task instead. +typedef struct { + uint8_t data[400]; // generous vs. our own ~300-byte TX frames; longer frames are truncated + int len; + int8_t rssi; +} rx_item_t; + +static QueueHandle_t s_rx_queue; + +static void wifi_promisc_rx_cb(void *recv_buf, wifi_promiscuous_pkt_type_t type) +{ + if (type == WIFI_PKT_MISC) { + return; // no payload of interest, mirrors cmd_sniffer.c's handling + } + wifi_promiscuous_pkt_t *packet = (wifi_promiscuous_pkt_t *)recv_buf; + if (packet->rx_ctrl.rx_state) { + return; // frame had an error (mirrors cmd_sniffer.c) + } + +#if CONFIG_SOC_WIFI_HE_SUPPORT + int length = packet->rx_ctrl.dump_len; +#else + int length = packet->rx_ctrl.sig_len - 4 /* FCS */; +#endif + if (length <= 0) { + return; + } + + rx_item_t item; + item.len = length > (int)sizeof(item.data) ? (int)sizeof(item.data) : length; + memcpy(item.data, packet->payload, (size_t)item.len); + item.rssi = packet->rx_ctrl.rssi; + + // 0 timeout: never block the WiFi driver's own task waiting for queue space. + xQueueSend(s_rx_queue, &item, 0); +} + +static void rx_forward_task(void *arg) +{ + (void)arg; + rx_item_t item; + + while (1) { + if (xQueueReceive(s_rx_queue, &item, portMAX_DELAY) != pdTRUE) { + continue; + } + + const uint8_t *cam = NULL; + int cam_len = 0; + // Most promiscuously-captured frames are NOT CAM (management/control frames, other + // ITS-G5 traffic types, our own loopback if the driver echoes it) - gn_unwrap_cam + // returning false here is the common case, not an error. + if (gn_unwrap_cam(item.data, item.len, &cam, &cam_len)) { + serial_link_send_cam_rx(item.rssi, cam, cam_len); + } + } +} + +// ============================================================================ + +void app_main(void) +{ + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + s_tx_queue = xQueueCreate(4, sizeof(cam_tx_item_t)); + s_rx_queue = xQueueCreate(8, sizeof(rx_item_t)); + if (!s_tx_queue || !s_rx_queue) { + ESP_LOGE(TAG, "queue creation failed - halting"); + return; + } + + // Enable the modem FRONT-END 40 MHz clock BEFORE esp_wifi_init(). This is + // the one step the proven-working receiver firmware + // (its-g5-receiver-firmware_txenabled, main/main.c -> initialize_wifi()) + // performs that this OBU was missing. Without the FE clock enabled the + // 5 GHz front-end / transmit chain is not fully clocked - which matches the + // exact symptom here: the radio calibrates (boot RF ping) and receives + // fine, but data frames are accepted by the API and never actually key the + // PA. This is a low-level modem_syscon register write via the HAL LL layer, + // copied verbatim from the reference firmware. + modem_syscon_ll_enable_fe_40m_clock(&MODEM_SYSCON, 1); + + wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&wifi_cfg)); + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); // match reference initialize_wifi() + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_start()); + + // ---- Regulatory / TX-authorization override ----------------------------- + // THE fix for "RX works but TX is silent". By default the driver uses + // WIFI_COUNTRY_POLICY_AUTO, whose 5 GHz regulatory table does NOT authorize + // transmit on the 5.9 GHz ITS band (and treats DFS channels as no-IR / + // radar-gated). Receiving is never gated - which is exactly why the sniffer + // hears traffic but our own frames never key the PA, and why the only RF + // seen from this board is the uninhibited PHY-calibration burst at boot. + // + // Switching to WIFI_COUNTRY_POLICY_MANUAL with an explicit 5 GHz channel + // mask (wifi_5g_channel_mask, which only takes effect under manual policy) + // tells the driver these channels are permitted and lifts the transmit + // gate. Manual policy = the operator asserts regulatory responsibility, which is + // appropriate for licensed/university research on the ITS band. + wifi_country_t ctry = { + .cc = "US", // nominal under manual policy + .schan = 1, + .nchan = 11, + .policy = WIFI_COUNTRY_POLICY_MANUAL, + .wifi_5g_channel_mask = 0x1FFFFFFE, // all 5 GHz channels, bits 1..28 (incl. 140 and 177) + }; + esp_err_t ctry_err = esp_wifi_set_country(&ctry); + if (ctry_err != ESP_OK) { + ESP_LOGW(TAG, "esp_wifi_set_country(MANUAL) failed: %d (continuing)", ctry_err); + } + // Ensure the PA runs at full configured power (not a reduced regulatory + // default). Units are 0.25 dBm; 80 = 20 dBm. + esp_wifi_set_max_tx_power(80); + // ------------------------------------------------------------------------- + + // Force the dual-band C5 onto its 5 GHz PHY. This MUST be called after + // esp_wifi_start() - calling it before returns ESP_ERR_WIFI_NOT_STARTED + // (0x3002 / 12290). Locking the band to 5G explicitly keeps the driver + // from ever falling back to 2.4 GHz ch1 (the old "stuck at primary=1" + // symptom), which would key the wrong PHY and make us inaudible to a + // 5.9 GHz sniffer/peer. Valid 5 GHz channels on the C5 are 36..177. Not + // ESP_ERROR_CHECK'd: log and continue if a given IDF build differs. + esp_err_t band_err = esp_wifi_set_band_mode(WIFI_BAND_MODE_5G_ONLY); + if (band_err != ESP_OK) { + ESP_LOGW(TAG, "esp_wifi_set_band_mode(5G_ONLY) failed: %d (continuing)", band_err); + } + + // Disable Wi-Fi power save. An unassociated STA with the default + // WIFI_PS_MIN_MODEM power save sleeps its radio between beacons it will + // never receive (we're not joined to any AP), and drops outbound raw + // frames while asleep. Also matters for RX now: a sleeping radio misses + // incoming CAMs just as easily as it drops outbound ones. Must be called + // after esp_wifi_start(). + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); + + // Register the promiscuous RX callback BEFORE enabling promiscuous mode, so there's no + // window where promiscuous mode is on but nothing is registered to receive frames from it. + ESP_ERROR_CHECK(esp_wifi_set_promiscuous_rx_cb(wifi_promisc_rx_cb)); + + // Enable promiscuous mode. Doubles as the fix for raw-TX being silently dropped + // (ESP-IDF only actually emits raw frames when the MAC is promiscuous or associated to an + // AP - plain unassociated STA is neither) AND as what makes RX possible at all outside a + // joined BSS. One radio, one mode, both jobs - see file header comment. + ESP_ERROR_CHECK(esp_wifi_set_promiscuous(true)); + + // Force 802.11p OCB mode on the ITS-G5 channel, exactly like the working + // Rust reference (esp32-c_its-companion, src/radio.rs setup_wifi_sniffer): + // enable 802.11p, then jump straight to the target frequency. With band-mode + // already locked to 5 GHz above, NO esp_wifi_set_channel priming is needed - + // channel 180 (5900 MHz) isn't a normal Wi-Fi channel anyway. phy_change_channel + // takes the frequency in MHz. + ESP_LOGI(TAG, "about to call phy_11p_set..."); + phy_11p_set(1, 0); + ESP_LOGI(TAG, "phy_11p_set returned, about to call phy_change_channel(%d)...", TX_FREQ_MHZ); + phy_change_channel(TX_FREQ_MHZ, 1, 0, 0); + ESP_LOGI(TAG, "phy_change_channel returned"); + + xTaskCreate(tx_radio_task, "tx_radio", 4096, NULL, 6, NULL); + xTaskCreate(rx_forward_task, "rx_forward", 4096, NULL, 5, NULL); + serial_link_init(on_cam_tx_from_phone); + + ESP_LOGW(TAG, "OCB @ %d MHz - TX/RX armed, driven by serial_link (no on-chip TX timer)", + TX_FREQ_MHZ); +} diff --git a/obu-firmware/main/serial_link.c b/obu-firmware/main/serial_link.c new file mode 100644 index 0000000..b85360f --- /dev/null +++ b/obu-firmware/main/serial_link.c @@ -0,0 +1,199 @@ +#include "serial_link.h" +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/uart.h" +#include "esp_log.h" + +static const char *TAG = "serial_link"; + +#define SYNC0 0xAA +#define SYNC1 0x55 + +static serial_link_cam_tx_cb_t s_on_cam_tx; + +// ---- CRC-16/CCITT-FALSE (poly 0x1021, init 0xFFFF, no reflect, no xorout) ---- +// Bytewise (no table) - frames here are at most SERIAL_LINK_MAX_PAYLOAD + 3 bytes, so table +// lookup isn't worth the flash/RAM tradeoff. MUST match the Kotlin-side implementation exactly +// (see app SerialFrame.kt) or every frame will be silently rejected as corrupt. +static uint16_t crc16_ccitt_false(const uint8_t *data, size_t len) +{ + uint16_t crc = 0xFFFF; + for (size_t i = 0; i < len; i++) { + crc ^= (uint16_t)data[i] << 8; + for (int b = 0; b < 8; b++) { + crc = (crc & 0x8000) ? (uint16_t)((crc << 1) ^ 0x1021) : (uint16_t)(crc << 1); + } + } + return crc; +} + +static bool send_frame(uint8_t type, const uint8_t *payload, int len) +{ + if (len < 0 || len > SERIAL_LINK_MAX_PAYLOAD) { + ESP_LOGW(TAG, "send_frame: payload too large (%d)", len); + return false; + } + + // type(1) + length(2) + payload(len) is what the CRC covers. + uint8_t head[3]; + head[0] = type; + head[1] = (uint8_t)(len & 0xFF); + head[2] = (uint8_t)((len >> 8) & 0xFF); + + uint16_t crc; + { + // Compute CRC over head+payload without a combined buffer copy: CRC is a running + // state, so feed it in two calls worth of bytes by concatenating into a small stack + // buffer (payload is capped at SERIAL_LINK_MAX_PAYLOAD, so head+payload comfortably + // fits on the stack). + uint8_t crc_buf[3 + SERIAL_LINK_MAX_PAYLOAD]; + memcpy(crc_buf, head, 3); + if (len > 0) memcpy(crc_buf + 3, payload, (size_t)len); + crc = crc16_ccitt_false(crc_buf, (size_t)(3 + len)); + } + + uint8_t sync[2] = {SYNC0, SYNC1}; + uint8_t crc_bytes[2] = {(uint8_t)(crc & 0xFF), (uint8_t)((crc >> 8) & 0xFF)}; + + // Four separate writes rather than one assembled buffer - simplest given payload is + // already wherever the caller has it (avoids a second copy of up to 160 bytes). + int wrote = 0; + wrote += uart_write_bytes(SERIAL_LINK_UART_NUM, sync, sizeof(sync)); + wrote += uart_write_bytes(SERIAL_LINK_UART_NUM, head, sizeof(head)); + if (len > 0) wrote += uart_write_bytes(SERIAL_LINK_UART_NUM, payload, (size_t)len); + wrote += uart_write_bytes(SERIAL_LINK_UART_NUM, crc_bytes, sizeof(crc_bytes)); + + return wrote == (int)(sizeof(sync) + sizeof(head) + len + sizeof(crc_bytes)); +} + +bool serial_link_send_cam_rx(int8_t rssi, const uint8_t *cam_uper, int cam_len) +{ + if (cam_len < 0 || cam_len > SERIAL_LINK_MAX_PAYLOAD - 1) { + ESP_LOGW(TAG, "send_cam_rx: cam_len too large (%d)", cam_len); + return false; + } + uint8_t payload[SERIAL_LINK_MAX_PAYLOAD]; + payload[0] = (uint8_t)rssi; + memcpy(payload + 1, cam_uper, (size_t)cam_len); + return send_frame(SERIAL_MSG_CAM_RX, payload, 1 + cam_len); +} + +bool serial_link_send_status(uint8_t status) +{ + return send_frame(SERIAL_MSG_STATUS, &status, 1); +} + +// ---- RX framing state machine ---- +// Runs in its own task, byte-at-a-time off the UART driver's RX ring buffer (via +// uart_read_bytes with a short timeout, not raw ISR access - simplest correct option for a +// link this slow/small; revisit if CAM traffic volume ever makes this a bottleneck). +typedef enum { + WAIT_SYNC0, + WAIT_SYNC1, + WAIT_TYPE, + WAIT_LEN_LO, + WAIT_LEN_HI, + WAIT_PAYLOAD, + WAIT_CRC_LO, + WAIT_CRC_HI, +} rx_state_t; + +static void rx_task(void *arg) +{ + (void)arg; + rx_state_t state = WAIT_SYNC0; + uint8_t type = 0; + uint16_t len = 0; + uint16_t payload_idx = 0; + uint8_t payload[SERIAL_LINK_MAX_PAYLOAD]; + uint16_t crc_recv = 0; + + uint8_t byte; + while (1) { + int n = uart_read_bytes(SERIAL_LINK_UART_NUM, &byte, 1, pdMS_TO_TICKS(50)); + if (n <= 0) continue; + + switch (state) { + case WAIT_SYNC0: + state = (byte == SYNC0) ? WAIT_SYNC1 : WAIT_SYNC0; + break; + case WAIT_SYNC1: + state = (byte == SYNC1) ? WAIT_TYPE : (byte == SYNC0 ? WAIT_SYNC1 : WAIT_SYNC0); + break; + case WAIT_TYPE: + type = byte; + state = WAIT_LEN_LO; + break; + case WAIT_LEN_LO: + len = byte; + state = WAIT_LEN_HI; + break; + case WAIT_LEN_HI: + len |= (uint16_t)byte << 8; + if (len > SERIAL_LINK_MAX_PAYLOAD) { + ESP_LOGW(TAG, "rx: length %u exceeds max, resyncing", len); + state = WAIT_SYNC0; // can't trust this frame boundary at all - drop to resync + } else if (len == 0) { + payload_idx = 0; + state = WAIT_CRC_LO; + } else { + payload_idx = 0; + state = WAIT_PAYLOAD; + } + break; + case WAIT_PAYLOAD: + payload[payload_idx++] = byte; + if (payload_idx >= len) state = WAIT_CRC_LO; + break; + case WAIT_CRC_LO: + crc_recv = byte; + state = WAIT_CRC_HI; + break; + case WAIT_CRC_HI: { + crc_recv |= (uint16_t)byte << 8; + + uint8_t crc_buf[3 + SERIAL_LINK_MAX_PAYLOAD]; + crc_buf[0] = type; + crc_buf[1] = (uint8_t)(len & 0xFF); + crc_buf[2] = (uint8_t)((len >> 8) & 0xFF); + if (len > 0) memcpy(crc_buf + 3, payload, len); + uint16_t crc_calc = crc16_ccitt_false(crc_buf, (size_t)(3 + len)); + + if (crc_calc == crc_recv) { + if (type == SERIAL_MSG_CAM_TX && s_on_cam_tx) { + s_on_cam_tx(payload, len); + } else if (type != SERIAL_MSG_CAM_TX) { + ESP_LOGW(TAG, "rx: unexpected frame type 0x%02x from phone, ignoring", type); + } + } else { + ESP_LOGW(TAG, "rx: CRC mismatch (got %04x want %04x), dropping frame", crc_recv, crc_calc); + } + state = WAIT_SYNC0; + break; + } + } + } +} + +void serial_link_init(serial_link_cam_tx_cb_t on_cam_tx) +{ + s_on_cam_tx = on_cam_tx; + + uart_config_t cfg = { + .baud_rate = SERIAL_LINK_BAUD, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .source_clk = UART_SCLK_DEFAULT, + }; + ESP_ERROR_CHECK(uart_driver_install(SERIAL_LINK_UART_NUM, 1024, 1024, 0, NULL, 0)); + ESP_ERROR_CHECK(uart_param_config(SERIAL_LINK_UART_NUM, &cfg)); + ESP_ERROR_CHECK(uart_set_pin(SERIAL_LINK_UART_NUM, SERIAL_LINK_TX_GPIO, SERIAL_LINK_RX_GPIO, + UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); + + xTaskCreate(rx_task, "serial_link_rx", 4096, NULL, 6, NULL); + ESP_LOGI(TAG, "serial_link up on UART%d, TX=GPIO%d RX=GPIO%d @ %d baud", + SERIAL_LINK_UART_NUM, SERIAL_LINK_TX_GPIO, SERIAL_LINK_RX_GPIO, SERIAL_LINK_BAUD); +} diff --git a/obu-firmware/main/serial_link.h b/obu-firmware/main/serial_link.h new file mode 100644 index 0000000..531fe59 --- /dev/null +++ b/obu-firmware/main/serial_link.h @@ -0,0 +1,63 @@ +#ifndef SERIAL_LINK_H +#define SERIAL_LINK_H +#include +#include +#include + +// Binary framing for the phone <-> ESP32-C5 link (Phase 03). Deliberately NOT the same UART as +// the ESP-IDF console/ESP_LOG output (UART0, see sdkconfig CONFIG_ESP_CONSOLE_UART_NUM=0) - +// mixing binary frames with human-readable log text on one wire would corrupt both. This runs +// on a dedicated UART (see SERIAL_LINK_UART_NUM / TX / RX pins below - CHANGE THESE to match +// your board's actual wiring from the USB-C connector's UART bridge to ESP32-C5 GPIOs). +// +// Frame format (both directions, symmetric): +// [0xAA][0x55][type:1][length:2 LE][payload: length bytes][crc16:2 LE] +// CRC16 is CRC-16/CCITT-FALSE (poly 0x1021, init 0xFFFF, no reflect, no xorout), computed over +// type + length + payload only (not the two sync bytes). Same algorithm must be used on the +// Kotlin side (see app SerialFrame.kt) - frames that don't checksum are silently dropped. +// +// Direction / types: +// SERIAL_MSG_CAM_TX (0x01), phone -> ESP32: payload is a raw CAM UPER byte string, already +// built by the phone (position/speed/heading/yaw rate baked in). On receipt the ESP32 +// immediately GeoNetworking-wraps and transmits it - this IS the transmit clock now, there +// is no independent on-chip timer. See main.c's rx-driven tx path. +// SERIAL_MSG_CAM_RX (0x02), ESP32 -> phone: payload is [rssi:1 signed][CAM UPER bytes...] - a +// CAM received over the air, already stripped of its 802.11/LLC-SNAP/GeoNetworking/BTP-B +// framing by gn_unwrap.c. The phone never sees raw 802.11 frames. No station id is carried +// separately - CAM's own ItsPduHeader.stationID (the first field inside the UPER bytes) is +// already the meaningful identifier; see gn_unwrap.h for why a second one isn't added here. +// SERIAL_MSG_STATUS (0x03), ESP32 -> phone: 1-byte heartbeat (0 = ok), sent periodically so +// the phone can distinguish "link idle" from "link dead" independent of CAM traffic. +#define SERIAL_MSG_CAM_TX 0x01 +#define SERIAL_MSG_CAM_RX 0x02 +#define SERIAL_MSG_STATUS 0x03 + +// CHANGE THESE to match your board's actual USB-C -> UART bridge wiring. UART0 is already +// claimed by the console/ESP_LOG; picking UART1 here to stay clear of it. These are common +// free GPIOs on ESP32-C5 devkits but are NOT guaranteed free on your specific board - check +// your schematic before flashing. +#define SERIAL_LINK_UART_NUM 1 +#define SERIAL_LINK_TX_GPIO 4 +#define SERIAL_LINK_RX_GPIO 5 +#define SERIAL_LINK_BAUD 115200 + +// Max CAM payload this link will carry. cam.c sizes its own encode buffer at 96 bytes; 160 +// gives headroom for the RX path's extra station_id+rssi prefix plus margin. +#define SERIAL_LINK_MAX_PAYLOAD 160 + +// Initializes the dedicated UART and its background RX-framing task. Call once from app_main, +// after nvs/event loop init. `on_cam_tx` is invoked (from the RX task's context - keep it fast, +// it blocks the next frame's parsing) whenever a complete, checksummed SERIAL_MSG_CAM_TX frame +// arrives from the phone. +typedef void (*serial_link_cam_tx_cb_t)(const uint8_t *cam_uper, int cam_len); +void serial_link_init(serial_link_cam_tx_cb_t on_cam_tx); + +// Sends a SERIAL_MSG_CAM_RX frame to the phone: rssi + the CAM UPER bytes gn_unwrap.c extracted +// from an over-the-air frame. Returns true if the frame was written to the UART (not an +// end-to-end ack - the phone may still drop it, e.g. serial buffer overrun). +bool serial_link_send_cam_rx(int8_t rssi, const uint8_t *cam_uper, int cam_len); + +// Sends a 1-byte SERIAL_MSG_STATUS heartbeat frame. +bool serial_link_send_status(uint8_t status); + +#endif diff --git a/obu-firmware/main/tx_custom.c b/obu-firmware/main/tx_custom.c new file mode 100644 index 0000000..24c8bd1 --- /dev/null +++ b/obu-firmware/main/tx_custom.c @@ -0,0 +1,196 @@ +// Copied verbatim (no logic changes) from opentrafficmap/its-g5-receiver-firmware_txenabled, +// main/tx_custom.c (https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled), +// same authors as the receiver firmware (V2X2MAP) already used on the RX side of this +// project. Same chip (ESP32-C5), same class of problem (getting a raw 802.11 frame past +// esp_wifi_80211_tx()'s built-in frame-type gate), and a proven-different approach from our +// own abandoned main/wifi_patches.c attempt - see docs/04-transmit-setup.md for why that one +// didn't work and why this one is expected to. +// +// WHAT THIS DOES DIFFERENTLY FROM esp_wifi_80211_tx(): it doesn't call the public API at all. +// It reaches one layer deeper into the closed WiFi driver - ic_ebuf_alloc() (allocates an +// internal driver buffer), ieee80211_post_hmac_tx() (submits that buffer straight to the MAC +// for transmission) - and never goes through the code path that contains the QoS-frame-type +// sanity check that was rejecting us. Notice line "esp_err_t result = 0;//ieee80211_raw_frame_ +// sanity_check(...)" below: the upstream authors don't override that check (like our old +// wifi_patches.c tried to), they just never call the function that calls it. +// +// REAL RISK, carried over from upstream, not introduced by us: this skips ALL frame-type and +// sanity validation, same caveat as our old override attempt. A malformed frame from a bug +// elsewhere in our own code could behave worse (silent corruption, crash) than a clean +// rejection. +// +// UNVERIFIED FOR OUR EXACT TOOLCHAIN - things worth checking before trusting this blindly: +// 1. The symbols this depends on (ieee80211_post_hmac_tx, ic_ebuf_alloc, ic_get_default_sched, +// g_osi_funcs_p, g_wifi_global_lock) are undocumented/internal. We confirmed via `nm` +// earlier that ieee80211_raw_frame_sanity_check exists in OUR esp32c5/IDF libnet80211.a - +// we have NOT yet independently confirmed these other four/five symbols exist in our +// exact ESP-IDF version (as opposed to whatever version the upstream repo's pinned +// esp-idf submodule uses). If the linker can't find one of these, that's the first thing +// to check - see docs/04-transmit-setup.md for the nm command. +// 2. x_eb_txdesc_t / x_middle_data_t / x_ebuf_t below are REVERSE-ENGINEERED struct layouts +// of closed-source internal WiFi driver types, pinned only by a sizeof() static_assert - +// that assert catches a total-size mismatch but NOT a field-order/semantic mismatch if a +// different IDF version shuffled internal fields while keeping the same total size. If our +// ESP-IDF version differs meaningfully from upstream's, this could compile and link fine +// but write to the wrong offsets internally. Worth checking `idf.py --version` against +// whatever esp-idf commit opentrafficmap's repo has pinned as a submodule, as a rough +// compatibility signal (not a guarantee either way). +#include "esp_private/wifi_os_adapter.h" +#include "esp_wifi.h" + +#include "tx_custom.h" + +esp_err_t ieee80211_raw_frame_sanity_check(wifi_interface_t ifx, const void *buffer, int32_t len, bool en_sys_seq); +esp_err_t ieee80211_post_hmac_tx(void *ebuf); +void *ic_ebuf_alloc(const void *packet, uint32_t unknown, uint32_t len); +void *ic_get_default_sched(void); + +extern wifi_osi_funcs_t *g_osi_funcs_p; +extern void *g_wifi_global_lock; + +typedef struct x_eb_txdesc +{ + uint32_t flags; + uint32_t field_4; + uint32_t field_8; + uint8_t rate; + uint8_t field_d; + uint8_t field_e; + uint8_t field_f; + uint32_t field_10; + uint32_t field_14; + uint32_t timestamp; + void* sched; + uint32_t field_20; + uint32_t field_24; + uint32_t field_28; + union { + uint32_t field_2c_32; + struct { + uint8_t field_2c; + uint8_t field_2d; + uint8_t field_2e; + uint8_t field_2f; + }; + }; + union { + uint32_t field_30_32; + struct { + uint8_t field_30; + uint8_t field_31; + uint8_t field_32; + uint8_t field_33; + }; + }; + uint32_t field_34; + uint32_t field_38; + uint32_t field_3c; + uint32_t field_40; + uint32_t field_44; +} x_eb_txdesc_t; +static_assert(sizeof(x_eb_txdesc_t) == 0x48); + +typedef struct x_middle_data +{ + uint32_t field_40; + uint8_t* buf; + uint32_t field_48; + uint32_t field_4c; +} x_middle_data_t; +static_assert(sizeof(x_middle_data_t) == 0x10); + +typedef struct x_ebuf +{ + uint32_t field_0; + x_middle_data_t* ds_head; + x_middle_data_t* ds_tail; + uint16_t field_c; + uint16_t field_e; + uint32_t extra_data_start; + uint16_t header_length; + uint32_t data_length; + uint16_t field_1c; + uint8_t alloc_type; + uint8_t field_1f; + uint32_t field_20; + uint8_t field_24; + uint8_t field_25; + uint8_t field_26; + uint8_t field_27; + uint32_t field_28; + uint8_t field_2c; + uint32_t field_30; + uint32_t next_free; + x_eb_txdesc_t* txdesc; + uint16_t field_3c; + uint8_t field_3e; + uint8_t field_3f; +} x_ebuf_t; +static_assert(sizeof(x_ebuf_t) == 0x40); + +esp_err_t esp_wifi_80211_tx_custom(wifi_interface_t ifx, const void *buffer, int32_t len, bool en_sys_seq, wifi_tx_rate_config_t *tx_rate_config, wifi_band_t band, wifi_bandwidth_t bw) +{ + esp_err_t result = 0;//ieee80211_raw_frame_sanity_check(ifx, buffer, len, en_sys_seq); + + if (!result) + { + g_osi_funcs_p->_mutex_lock(g_wifi_global_lock); + x_ebuf_t* eb = ic_ebuf_alloc(buffer, 1, len); + + if (eb) + { + //eb->data_length = len - 0x1a; + eb->data_length = 0; + x_eb_txdesc_t *txdesc_1 = eb->txdesc; + //eb->header_length = 0x1a; + eb->header_length = len; + txdesc_1->flags |= 0x4000; + txdesc_1->sched = ic_get_default_sched(); + wifi_phy_rate_t rate = tx_rate_config->rate; + x_eb_txdesc_t *txdesc = eb->txdesc; + + if (rate) + txdesc->rate = (char)rate; + else if (band != WIFI_BAND_5G) + txdesc->rate = 0; + else + txdesc->rate = (char)WIFI_PHY_RATE_6M; + + wifi_phy_mode_t phymode = tx_rate_config->phymode; + + if (phymode == WIFI_PHY_MODE_HE20) + { + txdesc->flags |= 0x80000000; + txdesc->field_2f = + (char)((((uint32_t)tx_rate_config->ersu + 6) & 0xf) << 3) + | (txdesc->field_2f & 0x87); + + if ((uint32_t)tx_rate_config->dcm) + txdesc->field_31 |= 0x80; + } + else if (phymode == WIFI_PHY_MODE_VHT20) + txdesc->flags |= 0x1000000; + + // No idea if this is correct, but this is what the original code does... + uint32_t bw_is_bw40 = bw == WIFI_BW40; + txdesc->field_8 = (bw_is_bw40 << 0xf) | (txdesc->field_8 & 0xffff7fff); + + if (en_sys_seq) + txdesc->flags |= 1; + + txdesc->field_10 = + (txdesc->field_10 & 0xfff3ffff) | ((ifx & WIFI_IF_MAX) << 0x12); + txdesc->field_14 = 0x100; + + ieee80211_post_hmac_tx(eb); + g_osi_funcs_p->_mutex_unlock(g_wifi_global_lock); + } + else + { + result = ESP_ERR_NO_MEM; + g_osi_funcs_p->_mutex_unlock(g_wifi_global_lock); + } + } + + return result; +} diff --git a/obu-firmware/main/tx_custom.h b/obu-firmware/main/tx_custom.h new file mode 100644 index 0000000..c310401 --- /dev/null +++ b/obu-firmware/main/tx_custom.h @@ -0,0 +1,15 @@ +// Copied from opentrafficmap/its-g5-receiver-firmware_txenabled, main/tx_custom.h. +// See tx_custom.c for what this does and why we pulled it in. +#pragma once + +#include "esp_wifi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +esp_err_t esp_wifi_80211_tx_custom(wifi_interface_t ifx, const void *buffer, int32_t len, bool en_sys_seq, wifi_tx_rate_config_t *tx_rate_config, wifi_band_t band, wifi_bandwidth_t bw); + +#ifdef __cplusplus +} +#endif diff --git a/obu-firmware/main/wifi_patches.c b/obu-firmware/main/wifi_patches.c new file mode 100644 index 0000000..9c317db --- /dev/null +++ b/obu-firmware/main/wifi_patches.c @@ -0,0 +1,49 @@ +#include + +// RETIRED - no longer built (removed from main/CMakeLists.txt SRCS), kept only +// for history. Confirmed not to work: linked cleanly with -Wl,-zmuldefs but +// the QoS-frame rejection persisted identically. Also turned out to be based +// on the wrong function signature - the real ieee80211_raw_frame_sanity_check +// takes (wifi_interface_t ifx, const void *buffer, int32_t len, bool +// en_sys_seq), confirmed from opentrafficmap/its-g5-receiver-firmware_txenabled's +// main/tx_custom.c, not the 3x int32_t guessed below. Superseded by +// tx_custom.c, which bypasses esp_wifi_80211_tx() (and the function that +// calls this check) entirely instead of trying to neutralize the check. +// See docs/04-transmit-setup.md. + +// Overrides a function inside the closed-source WiFi library that gates +// which raw 802.11 frame types esp_wifi_80211_tx() will accept. By default +// it only allows beacon/probe-request/probe-response/action and non-QoS +// data frames - it explicitly rejects QoS Data (subtype 8), which is what +// real ITS-G5/802.11p hardware actually transmits and expects. +// +// This is the same technique used by ESP32 WiFi-security tools (deauther/ +// injection projects) to unlock raw frame injection: define a function with +// the exact same name as the library's gate, and link with -Wl,-zmuldefs +// (see CMakeLists.txt) so the linker accepts having two definitions of the +// same symbol instead of erroring with "multiple definition of +// `ieee80211_raw_frame_sanity_check'" - and takes this one instead of the +// library's. +// +// Confirmed present for THIS target/IDF version: `nm` on +// components/esp_wifi/lib/esp32c5/libnet80211.a (IDF v5.5.4) shows +// `ieee80211_raw_frame_sanity_check` as a normal (non-weak) global text +// symbol in ieee80211_node.o. The exact argument count/meaning is +// reverse-engineered from community ESP32 (Xtensa) deauther tools, not +// confirmed byte-for-byte against esp32c5's actual implementation - if +// frames still get rejected, or this crashes, the real signature may take +// different arguments than assumed here. +// +// Real risk, not just an inconvenience: this disables ALL sanity checking +// on raw frames going through esp_wifi_80211_tx(), not just the QoS-type +// gate. Whatever else that check validates (frame length bounds, etc.) is +// now unchecked. Malformed frames from a bug elsewhere in this codebase +// could behave worse (silent corruption, crash) than they would have with +// the check in place, where they'd have just been rejected cleanly. +int ieee80211_raw_frame_sanity_check(int32_t arg1, int32_t arg2, int32_t arg3) +{ + (void)arg1; + (void)arg2; + (void)arg3; + return 0; // 0 = "frame is sane" - always pass +} diff --git a/obu-firmware/sdkconfig b/obu-firmware/sdkconfig new file mode 100644 index 0000000..30cb5ef --- /dev/null +++ b/obu-firmware/sdkconfig @@ -0,0 +1,2509 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.4 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_ANA_CMPR_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_ETM_SUPPORTED=y +CONFIG_SOC_PARLIO_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_LP_CORE_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_RSA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_ECC_SUPPORTED=y +CONFIG_SOC_ECC_EXTENDED_MODES_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_IEEE802154_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_APM_SUPPORTED=y +CONFIG_SOC_PMU_SUPPORTED=y +CONFIG_SOC_PAU_SUPPORTED=y +CONFIG_SOC_LP_TIMER_SUPPORTED=y +CONFIG_SOC_LP_AON_SUPPORTED=y +CONFIG_SOC_LP_PERIPHERALS_SUPPORTED=y +CONFIG_SOC_LP_I2C_SUPPORTED=y +CONFIG_SOC_ULP_LP_UART_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_ASSIST_DEBUG_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_ECDSA_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_KEY_MANAGER_SUPPORTED=y +CONFIG_SOC_HUK_SUPPORTED=y +CONFIG_SOC_MODEM_CLOCK_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_CLOCK_TREE_MANAGEMENT_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_BITSCRAMBLER_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_48M=y +CONFIG_SOC_XTAL_CLOCK_PATH_DEPENDS_ON_TOP_DOMAIN=y +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_AES_SUPPORT_PSEUDO_ROUND_FUNCTION=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=1 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=6 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=1 +CONFIG_SOC_ADC_PATT_LEN_MAX=8 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_CALIB_CHAN_COMPENS_SUPPORTED=y +CONFIG_SOC_ADC_TEMPERATURE_SHARE_INTR=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CPU_CORES_NUM=1 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y +CONFIG_SOC_CPU_SUPPORT_WFE=y +CONFIG_SOC_INT_CLIC_SUPPORTED=y +CONFIG_SOC_INT_HW_NESTED_SUPPORTED=y +CONFIG_SOC_BRANCH_PREDICTOR_SUPPORTED=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=3 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=3 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x100 +CONFIG_SOC_CPU_HAS_PMA=y +CONFIG_SOC_CPU_IDRAM_SPLIT_USING_PMP=y +CONFIG_SOC_CPU_PMP_REGION_GRANULARITY=128 +CONFIG_SOC_CPU_HAS_LOCKUP_RESET=y +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=3072 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_DMA_CAN_ACCESS_FLASH=y +CONFIG_SOC_AHB_GDMA_VERSION=2 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=3 +CONFIG_SOC_GDMA_SUPPORT_ETM=y +CONFIG_SOC_GDMA_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GDMA_EXT_MEM_ENC_ALIGNMENT=16 +CONFIG_SOC_ETM_GROUPS=1 +CONFIG_SOC_ETM_CHANNELS_PER_GROUP=50 +CONFIG_SOC_ETM_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=29 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FLEX_GLITCH_FILTER_NUM=8 +CONFIG_SOC_GPIO_SUPPORT_PIN_HYS_FILTER=y +CONFIG_SOC_GPIO_SUPPORT_ETM=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_GPIO_IN_RANGE_MAX=28 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=28 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT=7 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0000000001FFFF80 +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_SUPPORT_HOLD_SINGLE_IO_IN_DSLP=y +CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX=y +CONFIG_SOC_CLOCKOUT_HAS_SOURCE_GATE=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_RTCIO_PIN_COUNT=7 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_RTCIO_EDGE_WAKE_SUPPORTED=y +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y +CONFIG_SOC_ANA_CMPR_NUM=1 +CONFIG_SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE=y +CONFIG_SOC_ANA_CMPR_SUPPORT_ETM=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=1 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_FSM_RST=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH=y +CONFIG_SOC_I2C_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LP_I2C_NUM=1 +CONFIG_SOC_LP_I2C_FIFO_LEN=16 +CONFIG_SOC_I2S_NUM=1 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_ETM=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F240M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_TX_SYNC_CNT=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_I2S_TDM_FULL_DATA_WIDTH=y +CONFIG_SOC_I2S_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LEDC_SUPPORT_PLL_DIV_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=6 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX=16 +CONFIG_SOC_LEDC_FADE_PARAMS_BIT_WIDTH=10 +CONFIG_SOC_LEDC_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_DI_VADDR_SHARED=y +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE=y +CONFIG_SOC_PCNT_SUPPORT_CLEAR_SIGNAL=y +CONFIG_SOC_PCNT_SUPPORT_STEP_NOTIFY=y +CONFIG_SOC_PCNT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=4 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MCPWM_GROUPS=1 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_EVENT_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MCPWM_SUPPORT_ETM=y +CONFIG_SOC_MCPWM_SUPPORT_EVENT_COMPARATOR=y +CONFIG_SOC_MCPWM_CAPTURE_CLK_FROM_GROUP=y +CONFIG_SOC_MCPWM_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_PARLIO_GROUPS=1 +CONFIG_SOC_PARLIO_TX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_RX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH=8 +CONFIG_SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH=8 +CONFIG_SOC_PARLIO_TX_CLK_SUPPORT_GATING=y +CONFIG_SOC_PARLIO_RX_CLK_SUPPORT_GATING=y +CONFIG_SOC_PARLIO_RX_CLK_SUPPORT_OUTPUT=y +CONFIG_SOC_PARLIO_TRANS_BIT_ALIGN=y +CONFIG_SOC_PARLIO_TX_SUPPORT_LOOP_TRANSMISSION=y +CONFIG_SOC_PARLIO_TX_SUPPORT_EOF_FROM_DMA=y +CONFIG_SOC_PARLIO_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_PARLIO_SUPPORT_SPI_LCD=y +CONFIG_SOC_PARLIO_SUPPORT_I80_LCD=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=3072 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_ECC_CONSTANT_TIME_POINT_MUL=y +CONFIG_SOC_ECC_SUPPORT_CURVE_P384=y +CONFIG_SOC_ECDSA_SUPPORT_EXPORT_PUBKEY=y +CONFIG_SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE=y +CONFIG_SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP=y +CONFIG_SOC_ECDSA_SUPPORT_CURVE_P384=y +CONFIG_SOC_ECDSA_SUPPORT_CURVE_SPECIFIC_KEY_PURPOSES=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=4 +CONFIG_SOC_SDM_CLK_SUPPORT_PLL_F80M=y +CONFIG_SOC_SDM_CLK_SUPPORT_XTAL=y +CONFIG_SOC_SPI_PERIPH_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_SUPPORT_CLK_PLL_F160M=y +CONFIG_SOC_SPI_SUPPORT_CLK_RC_FAST=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_IDLE_INTR=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_CHECK_SUS=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL=y +CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR=y +CONFIG_SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED=y +CONFIG_SOC_SPI_MEM_FLASH_SUPPORT_HPM=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_SUPPORT_RC_FAST=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_SYSTIMER_SUPPORT_ETM=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=1 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_RC_FAST=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 +CONFIG_SOC_TIMER_SUPPORT_ETM=y +CONFIG_SOC_TIMER_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MWDT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_TWAI_CONTROLLER_NUM=2 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=3 +CONFIG_SOC_TWAI_RANGE_FILTER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=1 +CONFIG_SOC_TWAI_BRP_MAX=255 +CONFIG_SOC_TWAI_CLK_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_TWAI_SUPPORT_FD=y +CONFIG_SOC_TWAI_SUPPORT_TIMESTAMP=y +CONFIG_SOC_EFUSE_DIS_PAD_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_ECDSA_KEY=y +CONFIG_SOC_EFUSE_ECDSA_KEY_P192=y +CONFIG_SOC_EFUSE_ECDSA_KEY_P384=y +CONFIG_SOC_HUK_MEM_NEEDS_RECHARGE=y +CONFIG_SOC_KEY_MANAGER_SUPPORT_KEY_DEPLOYMENT=y +CONFIG_SOC_KEY_MANAGER_ECDSA_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_128=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_256=y +CONFIG_SOC_KEY_MANAGER_HMAC_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_DS_KEY_DEPLOY=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_SECURE_BOOT_V2_ECC=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND=y +CONFIG_SOC_PSRAM_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_RECOVERY_BOOTLOADER_SUPPORTED=y +CONFIG_SOC_BOOTLOADER_ANTI_ROLLBACK_SUPPORTED=y +CONFIG_SOC_APM_CTRL_FILTER_SUPPORTED=y +CONFIG_SOC_APM_LP_APM0_SUPPORTED=y +CONFIG_SOC_APM_CPU_APM_SUPPORTED=y +CONFIG_SOC_APM_SUPPORT_LP_TEE_CTRL=y +CONFIG_SOC_APM_SUPPORT_CTRL_CFG_LOCK=y +CONFIG_SOC_APM_SUPPORT_TEE_PERI_ACCESS_CTRL=y +CONFIG_SOC_CRYPTO_DPA_PROTECTION_SUPPORTED=y +CONFIG_SOC_RNG_BUF_CHAIN_ENTROPY_SOURCE=y +CONFIG_SOC_RNG_RTC_TIMER_ENTROPY_SOURCE=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=2 +CONFIG_SOC_UART_LP_NUM=1 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_LP_UART_FIFO_LEN=16 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_PLL_F80M_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_HAS_LP_UART=y +CONFIG_SOC_UART_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_WAKEUP_CHARS_SEQ_MAX_LEN=5 +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_FIFO_THRESH_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_START_BIT_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_CHAR_SEQ_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_ADVANCE=y +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_RTC_MEM_SUPPORT_SPEED_MODE_SWITCH=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BEACON_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_PM_SUPPORT_XTAL32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_TOP_PD=y +CONFIG_SOC_PM_SUPPORT_HP_AON_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_PMU_MODEM_STATE=y +CONFIG_SOC_PM_SUPPORT_PMU_CLK_ICG=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_SW=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_REGDMA=y +CONFIG_SOC_EXT_MEM_CACHE_TAG_IN_CPU_DOMAIN=y +CONFIG_SOC_PM_PAU_LINK_NUM=5 +CONFIG_SOC_PM_PAU_REGDMA_LINK_CONFIGURABLE=y +CONFIG_SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC=4 +CONFIG_SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY=y +CONFIG_SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED=y +CONFIG_SOC_PM_RETENTION_MODULE_NUM=32 +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_RNG_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_OSC_SLOW_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_RCC_IS_INDEPENDENT=y +CONFIG_SOC_CLK_ANA_I2C_MST_HAS_ROOT_GATE=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y +CONFIG_SOC_TEMPERATURE_SENSOR_INTR_SUPPORT=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_TEMPERATURE_SENSOR_UNDER_PD_TOP_DOMAIN=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_TXOP_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_HE_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_5G=y +CONFIG_SOC_WIFI_MAC_VERSION_NUM=3 +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_ESP_NIMBLE_CONTROLLER=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLE_POWER_CONTROL_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_BLE_CTE_SUPPORTED=y +CONFIG_SOC_BLE_SUBRATE_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_WITH_RESPONSE=y +CONFIG_SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_LP_CORE_SINGLE_INTERRUPT_VECTOR=y +CONFIG_SOC_LP_CORE_SUPPORT_ETM=y +CONFIG_SOC_LP_CORE_SUPPORT_STORE_LOAD_EXCEPTIONS=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_ENV_BRINGUP=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_RISCV=y +CONFIG_IDF_TARGET_ARCH="riscv" +CONFIG_IDF_TARGET="esp32c5" +CONFIG_IDF_INIT_VERSION="5.5.4" +CONFIG_IDF_TARGET_ESP32C5=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0017 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# CONFIG_BOOTLOADER_RECOVERY_ENABLE is not set +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x2000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_ECC_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=3 +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_RVFPLIB=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_HAS_HAL_SYSTIMER=y +CONFIG_ESP_ROM_SYSTIMER_INIT_PATCH=y +CONFIG_ESP_ROM_HAS_HEAP_TLSF=y +CONFIG_ESP_ROM_TLSF_CHECK_PATCH=y +CONFIG_ESP_ROM_MULTI_HEAP_WALK_PATCH=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_WITHOUT_REGI2C=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_WDT_INIT_PATCH=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CLIC_INT_THRESH_PATCH=y +CONFIG_ESP_ROM_HAS_SUBOPTIMAL_NEWLIB_ON_MISALIGNED_MEMORY=y +CONFIG_ESP_ROM_DELAY_US_PATCH=y +CONFIG_ESP_ROM_SUPPORT_SECURE_BOOT_FAST_WAKEUP=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# ESP-TEE (Trusted Execution Environment) +# +# CONFIG_SECURE_ENABLE_TEE is not set +CONFIG_SECURE_TEE_LOG_LEVEL=0 +# end of ESP-TEE (Trusted Execution Environment) + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_NO_STUB=y +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +# CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_RVFPLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set + +# +# Common Options +# + +# +# BLE Log +# +# CONFIG_BLE_LOG_ENABLED is not set +# end of BLE Log + +# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set +# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set +# CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED is not set +# end of Common Options +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ESP_COEX_POWER_MANAGEMENT is not set +# CONFIG_ESP_COEX_GPIO_DEBUG is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:Analog Comparator Configurations +# +CONFIG_ANA_CMPR_ISR_HANDLER_IN_IRAM=y +# CONFIG_ANA_CMPR_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ANA_CMPR_ISR_CACHE_SAFE is not set +CONFIG_ANA_CMPR_OBJ_CACHE_SAFE=y +# CONFIG_ANA_CMPR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Analog Comparator Configurations + +# +# ESP-Driver:BitScrambler Configurations +# +# CONFIG_BITSCRAMBLER_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:BitScrambler Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:Parallel IO Configurations +# +CONFIG_PARLIO_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_PARLIO_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_PARLIO_TX_ISR_CACHE_SAFE is not set +# CONFIG_PARLIO_RX_ISR_CACHE_SAFE is not set +CONFIG_PARLIO_OBJ_CACHE_SAFE=y +# CONFIG_PARLIO_ENABLE_DEBUG_LOG is not set +# CONFIG_PARLIO_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Parallel IO Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# CONFIG_TEMP_SENSOR_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_IO_FUNC_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HID +# +CONFIG_ESPHID_TASK_SIZE_BT=2048 +CONFIG_ESPHID_TASK_SIZE_BLE=4096 +# end of ESP HID + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# +CONFIG_ESP_HW_SUPPORT_FUNC_IN_IRAM=y + +# +# Chip revision +# +CONFIG_ESP32C5_REV_MIN_100=y +# CONFIG_ESP32C5_REV_MIN_102 is not set +CONFIG_ESP32C5_REV_MIN_FULL=100 +CONFIG_ESP_REV_MIN_FULL=100 + +# +# Maximum Supported ESP32-C5 Revision (Rev v1.99) +# +CONFIG_ESP32C5_REV_MAX_FULL=199 +CONFIG_ESP_REV_MAX_FULL=199 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 + +# +# Maximum Supported ESP32-C5 eFuse Block Revision (eFuse Block Rev v0.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_IEEE802154=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=0 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +CONFIG_RTC_FAST_CLK_SRC_RC_FAST=y +# CONFIG_RTC_FAST_CLK_SRC_XTAL is not set +CONFIG_RTC_CLK_FUNC_IN_IRAM=y +CONFIG_RTC_TIME_FUNC_IN_IRAM=y +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# ETM Configuration +# +# CONFIG_ETM_ENABLE_DEBUG_LOG is not set +# end of ETM Configuration + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_AUTO=y +CONFIG_XTAL_FREQ=0 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_CLK_RC32K_NOT_TO_USE=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-Driver:LCD Controller Configurations +# +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:LCD Controller Configurations + +# +# ESP-MM: Memory Management Configurations +# +# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set +# end of ESP-MM: Memory Management Configurations + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# CONFIG_ESP_PHY_RECORD_USED_TIME is not set +CONFIG_ESP_PHY_IRAM_OPT=y +# CONFIG_ESP_PHY_DEBUG is not set +# end of PHY + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_SLP_DEFAULT_PARAMS_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +# CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is not set +CONFIG_PM_WORKAROUND_FREQ_LIMIT_ENABLED=y +# end of Power Management + +# +# ESP PSRAM +# +# CONFIG_SPIRAM is not set +# end of ESP PSRAM + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# + +# +# Crypto DPA Protection +# +CONFIG_ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP=y +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW=y +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM is not set +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH is not set +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL=1 +# end of Crypto DPA Protection + +# CONFIG_ESP_CRYPTO_FORCE_ECC_CONSTANT_TIME_POINT_MUL is not set +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Cache config +# +CONFIG_CACHE_L1_CACHE_SIZE=0x8000 +CONFIG_CACHE_L1_CACHE_LINE_SIZE=32 +# end of Cache config + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y +CONFIG_ESP_SYSTEM_NO_BACKTRACE=y +# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set +# CONFIG_ESP_SYSTEM_USE_FRAME_POINTER is not set + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT=y +# CONFIG_ESP_SYSTEM_PMP_LP_CORE_RESERVE_MEM_EXECUTABLE is not set +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_SYSTEM_HW_STACK_GUARD=y +CONFIG_ESP_SYSTEM_HW_PC_RECORD=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_ESP_WIFI_SLP_IRAM_OPT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_TX_STATS is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS is not set +CONFIG_ESP_WIFI_TX_HETB_QUEUE_NUM=3 +# CONFIG_ESP_WIFI_ENABLE_DUMP_HESIGB is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_MU_CFO is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_NDPA is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_BFRP is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# CONFIG_ESP_WIFI_WPS_RECONNECT_ON_FAIL is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_USE_STRFUNC_NONE=y +# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set +# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# CONFIG_FATFS_USE_DYN_BUFFERS is not set + +# +# File system free space calculation behavior +# +CONFIG_FATFS_DONT_TRUST_FREE_CLUSTER_CNT=0 +CONFIG_FATFS_DONT_TRUST_LAST_ALLOC=0 +# end of File system free space calculation behavior +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=1 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SYSTIMER_USE_ROM_IMPL=y +CONFIG_HAL_WDT_USE_ROM_IMPL=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +CONFIG_HEAP_TLSF_USE_ROM_IMPL=y +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +CONFIG_IEEE802154_RX_BUFFER_SIZE=20 +# CONFIG_IEEE802154_CCA_CARRIER is not set +CONFIG_IEEE802154_CCA_ED=y +# CONFIG_IEEE802154_CCA_CARRIER_OR_ED is not set +# CONFIG_IEEE802154_CCA_CARRIER_AND_ED is not set +CONFIG_IEEE802154_CCA_MODE=1 +CONFIG_IEEE802154_CCA_THRESHOLD=-75 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 +# CONFIG_IEEE802154_MULTI_PAN_ENABLE is not set +CONFIG_IEEE802154_INTERFACE_NUM=1 +CONFIG_IEEE802154_TIMING_OPTIMIZATION=y +# CONFIG_IEEE802154_DEBUG is not set +# end of IEEE 802.15.4 + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set +# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=69 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +CONFIG_LWIP_DHCPS_ADD_DNS=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 +CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 +CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 +CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 +# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set +# CONFIG_LWIP_PPP_SUPPORT is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_HOST_IP=1 +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set +# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set +CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +# CONFIG_MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC is not set +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_HARDWARE_ECC=y +CONFIG_MBEDTLS_ECC_OTHER_CURVES_SOFT_FALLBACK=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN is not set +CONFIG_MBEDTLS_HARDWARE_ECDSA_VERIFY=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +CONFIG_MBEDTLS_FS_IO=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +# CONFIG_LIBC_PICOLIBC is not set +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set +# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set +CONFIG_LIBC_STDIN_LINE_ENDING_CR=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +CONFIG_LIBC_OPTIMIZED_MISALIGNED_ACCESS=y +CONFIG_LIBC_ASSERT_BUFFER_SIZE=200 +# end of LibC + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# OpenThread Spinel +# +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# end of OpenThread Spinel + +# CONFIG_OPENTHREAD_DEBUG is not set +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +CONFIG_SPI_FLASH_SUSPEND_TRS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y +# CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP is not set +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP is not set +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) + +CONFIG_VFS_INITIALIZE_DEV_NULL=y +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_SW_COEXIST_ENABLE=y +CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y +CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ANA_CMPR_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +# CONFIG_OTA_ALLOW_HTTP is not set +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5760 +CONFIG_TCP_WND_DEFAULT=5760 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/obu-firmware/sdkconfig.defaults b/obu-firmware/sdkconfig.defaults new file mode 100644 index 0000000..164b924 --- /dev/null +++ b/obu-firmware/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_IDF_TARGET="esp32c5" diff --git a/obu-firmware/sdkconfig.old b/obu-firmware/sdkconfig.old new file mode 100644 index 0000000..30cb5ef --- /dev/null +++ b/obu-firmware/sdkconfig.old @@ -0,0 +1,2509 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.4 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_ANA_CMPR_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_ETM_SUPPORTED=y +CONFIG_SOC_PARLIO_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_LP_CORE_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_RSA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_ECC_SUPPORTED=y +CONFIG_SOC_ECC_EXTENDED_MODES_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_IEEE802154_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_APM_SUPPORTED=y +CONFIG_SOC_PMU_SUPPORTED=y +CONFIG_SOC_PAU_SUPPORTED=y +CONFIG_SOC_LP_TIMER_SUPPORTED=y +CONFIG_SOC_LP_AON_SUPPORTED=y +CONFIG_SOC_LP_PERIPHERALS_SUPPORTED=y +CONFIG_SOC_LP_I2C_SUPPORTED=y +CONFIG_SOC_ULP_LP_UART_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_ASSIST_DEBUG_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_ECDSA_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_KEY_MANAGER_SUPPORTED=y +CONFIG_SOC_HUK_SUPPORTED=y +CONFIG_SOC_MODEM_CLOCK_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_CLOCK_TREE_MANAGEMENT_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_BITSCRAMBLER_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_48M=y +CONFIG_SOC_XTAL_CLOCK_PATH_DEPENDS_ON_TOP_DOMAIN=y +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_AES_SUPPORT_PSEUDO_ROUND_FUNCTION=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=1 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=6 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=1 +CONFIG_SOC_ADC_PATT_LEN_MAX=8 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_CALIB_CHAN_COMPENS_SUPPORTED=y +CONFIG_SOC_ADC_TEMPERATURE_SHARE_INTR=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CPU_CORES_NUM=1 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y +CONFIG_SOC_CPU_SUPPORT_WFE=y +CONFIG_SOC_INT_CLIC_SUPPORTED=y +CONFIG_SOC_INT_HW_NESTED_SUPPORTED=y +CONFIG_SOC_BRANCH_PREDICTOR_SUPPORTED=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=3 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=3 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x100 +CONFIG_SOC_CPU_HAS_PMA=y +CONFIG_SOC_CPU_IDRAM_SPLIT_USING_PMP=y +CONFIG_SOC_CPU_PMP_REGION_GRANULARITY=128 +CONFIG_SOC_CPU_HAS_LOCKUP_RESET=y +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=3072 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_DMA_CAN_ACCESS_FLASH=y +CONFIG_SOC_AHB_GDMA_VERSION=2 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=3 +CONFIG_SOC_GDMA_SUPPORT_ETM=y +CONFIG_SOC_GDMA_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GDMA_EXT_MEM_ENC_ALIGNMENT=16 +CONFIG_SOC_ETM_GROUPS=1 +CONFIG_SOC_ETM_CHANNELS_PER_GROUP=50 +CONFIG_SOC_ETM_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=29 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FLEX_GLITCH_FILTER_NUM=8 +CONFIG_SOC_GPIO_SUPPORT_PIN_HYS_FILTER=y +CONFIG_SOC_GPIO_SUPPORT_ETM=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_GPIO_IN_RANGE_MAX=28 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=28 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_SUPPORTED_PIN_CNT=7 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0000000001FFFF80 +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_SUPPORT_HOLD_SINGLE_IO_IN_DSLP=y +CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX=y +CONFIG_SOC_CLOCKOUT_HAS_SOURCE_GATE=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_RTCIO_PIN_COUNT=7 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_RTCIO_EDGE_WAKE_SUPPORTED=y +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y +CONFIG_SOC_ANA_CMPR_NUM=1 +CONFIG_SOC_ANA_CMPR_CAN_DISTINGUISH_EDGE=y +CONFIG_SOC_ANA_CMPR_SUPPORT_ETM=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=1 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_FSM_RST=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_SLAVE_UNMATCH=y +CONFIG_SOC_I2C_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LP_I2C_NUM=1 +CONFIG_SOC_LP_I2C_FIFO_LEN=16 +CONFIG_SOC_I2S_NUM=1 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_ETM=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F240M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_TX_SYNC_CNT=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_I2S_TDM_FULL_DATA_WIDTH=y +CONFIG_SOC_I2S_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_LEDC_SUPPORT_PLL_DIV_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=6 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED=y +CONFIG_SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX=16 +CONFIG_SOC_LEDC_FADE_PARAMS_BIT_WIDTH=10 +CONFIG_SOC_LEDC_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_DI_VADDR_SHARED=y +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_PCNT_SUPPORT_RUNTIME_THRES_UPDATE=y +CONFIG_SOC_PCNT_SUPPORT_CLEAR_SIGNAL=y +CONFIG_SOC_PCNT_SUPPORT_STEP_NOTIFY=y +CONFIG_SOC_PCNT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=4 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MCPWM_GROUPS=1 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_EVENT_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MCPWM_SUPPORT_ETM=y +CONFIG_SOC_MCPWM_SUPPORT_EVENT_COMPARATOR=y +CONFIG_SOC_MCPWM_CAPTURE_CLK_FROM_GROUP=y +CONFIG_SOC_MCPWM_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_PARLIO_GROUPS=1 +CONFIG_SOC_PARLIO_TX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_RX_UNITS_PER_GROUP=1 +CONFIG_SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH=8 +CONFIG_SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH=8 +CONFIG_SOC_PARLIO_TX_CLK_SUPPORT_GATING=y +CONFIG_SOC_PARLIO_RX_CLK_SUPPORT_GATING=y +CONFIG_SOC_PARLIO_RX_CLK_SUPPORT_OUTPUT=y +CONFIG_SOC_PARLIO_TRANS_BIT_ALIGN=y +CONFIG_SOC_PARLIO_TX_SUPPORT_LOOP_TRANSMISSION=y +CONFIG_SOC_PARLIO_TX_SUPPORT_EOF_FROM_DMA=y +CONFIG_SOC_PARLIO_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_PARLIO_SUPPORT_SPI_LCD=y +CONFIG_SOC_PARLIO_SUPPORT_I80_LCD=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=3072 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_ECC_CONSTANT_TIME_POINT_MUL=y +CONFIG_SOC_ECC_SUPPORT_CURVE_P384=y +CONFIG_SOC_ECDSA_SUPPORT_EXPORT_PUBKEY=y +CONFIG_SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE=y +CONFIG_SOC_ECDSA_SUPPORT_HW_DETERMINISTIC_LOOP=y +CONFIG_SOC_ECDSA_SUPPORT_CURVE_P384=y +CONFIG_SOC_ECDSA_SUPPORT_CURVE_SPECIFIC_KEY_PURPOSES=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=4 +CONFIG_SOC_SDM_CLK_SUPPORT_PLL_F80M=y +CONFIG_SOC_SDM_CLK_SUPPORT_XTAL=y +CONFIG_SOC_SPI_PERIPH_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_SUPPORT_CLK_PLL_F160M=y +CONFIG_SOC_SPI_SUPPORT_CLK_RC_FAST=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_IDLE_INTR=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_CHECK_SUS=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL=y +CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR=y +CONFIG_SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED=y +CONFIG_SOC_SPI_MEM_FLASH_SUPPORT_HPM=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_SUPPORT_RC_FAST=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_SYSTIMER_SUPPORT_ETM=y +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=1 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_RC_FAST=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 +CONFIG_SOC_TIMER_SUPPORT_ETM=y +CONFIG_SOC_TIMER_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_MWDT_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_TWAI_CONTROLLER_NUM=2 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=3 +CONFIG_SOC_TWAI_RANGE_FILTER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=1 +CONFIG_SOC_TWAI_BRP_MAX=255 +CONFIG_SOC_TWAI_CLK_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_TWAI_SUPPORT_FD=y +CONFIG_SOC_TWAI_SUPPORT_TIMESTAMP=y +CONFIG_SOC_EFUSE_DIS_PAD_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_ECDSA_KEY=y +CONFIG_SOC_EFUSE_ECDSA_KEY_P192=y +CONFIG_SOC_EFUSE_ECDSA_KEY_P384=y +CONFIG_SOC_HUK_MEM_NEEDS_RECHARGE=y +CONFIG_SOC_KEY_MANAGER_SUPPORT_KEY_DEPLOYMENT=y +CONFIG_SOC_KEY_MANAGER_ECDSA_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_128=y +CONFIG_SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_256=y +CONFIG_SOC_KEY_MANAGER_HMAC_KEY_DEPLOY=y +CONFIG_SOC_KEY_MANAGER_DS_KEY_DEPLOY=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_SECURE_BOOT_V2_ECC=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND=y +CONFIG_SOC_PSRAM_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_RECOVERY_BOOTLOADER_SUPPORTED=y +CONFIG_SOC_BOOTLOADER_ANTI_ROLLBACK_SUPPORTED=y +CONFIG_SOC_APM_CTRL_FILTER_SUPPORTED=y +CONFIG_SOC_APM_LP_APM0_SUPPORTED=y +CONFIG_SOC_APM_CPU_APM_SUPPORTED=y +CONFIG_SOC_APM_SUPPORT_LP_TEE_CTRL=y +CONFIG_SOC_APM_SUPPORT_CTRL_CFG_LOCK=y +CONFIG_SOC_APM_SUPPORT_TEE_PERI_ACCESS_CTRL=y +CONFIG_SOC_CRYPTO_DPA_PROTECTION_SUPPORTED=y +CONFIG_SOC_RNG_BUF_CHAIN_ENTROPY_SOURCE=y +CONFIG_SOC_RNG_RTC_TIMER_ENTROPY_SOURCE=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=2 +CONFIG_SOC_UART_LP_NUM=1 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_LP_UART_FIFO_LEN=16 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_PLL_F80M_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_HAS_LP_UART=y +CONFIG_SOC_UART_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_WAKEUP_CHARS_SEQ_MAX_LEN=5 +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_FIFO_THRESH_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_START_BIT_MODE=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_CHAR_SEQ_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_ADVANCE=y +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_RTC_MEM_SUPPORT_SPEED_MODE_SWITCH=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BEACON_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_PM_SUPPORT_XTAL32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC32K_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_TOP_PD=y +CONFIG_SOC_PM_SUPPORT_HP_AON_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_PMU_MODEM_STATE=y +CONFIG_SOC_PM_SUPPORT_PMU_CLK_ICG=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_SW=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_REGDMA=y +CONFIG_SOC_EXT_MEM_CACHE_TAG_IN_CPU_DOMAIN=y +CONFIG_SOC_PM_PAU_LINK_NUM=5 +CONFIG_SOC_PM_PAU_REGDMA_LINK_CONFIGURABLE=y +CONFIG_SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC=4 +CONFIG_SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY=y +CONFIG_SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED=y +CONFIG_SOC_PM_RETENTION_MODULE_NUM=32 +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_RNG_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_OSC_SLOW_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_RCC_IS_INDEPENDENT=y +CONFIG_SOC_CLK_ANA_I2C_MST_HAS_ROOT_GATE=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y +CONFIG_SOC_TEMPERATURE_SENSOR_INTR_SUPPORT=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_SLEEP_RETENTION=y +CONFIG_SOC_TEMPERATURE_SENSOR_UNDER_PD_TOP_DOMAIN=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_TXOP_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_HE_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_5G=y +CONFIG_SOC_WIFI_MAC_VERSION_NUM=3 +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_ESP_NIMBLE_CONTROLLER=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLE_POWER_CONTROL_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y +CONFIG_SOC_BLE_CTE_SUPPORTED=y +CONFIG_SOC_BLE_SUBRATE_SUPPORTED=y +CONFIG_SOC_BLE_PERIODIC_ADV_WITH_RESPONSE=y +CONFIG_SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_LP_CORE_SINGLE_INTERRUPT_VECTOR=y +CONFIG_SOC_LP_CORE_SUPPORT_ETM=y +CONFIG_SOC_LP_CORE_SUPPORT_STORE_LOAD_EXCEPTIONS=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_ENV_BRINGUP=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_RISCV=y +CONFIG_IDF_TARGET_ARCH="riscv" +CONFIG_IDF_TARGET="esp32c5" +CONFIG_IDF_INIT_VERSION="5.5.4" +CONFIG_IDF_TARGET_ESP32C5=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0017 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# CONFIG_BOOTLOADER_RECOVERY_ENABLE is not set +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x2000 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_ECC_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=3 +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_RVFPLIB=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_HAS_HAL_SYSTIMER=y +CONFIG_ESP_ROM_SYSTIMER_INIT_PATCH=y +CONFIG_ESP_ROM_HAS_HEAP_TLSF=y +CONFIG_ESP_ROM_TLSF_CHECK_PATCH=y +CONFIG_ESP_ROM_MULTI_HEAP_WALK_PATCH=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_WITHOUT_REGI2C=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_WDT_INIT_PATCH=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CLIC_INT_THRESH_PATCH=y +CONFIG_ESP_ROM_HAS_SUBOPTIMAL_NEWLIB_ON_MISALIGNED_MEMORY=y +CONFIG_ESP_ROM_DELAY_US_PATCH=y +CONFIG_ESP_ROM_SUPPORT_SECURE_BOOT_FAST_WAKEUP=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# ESP-TEE (Trusted Execution Environment) +# +# CONFIG_SECURE_ENABLE_TEE is not set +CONFIG_SECURE_TEE_LOG_LEVEL=0 +# end of ESP-TEE (Trusted Execution Environment) + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_NO_STUB=y +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +# CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_RVFPLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set + +# +# Common Options +# + +# +# BLE Log +# +# CONFIG_BLE_LOG_ENABLED is not set +# end of BLE Log + +# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set +# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set +# CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED is not set +# end of Common Options +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ESP_COEX_POWER_MANAGEMENT is not set +# CONFIG_ESP_COEX_GPIO_DEBUG is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# ESP-Driver:Analog Comparator Configurations +# +CONFIG_ANA_CMPR_ISR_HANDLER_IN_IRAM=y +# CONFIG_ANA_CMPR_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ANA_CMPR_ISR_CACHE_SAFE is not set +CONFIG_ANA_CMPR_OBJ_CACHE_SAFE=y +# CONFIG_ANA_CMPR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Analog Comparator Configurations + +# +# ESP-Driver:BitScrambler Configurations +# +# CONFIG_BITSCRAMBLER_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:BitScrambler Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:Parallel IO Configurations +# +CONFIG_PARLIO_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_PARLIO_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_PARLIO_TX_ISR_CACHE_SAFE is not set +# CONFIG_PARLIO_RX_ISR_CACHE_SAFE is not set +CONFIG_PARLIO_OBJ_CACHE_SAFE=y +# CONFIG_PARLIO_ENABLE_DEBUG_LOG is not set +# CONFIG_PARLIO_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Parallel IO Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# CONFIG_TEMP_SENSOR_ISR_IRAM_SAFE is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_IO_FUNC_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HID +# +CONFIG_ESPHID_TASK_SIZE_BT=2048 +CONFIG_ESPHID_TASK_SIZE_BLE=4096 +# end of ESP HID + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# +CONFIG_ESP_HW_SUPPORT_FUNC_IN_IRAM=y + +# +# Chip revision +# +CONFIG_ESP32C5_REV_MIN_100=y +# CONFIG_ESP32C5_REV_MIN_102 is not set +CONFIG_ESP32C5_REV_MIN_FULL=100 +CONFIG_ESP_REV_MIN_FULL=100 + +# +# Maximum Supported ESP32-C5 Revision (Rev v1.99) +# +CONFIG_ESP32C5_REV_MAX_FULL=199 +CONFIG_ESP_REV_MAX_FULL=199 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=99 + +# +# Maximum Supported ESP32-C5 eFuse Block Revision (eFuse Block Rev v0.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_IEEE802154=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32C5_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=0 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +CONFIG_RTC_FAST_CLK_SRC_RC_FAST=y +# CONFIG_RTC_FAST_CLK_SRC_XTAL is not set +CONFIG_RTC_CLK_FUNC_IN_IRAM=y +CONFIG_RTC_TIME_FUNC_IN_IRAM=y +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# ETM Configuration +# +# CONFIG_ETM_ENABLE_DEBUG_LOG is not set +# end of ETM Configuration + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_AUTO=y +CONFIG_XTAL_FREQ=0 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_CLK_RC32K_NOT_TO_USE=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-Driver:LCD Controller Configurations +# +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:LCD Controller Configurations + +# +# ESP-MM: Memory Management Configurations +# +# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set +# end of ESP-MM: Memory Management Configurations + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# CONFIG_ESP_PHY_RECORD_USED_TIME is not set +CONFIG_ESP_PHY_IRAM_OPT=y +# CONFIG_ESP_PHY_DEBUG is not set +# end of PHY + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_SLP_DEFAULT_PARAMS_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +# CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is not set +CONFIG_PM_WORKAROUND_FREQ_LIMIT_ENABLED=y +# end of Power Management + +# +# ESP PSRAM +# +# CONFIG_SPIRAM is not set +# end of ESP PSRAM + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# + +# +# Crypto DPA Protection +# +CONFIG_ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP=y +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW=y +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM is not set +# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH is not set +CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL=1 +# end of Crypto DPA Protection + +# CONFIG_ESP_CRYPTO_FORCE_ECC_CONSTANT_TIME_POINT_MUL is not set +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Cache config +# +CONFIG_CACHE_L1_CACHE_SIZE=0x8000 +CONFIG_CACHE_L1_CACHE_LINE_SIZE=32 +# end of Cache config + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y +CONFIG_ESP_SYSTEM_NO_BACKTRACE=y +# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set +# CONFIG_ESP_SYSTEM_USE_FRAME_POINTER is not set + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT=y +# CONFIG_ESP_SYSTEM_PMP_LP_CORE_RESERVE_MEM_EXECUTABLE is not set +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_SYSTEM_HW_STACK_GUARD=y +CONFIG_ESP_SYSTEM_HW_PC_RECORD=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_ESP_WIFI_SLP_IRAM_OPT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_TX_STATS is not set +# CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS is not set +CONFIG_ESP_WIFI_TX_HETB_QUEUE_NUM=3 +# CONFIG_ESP_WIFI_ENABLE_DUMP_HESIGB is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_MU_CFO is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_NDPA is not set +# CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_BFRP is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# CONFIG_ESP_WIFI_WPS_RECONNECT_ON_FAIL is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_USE_STRFUNC_NONE=y +# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set +# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# CONFIG_FATFS_USE_DYN_BUFFERS is not set + +# +# File system free space calculation behavior +# +CONFIG_FATFS_DONT_TRUST_FREE_CLUSTER_CNT=0 +CONFIG_FATFS_DONT_TRUST_LAST_ALLOC=0 +# end of File system free space calculation behavior +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=1 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SYSTIMER_USE_ROM_IMPL=y +CONFIG_HAL_WDT_USE_ROM_IMPL=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +CONFIG_HEAP_TLSF_USE_ROM_IMPL=y +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +CONFIG_IEEE802154_RX_BUFFER_SIZE=20 +# CONFIG_IEEE802154_CCA_CARRIER is not set +CONFIG_IEEE802154_CCA_ED=y +# CONFIG_IEEE802154_CCA_CARRIER_OR_ED is not set +# CONFIG_IEEE802154_CCA_CARRIER_AND_ED is not set +CONFIG_IEEE802154_CCA_MODE=1 +CONFIG_IEEE802154_CCA_THRESHOLD=-75 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 +# CONFIG_IEEE802154_MULTI_PAN_ENABLE is not set +CONFIG_IEEE802154_INTERFACE_NUM=1 +CONFIG_IEEE802154_TIMING_OPTIMIZATION=y +# CONFIG_IEEE802154_DEBUG is not set +# end of IEEE 802.15.4 + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set +# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=69 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +CONFIG_LWIP_DHCPS_ADD_DNS=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 +CONFIG_LWIP_TCP_WND_DEFAULT=5760 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 +CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 +CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 +# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set +# CONFIG_LWIP_PPP_SUPPORT is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_HOST_IP=1 +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set +# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set +CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +# CONFIG_MBEDTLS_AES_USE_PSEUDO_ROUND_FUNC is not set +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_HARDWARE_ECC=y +CONFIG_MBEDTLS_ECC_OTHER_CURVES_SOFT_FALLBACK=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_HARDWARE_ECDSA_SIGN is not set +CONFIG_MBEDTLS_HARDWARE_ECDSA_VERIFY=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +CONFIG_MBEDTLS_FS_IO=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +# CONFIG_LIBC_PICOLIBC is not set +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set +# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set +CONFIG_LIBC_STDIN_LINE_ENDING_CR=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +CONFIG_LIBC_OPTIMIZED_MISALIGNED_ACCESS=y +CONFIG_LIBC_ASSERT_BUFFER_SIZE=200 +# end of LibC + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# OpenThread Spinel +# +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# end of OpenThread Spinel + +# CONFIG_OPENTHREAD_DEBUG is not set +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +CONFIG_SPI_FLASH_SUSPEND_TRS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y +# CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP is not set +# CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP is not set +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP is not set +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) + +CONFIG_VFS_INITIALIZE_DEV_NULL=y +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_SW_COEXIST_ENABLE=y +CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y +CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ANA_CMPR_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +# CONFIG_OTA_ALLOW_HTTP is not set +# CONFIG_ESP_SYSTEM_PD_FLASH is not set +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5760 +CONFIG_TCP_WND_DEFAULT=5760 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/settings.gradle.kts b/settings.gradle.kts index 1d4e70b..664c2ab 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,6 +10,9 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + // usb-serial-for-android (com.github.mik3y) is only published via JitPack, not Maven + // Central - needed for the ESP32-C5 USB-serial transport (Phase 03). + maven(url = "https://jitpack.io") } }