From ffb4ff97b2e0bd35f5407e4ea888309f9d8906bd Mon Sep 17 00:00:00 2001 From: ranchuan Date: Sat, 7 Oct 2023 18:15:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=A4=A7=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=B0=8F=E6=9D=BF=E9=80=9A=E4=BF=A1=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- checher_slave.uvoptx | 140 +++++----- checher_slave.uvprojx | 49 ++-- doc/mhzz3_Main_v0_00.pdf | Bin 168056 -> 0 bytes source/ReadMe.txt | 3 +- source/dev/dev_flash.c | 59 ++++- source/dev/dev_flash.h | 6 +- source/elec_det/base/define.h | 18 +- source/elec_det/driver/EWDriver.c | 55 ++-- source/elec_det/driver/EWDriver.h | 7 + source/elec_det/elec_cmd.c | 30 +++ source/elec_det/elec_det.c | 100 ++++--- source/elec_det/elec_det.h | 9 +- source/elec_det/hardware/gpio_cfg.h | 3 +- source/elec_det/hardware/jw3425iic.c | 8 +- source/elec_det/interface/EWChecker.c | 259 +++++++++++++++++++ source/elec_det/interface/EWChecker.h | 22 ++ source/main/compiler_info.h | 2 +- source/main/main.c | 8 +- source/soft/debug.c | 35 ++- source/task/prot_uc.c | 2 +- source/task/tran_for_slave.c | 358 +++++++++++++++++++++++++- 21 files changed, 1000 insertions(+), 173 deletions(-) delete mode 100644 doc/mhzz3_Main_v0_00.pdf create mode 100644 source/elec_det/elec_cmd.c create mode 100644 source/elec_det/interface/EWChecker.c create mode 100644 source/elec_det/interface/EWChecker.h diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx index a38ef89..d1f11e4 100644 --- a/checher_slave.uvoptx +++ b/checher_slave.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 0 + 4 @@ -114,7 +114,7 @@ - BIN\UL2CM3.DLL + Segger\JL2CM3.dll @@ -125,12 +125,12 @@ 0 JL2CM3 - -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) + -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) 0 DLGUARM - d + ? 0 @@ -230,12 +230,6 @@ - - - System Viewer\USART1 - 35905 - - 1 1 @@ -345,12 +339,12 @@ 0 UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_512 -FL080000 -FS08000000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0GD32F30x_HD -FL040000 -FS08000000 -FP0($$Device:GD32F303RC$Flash\GD32F30x_HD.FLM) 0 JL2CM3 - -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) + -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) 0 @@ -1154,11 +1148,35 @@ 0 0 0 + .\source\elec_det\interface\EWChecker.c + EWChecker.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 .\source\elec_det\elec_det.c elec_det.c 0 0 + + 6 + 55 + 1 + 0 + 0 + 0 + .\source\elec_det\elec_cmd.c + elec_cmd.c + 0 + 0 + @@ -1169,7 +1187,7 @@ 0 7 - 54 + 56 1 0 0 @@ -1181,7 +1199,7 @@ 7 - 55 + 57 1 0 0 @@ -1201,7 +1219,7 @@ 0 8 - 56 + 58 1 0 0 @@ -1213,7 +1231,7 @@ 8 - 57 + 59 1 0 0 @@ -1225,7 +1243,7 @@ 8 - 58 + 60 1 0 0 @@ -1237,7 +1255,7 @@ 8 - 59 + 61 1 0 0 @@ -1249,7 +1267,7 @@ 8 - 60 + 62 1 0 0 @@ -1261,7 +1279,7 @@ 8 - 61 + 63 1 0 0 @@ -1273,7 +1291,7 @@ 8 - 62 + 64 1 0 0 @@ -1285,7 +1303,7 @@ 8 - 63 + 65 1 0 0 @@ -1297,7 +1315,7 @@ 8 - 64 + 66 1 0 0 @@ -1309,7 +1327,7 @@ 8 - 65 + 67 1 0 0 @@ -1321,7 +1339,7 @@ 8 - 66 + 68 1 0 0 @@ -1333,7 +1351,7 @@ 8 - 67 + 69 1 0 0 @@ -1345,7 +1363,7 @@ 8 - 68 + 70 1 0 0 @@ -1357,7 +1375,7 @@ 8 - 69 + 71 1 0 0 @@ -1369,7 +1387,7 @@ 8 - 70 + 72 1 0 0 @@ -1381,7 +1399,7 @@ 8 - 71 + 73 1 0 0 @@ -1393,7 +1411,7 @@ 8 - 72 + 74 1 0 0 @@ -1405,7 +1423,7 @@ 8 - 73 + 75 1 0 0 @@ -1417,7 +1435,7 @@ 8 - 74 + 76 2 0 0 @@ -1431,13 +1449,13 @@ soft - 0 + 1 0 0 0 9 - 75 + 77 1 0 0 @@ -1449,7 +1467,7 @@ 9 - 76 + 78 1 0 0 @@ -1461,7 +1479,7 @@ 9 - 77 + 79 1 0 0 @@ -1473,7 +1491,7 @@ 9 - 78 + 80 1 0 0 @@ -1485,7 +1503,7 @@ 9 - 79 + 81 1 0 0 @@ -1497,7 +1515,7 @@ 9 - 80 + 82 1 0 0 @@ -1509,7 +1527,7 @@ 9 - 81 + 83 1 0 0 @@ -1521,7 +1539,7 @@ 9 - 82 + 84 1 0 0 @@ -1533,7 +1551,7 @@ 9 - 83 + 85 1 0 0 @@ -1545,7 +1563,7 @@ 9 - 84 + 86 1 0 0 @@ -1557,7 +1575,7 @@ 9 - 85 + 87 1 0 0 @@ -1577,7 +1595,7 @@ 0 10 - 86 + 88 1 0 0 @@ -1589,7 +1607,7 @@ 10 - 87 + 89 1 0 0 @@ -1601,7 +1619,7 @@ 10 - 88 + 90 1 0 0 @@ -1613,7 +1631,7 @@ 10 - 89 + 91 1 0 0 @@ -1625,7 +1643,7 @@ 10 - 90 + 92 1 0 0 @@ -1637,7 +1655,7 @@ 10 - 91 + 93 1 0 0 @@ -1657,7 +1675,7 @@ 0 11 - 92 + 94 1 0 0 @@ -1677,7 +1695,7 @@ 0 12 - 93 + 95 1 0 0 @@ -1689,7 +1707,7 @@ 12 - 94 + 96 1 0 0 @@ -1701,7 +1719,7 @@ 12 - 95 + 97 1 0 0 @@ -1713,7 +1731,7 @@ 12 - 96 + 98 1 0 0 @@ -1725,7 +1743,7 @@ 12 - 97 + 99 1 0 0 @@ -1737,7 +1755,7 @@ 12 - 98 + 100 1 0 0 @@ -1757,7 +1775,7 @@ 0 13 - 99 + 101 5 0 0 @@ -1777,7 +1795,7 @@ 0 14 - 100 + 102 5 0 0 @@ -1789,7 +1807,7 @@ 14 - 101 + 103 5 0 0 diff --git a/checher_slave.uvprojx b/checher_slave.uvprojx index e8a35b5..1253d31 100644 --- a/checher_slave.uvprojx +++ b/checher_slave.uvprojx @@ -10,7 +10,7 @@ app 0x4 ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC + 5060750::V5.06 update 6 (build 750)::ARMCC 0 @@ -138,7 +138,7 @@ 1 BIN\UL2CM3.DLL - + "" () @@ -185,7 +185,6 @@ 0 0 0 - 0 0 0 8 @@ -352,7 +351,7 @@ 0 0 0 - 4 + 0 @@ -719,11 +718,21 @@ 1 .\source\elec_det\interface\XTChecker.c + + EWChecker.c + 1 + .\source\elec_det\interface\EWChecker.c + elec_det.c 1 .\source\elec_det\elec_det.c + + elec_cmd.c + 1 + .\source\elec_det\elec_cmd.c + @@ -1238,7 +1247,6 @@ 0 0 0 - 0 0 0 8 @@ -1405,7 +1413,7 @@ 0 0 0 - 4 + 0 @@ -1852,7 +1860,7 @@ 2 2 2 - 0 + 2 @@ -1943,11 +1951,21 @@ 1 .\source\elec_det\interface\XTChecker.c + + EWChecker.c + 1 + .\source\elec_det\interface\EWChecker.c + elec_det.c 1 .\source\elec_det\elec_det.c + + elec_cmd.c + 1 + .\source\elec_det\elec_cmd.c + @@ -2906,7 +2924,7 @@ 2 2 2 - 0 + 2 @@ -3448,7 +3466,7 @@ 2 2 2 - 0 + 2 @@ -3552,7 +3570,7 @@ 2 2 2 - 0 + 2 @@ -3631,7 +3649,7 @@ 2 2 2 - 0 + 2 @@ -3709,13 +3727,4 @@ - - - - checher_slave - 1 - - - - diff --git a/doc/mhzz3_Main_v0_00.pdf b/doc/mhzz3_Main_v0_00.pdf deleted file mode 100644 index e042cc1ffd6ca39ac9df403a0fa66ac2b9c72b75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168056 zcmce;byS?o(l1O%2o^MG&=3d^WN?R|!3h@JT?Pp55+t|}?he6iumHiG1a}DT5ZnUX zhs@sh>~r4pu65V?*82XLdAh6X*VR?k)ic#IMI|r#j)9qx1;tHVcj9VEDwm+H;*~uI zS-z1Xxs1O(845Ew6S<9n1qvS@3P{=YqcJ&1MBhOlY-5T7lGisiwkKx=1}LI{-a9&g z&8>kp%b&J@0E)4-(F5Z{``-cn9*P1Iv2nC^AZJ4P*XRede;@s4mcNIxqkyE%jqJ%a z$=M&KA?N(_%Khh+`9V}ga^^n*k!$}0lno#}fNFw()slmhja?kH{}%57=YLN4usAzo zK(@bDr)X?%<7j6HEbl=N?`#0dp9jN_MkY+;%zuOd`X8Fi#!$)Ff&4*SMe>IpSz{w}ePJ6Ha!n?nkC~Z^i=2y%MH|qD zoz2Jp)~{&epzmM|XcSPbwF9sKdvcBkG!&4KwY3e<(j;erX^Zs%QIVV#rZm<+RwHMH z>5dg90V_<$tbY*5Sz)?n<%03SP}pE7Y%mly7z!H$^p4j2jt421)R z!U03!grRW4P&i>IoG=tl7z!s0g%gIt2}9w8p>V=bxL_z;FqD7#;sev){w8B=ZR%hK z_zN2+;MniX!4AfD;45NX;-6lHa`GTVXlL0ylD{GOYB`Zy+>>=m9Da#$EWrdrk4cjWPV z&xA#dQdLt2K{imj)-UxrJ7QDeCuu<^ywp0>D@LO8w|-6AEV5&sH?7RH4EGX?Iv!Uy z#jW#Rh)=IiioGum5S`yTn`-oLEpcow-E8yP-?Qd@orxcR+kiU5sczDu-2X}mEOPYm z;$jJ;z%nlPG%Q}_Ff!1>nKKugS7{*8hc?HH zUWsb9d$^Yd9|xcNU!7~l4b0)jw=!FD>FA+H)H85XA{UO_1;u?KT$i9+7A zGy5m@886iNRPie`6pFqKz&bQS)p3@{+}j9|)Fh>8YKWOg!=iDY>@6mZbLOGgwjQ+b zfgg2h8P|FaJc= zP<}HxECJmguo?{oiOjA6_hm z9%XhE<(O^#hD8^1cIoou=H}-9w@u5@+`ZcsYS5+&GdGFQZ`G>u2GB4>_Ix3#g9RbM zA{|8AQ!mH?S9K2MT6mVr|BOWpE{QSUp%TGJFiPx`t3bhl?0zO)logj7z65L66-z^E zf^~dx748N#Qgyuw!c}O8jIka178zE5B%%nRba;XK+%Z~qs&rgag7~(5<65EB6;?L= zXY|0vODl!O9i7+V$0DNJpqEz(;_9z0%`&mq5rbHCdG1)5l5U&EQdW2N$W zR!tYXX@nQ$Bp=mMPpG_LEg!`J$y#_U@s_6d*_yQ-F+vWloHdfMAX(EU=3wOwdK+=m z#lr(e8*w9Iw7dFm6xOfKv_j~+T2fIR*YVhE6=iu(xJyiFg%;Z@=jXY5@i&KfnTKZ} zCY*VV&p-^-r60X_@9!qbe&5_*i+iKXdn!z&DsQLAOW&u?d%zWg>?1M`Z#|Iholqy= z{vNn_dxHhfj*pLSMa1{~2e%F}{4K`)&7JezYN6nea-~rgydplRJ9T_F!=G(adQ!ss0(5xjeGhskqT#c~H*}E|CKhxW zd4JjZ`|j{=J>#y={_M6x?S!hkfo-Np?`g@>?N-Oz+t{Tm5$i7kEx&{MW!VElMGC!- zb8g&)d9)tW$i_dtU%Ja^JtF$fed(=Tj5lE0dYy28t9#qD$x_VA^TlKnG_v_4^2_}; zM!(+KeLvGL?~l|1+8b5FO=-rVB810SAmcY-w2R*zCGqFLXIG&64)4ZL2**qeSC zUC&>1t;YlRIQ$8a&|PChGpsJhB*iwmKoINgV(abd{dvm$%J;jO!&}fdO+59<^qTkg zlwXV3GFIvwR(;b-9Cc;4=?q(vX-Xi!yVBR&1co}h;)c6;A&*5r?d2P-=sosN+M`Nd z0XshKOb8$=-H|#viYGZB7{w_bTes6zKhZk3g5!=8ZXdWPTPu*ZGnS9q_0>4J$YUo! z@x~LMPp>tJBU`*eZov(@OnRcYVUUT3Hwo!!dJ%C(5}D705&yd)o3AWa_lD{9oQ54u zj;TM$Fe=8kwR}5jfFcuOvf&b`JFItY)u-@Q|D&&=`a}pem$q>Yu|!h;&ta;|fxXnUE4ud^%yoDy%%e3!}C+J@uvq1 zxh&H|i&Sh@b46{))>3(_i`Lq<1V;3`ee0T2DWIh?rhF zG*>PYUNUfn)+gx7||FKxZ|<%5QXxG ziu;`ZUR#Y^^0;ghe;XQMU=AJI|NX1gS4hm%*^jWM1XpTTDebo4ZI|9B_Rx-Bqf9gL zR{4pIh3hm>de8Y31S9pIil+A~Cx>1~+~;Ridd`o-)0jw-8CCd0xTWi8cemvSlR({p zDx11qyGjv;RQ99EdM9(uIknb|9Me8adz^{71R6~cMx5X38HbLR31N$4*fAwK=n5;w zjL@U?gf%V6gljqWH5JaV*HZZ9{7s>tt;C$GTP^tfl(0I@jOB!PIN6Ek)Y?2M<{EF2IoxENfKw3$o0E0aCtE3Kzz1Ih`XJ2 z_H#1*t1v-%1c+zYmPj?Z4CB($_{80U&E!3zXFsIAInZ70OQzeKAIYLQzTD_+ z`k>zeS?_Z4R^Ve#uwfPdIPk1Gt$4GjL9f6J)8JY ztm9m%BH{Yk44<(~wsu((F}g8*`!y=>R_!6EslE%pI+#|IVOrLzrKqXD;zAmy$;D!> zVfMGr;zUj+_>%Mu{^1+Dvah}K!|b2#$6cft{k(?d%G^Gh9VJRL)M$-)9O3beB_0;1 zlX|$T#&3O)OSc;%PaNYD9*uUMx&S-+QeufH;Jx*pf=V%J3p@JStmu+Ij^HWI-|_l> zdoEH&a+4psGv&`sG$5^T!pDSBo*>=im}R{zd4HXQ@eH(kt3I&qY1#5PzdYl|WZFC3 zQ@i~+l+AqIn@86)rI{z653>dkS*{;FV8lDVZnm15+| z;zj%gmuTmCE67)a{Zq>-ttDxo0NRg`9z!QL(A$zi2hnn*q<66!_+XN+EZ)8%CTC3f z%(!1eWlSuvA0DD=qQKWiLSEJ;V4nVGU%mrxWCV1t!{mB;m=8Eh=EUu zkVVu#BpOpfiZdexDh$K@vlh{+!u*Z-`nnrTiIGiD+04XkOuk#qMACVBVe_V*DJ$(b zadl{2Om;>rf@jsFsPx=S#X(s;@3?~C^B`W_10=(Q&UFOh+J_RvwQf}CGKb4s&O&4e z2)2-k$oXZNE}dI+)8<^EgOB;=+D{W6c8R+9aT5GZ?2J(Jw>#tQz@nw)!ROG zOtf1l4^~q2LQ^WcVeb_2LfdRS$m;BS)B5_wyv@c;2+FPd|noOfe09x=o%IU_hHKw>7+Ccl=ceTAebQI&b{ip-q>s zwY1yMLC?y1@NP=Wd`ACWzZc`Y>Z%rR6=q~!Q!3K(=Mw5LWaYA+(7GB&xr8U~Baw6r z-xmo5CUxVb<5*H13*>IGJOw{)#P2@$<#<*NcTCumZhnpXJ7#Ej0DTSZ8g;&o`WjWi zY4+n_s5kkw^bu>m^BI1>*lmE_ey=d!ye`sm-z~zx`dxO3eIw-oNNNCo2V`%(AbN(+ zs^WzGTc)MUS%{EP9H%*ehL@q9)ak%o8oZRacaGOD*8CTiCV8^bA7G4zk6sPL&C>~*v5v&y3!!i^3FEWuUzNJv zuu5$ZyYT#Y_G*C&Ur`ElveA;iYo<6Ra2;d4Pcmk6_@?W9*{Yfe`=UCC%V(KBDSH%V!pHelbMKKl7%2?`-Px^iJMYe z#Od+h?Jf;i&ZFFC!#QuLpf(NkZo*xjn!m4SW{ZpAhm`DV4^K>4b#E1=P9Rz>u0Q|8 z$%z$h*n7+JY{CRU$nyN|f6i@5T8AfRjM{X;ZkwDNRhxU_;MT4hKdFK!gX@S+t*xZtywm&gf_7O$(RI5jg@qt<0qn`=|^(Ei*VV z)?TV@yuRT+IiEl6K9Wh$H9K>}F}ax7Wi2&}(D6d3Hnb85UYND<{@uOG()Kwt#b!B- zFp?3jkxbO~d}kB+a(Do|EruI7+%-JLK^bayg}1Xbh@h=Ur~2MiZ`(iVD08=V*m1J0 zs@y!hKtl0+wyH~-OQrk9sRCTaE8aEG`Oc<^iS0_Lv{ht_(pti64j}KB2ZzgrKpg_o`t>%Ga?+#Akt&`@RcD7Qrp8gd z!jb>|EdXQbz@qPqnV(PVW8uM4<@)Txz^Qf7aEdP74Gp>G;etD>3s7}-R2jQQe(o1c zyXkXvnm9pol^TT|$-87MlwK>kM2i}#rNx(j3DM3jM(yTavcS|0apM(ij%3l^U`udl z9-s?(VYU6GP!}4R_&EI}2b;<2=Q$`F!gImAq=Y>7b#NLy7+=N>hhRr8MK82%TY8)P zS-wU$cUr|uy&RNC?Ls~DUD`F#ddMjS-W`8kVPNUY??;Ba%VTt?nx)+094sZ@tK&{N z8*LPx7~E-{!*+-ub)%E%0KDDnWIj7Y=)cs-OkF~SY&Q!gWgxDPV4%o) zKBDb{Yf3^}bM7SS*)F+=ypD{QY0CDS`XFN-&CEN5|H{D9$v2LmXVOkRxNlm6W1xo@ zM>B`b>J%O!$50-wb66g}YZ4Rw4jt)bor=D@_?!x2ZfGfUo>({d)7#+b7j#mUwQf&E zx+fJC&6xX+sy$}>u zsvl!uDfn%RVD0lX;hB6`X_mt^e{XMUyB8Hyh0JKz&{FhMuiB#&V;}{Sa5Jrem1qoR z7&`NKmLO_G;BOC_dQ%mbJEv!fo1*hxnC?9F8*{?Z{o^2~Z?<6` zQx|gz32=WiJoT%xRyHc9Ym!4K0#9@93AYB=>iL@4|I*3QH@Mm}2~~I)`tD&U(K;~H z3Ig!|FP-Rkn$?q9^KYOgHl&&W4(dB zwB4)L4vdD3srlI6034p85?ZPs@bge!H<2io;8qy^T@N{D_i#lZAX@I&p+dT*(x0dy zCd#7Uz;r;w9 zF2t{EvMduA?}V_fS6NF(1Mq7LajSv%QThQ^Re8YpO}-CMxDOt(b5m73o!sOI9=fX0 z!Wr6qlV8)Dcv6-aX=pi2g@m979-2Uf1FSQVf*}SDAFF>JiW3x}{|J*;1Q`d|vX{K% zo%2!w`y^KQ^Hffi>;Si#=a*LxK_aA*-SmVibUL~EzyR39V0%LI=%p%V<%E;BYhz0Y+|Jo3hR67gIFdlc}NjAOlNW=NKya7ppqJ?j(qV zi)Q6`-93r)uhV7rKxQT`r$iJy zI4pdKAQqwjU+3d=xk^YWR+d=Lk5o+F=d#6JlNG{S7b<`IhG-8HXXkKXARuJk>c38u zkX-{ynNMzo4|8dFs#+fa`{m7ndgo-kv|kf8)6gr096fEpM`}vspDeNe_V?k?(ur-g z2>LEAD3E}%6hHcp6NOdsy;}Vg=g#jfV53I?7KaJ}W}SNqnAwVG4KVwE?Oa#yST_83 z5BPs@7WuU+OW*cUK z{Pj;{R)-ms+Pfw_Kho=4SK`Gm8!~;CCr8Zk$A*wn@13_x`}!jc=khI@JAh7N^wRAu zX*h!M7dsL%qF-Tx?2oBA_X^mdiQhhsPY1!v=B1m)hBH8W1I@r^l+j@D$Tvb-`bT4b zXb95Z^8H!rD_^3l2tw3^%X@;u(JDV0DsAZ$Rt6YXi?Ks9?oPwW>MCVFuDx0D`zFz5 zNlvB$X|0ew4owszhWlJgnzqhmK?`I@%ikytz1 zS&zi{6uSHmr$#M__^Ac7QyOj zTii^_{^&$PdpR@iVF!#m0EzS)wPv!*%@QImP;T;z1Ii zRdvGfmgp~X3)z!AhT^NQ(~6hz8QzDQON5q>`X(WZRNht0A?%gL5qml)nkW}BZ$}9M zPCKLf7%SRa={tH$Oo-7yG>Hr}&w=Sg5B+t@F#_>m&Qjdky0(br;W9#;Nk3?77vKA6 z*$K)Q!J-ouypLP2Hi?hgk5RxBaOiEl!g-I!V>>c2muB-TSTaN@G`|{@H=n>GHEGbcjwB%5a~qpsCtll+N$KX_C1^_^9s&9LrZV62)>mY4#a_3 zHTfeUBgn)RG^HyH)}@^pfFxFB6vxrq@Ap#h;nY#|1K-ct4BjN7Lz2dK&m?W z-6G;O1Nfr4BQhe$t}*vqKLGLsQXt(pn*C*MG+UYI`t_Zd9brgF)6U^$McA8s4D`)* z$GKOp5cL`HY0VPPUG+lBLzfWjInEXwRln3eBRnGwKsjm3@chlcm(?`^rGB}uNuc!u zo55>L0@7!Q@d0xEsh#DTC6s~*5$7foIg+lg;EZt0?HwE5%`++Z{;L?42rf$6rEj6n zhweyLZ@VVz4pwXC%dm9|ElE4n`1C>vGFo*H3>}6L(OpeUFXza{rZA6IhWBHAaHh!G zOx3ipjCIb{q?$${*E~%l58v=J*8*|ZZK*s5`f|0fHo?DqQ1Z%@%h%!4qjtS2I-mb` zd-kItq-5teiuy}>^kYV0nk!pZrWOj+M{h|dA)6b>0~U$3KY#~rd3+Nci?R)0ybnF! z#!r(q`$CQf`J6NuKck-2=GFY7>1REm3ANH>r=M3G;|Td|ruQS1Daw-A)&pG3awj0B8$zL0;lJPiiah#+kk#-dWsGV;i(1QDy4ApR zkxwM%SLLAkq`U7XIwA#9H`~gwuh3Il%7dgyd~u;<97cP_&`k7PBHY{(>$j6qLwHAR zgsSm8(t>$bCmu)L2G#T@_9f+*i$BdrBqMFBtrn%O)-`0LPsX*dzQ$1Ul(L!2{j;U<|&R#8r4)Rl*SdECac(>6JN zBMMYmbC);d{axnM1@-XTvzs$NO6ioKNd~U%vCzbP?>o(G`(f$;$!ps2tjEEqgxQy_ zhJJGE*|dw7c&Q8ND=!nmfBaUd5}prgGFKni$7jcnuMU(y8rQ1F?7le<^9ztkLe`|# zP58a6UWO7k-}tks#>JQN!}G}ESsq#J3F?46Wwchct*#`+DccqdAUT?rEPiUG1zr^1 zoD0JzqtJxnu2(ndy`FKN8;$=|9hN%XIxBH+|C`Ec|7Ihf$%;#Hz04~=(JgW5YB(^% zThKmcAi+rPny2KXLx#!i2fFo4>msoiEubO$I7h>kN3OgN$`aG^KIm2CV^{TGXeR-* z_O7SESa2yW&xI@B>zZlXHY0T3+M1PIBura^=Y0Y7rM?L_G-DQ;jq9aGJbpy?$8p4)G*=}GfR$fTguo=&p5S!2^w4qJEi zdB*1)I9h=y`+U!plMS>qNc}P%E|_u(QA@8HnPynmk6G{8{x!4kqE-62)1l=Go8+RUf8rHF>4-Nd zD0E#!3eSE+^psaKg50v$GO@zg8Y^JQ+~?_`Mrm?9sP&`4l+kk3(!y!4`Cf|f z$i5eFtS@~IG>7A#@HB)`(-y@&UI(Z7Q|=X+0=!b-UPuX$e5!6@Hi7AU%*w&3{P9I+X*~YQ$@?w>`|qCH1~kYQ3gBksAKQo zl#sq^Z%9avm7_;?bZg8lD0!ULEOR#U#^$*DtR{zE#lC4I=P~#6s#kl==kkw)d$w=& zB_G*U^xRIzARuc0WC18(N#uu)-WbO39_HSZ;Ah6YZELxWbns{d$HgT)JT0g#7PPf6I{V8l4gV8>3*4NY=pKa{TrTeXa0j*BU!T zGv}b(nOuB9w@w{w72epo_=(ujyP5P<_bnIW7NBXfX}3-1~(ICk#bBJBXoyV@#+i>dOjMSl!*p)mtY!QT&b-AwhrThKj}M{jD? z`EL2Xrj_*Rf^NA@#--_!ZqH4rsWkp~8S4gAedzhlOTPMRcc%^PpHCck-$GN&uM&D8 zvsWOTX3v!=M$Ql8cCulixfE^50R{ywy336}M!lfYZctmv&Ax@!1^U|G&yUxN;w%{R zmD?4izT_oJJJ`n>Y}~w=SVQ6(H7RN!aZL%mPu=i8T;izkE1uRI!f-YjjcG#EALk}gtAbC%H%dg9 z_CKJ$G%F8C{UL&(gQ)Ob{(bG2{-|g_o7G{Coe(|3Pl!qQNXzL)BdIDZhU{ZzAt(s zC4%3UmaX{*!zIgv>fOs_Tqoe7cx#*_*{5S{4&`}nBi^gk%=4dHqCmgq1y5MjioYJG zX4In16&Tm{NM9jAgfdgotz;+Jp1L>XMc4r=THG6X9W5PlMQV?KqNcz@S?nvzb9xQRC&V?@r z!~0Ztru4QoUk)n!IR;Ql1yW9t-!A^qC@#V-yNeDwi-ZpkO^2XuU(si9%Q#|2{nJoQ zCVc%Lg*wDw7pez8Mrc@aVKv! zKMWVAs&bdx>8$fzP>VPo?O4+A^?&SCi~c1W=I6;&6Kq>?7{I}de%|oob$43}-fSn= zbdPWf0pg8{+4EJs3=}H^;yvjso@)OWN(bG)+I(w)%+igV8IUc=KnC(ldvsYq&cKth z2FNnm_yg&L^WYyquBioc7RXd13eS;eY~N(&MAju;mso~8I;SM+J(TY`N-)|?nU9%W zbj+i|!P5BJpKN}GI#P12XScp;raCOWhMc3_z@PYegi&TxfB}<92ch9*azLI^4Jwc! zIYru!k=9>Y3@Up+<3_koAsnhYqj(>kqn%4G)?}we@t$B`$~9P8zXmlnm;66?ebDUa z_Ed4$Fxxj?Jb7TG1$hI=m^8B=md0u*X5;3Z-w^D#1Ll~=SXlXxNR+Lv>_@OKynV^5 z_h42!l=grsoIi6;?5d!NHx)i*p8Y^ZQb)Ysej!53Ny$ta@FYl8-#W+y`9xjMW_0_4 z($E;?ruM}k3+Y*}Ki+;Jh=V%9X~HDKsHT`ByK|(>LYdB91lua?NsyDCbx?rbHV&Q8 z_NjY(B};&3>r>jYCe6M44w3@E_1hHg%b;8uV^o`#dM0fPg+yO^BwU3I2I zgwrP=HSJhgMS2rF!szlvf}m?)(QB6R=ig5Awcqu@iyCsYi|Unf#G9Z@5qSHv?OYl) zmZ+;{BV`O>Ib#34vwv{qbEK1%FEPVxEwWvW+0^Uak!MYAR!f6I`eTGqLRL(u<7>vKsZH5OK9$}1%XkE1| zj%w=hGA?KqI2aRaih>&{n;EDEeBxcxP9EV3IH6RYYgSBB z`ZSYsmy6!uYHg%XIof%uLDkxqPiZ&0Dd~`GAi`f!>5#T4Ec_7&m#Q2vv1gYM;P5Ep#wW(S)ODN{Nu&oJ=sgDi$Yq#ld z`4C+6d=?cIKa`8YlaU5O%yAn5&DrJjT+Ql zIPbt0?emHMGbCUf8zr^_t}sel73PHXXeV9dA+!f>dcdRZe zz5t1apHR-gL+a}%kxTm<$NTj0mhYV>waOM8wm3*naQl9$be51F9My2Y2t2QcCEgd*d z9EcnICZDE1TwShw6M4TJ8sd`IsuPyMk|KwFK#>?jk+y%7#rs(+{Fl?x2eV>GSuJ%Q zZcUj%x;1*J=*XXoH724&aroG~AMYE068!46LS&N}QU^*S;f#3`EIm8LE5yQIfjpnk z6wDa-dJRJb`y*613Wjy4652MGoxlni>wfQn)5bg+KkJ zWqc}m<{?YV_sFKdQ}zw;pzyY$h&Be1?DsehZKw;5G3trrWKzrvp`a>Oyw1KtEXw3x z!&sD)=9NT3*_DUHLI&myw@BCp99?Ja#c-ZwS+O^bqPdhbF!}cvxn-%CDJ_3bCp*M-KbtO(}3FH^{5E zj3Gqa)J=0dr>(9czJGom@*L^v52Ztz2|T+6d#IPS~%=a zWj-s-ztlTv(vUs6uv@Z7)!fLe)|5@oPS)B;ZIay97c1gpTKO@UO&dVHJtM9}i2izj;D_t|dd{TpHR)V9anomohO%N4k^@X{~Q z#ij+_$_n156n-^%NDu6JuG*ht(4n{=`HCw%iA>9sH4lmE;tQz?xXO*DsucjPv1t`8 z=(KaewWb?wxM&JL2X{=$R&>Wn4LnaS$&#>>ds@?qOCxuMiitHDbJ-&A*)%T;YwfJ| zLm|LVpN?w?dwAweMzcS zyfiv97(9zwa^O6_4C>T^Uas#sMoDsgz%*VY=o{xja&;j&Ww&2G z!Dc=zNq6JJ)h8NovZv*<8Zs_lck@NCjbs!B%hun22IOCl7AQx-@^qGU&DEA`%c1c# zh3YxWVpS#nu@pG%XKn6JWZCyvK^>xad$hv#z#UGXpH6wcgnDNVjb`He7u5`EJ^FN1 zA@U}V&7RF<}k;aq(j(g5=2^ouq*$9v#)V?-OktSVEQ-pBN$s^h>nc*2pMR zjtv|mG(t5_1I)dL3uVe8!JVrXQ{PTr#LLr`;jBPtr54p#*ZKaCad!1DFpm&O&*vMB zyZvKHkydpjfBFpt2*V(?dQXkO3R)w|sc?*tx3JP1j6FVr)7NYPSgeuxNTim^vgBgD z6r{2pQfkB!`Ti(AN#R2R1OM1;uk&KDc^Q3ui5d) z#WYM64g2xFJED>n1+#C&mOeMt#;{e%sakvFF|u7r&cpxaA2QGJ#FhneDQKVJeBu)2 z$MY`~*IF5Y7~=6MKDQjC)}&U`#%SA7Q2zxdka4E=v-bNCU$WhxuegOl_*Ka?s+;Z_ zqNz(L#M2nqv2+-+3YT+~8zVSvB3>2wNa}lZbp3c6)ukd{Op+A3>IzQ`&VS&DnaTYN z!f3aGEG%YPRR!lAJs+Fcf9Pu&(T{SOjxMAI-PJ6FqEzI@G34*L|Hb$zk)KWMf2iy6 zO@9alW_4gbjj;Vc*AsZF2kC67%9hxbv7pz(2)AM`Vm1!lZ2Vi7`fmxSD$7e~;F;Zl zDcPw1Wg)2JYi$f*MInNNq{-PxL&5*DESTinPXQY?Bf$G_GnP~4PaI6u%-&)H#?#nu zkSR_pHLrE9ZmXWXO;%~r9kaNw)Y$iurT)I9N5W_GEhg%?BAdyeq$?0NfZg<;)1MyT zE0U_<=%?jgXhl(!#GWn=J^dc>x8Ra)7pOq~Iix0H(O&4`wP|Lh!TN9KGHJdE_~TsZ zXX&Vl{u|W*`R7a}%x&j*{^AuRhEWv`7r?*v)L?E4PAhb7eGm$%Q|Qp^rI;D%>A}=L zCPo&TdhCfLfgzvZs+S|>=4$F+uvm%dL7NB6izoKvo!Q}8_rnHRp5))E}C zfWm9x(sauzC%H3+r4PaIj-vx-$xlJ~KAbi!*OLWY2$w99^VTR_C^g+XBFxi!U_!K1 zOQ$?1jmV{|xhy_6C9|}`_`#2n9g`4^e2)ZOVsivFibbKKc(8?IT5Dt1q~3+`pVBCGRYAw{ne72EdO6Ic9*r)G~P4fu zts~0Pu6Ir#C1TRz-XqTRX5fzRdV(#S{V7DhhJ73b(yYumo!Eb#YI1Nrk#54|o?rEb zc_JObj9@AK?DxC)^O}xXd+hY_Z|608?>@Mrb8N=)Ydf_EzL-jvyp*3v_fmF$y)6=M z`JMahM1f!;-QJCC;}vI$mq19z?ATZQ69tD`54K2)?<+j57$*urw;qspwWdP91qQ_h zE>09kftj}IPoi0&vLd@@BL#+5>kW-lTzBxnXpI`=XqG>+R3(gloS~R&`9*vc#eO;= zovVPxbN=Fi{OW;>FA4rJL1C`uhu$m&kc)F|(Rhwo9>}jB$Wsqwo=-&ka2cpfz%QHATvqfj+SHp+S_`%Qj_ikQl?CJNay=tgf`e9M%qmkkx# zFMKLHYV~3|v)xML+0JM7trd=j5i}muI&x1voH%ql$;lA!-rkDI917z zmBOcJSIvnK-w&~)d?iBr?##4TnXmKMz6ha?{vst%_8R(104V0if#t@?vz>g0;Ioq- z;c?g``UGny@*3{w&B_#^*7R}jYPY5>si0eKrEDc)fjacap=Ef|s~Qe#6WE##%^EKz zvqeA&)7iW0qZN20Zq1!|+T{tKYqx%&zSbX^@HN*8jreL{5L%`x)1l$8MfDuuF#>o% zRVF-c=XE+^6LPe5O=`1`n0Al0O!;4=jtz9sGZtz`&>(^$Xqs#)_?;tYF2q=W$TmI+ z!C37K!@s#~&_?!yAm&qk6*UVC9FY9jHJBX8SpHJ#Tk&ILjDf0_*kOFUA-wXElS*y8 zKwzMZOWX7KK^%|FL}RP~rsrL&>z_n}72=4W3%IR$`o|nazs&un;Hto)^y}EWTj}tX zeB&!BjSuLWq;fn`1FzZ%$w=FKvZ9W^;gq4eC`!q<&ns|P$^##{dv?)^o>F@*6HSpT z`m;v~H)_uPNa%jX(4Txxq!{9vZJoqh`?V)_vyA`kVwdDx5{zz$4Y!UKk7O}))SF+dhujv!cY}gI3LN%p^A{Ym4?xrlHxxyAkAfp zG=IJ7+#Q5n@hI9MzkZU-A5S9bNJlZd!XdZ9Ax=6u3|083vj#7op6|uG*V0ORG-q~| zC37zABj|Hn3eU8MkRXX)`@8tP_#^BNg<=VpG+0i4o=o~8(xR7h1zfMlupFNozw+4vN1xXBMIpgC2roWIwY`Sh|I>7kGJ4Wu zp|RWeC&>q~^M%joO&Kh;3B}(y77&*f{Yb;q*=&2GrMjcTzFNAHZPXa{c_@ZwCM)fkRR-O)Lh5BSxRi~Sq99FMw}iaYyJl1D#(P`EIue#=5X9DWxf zDp3xvmUxV|;GQvy*F=?CHYR1-hMr>q-qlQzMAX&qul z)am#5%Qx0XCf$$y>Rg<0bqhA@)PnopXeKldeFK*al|kv! zq&ZBX38>M5OB+h%x~QaHS#r&f7+hb6CoS2Dkb0HMG$U%c{3JEkH$8h(w)T>@xK1Ad zV@|y}s-LfYcqdK1t;0#B+*k@gLFIk*KuD!=nI7J`73^a*9|W7O=>r^VqS`XW930ym zuXXt44?`qL7rHxd;Cf>nh@RK2z4~47Ubal?a8kwupCPwuwX)#$nQLJ(=6I<^jXpptt!A9uXL|6X8cJ9ZZk zN|b(-WLnx4k?#>&+qm7h7z%!4Jd;rD{+fBqlRLNGr8Re8iAsBG0bNV7RoiZG#F@By zS31+751HFX(Y_!1jdp+GcKl-nOz}PGD7UZ8H~N}Wj*X5G#n~9VMn}sIu{tSR;X11Q zYizB8lw4(_D*q6zezQhNoKCD8?60HYr~AN1N{ZdmeB)*zjq#M9Y8GM;!R?ksl&)U4 zV)Lm1CeLQci0K6Kv%*G($0k{}IR`X(HB{PnjN8J8P6T)hTI!^6Vv#>-%&Da@x5di- zeFkIXX41C@R(3PIdk(uawKd6rNbZnO>o^KW&CxPY)|9MbJd{RCZT3slh(jz*(5rJQ zvxRtL>-|@^j5LZ;=F*Ml$>`_7DwAEcTe$=f}dN)Y@rOPUe#2UFS(Zpf!UToU|v z3p*-;v4%&ml~{m~hFUv<90=zc z7Ze^in!}t-DrM^2XC3Hp>cTz@E^Fz+=cQQtD(*_h%kL`nBcU6UqpSpZA}eBW#}_us z<_1+7NrqNF8RLtWhzQY&7u>d{FT$bjj-lFjBP=75=J{J=M79C>(2XcXDb3OK!x+X> z>s{-SQbmian4JCuDtWhPI$Fmk2~^`)I{jw$KB7Xzl^~&=qt!B^2#|#zCapoL)~G>h zCtGA}OwKv7I(%M}?Pw#%=a0x%Vfus&L#swTfDLm=-<~&iaV&k=HwTtdIrL4sks^U; zR<>?><9#1)9NTA4~tTUgzBw zz}?yMq^Kub)51Omg}3i6ewJRWS@JV=vUSlAb4*7=%af@K&TK)OEbL6q=w~}N{=y#t zhVtvVsz>skg97qCkXaP4rZ)Yy#x6@u#g++JGmA-Fv+W}?MRTulh`OB}vPo9;v&W6h zC~a5|PNm3+Dh1i0D1Y-G1#bSM{LOz9$6+UD`BO{f|G#QDf2y?nqZ$qu ztiTHwtiTHwtiTHwtiTHwtiTHwtiTIUd*`8G4i~Jz3pcF53pcF53pWgf8-~ISL*a&@ zaKlizVJO@%6mA#_GZPGknF)r&%mf2sW`ZFxGr^#knP6DVOfWEJCKwts6AX@-=`TFy zzwrL9h4g=Dd&{6YwytZGKmsH<2~M!!!8Yy$4Nh=(cMDE{;I13nSQ6abEd+Omz{WMW zyM0X#=Y5`fZ`G}@Zq@zMUERHU_FSvS9BZukWm2yMe;lu@@&#fg56k?1NwT)E+Nu83PJp~| z53JR*Yd_Bf>!R{l>~sC>0D41|wm@R^&(-=FUo;5?01t>@TTdMe){Je_Xb!QxC_Z`;`mt&k#9*9Hj#ELb6SIPesgU1K{DGq0iH4bC<`&D^w zub91TfpwTFw?Py=3GH(X38UO^u$*#2;zkiw#i6@sN?k}QKG7Wry>nzJ6=XsA*z|0= zG3`oiQier6`j!w5$`>P~EZK88VFe>z4WCk9kMWaybPw;ViFoCcDbiL~bMRt`8siU~ zGFmDsE92dB5bVM(awc?tKhLp!s;Rofuf=LH1=<|Gp#CL zxbG~A(Q9+XMb3M3<*Yhda-Ou9J9a7+oNQ7#$5>JxS38;wPn2T})Cyb(+;(oAhCR4& z-yJ_F*(aVxRk}0V4=a~I;x258QW-|d<{oC`c`+ZL4Nmp{jXN5?*em`Gq4-JLPY=02N*T)%J4;_s0~CI8~#bT!>7 zCSMFGx_B3?q3M%B_2S3ctxWUQn`-UZmb1mX;c-SUQToX`Hxh}&iB}0`q2C^EPE8-Ylmyct zZxF8&TeuLdUR|DasY+R8JGF2v7u!5YnCWC4+XjgwvDFzTi zoeQE3HD$3JtQwznGn%ZFQlQt3Ld~3E0ofu6ZhN@btC3-#)4?azK*R#9A=*Hl$R#uEYr6%YzQcZ zUp2=_rp!+lF{aXDU6xnw7$mXTZCy1IyI_-OzMO1NBAlQ|i%LuL+2{7zqQd9cd>Ldi z&nNl{e4c6^j<&q!lq7u}aKdaJ&e#pwzNqEV+>fPPFW57RH>v;QFaTE%wv9Fvm`>O@ zH%JMCyh&88PbD!&m3vu6l|&+gJ4`n$s1rJ`1x3bs5^U?1i7?rkk_uIoG{glNc^n#Hbpn zz2ATYw6yQj)8o@ur%^v9u@XYA=%P-(<}~KHJ2U+{;{T9g^ClK7;WumSVM>G-0i`oL6Qqs6MzmR@h*l zJr{S`!(*H!0-BoB_dOTCaDQcYjJ`v&o65WU%N%bqfm>g{D80i)Y?1uDU{0325-{2Ju6KV*x7Zs#45;Dmd;e%X#SVVo52Dtt+4G zj*G^;9&2l%UF^NabKq%Mx)F{A;x4jMZ|Gs8_YF&8tkI(PQ>&~zd`>sXp^yI1%$&n) z4Tj{XuF+puW7w4j-trwzc-(mOyyU}Po0u^qm0c=F&ut+>auAAo!R2(W7X8|tt|z~; z+c$N@P*66F4|^rcDD2N}ISJLNTC}1m(C9mGjoX9nUkie=f67U6hyG(BI4(8;I%D`u zcC8#Hci}(h|6|!M0(g`TV7|`AKb5`~e=D-48srJ#oIyz-%5z zD!b&9QR*OBF|PCNW!4U6`i-qfytGE``mAMHtf)?zzS+80R~vVeK^(fe-pA)yyGjjN z5*MElT!>1>SIBC*p+V#M!-)dPvH}mZ`EOA7>O`Ct?Axi7^P}_?xZw{!6-v^laa8q> zr*U}J$?h?Wj%-0yUFn#~Pq#We%b0gCHRW^gm6Q2ta|Yx#qr4CAN*8}^aq!T~xi%cO zVe1B6)YtPeK{}xm+~qiT8^_~2w5IscVDE-Zf3#XB#bLox;W1vblh0k!s8w!P8-r{- z2bWd3Cq&%%@e+o3%ZY-}9L1Q~4b_8%%9<@{PkUp9Y4vmDg71yM1+;wctP;gh&b8Z5 zeW|@8@x;o>{X&8F=Zbs<%>6@h${Wl@%%;cOi(VFD$|f^&3TL-xd3~ppP7s@tzN$>x z@$&W@jfjE))^4Ny90HZ(P1lo7RQeCs5%6Z0pC5&d4m8lirJxR?mmt8{($x zTaYEwU(v8wPb{1i}ks z2fJ>HWciA?XM7GmI%O0Yz}>rNdn-95z!5mjI8J=+rDb0+b($5NRF}(Ea*E_uW*+7E zLdEN!aP5PE>N^2^SKT;Tg5da3*d)Vc6dG~f?^dMFOA}|?yw%3eDV{ty1zp$Ew3SY_ z+L4K3&tr5}XwxV^bIup&z1h8lRdA4+>-RX$QfPU$DVEY3wC3c0tEXD|%q2NDy;N_k zzUA`%IH*ND(-UV1W$FtJEdca5xlp>vj zST^PM7lEt2pBCuDLtg#i`MJe}@z92l388Z0tj z+T&IwNDz6P;FKF*+fv}LX!ws3hvUQxgWOB_!^u2L$XWKcf`K-b$WO`a$9(;T^3$w4 zhT>;R(|IK^5uUZj787iP*9(gC4Y&hrzh<&fa_nb60#DR-&zL>&@jnn}7X4_tM$; zi!8S~oqj1RCo5v<(jmE7o;d$1PgaHVRgQzw@cY9nRrGX5w@W$P^aCCqSqPiz%Brw&|78@G4TZJ{}_|n|ieAac=TQ zL~ut)?EPcws|?YUVx-7s0D;!Ae8%abdGd_-Dck&XS$?5=gJ080{Wh!94aLVlnh9pA zphaD8^HWm`_FR|JQvGFyMztfF75}by3qH7HZ`+sRw8&DZNLFKLB3_8re+q0Fg-{>N z|13%c!%3rLP+W+h`ebZ?krk%R(7vOn#`nCxc=gSSqB{Bx8kVu||Lg@BoLup{=vmD7 zdJ&^9$tL7zNp3ypVX^|{;I3gvw*0Wl;FA%p!F05GFFw`8YV>$%eRy$D0$0{0oeewn z=k<4#4AB?<-lZ>mCeA81WM60*<|{n2>wI)Q4>)^?=C{{O=JcVp#AGI$S~)msOuyVX|~p z^x0Cy%vQh32PnfBzXuHd_|+mMphWB&DHWkzyA^Z|?*_vU-T!90^kS*9Tyl~F7xr+5 zJ?A3=wW~i*<_34gNEhtlf8>A;?%Sb_qHPhM}!HxKUi{g;jvln<%;y*KAV?Bh$ zCHcbXJ85JfbBko%>yK~>FYyy3_eB20c4 z4G>J>j|7N+sq<(sP6gEL9#5mT%5lVKaHUbS4-+5RC zwF@klhdCz3TV#NVLE>J;I(-#mXSo8m%%0|p%?(Wr4O3-KYl;f<66M7wD^k?#5Ez<_ zRcdhkgVg~(s|F;s0J+YMk4(bjV?jb77w5;O=Q6U@(vpkqQX^SPz2#NsL^{5dxy*4H zH^T^R%ggSzmOlt`Ii+Op`l_I}!>nUYTNLj#bG_|yIIj=v7Om2yJsZ;QDkE5{5pi&8 zY5N1}CRi>HQ8W4i{;-7O_53U~<0zV+r0ym1oyHQz;MW=7`NBQ>(7BtfwJw-1o%)=0N%R+@O)@4SKn^8=j> z)k=9T@~`JPX(+hP-j5q1k8hwFT8l`r4{#fFwIMr3b~06hhb@vyihQR@5mr5>7O zdD}RSmgpdRm;I8>bAO9+wj2>18_H_NECb=P$U|_XX%z>=wqshBylx2^6S z?rPT=u7g7fbRMe>t6d49=@SvsdHADmRr(VztY>N-JHOQQ*W3&2hC;nb4R{ZFABp^Q zC|04OrU`=&A)9{TR6MH*1H((_jCwswaIV;Ir$cW!VbbHvE@Bz3eu zTM@Qo@M}hB%kp$~JThMNO-3U5D8ngJoiL>}rZm53%8>MG@P*>rBUrZ)E%YrbhCC!z zobPG-sXbaEG`c-n3EZu=gT`gGBT3+48wRJ0um9W+W>Fr{I>wv28F-=iyXPKO!| zf#D&79#2=N{%kwS?q&WwK@}Ytb_4;)j`G^O5kH@!u`B5SD?N z-rWtJAaaRzX~%OHREgNYl#OSMg6-14e_OvT=R7{N%!Kz~4rW&$B7I;j^O-|tWujDC zTiP+wbEGO0V#3dPn40sl_TCbAh?`Us?Hj_E+FEKe2U<6b`E$(;IdV~D!C z3EQA2?7paUrK~`b`IPzecXJhd8_4#MrDAMg@&;*X!hd_MKUlY&+h`uUAo^e4mR}j* zB$*ISvf>DHG^S6mPQUNj?Wt;4wD$S^)&)UfGVJ<;qsKE~@!I^p`|6tYXoR;HFh(5l zVTx+~vOyw!PV^s$=7YZ~@(q7PyZgC*H=pQ5f;D31xeXI-;dPVWXA?GT&kma!r4iFm z)|Ao*j_e|6BJl}^Ix9wviqgG(kybe2=rQIX$Nxh;`B3Sysz;~5!NR6@I3yspfGq#> zKC1Q~qelHNc5o$p=$JJw{_a&_!HKIdFL{PNdz~?s(n>uOoLd-``2>>=^rxM__tn6X z+~nVCtn9v5`r0%!8wB^GxI4S7uq_fZ%rRc(ucy8uoLAT8^d`sY@Rq4WCNdY z_jnalG`xAIRda6atnpO`@>2#C&H61yts@bx!sJJ^uN&vEIxl&pjr(b=43{M!bG2(k zucPmjY^o6q>8-5PwQYKovl1D6>E91l9R>C*V54U_I2>>$x!3M7DZhM3&nROkCj0F` z_BMK6sfJU#OSlqI0-;_VW~^9SNj0{(VVZkU+X-jyhuHJg{L`U9*P>;IZ^jWL*-|K~ zpIy!2a9m>G2j59vmq`6NVyu(E6sPXBi?(u#C_qDjk={?~8C-l5CF z8Age4GG<})qz|N3zg`N)ba-VqtV|}o0uzTEQWpC<;=|Cy5*J%}Ons#@FOe0D?1Fx; zroY5)e9>^|-^-jbJ`i-o%>Y)|nK+=0R&>I;Zxx-G;<}^CRBq*%MX(r&sl{O`~w(LE7qI5Q> zF^E3Y*mjWTKQBo_M9$atGVu<@^CsLG=)s&4GAm6@3EQwEdKib9J^y7!SoaxIzX=#} zpy8P8x=0+M+V9+uXpuZ6)~_*$&D~v(jS>(ka1d8TpI(^Vc3`TVJ5>zT2&(Ll{~3$M zOSxgzU(Eb`&kQHM3|mWrZch=kXI2_jd*T9T1lWi8CLM9W_9%1NbM@kM^`je?fZfTPz^w8JX0D&l0`4h8A1efv0VZ+4jX}!az z_+le+NRsxi3u)DUESPKlEHELdTPW$P%ITSHjur;*9Ci0brkL%16l;YcP{?CnWT|4?`VH=@kLXnm z=A9*?uKY_VlK%aEtdj2GPzR?elIy;nmtPb^QfZFxC_a86Weh3v95DnVCgPccPibq{ zw~GaN^ZZi5R=PZ_2$&i24r4fnv55T$&5|KZZoy&_!;YFIL--;YDXy9`EzV}BEAUj8CEAAAu?6o*Ryn z#r%gJ$-keDZ<`MyEB9R-#iCwPs=JWFA*W*#On92TPUv&wtK^C(OQvN~kKgif++`Zc zblUYLylDZ(6e-0obG^3;WNs>2HwZs45L2{YGk!hvTsjj8v2z0k#bbTDNU#arKlM;3 zT4V@(nHuZY5}f!!jlb^V9R>pn@ES_Bnx_xq%RYUuVed)aS>G&bT(xM%R2gvnI=F)2 z9>Rn~0R&`xp`$>sDPl0kMD9OUgiC=GqoF6U_?{ zH{f!iAVI{RRTuztrjnkry@f5fj9<$p;Mv(++V7d2K^SxljAdI70pt-LAc|G z{nwrEqdB5=ybh<(Ot()i~;`E@d2izVRuot@oGe;d9<4xs3M+^oG6 zuD90s9wK&VTCY)YemkE+h>zW_Nc#eN@oc5Ym5|c5N;HbS8_wNrr1^?>q;6bxCgoI6 z&~F*JzT{s_7aByc_iKl;UFGNI?mP@vGZs?iDhhl`M<^_{NBND0o6@7eQ5Fc*2|R$` zuEuOiK?cnbdt&;CZC9Bid2UH_5v^#PHMoWNgr{L8(`zkN6Bf3m+;! zc@qq=KPa3cZC%L4omNHZH>xOY;MXg${IS%Z_S4vgQ{+gJJxO(U0`ASd#r~r-^r=#IFOSC3|8ae)%qwE5Wu7PU zF9Fp1`)P(XM#uKew zsM%yol64pP2E$ONKOzm?kA&cMQG1=LZWw1DPS+6OeEgc^V+_(EYImG4eJm0ptgf;G z!8RI=*Z#jV|A@0Sz2QR(vu{6osUDmz6E#kawFbw|M)1mn@fTDPU@Jz^cLvLMpWR}j zM`46m(HByLU|?64u>9Xb)L46tpY6j}BL@en!pHDDUWO|D)NY6R2jenI39^!quEQZp zIhlU=Ed8RqOifJ}1378*lbt38X5#3lBw38PIGv7R6J6a};pdADMfO;@C}iS}F0PJI zZ4=VfufiSt^jks1-^yR<1{JXSFySMYg|Om|U}8j+`jh(FY6&0_yeSbWZfKIHo z&ouW)lNI4UBF=5xJyCmVMuobhF-h@TsLheWlgaWp#dyB82aXOZvUL~@Q*_1ju*K@4=5rww z$5JR0Gw}p284`akV*|=m%yTLkxAB;=Au-(jy&Sl@8DK{Ve>m7>cQK$nwUu7q|NYp` zhXNnN>B59Xsp5MG{BM+qaCwhP9Fx~`XxJu-f!cz$egmJS6fuaj%1}PIRvyVSRZ;G| zV<-1Htn;+qZApp9sNQk2Ha92?Pm!T2pSIo|Rcehg^OvjLT%VT_K9KF}n<*}#N4ZQA zhcoG0DGs5w4i6;T3RV-~@EGmihSt)#!E!Cv)>$^p(G%g=V>iTEb*8fXS0j7uRK&?d<_o#*k-=EVuzoM z7WM*;m5wYl+$)q7_e5Cil|JilFQX>pAEdUzVi9_*vRzgBjT?sqDnBfXVB(rb!S zl>HFS81-Xq@ixtVUncv&cKQviz{M|Wu({*U18_x7UQY%88(}WGob{MisaMgkG@dDN zjNP?30@<-u_xL1DR#z#B#a@-b8lB1x32-w`5_OBKMV1cjAseaMLe=GPW^y;3bx4Vns55`t?k1@nxcDqJb1W}vV|xXy;;Nfkz^#z%a!{i%<+YeedLzCJC2XqV z_}R0-`Kup(s>4*Tf{hry^f2y+; z<=RZbsu|@AtI-2AibEXq7J;vvvreCbg|}#e5l$({UnsDCkj?&ue z!R-k7qUv7`KM!gaFvlh|@7d|miei@b`SlPncib`?rJL``3eAHd%S^ST=sPK+83g*(lca zR8n2Rw(QQ1uZA7X`bV!R2Kz8bB6JnRx=o5DE-5}d(?MAK*%F|u&}EhG2ck!NcZ(^u z?1pO1rQ*>ammFRlHtl0%*}KR!eVbMsQtFK5Atg>Ez$Hqg>xO!%y$f`*x{MGQBHn^# z5KZ)7-&u_f4~Zq0G;TYc8%j$Lfj3x@75HSB4i zO+^}1p~l5neP6#MR)CDs;wlKIxZbbI&ypwp8vyLev-xVC@Z?fCl2W>@m1~~$4PY58 z%jGxfwY&(o4912%1x^X=8t=nD76XNfz{7wpRa?2uaO)d{5JuCfQ@8H8B&0GXC00<7 z??fsZ%^wpUHiChXol-}&EM_9AUic>lT)7|>)&1u_hZTdyrxw^p(Eo&UO8=jZzo_^( zoaJY;;*3{&W`AgDvbU6ff@WFvC$!3>_)!xGtMsa&7OsVVq$h}bkM+a< zR^|SGs{{XEh2Q^674`qU4xF9jpMv2>&DQ^)WKjR9jQ+36Z_twvD(FcG74#&93VPB) z1wDzOf}Ye+K~Hk1peH?4(32o4=t&V3#PU>w{iKNsdJ;tiJ*lFCo@7x$Pr9g}Ct+03 zlQJskNg5UOq>T!C5=R9+siT6Pz zdJ;_q)J^}XDSwhp1wHAef}Vs^K~Ku5peN~6(35s5=t(>k^i-k`daBU}Jr(JLo~rag zPi6X`r#k&dk=(~Zeb7^-KIo}bAM{kK4|*!r2R&8mgPzLuK~MGipr?X;&{M@e=&58M z^i;FY{8Y2g{8Y2g{8Y2g{8Y2g{8Y35-!<=l!S`=?Jr%t(GqZ8B{NEJ4uQxB2(hob} zoO|7e-oc9}#&7L!?I(ZqY;_hf$n0pDR`4&n(Odmi#zDsG(~%M9?V}6AEj!kOgZ(I` zBK|>$T25Z1xDay?N?rpT!cjDYY_pDz~wqu&|-9vB9+EHcB@T%7knS zZ5@&szwTzehSuFas6PBU_jqyW?S0nzaGauh4`sCRa5%3OzGi$#)SZKRS5G9~9iL9O zcDT*C)_cAOqkX@W3B6!!JzgJvn1vn!Uw8JQ)aEPkl^lN=seA+Sf3bYr1;do^JWu1~ zCh}O{l~`hPo}S+OQcY7yYGPCDB}c%Sx4y#52xk4QtY`h`-{mP${cMmi@QoExRj3n5 zg)+lG)1G~#;8hMpMBzEKsr*EzL=&N~ieBTjsUU3*?idCHRFVYt^C^Yz}RAelng=!VjS6vj+{}s?=O%S!`Dx;yDuAsG7D}N8{i{2vkvlUyO zNFICcP1Ae$likag#_ZYSk+JrT;Px5^k5CIw_5Iz|JnpK5nCnOJJ6W>Nu@5{~Frd*{ z7_b#!zd-z7j+hGHnKTy*z^fs&K4aSc<-~bBiuIS z9osSL_lEZ1^CY<$IIO>i{7I*#ryrVxRlg81!-5D+yko@B2oNVIa$T7iX^g-exV`XV z3fV_!oEqt>X}T!x5)TBWtg7utw{$qnK^O%t;us$~8E>z3uOb$aZ5ieQqZhq^clUYs zBG-xD5!co{bv1=xWpLfi^QN~uQQ(U4{s;;^xP7p-ZM}H7&#%q6Mbq`{8K+0v9}Lp3 zyv?}n0vfH$HQ$9W3OvLStuQ#u{rW>Bxf5tiiEL;WmL18#F>H=?VSBgeedB!<^pF+W zpmuS*`a(qedGaP{>);7}T-L+V!&UL(wdq5*z#WJ3l>LzihxP{*g`GFHUybhk7Tr7= zzo{gSQmrr3qlGyaW<3l>dGDh=_=vupx0c>|^+N?Ncne!%V)5b5`^w|tPt^S(T8Rlv zSj=fx&z|nXkh(9wX||hA*Ee3e$TZ{KhrNe` z+J_?!{2T3;o>h7GgVy>BhEb4h;;{GxcpUWyX)K5QcMYO#${dvbYC6w8k2?F*Z0t*}0!ZFM`15P56#5mcJ$^%Cg29f>S);auWiC8QfpQOi& z4X*n`liMro(hJz{kAmpw^EBGEYQEf8Zq}{ee^yw94JJm>#e)-3 z=z&ed;|7Hx9y}ev5TB$=tb^*(L8vz17qCyZQ5H^je{_FTwQs@5GW;1>KAevSRVr%J zmNLsjqlZ(8^u!vXIQBZKG5eIh7P)4(eKq3JH6=)&A@r2Ss`*ayVPkJ^&-D&u`bD~8wkbYKRGa6J2!v2<|vSOd=( z(O8B+b%k8MXXxmDG{OGUg8ABM;adiM`mRMf>4Wu2~t{N3qU(aBjj+nDQsa$sBMgaa!BXS51wa{8}kE5Yk3(CSS;D zph%rKWOzS30HNS@JKy@yf$Z?3uKZQ zBc(7*@M2>VOq;w3MJ*zYUxqhH295|s+htWUwhb3zABzk6Wv51{!*9IQ)Tf~`Oy3IA zSD%en5z&oW@YffV6XIe}28|tr^}m6}DkM0t=hPHRUbbYWMvUU~@Q#Xj(PGQ)tq@g# zarDX3)+@k{prUfu2df!OF6Gvx7Q5AJ)j~$xci7cM?2Zb}R@796dD=@aAP&r3X1jHa zHH$xg)M;Be1s;=ytEGKU4JVCwtA0sLMTVD9LTxx$HBaq2mgsJ0@D^%cf|JW+6IA$} zLz6`hO?FI<(rdf1bZJ3>lt0|@i_Xfjo4UIyD7BA)4k=Cl(z*Y*6vtsFUU1!I6 z9qZMA5;;1p60+bV_j#37CPA^4{jCj0hvtA>k|*7qsxc$`+xCsb)?M;i%njT6<oEZ&E?Y81YrU^<*r-lzF6aKV+XJ*=~C}hk<2=tgC}1xpiB*MjUS_ zwReseZ&>RO8sE5qWd6~2Qw?bvHojBoFq%Z1cH!ZwBn4W5$D`~G+m&RS8YoT;RfDze zr4fhZb@kTIjq#Oa(%f#mI+}QoG;?KVXBwOIkdKDxz|T9~;N#xvmWx`hL-&S)hUhpN30w>>*oCVKjlb*Y8zFfWFHvSf%5BIu8wO=dZf^Q)Kgqycnxfoo&0ae?Wtu?+ zV3~bM@j0F#Og6m8)GB9ps`i*ToAt1`<(;7b^7d8HxMinyQ%+zMmQB*K#|VjtcF2%{ z)p~9Z)o}EG5^4U0FE*oJOmfknl%d_kLF4C`Wa-lqj~@@xU8&dA`NPs1%WA3(yV4s& zd{d${YHDKBA};;D^kT8g^tR==5`ndDGF>b*qw{OVOtHwe$IQ4Agcs*Hl7V3h)^ew^ zfx>7PmgBjx%VCl8Nvg)fsSc}}mHkCr(u+1zx7${(kdJB~Gm=nB`(=9qYne5$-_0Cu z3^lijvo`_mkP|FCT19!Z+DjPcnO7DjLn$by)zuJPr5y@L39MsGN)0PM8 z*RozXY;ur9P1EHBf2GQ-ysa;c0Dxwa=t=2|%fNA<;nNosHV6_wCpz{l)ALdXA%!MCmBSnerYNsA*mp+DfN~!Byx{)nnwbqc?R-~ z$IjP_`Dnawd>M|8zZ8O6+U&6RxeoKVV#{uKzc8nL6}hk^<9ig~AfsK45+a_*t)g{>wF6a<|0uzvLzHeEBibCCT2< z#All~~8cQ^$^ra76}^(+8C$ zmNCZiQ%r7sP+|4^nqSn}uV+VVc?i&JAEb#DKJaeH5+}Xy!$AX8gPifNeBG1=Y2)^a zwU~T5EhpOd#3vpSLR#2k;9Z-fvd#}eP0I|}a4(N2OMB}msTv;vj=2KR8eH${5Ni8N z`>Dpgko}kTTgzV7+p*}x%yWXBE(Ka-J6$i2^trDvEo9oK0;tG4G`Z-*V*Fhl4;J*u zNf$Paw(cT&ZW_xrNUXj>}gUq&cEe1O;Qc!_jmTh}!jZ5{SNdURIpqnw(Ue z)(!AQ=_JUq3CGS3gL6RON)Q{x;J+Zuwh?A#l%kSkA!WFe?NwwjrZEMw20yp2Tz#ID zVwOe8=r~BZ&h}^;ePK*aU{?T`ojpksNn%1;*S?r55iRJ_63UHiT%hMvBd zdhsLK&N67vj}rBW>BcY+CZ=>`392xe79EM1)gR??D@O#(>YQfCob1U&I}a;S!$TlxQ2# zzHZ)0|056&$^}5e5|83q^Iq4PmO$sE;j^0fw2@1{KfM?LDi?tMf*4wJFZhxE6r=oI<=M4_(-;z*GW}f%+btIob#T&?&~4YM=m2yUH+%Sf^>>X+ z>;ljWfS-hPVa1p!nz!V7D;*uDIVJrMu#>%;op?t|B-~L+d(x>Dhq>Z3d_UlSi9Ht{ zmOoOwCn*tQ8*C{l;cnvhUvus%Iol-fAi!}+Rd}XH*g$g(_ICw}y3{wN z#>QS3fpz)y;91$8@R$vXM@nn{Dx;wf04x1ZnEnm#0Is=Q?=bY^WUxbO0|oNMP1%!4mSARasVuPw3d&FXy0QZ8g$oUiIdzX0x;#Zobdp_OV`rI zC3EPdrj1RFyGk2FEu{ST)1MvP|3I)Svqy>Rb2`BaN8c?U6H$TBGGQ}gf1Ymn>JkuhG}+r)Dre(^`a<(a zaF4-OTZ>BvMBBBJkf*v)X-U05l7sMEP*}Z*hFJ6@TP@$s$?KIc=Bp`Z?NsDQ0O_x+ zDww+zo(r?J9#9kW>=%D_OsXx{iJj0V0*27+o*^r6SEi_Z zW5+h@x+rcLw+t6fJ3ddvpO-0 z>UgZrzO<)UQ+~Zt&{zsVFHQVLO-dvu6^!;3_H!RPa)j+iJY*vbSG=hnvYubz%+DX^ zH+BEVX`SwITK^g8F)4RJ2m1%eDlh1K|Nbqa?r$&-%y*>_QQTj>9362HFR3NwwF;-e ztn=^V$(`^t_7~1_AlYwDEWic%2GP-OPLUKALWEA=tH*grBdq~KwHNZ7Z;1B4^c?kf zee0|fjUMD$DXXZTPL#e!7A|e9kNTHV|ANwp))GkBl7Z4vFM(i%Uz=`6?Bx;DFn~qk9h=n-j(Ej+!Iq5i3V@zDF7{CXt_Cpp?&T3XkZ?cp zY@7IT5-{nIM*f|2NKyYzIzqeysKW(ozywawv6FrmQo?23HrRkuhi8}#CXZUgTnRjG zW5mSyuXHkMe6V_AU~7I)IS47+e$R&~ZceTAOge%mMeF1o9(Re&`k8~`F9{pt`uM^O zG0Ab+b^GeHVdErwkc@TkCOcraNp^nSh@RR1AYO zCG3wBeTJ?FH=p?uR`74q=&a zT9WhkcL*Ym8ZTc^DwLu&iw!_x4Ykx05>dae#kEZM#f6iZr0&$@SFIx``;R0&^RSC; zVFl7l%$55M$&&g|`%!;@Ticp9`hihVt&fieNHq@NR)AvBoQSg;_$WHYYvqD%ZDle` zWx?~id)D@>14O16tU2J>mR<7xvP=d1lQvr+;3WcNTek01<%);Aw*AOf75eRM|A)7? z0E%Oax<-)%3l2epd+@=7ySqbh_Yi`+gbYD~Yj6g485{yZf(3$0fB?Zm@Zj)z2={*W zf3N&pS{mIYwvw}W;H5QG-he!j24ED7Mt_1`?Nk%t$K$fo4x*OgqFFlH#?_Ho6h0i@SOx@wN;|*XE$KJ-acZC8(|@p2Pf0=xDSmhDIXXzwVd5=_sA_lKLx6zGc6<-YWlS{6pvJ$ z!J~wkgYTg#!VA(>zmsF!>H-0V)l^u2S7`^ML-LlwUPrqVS=e6~LP7x3GC{8STt|+& z4=hha{P1Q92n#;z$iqq+sw`-^q57X;{YH+LEW6MzHP(wei!oeytChcb$Db5j6YXFg z-F!?2cw2vuk|Jf$I%TeZZ(It%bfU%rvP%ZA>{1Zim{J6!sX##6tS#A(Z1u}A;)BJm z0N=>aby#XI55599Ra6Rm(og!qwvlc}EY3UAV@P2`-$R!Dl~MtGI)##qkWn55WD@)@ zNX?l5f*pC|M#SH4m@wG^0G%_&r5x|9FH@PV0rDz1Wx=PGDL27TpNG!KrW^?Umgtaz z=7+*PXVU3L4XwbL8Ip#*8L(+dmjYV|8)uXK2i`#XnP8aFVDufRo2Zq@=$1Tz3{=P( z^Xf)5<1fR?n4rk8l+rWj{!JSq+dkbF{5*K8pm5FB*&UYuf@^?b-Gwhc0(k>%KA3p3 zrKp5T!ge@Fm|xx`{d{{0^$>Wx7ef!(cZUu~Smp}6v|iPsx>C?O+)Yp%>7%;7sK(R} z<5(6YcI1ea{$Zs@6G{1mYY-cTTT9?c7yxcjV00_^TU&Io4kgEP5f9khS0$D>gF;>U zVLt$l)vM>}q@`lx;-M=sbkJ6ipBZw9E%*~)WCZkDtyIGR!l;dot7F`5fvNyTWT?ml zDv}jTgNvOouep{Vq^nCtJXF7blrA)*x<>GMryt!jYavKfSO|Eu&c{I#pcjR;0Nr<$ zly?Ee((Hb#M_kF@s$J`E)vmSi!%-I{C37&`ZPde+Bv~*fVG#olN+bv7``&8~WSBp! zIAgJ04r+ltjeu#i9|Q%_834KK&wQ@RD&Qd)8r|i=@2ao6^cxR>aIXS(@g66n?GbJl zd!Miv4L}e`RvSEBIDl4w1mvNW9$38<-`@eCj-Lt>Mz6wDY_N#}Oh0wrkJ=H0Zb0iU zzJE3udNMcpBCxGoBMNX=rQ(!zy7bUYh1&ajG=PO#!) zh@th6zWNS$BrjIT1~RH^seb$<+pF|GHI=@}#QOSf4V6Bj2|^zC-98NFztMbrKe0R! zSeRuCUwF#6QFqU#6+pGa-x%pTrePdLY}fe>I4icVFZ4z=0lWWpUIQr7P0{rxlgoRI zr-9O|!RXgxAWr})t0e4q0ELoG4t270OGcXsjyxC`%k56%~zyds3H9 zWeZ#LpoXQPmN>95>hT?@IqOi00lWd5`!H&W^U|9xkG5w*x(-EpSW~oZFr1ysU0H)~ zrj&j-#c(r1N!_1adeZUP|aCb#MVvD~nY1y(W{!}h=k^{1=LyWBAT9shIsN_kY*+2`B9 z$``6DA@aGJYwCTS)D-#qC)U#$Zbu_835m9({~66;&HV4t{Co6H`Jf-?OaWk5ov0{P z76RGV;xMKeLK>owU)7*)>__U%{*7T+L(nAaEFl~B#%t#bM&PRhUYHx{KIy-gC(5k| zL_!CHi@a}Ybrqoo6_$`=-l#UiZaZ+guk{=TAcTVFQ&lo2hxu7fAM*D7HVz z_B|5TJ5?e5eC;3DvGYmRM-7>WT}8!39CjEf6F%M5P$e4#K+TVYw=S@t!(A_rH zvA*}Vcg|Mx?}^cl!&A-2ahZO`7>mnaQcl$u^IZc zDh_Q7tPiT%U_GSQLxx=6> zpL2p3Id7}E#jWWqa{YCt?*0JTz?$KwbV)^z9Dd-r4KAePXbeW5#0JYrG&dMkQpKw{ z1MZQhZv?th5O3(mEfrs>&D4JUCC34By`*osGEpHc{Q8UHPnIIVzE_;GFSVXV(l{?{ zGQ2RqnfJrIUKvPj)Yfjgi(}$7Qq7JuS7^FxW~|g#;H;8is-=#L^*+5hNuX$y#@~@} zC~7Se%Xq_VQWtBu8sbFNI2p7*NmA7i&z$cBe8DJTxkQ>E4!1J}I?thQa2rqEt{lU3 zal7!d$(l(zQK!USo|5YDMSOK=XAT>%8hrHxD&Kh2dmEn|{yFZ-OFd8?r-RL{w6jNP zS&)*HUSY^&6<1YYo!vD;>mBkf0t7t%T$>e@*77$puEzo46I2I`BvqeUAFO?J8#;_l;Gmk`O_=FVP2aSbZBu7ZKL8E7whai_kJQzx|ti zjDB%Y_iD)82K&Q$+2v5I3I2y@s`QJujI4pgH;x-At|wTVgpB_$eFt5FkB8o<14p0a zUA#RCH~%bUccCbsyM00Tvwzp0vA2!9>P%c>Ec+;hl|VwpKyZ;C za_QmwqrmWjIuP|@W5boRUiz8-{<}#3u=dnwlVySI>+RhedmO|-jEgI>!tLDN_`V;B$+B}J39Ktnv%Czn4XcJ?-$mC|bOk#mnTmr>` zR;vCGZn^}kj=zm;@0Px{db;)W7WaY;GhH9bz8in#aAQ!BIEOL<%D@PA ztfyM^&J>+)f4PyLIKH45^uhi|q`&2`RfHZ;ivOPUbro7v{`$zA6AKHm zh983-J2EZih5ldyQE6JU;h?U0Y1oJu3kEN?;u4a665x_>Ev8w@GL5WWThxr;S@9Cv z5SBcl$P#4YWV&R`TJRBzjN&X>51J<)m=!|)*ql?D9y{O12ics};WsIm?4qZUU*>!& zSnuiDd~ho6QE9N=#}KrhYyIHVS%SyXd_e+e}%;sX01neZ>r<^8u;OK8i<}0_t@>wK(z`Hfm&~gQD zTuB}-PsIxbrKDep#P5$SkIXZO2(fz9z6>Fm zTj&Jq@v~xEEUZ#GwB6CuMFxwpd=Ioq=oO=!{t4m41~&k?>mzemLN2c8l3ggKbOPM2 z^rgH{N)#!1F^RxNzkH=}!O;wzOz(>l%y@%m`Bgt4)|k}>&x$R7sZV6!Y_MK&W-@sP zJUkirAK+lp&8|oKQr-l0Z?)EbDaA@B+He|l>ri^A*<;dwp&qPD_0cvXSN?auPSdVf zd7=+KINA*qOf)qijP0Q3wkhVgiATooj@pCd1-Z3C*8W)_TNs9|ut!1a@{&t*t0 zwFm2nSk1Vw1sRi^Vzrq@&F$r$GW^Hx$T=i)P7%zWaZ|(^1J!-8a;p)4#2T9HbM7MY z{{*$!)O@s_)d#3qkdq^shsB9GDjk|p$`GOU%(rpNAk@H8G%;A|Ol!OSdx8fW5oQb- z7#?N}4uCL9>o zq36KJXi7e}!CJ+GkqiLAJw}*Du8S8uEe!%>JfsfM#Yd1v$>wc>#yogv6&f|&M z^9M#KMhG=QRaKq#l;IM_yx33b(0a!0g7vE3o%RFQ5iz60J_h=MhXm_>bg&rgb`&Kx zY>^ekz~_qlu{qGeeL%OU#uRHeFyq_WE@Dj%=I*F2Mo)Jn=I*<+7y*!#Jz2$4VYtSi zw~>A6{%H-&6fU>M#Ht=G0AzZM%ln$adV0yFDvuvKAq!Zb6JSxrn+WU z@0elk#wCK+KfB-hP7@^USB3QkylgL3h9ON5+d{KKV-st~$Z9Zwx5=puOTcZGk*P=9JixXQIhAz&!fDnLpCk zTGnl|MIbutNQOY>gd#i!*)nD;Gxxyxa?Q{>S>XF%tDIj*tg~pdKRwK%HB3yW46)(S zH4-@a*mWD9i(nvt%}G2L-8{7j2W}F>rV=x@;Bz{`59#-W{`n8wJmvwnAr}!jVK;4!5I7sJyGjP|D@nkt^XVoy;0vKN zvEia^Gs=xRVS_z4j{iasSeQ-=Vk|1W*pUEFuRiefz}$ZXqz6DScG^+<T5%r{fm52 zJv~i~gGU#)$|R9-a>F)f9Jn-5Qsz#^Bs6jNQHgdMh`qQCZ#;KMB7%XydlJ(V1S|}m zf_wbP6=`)Ed&aeww+!mt?P)g#t%uYqW5#5_8IAcuL&Jfdx-;e?9V{oOLKms~E~a`) zObzYA^}R#DJq@SUeBgFtvWBxD(hSf(WbzNW(6}o5J6BEN1Ps_pMP$NR*Q=e`Lc|PJ z7b_BZET^R;&y5Qq_Cb%xgo38#LekpV>(m>*u+P9M~%;4_fx)=RylutM48Zv zwPN_9Fdt9`ee?S^$uAPV|IJy|ogq5Eb!bX&kOeQm?fljNs|Vql_CJE%^!S}R zTw;;Y!oNYSg4F-9awip2Q`DP-CIp|%`3uPRv_7eQUKAy+O6g_TpJK76iQfiVITW|OhTD~{%xcls~JlBGzxzk zJse-p64T7+i`0Lj>!#GHB+<)Rr2h3qpj-dR+O)vQ)9;Xlz7a-$$6*%W zvuIA9B-gX4z350H+pxQ;5Ur75s2B0DM(Kt=Y_T+PzFRmxFQYZA2C4vC&mb)l(gX6K z6V!edu4ZPKN4czohP#v#H>r!pl`uDBO%hQQPPI1`sIBb-G50%9T{LDb?kJ5D?hF@azNw)}}Q%YUCsT)M1HYWa^ z{hk;5Z~&-vaXvT#73*O??ClVS|EOdFR|u?lZp}N`28!Moejgt3!pO@NqOYkGk_PJq ziLYZ$AhJHpH0rz0Bz@jp4Xs)N(E{2?#vOkutGI=_MwCQ#FFfF?Ig1BQqVJ+@#3r&S=$ zbrfvO{RuPm0G*wda|^Bkk#GjL-YSW|IhGz%|EKnc!Esq%JW!ey^A;^0wKTF z6#X%$5F!!UQM|r{W{l-;!N7hc*F?4JC54e|Wumms1;`G=%utco-X{Nkr2*A8bEu*W_IN5ubN~8++!4Trm@#uL}=z7IM@p*lWma&kLnVdt850| z)eb1EOU@-zPm@c6fFU^~`9y?f+Gi>h$@uB7y_=k~aYh_gU#^8;87nyTI=GcB4pz=;TlExpUEyH}X7Jr7W~Nklro=7x?+7y@HZqm=50W7(;*5T9 z<<3&YCl-gZU<{gLL!qSqw!749{nxUF&on4*<{ujHWBF(GC1tRkZK~@=;luZaG=fs@ z2XN_Ibaa!|QbQsGO^gjSVctQT1Jgepb$wTn>7Odxt&#QYNfxnYssyC1fDD%PK| zCM~DXqAg~rOCO`M$tI&qqsy#mwS@%-@avcMzE_QYq%lj#zUQn^w&ZT!0Rx*>o_}oj z5W=-XJHU;~eKzpjGd$!BdGedF^QqzcVUl&<3ZEn~{4{@<^=Xd0;f$XgYW2xJ{j&UB zPDU=CisxGn3F;9F(L<|$37aRDG?X>$l>&2eXdHrRS3Wwa35P6sz%cmpX5Ag$G z2q%8etRuR5Y|6+E957!@_P(GCq@y2PR(6Y#p4riAJ696F8txnZl8q zT2PHFPuBGT@LJlJw@eAAEHO_DHU@l>0haKb#xxWJhP^tGp+Cf?4?mB8VEkYI$qQQVLF2P_v%O?cnhoF+>+~;;hKMNNbY*+Ss|u*hct>zb)$O1T7UR>9&@%CbK(E& zz2~ty5BgRS>cOiR1Y8?^NxO#;l%G~he_&Wo^3cz)nYAy7=9R2EUFTPu1u!7I5)r_Q zkG)X))Bt)ALc;pVBb6KZyMi;719U&vW=Bp+Oh`f_#z{hfC842PZX`TNC*(k0Y5GO> zH1`AM1{sS~x&Lisu=+!FKT@lRgc5gvB@;&oN}n3sXOjAV=3|}5MnFdJpqwe#V?vvfpi&MphJmR>Vv2Y6t*6ICdLPMQp$?LcgQ@ zaHIXaeookjAN|xj7*6fR7Z@t|XUduEHGPX2gfYLAIp4f`8sqqD7`5b0QK|>&)(Zy{ zF}ndz!}JzOlEwGLwwk|KI4oB^_AJ96S$6hyBOG2%8vodN5zaNbEPIyctEW&OAe9KD z_5(}4eQ2rXH(&G`c-k&skskI)a>PN<*0kS7l1W)T0N?tLdN77RpQKPbs08gLQ|cLZt6-!st=V z75efEEuSf1r@x}KTXy9;5*HFlZ~VYKQcTLkpG*^YHZ;lUsg!tGCFx98FY~gaM+Ncs zx85^M9nRyGk<#6?QBV7B&70GvQD(Dbx4`$5FCXQiBFFzBlb(I@g=+2+UHp4``zLJ6 zSJ<#?#V6SRd&HF7JemAbrd(E3xgGb~%T=1m2JeuuM`OgxpovFgf;8MKV&h-c6^{Cx z{zfSQA-rI0I_WiGDR|?Dnakvd9VL`B`rfWvbLrNrhmsEcb+M|Z7;C8TZ8#B)6Gg>v zgGh65ZFRYe^9D18;Q0G_=-Lm2AiAfC3(#U5D>?8gO|~HJ>qm)HWD3i&>Y5}`XoW0_#7pbCBU=aFCJmSx(5&TrZr7d4v?gD5+6Ammc?0 zE_BDnK?cnVvhN_1hp>aYV#ze#Fdm?Yg9oov{Tz4Daab;$jc2qk3P!?p!~@xF;`-4!kF-TP^;UfpaG$C<29E?Gs6_eId8jeYA$j&kFAD}mmGUW)raW^cP#u~l{ zD8l36zmA!LFRSsM?neT*@|*wC9kSy;y;OD!~B!~@?ZbVL`glK zr0X8gC~$z>BvaEPq?&5?;5)bei@_1bUlNYg?fZZ|0fgp5JXkeIolj~$sF?wONaK}= z0RMek3s{wJD(MKgW~^Z;e0JQA7sW;L7ot)%6_h*E0h6}}X;@{W!y2Dne2 z^#zZTU(UcohtfTR`9HRjeYNg+{)5d-B^kkJ z2xy4|rwi7S6lu8PMDvF2XKz^Wa+L8alz0(>#raEawgl1fi7hV4eM5fr=CTqoL7)Q3 zZNZFhri7z_lX4uIZ;}z{ssEdk{72+Eh`*9iQD7{`_MOU~K|`;!Ra?jJHeB*( z-H95fcuFH0B^|9ZGd(3H^mluU?YGVwlbd@|cI2S;JKy=G4b{Y@me@u!wBEf2=QrX+ z-=te73nR6bl=9w)CnmFvZ*A8lY7WX8_us^&r#G{w)0}-YA^8yyISd+ zwc2;LFC^_xW5in%t0;6-PaQMZDO%5f?>9Z&6(kVyZ>Lc`C417bJI8C^{N2D>!7(}{ z6tzblxN66edveXhRO{D@8n=nZi{1plwKLduN?x5m^A%oZ^}J?*nEoOYRb(WYk$7jA6WdYnOQV)d=7g}4;h^=| zzx+@}cJA?8Zodj*B&7%+aiKhwjKE45m5U;?l;ptF{p3EqX4u1KxCpXqaJujahKQA& z8=@s^bm-TevH!qAL;CKewyh@ytZMdv};3i#JzcX zEZBLnmVNtc^tL%04l$?>mPR>3oo=vDh#q zGN0o35;Z#Q&E@A0pR2}YB~z%l)}NrXpwrheXJ!*{S^2k6Tu{8Fh!%a{`3Ev6*hfd{ z-`?h|Z}3yQW&vF9&y0p~O8wq_h#y;5(g=ZB?N=}QRCC*$&5bqs*70bZM9Rt{Mpa7U z(^8>3d$jd$^?q>X(EO6tE!%W@?(w0RLc18gGvTO0>9KRN=t7>$r~95W8Z3f=>6=dk zML!gt?gEl$Wx!DpUyiMw8VHG&PiPLVUUZ%xi+=J8#CRKH7jZSSZ5OBYQuL)x?ocT= zY>NqD`)ql-$uq1a)yD{-vOO*Kh<(h_apRG zcfDBiosTT_W;nc!WJ=ByWjmhotoA9@EfdSuB~xzLG*Qld_A7<7st)bXO#}X5SHNr3 zmv=s00ot}vUs+^7OFuQBZ9jVbhIo6(&qU;DjiGR~ZpMC!3i}JzZe#D$dZm0TgXf;z zM@gH$2Ex%y0lH;HK4`KVMTZ9O*SAYhd=^c!H?J-;iN-dyH+}ambTt`26s|8#I-laR zzeo?im`}TYk)DiY`qJmLCx83E-|A>LLiO<0i?#RtvEZ3-dDad@9ynEYf-bR-WxE&O zKq!z*YDf;EtGd>JZ_p7=0KHf;@i~=3BXb0?8*Ar&ZbX4SzS5`bl+{QZqvhIyt4Xb9YiYGK7Uew zaswsQ-e(9Fsp4I(lQ?eBRpn0iNzJn59s!&t{8ep+O!+fozcQO}I+8p2&Sn0#hpcLw zC@@5;*Mn+R8`q%p7j-^^DP+ov4Wr^S=xwoKD!K0{K38+H4~nT&*@P2P<&1rqA} zk;vBxAPAc%R{S~}l&jkKBNXFo5(e*N>`tV7IL`3LKGsBpHbFa9)JQS=+0Rz6E=48b zPu;g)yM7*QMDDnenk<3O?)AQLoc&dqf2-<@Pl* zBn#i~)j>Yd;P(&PJ-6aBDedqeRY%M9uWp;NB6#*XeEJJ}7T zM~n}Z-p`hf|9b26^nS<$}0qsG6@vPW~)0SM(rH|lRZY-`BS^c*v?&V54%Z5 z8eZLC4{GzIr+l%U+R~CJshTdXd?_VdkY7wkYuNb=Z=0qv`REqXmj2mv$0iS65+ZX6 z#q&o@W!%?z{_UOdc7~ahKF4Y6s}Uc7_sxn;5_4585yK6rPE$R|8WQR7(GTtIes$*!sow%fqaCc#Qb@K8 zO_C9K>4}b>bWLiwl1GI}!MnV+By}u{aSUxM(fPHCG1f z$+gj(;Z9MzR4(yVXz_eqDad7fz20X|-_ttL`|&SAis~TG&#oXMF+0s4RywNp5SHf_ zM)^|(Vi?B-gGvY<6Fpzw9tvk{5p%=BWHA5`S?V5OS1ke1a# zT*$PE-LVxgl_Y`l{f$vyv2Zxk37IPKoHf@`nq@#wZi<6>k|6Tw%N^O z*5m0is^_nFK0hpE&iB8TMRVXN4lx^0P-?FenC2#-mE#&%9w9QkE#2yHr$~*FqlEsrrFs%kO zPWGz{pK*RCgc_N@^Nk)LqPrF0;YjLUKD3TBe?KKO$)e*K1UzOL=hn2Nn7o^y;VP|z z*qNy}udP>089rP=8D#GyqJ&?)87z`3h`Asnmxyar(0>XP)}YZM?+JF(;-?xP>}J#z z|Ic$#DVsy7Z17194OZ(N}xL*BNP|P=YYXXix zvX8us zY+h4_cZrxI9oYe=Y{3Ey8n+K&4Q2{+&1aRyuVMV8#SVv_gy!)9%(yDZcBCSm^bUA) zPYqe8Fa44K9S@dVQ?Rb0#aY83D;+5w`dsRyWCsn=5m{I4ep4K4f&;-Fn#{YOf@<%Z zmzhspwMMy!CfE)$+xzGZG)RG`w^5b~pymrs;a5-pq~vM)mD?{v8q-wb55(man2HeKRa~E1i>vTFN%cEDdRF zqvgYUh%VcyDUjWTWVWE-xIKK@HLR=G-=p7!P$}fKa-3hAYS!p0%vDj1|#}bI>2s>@J4b zp0l?(BQZCB-Z_>NDLCxP5|s5A0l%5aP1RmY>^@ckPK>fo0}d^VYLp03vG1)m+>jT(ik(r5 z33(kKi$I?WZ8x$Uoc!ALPH9hDqWB%XZ;1_s9?_usmLzVU<3^e-A%zfKtQUw*YdbHx zx*%pzsQ?vO^XIQdA_@wH+C+Q7 z1N&C#h*lq;Vpo|ug))9()?2_vKSrD8%^_D6Y~%ij%TD|{;y<_le(4DK!5wzw9FF81 zW;VFXn_@p$J>@w5XP4qmNt-PrjgZ5h4x>xb)!C({rIH)Ra-0Sqvh%+ zV-?Uh^!~j(JKTAzkjjnUd*pcQlUj>2cxZcb(gF@viief`w8Y|Q3d$VVvl{!-$gSt_ z$%*c3mPAhI+)+`@q)+!~if%U0W`>nl(^;iC#tNVRz*izw`Ll^lEUb(htqk~`!v$v!)mfTrL=E(5+jwF-?3W{KDa`$?d9#P~q55F&2&Ymg~)v23e6mz3@F9 z3@@-%1v7-hViSdFCqiw>j z+Zc~+hLnOG-n80$ln`%*6cbV08;ogsT^H?}LPoPIy#ctJ!aosEC~N)_`VCYBxg0*L z5z1*b(K1ul;q`@&_@zQeClly$AvG*BVEqb@<-;i z{7>i0Y98U(ChP!LvsBlU#7vjfxo<4ALHNJkw{(E zs}erz^qE>i4A0LTZ%bihN@_EV7BYL5Z-fls5Q~Tp_D%|;9LaFzdrymlvrqL_^9?fY z-Q%G776wt|7`j*M2uvKw<-k#6by0L+#_JlS038c?77CT1f1#odE^zqd@k7tNGQo7A zl(6on7rb;d9azojGk}R|OD#ls6`=wr+Q-!Km0i$ie>D>je1;`^B|#C?`cw}ArC$ED zyg%MvT@SHRxtCrY?PZ2J0O0}Tk*5?}d`IRxPm|V*d8+`u6?-=-6)hm~IDX4(bV6hz3U=b!)9WAj7_IzVfq4D34sXf0{Q`el9blrs7D>G_ zwN*4yZa9y@BXXXsM-MzOLz}w8C#^4gz`6=CR^Lnm`qEnlMiHOE*6O6PibMhoFu*6r zSA7pNAl%g^ApaF_fG3ilVl-Um}q--4cM z0qud`{d^$@m!>1KgKv=9vHGv%@D=a8Z<5EMIN;oaKFqccMDoJ zM-(fsK?DfK9TR&n*({y}ik^6o^DIfO>wX56J3UEoA_XFe*|^hZ#Z1G6?t%pZ`bA#9 zrFo=8ZBVgU(lf6~Xz)GQ7NDoq;97au*yaEM0i)DSObsv%2p&-Rf^r zDPf_iYyPLtiTr6sUgEspNZypOx=m{%^dcP*Q3|sqy!;Y_$sruoUXM%dQ~pM=7@7>= zKTD^0KQ$9ZIS=< zNc_VCEZ8gC^PJ7LY93(&)1Y>Tui()$Mf)ns4>|p~Qh+6I03^^^8Q;@LyY659{0jdHLc+v>4DcuNSluu@ zn6W+N?~!!f&#FZLk}nkyyJwtWUc1Uji-l62>YrX+FXw2fVa}PORYc;+QI=Q`L#vlB z2e`9O#ZCN~W4w$>Ex&t~!3aE9EJJJ59+NV%`#zrjjX>qfN)1@SCn9;M-lw<3yf2*nCu)(c`-Vj`y1 ziM_%vZpnNZgN%Sqo=}zcr1?WtIOcgfNBHbL>a$KYm(HcSfLwl+r&r;YioQCF6awU$Rep2?{*FP?Y^Sd|yI>_v7rD)^=1oVi@|G z_>{c`nSb0#n48NjY%g2-?!}k5oiwc1v?BNtF^}$z(Pg+i%^(Bg{*Vgv zR(YKloV6k)O0(nb4}?`@_q@Q|AE@Q9%;@q_vIH$G@yKMG*pH?}t9SAbhkoPw$YvoW zEZ7I6DE5ZwAun)hMUa2u3`bzUmD3A#e)nQ8Z&^Vc-*({=-6`LOf3F+tll;~p$Yu&E z5itgZHLKpB{5QbO7cP5?<2xE24AO5C&-bCcC|XNW#>EmE05<=mGpG(@duqh?H!>J` zVmfyIDz#q=ZN8`>nvaM|Vq6Oqqq~<2lB!9frz4+cJkU*XR9b)uvO0$aud+Q>a2AyX z5}3y{l;m8$p+b%0ssli$q|Nfvd&J)j?7yCHjt>x~QO{YPw%OwINe+RDSs>UtID})9bV9ENLx-Fp2+O4Fsv7X zD-V0Y_mMMDq!rGC!3$Ds1lNwIG}`ne$1?=TGFi78RZhH&OJw7GqiC`xSW+d z+A4lF<*dB%d0czo;L1mlue2il*@%jAjD0@6Y=de-{#;=f05pu+veto1cPgpexiT$c zB=_vttQBVvrA}HdQULkEwP)@R|L*${6v+jWC`72_V$x(42h~3#_&w=Sj}IO$0Hi4> z#Iw;g-Jy7m|M*8-76k5|GbWq;Zw#L1i7iaq*pdo=ZuS=|FFFF6)^TFScXt*Yz5E{F zAMSQ_Z{s`rjDV>p>eWupT0lq|;}t892S%oRVME3WmdO9hLzDW3HLASYstJ&~`@tYHK zB08`$bR$lC;V(}=x1X#kr9zX5_8wEWAa|TZ0V_9##*iGF=J#>$7ITiguve;!Cc(K+ zOo3T4stn8$^F{nGM+VQP*v|di<)|Rr>O9Y73rXO6=voe}qi( zOqpen9^E^VbMN)YME5&V>N@zyKoA zd~bL$!ZmF0UVPHM$3}6$go^|<+Mf*Zajp|mO7k%usV$5xKE{DNfM|CDB!MBzc{9uF zEsBSoV`Ziz{n-(i{Vw`0bn>an`Q7F7_|{Ve92o>F`|?RhbBb;OzsouihuE_(li2TY zQYNB{|EIz?C+GiXiSPfW>CH*W$p@2K21JZ4URhfIH;M26rU(B2hr~DNZ*Rn%on79z zQ5sT$IC$=*pg|nG58M0x0{j0;M1wf~N_K<(ii1;v?tP>IZ0}nFwp@SDo26?|C4Y&w=(p5AA^-+5^4-(~|2Z?gfgG4##L82V=AW;r_kSGT|NR)#fB+5Y#66K%=iE_|`L^} z$!$R5n~&%JMsj<~f253U#AD|A`l)YW@Gf+>)i>4Gh1#}~#0@VN`!^*gk~eQL;@fKh zKx&0Jn&cVna}s$J84NH#uKF`H%sjBRQG-Zp_WbBT<)Uh)=Rwv)=W&@qS%*$lWkXge zd*I&CQ47nE;!P*#Zp)q3>7S`h(Ys5N(z_*;^L~@NA(McMA=N<6(}Ar(!QQ*>>`Qaw z+c%Z$bJr()ona%o`t3C+tH*?CMN)ZIuxF&fPPlQ7tL>G&7B- zpZH14%XNHuqJ~224?u8l2E(l4qTzEi z>BHTN%!%P%SlOzX36UJA0dJ2#rN5B$&JBN~aM3&E+OGkAqX3zTCc&v90b4wnfsrKy2!I1K-8bb-yHK8ohoUHL<~lC>y4-n?EN zY@QG~5&^qn1o8=Nv}Wb1itvw}#V@t;;HaVndqZZP)KV>KxK0T#$2ylx?exyZ8oM~Y zd)nYmKn-0?4Gp#*^KNcvp`SbpI`MIJ;KIHl4>Hc3dTi$nzx6a^=~E1{d}hFmafr{| zqKa{zti=qM6MxDFhcb(Sul~)NLRYV6)7h7ARsdP-gwAu_!0nV{bT9X%w(EnGPPxnM z*d#}hj&$1_MFW!&Xm1KdhyTTzOXpEp=T5*0Uor*j(1-TxgDSrowhe*Q?nrmV%yZFe z2z%f)Y<~^A=%FMesX4!5+rdzF%gE`NWj5K$cVPbs>0+(JmBZck`uh6vP3ZnL@D+%= zIc}9^qlHUwUtqy45BpqNZJEExdUa>WF-Osidt^hXzh-SYw8<|${*M{m%xvOt9VL5> z(Eyyn22ugH^)F@p9AvsO0UuTQx}KAkCZ~mzIUN$i$!mEvu2voWh&t#>P9tr$kML zu4|p~5*;qqa;*F?tV6uhT3=Hf{5;BdG!S$+Xu|Q!y zR=L$h;Zi>7I|++%Ox>1kZ33wT@0MHDGcC8@4Wag5+kMnVnrE;|1y0c<&OldBt$p_6 znFT7`29iEbH~v&m*)@1gS9HqK9G|_S7hsxA<3z98YQ>tpg8D}w;O6f3vh#fAZpGxL zsIYW&geMf~Mr*1~gfNACY--apMwMNpJ-oizXa-O)XAe9e%_;VFU&(a}jl@?zoC?mn z+X!sGo(L2y%d;NPLR5DxI_Ka`$KdZd&x}^YT?@+4Sw_7UwF? zLLsY^a<_@o(ZK!I&NIQg6O(bR)58mbq{1B%W3u8)!Op{@kaQJ3_@hMWwL8_@{;He# zq`o@`U!JpP6=j`Q%ePCSou!70`8w`yw>+1ua%GpTchsb1cPS&E?t(MVPkGk&+ce!F zB2P+v--~87n6o@W3s5WA?);Wfa1Eh z_h!pi^p>XXdJB0OB3~mQ*!9{lMK^^Z){8H7o$v0@<*q;Q#Pjxt%gx5!HQ(LM{*BLs z_Xtt zN9^9bL|fltJKy}uQ4aQ{Kr=L0o+1co(4RO`C}~aTyz{-grMUeQc!PW=c(WnuyyHAK zyyy!tDsg`4cjNrQRW-8s^7eON$z_Y`H{G`PwcCCbE9s6R7T!;(aFyrchFz$mEn~3K z^RfHvc$P80EQnv~hae}T#ex%cdpj!Pj!a$76yO<1A&jSoXIz%W8*0!W&E>08bDrEM zu`z2$?*iXH4xYr0emOEXNYC%^R;F@8h=ahJ-rIy9(^^a3T;HJ;YEUOpxpCeuJaARp z-{?mBnn(7}>;?MrpR^IfnmY>_N-HfIUANkb1sfM1cO0KA8bUX%51FG=O&`SVdXLWa zKB4dm{%NRvAO)Y2g>AR#T?9ZE`<(zWE$ z-Q6MGA<`@rWY-uRA8NMIU7rcR zj`-Ia#Bl^%5%G<0n%Wp4uj-hG!(fJa`94em6IWu3`j<_7mgLQ>4GeylH`h#dN4Al$ zA;*SB1$*7nZD++Z2tL=>>*$XKtUuC*8`pjzxacxBo@C~+l3i9sbe8YmwyTPW;5;Zw z9GNR>_dfbq9y5Moss4sO!9dH9;N_V+nvPVt=OXpgdsui(WHI@>rd}(Ygy2mKv5zyf zKdgxjDzd~7{rDCJcw=5aYiUz|d3!%iC0)NE&0ar=q2n#(vEuH5(4Gm4Bjt64Wa_8x z?+@m*8cxN=xhakqeySB%S@$B-W+o3dI!G%jp5#*fSZ@>i@fDS?edV$>O#+N&qBW7$ zaLg+J>%_*Y^-Jd4aud(&=c3P0a$?j9PN41sT$UZ%f3 z=c~QouRo9eFfTI>Mp8C=xa(jXq<1@)qZ%jYW^Z-31h0D z;z^D#)$-x;1r07{jQl2S;>f7Coo#j*+S2)4!C9fCl?!X)izm}CP?k`}$}nkbYx1K1 z#Z@z{qN_rQ20xQfEl*Km>AQ!$MW0&hHI3hw#gR0wOr4s@f9&GR2u1F-^`IuTQlEO9 zRxXoC-2EbJljG@Fy?d4M?HIyMkYSg(!qbDx)e%v(QiDRhpO;m2D(kAEQ0?^98BFWE zk#z0(m&NSedyDwt35wfzqdqIB^P&tY3QWpO+j<_=w2AF$~my?+{0I~4`FW=>ogm^VeG0xo*Afm~Em(?&XONOrwq=oMm1nmX+MON|X5@yeYc z%7X&JFPbw(zUN=|vVZ>*)kmGHNwOwuOblvdb`vvXokpj=RgW1_$NvU+ zwKqhe>o8Q3eW%_?)XGDM8g8{0Y8VTE?QL(^@kR;13rf-iY&m;yg7p`g@N@JpbxCD4 zkJ$IlU^7TRma9Iu^UKQRuBsc%C#Ykjk-8QU)~lupLBtusw#)$}$2vgcXkZD-PN_zq zm2=Re*zK)yk(VPVfJo#x+Wj7n=DVw7PwTqd~|qVhaVJ(@@M4WEZX?)X7J(G?SmSAFQHnc}@JJ4}}6EIJBSX8Tnu3 zo(q{T|OC#_j1}mgXACOjPO92M7wUZfwAdsklFyX`j@duBwDP?mg zx-der85CXbu7{#;m>V^a=1y$r0Ip;61MErT6z~;CxIE9GHGqvdKA zlM!}hny=Az0Be#wl;I2`8Psu6hjC{ZJDr`Cu$;PzYtsabVu{hsT| zsoF~$d6G(plh#mZ66R6c?$bFpxS$Z-WO6byL&Md3m-}Ndv7l2nrZ^vi`^A~Nb9RhN zP%13mgXQQyH-18npOI^)kg-jnvkC|SxnH1*aX_fIYNDCkn^FZJ*&8ucH4m>S2j31;dF4oKvA`d_*Z*#m2-z$>22vJXdLcu;!+%i#i zvxROkZt0N6Z1}v>AOCuxhz$m$XFoRu8=65U>!9Uv;X>05aFmUL8$I8l{fh2!Q?d7M z0^Jn>hlj3<&~Ah7x?$nKyNq@0|5B_pg$hX z+Rs$bxI=km_UGXp9=|Uj5q+R%z;@#Pi)q5?-Hp6FGVDAD&^>7$ohV2Vp`B|8%N3Jq z52T=}QkhcEKlt9_Gcxt_(t>hqoLzdvUVu(z%I5r{Hxp}V7-ev`N`UuX!72B9p9 zZ=gdFFhu+%D+}@vPUW(1ZsM!BAH4&-QdEgnulPFC71k9enS7L2iCZDlvG&c-NkAclnEhaZ3Tp}sLfdl>qn(( z7%3~y0qkzAz$IP91!9<4(+&-!OF*Z=*CGWn|E1ImNI(9GXc`d2uKolxDKX}<7prd> zebhH~2%u;X9@a4)9aikTbID-G3R(-c1F6F;MO(kdYAQbA$-g3VX*aMhh`6(5GQ z;D6q8Bdg=fby7&!%vPciSQ!dO6(=O@0>b9;l0Og|pto^a;L9RPEgyAn?hL1FUto*KXaNazYiJ3kCpOl>xqo zvxz4_eI6JOLYNvx*Q4VCLe4M%bYGb>;T8~{o6EzmX4beND`6`ANdP3S_=SV8OHk;n zjo_Gg9bfxwLjk1KOsI~b;3&cX@#ib0e)T!SkN*#1cV8PYBRT;f&7$c1&lL{dhoWB7 z_th{w-jBwSWGHmeMcGcj1$6tKB7L=Mg%W_*HlhrWE;bKCerjUEWgbbg@yLJUZ7+`J zC#*j#PHji4t=Ljz{|xu}ZZ(huU=c{~#~c{9Y?NV|{9iEO*jYO01^Bxal%ra# zCrol%^5pgPq%A2yjz4O&>?C5t8uX*ao#eCD3W?WueWiChz>}UUrI%NnO4WJt9^Z;VkOE2 z$&MO5EI~O!-)d3E_%ioa1Va4`(00u&bpXSXmXc{uCjYp1Nky-DK)Z;AEy+WKBQ{|w zVmvOqMWNmAT*V;%9Z|a4sjCFQK#?oDn(}1e-inN3J?t~{L552F)3uaAXAc)za4xtcUL{%t-kGjxGonIUX&GFX|m3W#N*-u@X?d zk>93m7IOhm`wGNuLc{`r06W4@u(aG2>8Y`t#2{VlWeW60Zc>2jUuyK4zFX4)0cy4T z{rXWL`toBBW32!tVx7$I%e*nxpOBJmFOcsq>>H=g=jHM#HwhB2K>yhWu6Ra-`s^qr zC{Jz#xgq{Glo<*}k14;y?EBH^O5!|(BIkg3s?HOLNPk1#{o5aa2hz7tq348g`!P%C z8L~mBmD3cAklI*2)oKKOKSNkzVv(z9tyeFMvvkJJB%%f^t1&aV3yyr2-3dr^E+T_o z6JSMpt2&2%qE;_Mk(7iE3&3MrS6KaZ0==tqA6!n~B7CEhug7yG4`V1GTu3U>6AZ{u zz^?>^r>vuRU*NURi{D6v0Nnr}%N5W|all;yQ8KVz06*{G{+N2PRK{%!!f-l6s*_ z*>_r?79rFb0%?Q&ZreXz*o<|5>I;+q>v1aCo8m++-Uf>hAe0>ZQ1tx1iUWX*z`FCy zpyEV!F8p~_h8&{rUMYZ}7iyJ6>lE<2+CgP+-nj@IHS{Bs#IOM*Stomg@AJbwvl;tI z{5t*#YQs%w8$|wWnqt9=IB?2Z`u?GRJp6)ZmBV)c8pEBAL;u4si`D#~`Xb&`;ZRfk zcim%V>+_%M9#=Jt#@F5}r+(R?saz2M#Ph?V?1cUvzI20^@1`;6833c8|K_BUq)_d7 zLkg@)Ty?PX3Hv62_{dc0S{_#|0>8$RY^;^YZm6oH<6!wV0cmcb(>uC$S$?T0$$Z|e zf_!dz_PL7!Q`3#=uw;t&_{naMGG9GbUNmov0)1DSl3l0#`v+99`7)o5ICXpJB(Q|@ z5BCXtHJQ6fO(_pjT-+R0jTNxonY$EE1Sz%d$l}~0))bPZpXNM95aD6#*;p#4PN&;U=<=-j+ zP70VmmAH4VKhpYjWF2YS>aXs%1FsEYRhXyJ`110v{=A(nHNEjLRLkr7#7~K8H7({8I^hXo^T`D*gIDI(%1kdZ z_A*(=nF>nPfdy7!Lqqs?kvHL>_D5B4-AC(z9ArKtP|~Drb0n&K_BS4tR&upw4$z5I zy?OJfw7Zw+gi6hq`e=Ku^)k1`8|`a=#)u9qFj&Mhygs?i;f-PDV~9)T&jt>axJ#Gb z#xH&QT%#Y8@Tic%tea-vwyACP+eE81T{)T?wH3ufi4O$lO)5a9h85fMBr5XkZ`q6e z{URe2*b#yoGlBKyKMOE}&!YDhhy(onu&-41C8ER5e5xt^PJezV2-F%zol194z{sjH(pHG|5CwFM=hkL`>1!-0|FHZVQQPx$enBo@CSntdB+X4|!gy+pIkvU0O|z zy}k!TjGWPWX_EzU{H3V?Y6{6wnR`<&Q;g5q;qA}I8poS-v@_aKF3rSl*avz|wMn3O zUq8BhrSfU*q4v>|rA~nRC(Mev5xMP#d$JFoJsgqc%`(2Giusu6qi~WN(xQb!yjXT? zCV$3sS*kf?H?=?OHI2R*%ceF&Ham6*c?zr$!YYpJr!O(j$?U7tlz2=oOKEyxC>QY^ zNLwwJHnt2pPd5$DgyvOjs%$Kk9IM2~hmU5LaPO&J+T8MZ7pTz=hf6r%v)p`w-<5a_%!<%c}SfO~VxClj|@N|$^#@80}QWRP2-wo~xJ*DVX56GyDd zk25CYgT1fefzGJ~Pbh<9VOc!?B4<#Oz+4Y)jDsGVBuRh1?1m)+v>8B3Z=1@><#y)%o3@%)D^O*fGxo?_g`(#4-x6C)!4 z<0@V#Piosx{G`m_AKYiA|DE*q zlr&d5#Bu1|8kZf&jmmCHY5&Fx&uf3jP#|7s9se+sCIaoOhD6D60EsnVtvC(-k9ZiYK-pU9~;vdPCq()TR4zEoSvO; z8c;NxYnpCvttUCW7tb#tFS=Yu?`Sb;#4?;dZr;5$eleZEPxH+wpbWYptR(J$7VKPZ zFPbdF*bwVX1VoCW?4EVUiYTU>o^^ZkvCd48*IGSQ1Tc-be~k@1oUYh0Sn~R)9(b`Y z#{2K72|429mLxx`7u}Z>FJXNWIr)akkzm7{dXB#O6%HhrKSGl*q1Ivq-wQo zd2XWBwfW>$g=d6Wfqr6*YvFiuYP4V7NGgouorGx$3}e2W#q*!(>zKaz3KMiZwFo|U z-z-vIwexwz+D7Htx;6fTka;-W-lt(}+`e{eyj{34zI~7XDtJpt&lEgoT5Glvg!VgE zUX${i3GV$Uu?OM7-k_0W!BZenF0?WPR$R5Ki(Zv^QsPJfq+bFw*I}wa)>I<~$6HTo z^kJ1Zu+Rm2yN_ihwp%Yz+A_M|Q#;-H{%ts2Q)tYV*Sn~aBPkxLW>XRHVFw%df&?_} zw582lL?>KbVbKEerPYJFD0I@)6`K;~3{DH_j<)wPJi5c+w+;D|X~DA) z26^vOiw@9dTA5~D{dbEqc;mA#m0{qM*D-xosYhE>8>Y>H zEw#+qWRTpLu*njM(z{QmD{ZTL;pxbd<_w8$G6p;A-mOeVBZJdTnX*0#U0=3jgr^1FI8JJl2VCEAp}W&H($*~3ALp0#uk&k3hdVzPr~Huraem5-W*W7BW4{@0=G6RE zZ`WYDeUa_gB4GEr5-#^+3o=NHD}P9Q-Ht=}MkcR&T?;GLmV<-VwnHn9Lr*BHEZhnO zRO z`Co>Eb|sC&_wHl=qM~uH8}BICmP{>k;ZJ3=(TN^2UArWN9yaKi&+=`aY=dbf#8sDwA|_|mNxUvPg_ckxe7@rzpd*l za}FU8h_Jnk18|BpS{(!8uRpoi)Eeh1=9$nDt^1g&gYHj?v+6FzDOm8)UiE5%K|WXM z$EJWV*mHWDLpQ0tI*!MHxEB?|{Y7>)y1?G1EIH z9k=p%PWRb#D*Ze?f6dNsc92gqC|LSrvUp!Xo!5!2QigJSCQY>&sWTLDDWj2k20HNo zcZ8*s==2`i1= zC0YcIzAAdAbroKmyXK^*>b+7*_O=l0I@9iYPglPI-1vHS_nlh=dG||oO75qkoq{Kt z&!y~hwwuhampe+r67@GyS*)v6T|9@A1nuz7w@yiqb_^ni?+Y!ontoRo`|5+-VclD% zm_@+dpr{m@J#3!rmD{4T?r^>Ncp9o!nrWH2rtChg!po4%{aUIM5InH$=d%PU5NJu{ zZQI@(QG)^{|8;F#R2@5kC?43@V3hZqumV<`=W#(3O>Pq{Iz43tDtVmAZRVo`=_`#L zO@zLr9j#(gZN%xnBH2tmvdW!E1Q7OqwrqZ}(B8;4D@U1F)#x&f)MXlZ(KXLGcVmeX zluWR(i@MG&J){K4C32seeyB;SOA5P0dva7TQT|ICGOF-EF}u3UI7}5TH=tP|>070A zkoLu%rw$WmR?WFb;56QVm(G>tfi~3v=dKvLWpG$S=1W|G)S!k;ib>v7Kgjz8&0~Yb zvSk*i);hT2%27s*=(J+)#+{Q1(^FFf953nnLM1vsR%;i6E}w|6>ZLL+$14GG`G@+N1+1NZ&oeuZ@eK{%U`Tz%9xIJB$3 z-f;@t|AteGZdv+cU9VXI$0KseH|JhA{coMPfR;$5BA~rx22|xDvR0}FQ>z3qhAY@a z#FCk0+kcn)s`G_2v*dGfXo=>qmF50VJBov66gxi#wyoJH$ar{ zJ7_NW1=ock;H=f_?w-~uSc2Os+R~DbbvGh#Cz_F|SH#}pu41w*>qVGTwZ76)H{xqy=LdBIZ-rFjsH~3v^5d2FAjnD_;4w;ysO&e?ZBsj6JSD|{W z8&amvlBP9ot9t^JXvX~ZV$V0XB{$aax3<2x*pkEad;wSDpM#%ym-U(F=5xYc6@db!Zusqn7pIjO@0(ShyMx4aCdcu=_rEwm&aC2(S<@!9^f?armj zSA}y0og{T%E+6^7-TN`NGV>v>&h|$7;cSrQQ^qX`+?mLayr&Ro;f6I!Qrc~E`lc80 zpxW9Tdvav~&ne^J@r~j{O5+dSQ$|@EkGb&r+2tPzYWMK=)P_u<^|MvkF1DtxJ%EnD zQ&HmC7S@ma;5?TS@3rba#I@7LYlb23Ek=rp>#puw@d6ue_l9*` z`CnCmx6RtzY+O`;z*6l3Rsult>ZL2j=vr$nQCJ2{z)Q95gRb-~yR6Bw4x7yHgAUim zWh@^}Uzql*KWZGVe6N=`8Zx@!qN8+0q+%z3M23W~2kpHQuAy(tCoM&b{ysYt1l0t| z&kxNzi}z+SSeywBV5*E&IzfW~=cbW0;(!HBDT77@l?8al^dkp(g?gK0EDA5&7b<^;7$53kf+bYss;d$S z9I|83#O>M0T<}U|kV(L5FYjNAGPS}z>#Ln=e)wsgeCOST858i)3mBoN2@qNLwkJ(R zkP37CKF;B7LI-T91LU@WAC&ET(zcu^T(hi~Ot~O_A|w|fOSdu^Ave53#^Fw*i9pDBZxFIhwp1&`Yq|kr|q%FB{ziVJ{ zZ~WGQg^RwAxo>Vhmbr_CI9Ceph#Y5Xlct04GPND~VlMiW;nN%Sr4Kkt;cWtJ@rl%& z2GG0gG?fW+@wKESo6p~T+fI|pOi=>LX7Gjy*Hp6h)2NgK6F7AL07&JY>V|Uc@4WlH zG+4TC3LubmFoT6wCjWaSw^B|o6X|iqvz@O#gz@3Zx_)9EcQ^UYE!{_`9r$8|; zlb>`eC&>43MQSGOC=cIJ%mahM`PzrnrvLiyWKDpKGE-i%pY>U}1SCH={`FkJHHBg4 zBXZA}%m+}bC1vq6NyvDllBunE_VIJRb^Qwh%1bJ!1FwOVRrP)0 z>4kiS=}L`txWcF8lfXBf1yj$y7PQNJy0L6dAskiG^W|czVz<>vF6=f-{c$3S)9Ub9 zV{*{pF;5A(Kh=t2+ia6V8OOOx(}d5bo=AdR?CQ@Z?Np9aMu`C$RS&_Jr$v@^i@W@8cXH!@u_$Lmt%yhO&*l{uuITGxN%Kw&%Q|2cIS)531kv z%b%uoLhqT&h!MvT1NK!N2XH#dX80Pe#<;A9Bk@odRwI#uR=6EI=}P^=)?>GSbozS_ zU9DCZkd}{`@eW>n1?yOB1+|~4Lmk_gi>Hb~3QcW=89ZA4e1voh`X2R%Vg4rxJe5kct0|p_Hy?ZINA0lcI=Fn~RJ2nj zHpemSr@(%G=}%p)jE|ed-`8;lNMXS#SQ*1JOMe6*k9`aBGXBk>moYbdkHN$^X+qh~ zI8FXx;aPz1i#Lls^~#Pv&jX*NNnuU5Uh(_+|Nl|h!F}lXOlYsi?(1*_@sqyWkCcKN!K1RlcTl@SL%nVf3A$vQzDP>9*WOXP-06DEX=G_E;nc$O{plj}t+phh zsI0-%1e(Er$<(m0ctMZslaK(8cwl)~BgY7mWub811>W=Ym=WCl|870qZsLkD`G-k1 zphu6cGI@xTvYHzjK06CjTdx3G#$e}Ekjh9Q0zl?GDMV@;SRt>@!8g<~uqs90aq9E| z&UzxqI}Ayhn#m?&6r4>pW)}4&i55r#-v5e|{Z~jIMoy1DOUBf79DPKFbCj^L4jdk0 zV#&Qkgy$ffe653rPrV9Uqvt%GP8PE1;YW#52Ifrg6oMO|0+<_69Q*L6fE3{ps$m&z zQyN!;FV-#E+$9z%#I0sIfvFqRGj~V0n>w^B-2QHHHK&ndC*^65u4i+9CJrnQ^lmQC zKg8X&${4Iej!{}RUuv;!O;j<{%^7{Nuv1KXo}67`|f7&zt_s;a1Kb*1?DnW?aj6zy*v+Wjz*^dACB`zs*tmST;ielNT!ZnZ|H^y~D%=igV0nXAqf;)=>WFYFMZFi}vDS!Y!o>ZW;vNEq>&xwv|%;v8B)Jz>J7it79>vLIXiNcJkx z5U*BPnwY5X;YT8o<>>$gY&YFqoij1(}Fd zhP0`5GZ(;qu`xN8_dlQjXqJrhb3z$qo*tfop?5OcqwfG~=>DAX*Ydi{B2mSSGiw=3 zLKmRBT+dN!E_!t^3Cmx=Xeqh-_OeC?+ z5f;~fYzpT|m8J67>z?ThHaw|0qEIr9t|+NT8`s3)Toy$gEkiQspPWtb1Pe?GV35;^ zQ9TO1@l$EqXQq+GR>2MAVA2ip6m!yzTK~K_P)1lq?d1&*W+ZzzqYo~A`nWJ(X|~U8 zJyii$QlLOY|MLfZ^r5}`4_Pa2KWDmJQje-)%Sh-uMygW$k<~;`@h8MjgpU*@ik4zt zI{P}?T*7gs9&@>o$r}Z|;>jngU;*EEBb11e0CEEFg9}OZdHi%H&8ELEiS-mqB;{tR4~6)G-E~0umPl0 zE;dwa0Hf`;QP9mhB0#Mw?gr+rTem?Z*NL{wclJ`Qy8hDC3lsN4NMut}WW7%<>JQ#1 zGi9L+f=g9LG&8Yv&uM7e%8X0Y2Vc-8$%;_$ zXJJ|!@N6V`2y{=_?YO);)0jk4`wTO?yU!N-KwLeLgphgw^TZJ~mdHeI{pobg87d6x zWsD1vIP%-07YK@;MeUDfX%URPABd~Hr3tvNG&m85u1Vk}8n~^25JkDFT!N5>*cXey zm8;dr;Kh6Y-Jd=Lb{tQ{Hrt*e@pvs5pjPupgcp`jA|k-b5aK1VF`!n0g|bFu{;X7X zgR!q?h~y!dJTK#wbOAPlEx$)+fUJ;>(LX3K``_aZa4$nh!-X>i|D2C6g~X5+ox!qT z@YyRd4}nzNt_sPD6dxdggwUvkNEbpvC@}TvkX(WcT_i?R4UxwS(FB5-{YV@e10T5} zA4v|Ai_R%`ZviaHFVU1K3&zZz>b+$4w?N?1{BOye4_UmzU9)&anIywKDCtJsSH>F; z#^ol6gU^+wb?_+QIVWBL--JnMw*jN*$;ZoJqB&spW21zaDSzn5BbexZd7bSYW+U^v zo3J~lBF-QpXpu*9)0+P+xpnXkD&SVeDaOpE(bI+g_^4gnM)E;Kdh6hU1l>x4w1<)R zU!AN!>rS!-`u+C2HLhU}o&L_*=^Q*gJIY9dO0;&z_<$d)^DsJORC~Uxy$nqZn zvI{Oz)h$xcY;QCIyOw{f-xY0gf55q`u9dfEV7kgnSi}zWiS>76fpRf{6g>R+j^pZW z0bE9TT07yIZBpa2Kmmy>+{XaLzaI6{)MRvL!Kn>3_G0S@y&%n?%QMd>!=c2BQ)$fC zr=u2^Jp*~GUc>F%2x>oP z@IjQT;*dGD4OEzA_g?q@aDBzQ{tMV#}_VR!o zs-Uk^CcpdJpsM&K8WHr2TCFhAI$TdFU=`IGU@!H(;UzJydB{ zV@bCGeO}GPTj4lQd$u=GZk5(3zZY=`X-4JgTQ+kNGGDQi;u{YL|SrkIZ6YVBf? z#9Wd^*=_W%kd{J;mhQroX+rzBotbAA%1tgq4hFw!^f~yBzE4u_uSV4@KYe`T%I>PL z($W!X-FAQ68pF)@{tl0Y_cylGX_si&6f{kK+W> z6H73cvR9ECJG@EtmBq;`&y^8DX0fvr7⪻78greCyuMG1Jd#*U*VN0=+ffYp4wWe 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 diff --git a/source/ReadMe.txt b/source/ReadMe.txt index ce794f3..6e27929 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -179,5 +179,6 @@ str_is_print_str 函数中,len为0时返回0 2023.10.6 移植与雷管通信相关代码,编译通过 - +2023.10.7 + 实现大部分小板命令 \ No newline at end of file diff --git a/source/dev/dev_flash.c b/source/dev/dev_flash.c index e060b43..ddfdd17 100644 --- a/source/dev/dev_flash.c +++ b/source/dev/dev_flash.c @@ -41,6 +41,8 @@ scheme 109~110 #define FLASH_PARAM_SECTOR_NUM (1) #define FLASH_SCHEME_SECTOR (109) #define FLASH_SCHEME_SECTOR_NUM (3) +#define FLASH_JWTCODE_SECTOR (112) +#define FLASH_JWTCODE_SECTOR_NUM (9) @@ -78,7 +80,7 @@ typedef struct{ // 擦除指定扇区,返回0成功,-1失败 -static int flash_erase(uint32_t FLASH_Sector) +static int flash_erase(uint32_t sector) { self_def *s=&g_self; FLASH_Status ret; @@ -89,7 +91,7 @@ static int flash_erase(uint32_t FLASH_Sector) FLASH_Unlock(); FLASH_CLEAR_FLAG(); // 对于f103 2048byte为一个扇区,这里把扇区地址转化为flash地址 - ret=FLASH_ErasePage(FLASH_Sector*2048); + ret=FLASH_ErasePage(sector*2048); rt_mutex_release(s->mutex); if(ret!=FLASH_COMPLETE) { @@ -102,6 +104,24 @@ static int flash_erase(uint32_t FLASH_Sector) } + +// 操作开始 +int flash_operate_start(void) +{ + FLASH_Status state; + int ret=0; + self_def *s=&g_self; + #ifdef RT_THREAD + param_check(s->mutex); + #endif + rt_mutex_take(s->mutex,RT_WAITING_FOREVER); + FLASH_Unlock(); + FLASH_CLEAR_FLAG(); + rt_mutex_release(s->mutex); + return 0; +} + + // 操作结束 int flash_operate_end(void) { @@ -159,7 +179,7 @@ int flash_erase_slave(void) } return 0; } -//方案区 4K +//方案区 6K int flash_erase_scheme(void) { int ret; @@ -176,6 +196,17 @@ int flash_erase_lua(void) return -1; } +// 模块程序区 16K +int flash_erase_jwtcode(void) +{ + int ret; + for(int i=0;i ad_line) { @@ -427,7 +428,7 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t ul_l_count++; } } - if(uc_step == 0 && ul_h_count > 5)//启动周期计数 + if(uc_step == 0 && ul_h_count >(DMOD_READ_AD_FILTER_COUNT-1))//启动周期计数 { (*plus_h)++; (*plus_t)++; @@ -437,18 +438,18 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t } if(uc_step == 1) { - if(ul_h_count > 5) + if(ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1)) { PBout(I2IC_SCL_Pin_Nu) = 1 ; (*plus_h)++; uc_step = 1; - }else if(ul_l_count > 5) //由高变低 + }else if(ul_l_count > (DMOD_READ_AD_FILTER_COUNT-1)) //由高变低 { PBout(I2IC_SCL_Pin_Nu) = 0; uc_step = 2; } } - else if(uc_step == 2 && ul_h_count > 5)//由低变高 + else if(uc_step == 2 && ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1))//由低变高 { PBout(I2IC_SCL_Pin_Nu) = 1 ; break; @@ -483,7 +484,7 @@ uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) uint16_t ad_max = 0,ad_max_temp = 0; CurrentSample_Range_eu range = buscurrent_range;//档位保存 Power_SetSampleCurrentRange(R10_2mA_30mA_MC); - ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HIGH); + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HFAST); delay_us(2000); //总线跳转到中电平 EW_DIFF_MOD_M; @@ -816,7 +817,14 @@ static void EW_TrimPlusCallback(uint8_t flag) } EW_Trim_Flag = flag; } -static void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count) +/* +@brief 发送校准脉冲 +@param cycle 周期 +@param duty 总线高电平时间 +@param count 脉冲个数 + +*/ +void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count) { FireBus_ClkAmend(cycle,duty,count,EW_TrimPlusCallback); EW_Trim_Flag = 0; @@ -907,7 +915,7 @@ uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) len = 10; } EW_CommBuf[3] = len; - memcpy((void*)(EW_CommBuf+4),buf,len); + memcpy((void*)EW_CommBuf+4,buf,len); DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -947,7 +955,7 @@ uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) len = 10; } EW_CommBuf[3] = len; - memcpy((void*)(EW_CommBuf+4),buf,len); + memcpy((void*)EW_CommBuf+4,buf,len); DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -978,7 +986,7 @@ uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot) { ul_bootflag = 0x9966AA55; } - memcpy((void*)(EW_CommBuf+2),&ul_bootflag,4); + memcpy((void*)EW_CommBuf+2,&ul_bootflag,4); DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0); return 0; } @@ -1000,7 +1008,7 @@ uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg) addr = (addr & 0xFFC0) | 20; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&runcfg,3); + memcpy((void*)EW_CommBuf+2,&runcfg,3); DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -1036,7 +1044,7 @@ uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_ addr = (addr & 0xFFC0) | 21; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),uid,uid_len); + memcpy((void*)EW_CommBuf+2,uid,uid_len); DMod_SendBytes((uint8_t*)EW_CommBuf,uid_len+2,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -1075,7 +1083,7 @@ uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; EW_CommBuf[2] = pwd_flag; - memcpy(((void*)(EW_CommBuf+3)),&delay,2); + memcpy(((void*)(EW_CommBuf)+3),&delay,2); memcpy((void*)(EW_CommBuf+5),uid,uid_len); uid_len +=5; DMod_SendBytes(((uint8_t*)(EW_CommBuf)),uid_len,EW_DMOD_Peroid,uc_readflag); @@ -1106,7 +1114,7 @@ uint8_t EW_SetDelay(uint16_t addr,uint16_t delay) addr = (addr & 0xFFC0) | 23; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&delay,2); + memcpy((void*)EW_CommBuf+2,&delay,2); DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) @@ -1130,7 +1138,7 @@ uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len) addr = (addr & 0xFFC0) | 24; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),pwd,pwd_len); + memcpy((void*)EW_CommBuf+2,pwd,pwd_len); pwd_len += 2; DMod_SendBytes((uint8_t*)EW_CommBuf,pwd_len,EW_DMOD_Peroid,0); return 0; @@ -1282,7 +1290,7 @@ uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint16_t cfg_state,uint8 EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; memcpy((uint8_t*)&EW_CommBuf[2],&cfg_mask,3); - memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,2); + memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,3); EW_CommBuf[8] = *rtv; DMod_SendBytes((uint8_t*)EW_CommBuf,9,EW_DMOD_Peroid,1); delay_ms(5); @@ -1388,7 +1396,6 @@ uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur) EW_CommBuf[2] = speed; EW_CommBuf[3] = cur; DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); - return 0; } /* @@ -1408,7 +1415,7 @@ uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr) addr = (addr & 0xFFC0) | 36; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&new_addr,2); + memcpy((void*)EW_CommBuf+2,&new_addr,2); DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -1525,6 +1532,4 @@ uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len) uc_ack = 1; } return uc_ack; -} - - +} \ No newline at end of file diff --git a/source/elec_det/driver/EWDriver.h b/source/elec_det/driver/EWDriver.h index 0049cb6..1cb42cc 100644 --- a/source/elec_det/driver/EWDriver.h +++ b/source/elec_det/driver/EWDriver.h @@ -122,7 +122,14 @@ volatile struct #define EW_BOOTLOADER_RUN 61 //运行bootloader #define EW_RA_REGISTER 62 //读MTP #define EW_WA_REGISTER 63 //写MTP +/* +@brief 发送校准脉冲 +@param cycle 周期 +@param duty 总线高电平时间 +@param count 脉冲个数 +*/ +void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count); /* @brief 单端第二版,差分接收数据 @param *buf 数据缓存指针 diff --git a/source/elec_det/elec_cmd.c b/source/elec_det/elec_cmd.c new file mode 100644 index 0000000..d8d863f --- /dev/null +++ b/source/elec_det/elec_cmd.c @@ -0,0 +1,30 @@ +#include "elec_det.h" +#include "commend.h" +#include "mystring.h" + + + + +// 电子模块相关调试命令 + + + +static int cmd_check(list_def *argv) +{ + array_def *data=arr_creat(); + cmd_print("start check."); + elec_check_with_scheme(data); + arr_delete(data); + return 0; +} +commend_export(check,cmd_check,"start check") + + + + + + + + + + diff --git a/source/elec_det/elec_det.c b/source/elec_det/elec_det.c index c65add8..ce08c16 100644 --- a/source/elec_det/elec_det.c +++ b/source/elec_det/elec_det.c @@ -1,6 +1,7 @@ #include "board.h" #include "bytearray.h" #include "mystdlib.h" +#include "debug.h" #include "elec_det.h" #include "base/delay.h" @@ -23,15 +24,42 @@ typedef struct{ - CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//ṹָ - + CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针 + int scheme_inited; }self_def; static self_def g_self; -// ȡַ + + +// 初始化 +int elec_init(void) +{ + self_def *s=&g_self; + void Ye_BoardInit(void); + void Ye_BoardCheck(void); + int elec_check_scheme(void); + void elec_load_scheme(void); + Ye_BoardInit(); + Ye_BoardCheck(); + if(elec_check_scheme()!=0){ + // 方案校验失败 + DBG_WARN("scheme check failed."); + s->scheme_inited=0; + return 1; + } + s->scheme_inited=1; + elec_load_scheme(); + return 0; +} + + + + + +// 获取本机地址 uint8_t elec_local_addr(void) { static uint8_t addr=0; @@ -41,13 +69,13 @@ uint8_t elec_local_addr(void) } -// led1״̬ +// 设置led1状态 void elec_led1_power(int power) { LED1_Out=power?1:0; } -// led2״̬ +// 设置led2状态 void elec_led2_power(int power) { LED2_Out=power?1:0; @@ -55,40 +83,44 @@ void elec_led2_power(int power) -// ȡ +// 获取检测结果 array_def *elec_check_result(void) { array_def *r=arr_creat(); - + arr_append(r,3); return arr_temp(r); } -// дӲ汾 -int elec_write_hardversion(int version) +// 写硬件版本号 +array_def *elec_write_hardversion(int version) { + array_def *r=arr_creat(); board_st.hard_v=version; - return 0; + arr_append(r,0); + return arr_temp(r); } -// дУ׼ֵ -int elec_write_resistor_cbv(int cbv) +// 写电阻校准值 +array_def *elec_write_resistor_cbv(int cbv) { + array_def *r=arr_creat(); board_st.resistor_diff=cbv; + arr_append(r,0); return 0; } -// ˿ֵ +// 测量桥丝阻值 array_def *elec_check_resistor(void) { /* - 1 ͨ1-4ͨ˿ - 2 ͨ2-3ͨ˿ - 3 ͨ1-3ͨ迹 - 4 ͨ2-4ͨ迹 + 1 通道1-4通,过桥丝 + 2 通道2-3通,过桥丝 + 3 通道1-3通,测阻抗 + 4 通道2-4通,测阻抗 */ uint16_t aus_sample[5]; uint16_t us_resistor; @@ -98,7 +130,7 @@ array_def *elec_check_resistor(void) { aus_sample[uc_index] -= board_st.resistor_diff; } - // ȡвģʽ + // 读取方案中测量电阻的模式 switch(0) { case 0: us_resistor = aus_sample[0];break; @@ -117,7 +149,7 @@ array_def *elec_check_resistor(void) -// У鷽,0ɹ +// 校验方案,返0成功 static int elec_check_scheme(void) { uint32_t ul_crc32; @@ -135,7 +167,7 @@ static int elec_check_scheme(void) -// ط +// 加载方案 static void elec_load_scheme(void) { self_def *s=&g_self; @@ -159,7 +191,7 @@ static void elec_load_scheme(void) } -// м +// 进行检测 array_def *elec_check_with_scheme(array_def *uid_psw) { self_def *s=&g_self; @@ -172,10 +204,14 @@ array_def *elec_check_with_scheme(array_def *uid_psw) uint8_t res=0; array_def *r=arr_creat(); chip_type=(board_st.plan_id >> 12 ) & 0x0F; - if(chip_type>=LENGTH(tasks_fun_table)){ + if(s->scheme_inited==0){ arr_append(r,1); return arr_temp(r); } + if(chip_type>=LENGTH(tasks_fun_table)){ + arr_append(r,2); + return arr_temp(r); + } memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st)); int task_index=0; int err_flag=0; @@ -184,8 +220,8 @@ array_def *elec_check_with_scheme(array_def *uid_psw) memset(&checker_runcfg.task_info,0,sizeof(CheckerTask_Info_st)); taskid=ptaskindex[task_index]; memset(checker_runcfg.params,0,20); - checker_runcfg.param_count = 0;// - checker_runcfg.rtv_count = 0;//ֵ + checker_runcfg.param_count = 0;//参数个数 + checker_runcfg.rtv_count = 0;//返回值个数 checker_runcfg.excue_rtv = 0; checker_runcfg.task_info.retry_time = 0; if(taskid>=CHECKER_MAXID_COUNT){ @@ -200,13 +236,13 @@ array_def *elec_check_with_scheme(array_def *uid_psw) break; } - // װز + // 装载参数 rt_memcpy(&checker_runcfg.task_info,task_par,sizeof(CheckerTask_Info_st)); checker_runcfg.param_count = checker_runcfg.task_info.param_rtv_count & 0x0F; checker_runcfg.rtv_count = (checker_runcfg.task_info.param_rtv_count >> 4) & 0x0F; rt_memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2); - // ִ + // 执行任务 for(int i=0;i<1+task_par->retry_time;i++) { checker_runcfg.excue_rtv=1; @@ -216,23 +252,23 @@ array_def *elec_check_with_scheme(array_def *uid_psw) break; } - // Ѱһ + // 找寻下一个任务 if((checker_runcfg.excue_rtv != 0) && (checker_runcfg.task_info.error_jumpto != 0) && (checker_runcfg.task_info.error_jumpto != 0xFF) ) { - uint8_t uc_index = task_index+1;//ʱһֱ˳ִ + uint8_t uc_index = task_index+1;//如果时跳至下一个,直接顺序执行 task_index = checker_runcfg.task_info.error_jumpto; while(uc_index < task_index) { - Checker_MaskResult(1,uc_index);//IJδִ - //ֵ±꣬IJķֵ洢ռ䱣 + Checker_MaskResult(1,uc_index);//将跳过的步骤标记未执行 + //调整参数返回值下标,将跳过的步骤里面的返回值存储空间保留 checker_runcfg.rtv_index += (s->task_info_array[uc_index]->param_rtv_count >> 4) & 0x0F; uc_index++; } }else{ - task_index++;//ֱ˳ִ + task_index++;//正常情况直接顺序执行 } } @@ -246,3 +282,5 @@ array_def *elec_check_with_scheme(array_def *uid_psw) + + diff --git a/source/elec_det/elec_det.h b/source/elec_det/elec_det.h index 1d3b448..d415c36 100644 --- a/source/elec_det/elec_det.h +++ b/source/elec_det/elec_det.h @@ -3,10 +3,10 @@ #include "stdint.h" +#include "bytearray.h" - - +int elec_init(void); uint8_t elec_local_addr(void); @@ -14,10 +14,15 @@ void elec_led1_power(int power); void elec_led2_power(int power); +array_def *elec_check_result(void); +array_def *elec_write_hardversion(int version); +array_def *elec_write_resistor_cbv(int cbv); +array_def *elec_check_resistor(void); +array_def *elec_check_with_scheme(array_def *uid_psw); diff --git a/source/elec_det/hardware/gpio_cfg.h b/source/elec_det/hardware/gpio_cfg.h index 1d69c26..e760ac5 100644 --- a/source/elec_det/hardware/gpio_cfg.h +++ b/source/elec_det/hardware/gpio_cfg.h @@ -273,7 +273,8 @@ #define EW_SINGLE_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} #define EW_SINGLE_MOD_H HMOS_SWITCH_W_1 -#define EW_DIFF_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} +#define EW_DIFF_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PBout(OUTAH_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} + #define EW_DIFF_MOD_H HMOS_SWITCH_W_1 #define EW_DIFF_MOD_L HMOS_SWITCH_W_0 #define EW_BUS_OFF HMOS_SWITCH_OFF diff --git a/source/elec_det/hardware/jw3425iic.c b/source/elec_det/hardware/jw3425iic.c index 509a449..8404066 100644 --- a/source/elec_det/hardware/jw3425iic.c +++ b/source/elec_det/hardware/jw3425iic.c @@ -625,9 +625,14 @@ void MC_IICUpdateMTP(void) if(checker_runcfg.params[0] == 0x1000) { auc_setMTPOperReg_cmd[2] = 0x04; + auc_earse_cmd[0]= 0x27; + auc_earse_cmd[1]= 0xD8; + }else{ auc_setMTPOperReg_cmd[2] = 0x00; } + auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF; + auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF; uc_ack = 0; uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0); delay_ms(5); @@ -645,8 +650,7 @@ void MC_IICUpdateMTP(void) return; } - auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF; - auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF; + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setMTPOperReg_cmd,sizeof(auc_setMTPOperReg_cmd),&ul_sendlen,0); //设置MTP操作范围 if(uc_ack != 0) diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c new file mode 100644 index 0000000..e6d846d --- /dev/null +++ b/source/elec_det/interface/EWChecker.c @@ -0,0 +1,259 @@ + +#include "EWChecker.h" +#include "driver/EWDriver.h" +#include "base/delay.h" +#include "hardware/adc_cfg.h" +#include "base/utility.h" +#include "hardware/power.h" +#include "hardware/timer_cfg.h" + + +#define UPDATA_PACK_LEN 58 +#define UPDATA_BASE_ADDR 0x1000 +#define UPDATA_DATA_LEN (12*1024) +#define UPDATA_FLAG_ADDR (0x3c7c) +//#define UPDATA_FLAG ((uint8_t []){0x99,0x66,0xaa,0x55}) +#define UPDATA_FLAG ((uint8_t []){0xaa,0xbb,0xcc,0xdd}) + +// 擦除 +static uint8_t EW_Erease(void) +{ + uint8_t data[3]={0xfe,0x00,0x00}; + uint8_t read[4]={0}; + uint8_t ret=0; + DMod_SendBytesXor(data,2,1); + ret=DMod_ReadBytesXor(read,4,100); + delay_ms(50); + return ret; +} + + +// 跳转 +static uint8_t EW_Jump(void) +{ + uint8_t data[3]={0xf9,0x00,0x00}; + uint8_t read[4]={0}; + uint8_t ret=0; + DMod_SendBytesXor(data,2,1); + ret=DMod_ReadBytesXor(read,4,100); + delay_ms(50); + return ret; +} + + +// 充电 +static uint8_t EW_Charg(void) +{ + uint8_t data[4]={0xf8,0x01,0x04,0x00}; + uint8_t read[4]={0}; + uint8_t ret=0; + delay_ms(2000); + DMod_SendBytesXor(data,3,1); + ret=DMod_ReadBytesXor(read,4,100); + delay_ms(5000); + return ret; +} + +// 发送数据 +// len 最长为58字节 +static uint8_t EW_Write(uint16_t addr,uint8_t *d,uint16_t len) +{ + uint8_t ret=0; + uint8_t read[4]={0}; + uint8_t *buf=rt_malloc(len+2+2+1); + if(buf==RT_NULL) return 1; + buf[0]=0xfc; + buf[1]=2+len; + buf[2]=addr&0xff; + buf[3]=addr>>8; + rt_memcpy(&buf[4],d,len); + DMod_SendBytesXor(buf,len+2+2,1); + ret=DMod_ReadBytesXor(read,4,100); + rt_free(buf); + delay_ms(50); + return ret; +} + + + +// 校验 +static uint8_t EW_CheckCrc(uint16_t adr_start,uint16_t adr_end,uint32_t *crc) +{ + uint8_t ret=0; + uint8_t cmd[7]={0xfb,0x04,adr_start&0xff,adr_start>>8,adr_end&0xff,adr_end>>8}; + uint8_t read[4+4]={0}; + DMod_SendBytesXor(cmd,6,1); + ret=DMod_ReadBytesXor(read,8,100); + if(ret==0){ + if(crc){ + *crc=(read[3])|(read[4]<<8)|(read[5]<<16)|(read[6]<<24); + } + } + delay_ms(50); + return ret; +} + + + +// 读取 +static uint8_t EW_Read(uint16_t adr,uint8_t *buf,uint16_t len) +{ + uint8_t ret=0; + uint8_t cmd[7]={0xfa,0x03,adr&0xff,adr>>8,len}; + uint16_t read_len=2+len+1+1; + uint8_t *read=rt_malloc(read_len); + if(read==RT_NULL) return 1; + DMod_SendBytesXor(cmd,6,1); + ret=DMod_ReadBytesXor(read,read_len,100); + rt_memset(buf,0,len); + if(ret==0) + { + rt_memcpy(buf,&read[3],len); + } + delay_ms(50); + rt_free(read); + return ret; +} + + +// 升级 +void EW_Updata(void) +{ + Checker_RunCfg_st *cfg=&checker_runcfg; + uint8_t ret=0; + uint8_t *data=(uint8_t *)MC_CODE_ADDR; + uint16_t len=UPDATA_DATA_LEN; + uint16_t addr=UPDATA_BASE_ADDR; + uint8_t pack_len=UPDATA_PACK_LEN; + uint32_t crc=0; + uint32_t crc_module=0; + ret=EW_Charg(); + if(ret) {ret=1;goto err;} + ret=EW_Erease(); + if(ret) {ret=2;goto err;} + while(len>0){ + pack_len=len>UPDATA_PACK_LEN?UPDATA_PACK_LEN:len; + ret=EW_Write(addr,data,pack_len); + addr+=pack_len; + data+=pack_len; + len-=pack_len; + if(ret) {ret=3;goto err;} + } + crc=Crc32Calu((uint32_t *)MC_CODE_ADDR,UPDATA_DATA_LEN/4); + ret=EW_CheckCrc(UPDATA_BASE_ADDR,UPDATA_BASE_ADDR+UPDATA_DATA_LEN,&crc_module); + if(ret) {ret=4;goto err;} + if(crc!=crc_module) + {ret=5;goto err;} + ret=EW_Jump(); + if(ret) {ret=6;goto err;} + delay_ms(100); + ret=EW_EnWriteMTP(0,1); + if(ret) {ret=7;goto err;} + delay_ms(100); + // 数据溢出 +// ret=EW_WriteMTP(0,(uint8_t)(UPDATA_FLAG_ADDR/4),UPDATA_FLAG,4); + if(ret) {ret=8;goto err;} + delay_ms(100); + + err: + Checker_MaskResult(ret,checker_runcfg.task_info.runindex); +} + + + +void EW_Test_PowerOFF(void) +{ + uint8_t uc_rtv = 0; + delay_os_ms(100); + XTBUS_OFF; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + + + + +void EW_Empty(void) +{ + Checker_RunCfg_st *cfg=&checker_runcfg; + int count=cfg->rtv_count; + while(count > 0) + { + cfg->Test_Rtv[cfg->rtv_index++] = 0; + count--; + } + Checker_MaskResult(0,cfg->task_info.runindex); +} + + + +void EW_Test_SetBusV(void) +{ + Checker_RunCfg_st *cfg=&checker_runcfg; + uint8_t uc_rtv = 0; + uint16_t us_h_v,us_m_v; + //us_h_v = cfg->params[0]; + us_h_v = 240; + if(us_h_v < 55) + { + uc_rtv = 1; + + }else{ + us_m_v = 50; + uc_rtv |= PowerCalibration_set(us_h_v,us_m_v); + XTBUS_ON + + us_m_v = ((us_h_v/80)+2)*60; + delay_ms(us_m_v); + us_h_v = Power_GetBousV(); + Checker_SetRtv(&us_h_v,cfg->rtv_count); + } + Checker_MaskResult(uc_rtv,cfg->task_info.runindex); + +} + + + +CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ={ +Checker_PowerPrapare, //0 电源准备 +EW_Empty, //1 上电充能 +EW_Test_SetBusV, //2 设置总线电压 +EW_Empty, //3 获取总线电流 +EW_Empty, //4 扫描UID +EW_Empty, //5 写配置参数 +EW_Empty, //6 验证配置 +EW_Empty, //7 模拟注码 +EW_Empty, //8 充能统计 +EW_Empty, //9 写现场值 网络id 延时 +EW_Empty, //10比对现场值 +EW_Empty, //11 桥丝通断检测 +EW_Empty, //12 电容容量统计 +EW_Empty, //13 延时等待 +EW_Empty, //14 写管壳号/工厂信息 +EW_Empty, //15 写UID +EW_Empty, //16 写密码 +EW_Empty, //17 写入/检测备份区标志 +EW_Empty, //18 读取备份区数据 +EW_Empty, //19 校准 +EW_Empty, //20 使能通讯末电流采集 +EW_Empty, //21 获取通讯末电流 +EW_Empty, //22 放电 +EW_Empty, //23 在线检测 +EW_Empty, //24 状态检测 +EW_Empty, //25 起爆 +EW_Empty, //26 复位 +EW_Test_PowerOFF, //27 关总线 +EW_Empty, //28 芯片锁存 +EW_Empty, //29 使能赋码设备 +EW_Empty, //30 在线检测 +EW_Empty, //31 密码验证 +EW_Empty, //32 加载芯片配置 +EW_Empty, //33 电容压差测试 +Checker_ResistorSample,//34 桥丝电阻测试 +EW_Empty, //35 检测过程中注码 +EW_Empty, //36 验证注码 +EW_Empty, //37 模块在线检测 +EW_Updata, //38 升级 +(void*)0 //数组结束 +}; + + diff --git a/source/elec_det/interface/EWChecker.h b/source/elec_det/interface/EWChecker.h new file mode 100644 index 0000000..47b80c3 --- /dev/null +++ b/source/elec_det/interface/EWChecker.h @@ -0,0 +1,22 @@ +#ifndef EWChecker_h__ +#define EWChecker_h__ +#include "base/define.h" +#include "basechecker.h" +#include "stdint.h" + + + + + +extern CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ; + + + + + + + + + +#endif + diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index 254cf00..aef8df8 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-10-06 18:40:44" +#define BUILD_DATE "2023-10-07 18:12:30" #define SOFT_VERSION "0.03" diff --git a/source/main/main.c b/source/main/main.c index 72d8d64..4681c0a 100644 --- a/source/main/main.c +++ b/source/main/main.c @@ -19,7 +19,7 @@ #include "mymisc.h" #include "dev_backup.h" #include "compiler_info.h" - +#include "elec_det.h" @@ -31,6 +31,7 @@ int main() { const sys_param_def *par=sys_param(); debug_init(); + elec_init(); app_init(); protu_def *protu=app_variable("protu",0,0); @@ -52,7 +53,10 @@ int main() while(1) { - rt_thread_mdelay(5000); + elec_led2_power(1); + rt_thread_mdelay(300); + elec_led2_power(0); + rt_thread_mdelay(300); } } diff --git a/source/soft/debug.c b/source/soft/debug.c index 984c950..f39c7ea 100644 --- a/source/soft/debug.c +++ b/source/soft/debug.c @@ -1,5 +1,5 @@ - +#include "board.h" #include "if_rtt.h" #include "stdio.h" #include "stdarg.h" @@ -8,19 +8,44 @@ #ifdef RT_THREAD #include "rtthread.h" #endif -#define DBG_DEV rtt() +#if 0 + + +#define DBG_DEV_INIT() rtt()->init() +#define DBG_DEV_WRITE(d,len) rtt()->write(d,len) + +#else + +#define DBG_DEV_INIT()\ + {\ + g_data.uart=dev_get("uart1");\ + if(g_data.uart){\ + g_data.uart->init(g_data.uart,0);\ + }\ + } +#define DBG_DEV_WRITE(d,len)\ + {\ + if(g_data.uart){\ + g_data.uart->write(g_data.uart,d,len);\ + }\ + } + +#endif + #define CONSOLEBUF_SIZE 1024 + typedef struct{ int inited; #ifdef RT_THREAD struct rt_mutex mutex; #endif + uart_def *uart; }self_def; static self_def g_data; @@ -32,8 +57,8 @@ int debug_init(void) #ifdef RT_THREAD rt_mutex_init(&g_data.mutex,"debug_mutex",RT_IPC_FLAG_FIFO); #endif - DBG_DEV->init(); - DBG_DEV->write((const uint8_t *)"\r\n",2); + DBG_DEV_INIT(); + DBG_DEV_WRITE((const uint8_t *)"\r\n",2); g_data.inited=1; DBG_LOG("debug inited.\r\n"); } @@ -64,7 +89,7 @@ void debug_log(const char *file,const char *fun,int line,int level,const char *f va_end(args); memcpy(&log_buf[length],"\r\n",2); length+=2; - DBG_DEV->write((const uint8_t *)log_buf,length); + DBG_DEV_WRITE((const uint8_t *)log_buf,length); #ifdef RT_THREAD rt_mutex_release(&g_data.mutex); #endif diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c index f5b6369..a2e6f27 100644 --- a/source/task/prot_uc.c +++ b/source/task/prot_uc.c @@ -199,7 +199,7 @@ static void protu_set_endecode_fun(protu_def *u) static int protu_init(void) { const sys_param_def *par=sys_param(); - const char *name="uart1"; + const char *name="host"; protu_def *protu=protu_creat(dev_get(name)); app_variable("protu",protu,0); diff --git a/source/task/tran_for_slave.c b/source/task/tran_for_slave.c index 86c5f9f..23c7055 100644 --- a/source/task/tran_for_slave.c +++ b/source/task/tran_for_slave.c @@ -11,14 +11,356 @@ #include "coder_judge.h" #include "JQ_UIDGenerate.h" #include "transmit.h" - - - - - - - - +#include "elec_det.h" +#include "crc.h" +#include "dev_backup.h" + + +typedef struct{ + ucport_def u; + rt_timer_t timer; +}slave_def; + + + + +static void slave_del(ucport_def *u) +{ + slave_def *s=(slave_def *)u; + CHECK_DO(s->timer,rt_timer_delete); + free(u); +} + + + +// 获取检测结果 +static int check_result_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + emit tran_reply_signal(u->p,arr_temp(elec_check_result())); + return 0; +} +static ucport_def *check_result(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=check_result_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x02,check_result) + + + +// 设置硬件版本号 +static int write_hw_version_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + int value=arr_get(data,0)|(arr_get(data,1)<<8); + emit tran_reply_signal(u->p,arr_temp(elec_write_hardversion(value))); + return 0; +} +static ucport_def *write_hw_version(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_hw_version_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x03,write_hw_version) + + + + + +// 设置电阻校准值 +static int write_resistor_cbv_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + int value=arr_get(data,0)|(arr_get(data,1)<<8); + emit tran_reply_signal(u->p,arr_temp(elec_write_resistor_cbv(value))); + return 0; +} +static ucport_def *write_resistor_cbv(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + int value=arr_get(data,0)|(arr_get(data,1)<<8); + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_resistor_cbv_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x04,write_resistor_cbv) + + + + +// 测量桥丝阻值 +static int check_resistor_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + emit tran_reply_signal(u->p,arr_temp(elec_check_resistor())); + return 0; +} +static ucport_def *check_resistor(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=check_resistor_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x05,check_resistor) + + + + + + +// 根据方案检测 +static int check_with_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + emit tran_reply_signal(u->p,arr_temp(elec_check_with_scheme(data))); + return 0; +} +static ucport_def *check_with_scheme(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=check_with_scheme_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x0b,check_with_scheme) +transmit_export(ym_slave,0x0c,check_with_scheme) + + + + + +// 停止上报 +static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + array_def *r=arr_creat(); + arr_append(r,0); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *stop_submit(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=stop_submit_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x14,stop_submit) + + + + + + + +// 定义地址宏 +// 本程序中程序下载地址不是这个地址,在此用来计算偏移量 +#define MCU_APP_ADDR_BASE 0x8004000 +#define MCU_TASKID_ADDR_BASE 0x803f000 + +// 定义升级结构体 +typedef struct{ + uint8_t device_state; + uint32_t flash_addr; +}updata_def; +static updata_def g_updata; + + +// 查询设备状态,第一次返回在app,如果设置了跳转指令则返回在bootloader +// 1:app;2:bootleader +static int device_state_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + array_def *r=arr_creat(); + arr_append(r,g_updata.device_state+1); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *device_state(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=device_state_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xf9,device_state) + +// 跳转至bootloader,这里只是改变标志,实际还是在app中 +static int turn_to_bootloader_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + g_updata.device_state=1; + array_def *r=arr_creat(); + arr_append(r,0); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *turn_to_bootloader(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=turn_to_bootloader_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xf8,turn_to_bootloader) + + + + +// 生成文件头 +static uint32_t creat_file_head(uint32_t addr,const char *name) +{ + uint8_t *td=calloc(FLASH_FILE_HEAD_SIZE,sizeof(uint8_t)); + // 文件大小和文件名 + memcpy(td,name,strlen(name)); + // used字段 + ((flash_file *)td)->used=0xffffffff; + flash_write((uint8_t *)addr,td,FLASH_FILE_HEAD_SIZE); + free(td); + return addr+FLASH_FILE_HEAD_SIZE; +} + + +// 擦除app空间 +static int erase_app_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + flash_erase_app2(); + g_updata.flash_addr=creat_file_head((uint32_t)flash_get_app2(),"slave_app.pkt"); + array_def *r=arr_creat(); + arr_append(r,0); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *erase_app(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=erase_app_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xfe,erase_app) + + + + +// 写入数据 +// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度 +static int write_data_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24); + int len=arr_length(data)-4; + int ret=0; + uint32_t offset=addr-MCU_APP_ADDR_BASE; + addr=g_updata.flash_addr+offset; + ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len); + array_def *r=arr_creat(); + arr_append(r,(ret!=0)); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *write_data(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_data_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xfc,write_data) + + + + +// 校验并跳转 +static int ceck_crc_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + uint32_t addr_start=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24); + uint32_t addr_end=(arr_get(data,4))|(arr_get(data,5)<<8)|(arr_get(data,6)<<16)|(arr_get(data,7)<<24); + uint32_t crc32=(arr_get(data,8))|(arr_get(data,9)<<8)|(arr_get(data,10)<<16)|(arr_get(data,11)<<24); + int len=addr_end-addr_start; + addr_start+=FLASH_FILE_HEAD_SIZE; + int ret=(crc32!=crc_crc32((uint8_t *)addr_start,len)); + array_def *r=arr_creat(); + arr_append(r,ret); + emit tran_reply_signal(u->p,arr_temp(r)); + if(ret==0){ + later_execute((void (*)(void *))bk_reboot_app,0,100); + } + return 0; +} +static ucport_def *ceck_crc(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=ceck_crc_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xfb,ceck_crc) + + + + + +// 写入数据,这个命令会自动擦除 +// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度 +static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24); + int len=arr_length(data)-4; + int ret=0; + if((addr)==MCU_TASKID_ADDR_BASE){ + flash_erase_scheme(); + g_updata.flash_addr=creat_file_head((uint32_t)flash_get_scheme(),"scheme.bin"); + } + uint32_t offset=addr-MCU_TASKID_ADDR_BASE; + addr=g_updata.flash_addr+offset; + ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len); + array_def *r=arr_creat(); + arr_append(r,(ret!=0)); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *write_data2(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_data2_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x11,write_data2)