From de42fb83c53498710256cb7fb58afb51e1721e42 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 28 Mar 2026 14:46:54 +0700 Subject: [PATCH] Support new styles list from appConfig. --- .../animations/chat/sparkles_emoji.tgs | Bin 0 -> 8368 bytes .../animations/chat/white_flag_emoji.tgs | Bin 0 -> 31757 bytes Telegram/Resources/langs/cloud_lang.strings | 6 - .../Resources/qrc/telegram/animations.qrc | 2 + Telegram/SourceFiles/boxes/compose_ai_box.cpp | 116 +++++------------- .../SourceFiles/history/history_widget.cpp | 4 +- .../history_view_compose_controls.cpp | 4 +- Telegram/SourceFiles/main/main_app_config.cpp | 42 +++---- Telegram/SourceFiles/main/main_app_config.h | 7 +- 9 files changed, 58 insertions(+), 123 deletions(-) create mode 100644 Telegram/Resources/animations/chat/sparkles_emoji.tgs create mode 100644 Telegram/Resources/animations/chat/white_flag_emoji.tgs diff --git a/Telegram/Resources/animations/chat/sparkles_emoji.tgs b/Telegram/Resources/animations/chat/sparkles_emoji.tgs new file mode 100644 index 0000000000000000000000000000000000000000..9a97d10b76436759791b7024d34b1d90d741f7bf GIT binary patch literal 8368 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 GpaB3Y(hpex literal 0 HcmV?d00001 diff --git a/Telegram/Resources/animations/chat/white_flag_emoji.tgs b/Telegram/Resources/animations/chat/white_flag_emoji.tgs new file mode 100644 index 0000000000000000000000000000000000000000..4c7837d24e6ee8eeba0c4e2a193a4820a736b0f4 GIT binary patch literal 31757 zcmV)2K+L}%iwFP!000021MI!ajtVO*YZp zmMsVb1OcAuVW=BK$dI1l^cy+WT6;%kewkI3RVS;-h8hI>{27&(FCzAi*w?lG^$)-O z=fC;kXYusIzx?56Kh)RyntnL_@aMn&;b$$Je)!A3`Qc~lKfhZ4iDUia|Nh};HKx-K ze_{Xq>%Uqb`ltWP|MWkv&;041{wd%5i{Jd_&wjhU@=tz#`r((q_*Z}SYyA6P??3-w(0`NgmQ?5}@|A3go>n_u(& z|6+a3zy9G@_@7^BfM5HU82EqIKf~+DdHv+S+W-FBlises#@6>=@$dE5^#ct*u*PBt zYviYY-PG4T<;!9km*2*bdGWYE|J(JxU;K)z`kTM_#ozpy78(ot!$1G^TE)Not(NGo zwetMKZ~o#3U(0*T$fx6@@Lv~?$tSbFtbf^jgPw<9@F#zg%L()Rlb5u_sGeR@dF^$* z4yW+*pYyBMd-7{N<)%NR(@VH|%fG~1Vo3aWY_IrJ>=Q40!@oyg??1JHH~+IAe)ij6 z|6hOhw^xh(*%_q!Gw81q6Ubk9`j}rco<8X5+ggNEA9}GKzpcm5ujy$MsP`u@U$uhi zD;to*`m87|@r?nqD?uMzJGulc<>RD8>6=r3^; zJb1E?#KBn=2-CCXvX%4M%8=Jybe~2#_3}FOVn!}ktN72;rjg^-G|G4l>qknqU;Rm% zu^t^#8L@#BuJ$^h+P+Je(V9?v&Ci@r`4$bqdTcG}L0d6>B6?l1^*0mYL-p&2ijwJ~ zr+KM(wqnxyp785)FX=}5Gygz^qTn=q;8cqbOsdD)-EmX_TtB>)|JPsq_AmZPT=&Ia ztPAANfAP!T{28B~*T`>w;753i1l=NQ$|wK-xNo@q_jPCeEiH(Pv9U&e`OkO{{qq0h zfBx#1Gz&5$e;i6-h<4O|Nom0BCF!^cmC;L{_>Y^{K{`} zo&L??S5CN>F>q(}H`k-gl@Vgg(32!{zZ~n#2+kW$ln;|~-|NiS={Pl1C{8zvJ zs~`UM=e}aF1~?U)-+4wqmr>W;s>?Wmf6F)Vy_oWqsg@3=+J9e0+J9L8`=5UNuRs3X zJEqz{xNS17&oOMwwJKeWNNZX-&E}fbsefzV%7u>DD*lA?Xw=U?S6tWcsZ`fp+{ULd zp8Hti(~mXl`r>|C_D*zDp{~PxS!>UHuKDTb8kJX6er?^KYcBKgH9YaLX86Km(I|B3 z3N&idQ#WybLFNN4-&1#^g0i(tihS>}@Du6tKfwz%wfz&gT2Hm#nfgD#-IKn2_xxUN zg=cxXBRtVH^|SR!ZnMjje;tPMe%zlw=|0T&?!(hhzLcgZ;SBLgJ%`3M!|T&xi9U?B zAY*U9F@Pl*$5=0?EIPNZ{eRcHV{iCSs70^Ka-T4qCtk<&+WEoPQ22&rOxDPEl-OwS zE{}9+2i{v>1OAlOZ_yTp&$@O2XJ$J7@}+XWjP>=)BU#5-OY{cTudc&3E++wR<&D|W zYdwC)Yf8}0(D1Cw{art{mTcf@QeF>UPSuXk z#&xiydjENK^rR#!ziEkz0t+~cBA-8%W`=xe_WBe{H8VV|e@#q}Bgu!F4P`BKDg|x} zMp_*liR&s%rwE5L>6h2v*Qv_$FDxoou|~2-Mp?Y2))+vwRFmSnD%DRv12^9#lm{|83alD432CNC_lR;aWbcC0+b$aXC9cokJ^S#Wqf$7AF$-tY@opa-NxrgsBstKUMn8!SSJ!g+Dil)#h>bu2XBt`v?Wo}mwk?nUW@x$refeQHr5fcv>|1#Qdq*! z6K|2whK;1P5Hb^|*E#^odMgx*3I_{d$rWz6c~4gcPnMUm zw6^QIU5my0m!h(DrSL9UbJ3uRa#X|%W&o|*(~}p zMz3G|3Wt_RNs5e|qUbgi{H!DlWI~nt(yQ}oIFCd%)N$NWNmZG8L$i>rhC`c3f}D zJaeKORXekSv$;@LBpxq0OWyMix|y!574?`s^h0)6dQ?vkqT)cz$*&M9z)~RHDLBz+ zbgc)-G7&QGHVW@3%48HXn7YlsakG&)#jDx4-6;gyZy0G6M(EO%#vPB!@0?)K#dDAm zHdi~_Tntv7l=^s@j?`nisU%#7OEd6bnfYFvYVRlt4l*i=&h%wNO}tFqQn|I`f=N+_ z3>J%?L($s{HZZ~BDMe{Vb3J{Z8n29{v5i6-=({fI)T@@Zfp)1QmVcRUo=QcQ@wUDx zd6oy6rAEQ4`NrjlFs058|C&aoKb+}f4m!7!mu-8zN(u=JqXT`^f$pg2ohy0*+$YM2&jeJ~@$5YJlC zxCSX&GB7sW>JZOnO0n)Y?%BKunEqs)sK2dNfBN;f>~f6k{yLmOHX88sKpW$ z?5Ff#IgyR7MYl6Q2kdsz6@cA=aNYX-hQR5~>ERykldM%=ec=9@=Y1Bu$u z^&QJvdd&kmg9lRP9)2~x3G&lS`Kv4^sdz@-IqF7*H4h&RkEL4!BeQ8_#{Hh85qWZm zs6auMrsgOGQN~&~^wTut`qqG*+z@oZISJzi2D}zCjr%tSz3ec|3txUHG-H@2y(R|D z$mZ9(?!YIA}u+fUGpbx*hT;LD-QabHeL(1S0Qlq0bM3NbFJ$NJ{l>E+HE zZ`GqJ#t?=aNL~d{kZ!L>QIw5dMeVO8!n|LH9z#;gOh{$YN6Pn9gu$+lHDsEC6qsVN zvIf)^w#{sAFwyYJ$qmVWY2k5t- z=zxT)jhW+JnNu&cfKOJ=VHW@_DO>4vyboNL>-A~ zJ~NhesLew>eOW~jmP?kJ%#1@>c2>z|K-U`|gd3dXo742E{%Y`gk>n;gqU-x#lR_VT z*bcctdDIfvHRBv9ds9bnurC#X?U^li!Aref-ydm6NUT!orG;1f`FqjaSNRr^K}!U( zd4p)n)~PCeQ7|7NsAVG|SHcSgvQ+Y<{s#*g;DL6v4j-NK$qy(A-@Hy_DM>IdXPRh0 zTeys+Ua80oswrze+fS;Rkp2(00MZBuskC29+JKE&!aDP!(B7Ycx`Vl{)D^0r6?(0fc zK&~j}yKWW6r}e5TRy*Z`&&FvNCNmPsIVTNJS!O>$Pbk*w0_{JRK}}D7G&K@NR35}4h-+Fi7y22&K9iUF6~&XH0*{F2V)9U)LVd!$$|E*- zm;r7D#Xbes6^?X`>;dQs2ioC7rYr80AdIe&Avvw>nHNg`;6lOCFc9IIw0cxSauNP@ zU8#kKZDfS=h3?x$&JX#DE@@tNKt`-|N7!e(io$$dPmt6axKpZv&JXHIvDevB^~bO; z-K)r*M0}3{sHDV2Vyv!ai}@~tosSvhz;y)mPQzW8uPX{p>cmW-xg}X%$r4bzP~K7$ zO)c-3hfQ@^I{DF>;(wb ze{VUs1;2n)T)O9^STI}3)X~Pa9hc|O=wxtXVVTOGsg^+=cCz}t!m9q$_=>ui{S|Yw z3@q|MQ~J_%J_W0=zR?#t_qlsKg@to3b3X2))S)1k78XAIM7;n)pq8kd>rCaF){=~3 ztIEmOu(d@_6tf$qEkSb6dX(lP&=!p3{T^rwMoe4IpK@&}bW~>8uDs5U_|$71|b5;)^1+OI?7UaLym9!31S{+HpPGqi?=KQckct|D?ij1tKZvz(nn!5swx+ocx zvE5v!5~H8%X+ryq1x7F8v z(>fJ$`=Y|+iDaU(>sDnI@NkXl;Z;Eu{yo)Ws>`F=+=uH+l|rZFLE-gxMR_Z7p3O&~ zFR0%d`#sPXj41YX@hOXa;m4OKA`ND@iw=nxo*DWYH=(bv&Q3&5sV{4B!<4%Yg=2$h_Vl*Dk#>Kj)2Ln@J%arq3k12D;vxPeo$p9EtIA9 z?z56S@c z$6i4c07Ao9APV@AY+usD1g`fnF(s3BXA{yU#r=DZpwg(Ae~*E6)zpH!86 zR27fFsfyrAQM8Z#YT5S)m`i)MggyNw06{ zNq$gID$W`tFHy7*-_R4Q_uHn2)WnXU-B$4eOYw211zXRGEx7VJ_d4U7YhK07R(P8Y z7Y`a1s%6&$)THCurJ9UkcS_v-b^}|>5mOV4Kus{>1E|Q;Ks$WM)C653jaQ20;M=eu z!ZS^! zTP6?8*REj8m(--7AxTMmpkMEX%nykzV_-9WZa zk+0T^$F!D1y5>{834v~SwDPQ}h-r`OEogWj@#0{&6pW8R%n?VCO@A zmVEqF_CBJ_KBB5BA2qk49`T70VsAuo-B1Babho-D=0u?#qra;itmKBh)vvT8DnrG( zLs%?U-@qlNp>1c(c0}E5|C(;#`w+ZDzSt@ZX`(j2cCAjOni1~}#4nxg(lDOyT_P6m z4zvu>oQ&UCA60d4ouR=r|9QVlFx}pt~vG6oq8Sm=KGD^|Hg9tGzO5V~HRHBsK9z|8D zN?;F5OuaV5g@F&Es$kTMR3)3At1SbzGODO`mAs)X)|CIUuYU-RVyt&eF8IY!Jpe4! zoeKL{;Rc;Z`XgOsyy(2ib}XPo4b3I#r|Jn4C$L$Y>q(=b@zSk;{4FgRZpm)Pgir;5 z7kEffQe;&L6~)xC;`m6kuVith#3l+<17|7;_RdeoFsVHJQ;Y zR;e)CO{`5a9C9g3OtLykqIVgh`U9bG%TvjJPs4R2v#$mJt&H_~^B*mo^0-p4)nyrn z(}KZ?+2^%YXMJ!7cJAY}(e1sb59oyv91SZpCu&fm>LBsvCNnEiepw+LNF#EA~P`y4{ z0R&p7I#H``3g$^Dgo$1baw*z6jzk;Ddt^;p?D@-g@l#gUqV&kvzB$y8 zg^te?|Co;fEC$KqhJaef96NCp*i>TtWWZ^cN`M;=?uCvL6v09V*4I_qWB?YX7Xl@=k1b{fD4fYi>IASe;K1 zK^Gl8i5S#-mCz#+s*87uyBuY!z{6Jo`eTM71;zT<3zF+-BvIHZ1@|Eio(0vQ>|AUP zOnt-$6#<}kMJe(Svz12BW`c=Sn#HZrR)?HOQzW}8j)TfWZW#vTiSH;CMuzGaT{)t8 z;vS{Kx9~35QL2j%o$mr%iAx*3D86~((_wP^leM(@C^?_jg~VJd;uE?KqQt%&GacrL#=4V{!|@RBTnh}E zAy&F}gZl&J9#jc+ZX;C}*$F&Z0l%(L)F7aR@hMt?SOL|dS@iZ+Ey_*_UM4xFg$(l! zGE^_m3J+?=vfq))LF}$sXzHZWqO z@Aohxh>_+4NCz5@iB^+W>=Qcgli>zL1THxtcF^1$a z8b}5snS%fi3PhqoBl2=eyH1~-$@xi|F(?pF-?#1y53|Lqw1!pHUMNPEZ8aZEY{+#^ zYW}baBHb4-X`2}<*h~~z*?oa9T-8YRw|E_vXEieOGJK0gqp~VXFtP`z7iDKP&L8sR zUo*X^y8>Q*VR|l(z0-jax<)vpv|`4?SMbXJU5rsW3ejUzE|XujZ#EryNSQ8821bPB}J zz_e)D5dby;lsOLjR>y1+2{<7wkv>r;u8k-KVouqvicB!L_|a8?8mrQY0%aRf1qzG48!M>lEOB3Z zIrH)tSEh|{^Q*H`}%J7Q4Tcv2*gu1*bx|>iA4W;JdHS_#nKo(_x?E65aaF(Mlt!Snd zOe0X9QM;Y3Un8=E!>bUPd}vwkY5P4%pK>>03Wi|~SV#f&216tD=0hsQs>AdmU$mjK zN3K5?_W0U{YASrm-q%tH*bx2xO$PrvZj7jP7AJNKRoxayL*sDGzMO16D3u>Ri_a5u zqewT}t~@j(rgW_vDDg(zCUN7btXSf%d`h^zEr8!-9qUNtK`!rp*_&zZ7Fw7gb{Qch-B_ zeh+2bvvVBD8jxaOfQkXlyZMlHou%zuc-M!Nr#>~OCxqY&#ZWzK&UUoo+*scS3%1ym z!4s+6(~O}$Q|ljWTu+=`^?NmAaHU%KNHc)#l_^U0^WGTM@5Z5&U*P=_nN@FAeGge| zEb~w8JCwpJY(siWE7I8a!etR|kERtn*;AslqCOgmD$Mf$ghX1=biTn8cdh8sioCB2 z#Py&Rd0!W-#LIe5+wV#GlwB7X(Oc}gzyP!&@9X07L#7p#dp*;|Z9!-9sqN?Mw!8*N z%$GH*REml?WI|Uy;?z2g!abd+!r=@a_vCF++)sO1#wk?-@wf7HOR5zM%-Z>RQn~td zFlvf{Kq)|6tcG?ZfZJtdyxS?_84Jyw3}N|9gfEv^(m zz_ilZdh?;Mvv+H=hu;*A$&j8KpDov%2FL|RG-O$^7~HPL(j%G*Gu-XwKzTV7!k~?C zIRGIMCDiI{LiicgAH#7(pQ8_mW-r67Ry2b5f}M$+b(B zSXT(ON}XKj)B^M%UG<`52HWP5|NoA=A~n|BybvuaD<=|qX7nQMgy_iAS~%iaEh<}m zU(UsTC>IB~;xeJspY(xROEujJu)=X{ZoKe<%k;hFF&OU!k)P4%ZutN?{u(|rCo26+(b%#{7@ebFg|uk z#C&!sDm@zux8?i!YiI;p(ty2brO>=1Qt>+?C*HUyFnHz_5qOp6y03`n&h~XHQ$q~H z!cWNx&IN>a?~Wja5NrLcVnOzV-xAw28~r;Rikuuk*H1^*w@0Qvg8}!reRa4e46UT? z+LfyA^7&v%$DS;!1TA%G*3;O|w(ffXCc3j-bx{Ck)12+9ivsUy`7*DN%XYTwtG&gY z?W&6cBlYG(x+uDw?KXBI&nnyEN7YXt*|}8;R|!{$er)xVvY9@h$8?-Q!kNE84@^$08%xa5K@G~>YH-d&Ug1}ngBN4iRUMw7OpjVj$SJW5d737SD2u6V zML=x>u{ZK|t|t`%NFeT9Pbvc6)AoA^@s_r8Jzx2jw4LioMc_!i`4CqF&4D=k%Fbvf zI}>`o>qq?72of)|4HdPDYM&Xh2@TI)VPh+hvo*Xd6&D08PTyo0(1ke5HBCbeY%wZa z6Vub=Thg*-+znyFa)_56@{n7(4?yBfvWoq-V^wMG6C?9O%7c`HFm=9HxY2Wh8?#(O zxiz)-s>G`p=GrxKVf6Y9xRDNhnuM+XDEKYWKXFiimMsi(gm}oOW^loT>u-_B2to10 z5>>g!g4|{!g#d@$QUrVt^A`y5jXlyd68%#|WXDKKhff)r0)Bl7*mQ58uvqynb-+Iy zA4~ejM#S=Ldam>iJ=f-3jUTXc5#_b{n`ffxqyM4iU8l3&gdc=$ioM}jKSb^fm-Rj?X_ zrmc>CKboLztvjm=Wuy8{qRMV38H_qoy^$4>2%&EFV&^7vgF5X~S0&ABYS&kSGZd&p z9O)yk`WZ>Uxz3HiZ!?sN&Rq7enh#{EJD|=5$*AcYYSX3#3A&t{KrvoZFK4z9MLXnl zsCUrZTC#N<2w_ky=f`!XJCeNlvk;yJk@T?-_qeUYx}+i;va(B;334j+%6X)N3SiYFbzE#>wl*D zfRP@8_tOvZmU)f6cv2OMKf*YdBp)Si&0CEx9?1dL6AT%HoV$`Yx@x2v8u_lgB|7-Q zo+OF=V$^mcYw)ZSFhwRC-%+SfK~~|*z=nm_JCcTKvOI|5bQUxeuT)igOj-C9X!SBp z<{8A2v?tE~LuBx1Eyh5`GDNZVfQ;eosB5IH>}*2(K6R}tGwB2?kjN%Oq6paKf=|AL_)RNiM`dFG4)xHwFE@2_pKfUbf`@Pz4eUd( z$Y{)$uEOG4=hvo7Asknl?y5%%N%V3fY6SLzM2uN3dWGRKWD^ad;|Y{WZNh+tne;pJ z=(i$A!B0Lnq>2KGtAN8_2qr5PN571SfuQU>^TNE4wxwH8F=o*nyI<{NrKBxwiFM$R z8n0Q3oWCd-HWx_(MleJA3bhmkkaiafz`!>hVTv zE)dky&3OmaN7s#$iR4aFf^66~YuC|cfj@{z0U&u(G}hhwuOh*94SMMMiWN>1;l}3` zSWpiFl(4S_&6L5v>zA3$p9E*UbJr3+coUlz35(rWk^M^$1Pf?4BJ^d)gs9}(0Fg>L zQ+#>4Xia@updJ)xOBrU07rdpF>wz9RBS4CT1(Mj=qZ3B~QjxnKa39^eFo-$@Gdo<3 zO#-KCQ)sP-UIZj*hUT8Q8OZDlC;@uW+71M~n3W(ZUA6*ZMXXzoPY!@pdU(!t zlM(u0f?OCpm;j&#L{or09FR&y{4S*u_|%0wYRQ}OJC53>J9x5jw;X7~&7*tSg0by)L5rbYPGKw7l1A4}K>ecqMGW$2x{L0!QQC$`8) z?P?_oR{|h5xH?!{2IGlJIQv-~Avy*&7gg48ka?ufICrlmVH%+A%AOine8haN_G2$7 zl1)lm*rR_Wj!f3Ffz^=`AmzpGY|%APbs68%bpe((0Pd5gUUq#{PL@cwlFvk0IDx^o z2#XtyI>mG)|H^Cxt(xU``7Eh=Ms6^mi7a$LXkZ479m~1Q+@~*trS|grWto4Z^bV0@88x4r}n{ z-hK_4_-50IQON0Acrc7g%vIWqOg^E?PW|-8vBDok5#sqr-zEI@1Mpr*Trf*;Do2b? zOIkqP2g^*;=2?b#0UQ8jw-ah;1e)jQmN(?Krw?d-pG$swy^SUGb7vhqPI3jT>#UVa z)&XL)SPw^xB$paY`(&mzvXyziN346Xr)W~LhJHZjv-efpHvli3NRqZ;kZqu{8cu)6 zT1!4&9(U+tPwz6|zPr0wH8929Y210GRPC-zu+hB|eFSCelGXxsmMz_3aXr0HWcxjl ziR=BXvM#155|L_Stj9YYh~1M}j?|h1Wmc#S08mucHc2g`+LgB%Wbbb;+_h zs)w-6Kms2qs!@N@fs6F?5gY51%WkggYT(o}V5wXxY=dvz-JH#iBXqUcyhlSBnqz2cNnbc~GYFoH%19Lvrh ziY`tc6_mWcvC*&KY<>i~&a$*uML>W~o~m_~@69$%ECx`d@0C8B9;pC%z%TuydGwFL zJo>87w+=Y`-~YHiUwnqoR}VhlzyI<7`|L@{AU;PTg(I~q%{SSZpT zT?pY?YD1f-#(M+{K%4Pw-+EaRjGQ;aHM&~fxuMa_5Rw37d&=^BK9!`GYN>++|scaFm1@6o>R zCDS!D@@bRp5)86}>)iZ|rjiazIe{o-{Q&W=p0>;-e0iDOk+K8kD@#qnRz1p}Bn*B($n+v_p<9Vxnu=H4WfAU^X1Lt(x zBUhvAv-1?*R0&4^RRXyJMGPls_u}?Q{>^K4S3zU`~Lb(gOcRh#UY4vf2&zv`vBL>!j-t9yoXBStJS$U z-snPj{(f%tO5)r+?N~2XkBpJ^EY9rah_@2^M>qA0ZfbtVO@-SAKa~N~_uSO>hMSuH zu-w#iZQ6S!6NoC{q0W6c6Q=?(+Hi@LOD<$M3VhWdxfUN~JsCPKNsnFK8Op`bGK8Mq zKAdf^64lyZfS|0C@!Du5X6xulL)VYf-0mQsGe)Pk8b_XHr|w-sqY=_*s^?7L@G9IT z6&s@TmoeL%jKl?Xi6C0#b+f!5)|95l_KQin3=DPxDFbg7Aq?YrHJ+Ph6(}W>)+X-) z&4?Ni1GV`V6gGfYEcfw*ci|WF5D3Vu*IR@bmyp?7I9RV0GU;HZA}4r%)xpz z+;af(T}yFyzsUO0Ps=<~dl`vkv^3qmt-=*=O5&}bCKHae;3MlLepY_p*hQmIQ{wV#<4hQ zTCi+wOJwP*%m>y+o>@DK&cpS~)e`L)te&WkF3Rex4g7e&l6FhqvBV1YOH4L9MsQeq z<-rs5Lr<18tGJ4&|D6TPC7Mpni?3u<3J2)-csF~W&;gBoGHxxn+-Vr8Gjq)sF(U*l zh<`urvg*(*(YXWlVzd(|%|p4bTm3|hMAi7nK>E@p2A1;IUGhg}wx~=-2L&n|MzC_G zuWe0@1nCFip&f^W(V)H(6;+5sYFkh0a{-;9)vtc@rrcE?q+heg{<7|PA>Xs8TF0SR zP*&lWGyT{Z1{{`*L|^dIq2<@Q_kfkyJ`#dG8_V0*I5Te2khusAdVFle!MuzZl)#==7IsLXq0b#6?%f|lXmXKhiv zt2dbkY4#?G8?AYFlln-fZYgqZQhslfVwfz_HQyA%3=c2gY?8wFV5C=5N#hT}Qd9l; zr#2~wBUJIx#@XTQ5+QpH*5%GRBJ@TNGAF3JxED556B5OmJ-YgWgIgTrR-`TQtX--{ z5*%cP(q=3;sjtiU(5O%~f4o;qzB_7}L$|W}j9h#*bL?`j2sC1}uP3?x_(Z03CxCX{ zZrBhW7tAtN*RN$pu(nO(M|^L?E-mz6Yb)Qkb9(Ac;q(*_P}wp2WBOnxjo~h%mt5co z!)TNomdDszvy_x?y~SfUZ)i-SjBg=AEmkfti3x#q}!=|ym1!8Oa1QFE%7VdlEBI&mSCiQ z>FRha3U&Dp?V124oTVBI_p+&qXcQM*?$fi&Z|@sx%Dh!@zB*!Jx5F`V$9$SGS#~p6 zI8RWtL%^LzbgbV-_gd0#lV(!|i<0fxZQGufw&~&irgbkg{mQ--#ypS}8Rflg;|UUN zH%vrP>eKJ;ow$s$2fteqe`Wae)?uaVdGpL}L5eL|=9%giqN!W7ymz7|i^l;-M-DMg z+A8i`GLj5_nZdzo<1BLz9evu?)gxaC6TuN%TWkxo~h7JEd7 z?V!3%%T;XX&K6FAB#wT62Zi4f9^XJ39M)ERy@Mh^1O%Mf4%Ld3TmxIC22S6@BsA8O z^R)V>YOFJ-O!=?8+Tyf|^05&GV*3;t)A9kt}mh>J7i~ zp2s2^j+B2WFLI0EsoMr-hYxPO>y1OaZ*30hwR`?}+vR!`)|_{*?D zonZy7*tfRNOGEF2Ex8M%=+d?3fKfp|&jL`vLv_~Ac#(k)%=k@I*(yV5-=c31Y+MtP zWYt-PmKAMW{?x{WZR@?galz_O()Ko@l?oY0A*M>W4R1PUtfUs-xTa`HEf*WdyKeng zzm5(JA*Fjb9r`@KiMaW&b7o3LyUT&N&%KKmd*{jO{^8!?#Ba~qxx9BSsg!^CzI~`~ zZdJzZ`kc82sv;zqW;q{}*#PYf{yoSk7vEYm4Ma+2RNJ-4cBW==9!f;}E(YOG?^*Io z|EZfbxLJ9AakFGK_Tye<9gWj`GovU*O9^*MS6UkTXe9PdEU)Jxq|Dd8PmSr@5qzHz zof}RX#$Jc``fVJxH1vF5%%V!kFKd~_s-1mrqh2fp{rFB9xS=aUK`VVav6tw1TZK@V zTuiIr&DsS}JJ91ETbt>bBPNV&WJwsKq5J!!sEU*CQWwVTLzS1*n z)o?KUpqQ}gK;x^om2eM(fitV(Z1{PYsAnS`)C^=XY14v^u9~BmtwJlmrf;JNZ5OQR zhyBy(&eGgV2ByuScB5^O#$s?87rV$%V82v3^}QJy7k|<`V0jOgxK%E|7bj#8c4+a^ipv zLZocSMJBQ)y&fk&Xb13)8|eFDDu1k^`*wg2RF$#Yi@go+mC^M#%INYRRvFz4zn3yP z;jx{P!Dqi19P;{KKOqZYtV{X6nmaw;i_`Z;^~2*VwezAh!Bz`rdt|X{{-Y_-Yeep1 zGf=Q0q^yT!vkZ=i0G~-?*2elxwS9*O!S~npy$Jj|IkI>J9`$SSy1Y=v$#Yk~hcZAi zP_75k)q^Pkw5?17X_qLe!FdMBQi=cYRfE7R%teu4hp+9-Z#6r#m`PqpFf z4^(z$n%wLmFh79&X&e`aB6;BR1bNo$XG<9od%CV=Z1uX9v4&$UBV4o(Y8hEMGt}xS`;8Q& zs?Z9~G=yXiao#Xyq~PCC26>2koy+T5weq^?j3Ti1&^{!*i=R>ki9T9DMPyr|WzC{@ zBiBtGP40tB&A%?0%u|(df;wiX66k|&1b?z_GO|2|B2?5$B7vGFP@|lg8KCQiq4&vx zz9qq|wM4Ac(0Y?t}FO&pHxkXy+Pq3QBj53+hJ52 zT3H}K7mnfkLbG;vm1EsOqkz^cRjP0rOHESF9@A`3RUd_z$%v@S^cGV(;jPfmnB>M{n^99t6IkH#L5XivS$o)eXl3)v02@1}O0tV}-U6aPmGi@*=m1|6d4m`Fj^H(h zegh05owL%{VgtAvr=Vx>pxwu6Z5o>vNOr(VK|MT6u2O!hO4wSgH>k&F3WX>4@GIK92D5L#o&Ofs`nsQ zYY|9bF)U3Kn;@u@A%kX$SsAzHQI7k7@^T8Ry9wiL1f@jZ%L+iPC4*Hz0^1qHzW1u@ z%BN-Th1DRp=0%Wt3D*~P7-{w_s<%$4VpS^B5HOMID_!PQFsH&#)Ks6DpiAS+auvKD z_Ka(8*G2Lw^dPos@$!C$bP0guG~Y6z4AJ2AzIYLQO0Yf87B5HdE7ourH;k3Bv>pm> zht(dPfv*Bpl~SqY1Wj||t>_i*)f*H{lA23b+0q5{K!M24EnPsZlXQhGUFoXg=2_B} z59wcnTzGwsfOTe&s(C+E$!v*M$E6^Wp%<+zU|^dE4S5sB^6t6S9+N6Gn|9KXm{75C zORZg7sM4g|32bydXrhM~hh2tUG4E(O=Po?_J3gKFFjyHkVX4A~u3`lhxo&9t#XS zeom^$4x^*0x>OC&KvW}AfL~2x+{$0mIlBv@COo?!s}C(5##FhP7P{YpQ}hpzDX~&(Swa=JP{nN3b!LT-kUXigs#`kVGe^O}MB&=bYC}dAK^)=m zJZUP2im&D@8DEhkIxWEVE9EFifWbvIm3v`iTglatwVGI}+7>0nc#?U4I6VM@T^^CC zaal~82!G_DGq*=oH=(*Xst!VxM0Bg*6r_qrCqq*xKf*kUk`)Ff7rpw#+ZLt-EbL^7 zb@#{~RM$}VFbsTr^(??NO@^KeJlIscWht@6h!id+V1tg;uxJ88BB&gg#lw0P_}PHx z#!cR=R2R{d33%adsE!7${=~zo^n-E5RP6>-Itp1qA~LBcwR%rdV2^0sd||ICG9M9} zR2zVjJd)c{&ZeN(qmll;bavi@45?ebH$@#;7TzS?(`yQE$rcDnbr!25Hcv_u+I{Yr z^|&i&)oic)#x04uR@&?>Gy|`1JkYWZH0W0MbgO|rZ%5v{cpS1eJLl4im)^PcUUjTh zzc-U^K-`JKPticuh+Uhq#qt(4C5?M{Ju~GIqp|Q|*)+KBFJu?zGzk1WIH2cu6l)%? z&pXuWHQ=aty-$KPzra;{nw+VLZTEx$S=0dJh9~IF?E%SzRWp#JY8YT|ayo(bmcT7X zw9QY7S~OAP-D3P`i~y^Mdl`2Hb&|#D-v({|l>8X4Ds}BWy(4P|?#uv_!wn1jbI0SG zPziP>BeArV0pV`4)+B2f+1;B=9Zt~&{fX6aHV6NGC0u=SQNtaci8H696k}=Y`H?i@ ziA_WVOkQ=cPZPCkETm>>hInPXKT*_%zW*Y3h~yg>DAQd*4q6L9Ed8p)V=|W{5;`SGH(NRTq+MCNqLh+1}yapX!E^tZdvX&NZwZ^kl;B?dOSB6D$_a00FkPYtKG zLpU`w!o9xCEk{{Q0OkQAdPlSmPqU&9F0vdh-8-IGa)~_j{G?EkAg!efer3VuIw5)_ zP`=+Z7qQ0}o%3HAPz>(!}Vf6l5+w z;X!to5V%+*G|Bc7&F*$mVWes#P9K2;)MOl7iOqD@#sjUk*JXcapj(22lrn_S6TSib z7W#%9t}xi|b%f>JV~;P^qCG9pcm_q|yz1>_A^bL_s&TTlS>Q~dAa;Aks_Q6rP zq%h3Usi%Y9jZI<*u(rLcVE#Km+}*s`KAaFM9#idcQg!} zr7u9((48X*`SvQ##D(M|o2WY~z4aWb!vx63I`1fnY2Pc)$TM>-ficF__7;l?%TesC zs$g9G!!v9U_@GMLXu`rj=|Q@sosz4^xDA^*X5}iQw6uH8rtwJ!-q1g%vZBhgbuM|P zY3tAOH-S#Y-cm?8H^2FP4R?7K9-Q&L+D<`eT5Cb< z3nQh6vV6{kH?9>J^^>nCeq9A-ex&&na~UlnsU>j{T-IW&g<-zPgieW9`{!v}IAZG& zSxL(&X-g3?Zo9GP9b2wxm zXg*A%YOo=7l-W3ww_>53Z`=eF|r zS+W0WPH4+x{p^2hO(Hm*MDzCd7yiw(V+o=6x*hU}lat*Z1W(XioYH+}_uE;SX>Sl| zE|lZXDl4LI|B;nCqV1ZoX#ee>`4tp!pa;U;*n#lfl7tP9`?T-$DMCTeJm=Rq_t{;; zWgZ&=pS$bWgV>?=??A=jGEV_B%V!g`(D(P}8$B*}`P;jkzA)op&T0t|J*3kV;*4I! zO?^LQ;ENZ$+USa2>pMTUEP(Tv+|%cWOPQLevGT2a-f3Y~qGrkU5+JY0#Vp5nQf5Kb z`O;ax%=>E=@3_l=^UI#Li$`V^MT*Nu*J}#`zw2H$@^t0ZM0=CWS;df8@Yyd%>Gz8S2P~XGQ1X^n{TnfJ|Syxqkq%IR6A7wxS2*AvVvwC<8>Ex`~E z`#V#p%fQXgREYLI8MJUlIlFtcmgw5>)gXuOX(_tva{7VUkz;SAkTmr-Suz+?t!w`n z!(U?*R(A`?gCYh<*`e@vTA~k|G@m=azaM`6d*AbWyX#Ov{JBRMsG3qQxOfRp{KaK> zd`N%wH)hda7jJG=*07wlBleRTzsTq*&X)fHjPE{NGgcmM7RuD+Rt)@8NyNf8)TP7l zfyR|9xA5j&@3f84snBZL`4X6R@_P4R1I!kxx*w|lcc3q=C641e@Is8Ct4EWdvS%lS zQE&ghWIhYBmF}=xtGr23M0r!dlo*0JQ~u@*SH7l{i$RN&&?iqi7f9RX};P_ih^_*WP0^QAb^w<;DInMU-@X zV2GG$S`DoiC@{vU;Z_|J)hAZlLIRX3GP=9zBF8;#X(jZX2KYryCUcuK`#Lx`BPB23 zKo&MoE5P=SLJUp=1eGBOL383lR%|DF#$BAj3n_1FeId%efU+ysvCW9WKdzfK?~pu? z;cpt!_G+%2iblkfP+9ir`SE;)Gl`*S+lnb7)DVL_Z*g1+zt?Ik@xS>H6){+o-t!DiqqjU;w5Wd1)36{ZRGFptCX01`bMtAVbyz;Dh?aFx3fA!=r(upS7 zLE0A$rYJf^JmTd$6@Po%cX>QJjdz`&ueU=p^4Ak}b}Md{JI7AEC}SG_GOagXaBi=d z;Ev?VI)y;mQ(|FO&3)|Qv;J*$#xP{^z4z}2A%MHX>T38jIAcNlQ==%KIi7Pmlv5Z${e27_^Y&qRpkFQ za!0z3uF|l9Fe7oRGSH6PHNy`L9SQss>}Icn))8Z3nS1MCmb-FdYO@Q}MCihp8WXmF z@IYl1FC1z}`XMPK%w_BpNHMc zjJ02@LO3L%g}G&5Z4udL*eSWgFcf^5i3}KINrUBH z1;k?p9tm87yp~nkE14v`8wIGg{ME(V;`jpR)O4A}I#w1%g-@3uFK*ugp9E`}!FKX2 zv=iN80C0@Cb!s=}ec>(mgzSJwO?Pb6P6sFEM%<27tYdUsue3{lu4LJ#KUeEwByb%I zuUEhbFp2ECR6V(Acx&6*iOBkaQLApTeg@H@5eBF}fLOYbL;V@<(+Q8oab0?%x;dLk zv{2|7%F2OdLfW|Ig_n(rP+$|{wdX(>_MnSNp_RFBV5j~7G`q;L9JAj0aP;;b=CR2RM;mHd=00nrD(+x z+(#kmkgVB%WmRz;XqRM#1TUZf5w(?l&?Z_W7ixH4vA#YmbwULeaReEPg#CwNxlJ7gh7xK&Q>VwlGrNyZ>S zEK+B4P~+}S1B-IVLiN1MFN?2YF)pD#l3pbr>FF=qnhQe0=nj)=f1m%co@v^#K`7K~ zd!DyKN13T&VJS04RRcg6CJ8&NzktZdZAoZ=k5X!cTjvNJKjUQB ztpSRUe!UQ4+%$04qg9!yF4imSCvCdY)z@ULWNU-$BY2co_}F+6a>G4myu$T= z>jHq~F|Eu~NL*yD)WXwMTu=&_DY?Z&>o!@jIMPhP0*>eHz=|k}<^GM>KuGXsXCmWi z{Az`;sh$O$UKnx>_6b^XocYqoT6Ex z(y2Xi(;V~mGpL8z582gO=D?J>A!Zv!bZQOs z^FULkF)06SPsr$>_a4pav&~`mRxQXW2TYju$E6#zO|h}JX*=(rf0I}TceCj!z&7)n-Ag3D!}LXgr{xI^YL5N!1uZzdalCIXye8B1?fs%QK$Gn;hj+O6+}6ceWurJgn@&%r#r%wlf| z69wvn;gGa(;H)jTw;cT~TrBA_zTLkWkv?)1PJQCK8YvNYglw_FriXSU zEdLD2Nv@bfQKWY9f;h<}rvrQv-1%`NE-N5Kl?s=zz5#Hb$&q8u{P*gYK>dhBmX#$^ zaUr=aU0^;NtFJAAhei1W1~11SS0=6_nozTjt4==-J`iZvU*F-aEk?r?EqK&`}MaIXU;@%R9}?#03{?4$f*2!r3i|s z2m}%#me}uTkWydF5>saat04}g#ucR2*rFSQ5G4Z@)O`VQI6JgDTL%UmT^1RpGom^@|Aw;6c7jCtNpCW0(aP6fHJW&r@oH4Bn`-5u1HHr)8br>5n< zljQW6#iFsB%ooq%f@0%glGIyQ__U{ItT7&=xkEDuB+PZq_%BbRKfD@W;wEx1?3(Ed zgeFafXt7u-(QKbz?#Tngebw5_mvm6^JH;KF9FEY3s;~D{>&R)q{mE&1T=Q~36APw1 z(4?IT+3_%iEdYi0W&J#~^xw$u;P~`y-c(?LWlReGNe-^J@YZ^6a}*krV$ZM0`!R!Z z7YlPoOYy;lqgo)KnYcN)2ESZb9=<5k(TJKT-}OsYgFFXTBEcqi1*BuxMr2x%<>LJ98#V15s1qVI5FRqD97BU@vGT8I znD-YHJ*aOhwKhaNK0e3w!BcNVwTZn+zIhMC#P79RhoHS+yHK1-;!9Al^}|UzeDr!D zE-Oa_*hFMHd$`8`D9&)D1vG$zb9irofaH@Fc&!m9zxl@B-V8vTvvh#^K&tSS`A8&5k19=Qa}C+> zcAlFnK|i)-B7`9fm?d6dds5un1R(Y3`@oG9snbW~WkcF|q*1Ee3z z=867-xNTP!s)>d)RUz=$0WwTiVBWJ3mFD_VxNXCHb3pmsb$jA`MW9gk`~wIGL;2E6?Jj$PZ0zq@D6diF+zK6Rz?`9-?~R4I76 zU|<|M(f%&%FLLZi$X=2HCNuUaFQ|k({D{4A9DfbxHhFa{RXiQn{KJGBaa~_EIi|ay zEFwL(M(eOHv{Pj7C16~rThrBq8EVexfCGo?sOJ>@Pbc03TYJnS_dnm6#A?bL-ECKd zb8MjuT;Vxb=RE~FP)pV5+fmulzQWVvKvD5q;sj^1a?&}n5_Q?+??Bah1FkD|HoF+} z-^5o?Pq#j_*o!7R?*~a(oMBTq&dn+Ei;n%F26ff(5^5 zZ(%WprC@dw|DZxze#F0&tsEQ%o$lVC1dAZYfK)@n2A1j;VrHVR&=*R)_LU<3wtG?Y z`RiR=Y_bpHTUcU=N94_e_=wO32=Vz*(}uL(uH?lf1~6HAf6O=fpzQ_e2~s8DaSp7N zr*aHFH`V3}_{$u`?xHD2o(!?aP4-gB<1espl8$9KWj!cq8tZq>-sa{A@u5O*sg zEAe%vi|7OCY-dshO0`>=@)-f^%tYL8_F7M%1#6x&v_ep#cy^Qi{&q9gNd=a+RM2Z`JtE@kNG{2BxMFe={bpDkefL{EA4XKFajhj^Z;xFGGd{w8G{Spee&C8_ zQ6WVBuEFyHi(t=zGI1W(;IH8U8?-&RFU`vD7OFX=X_opdJc0{n3xAa zcRK`2dc@(+675**f&Ueg&sC)6N`yjHFUqC{H=5{@<&Pt&x49sxE#6eC9qZTVyAmA) z1Ba*6gj!HOcrwYS>_&o~*Ln$!_p6GbVUZ|ruBrmU#^f{DcbAa`;_0n8MH1LmP1#w3 z7-vh7322xvgi_)C5M!c3c2_ovCLcZUGAOv=T!LkA79!?)NmA7VLzEIl zS9@oH7@1SS_?kr1gIC`fdj~V~*X3iSyBM&yHm)~v5b7k^^cGKxN%QPAP?t1#6EcfX zo!fYCA1@)Zyia5($)+BqSO?G%L=I*8X);D2KOBcl#sLFRMt-d}^FeBo_9@S+cL>5$Ue%+}CuuhqJBMA?QMb_|;>H58+EM1U`w(1i< zo;F}p<3dJ-4k!VPA}Ng;2%>n3KHZXcOjattc5^S9a6onhb@}3DFo)yrxy^WjLp1K8 zW7j9~>o^=gkG9?wRtwj9&sTx^Sce|(rd=Bt{WRl_7CPNr*;xi?{jme_n~HKpE3`if zqVW34{SKVEbR#4-hFDio-D64LOD`}$mEp{4s5JRPz7=huO0(x^p?H>|BRbDoc$|B@ zU91(jKH1nWj+2iQR80~P~_Dvu3T4)Nplfm7c zetFtTy6Q=NMTGKfvDFcIBLGX8HR~!(Ppm$5;kcRj(zNZv+0U?P1C?|m6}yq@D9`$u zmOZ=7*IutD4{_>e{ZnZBL$#@u4~gwUq{lS9xWjjdS2I(Zu@UG2zKkokGEW?@jNV3} z+Na0TqK58R1Txsw(>&vL3l;;M+y1;f{rNs^124d`muZQ)ePGSnF7+3S!b|j;RAls= zw^OoN#5)5hQslfn?&?meN^fRfF2(hx-P7IADj*B@{mCjy_c+*7M_!Rnc|i*cx?|ZF zyn5#MFVvdXjNv~9QHrgkFO8B2H^!YsLTf7%T@@6_kZJ`*kHWwEf#kpIL=F_?(2-;6 zmr#XK`l^-B3oTb^dt(M+u!R&dWxKh;z7hD|UmDRuydGpHI<6)tcoX@!W?DI6abL&FeVKJAcsEU<`YNJ=mxvyJd-ODEfT=_or zE4DS{7tv^@QUlX(1AD5ZhFlEmiz%_VzD*wH2W~U;YF%KdmrVykty2bg6Y#Fp`od(P z>1JrcDg({ctx$dcyu=TLpMeoBg8Eo7`>)HX??Le||Ek#^dLS~x4lEE-@eKA$<+9T{ zo5dHFt#}v``AOH0nF=?{W^+8`j2L+s_ATAFeQots?-yt*jxqrB<8z_ox0U^z>!|Eq zK2xSS4PT7}m+xAv<=F824uWP9pG2MlPq8h(+RdFbcBdHUcBbc-72(F8A7A}O1GXc( z`YH3VS!Lf&GeVX-6tltag1BqAYY!rU{@p~nP=(vrDQXVzBm)3LP8X>tL>Lw654(Vo zqr6F1R7Ac4JJ?`~Cpx9X3oaJ4#ZQArIJ^ci7$ znI@|mPBsw316EPBUo0YA;Z-$vle!o;)0q-7>eSl?>e-gAa_P8P?~rW`%M4=G*Mstf85>O=4q7q2EHz8fVw5kIa7Inf!Le$&ZdOSBE>Bz8PWj zdC;cEBEC8)E-(5~5rP5}*L}9)zV&gSnbp1*%`gW}6Mo`?IDNWNAhTQZ--I(q^;u&d zd|s4T(NeR%5?&j-4e?uq8NNRI?kMeZW*y8qszd$iBxf|M^7ZH^NQ#95A93jlzAsTl zhu~v~BcC>1yoqinK)c6MZq->mnu51t!nF*Dn}kb2Qg}n28n6qWp*U+F zjCe0mO5>>ZE)QPT%$v;4a(Q`f{&>F2P(-Dxo8BzsSx)S{4feu~+iVmc3A-!bg%zBX z<+7>oP8oh=p zS?b1m$}IA^w)c?-&#-u2v0|6kxdpP&>j$<%JGPiB z>n1P?tPc;{F8?Q?ZEXD}&IzCP5Vf0$;BRZ|XV8Jy|0jzr|LZTGZJhrXbk@y1J;oT| zC5Kp#`gXoUQn8*5;~vx_Lj6N%>W=VYo)nyI&U53qQ7U)P=GF{<%Z&g@r(=~rot0tfdM z5n!277Iq zq{vsoU%=z3}wK{4Ca+()$Di4*9oDW(S0bav;~J*$fucLS7AIZ>!s8XQ$1SgMTQ_9`a9&2#@ek^C% zR_=lQUL`gk?{dhBm{81eVv#0!x)7@wll;S!@_bX%XnNuAl_Yly*v}-vz#={F>TggF zac>gaTjmf~tu69d3_Krv!bW=!}R>BspXm<%kz zcpz@@)dN7qn>D>gGpU$v!U2?`yG&hAHqr2kC?`*gT?Bus=vT$#f5>LOK-7}+jmw-I z^D+`!UchQaPMF~V-U_HfOTeih7~iJipUrH6Rxi%4!hWhi0CXpzjuy~RSHV=A{?Dw&4jT_Lu`dYDh(mRpQ8n58?S#1^$IEr7zr12 zCSJi*p{nWD0KiUhbvjzy+rI#aeF5 z{57_Arf!0?$+W?f4fk|-egv8E0!2+QJ};n@u#{oCtZ5f&>_Tx8s2gAw?Ce}fC9cQ| z!bmc!jZA!F6g|<=8|)78tIZ6{-TLIRrPk~+6flp3$`&R@QYMlCn$Mr7Kf=FIfH(<1 zb7*%G3ZB0k+(kC|2O_n|`@MT@XLvKBQf_>ATp0 zb^hc>@VJ|JUzJ~^3TU;-wVh>{IiahgmU~;+Ff;DhuCO$hUdPkB5{K!x!jj_T5GZD? z>0p#K#TmZi5JA~?+ij7mrt6kw7b5}_F}Gjd2$kybxW(vp$Cc0^{<>bM zEwQ7-Yn)bzv_jM3QUiK2+%UdV;bd0G8Q~1CTM2<=ZE@_oxP!Zp~$B> zTC_}tLjszmjt=YAQmK$hk>O^L6;RXAxw&zwROpN_2PaKvIqGo7R+PdDQu%E69G3PKg|dNlA$f(VqJ5Yj#|4B{Zgv^H zbT-X^SM2;fRZrvyEH`#u42&oHr|a*jDKX}jwFJD z5biv;6%>bxhAm5t5WilzN6O{Lz*eJ^$WJx95@50OMrDrwMhnvM!#oc{XI=+yJc(=R49qN}@YE-@M{*-rIE6k*v^OCjp;V zp#AFXkdxn^$u;qA<1dWwnEp4Pe7&4o6L_y4 zyf!sjh?E!%;}M|APRB!VXB7#ADU3ghvLE`joGag;>Ti?-1~Ht zfl#B^;wg&4l_j`$VnWwajKT|8w2c24$&A%2S!QzLOXdAC(T#+$l^tF(L-BZ zrnG=jEuWAFk13{FoJ@Aq@Dv44N6M$ggMT*xOx>L2kVptFPb~MsGZt3HItTzy2!_r| zEqcZ)DtrHfM<$|LXPTp;lywLqZM=I&fYn%iPF4+7k8m9jCW0D$9z+`(T;Hzd_9&=1UaI}X#_3$IcmwVN7Pc2>kX}=e~!ql zQboGb$=_s!6e1emU0y&cewDg{92-mwt*{@S)RFrj{^FYQX~)j&IMJu+HsO^WpSN zUdZKH?c$7&sw)7UknW&T4Yy_}A0R3&pzlZ7Y1lC)W0Xk?X1>S-k=DcA5D+m?YwOG` zOt*WEi;!Bs-{aM}-ENPLp^D!O1l@L_mXabcqZZBo#Uit6v3K|?8qSxSL%&(7su9T; z3cx;hKFZT{8Ws>Jrx2{1^6ThVp>db)@HV?-D(+sk_TUBf75G_SzX|9w6|Jw0l+(S6 zs@y^#j_6?UkQsTHom+2*^bKT)rRcN$mk^t^+*rU*z+>yh&0B05O4C#q}_U(r%gjnw@QVk);ruQU|C z17-w1cy!B`ar`r>piv7%2$yrifMh)Tu7(H(s4(*~t(J}-SnY%f$~jNZ)Le}@s72E8 zUmj@%faY`$^$qVkbmaSM3bAu;v6A-ade^-=&)>}HA>i{_R2TS?h1J&0Uu3le46<9` z|1To1KRf>q5t;FXSd{v7U?IeS9eVtcA9130%8A;lDwC%u>51N zmy+Wuk!NOvi=V!HSFlYhEbX)wLruL>257#cR>Mopx|JL|Rlvuv+?yQ%&6WxDQYpNi zG-d$>nKUk@!?vaSnzIQOuV$W#P2Bvw=$+vvl6hsohf9g2!W7GVz zDGTl1ho&+q?&S(7aX`MME!%}B9ZV}Jw(w5sR}$x8EwL5N-_9DL)yrab`S~!>%ypB> z^#9vIR;zakm{xD3j{N;tb<0P4koXEf{eY9Npz>AVNVrixuEy?XhVlC(dy8Wuo`;WD z%QM|M?bi{O*TDZD3^Itfx$x--)PFn3Dc74}UUjGoPbM3cbkynQViAZAUTOg-JGBta z%Qnk#3wtYZNi(~b>YK=^g+@EXbQsn4`zTBEZLDTIMRslevK;rmP~BFDfW`bO+9O?EO)+XM4OwA5|joIqwSv)s^BC^)qx7kN-6eV>e>)CrYefK*lWJFl3`Ju{~!L? z=(%)3wQP`ItwWG9>92%3wmlhIVjOr%MPVn|w+f%(AsD;0GoK{@px1?-@Vk_Jh<@WH zqre2LK|Y=uW*o2Pv@wG_s5~cX5&xFIF%o2@zf(;*S3)^VTc>>Ydz8RpyW-^l+S zKaQ)&b5}71%v;yp_{*zOBpDuU^Bow?zgo>Ca$kYhizRONd!>|>oZyic^Z4bJfmy=z_wtugFGajP{_pVPbiAbq zub?A6uSFU8L%03x$Uk!P&L(BfK?I=7$+-o;|0pzeiKjBK=|c!x32syP5dv(|2*|?U zXaq|KZ8#d)CmhC0fsiEe$rrle6u$!%I!-E&f0rL{CyDArl_g*^X8m)!`v{gAP)j$( zoBj8@*LuSBm@~*dlZ|lU<%Wi^pF1=y&AHTdmR=VWuMi-?l^9I+Nimk zD?UiFAL|TAn0L9_kF1-PhSnb$2TskZtJNustHIZ%Jk{noolO@!LQ$Q2-)ZP4yNCq*j+(FO_B)#fMyhKuZa)gG9@k|Bw4V44_W>6#s)%aeklnRnY zhSa9)p4sktVT1@0bglz(RTDmli2xyXib4kDAPN2?aq!g3{2WZe>Ylu2M( zki)2iiZo8w(%(gaq!pBQiZp-FH-nH%wRBxt!I>g!V~XCp%n*E$Yg_2un!(S@gls6R zC=}oq31H{tA<>2vlVMn2T9VnnL>}8VKAvP#YB*@mIE;x|)}r1+GJ=Vw`0ZKon-vRV zOiD0}mr0xZ3$P`lnpAQ?wqp|#W^GF@gQ#GdLHLuOGkW0V1;LHLLqu23ZwN3vOTgA7 zMH6;&;`W^TjcA;88=bxzlS_ql=ws`!kk1Cf z$6#fS;hBL|rrP`$nQX_Hlrws02PrZ(KU#qO+%y64I|!I#stX6NVr3lUByV@>Js>e2H@kAG#R1&ci z7nw(b02vMdBvu*E_48UrPF_gtC=Hng}?4 zMpJnvPEt)3Fb$4U3GdV>Hez>XrZP=NT6}pnxQ8Z}t8t_R&EjP1gto29fDMybpoM)o zwvh@BT)9+p91*aVWihWno}9445ieq(Kbs2Zk{_>S$ENO%F1aoN@IMOl30QZU{+j=z zqGOXmR897gymC()TYJN%*rmL?Icq@YXKP|Eg8UDTnghmp{l=uw6{B_b>d_N~y~&_B zj)vAWH?nG!}DlS%{@b5{AX4pA7e zN{JzZhHHw69KLgrPU$HKDU0X~I7C1cV0z?}L{#*k`PR{tUZsS0hOzj8(NZ^GTmfxZ zr)YAswd^<-GJ|T6i&HZue3fJ?^BI0oR5Wgg{MR=b_~kzn@-SY>(%z$=R*H!E=2s-E ze`A4r@I__GN$l8EHGlZ!l!!w}PiSWqRs&F31E5s1QkLU9K=e=4~76y{!x<&gh=4uXU+aM^M*5Wn=Brjlo_Bzz}hoLYDGk z-VGGJgnH4%wHMsF5Nsu9Q+e+W=Y;;+$Otex{i9 zvsReqw;(fT$4Vq(U`{NXXGKJo{j`aY1aWP(+v2)bU{X|SP6wlX_lp_Gr*u&$=Nxzr z)(mrIwSJ%@h(?KFa7#>5+Qp&0swScE=-Xb0u&^#CmNPC&ZV}4p$1_evQOPcyUsS@I zYhUw?A53pB7*X|8SIoL03k!~Hw8Ryb@#fq(tx})bU^1g&{rsxK3e$%+YwSrFS|g~t z)z2DztH4xnC=e039Z>o{2|)2+piaUq~kq2ZBhP?ZS;1PIc3K`lAgas_~{0=a%J`#+yl z!YmEKSyw(6`Ok_9h4=I9B6mblxQXJg43~LKd+7+9fE(gjk{p&)Q_5QEflejc%xAH6 zB^B~Wux18!>H}MfN}EVs>P0IklzQj~OIV$>smE0FQq=j7iA_9#VM*6x~k09LQB}RnlM63-gw1`5<=5YvK3;t zs3^6`vOFYr&nP|cBZ~S!+x=uPH0J~say3FV{K8?zQ?j3lO>Hp`t;|ZMWb3LW`J)ms z+0`wscz1nx6rKych8nd_Mnn!XeS{`^G{D`Tx{84C-NmT%k(~`S<(_g{Ln{~M)3)kh>` z=+r>pLn*kxj)L|}pI_In_s`X1{1julyftuCA9BI^Hp6N41VoHhGd00(FYPf!QWV~f zbiI9pAI5PlpSK54#?C}X&Lhil|0szbTJHh(k8i?XemzeN|He>I zzSV>dpY|Ak>+$RU{rD)K^Y8xi^*9yI2rEt(u9KEcCn4vqLMjmltjLQn94n5oF{?;qN@KW_D|$M>fJ) zLG2G5IC)Hu%r_9mESsC{0`K}G)%OD2Xn+=^v_SkIm#`Ypcwj>$M)y0X2(u{9;ThZ zwZp`>%9*9L21cK!vtQpY;YYp)&-#THpFtuMJ9{`vr_RE2`ZA;E!6t(xp6$#bf557P z1iBJy)=kQu%8l!XrGE`dA9VG3LJx}@2U^ow_E0>|TsNjl?zNApF^sL#Q0JFKr7l<} zDr=eTvq94&_YnR9-eY8=E+PU4_IM`{QyYW6L{ehyEIMhYr7t@%==B+Vd../../animations/voice_ttl_start.tgs ../../animations/chat/voice_to_video.tgs ../../animations/chat/video_to_voice.tgs + ../../animations/chat/sparkles_emoji.tgs + ../../animations/chat/white_flag_emoji.tgs ../../animations/palette.tgs ../../animations/sleep.tgs ../../animations/greeting.tgs diff --git a/Telegram/SourceFiles/boxes/compose_ai_box.cpp b/Telegram/SourceFiles/boxes/compose_ai_box.cpp index 6ff0025bb7..5909b1bca2 100644 --- a/Telegram/SourceFiles/boxes/compose_ai_box.cpp +++ b/Telegram/SourceFiles/boxes/compose_ai_box.cpp @@ -11,11 +11,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "boxes/premium_preview_box.h" #include "chat_helpers/compose/compose_show.h" -#include "chat_helpers/stickers_emoji_pack.h" +#include "chat_helpers/stickers_lottie.h" #include "core/ui_integration.h" +#include "data/data_document.h" #include "data/stickers/data_custom_emoji.h" #include "data/data_session.h" -#include "lang/lang_instance.h" #include "lang/lang_keys.h" #include "main/session/session_show.h" #include "main/main_app_config.h" @@ -38,7 +38,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/buttons.h" #include "ui/widgets/checkbox.h" #include "ui/widgets/labels.h" -#include "ui/emoji_config.h" #include "styles/style_basic.h" #include "styles/style_boxes.h" #include "styles/style_chat_helpers.h" @@ -72,20 +71,6 @@ enum class CardState { return result; } -[[nodiscard]] QString ToneTitle(const QString &key) { - if (key.isEmpty()) { - return QString(); - } - const auto value = Lang::GetNonDefaultValue( - QByteArray("cloud_lng_ai_compose_style_") + key.toUtf8()); - if (!value.isEmpty()) { - return value; - } - auto result = key; - result[0] = result[0].toTitleCase(); - return result; -} - [[nodiscard]] TextWithEntities HighlightDiff(TextWithEntities text) { return Ui::Text::Colorized( Ui::Text::Wrapped(std::move(text), EntityType::Underline), 1); @@ -217,40 +202,21 @@ enum class CardState { opacity); } -[[nodiscard]] std::optional ResolveStyleDescriptor( - not_null session, - QString id, - QString label, - const QString &emoji) { - const auto found = Ui::Emoji::Find(emoji); - if (!found) { - return std::nullopt; - } - auto result = Ui::LabeledEmojiTab{ - .id = std::move(id), - .label = std::move(label), - .emoji = found, +[[nodiscard]] Ui::LabeledEmojiTab ResolveStyleDescriptor( + const Main::AppConfig::AiComposeStyle &style) { + return { + .id = style.type, + .label = style.title, + .customEmojiData = Data::SerializeCustomEmojiId(style.emojiId), }; - const auto sticker = session->emojiStickersPack().stickerForEmoji(found); - if (sticker.document) { - result.customEmojiData = Data::SerializeCustomEmojiId(sticker.document); - } - return result; } [[nodiscard]] std::vector ResolveStyleDescriptors( - not_null session, const std::vector &styles) { auto result = std::vector(); result.reserve(styles.size()); for (const auto &style : styles) { - if (const auto descriptor = ResolveStyleDescriptor( - session, - style.key, - ToneTitle(style.key), - style.emoji)) { - result.push_back(*descriptor); - } + result.push_back(ResolveStyleDescriptor(style)); } return result; } @@ -258,41 +224,27 @@ enum class CardState { [[nodiscard]] std::vector ResolveTranslateStyleDescriptors( not_null session, const std::vector &styles) { + const auto neutral = ChatHelpers::GenerateLocalTgsSticker( + session, + u"chat/white_flag_emoji"_q); auto result = std::vector(); result.reserve(styles.size() + 1); - const auto neutralEmoji = QString::fromUtf8( - "\xF0\x9F\x8F\xB3\xEF\xB8\x8F"); - auto neutral = Ui::LabeledEmojiTab{ + result.push_back({ .id = QString(), .label = tr::lng_ai_compose_style_neutral(tr::now), - .emoji = Ui::Emoji::Find(neutralEmoji), - }; - if (neutral.emoji) { - const auto sticker = session->emojiStickersPack().stickerForEmoji( - neutral.emoji); - if (sticker.document) { - neutral.customEmojiData = Data::SerializeCustomEmojiId( - sticker.document); - } - } - result.push_back(std::move(neutral)); + .customEmojiData = Data::SerializeCustomEmojiId(neutral->id), + }); result.insert(end(result), begin(styles), end(styles)); return result; } -[[nodiscard]] std::optional ResolveLoadingTitleSparkle( +[[nodiscard]] TextWithEntities LoadingTitleSparkle( not_null session) { - const auto sparkleEmoji = QString::fromUtf8("\xE2\x9C\xA8"); - const auto found = Ui::Emoji::Find(sparkleEmoji); - if (!found) { - return std::nullopt; - } - const auto sticker = session->emojiStickersPack().stickerForEmoji(found); - if (!sticker.document) { - return std::nullopt; - } + const auto sparkles = ChatHelpers::GenerateLocalTgsSticker( + session, + u"chat/sparkles_emoji"_q); return tr::marked(u" "_q) - .append(Data::SingleCustomEmoji(sticker.document)); + .append(Data::SingleCustomEmoji(sparkles->id)); } class ComposeAiModeButton final : public Ui::RippleButton { @@ -915,7 +867,6 @@ ComposeAiContent::ComposeAiContent( , _detectedFrom(Platform::Language::Recognize(_original.text)) , _to(DefaultAiTranslateTo(_detectedFrom)) , _stylesData(ResolveStyleDescriptors( - _session, _session->appConfig().aiComposeStyles())) , _translateStylesData(ResolveTranslateStyleDescriptors(_session, _stylesData)) , _preview(Ui::CreateChild(this, _session, _original)) { @@ -1327,23 +1278,20 @@ void ComposeAiBox(not_null box, ComposeAiBoxArgs &&args) { content->setModeTabs(tabs); content->setStyleTabs(stylesWrap); - if (const auto sparkle = ResolveLoadingTitleSparkle(session)) { - const auto loading = box->lifetime().make_state< - rpl::variable>(); + const auto sparkle = LoadingTitleSparkle(session); + const auto loading = box->lifetime().make_state< + rpl::variable>(); - content->setLoadingChangedCallback([=](bool value) { - *loading = value; - }); + content->setLoadingChangedCallback([=](bool value) { + *loading = value; + }); - box->setTitle(rpl::combine( - loading->value(), - tr::lng_ai_compose_title(tr::marked) - ) | rpl::map([=](bool loading, TextWithEntities title) { - return loading ? title.append(*sparkle) : title; - }), Core::TextContext({ .session = session })); - } else { - box->setTitle(tr::lng_ai_compose_title()); - } + box->setTitle(rpl::combine( + loading->value(), + tr::lng_ai_compose_title(tr::marked) + ) | rpl::map([=](bool loading, TextWithEntities title) { + return loading ? title.append(sparkle) : title; + }), Core::TextContext({ .session = session })); auto premiumFlooded = std::make_shared(false); auto sendButton = std::make_shared>(); diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 849760d74b..2c8e5d70f6 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -6268,7 +6268,9 @@ bool HistoryWidget::fieldOrDisabledShown() const { } bool HistoryWidget::hasEnoughLinesForAi() const { - if (!_history || _voiceRecordBar->isActive()) { + if (!_history + || _voiceRecordBar->isActive() + || session().appConfig().aiComposeStyles().empty()) { return false; } const auto &style = _field->st().style; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 88ffa34c91..9a8d235674 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -3677,7 +3677,9 @@ bool ComposeControls::canSendAiComposeDirect() const { } bool ComposeControls::hasEnoughLinesForAi() const { - if (!_history || _recording.current()) { + if (!_history + || _recording.current() + || session().appConfig().aiComposeStyles().empty()) { return false; } const auto &style = _field->st().style; diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp index 2a92c61a17..8008b10f9b 100644 --- a/Telegram/SourceFiles/main/main_app_config.cpp +++ b/Telegram/SourceFiles/main/main_app_config.cpp @@ -21,20 +21,6 @@ namespace { constexpr auto kRefreshTimeout = 3600 * crl::time(1000); -[[nodiscard]] auto DefaultAiComposeStyles() --> std::vector { - const auto emoji = [](const char *value) { - return QString::fromUtf8(value); - }; - return { - { emoji("\xF0\x9F\xA4\x9D"), u"formal"_q }, - { emoji("\xF0\x9F\x8E\xAF"), u"short"_q }, - { emoji("\xF0\x9F\x8D\x96"), u"savage"_q }, - { emoji("\xF0\x9F\x95\xAF"), u"biblical"_q }, - { emoji("\xF0\x9F\x8D\xB7"), u"posh"_q }, - }; -} - } // namespace AppConfig::AppConfig(not_null account) : _account(account) { @@ -355,7 +341,7 @@ void AppConfig::refresh(bool force) { } updateIgnoredRestrictionReasons(std::move(was)); - _aiComposeStyles = {}; + _aiComposeStyles.reset(); _groupCallColorings = {}; DEBUG_LOG(("getAppConfig result handled.")); @@ -567,8 +553,8 @@ bool AppConfig::newRequirePremiumFree() const { } std::vector AppConfig::aiComposeStyles() const { - if (!_aiComposeStyles.empty()) { - return _aiComposeStyles; + if (_aiComposeStyles) { + return *_aiComposeStyles; } _aiComposeStyles = getValue(u"ai_compose_styles"_q, [&](const auto &value) { return value.match([&](const MTPDjsonArray &data) { @@ -576,27 +562,27 @@ std::vector AppConfig::aiComposeStyles() const { result.reserve(data.vvalue().v.size()); for (const auto &entry : data.vvalue().v) { if (entry.type() != mtpc_jsonArray) { - return DefaultAiComposeStyles(); + return std::vector(); } const auto &list = entry.c_jsonArray().vvalue().v; - if (list.size() < 2 + if (list.size() < 3 || (list[0].type() != mtpc_jsonString) - || (list[1].type() != mtpc_jsonString)) { - return DefaultAiComposeStyles(); + || (list[1].type() != mtpc_jsonString) + || (list[2].type() != mtpc_jsonString)) { + return std::vector(); } result.push_back({ - qs(list[0].c_jsonString().vvalue()), - qs(list[1].c_jsonString().vvalue()), + .type = qs(list[0].c_jsonString().vvalue()), + .emojiId = qs(list[1].c_jsonString().vvalue()).toULongLong(), + .title = qs(list[2].c_jsonString().vvalue()), }); } - return result.empty() - ? DefaultAiComposeStyles() - : result; + return result; }, [&](const auto &) { - return DefaultAiComposeStyles(); + return std::vector(); }); }); - return _aiComposeStyles; + return *_aiComposeStyles; } auto AppConfig::groupCallColorings() const -> std::vector { diff --git a/Telegram/SourceFiles/main/main_app_config.h b/Telegram/SourceFiles/main/main_app_config.h index 5d2353dd45..b7adb2e291 100644 --- a/Telegram/SourceFiles/main/main_app_config.h +++ b/Telegram/SourceFiles/main/main_app_config.h @@ -139,8 +139,9 @@ public: [[nodiscard]] std::vector stakeDiceNanoTonSuggested() const; struct AiComposeStyle { - QString emoji; - QString key; + QString type; + DocumentId emojiId = 0; + QString title; }; [[nodiscard]] std::vector aiComposeStyles() const; @@ -199,7 +200,7 @@ private: std::vector _startRefPrefixes; - mutable std::vector _aiComposeStyles; + mutable std::optional> _aiComposeStyles; mutable std::vector _groupCallColorings; crl::time _lastFrozenRefresh = 0;