jzf0L1)V9p6H
z3gB8Q#&S2%9#Fqj8Q5=NNgu6NePy{+Hi5Atz;X09;CmaKvonJf
z6=-jKSnH6D?OwvVD4^ZX&SNpfO9or+NhHY
zyPTk=qseE-#`l^f~9dpG4lMG4b9A2L7YTk2y{@;GO6p60uc
zd|rQ9}1eO^r_eRv(B>tlUxi_u5=Dc1OQ
zhe0LnDuI}DHs@(|-gd>DO?^0LbDnnhIlBUE43u#0=A3QMc}+s+9Bp~d*_@|;k#OGT
zoShZ8MW7v4D2DvIK-(X?)BL@@Jy@v!BJzyKG{kXia|h9+UEJpqr4PUPFs`>yKI?0n
z5PbKbGyXm++R<_i%N;=rNlV1<0OLK$l&%lI1JFNMC=sEi?_u!oNn3({cbeY~>Cq;Z
zHd>vuX^yE}z%2sp0DKm46L6kZ;k)cwyW^yd`m{IcWB#2G?XvoJxb4)(fOg$YAD(Ad
z0+l69bI!gG;^?C0r6PUe%#F~XC@_Ei6-z58>SH{np?yns#mRH^jwtQobx3mP!#SJx
zUz&mDHfV@-$uf_lUHT}w^ocb_VTZM4{`M;mZFO~Eo1i%0oXvS!ON_nh{`K=Bq5OjH
z8S$G&+Id+`Cvbj_sUPjyO7r{5rIlD_Mp$zR}V)CL?{c!3gyU3(>D^;??E!=H{-(Q3#F%h=RdZ_jCLKzkMVv0
z;yAV@<31NhAJ}L7ek8vewrYw{R(@^<@)mt66rO9dtb@3LdN_|a0Zkn-)g8F|U3kEI;Bzl$^xNJ#
z-BBOyn3|^RV`(JCoPSJ}`Xpq|X4%AIKCawq{AiUzA32Wrei?uN&pF$k`;nJXu94iP
zI%0dNin6?Z<#PtDM((bUy07_LuwB~^H64j^3A&eo@@gAAj$Z+4U5wpUA9XBA`#Fxx
zeXH$Eo__Ppn;1GhH7m0!n>W$nnGZlyj*%eqKPD`=hr8;~2D3oyTRP-|R2n
zg{%#Dj=U03pGRO1;9O32gXO?&-sy0KGtgi2IcW;=sE;N1+=gQ+RR;DObOPG|#|+=m
z(&}WuvfDg=ceRtyckNgT!14`UpSWI-I#C}!Pks(KZ*v?)f>b+xRHdK+#}S{!R0o{5
zRjMG(^T|{l*#G!Q)dK0A*A>te&=t@X&=t@Xu&F@Iw-iw-Y3V3_6H-x(^;k_CKXEC`
zXw#y`f7@D2NBcy@Q1jTNC?t7)u@DPxuv{JJN%1@WbgpU#x!V?M8m&1|Rf
zc~F*l&IS^i#&+D+__ff4r~QoE8owwi5}7uAB-B)oHf^j_)@e0u5Tm2iGKombu|)rj
z)}*C|$W~N6&C>==8EqN^#H1%Su$DH~Ma^X}_1(0Ph%~=L8Vtfg%y&rfQPP|lO(0tj
zx&pcax&pcax&pcax&pcax&pcax&pca9;`ro&u>!uGcISlUh2=^?7e0I{uaybzf0_F
zTRpLUsed?PKL1v~o4}awgPsKGJh9*I(kJN4XUGvi`~HfWKBMdJTu<4de+HCM-`g`j
z?{}_6sjK#Q^yj;Qe7E~INja9+gX0vSp1|7tqs~KWTvONIaoV#csXxcJsEMP$sD8yf#IMo&_faxpoTUmjCBuzs=qd#&FxZK
zu%T6qj*ieowo?=_kHK2q)$|OONo_&u!tWKl3QB0;GOuGDa=nUr=ucgLvjGN8e84`y
z>r=k>ufloy2uN$TNum}}kFLK3<)91o=Q+7L4`}1#$oI9dS%R}rkFLK3)u4;J=>L`U
z5r5Zaj`3Jz!Tc1Teao1Fyx4o5AaL+Mi+rZ3n)9zsuFa-{Y1AiJ7k*
z?I&K7^S+T5=KTdS0*?#q6X5qP*iT36>8ScHz_v`l;{y8xbp4abv%3DtB)n`^*WWGl
zF9kn1YOZ!hJqFm9MvfKEmvKm56%*gO>(o72KYU`Lf|C}WMCgsYM|}FVdK9&{ublZL8iY&v~P(}>|y^>q3oDr
z^Y5qd`8D5lF^AWa^+Adav>iB9|1Soc{$`K*_l@F<4=lsq_rc#cOyu9MdB+3v=W_vv
z%>Nw!y8ia>j&l6-Sr*UncyHJoJ~y-5H@g1zYtNF+BmNyPCoy%YKslKzfD259KQO9pl@T?5u*`(#Nz_P(kkp^|Sdx1jC$@dJAOE&IEA-Jl9A`#|cl+
zpYK~|2E1nGdtVPhV#lMaxAO%3wZ{g&*Z)A*-`1?*oORHge&BB{qILb9qp_`8rT)BE
zR}VA*Zv%b@A)#{$|CVAMz&er&>zNF!*^r{=AFV&oN9{bMrgz%tyERRCjiGMui1-5=
zHh7HwT3;|NHT=;=->vCyeE-nAzQim`8`|2iLDxU-+@R~9n89YYjXwU(1aa}AuD^=~
zH)~GnzuU>#F&`DQvg~{%6KjEH?xm8Q3o{1N;W|Y4`@btr=WX!SLtuXgjAia>z};t*Y$S`{rRlG
z+Wa5y{fFf3LCS6&y8D7DfbZoj0gD084OM@HBi$N&Xhu6M7XW%lf&$df0$Y)%>TfG<
zr0bsq@hxmBeX-q6{ZsVs?<{mb*|Vhnd`JHVxD4(9Yx{t%zk@vntvMfM0@(qt&H4ac
ze+TPqtvYCJemv-`>u*gh=jKaabg`koe*AT!3#9%5i1}Qqi5a|)$?xju!AS~GTYGR)
z^Ln+q0=fda0=fda0=fda0=fda0=fda0=fda0;x^`#kC>I@4xo!N{i7k8$?-6XVsLk
zl*WePYQDW`;cu#xjD;MP
zR-#N@Fbe6YG_*Aaf0~+zva|Ceu9I$BfSTH0upEB|{1ZZo)JIT>)JIT>)JI
zT>)JIT>)JIT>)JIT>)JIT>)JIT>)JIT>)JIT>)JIT>)JIT>+;nV9z`3=4G62l-_{L
z6p+5<_fjLK*%ZUJo9m0R0IHg4@8_Z&{iD
z2hjcRLB3~K;M0Wo-#GuvZPaZ&Op(;podo#*Pn3Nb@Vn6}{EoUFQm_K_AFyZse};1R
z!95Aj7a9XSq+kW;KVXmlEu9AkE=
z51yrf93T9<(((C!x9)$(_+Dym@4o4nMy=GM``?N%PRy2?bIz>@Dp;XB^7)N&rv}y!
z^!?wdD#xx|YQ7UOkFig!z`xB<8aOquexUo`sVc{=Txz}xvH3ZccKI>Z>;8`|okuL`
z{`UwsCb|E%8>UeI^Sk7mZNT%Hq3oL;Y%4&GKuSCQYtK!rrPt~H
zx9xkb^7#w~Fa
z`2#_!4(z|3{El+==$?|w%u4P4k8kkHv5^)r_m`C9TYGGsq5I$V2+;j+TOUtftNY*6
zJ#4#wy8mtK&5l{|N?#{ayQ=5smzHrEmlkpCRmbKdPP
zWxj^J{MG<}mt+lI`=r{yz60JTD+G#ymn^{F>6ZbQfV=qC9y_97?-_8`3jZLV&plIZ
zVBhT|6Utox_UN9H%JBDyda$8@93T9)*F_KX|1jPEHk^-DuJ(V2WSiK(`sy6CC^>!O8?XMeLfV*jA7uD#4~faP)7C;N-*k!{kGVO_5HzMD|~`{r~fv_
zoktJ)&waur^M8Bnv-I2H6-ndhYN3RFYMMh}yDk6Qv#u*ONUg!u{vXj@D8DUB8XP|h
z#tNl9jw256e<$7l#{K_q2WV;2AKd?S|GU>rBlrKzh!2D7;EENvE=l)@bpN}T?`aKu
zN_dYb2gqdwuH$*q9bj`Gx3ymPzuWp>9S64J0`P5o-~Y8aHgx~Hpa1Q#2!7|dD5(42
z9<@BLjEDRGL)kxDbD!PoJkR?v=Lnv<|8Ix?Cxb7Nz*KDO4?HrkU%*rSZ}Xf5{kC^K
z-?R6~p!+}GF~Hy5@HZG988rUqcirvXAL5kb`9JUf9$YSz1K<5eLhlDU`2JrUI}_2z
z)ZqWT(B%N&Z;4J@fPecT5?H-Q#AkLxy9j0H9HH#cuy0Ai?g#7sckMI-pYr(6dqnAN
zz;~_q4a$Fk)qSc{3!!vv6`Sv8nC1j~=KM)|u7OI$=YLCMW25eW*E-Y*t--Gx
zANG9zGtS(g``-x;adDMN@&Bf;gmPr1P!8d|&>ntYC6quc2oOc^o3YJ-6A@X?+
z?U8}~0*UfJuM7E3Am8V(2bQ(-{XbXv-=20jNAO$i9vPD2e{5@yekr{Se`8b3!~M^9
z1X8-6oMnG%@IQZF^fTCJg}ul>4xFX2JJ*{U{Lga$-Y2pK*Voeh?~$hf@pcM+r~hl}
z{*PBGk1U}3-*eCZ>>04q|N8uIk60d9M*2TH;<})YhGR&(^SPTNZ1d>zKYNBNe9Ys&
zC4SQVZ;yhWS4NHpUNbskA9LqAQvLpKY4l3}^ZPXJ>^n!;ru*N*0FeHlfOs?52-X3<
zXXFUYPs;jOuQT}`_1}ueX5IhR{cnCw&@3J;?HwCKQIC1u&RX6dkIlOOE%@I&OZuy2
zJX+f8f0um!1-5#F_>N(^|IM9kVOjUT1yNE_mhS&lp#Bl@(JKOzH==w4|y{|
zZlDJn3Q!+V4QvOzCuk1uwVeZ6KU+(?%Kr(vr(~o1seTpwYLAu^-O2x{-f1orK#q?|
zy8m4$x*Ij6``?Y6kqoBj{!a$c-Ka_3|8C@rWH3ede=>;fMomip^IL7!uKBe2gJk)5
zuPNN9i@GT`6p;R`hnVjSjgyQ;{5dfHKGja-@f{HU9Ux1DAfJExN)IVS0s6`c{5H}5
zfOh}4C*76x=^^DRAjbp0QGO{A{_mvwKjr$KmTUaazg=L@KCdmK`#)v7U-f@B`2H~9
z9KgT*NbUlyuPvo@|9gi2`3#PK$BMr%Bk2IY%WTQ#+C1I=p5cFW9?-_0>i$pR&P}BG
z@H@xBXS)9rDPRiUO#0uR=Y;z8UkdlNCG(~K-$2|K^s+)9}BP-YJjP|BrnJKSk{-|WkqnjMa%v}1h-f=Iz#>!vp+a$`M>dKtWh&Q
zEiOl!l~3xj5+1WZn0l1ZWvPRQMU&od{C4IH`7>Y#$=slRou)!~A?YR3`63D$u%auM
z`VMH^-0R4aA#;Vu(zQXITFr<4b@SZyX+=-9-hZd>kRyX`_gcUHblxgi{tS(1xh+kR
zTt#Z8D^csMSA5g|lrh3Tce{T+i;PYic&Etg6N{wDo?)=}mV#q*UheqzuYCsZ3cP(Q
zX!X!L%|98oZ`1X)*REA>F*3}*#}Bve1g#qW`02Idm6tE{nNhTXegAsoUV7XwpwQhv
zA`d^hy!-B~<3~2M+P5-m&8Bab#Q!@cln?(q{OYy-r=yLi=~z`ZZ6zku9=yyWRRmw%J+gno7(p>r?Z$Z#s!K^SgdNVsMY@
z50;O=;k9D@h`yyms)=R&a&JpF|Ke3!-{&_-#J_F#^j%eZ}1CUSJk^}?M8Qgx-+%U
z?C#O8w`@PUMyn8i?^dh#zk9vaI-jj$PK{~1viQ^gFI0^>
z{`S)!w~m=T=G4RkpPd-Lzr63mkOOtTxsum6WXFIpADn)){fklOTNqjxBAeFO*yU2*
zkR9cge0XBv@De@R`8LXY+UNaN4d>>$_2Z)K$Igwq{_l~`s!5wEkyk*MgJOEQuA+Xv
z^5WYm`9#xwLFs1h9K7{j;r&%^`TkNkWXJd8hDT-oqMA6dFWk3(f!<%W?YnjL?N9P%
z99ek%&UPnvZ4P?1w^%XQH@Z|*kB)6`Rx7-w?e6z}oVL)f@O#gS9-rbB`d4d1#_;yp
zy4`!N@Y5Zm>fHBkylhmCYJo+DwdpiB&l_`EMwY02uh?vq%h3NlrToXk+pf!hn^QJTCUK(Sk~6z~KKicuH^m0|MvpWcnb_`RmP1|NYdLY@
zo&w>KUblnAirQ&&U-)Ku#g4o89LZKKWJ`u64=Z+U?KJ-<{^iIv>wl{C2lPxv!lX`q|K_!;j4?
zEADQ1>*M7$e(Lwz$lhhzo+wyN_<7xXKhKg6w$!S4=oj(J+j*9)_@Ohq`Gr@e7We8_
z9~pFIX~Ye$e-^jz^r
z7~QD-wC9Un&h1@!?RT{^gQd}8_M_q&hYHM!4MAG9kuG92a09^JJ&-TcNQ
z%jD0!KK+FC?Yf06cwDnWRp0Qt{l1)*pChia?}qN@T5Va`_wua#oBYa*s1nh9(eZDp
zg?wDE&f+hQMLfIkZmX-aBElnchNm6>VVT;K@`|f##3Ju7QMJLnbt88Da=AiOk?h5r
zzT{i;&74clo>-K#*88U}_3ByYen8MaOZR08`S{v9AsM&TX*KDMbl)^S_t_AyX*0@-
zKkhyZD%J&Keqg46Jpc2qQef$et)dEln!eDi27%)HCiT)Ctm0QsbgCU3*7C}VM}0)8
zT{-II{NPN;iHdor&gqrm#_c_~D&4sG-KdKrfA9 661J{M}{)mOWm$HRSroQ4=bN
zuiK=roBn#qeizaYjh>WlOvfx+vmEdC^i1G|yF2^+-SE?&{_OBwiNG;^@yD>A4LSDV
zH~Z>{Am6Ze{2qnm6$jR&`OUj{$$k&LgGS`8)cEJ;1uLysTj25V*%zK&&n_AdC^)D<
zbnd8fM<)h$AM#pzu`{n27O*t?nl<6qh6QCfSYEU|6&!T#>)df(;a&s7dm)!6H6C*8lg%TSOx#~Sy!P5@OG(fYz$7yOa$*sy>tJHq_mGu;1V
z=*1py^ncUaux-=R?z#LQiVAy0_imr9xYR7`_KF|=aeD2qXzi@EX-{+QR`A#197_jtLCe?RUQTupd`Ge7~U2ZJ!#UZx64PSG4Jx
zHY!WhAj5-e153O<{J={}@ou8~oLLd&ZmwNFe8cpsfOZ{gk{6TOz@88dL@
zqA3+tpY=90FdPWKEv{GCy=-g1*uS$II;krPM&&b1Yvw=kxZn1vUdQkKJmZ(w#kF@|
z7``c2vxX(Mis?{kdbzL91Q-V7pSrYawBMNlFK_#KWni&<)BYa%xWm-KEiYWn=@Xo9
z=H6O$4V_zzSsmFr*T`3EgiT#t>GlDUcTLZw)0Tvs2{hc@xuO5Z-9qaYZoIk7-IIg<
z+%YhE;7yF|tU>?Vb7o=n@Xz<;Z<6*(mGHF{UT>)66SXVl-}Ah1(5^IF`?i=ZRu+F_
z)x+&ueTMXX`}NLS#Lxmm^9`M~;>NL$@6GD}VC3$A-^O0e>l;3OYQ3Z9!Ukr%b+*yS
z3J+?vXkBJ*MRES6!{;L#J)83N9Ip+fuHF3UtH`Cz3)K#saAEV4`T4|w;0pInZ<$uF
z(U2!=|0$oR@wEE+t`Er?dgiUdGrss`t>1=mr)JgOSZ~zrBcCDL5WeDZ_b223T>bo9
z!QTfKUNs}#=`HuZEE#eCT<&Ur)#}zd^Rlw@y%+i{ES}+$3L`t+$nJHwYLi@b?hVWw
zT{^1togqE*|Ft?I@_Lnsf?=1szv9(z;VT#K6kD>U)v>j+u5CJ6!cg{)BeP!Hw8%$E
z_q1fc*;nU2&Dyom(_MYU?4~v5bP1d({!FvbtNQ0@t3AF|DJpkV`;}Si`1kHUu2dF7
zgF^WmW(_U6?&U|_!-@xeUa`peRyl(s(^h>}>4(B0-)7-)+saW(J*;2alxy3QhSiJp
zxl%dT`5u)6YG3vGDCZ;Zyxz~Yjvw+-mVH0=^<6cjd+TNA<}42Ly3*m|*TF|h-)q))
z!TG^Y?msTRwpX2s{+Yvn^a;*6bn)Xi4%O~yA+KjS`kLWP_`EtV
zPWx{Cpphq)CJ#FF?JX{y3vDbG`8=Q7J)-yI0bkd7{o+CIF9N#-hOGBlpKa&eHOJQN
z-<)SNGNHCkEd2eYsfqnT182+LhC-SzNkl
z5YyMF%uUIv8W8jQJJ~cO298sflxB8vLo9(>Ldi6PWtJ3-OO%7dt
zd8q&B!8l%?@eWHn;;Ro{D!aIKt5HECgS?*mEibmIqsSDQJ1T!v3&Z}1`yJ=u@OE}b
zkJFVhf8$kVMA{}tZg-0)cXj8=to8R?2t5*Y;`49EhgEHp{!gC|3j3XUR{O)E%RbxW
z7trOS^Iq@29=YJbqei*=t!X+q_t6#m3f{|};@&A)mx@OIgdYKA=FO7;TdDy+Ry
ze&rW;{2~f&{k-|NSq@bZw{m1`et!A6lfe&)MYLFwfBL}VO(*2eE+T!;2XDDGeAo7g
zUIBx;W6K-O{bvl@_vN4xo$g)r+LoGCKf`MmZx1?q>h`g9g+t4A6F+RqF#lp`
z*>y**KAIWvEN9^A{lot}(P~1$sy&wnmt9?8?Zc(pzxOLsq4f7nC*1Jjsqo{qh3{|5
zHu=)e;!0qFuuH#{4f!~Op_(Db#?7aWuKoGcYDIaeWAU2T=6g*)TsSH+yhhF{kEc|w
zy1&MYEi*mOw(ZNu!JFsf+#|!q8_z2m4qY3#|Fyd%Hs)S(DMHj=UUZn(v9_OVpZi|M
zF5=r}>;KpOiJ|=AJH39IpH@8&|7+!`D@Qu6eVp&`gOd4tLU*+;`S0-;#(dkkV49EC
zrCBG|XP>(5-CENJ8FEKe>zIA|%ul_3Km2ISdT*sE4!Q;M=G#Tb#cE&YcdJ2uN(n5ZDdfcFBT^LDkuy^)
z)@9v)ozSixT@kyBV%sc;%Yp#4E_)lPWi)X~q&I;cAf1|Ts}8aLHN-8{vWUxo{U8+B
ztpn@X=K)|RV4K~+aBu^h0IvfRuxg{XL*(a191b1>i%JKi!C_FZy+&JY9Vn}6{w&fX
zz$0$|9vD_zv5W#A*HV7(SWD@R{DMF&A7_syk9CBj?1K-n{egOld-m%dxDHl>d?0qz{z0T*
zIf_u{0n`C;a~{_vCa}B>{E)u_`~$iIjy-GHB-WoE+jGBA
z=QPHg<2dIX2k(P8Tbyk}Y(rZ|f&YQ0MV?w0_oFL-`!MIJr-0LeWdZxX7Tg52L21Cb
zo^bo55vp3$QIh{k8M^L@d7sI1e~%M_UGI&cUo-KQHQ+
z=?~7carHB86m(^>Vz~|Y8pNx!GnO&8TX`Q^VVUz|C%`em{@V>)ub~yv^l3EUvCc9M
z^ZhS4?(6~^as2oQd6>gl=0{K+Xt%efjT#i?vLP-BHUSHcp_W-V7Tv%xi5x>4z0n@(
zSNllcl>#q=Lcme|sx1RhHWK#VAA|aiqTZXR|9Has@1PuyM;v3bfx5j>7vk2T9QUze
z;3BYmiZ;H7Hs7ExA7EKyzuFJRzX2ZeIaUk<^EJ@t?|=oU?=kDNQLnZQra4aR2Cmn@
z&AyDhOk2Lo^75ba|3y-_4fm4Cy1kWJe2-Nz&N4kUt9#83Or|j1@j&0O7rXYPu
z)bW3se06;&^40*xP6tgrnUUuHK^wUrs`aWd_chMN4)-~2rYy%$?Z{;yTQ
zXuP<3OlsTHr$zfbcD)DQ0s$gVU(_wjqOFFAIdAb=?`>c`S3~TQzqHO
z7e>r;h6kV#;Pqz)kgUM%0k0*G0s2`TXY8{Ief|QVeJpbZ@Vxq65YNuU8Y8x6`$qul
zJ`A=4>Y>8reSm#u8I@j0vwfaZS?x$-`+?Y=*AOkiUZB?RDCU@q03U(mw6E2W=Qobp
z)vr%*&XPnOs3XrC$ACy%cJSPu=ie$=-jA}wKu5rRDXu@x+M(S>qo*MU>~HuwL5
zpeNw5LFGfFR{@qya{IIc+iRI7>QrsuF^b1bZ5cJ)Pn6w;n8%xB1<}S(#K%Dtpbfu)
zY#?6XGI#?l2Gl1VNLJwXAT!7XmIAiV{xeVQv$YNFvNoL@1GM!Z9R}!o?qAiwi-7Zn
z+uB!cXB&XynfjgvobSw_6mWZB8v@QLJcl_CXh%ulk-&BY>UrV|SdP=*6GmukP;Ifs
zo@hI@wt;&EvB4ja3E=L*NGqYZ#Xtfzm@H;R2_tys6DY9WvEW^cxcd>fSz*D=3d<8y
zq~(cH!-^$5%wi=Hu^Ge$-lyQRq7ESLK1ES^p8|5oAQecK0=DKu=BI`r?B_W@?%v
zFEfEuF|P|dyCdd#5jg{j0iMTueV~n?8&K_!LHYz30pgCa-r5miV*|vS!H-}kU|)Dm
z|2p7#tH%S|w1w6fQHJ*bc&^U41h@j&2i^y33_Kp#Ca4Og3I-##?w49)kf-lwQRJ!i
z^Zo$uYs4#~-QHbk(I)TLspFbs`Wfci3St|*{cVuXYaQNGuwL`o+TNAM0Rr`6(
zLmT30X|Vhp@>Kn~tr;8w+94RZf&bjmA<<45#JnHT8;l2cf!3bHrvJe9lfY+S2*?855?HT}
zB3Ql#5^J-q@;pxGWgG4eYy)s!w>7S9*=R5SBHSs%m%m27?j7ClQ6J}s$>1&EmcV)e?OzV=0p3Tu4-)i+@2&le
zXE3+K^9S`EFute7_rQ8#y^VX~-=IFX1lB8f4l(D~7rXn!QMR-fVUITGRX6uxg}
z$NmMVPi@CAPHN|D)cd}R?dQ37br5O*p8>lpurAOI80!BM^yhd{wRckg$EZ);ul4bp
zY|~YNbpei}L7+eQ6x;#U{!GSx%6<2|7&o+^ewPK-1$dn1F`CcL
zoIXyYtdV_=@?3hHfDN=?Pjlq)m>RcFBkjm8XV<&beyt;Q{ouJDub(*=+Omzu@Y{g>
zw1@Wk$ZhtkeSt0X2geeh(~SZ~_VZkhbMMRG6$fm@dbJKu*{_bNj+(Yr8yM4mUR$f>
z?8Qqob-3Mrogd!Qw5_+l1?{&NME_Q3>R?|y5=7h7_)oyO`w~$5K>eMypLGluSg#p8
z(E+r_F~NEDX^;ufhNRe^U~GBNer?+WboM70|DLcbDQ&=R_Jj8ocY))8e&GF-3ZM$$
zIf&N=+6K}Af6x`se$MOvf*9}>@Y+DzG;q!z0saE&{_uZX@9lv$YFLD{daW`iHQ2A}
zEBa6rad|=ERA|4}7uK}eKN(8}qyml=h<#fK?-W^sK^&b8Yxv$#pf0w))P(%l*j!PK
z@p2Q&n?ps6A6;3O|BLZPl=Zjn@nZhgJq-EUIGb2z%-?0HF@HbLWoyhIZ*iHizb3{u
z)@7TqS**u~+>RAk<0nd(jo8}0#S&>FjuQDXx;R!h{Lg+{BTdZrv}%BG5ci%IGUV^c
zAczc70jYpgKq}xe1$d4Rc)yp|kt%#Pm?qAjML#UB5c
zlOXQ5TS)tCVBY|r0crbx6U)=UCxFj#d^WIefbSe=`>&>XKPg0%VL6`*qHnDcM}Thu
z?``whIq&1}-I9TzIS2+`8)%z7Y#DB28{Yf80n~B8xHHRoYoKj_$F1i;Ne#~;?Q~#S
zPz3zVZ@4h5QNYNjo{vXD=1z@3*uX`_lX^ge}7GJ~H3&Mg1z==hkUhg>)&9B7yA!
z_CHbMpMBzYuk^nGQGW}f#{6DA-!(`5w%|K@RY8gbwhMTU+zW&OzH>AT`~+;-Z1w3n
z^k4lBnf7-K+O!k>=l!HAAVmV(wZSOld!qlmr^ff|Y}pYn-xDGUTlDvT<7vV1?;`*6
zerkVEA2hT+Kr9tms*j0N%ftX*dRe-OXn;qRujV_utfV*J}|L(^Uq(jJ>5(H8sP
z7ns2b0q=D@23C7H|1U@X|Hj;Z+Bf^35q*6|kOMLIQQkj{^A~@o$Zw|4#~iQ!EuA_B
zTBjN=hCB}ir{BNiK
z>bT&(;O_CRuRlfmuWBO3K{Ler!4VL5j)b({W-jwswl9$!K>7PXTc0=epT}Z8_o@b>
zb#`iPW_lywxmAWl@GQzwTWww5)PHq9;C(c`pR_hJ{R7~AA9WjNVjg?`0@}K~qW`-6
zz?uH9XaCjh9K}MX)YAV7u$R}fT0iO2N$vk(UA>d2jkg5a0$v0>N9A1j8{oC0EBc=v
z_0$4<=ZNq(tuFzu3A6?9zAooBLYsM9;Qc+V21)V1%{jtb1VA5+Y=&<
z^98Xn|1u3iq&1Gprp7U1IYtS>+Nf;07`?ORYhr%+fqzF=8}s`NT#o%tgN>M9L*REC
zY{vK`1poLAKMi3VekUo3X_lyFM;v%P4QPKpQ_%f~+6AuoGh|1he>>
zgFcQC`TCfD1IQZGSS&gd@jDUqz*G?Torq@gI}wmW2C0BlKq?>=kP0MFz}_{vx-P*+
zX(&TzzgBWV84NpK3c7MiE?RfEQx;e{Zu|%;`>K@rbe{y
zBK5&CpTz|Nt43*MFp2*1*!41aMZou|n}R!lwV!orm_xBPNSRQbn)9b@yT58qjMcDo?(E9rbmJ@vr
zgKZq@Bg(`Zw~2Cs2MY^ZsgM2~hVLc1QXjr2k{bj7&eeozt4<#5a-y0N_IW}d9@BV!
zy;s2Z?7jzH{R|oQ(SJtz{E7TH|B7<)_6a+A&taW@{?YEcYTAr)*;$Xb2GK_&ea>TD
zN6tcn?#C*8|JACM7wN-$H?M+n0;YLBq(9~x^)WeloU=Jk^W8_X4@3a3nX_R_f^jYK
ziX&F95t5@pVz)hmcKNQ9*9M_asT9(O*CA3L+jCo-KEhANDq&Yi#GJD^Ppk8`
zC+2MG!#SJtw71XMWnp6l0q1Vc+0LBTBzDfxmgk(!d3v{i^ET(~Y``l5?Xbb~$iEG=
z{c$?Y-|IVrLH%cuXFaANPGFlih$igfK9?kYx)#*!K8x=_@S7;M;I}gP-H;Cx>SHuUIi{ZRGJW_g;s)S6t-^QN
zjqH!h)9RysAH*nD{|>j4`k2wKx9P+4?DC+JfN9RzcR`#U`g9u7C&AnZEs6sD^RIYX
zxlteMF%9h-*_9yA(-W1ji`OA3p%3S5-hXKUTH4_atV@x39PQFaDWy-mF$z0uE%Ucu
zJm2(qV4I*A;GE5QT1%Y0>i)&=S@C;DSAYxV=eYXOuDvv$zon!;oUAMBZ`d
z&wsQU*h^C%>-_-432gQBPA6>OK9@ir{&d4{Q_gI+lKm0qUI1w5!HMa_ix<
znUvIrb2jJcsshg4Z-bP$Uu&dgO6!wg9)vc}0lU{BSZ~x9cjTp*K1Mq<`c1v^f^Wb|
zz~^4>=(n?VdZRwtF*QZ%V>FWD&Oas#eG)Tgvusk)k1MYlKU$^GM~)-DU&i16bIx|=
ze&i*TYbdsqV8p&yxInjgzk9^_{R!Z`eeQQ&
z8)zHg*xw5HJWze_&S-y2jy}A1$n*CaAXLP>e;xq5HqbU;0<>R+&y>Ff79GjaN1dk)
zV{a7*{Wr81`O9_MP^%>ALt25nU5
zbJ^%O`^$GBYXY7lF9X!)KG+U8my>N^3GkYCIy~VF^jAM8O+p^^F@n!+IHuBMV820U
zumNz)@Et9!PG&57&GUCpI|+T)j-_BMUzhqM^n%cd`tW)36To?!NNOoQ-AQg}bNCl(*C7j(h9%s$!&q7wDr@OqI}%v
zHL;ofG(Hc?GEdk*V$;};+giUCn)q~}bzAEfMU^C`V?PoaTaPwvtyI)$Gi_GFqSP`;
zNQ<#V|AcAMLPKO*R6X@+v!;wTjR6v?CpNH^w$??>MTqTt>_QUK{0?ac5DDVGLyC`*
z=FAievSpA8NCl(kLQQE5Af&P3qkneWy5xm0kGPq6w>IrPkKk7WB#x>~RgLY%
z{Oy6djWu?yHEFLlp=US5pMr53#v=U%;BVYjpL~gQe=ro(1~Md50cvQ6LRj}NQ1#cw
zv$joG!
z@dv*EUZ3*4e-+Nt2S9q=CP`XEJyL%I<)91o=Q+7L4`|~*ksn~NS)#L0kJR5lHR$3k
z`cD@=;_uq@SdT>p=BN5BFVg=KY~ghq=Rz&Juv`}SWI(^XW&CUBJ$<@X8rA;~_S=Qn
zJO9^fu3fH~M)l{nKn8%mE}#$U;Po({1!%Q(CY@IGcSajel<{@_e@nuc^n~te8?V7W
zyYpabJvgIZd=~N@I063FaT?2fj;QL8QgM6Oz-#ehI(Xeq`%`V8?H~Z~cez^ld)yF^
zl=<4#e&RJb?;B}h-Z78~_*`J00Kad+e!5yuSJih0wq*uB7uY8t^-m$sO8rwvc+srX
z-z)Tg5q@yhTE_!%9Sr4SzK-+;!^`8s<`8Ruv{uY!`9{>K)G5h)(`9#fY-~;;exq#ZA
zWW^l+Qh(=nM=}2SEQ{xOyf>_e&&{0niPYbD?O77qIwDcm22%gT>2I&J@D1N%@aFMv
zeb?8Cag<=3+3UMEtV<>O&w`y@!3R$A5z3{CcQ9Zl$Beg+f2a3N^hGVZlzsE|AoSm<
zv0Js@W~|Qtw{T9W{ylA@b53nuGS5G4+G5AI132@tz2MIsfoEGM~$8;omWQ2^hZr{~mn6YuT<~FzzexI#|`(
zD3`19WFzQCs>W-#RDoUQj=&zp=Q<$W5&NyuYI!3yfm^O=iwhcJBWqWsbME
z%_7kUTVpF3>bQSXXZ7cPz&U6P_JMH@7=`tmx44Z5xQI43f**Bk#d1~P)q(Z_hw~50
zSheIa*%AC3+-mt0j$5LAuMV^iJP#6_{~*s>bWExpE!aPA4zv&C1~b5yI(R+010=Qo
zDZO24(ck8=3)**=`lrku1l{Qu-eXDWah%lly?*@L^Q_Rn1L7;-Ea16DYC2B%g8qEp
zIt$=6GvE9A7bJB&dU`uw&|iCO;Cub|r2h714fm{r=JW%9YY{E=caO&QY8CqPUR@nf
zAJhf>4nkt*6#gy6T7Y#V7uNGBuw_H4o`1CdKp(a9kec3Pr|-5j;WdW3y({9k?bzTm
z`fGi`w9s&~oxa=B-}?TczP_X^3me|CV}sN`;oKngPs(7^Z6n9OP7n_-O8q@7xUM;&
z|28{wuczk!=CI)^xS-<-mfrwA8Q3o{4eSBGXxNRk;j?7q(G}vN`D(Br0Hy_f6BUF>hBf$^I3td`QPFF
zhm`F>>TVsn2Y^X{@8x_A{txinQ1wS7(yc*T9qq83AIOjl1*o3^>yfAGZ!c~r^-qTQ
z2Ac|BY;;opRQ>xqgYKtzme8N?=wAnyz(2s&J|OjXvB#h_=cCLZJK(ihPaySovCg)t
zgVy@v!Fy7FTWYyCU-;sEJNnDxuNz$;^bbbN=Tgmd@IEHLt0RM(6ri@w;HKtfwNe48
zfK)AQg}bNCl(*RP&up
zD?zc9vbt{Ez#CWP1ZuLN?W30yI>X4
zRcUBz4M8+DIcZDyfAu((j_rZ9UD30IX^R4F!(;PZmX3+_7y4_l*iOg#F1Czu+7kI+
zzEkOFO?g{st5u%-uLRs?bsheStVs#BI+3ZInG`D`Lq<{osen{KDj*e*3P=T{0#X5~
zfK)AQg}bNCl(=|;P1?3NW}_B|EFT-xxjSce_sD3xGWo_^(^7)N&w+7Y^x1J7p$v2QZiSAZIU)OP&Wo}1W8uay3`?|ZKGVgE0a{&%VW
zONz0gjv05weD}lA{Xbj#yf$C@-?95uA3B=<`8=jOs15455!T-g=%4>+{pxI5`rmc_
zcUE(6DkuFf{qKYVX}bvKS{?%&&HvuCUps4y-2a^z+QR?p{r|^UwuQ60drP_HqHlhP
zZNa~VoTh`&i09lD0G|OGQ3?6{U5>Z-))_l)z~0?}e{0-`gUIg-(sW?|o#c0vb4K^n
zRAy#c_rIgTFUCfC#N1y}lW(1|b(-|Q{ShGjZ(ko@Un~9Z>mIh>Kk0w_`uO@<>3?7M
zu>Jm}1^G5-s9ke4bCH<&pp#@VBei2Gs>L-&gh<+%JBDy
zGT2c-j1PX>>#Ps@e~9$I9p__}r~Tg%b4*(o(B8SZs=w%;+E1IYeU*H7ttb880Y2+f
zTe19Ko#e3y+mA&(tPl3vV?EaQ1_Nv`82N7hZHzaM9`v94gh%H8cJLMbcB_8!xQp#q
z*NvS=V7op4JF~6}HAt($lm6$N{R#Yk4gR~D3^;zihyOXAT;TuC(*M@||C|f7wCfM)
zfA5=R#QvWJ@qTa(T($w%CF>rM^uO2opZADzfM;yLbv#e{2iV=m?X8#o_geqkye@)2
z)phxicJ%#UyJJK8-~0UUj74G$6p;RRMlIhfJG-9m+52RW{&zSA_`4ha2E!+V#{c}TyR-X4f^t0n
zAA|dUH*o*%x`xEw3v}`QzXWzBp^s_7|9POxUclcH{cQmM_QPpl^BxiX9|r#)t{0yR
ziM$sq{qNan20rESpZAC|*n#g_@f(y6fX#iXGuCz0u@~ckbAq$;fb@Tg_}`i9q8AS+9w111(M`{UKjA4K)%o63@poS&|YeSa|FND?vsK20!i{ewo6TZOscK?
zjm`7a$rl6r1^A9YQuXom?b3q(`TL@u!7n!0iTpo-ulw4le`&%0oCA2D$QE4xn)JUf
z9swNp34W*lYe@e)*2))4NdNop`JXf6Rrp`d|IUczgJp#Ovm>qzYH9cbX`^!{U&{08
z^FL>XD}2o3zY#x4|2w0g@0Ahbf!B<_w67cWCC%^uMx$5wpWml3(#)6gr2h>Dfbjn~
z#OuH+uoCb+BUkwTu&9sqx|7wY|E2?*rT=aFUw=-}!hx2~j*UU6M_;$QmUlU@S^D3=
z|N1Q9uT~DUbk_eK`Th%R^#hKMVbcG4XB#X_{~L&shO(sp(~z?bx+?u|AW9m_lKxLa
z&Nk?(^uK{9X(%fd`~LuJw|8B_cSL>m{XbU?QQ`mA4z#qVvv!@QuK)PH%V5BFeCHVO
z74l|)+&~693Q!+V4QvFwC#Z+_+D-zkpKYZ*<^M$8Q?k?jG`|Xdbw3{ok2%7uF|3>Qz9D2Y#dcViNq{S^7Wq`kt0+{LjB#;LJX+EhGJ(y4|n(|7rMs
zKj0j|zx_yV1Ff%(($fFF;eS4ZR@=F34d`toQG%@&C_homa
z0#X5~fK)AQg}bNCl(=kP1izqyka_FHpeZ
zgCSZ8jn}KhFZ=7ZPwsMjgQ6At%a$0;db7#mhGiv4?O|;FiCB&uwEu1Inq?)MFvu)+
z3R}w-Q9xbqs%0fmXMnTImZ(^Z)$;1Hq7E9d-eb!aj4uYYeRUaGv0W7FJ+_STD}sc4n7u5Xxg}LmW=r_Vh71mzh158ief_2q&yXX=-oa`yKt#j
zpT;ds2fiLSM^Uoou3zi5mV=JnIC*?Z(XNAc{nP8-zWp7iv|H1o$`5}ZoqIj_``THH
zmMC1Jc^Rc8$EX7+!>iZ8P#;g!tqC^9)0DxOaaHwbQpT%+P&4M
z=Cv4Ddj61;Th^?(_TAO1BUU_oJmQ;!8+KKB^{;Aew+*@a-TL{@7Og+cxqpYMEawG
zng-=nuCB|A8A&-$PI{N+gxKWJEB%cWHf=2o86H}uP`uPEP)
z%BwX0seu3Qx66KYeofsw4Z=Ryow3I73q$*6_*R**J+HZ$`NdU>4rD!a!?Y`WN%*5a
zy)G|*6)PT%eA#bXqwCk#EPC9z@H2&$TIS{6tu)Pg-+!C`u=4lE&e(tF#S3K$FTPsp
zRsR~5`i1;jw_q8yt#p45JJvs{_2HP9EN83T9ClavFf7?_q{j0+6
z%*wJ30pTsn_}3`)g(*1KK4oggi?tRWTDNK5{Sv2oSE#{_ORxN?Ld90f8+9Uc_s;*(
z^mlpd+YEg3@Vs?%OMRr2sFY<`j_8W3zWulQ{Z@yAp1!rH_{ed6LNk=>
zj8*=_0-_t7?KWci(9np8@uke~-7J2vZ?0zDCwDt#ey`P!E&AMSQQE)8ua$c@v7GBS
z^qq*spZRZlt!$IOzkYCIfA@Vib3_%6dZq8!aMQx~UZ3%JQ{;e~lUp}iGBPw>^(HM_
zZz{WK$m+%|v%ajfPv35*(sbM}M?dNOdHM18vWC9aQu%1|gi{mm%&nue3z#wMqn~3g
z-RxX>&cKdJy}i=|ZvA^HrqcZ(V=h+XSTWF{ixOX^Q<>N9nbZI4E1jEcyHft8MJpPQ
z#8|ps#!}#3>B$q0zyH>+jUL|1_m1hAPPI;a`r}V!@BVSH+{w9p3RQe9aQznpir&jx
zwRNv^Qy*nnTxMwah%LVa)OZfv%usb_zj1Gv%B&16l&*Tl0(-ZtT6f=nf&cua>-+C+
z`)TtvGXuxZpE!K*
zDPxyED7v6}jQ_(3BO%p)!o@6Bi_lQY+s)~
zCiklEFSYJj?a-2gmNh$S1;4!FO74KjsQ)R^@0k61?^saqMw2y{f0%G(-JwmH!_VZ;
ze&O+=$Ym$;FY5Tu+>fIVRlPIsMEZ}Ep|LU)2Qo}M&n0rYwy252O+!7g3BV^WJIoJODbDuMZuUxKOUTM|t
zgTRmdmN&}1t?$k4=L7y&SNGd=U9S7T6~2Cg$-MaG{X-sCdv@gd%L~7GRcY0x^3`73
zFNZ8GG||#-_r5cg-!3+L0BH06;5s+aCN~ydHSBrIJek?xu0CE
zxW0YgCKU?If9~PfNoAfcyI1LUsb=H?|0X%g4g8}{p}<->r|cT}=y{z0Qd_jjvp9n*Ogg)eeMBT;v}-W=xfBJ>OT>PM>x1=E(Zh
z_H5gAw%CJiZ&u0{H;v7@l&9M9OGDO$9QyRyN%N%9;cec}Y0eRq>1?~0ckh>o$o}Zq
z3y}vdA8hkkKzOUaO;LVP10x&M+WFOr+6SMC&K1>p$lBbWm=?ZSKA>Itt?8?_4}0lS
z_gm+GzjQsb^4;nTAt7fk?mIF!OS$dJ@1<6ZpB8rRWW;+tBM(++mwswSP8%*3_>wvze*kJX2}q()f8Bt~47qJ5SRg`8K?KfBNSa-)y5)
z%{@QcYSziU+=MN%HP@eb@4xnmcQKb+4{#&X{m%ym
z7JKX3jW1T*9>Iguta=+4PmK7c->}i$GA%BG!mVDuS8i~o4bz5p&ic`j6X%p(IqKfJ
zb$&$o75kL8Gi<4JX=VTN%H@rZaLj(8LZo2tOp(6PPmmS{udQQ{rq6eR;HL-8{Xj4?!j?>G!cMB@=q}}P_E6?;8
zIW~vVbwaU13yK^YQm$>Ak_9I>_RDr?`h=@5T%8>ms#yF^boimTWlP@dVG%1Ldu&{=
zZ+ZSVln?!<_%GNow$Si_1vfku)AeSSgG2Kl3!dmdsQI|D%}ou*-}!a;oC6t-^m%i~
zqYtuF{MfI_wk+TIP5tvZ&5>4rgb@egqn#G}4Ltqpl3s0J?%(xP_e#Mvmnj3jC|zmM
zh~tq}$_I8nSi%2)x!Qbo@aFERJ(VFry&HUAclOTu4VJ8LTfN%JZ~Bk9d~uQK?S3$@
z$zMTBzWCwdk8gD@oUTx@%6?fc+}!!xj{(E74f?#>`Ga@YHLm-3!Qr4*J^a7FT<~he
zsFLPh7@3V)?9b4w_S|+q|2yk?si>FC*LEzg`qkPM8wP~0Uo~)h@QXvnwejC?3My7g
zxp$<{!BN-79i6l$&)z)g8eW=pb^WJLU0+-+rfi3aE0yLGyY2m{W1f&Iqk2_XFtfsp
zz2VbxM`Eb5)A{$jziw^IKeMjrJA7l|((67tv#-+ougp+3WQ+-ns(Pc?vb(=kUv)05
zKy=$qix;i!SM%@BPj#wX|3b!9cQXIo$Xwl=DY9-EWyY^f{W@gZu;YV9A;VXUXuSXP
zrsZqqP1kV6Z{Hp&I`g-Ol?IQVzB=z4>6KNB8v6HGI=$uMEjgBdnXTl+|7)qxkfyKv
z{J}RB1Hz|e85a6X*Lt0m%EvI5ZfLye_@E=>dsdGy50BXyqKv&&EUK-!%8mjP%FUU1
zd(p#lIigMvYQ4Gyj(R84&G+9Lu({#8?LKU=XUUbrjgJ4&J(7pLoR4Ehyw-5~*3XBI
zE?Xe$!_4jH6fJl6%E3L689VfEc;L~v%Jtu9&^3KYC*16N;@Vz@`&iK2*vhLkiwa>BMZ|H=Ulk+M!hCLnqVpO_SMarLikac{a
zVL|C`Zri)4M2x4w4$@|wDjmX8=#FnYnmHGhsb{r+zHs(vvgqq=t*_hFR-9Vc&k
zIrEQoub&9Z_HNN9?dm>$TcfN*UCL9*Xb8?lkgQAE3{hiE6yt#
z7C5=hwE69@8%yg~&v|{!()1z9?Ju8xGxB=#cKa{>(LAs6;G2yx`EQNb*(0XSD-nL`
zso{-pDm}b&bZOYwBM)azHvN8T^Soir>jsz1A87jOD`j>#r}{=Ur#3R@i>lcv$J7~P
zOuz4+5*}f)yc^oHO_oXHy99+6>GG(4>paSh&8@=fjlP&C+_`J6X@5?z1Rlygbi$I0
TquS$gQK?_MajliFcNq2m`fv(-
literal 0
HcmV?d00001
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..9bfbf1d
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,50 @@
+## acric
+![Windows Only](https://img.shields.io/badge/platform-Windows-blue?logo=windows)
+[![Downloads](https://img.shields.io/github/downloads/z1xus/acric/total)](https://github.com/z1xus/acric/releases)
+[![Issues](https://img.shields.io/github/issues/z1xus/acric)](https://github.com/z1xus/acric/issues)
+[![Pull Requests](https://img.shields.io/github/issues-pr/z1xus/acric)](https://github.com/z1xus/acric/pulls)
+
+Your most realistic, fully-external autoclicker. Silent, simple and convenient.
+
+### Features
+- Realistic CPS calculation
+- Hotkey support
+- Fatigue fimulation
+- Tray icon
+
+### Use it on your own risk.
+In games, autoclicking as well as any other form of automated input is generally considered cheating in and is often punished by the game developers. I, as an author do not endorse or support cheating in games.
+
+### Usage
+1. Download the latest release from the [Releases](https://github.com/acric/releases) page.
+2. Run the executable.
+3. The application will appear in the system tray.
+
+### Modes
+- Toggle Mode: Click once to start, click again to stop.
+- Hold Mode: Click and hold to activate, release to stop.
+
+You can switch between modes using the tray icon menu.
+
+### Hotkeys
+- `F6`: Toggle the app on/off
+- `Back mouse button (MB5)`: Activate clicking (based on selected mode)
+
+Note: Hotkeys cannot be changed at the moment.
+
+### Building
+1. Clone the repository
+```bash
+git clone https://github.com/Z1xus/acric
+```
+2. Build a release binary
+```bash
+cargo build --release
+```
+3. The binary will be located in the `target/release` directory
+
+### License
+This project is licensed under the GPL-3.0 License - see the [LICENSE](LICENSE) file for details.
+
+### Contributing
+Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
diff --git a/rustfmt.toml b/rustfmt.toml
new file mode 100644
index 0000000..ad544ee
--- /dev/null
+++ b/rustfmt.toml
@@ -0,0 +1,4 @@
+imports_granularity = "Module"
+group_imports = "StdExternalCrate"
+wrap_comments = true
+comment_width = 100
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..80e45ac
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,251 @@
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
+
+use std::sync::atomic::{AtomicBool, Ordering};
+use std::sync::mpsc;
+use std::time::{Duration, Instant};
+
+use rand::Rng;
+use rdev::{grab, simulate, Button, Event, EventType};
+use tray_item::{IconSource, TrayItem};
+
+static ACTIVE: AtomicBool = AtomicBool::new(true);
+static CLICKING: AtomicBool = AtomicBool::new(false);
+static TOGGLE_MODE: AtomicBool = AtomicBool::new(false);
+
+enum Message {
+ ToggleMode,
+ ToggleActive,
+ Quit,
+ UpdateTray,
+}
+
+fn main() {
+ let mut tray = TrayItem::new("acric", IconSource::Resource("app-icon")).unwrap();
+ let (tx, rx) = mpsc::sync_channel(1);
+
+ tray.inner_mut().add_label("acric by z1xus <3").unwrap();
+ tray.inner_mut().add_separator().unwrap();
+
+ let active_toggle_tx = tx.clone();
+ let active_toggle_id = tray
+ .inner_mut()
+ .add_menu_item_with_id("Active (On) [F6]", move || {
+ active_toggle_tx.send(Message::ToggleActive).unwrap();
+ })
+ .unwrap();
+
+ let toggle_mode_tx = tx.clone();
+ let toggle_mode_id = tray
+ .inner_mut()
+ .add_menu_item_with_id("Hold to Click [MB5]", move || {
+ toggle_mode_tx.send(Message::ToggleMode).unwrap();
+ })
+ .unwrap();
+
+ let quit_tx = tx.clone();
+ tray.add_menu_item("Exit", move || {
+ quit_tx.send(Message::Quit).unwrap();
+ })
+ .unwrap();
+
+ let event_tx = tx.clone();
+ std::thread::spawn(move || {
+ let _ = grab(move |event| event_handler(event, &event_tx));
+ });
+
+ std::thread::spawn(clicker_thread);
+
+ loop {
+ match rx.recv() {
+ Ok(Message::ToggleMode) => {
+ let new_state = !TOGGLE_MODE.fetch_xor(true, Ordering::Relaxed);
+ let new_label = if new_state {
+ "Toggle to Click [MB5]"
+ } else {
+ "Hold to Click [MB5]"
+ };
+ tray.inner_mut()
+ .set_menu_item_label(new_label, toggle_mode_id)
+ .unwrap();
+ }
+ Ok(Message::ToggleActive) => {
+ let new_state = !ACTIVE.load(Ordering::Relaxed);
+ ACTIVE.store(new_state, Ordering::Relaxed);
+ update_active_state(&mut tray, active_toggle_id, new_state);
+ }
+ Ok(Message::UpdateTray) => {
+ let active = ACTIVE.load(Ordering::Relaxed);
+ update_active_state(&mut tray, active_toggle_id, active);
+ }
+ Ok(Message::Quit) => {
+ std::process::exit(0);
+ }
+ _ => {}
+ }
+ }
+}
+
+fn event_handler(event: Event, tx: &mpsc::SyncSender) -> Option {
+ match event.event_type {
+ EventType::KeyPress(rdev::Key::F6) => {
+ let _new_state = !ACTIVE.fetch_xor(true, Ordering::Relaxed);
+ tx.send(Message::UpdateTray).unwrap();
+ #[cfg(debug_assertions)]
+ println!("f6 pressed, new active state: {}", _new_state);
+ None
+ }
+ EventType::ButtonPress(Button::Unknown(1)) if ACTIVE.load(Ordering::Relaxed) => {
+ hotkey_press();
+ None
+ }
+ EventType::ButtonRelease(Button::Unknown(1)) if ACTIVE.load(Ordering::Relaxed) => {
+ hotkey_release();
+ None
+ }
+ _ => Some(event),
+ }
+}
+
+fn update_active_state(tray: &mut TrayItem, active_toggle_id: u32, active: bool) {
+ let new_label = if active {
+ "Active (On) [F6]"
+ } else {
+ "Active (Off) [F6]"
+ };
+ tray.inner_mut()
+ .set_menu_item_label(new_label, active_toggle_id)
+ .unwrap();
+ update_tray(tray, active);
+}
+
+fn hotkey_press() {
+ if TOGGLE_MODE.load(Ordering::Relaxed) {
+ CLICKING.fetch_xor(true, Ordering::Relaxed);
+ } else {
+ CLICKING.store(true, Ordering::Relaxed);
+ }
+ #[cfg(debug_assertions)]
+ println!(
+ "clicking {}",
+ if CLICKING.load(Ordering::Relaxed) {
+ "started"
+ } else {
+ "stopped"
+ }
+ );
+}
+
+fn hotkey_release() {
+ if !TOGGLE_MODE.load(Ordering::Relaxed) {
+ CLICKING.store(false, Ordering::Relaxed);
+ #[cfg(debug_assertions)]
+ println!("clicking stopped");
+ }
+}
+
+fn update_tray(tray: &mut TrayItem, active: bool) {
+ let icon = if active {
+ IconSource::Resource("app-icon")
+ } else {
+ IconSource::Resource("app-icon-inactive")
+ };
+ tray.set_icon(icon).unwrap();
+}
+
+fn calculate_cps(rng: &mut impl Rng, t: f64, fatigue: f64) -> f64 {
+ let base_cps = 13.0 * (1.0 - f64::exp(-0.5 * t));
+
+ let time_factor = (t * 0.1).sin().abs() + 0.5;
+ let amplitude = 2.0 + rng.gen_range(0.0..1.0);
+ let sin_variation = (t * 2.0).sin() * amplitude * time_factor;
+
+ let noise = rng.gen_range(-0.5..0.5);
+
+ let mut cps = base_cps + sin_variation + noise;
+
+ if rng.gen_bool(0.02) {
+ cps += rng.gen_range(0.5..1.5);
+ }
+
+ cps *= 1.0 - (fatigue * 0.3);
+
+ cps.clamp(0.1, 18.0)
+}
+
+fn click(rng: &mut impl Rng) {
+ let delay = Duration::from_millis(rng.gen_range(5..=25));
+ let _ = simulate(&EventType::ButtonPress(Button::Left));
+ std::thread::sleep(delay);
+ let _ = simulate(&EventType::ButtonRelease(Button::Left));
+ std::thread::sleep(delay);
+}
+
+fn clicker_thread() {
+ let mut rng = rand::thread_rng();
+ let mut t = 0.0;
+ let mut last_click = Instant::now();
+ let mut click_count = 0;
+ let mut session_start = Instant::now();
+
+ loop {
+ if CLICKING.load(Ordering::Relaxed) && ACTIVE.load(Ordering::Relaxed) {
+ let now = Instant::now();
+ t += now.duration_since(last_click).as_secs_f64();
+
+ let fatigue = (now.duration_since(session_start).as_secs_f64() / 60.0).min(1.0);
+
+ let cps = calculate_cps(&mut rng, t, fatigue);
+ let click_interval = if cps > 0.0 {
+ Duration::from_secs_f64(1.0 / cps)
+ } else {
+ Duration::from_secs(1)
+ };
+
+ let variable_interval = click_interval + Duration::from_millis(rng.gen_range(0..5));
+
+ if now.duration_since(last_click) >= variable_interval {
+ if rng.gen_bool(0.99) {
+ click(&mut rng);
+ } else if rng.gen_bool(0.5) {
+ #[cfg(debug_assertions)]
+ println!("misclick!");
+ } else {
+ click(&mut rng);
+ std::thread::sleep(Duration::from_millis(rng.gen_range(10..30)));
+ click(&mut rng);
+ #[cfg(debug_assertions)]
+ println!("double click!");
+ }
+
+ last_click = now;
+ click_count += 1;
+
+ #[cfg(debug_assertions)]
+ println!("clicked at {:.2} cps (fatigue: {:.2})", cps, fatigue);
+
+ if rng.gen_bool(0.1) {
+ let pause_duration = Duration::from_millis(rng.gen_range(20..50));
+ std::thread::sleep(pause_duration);
+ #[cfg(debug_assertions)]
+ println!("short pause for {:?}", pause_duration);
+ }
+
+ if click_count > 50 && rng.gen_bool(0.02) {
+ let pause_duration = Duration::from_millis(rng.gen_range(100..300));
+ std::thread::sleep(pause_duration);
+ click_count = 0;
+ t = 0.0;
+ #[cfg(debug_assertions)]
+ println!("long pause for {:?}", pause_duration);
+ }
+ }
+ } else {
+ t = 0.0;
+ last_click = Instant::now();
+ click_count = 0;
+ session_start = Instant::now();
+ }
+
+ std::thread::sleep(Duration::from_millis(1));
+ }
+}
diff --git a/tray.rc b/tray.rc
new file mode 100644
index 0000000..e97feeb
--- /dev/null
+++ b/tray.rc
@@ -0,0 +1,2 @@
+app-icon ICON "icons/icon.ico"
+app-icon-inactive ICON "icons/icon-inactive.ico"
\ No newline at end of file
|