From dd55208f397dbed357302fce22985784e688eab4 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 19 May 2024 15:04:59 -0500 Subject: [PATCH] maple: add maple_bus_ft6 --- maple/maple_bus_ft6.hpp | 76 ++++++++++++++++++++++++++++++++++ regs/gen/maple_data_format.py | 4 +- regs/maple_bus_ft6.csv | 15 +++++++ regs/maple_bus_ft6.ods | Bin 11785 -> 13914 bytes 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 maple/maple_bus_ft6.hpp create mode 100644 regs/maple_bus_ft6.csv diff --git a/maple/maple_bus_ft6.hpp b/maple/maple_bus_ft6.hpp new file mode 100644 index 0000000..cbdcb15 --- /dev/null +++ b/maple/maple_bus_ft6.hpp @@ -0,0 +1,76 @@ +namespace ft6 { + namespace data_transfer { + namespace modifier_key { + constexpr uint32_t s2() { return 0b1 << 7; } + constexpr uint32_t s2(uint32_t reg) { return (reg >> 7) & 0b1; } + + constexpr uint32_t right_alt() { return 0b1 << 6; } + constexpr uint32_t right_alt(uint32_t reg) { return (reg >> 6) & 0b1; } + + constexpr uint32_t right_shift() { return 0b1 << 5; } + constexpr uint32_t right_shift(uint32_t reg) { return (reg >> 5) & 0b1; } + + constexpr uint32_t right_control() { return 0b1 << 4; } + constexpr uint32_t right_control(uint32_t reg) { return (reg >> 4) & 0b1; } + + constexpr uint32_t left_gui() { return 0b1 << 3; } + constexpr uint32_t left_gui(uint32_t reg) { return (reg >> 3) & 0b1; } + + constexpr uint32_t left_alt() { return 0b1 << 2; } + constexpr uint32_t left_alt(uint32_t reg) { return (reg >> 2) & 0b1; } + + constexpr uint32_t left_shift() { return 0b1 << 1; } + constexpr uint32_t left_shift(uint32_t reg) { return (reg >> 1) & 0b1; } + + constexpr uint32_t left_control() { return 0b1 << 0; } + constexpr uint32_t left_control(uint32_t reg) { return (reg >> 0) & 0b1; } + + } + + namespace led_state { + constexpr uint32_t shift() { return 0b1 << 7; } + constexpr uint32_t shift(uint32_t reg) { return (reg >> 7) & 0b1; } + + constexpr uint32_t power() { return 0b1 << 6; } + constexpr uint32_t power(uint32_t reg) { return (reg >> 6) & 0b1; } + + constexpr uint32_t kana() { return 0b1 << 5; } + constexpr uint32_t kana(uint32_t reg) { return (reg >> 5) & 0b1; } + + constexpr uint32_t reserved0() { return 0b1 << 4; } + constexpr uint32_t reserved0(uint32_t reg) { return (reg >> 4) & 0b1; } + + constexpr uint32_t reserved1() { return 0b1 << 3; } + constexpr uint32_t reserved1(uint32_t reg) { return (reg >> 3) & 0b1; } + + constexpr uint32_t scroll_lock() { return 0b1 << 2; } + constexpr uint32_t scroll_lock(uint32_t reg) { return (reg >> 2) & 0b1; } + + constexpr uint32_t caps_lock() { return 0b1 << 1; } + constexpr uint32_t caps_lock(uint32_t reg) { return (reg >> 1) & 0b1; } + + constexpr uint32_t num_lock() { return 0b1 << 0; } + constexpr uint32_t num_lock(uint32_t reg) { return (reg >> 0) & 0b1; } + + } + + struct data_format { + uint8_t modifier_key; + uint8_t led_state; + uint8_t scan_code_array[6]; + }; + static_assert((sizeof (struct data_format)) == 8); + } + + namespace set_condition { + struct data_format { + uint8_t led_setting; + uint8_t w1_reserved; + uint8_t w2_reserved; + uint8_t w3_reserved; + }; + static_assert((sizeof (struct data_format)) == 4); + } + +} + diff --git a/regs/gen/maple_data_format.py b/regs/gen/maple_data_format.py index 4be5c48..264a916 100644 --- a/regs/gen/maple_data_format.py +++ b/regs/gen/maple_data_format.py @@ -109,8 +109,10 @@ def render_format(format): yield f"uint8_t {field_name};" elif len(subfields) == 2: yield f"uint16_t {field_name};" + elif len(subfields) == 6: + yield f"uint8_t {field_name}[6];" else: - assert False, len(subfields) + assert False, (len(subfields), field_name) yield "};" assert format.size % 4 == 0, format.size diff --git a/regs/maple_bus_ft6.csv b/regs/maple_bus_ft6.csv new file mode 100644 index 0000000..d8f1801 --- /dev/null +++ b/regs/maple_bus_ft6.csv @@ -0,0 +1,15 @@ +"data_transfer",7,6,5,4,3,2,1,0 +"modifier_key","S2","Right_Alt","Right_Shift","Right_Control","Left_GUI","Left_Alt","Left_Shift","Left_Control" +"led_state","Shift","Power","Kana","reserved0","reserved1","Scroll_Lock","Caps_Lock","Num_Lock" +"scan_code_array",,,,,,,, +"scan_code_array",,,,,,,, +"scan_code_array",,,,,,,, +"scan_code_array",,,,,,,, +"scan_code_array",,,,,,,, +"scan_code_array",,,,,,,, +,,,,,,,, +"set_condition",7,6,5,4,3,2,1,0 +"led_setting",,,,,,,, +"w1_reserved",,,,,,,, +"w2_reserved",,,,,,,, +"w3_reserved",,,,,,,, diff --git a/regs/maple_bus_ft6.ods b/regs/maple_bus_ft6.ods index c4c51d545f5f8c936dd9008c1c8d34e40d06a0ee..a84742363fff53cdef36829cd49c9b53b629b4eb 100644 GIT binary patch delta 11897 zcmb`t1yCJb(=Ix=6Wl$xySoQ>2=49<0R{^aJR5fn5;RyKI0V;V!6CrLAp}c;UGnDt z&i{SquY2mAsynq;P0!Q4x>v7Sd!CtD9c#SojH#gv2ag8;$N-R7*l3V~sR94z45@|T z{VPCWg#HTNF#P`rDU(zXV;H=@awZjo9tP*X@V`A$GP(byO9}t0f_TGFL1bVF{=pkf zU`1g5ks!Hn&%ra(gaizD);=Y%%O+hGzO=x&nEUj0pX1?7y89ctAZx!Bvg<+8sg8gP z=c?$78QG~#k&|NrIxabEgM-wT6N2E4;68-F3JIOlgBQwJqazQ<{F~1s=}F33aBK8O zooA-7)WVZ3h`xmlO}0jAj=oUV!6mt?w)iL$_l;(~cpWs_%2xC1<5$?1P43IXFN-GG@{zmySBQtvYC*b>37l zj3HN6YET9;y(3nWcc5n^WQuc`e52ZHV3?A||0(>7MTdWNpu|;G_vwcpJnCI+6pwk` zX(JL}B=z?m>k0j#E#?+@B4!eY5z!plo*!Zx1(TNUOIq#&9!rLA0!TV(j@8%iVTl#x z&m^vw8OI4A86jSeM`$N~f|i6$@${m+NN@)2>roy;NA`$xM2(gXU7@G$9)=cg6ireD z2xVRG(XY%jl#!4b?E6njU;sb~4gmfx6=Y=Of0hcw4S@_a+HhOp#|qgnqxSDvCwiF< z5j1^UJXUY1tc9m4ay(Herv#Obg?;hz8kErLW@Sm28OmQS4e>DlaoUySH?*y($G*WP z?Kr_j7%8VOwpY5*=)S`xTfA9yb2Ub3KKIJ+ewOYc_}dnjr76xgMc5=ct^4LwU)n*g zA?e@o$PkxtO{}f z|2qQ?(D>_QthNhBO?iva7CVIwLXX{x$RC|Kx6e2%$7A!ud9_LFURKzs9Z!4EJJw=YA3@!QFV3i?D-&t30n9^UGaAd0awXeU@n@6srj7T4=dYJx zEvo#GUUQ^%9loaZv%|K?m0PKg2|74ZIQfaeXpkY3rjdvT>y2$_v#)FIbagYD>sk9T z#t&TCuk)dGf$*C$&)_1(m}@z_Ea&Ufz(vv8z%vP>g41dvMcTGj@wY}mt z>mUcG?YG4!WAU$z3o1?lSeuG$D)Yh(csS8cG+Zh9!UfP|i1Y07O51(n<7<#%0WMya zr7l~AA@?+9^bKoS%Z1}`mb-E+7E&pc?Cr{W$n7xg*mQMHw`)ywj-ID#Z$v}mN{a#) zChmyNqpWE1QsuSkbz2KTk`TT@uh@IrDzM@UZG2#vZ7|k=qn#By3PJkRpmyTc^Gr+K z&uLN^CWfp7+Tq?T<(M*d?()UXFnr=G!x-(){Q}qhe4p?69tin0k+xar@BC&cnfc7V z>Tfjak_zJ@E0FK#wWQwQd)dMbhq1)T9XP{YXe=JharjdjZ|dD}kV%P55- zBd5Cu7hR4N^Va@0MSssg=!mMNDZ&oo@uLgI+hG*c#2?DZF1=R6h)zbLg~huShFq{+ z2LJA?`O-<=UH7WbRZJl+mPuwzcah}%Xv6@zRX}i-n?taTs{KL+5LUK6vg>NLbon9@ zc&)7>*H$VmPso}GXA=fDZ{o%3-PrMhnGP=?`FTT??Jw)=m&nj9|7rLKNgG*+zT?zBr&cjg~wx(%f7T38&9-Ki3} z=IU;Wn^FFR;-+X{pOUOjoO;9q>UUmDzX-tg$=Hn`*TN`3>|0BYW zX?0PA^wBeHn%{O|+qhHPxZqR!^J~2vxZvYEUYd=#%UB9tGkX}k&Lu=t4|(JfUC%um z^Qq)vs+&|;JlSvWo$=xD$-9mC=t?d*GG9|*=IrhwGA8iBv0Q=-Lt$g_WRouWD&SPW1T#p z)H5j1WM>ke7H{jv00u+YQ4jYZ3Uedw&Fs+PddjQzpIb!bOmDVCd(W#v=`I*QjZpgt zdcD}g4@-RpOK(%HC^Q6y(g<@%!5rj%_A>7MQa{-m0M)7?Nn*UKo5c#= z`(BYqbsyp83LR85J`c9nO}A__(SJ5@4QmcS>q!?AC;xROr1{_vK2C1x@(wx9Hnd(^ z#5?(fOHq#>ll?pl*j_SFUF5ydI{y5z!r#&u>QZ(jRpS&+MC()Nr4w@Stf_DzjNV*q zUyJA`tkp}LXNEWtqP4Hx3g_SK;G_!RtGb#E{o&C zrVj!N4sEh>OMpzc80hvvM`5oFSXp(pno_e}_!2*R&NTR|*pOkfh;p(ai$ls6e&`U# zpsRf;irzXq-mZY2pQG|?XkN5<7(RV9=AbUWFrNNPb-Dp%NqHo>a8hi1Tmj+I!m>}H z=16W4H;OoYIX46B@?kfu&L!KJ8EMW3EwZUjuW}RQWJ4C|dqe}yY zS-<2GaTbOKBd27UJaz)T%xya_Ud{(cXkbNx?1C z6dp~=nA}cYvgWl`w06ixCLyWyp)>ohXZu`tiD1;-DXr^WqU-jJg6mM8l6zs_uP^8~ zZ`l&6?5d#l6N_{)-PW>A1NltXso*z%T#4i@oSk)>Q!bh}Wsyd_gCl&Zil1q*gFQI| z2A!sg1QlX0b{MhD?qB6MZ>sFt1;LwIjgQ`DRfd!_-Jjq;J9j1jd_Sho(K*SVKxAeo zunG$Mlzk69eM3jNz{4CSs#~BAa~j+8W{W~rdDi}sgUFoaw+8+V;Z5n1U( za*iw2`gM~z+vHu*y}jyVo_>51b$NXhyV0&Vo7A@i%Zc|Ys{Ue`?(mcE3-kD&9&6zC z3lf=8^_$vYY95u&D<4(5+Dw1GO?;=!n=WSQR=B3%*9@k(KTg(I-1~lcerp(0rQ`S& z)>5ODRCXuZ5At1T{H&j2!cr+-+QO?;?t)E@pY_Z{Rq{%<5AwRi;h|p_M1q+6dKcEx z+=skx658m~ih8fclSBW@sDTK(e;))1WNwei)i4DV+>T)DU}Jy#p-tk8qG9MO2oS{7 z1xB&L*VUuD?vACmZYW6KE9^P@`QCQMy{E?uU7$J4APLk^Bx#RoIV!Rm(S~v)?uz_W zdVHshj34L`7#MimigcwopB<@pDMyu4gS>$%rM9IvQWi69qQRHYTtpeU@>>e@uUNQ~ zvsY;xY^mleCOIdzsFBAsI&zb<)9;zQ%6SO$moqxoQir!ie*d=31$jQS`{#@M&sbwF z6@d={PNyU!q%t35jr3?kiOqJqb(Yph+|YALc1*&8=+D%Y@}I@k;ct~-dWB!G)0!|-A?77-hMjR@Jl(T|JXG_wegP4 zmM2FlA@~;c{FAY*eI;E zvi!|4@3r2XX|-qLE}NvzV6yvLs%0|})=_^bObw~biQ+I0>#f^a-m!>ruo>dMJq*(Y zN>^=e5QJF)>(ju+`DME$$>F)p?yHLe7VfN{?9ToJ39vE0xFT}nn2r@$hpM-5M9)8m z$9zMC8MnhghXsd8R$Y>@zMXs+Tv#7R&}T*Y${nTCM2mA$ywp2EgQ)#C zazE$kD-mOEwbzI`*|Fleci819`hs@z99C?N2UwT zIP#sT;i)We7(rLVqpdqMFea!LM)dWk9Es;mf*VGO&z$*<4A|7mZwADwZ@(6|An(x% zQq`*}nj@zkKVN~HgJoQnQzaH-s!l29cRjcTsx(>TJ})8;f^eYwW$P|MJC|I zJbp6~nGch3r#aA!LUS&b3+tDr-~@}sqUelKjb;`NZgwUWDRCyDfpa`%m?8``)nZ-^Z2Q=U-7(~dihfK|!!W!8@MigAW(4hZ zuj%0pX>hZiF{wxgpg86wH&D|tJsy8QrRt@`G9~a95@(fi!IiadX`fSfYQFdllh_=o zdH_QY3MRo;r+h>TV?d4T$JIo^pn*3GwS^9o8nNx${66OTR!k7_o7o-NQh5BT@iX0i zqt4c=@K>pdR6$lq46Z!-IoI_K;>xg5QoKEatMipISO#!tSqq<)9q@REBVBiG4;h-{ z!Y5q`#d%CN2u+j7rp$h_X57Pt+3}d^_$+)M1;5z+Rw~s?HGiZtQ||uJ(#_(wg7>h5 zOSD7jc2bQ*gNk$e6GD*`KJWrl?s~{Ab{6sL>k9Z26qzO*5fwK8iLOT>w+Y5mZhEWj zv_>%K6(Xbi>#XJ%SX#q4EaLu{%P3^~Oyfuf)>9$FxOp7Z{N>g-LRiM>>iZ_gV%7Wz z-5_E614_YuotnMVV1|fv{dG5*@;oK{o2!HfxD1n;KiW>sgnd9gYdBfSl=~VKdxI(bj=x=CB4bjGBeM&*1W5 zKzyk$r@=>)$W=mzEMt+i-SMOB59Af&HCcX>1|~~fQw5zI_te|J; z$PXY_ojzO5GQnS2po$E8DbSvtIt)@@y~3(|WLlBP?v=E%>t^~A8e3;;XCFw$dd17= z{?vBLV_qLZkG~iSVjXXh-E+4=w6f=C_eF7a;xY%h80vzT z%<?Oo#Qm3zdQQuCN>u(T0-&O)ckmO+ABpc`NP^#p zEq_IZE<$~r*By^EPJHjUGU^bf>-EN@Tv5y|X)rQNkf8YEy6{w5ba6cC#+C)q+*aaF z3ZIfpGf6c-TIP{8Zc7)2%*E>Q8Zq{R=LPCrDFiM1tXAGp zIVv8)MW$zMBl9!EnJ1EEpafu0@dV^wd$cVvOt;K~aPoVdAI{|By?V877hF35Co>Ex zTfPLLFD@|ga|4+7)wI2wKx+T(=dC^DO$J~nm=^6Ba49LK<+u^|vX%9{;SKyI*Dpta zxOt)P8yie&HPt(I^0g}C-~P}U0sp{`Siq+HS5p!MNQLA9tP5 ze0lY&Dw{mQ*{w1?)pf<+uez1P%km$>(Y9*A3IUbK<0ClN_(NTpS5pY&Lrc*T3^gS) zyj3d`s1w(v$f3aIBf2E@78UHn6!80n01rkx$x9Fq{zI^@ef3apLD2QQyI1}yNpxNI z5jJob{D9&~e%WsOi!6v2J&(i7Rh?S1J%7*lva{=mcIxNgh{ubWYF*C!M4rTxnW_gc zaA<(fPB!zv<|{93-)hKjyG9B$@NizLABjns-zjDErD%UD@mE20?H%KOHB6q%i>ut@ zo%SmjN%9RObH-0p#w%2%kv#HJ&b7|{g>=Bu92$d}R^=iu@~fI3y=Qea=COoggE04b zSreZVwbMMTNncY+urem zv41HpPg5Xmrrwe3#hx|{4No)l{&G_uJL$ubPb%)X$dRrL&-hzfm~_v0KQ&wS2YJG; z^t24C>(O!;gRiA>b(KrX1V^bE+B*j--g_T4CJP7baih+XZeTW*{8SFr_QzF9!M2H> zgJ{O4*=#&suX$2+!GwvH_u`?&r|#T=6H4bAx1XR?(IWJMOi1PG9yW-2db%eXJFy-% zvJ%KX($RvRYeM?ng!kMImf9MgcBqcVE)pO7yfc^AGg=rUQUQ%t9-ev5jT<>dYL5fB z$i3{jo&$1I`|fF}X16$27yG;la9Dc^2J3T58$zhs_Zfrdc)MK9m)>Yp-*f1(zre;& zz*Bjr5&?2f*$Y$6g1}~#?}E*{81Gu3KK^=IvlJ@Fy!P|UTBE)=x)|K=`@8Q#+w3{v zIJldZx#Lc7R4u?VTIh=b&D0oqq#FgvSMZ$3CfS?NdqtENI6;tb9Jn5D5H2vY7G~U- zy}Epcy7N@eF+*^vQAjlBuH&w&q~jSt-iX&63pl9u4=0AZ!h9{Q@p>#mcAsQYY_~X> zRR|0r*6xy!2aJ4(4fOW+ol|HTydUU4lT=x%;MzFMK_J zG}N9jP&vJ<9jS+2%e4$_uoRxjGf7PDEQt77`dYn>3OOPC0NR-iGTgTIq3ziiZGAew zy4j1ijhTl6T?ykJAKE8;kE+4eIqz4WmYj1ea<67#Bt^;#!QFWH(8r9qL?C_TFfQcx zZDNRShDTA=!G}5*P!oQx_4&`ulib4~YVHY+n2@ZG`N}1=y{pWXO~n}qESKMDt(^I~ z;&VVUL`O7Wf-Mx}1TXL%0z!zpE$a*Xmb_~%Q>l{J-dJ}LwKnNoLp%* zR@n!siQN}q8qqOX2or_66xWSd!F-EImv>*pcBZr_Y@rheGBHer_h)oUGwIu=N@x$F>ZB_}e{~J%5{rHjBhyN5)=jOA$AuE^O=(9| zQkGzJR${o5c>PRkWFHI*_{KQ=z}!)Q4xAwXi5DOSg$=AD%r0hFVtajtvw}e(XTU%uD#JQLARY z-PRjn8T#34PrRI)C2Bj(y>(x2`TZ4juo_Vnly}*1Y#iN>ps|R{Onf(sN$-pj9=OMc zcx1Th(k(dGmr!5LTwOo@jJi6>`Bs7~Ctoy< z`;H9x&~w@8pcQ~IoT_Bdxv!9)1r`CSu(lxOKf>)~d1zjXYG3W9y=*e|f{FLtWVYY> zGOvTJO1}GabC!%VTGQnopyWq(uOm==iap4&8ryKyuBJ6oL?BwEEc%=I0ZWv90X&2B{#i4TeBBI87V5Z5S|O@L>qj>o7P}3 zW`E~A=rj3V*v54KVqWj!YtBz)4iG&?o?@RyS_WJ~QOD-ex+A1$&q1sJbv zM@7Su81?RCu#jd1h}{gdHD)4n&RY^lj;U(O*r`1h%E*8)g?TPv^2u5zj9FhtvuB9{iq7*fr>f#_wz0O$>HzCvkTEZpJ0x54 zRhtwxgQb!)e6F_NajK~~nmw$x5u~}W|i8r)fxK8-lKZ#$azYFWm^pt73 z$Y83N@`5~v_I>40PT^>$DBp4vLe@ruWWkhI*P_{9X71@P807HTo^W3j9A~4-=v6iw zUNUpm{r=KcNM!Qe511Qj1ThwOISZ^kmW_Y<7AS_?J?#7AOa!^XlZ{yn)(Ow-8gO5X ztl&U=>(r#4HYk85A%KWm1omgul0(D8q56U8!=Two;TZlu|(TN`ilh2<;srWY+ zXE8^7ud*E>;zl!h(VzT_`bnF0m_QBb;<5g66BYl8*ZOA-^)^foNC=Dlo{;iwk8onGe!qtHoauzgB*v6jLe(yY3yX8U}-Kfp5jZKMm~-wYwAbEixY7l zrBOrL-dASVhe+lcqh}#RjSBz|Uz1aIN0L(tNVr+hvnb&{_9vf9@L1=1hf`l{<6YWC z#rs$uK10u%J-`5Epd5Kl2l>}j}eK?JF% z?5ClC`S3CF=B?`mt_)(JDSV-{tq35&WnD|jRkA_K-Ds*oeW4Bbk#djhMWHiWhXCfY zsKl|Te}*uWJadLYtTVj2f%3STtoc_)+XOLX5b?Q&)N_pgqMLD0V2fQ zB>3D(^1zc98PxEn;Dr+~J;_VhJ!?_uwf+T!Fcry5m_40;!nDAIqGl1oeH~4fdOe;8 z@N-*hPMPkZ6!!$D{OJ~s$DJ!JtED5ZL; zngN!{0Q4+!m?wZT=4ql=V7^ZO@ktI`b3XOGfCDO$1GoU4;f@Ym`Pbvhe+)kZPl`jl zrWESg-sE2*e;u1Ymyr+VwFyJbQlNPX(oOyE(+5P2OJKopTDQOfGElJj&$v30{!C2} zg1OtD+1LQSeo40Av_3tEY~`{3`RX4GCY1WZ63EdT?n!QYj_?#}%}a{Yx(ngShg-ta zSpO@=pG6A))c)Mgo=*RE`4_);0@594OuXEWh7Q4Ik~iQgVW{)tCR(biL5&If)hbh7 z!#OchKDUD4!zdu{%y`Z|tpEtDc^EX0D(R=Gr47o7VuT5nO z7`-_5eYQCtgZgV&?+VKbT=wZ27Xri;plZI$JatU4Z*+EZ6`bs&R7VqA>_*n|}XRwoqdG(wg&Zt_%+eM=eD=Wd* z$-+ZxN2wpgRrgf2H5@V%9nIU)MW<)z5HMKhxku>y@GO*2G|O4^n4sBar3)1L*|ScE zaP})#;v%~!bRGIPJ=nMuEBpu(;c9`ij=5-#%ODGY&-dZL*FdF&0_v3X!g0sb2HS=V zE|iImHPoSP&8|GV{!McoBG#;jpLem#5>f@bkHN+V%RK!Tz@*h^wx(ZqRqX3`9&p0j zNr3dlx(_^7Xil&%toeSIf$f0ZRLcp_)K(1X$UM-tS;q@KAUxEvDs zy`)Mypj#B$l`1IiH%6MS@aM|={xmn!=|zu{nBT@t1XQKGvR0Ir#5oAH5wwj@87YtH z+m9y>0+szz!xppGPkw~d*!^z(qWp5S5==k4S&~w|7g#-7$G?h-O%4t!Owdf&)hpm7 zyllC%Ay241;-342{R@dh6Ybadh~S^U32f*FVBTgjvX#?3Y@N{MYXvmFYNY$QPczE8 z&1Em98rU0g-hw#23j5QU?F0W8;mT>tTiG7GtlhzJL+c5Ip6uoMF-#W7L@lEuc*@7E z>m)u1EuwY$mO;MIw@d?TtI6J0qUMy6XGxteJd>|SkJjmdGvY`|N_j=@Lr{TMld>5Hn-9mT@H@-Z3Q!u@r>D0>Jy(tB#JPO8MH-RO zn=xbW=(G{kM%t{zRbLBFu3C@GgLu2xBsG5si-oRTT1T~(Mu@HtG3 z(B9|FP7uJo)#hN%`|hkH-PiXnEkpTwax^UDZFrv+!;5Ot+3Q8Xkp3#r+X{1ieALc~ zvJ{Wu`FT}`dNtWT12C$13#o(T2F~UnbDDBpOn6z&*>`4vy?0|im`O1nq!+6NF|+h~ z0_?(DpI}r%DEI51A;R^1Lf~xlXqbxClo@P~RUczbgDLdJuEB%XWR>{fSy&Js-p5!D zMOWF@b))GKeXTIn$?a!V)&QNmQ0okqMfVt^xxnIfsma~8vMGE8WWr{I*%%TQ4VB1J zAl)P|^@@vw4AA|F)DA{}8%k`eLj;uQAK}d0dWn86PtyQf&#Ux)P*l0nIlD^SEN#h% zAjx%nCWrV(kZ2|s9;|N}@~@OMI1BcDGX(bwjm(^^s2eDH;A$|EllXEcbrsr;gDq zY>x@xicV~k&j8N#CZ9i%ZeBQh6uQZB`eYmO56j_?pzW|Z_o?_(-$7RCfVQRY=EMG7 zXR&S=Su!pdccGsEV{~G26N%d!^I;VUPU~r;RRL6CQtnm+v!|zqht=d?6)lLri9;dO zU?aCgVxKH|^wpEgAOj<~d*q&xWK9; zOOQm3djYFN+=iy_crAuSnGj4s-Qnu|0O1i$PV4-qwVtdwyJ@$FEJ(~Ns^NP|6TsS@$i3!0RMNI{!jJ) zy%q@l^BFeusZl+(f9}@*r%Mok{XePy@3jBlLjIwTibvpW+d_DF4XoB%2qxoyRTDEZ zdj3~6aX!=E!efXzGYRCB2@g`sLO}VanE5HE|8-FQFX@jE4+(?8gfoCW`HK{Lq{B=Q8|LKc|+R!IM2-MjfCot^Z$Lr;J>Z( fi6Jh8B#?SG^uG!8u#vzzaY9zv7!WtO{+RtgS5|rD delta 9820 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 V^f+83@Fa9FW-eOfDEi-6{{^EXCO`lH