From 013d15d7ff33495e587f5a4db9a6ed0aed3e3e68 Mon Sep 17 00:00:00 2001 From: Alessandro Autiero Date: Fri, 30 Dec 2022 03:03:59 +0100 Subject: [PATCH] Latest version --- assets/images/auties.png | Bin 6923 -> 0 bytes assets/images/tutorial_else_1.png | Bin 0 -> 5153 bytes assets/images/tutorial_else_2.png | Bin 0 -> 2388 bytes assets/images/tutorial_else_3.png | Bin 0 -> 3037 bytes assets/images/tutorial_else_4.png | Bin 0 -> 2741 bytes assets/images/tutorial_else_5.png | Bin 0 -> 3080 bytes assets/images/tutorial_else_6.png | Bin 0 -> 1595 bytes assets/images/tutorial_else_7.png | Bin 0 -> 1034 bytes assets/images/tutorial_else_8.png | Bin 0 -> 35726 bytes assets/images/tutorial_own_1.png | Bin 0 -> 5153 bytes assets/images/tutorial_own_10.png | Bin 0 -> 1595 bytes assets/images/tutorial_own_11.png | Bin 0 -> 1034 bytes assets/images/tutorial_own_12.png | Bin 0 -> 35726 bytes assets/images/tutorial_own_2.png | Bin 0 -> 2388 bytes assets/images/tutorial_own_3.png | Bin 0 -> 3037 bytes assets/images/tutorial_own_4.png | Bin 0 -> 2741 bytes assets/images/tutorial_own_5.png | Bin 0 -> 3080 bytes assets/images/tutorial_own_6.png | Bin 0 -> 1909 bytes assets/images/tutorial_own_7.png | Bin 0 -> 1034 bytes assets/images/tutorial_own_8.png | Bin 0 -> 2270 bytes assets/images/tutorial_own_9.png | Bin 0 -> 9108 bytes lib/cli.dart | 6 +- lib/main.dart | 10 +- lib/src/controller/game_controller.dart | 24 +- lib/src/controller/settings_controller.dart | 13 +- lib/src/dialog/dialog.dart | 2 +- lib/src/dialog/server_dialogs.dart | 4 +- lib/src/embedded/server.dart | 2 +- lib/src/model/game_instance.dart | 15 ++ lib/src/model/tutorial_page.dart | 5 + lib/src/page/home_page.dart | 164 +++++++----- lib/src/page/info_page.dart | 159 +++++++++-- lib/src/page/launcher_page.dart | 7 +- lib/src/page/settings_page.dart | 38 ++- lib/src/util/future.dart | 9 - lib/src/widget/home/game_type_selector.dart | 5 +- lib/src/widget/home/launch_button.dart | 252 ++++++++++++------ lib/src/widget/home/version_selector.dart | 4 +- lib/src/widget/shared/file_selector.dart | 2 +- pubspec.yaml | 7 +- .../flutter/generated_plugin_registrant.cc | 3 - windows/flutter/generated_plugins.cmake | 1 - windows/runner/main.cpp | 31 ++- 43 files changed, 519 insertions(+), 244 deletions(-) delete mode 100644 assets/images/auties.png create mode 100644 assets/images/tutorial_else_1.png create mode 100644 assets/images/tutorial_else_2.png create mode 100644 assets/images/tutorial_else_3.png create mode 100644 assets/images/tutorial_else_4.png create mode 100644 assets/images/tutorial_else_5.png create mode 100644 assets/images/tutorial_else_6.png create mode 100644 assets/images/tutorial_else_7.png create mode 100644 assets/images/tutorial_else_8.png create mode 100644 assets/images/tutorial_own_1.png create mode 100644 assets/images/tutorial_own_10.png create mode 100644 assets/images/tutorial_own_11.png create mode 100644 assets/images/tutorial_own_12.png create mode 100644 assets/images/tutorial_own_2.png create mode 100644 assets/images/tutorial_own_3.png create mode 100644 assets/images/tutorial_own_4.png create mode 100644 assets/images/tutorial_own_5.png create mode 100644 assets/images/tutorial_own_6.png create mode 100644 assets/images/tutorial_own_7.png create mode 100644 assets/images/tutorial_own_8.png create mode 100644 assets/images/tutorial_own_9.png create mode 100644 lib/src/model/game_instance.dart create mode 100644 lib/src/model/tutorial_page.dart delete mode 100644 lib/src/util/future.dart diff --git a/assets/images/auties.png b/assets/images/auties.png deleted file mode 100644 index b5fbf159de42d79c5604fec2e2a2cb699fdaee74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6923 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

DtbocRFcs4FdEnxxHrRSebZ1be2Q<+X-`Zo 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 literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_else_3.png b/assets/images/tutorial_else_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8d8e889435b6151fa7b6c77049bb2fd0d5d2f7 GIT binary patch literal 3037 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 literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_else_4.png b/assets/images/tutorial_else_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b025c32b4ad1abc58dc1beb716c6c75b1de1da5f GIT binary patch literal 2741 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 F{{`tq7!d#f literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_else_6.png b/assets/images/tutorial_else_6.png new file mode 100644 index 0000000000000000000000000000000000000000..cc315692698870a5248a3921c98a73c114d3cae0 GIT binary patch literal 1595 zcma)6X)qgT82(&!w2IZOHiWJo*j_BFCY3EkHMXI;7IiN>&Y~Gtl6AMH!Zc}jr_`-l zl$5MeDT(Nm3e`%m8bxR+62zIfDzcy5Kl`uy9@O^e38A4FVvDr}ppLS8>lY|W z6ZiP^nnRu{a;}%Cx63p&6~D3c!aPxwWoepi;K?ytmfP1X3;tLu%JtDX!7vZezC9pX zoWpQBJ3ABQ0m$MOl*oZpd6ifIj5BSNL2CLJVS^M~M$tz*wY9Yoo^b~UJrM>5oZ|qL zsv>38vaYVK*tL0ntaMYtQ~Ee+$etY z&uF%v^>`fBibSIg_$vcI_4P>8$Dz^amVlAT#gA=a;o&pWKAZD=Mt{MX=)T6t;cE7( zXqXzRp|$Qv)~lKtoEU1mrO{vhV{UZ>0DtDkp~siUUu8GMO!qLI!q{Y_P}pBdxL55- z(WE)tj2>#JA|?sA55#lt>r2f1TRA4EouIrleOF`xp7gj@fg!P%POvE(10}Cif1Azh z{_r7Sh)IZH!9i2|pZ;(JQTfSi=xGS2SUfX8WquB^v$KN{TnLg0`xgC_Dua1V1@I!A z{=|lIH|K!&`{%fz{QLJi8Ryzn3FxO^aq4Ov0|Kp&1#@BNGjfs)#Dgho^S-F$E&M2E z0O=jresroYDE4SOi76JD*0SFK#cxeX@sk5DX8yvJ%HEc|Y}qTW58+H9Vc)g8 z5xA;{BXd@;-4CfYl)UBVD^73jQpn^fUjPD{a?s;&)D|IE51#_Srd|=2yU)H<0od50 z@@*GHBCJ#@t*WdvT7Znq&MPT#F*i34i;6n6a3ZSL#-ASL>&1wV+*}oTOW<@s5lLab zx%^zpc45MB#M$xhOieEr6?1xevLKN?%R&XA!qAz}S?30IF^k0#OFyqMVen=xEHaW$ zYD|lo(gPsBH_V%ny~B%t)A&zD|AFpDxD@2soMT2tI@W=wN19@c_)J1QF=_JkJtZEj z>sf>~_b`jy(a|?R_2?G}LM53z<-K~H3+t`jxu-pN3uCP%3C#)HTN~o_r3sits;uII z0@|>Ny!=i;=1un$bwkz~57+uKlAV*b-sYKyRFm#he2)+;-DvN0s+@7X?~YURqr7Uj zx^yymU0FllO?J7}kJ181U741aHpbcuK+ep@%Cr#DFGch^b4A<8`4NdkV)hqaP)Ne# zt*}_^gtmo@FNq|$7ZuV ztb6Pprfn}zb~hv}j558NiT33ZoLJDC_%#6ANG+k+>y|#8K0;l*p3OE%C`_hjY1}xq zYBH#MCd!SI-9jr`zhex*lbfOZd*l`F`W|8-o=&c6pLm(E8_5sGjj@sjstB{Zj%!3C z!^NOuXjX@>4*=`5nS%!p=5c5#+AI9}`g#J~hOtx{jn*7D5t!Aq!;M2w9;L?ekl<>D zJMhpyu+Ne^JuM^N(18R{MMcgwrs>l?ed>d;P#b`sSurnOos3jKCrh?RMttHp9mU1P zOz14u5P|YS<)en0wIfqpU2Ev{Gm^EnY`FD2(+@=C<>gh$xBP@ug34IrT-Sll|L-#V e(zXnIBtAz9+T)ZkVsR9T2VfkW?Q72mr2h>hP2L&+ literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_else_7.png b/assets/images/tutorial_else_7.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff494fd94a192b623e2b508bec8b24fae9f4ccc GIT binary patch literal 1034 zcmeAS@N?(olHy`uVBq!ia0y~yV0r{(TX3)e$sIT6#sewF;vjb?hIQv;UIIBR>5jgR z3=A9lx&I`x0{NT;9+AZi419+{nDKc2iWCM0=J}p3jv*CsZ|~T8sdzIS_&Dpix|P-n zj%93oatdfJvdtpQLG7*)HW*mcM&9 z#iq_aW7(?R>32T(=Z8+$n(Czsw9@yh|1TB>hFKmR%nS}}PBIJ(Mgl-bPiPciXK3JQ zv0z|GQ8>cLpunui$G{-TQOLk>!hwL&=AflPE0=!cep+O?W$V_Zk_-$V0?W(G7e=jJ zcJp-{@5g`t{uR{M%V%v3mzHH-J>~c-`GR?cl+K^_O>CxO!Do zPEPI;PlJ78e!hN5Sy|iNyLU^})&s4+aQpV}+<&$V|HD7pKDvJWdgixD>d0Z>kXAU; zBW9OSzs0)f$VkrY?Ci{M8gcP4F*?US78e(9-m(7Q-}v|QXU(eGCDvc@zWDt5qt%QV za*BKtF5bBlbK~AUzQ>OrA1$n`yeV+{y`-F+p55c}>C>hidhsITMdANk1nYdsqqTi5v?*3X|mKl;NoJv}}1%ZeDi<$?@nfzfT$mAz;2FQJJN zkL!bMPci@qcl%!-f2?+D$3vqyX-P@V zYc2I5G1YR{8?Wz|@0a+_P{Y5}YiW@8W2Zm)XKvrVZNkjJuy57gy?@XCwVH=J-CYoP zwDnf^^cBDa9seaR+Pvk*)vKW&XNfW}Jb0ZHe0*D-_u=Xzi~IWeF5JB<3pC#fXlzYL zjgXx3pJ&h1=4O7$0-DWGKmF`1l9K*~62(6(k`tMfGiql86C?wJr>mdKI;Vst03nsF A*8l(j literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_else_8.png b/assets/images/tutorial_else_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0e96942fc735f04c7b2193de32c4a932c001178b GIT binary patch literal 35726 zcmV)gK%~EkP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>Diz7)yK~#8N?Y#$} zY)5q^TKC?U_4J;krEuoxI@;K4q5R!YH;g68ToX5x%7Gt;zDiYX<{#rL+BVmeIoJrbAuLH-7mLTa_Ijv1mRODPqSb#bb>8WXD<3s;KXm9Ib&2Zs~QD;bF~o zr*#DV@$Uj>#nfh3$d7r^ z$jla`48ICF5UA5n8Jek0)N+gtg`1v_^fBXced~#U5c58c1tK z97%k9_<=?(|1@vttm0nWvY$lWp#7dYfd zCohC8el`fX!3RXF$s!LEmqlBw`%>z_K_L+?#F7WiR98e>4XNvNpY6;xbR3(B(cYG- z*$JM&p3XQL!}0_ZAEg8=F4=6bsGj;l89>^|)glw%)EOtP-%grwm0GMuT26;36H+kM5kiw}V?tdev;@37 z4Kt|7tEg@cT7R7+DbKJv7UFOws-21{VGX$kmlb9EZQO%c#^zg_TGBFXA9Od8b)QRG zUXGbJ{?Z>xb2N|b(n-d)&Z6$XC#8c800}m*0LhMni<_Bk1B|$0vrBbUW>nja$y(@4 zB>|^6h5cc$yxP7Pgkp#3u61zxSq=P^Ky=qya~# zB_)&73B%~}B2;dPRw22rMn~mI+O1*8v6R!Gp4m_fLEL)XHhDxBY^Rk+KHr(qn_wTe zrIvkkmZ@gfVmQ`pgwa*63wnj)NxP)5(^X2+XJ=7aS-I+go_y?PwP~U7F%vD>`rtgX zC6>VXj7-(ip|(d#jr^AV*#Oc8rY2Y=HvkyZ4BfPL)f(gib!s*nu*4VJ>Pt)%ok7wm z3R5snXup+|S!1@!ZwG9!)7N%G^X)wiA>H@-2TPLj>D?6rk zrz6dJ+oB+^7hoQX))IW+dE2(7!il0Q7Rqupi2 zQkSx44p3*SOI~Dq1CR9SHr?KTWX_BcEtq2WKcYvB7S>!|{~FwI@&8dP2VddX6$Ve@ zIzXF{Tx$S$S;!w;<2xHTPR0zauPLkf$R3{CkXm4w1F5g1a@JD^kwJ#F)ktV#KWeoi zt75@U)G7%3r&_J)nNW+iaR7!?Ytx6qx7|fUE!IUtn{H^+_XGwm$5!c)Ts1~@VM|*B z+*2mqJ$L@z*n`kT$dZ=}{*cH{Y3!PY@Cc&1GO6QfK*AZUMgv8zxy?);DXFN1YINqZ zkY?GKWquUeSQVASP^;-#6~QH=*64C@04mk|KF?T7r&%?}Ym?Bo-9?&Bk{{6!6h7I< zOMOpp00yQlKX}2`J9!R8Sx<BgLUtPB>Bx{cp(ey0kke7 z9mWPK0XghNz+9CISK(C`DP>PZEmZQ6LT%X@X;!ikXx4JuX1z_faZjPPET!Ka zDrI~uqPCsO&84E&rtuMlE>zAB>2aopwpDWG=YHjnVKS1j7>>B$2hEU zOSq@jvY`Jc5?Yh`YsZY<)b@nVs{O0*=s^$Q9zTw5A9U`Hp(|pIOtRwN&c|UIEZebb zwt&HA8XSM_v(*yZ@TvExm19;*2967puR^*IGnGBiw1L?T@J{e-K@9tsa4pEf4W|xE zD{1pW%pfw&ZQUF=CJE-jNR~6~l}E}4#IYE|;>2X8Ndj3gBZt5!=|m#m0n@{wd0n(N zWFo0Xn$=kdjhfD*Sr>IyW#>dG-?r2(*yFGTVVPabQ`XyKanjq;}jF?O(0?u`&BTaF;5~EqI<0+HD{4|yM14y$t__UB_Lare&k4dwf zUG+WHqS+*jm9n;$!pT5e^(aiuweI4hf!ccXu@e(l7=WUU;mwzs6~>cPiY&a0D4RCU z)yWFP@<59)?C1+^rS{q^RY0dx{ltENnJpV6k(^Kvuipr znI7QnO`7G@wP=H7NP4|Z&$79^zGqAQRHMo`#X6)e ziN39V(xM~TU1s|B6KOU9YwNvK(k!vQk`qu+i_{oV3r<2s;r5`OS?&^K86OSIW^3TN zTySkRHl8>fNUpI^XvXat8=w=@rZTshFDTPWMzBCLZaBr+b52?dh3PJq>0GF;T5g(< zL@k&Ch@P>?^Vp#lGqTjoE#VV9Cq$zOn&s=$N3BD3YoLrGzeZcGv||La*dW&0e`H9r zWoKY(vbUnX43KB7+@mU#FyVNL3TO4yph|%@hbp)Pfno zacZTAg8~E)SMpRrtmtw}woSF%Uh<-PNzErls6YwzwvC)3OtqBGbBXnKhA?a9JDb^l zGP;S9jHyzSK5ue1o1{fg1*=*m&0^c04YUT9fR^@jQGVN1T2@$_CHv5JjAs1-T!_?K z9;A1YRzv1ZE+-o8)2u<#W!_{hKZYYjh!Z7M8K=}lY(|}w=U_1|GKcb`sdEun7gL~u z&yO*(^7ZsFf{!taH~@|5^5WzGXDKX^#WN?PtVOcp}6qUQdv`M`R&Z>3`bcLO&PO5<}8&C{)wF$5fMZUGgM0`r1Zi6)A zZMDWhhB=e43n^!Ifkv8~H24s)4!*s(UKMIv40CI&iXE&itIpztiH#IcS?VZt;y^|z zvfMUus>~zt@FZ2{;-q>>m-SCEK_1Isxg5)bT+7EI%V6t>NaELegpG5 zC21BJ^>T_i>7W;`vxu4>+heM%S*@_VNUa}hf{!eC>9!t9nk8oIW^6-OY%=iTQ5Kv# z@lviVw7wqgYK`A6 zsI8l4wnLK0C|rf)H}!s0k4O}&Q9%)Ee1*N+Eg(^zcPCbnx}zy7S3teWbUU*L%hBYf zBaT%|aQ_Y8P%FpWX-|31TX-}oxapWQ;9z&%bMtlLw4&Il9s4*7^&E?y@Pwe&Dh>88 z!)2IB`$!OtR&WM(Y6TLDGe)!uBV`aW2d)!}m>|oj<|Ik2&YUTbRqk%7GujaxvVNV% zn}TSgN}82g9kQ<*xfRhr=N@e~)~`S{g=Y!k_CKSV$m?Xyb~G15h0)Z#SrsEHQUS{7 zZlWENBp3U3saWRbGBgLAuhYD_u`@sR#^0~5$CIA(Qc6#uZ+_03Y4+RB0GQT ztRplGMFaiqxr`;OS7Rr#(A>3ADU7BLbPp0m%|;yP%V|{Mo+qIZ_h=1v)?)N#6bZ@g zZ`-5Hp7=N#1}xU6JmIK=!jXsWAJ(m19roF<7jd1IdxedAuM7Y2KfgWP_rMm-PMBot z`p@m<0WT-b8i;CPWZCLu8l$Ngx_=T;g0-9|u~A&(I47A|MoUf?C`%rXDtgbINlq?c zf(<(1+~=qzxb~C(o6GVFbLK~W>i3G(5clNodKs67Z+`k?Y7tx;$s|i288W{TH$=TH zp#|OPEzyojDb!Q9_25aM8fLK)FOrL4CW|MtDHgQ|)ryQ}F2M~p)wl-|id`htduz6$ zUVV`}?Wdl0e0ajq2Zv4j?H%^tcki&@#`R&x&Rt>imTlq2Tkj5Ex$?&Fxi4QGcI}$i zdhOV-_u6po=_iDMXPmBn6L0zRcZY9Xe|y$0 z@X{Ba7Y;jkzc4p98&=HCg%vAi$)-|${JXB<@80>*aQ#hpsV7*wW>t9Mv(5^nXd`=n!W!!37*E9h8!7RO@ueBLHIeZSMFa7lT7^6G;PiDli)uU3jkW|3FT=>lc7 zH?b@zPMt>{ZiCte9Kdh)%qw31JJnS_^}AoLmf*@u(|}VR=*(3oTS#=osK=V<2(@Ey zrRKUYrdntP#a`_iL;!K?Ik`%n6N(xRL-Pb}pDTIz6ue@8(X-DCCmweg``^6w*6^<% zzbrhk`C;}4AzwuYQDzjf{_cyy72mv3l_t(R^Mvr@ zFMBq3%w52T-5ftUZ;%dZaq>;0b&-}hZ-hgZD# z0*yBD*Z=r$;gTvo#9_T z`o-|Ui!Kj4cF=ZK&VNX=v$Nra&padi&2qIH3{i2sU$T=xjW~LfLa8a|~5+i5Rve5t`mL;CRgLURVsC^Gbi$ zLrK1q4W;?c7W(h?c-!UJ#D2=9M+EF4%uq`(W)Lx-NTFGc5^S=T%Zw@3aukHl)Fnd_ zkm=hHsONOB0S;)Axnfpf>3#4y2OY36{N|fp8lLyG)A(&85H_@f_TNXd>flu~s+Isn z_6B~j{3l=e-0;KSd%>W=1~`CTasR^WUL4Lm`B-g9Ni*=-=bsXO=Et7jJJ$`ykL8{nV= z_ThnU(UaPm1Z!5W3NL@r`QcA~?NxkSu^t(rA- z&TC)t%&GGJ%W%hur>J{c4#8}VL9n3N$rSPG)wgBt1PE1p4ab&By{JdoGu_Nl+J!SbktRO{a$Or@y8q@e-&E* z8e+&vtJ}RUw%!bNR;^kQe(?EE6>SP&u)*7XzV(;9;JmP6#T?s{;swt0i44d zH>|5}yWzpjTRE@q3TOX)H_$On=MCx{OasUyKtAdjxh*{Dro_G**N6Y>$6mlk%+_fo zU3KAerD?&(;#p^9+e!~64vpBPVd7XK%~Fm|a3r5Y3`rG5Y@x(Nvt%||Lz2_Pj1HEN zPbn6uNRrRigcQtZi=Ub_i`&)5HuS{{NP613ysB3+-Dg zPv-T-%?e$3K(BCWcc6J3xM@RtF4=RW@9oGExEjF*%DI%I_yU&W{5AAOew_Rnk)(|%!+qZNK=$@I*8=6 ziv+-jCgpNs;`UQQZ>m8P(_3mZT7dRBjvTy1x$Jko5(n5nX;PVTg`&q8*1^ZwPdQ9c zv7VAsP(u^LsxoPomTA7mI%ufH+8B{J-H25&A}fG9y>Md#@YFMo=dum&`oO2d zpZ(Vls8`2nPdbXv5nKgy0o#r|+_ANLzWt6le8z$EfX_R6LV$;00I2{uHQ=fXw^&%ojUd;Ydj_uBQWxi(6f$O&TK;4<_48 z$w?8R)H5PasTq^QYPv=|9V*f=OjC(F>5>V#=g>&^0`BXHfdmcXLwkHCgAcK>c*&gM z^W%e`xSYKj5W`!u+y?n*XWtFDMOWHk==PW!p~8msYsF{*Zs)!2&ile=F1t#VIyUXI zHEshlLe%_11Ugg#j1mBVM3Av}L=hP2jDnRV(MR zf#Q$@_tj{Qu7MSG;&T9P^_*Z|`s#JzxBv2=!q#m&RA~Zl)g5)%{@m8a^)hI;0e7L@ za>u=V$6Xh2qXn&^66=^4tz2fv7Lk)_I`=Yc>;u>eZci0nE?X!y&jdx>kLnxX8fnx%opd?}NSm@&m;43oy_ zA!SC*;XGNe7EJbyre$!dnq__)2V>$2%LwVCW2amSxmSTta7i-k3_47@U%p z96`>?p3hqDx&I+9`)0&bzkxr`HU z=dN9<)`2$Ve3$1I-ukQI+8ggss|g-(c+yj|=lsM?4-akG8b0>vuc}f9zH5Wc=sOm7 z-}fLd^MMEZkA;WsA_WX_l0}F{Q218gSB$0-m-*Gtvv!`qfQ&6_a$K8-Qp9B%exJ0cgz3)(JTr z(74i!m=8u-Ch-(0m{U;;c{b1)?1A;LeA%E(A~8o*_30eUg?!SK5_uI_6*8ZE{9)ne zf8s^_HV8T=5H_@vPB@$sF_2(TDsc*FHlRHD_`}1Sf8u+>VF$T($cFZ0v}4eHAZsdk zVDnbB>ez=nuNl5d=mO4z{pgi--)+@9cg^!Tv}MaSRq8l!|Bb!N+(`qMoR2i%?A)zt z9r!$q&vBYy;|r8EbPYI%@)Zs(5A7(sAh&pjaMP{#s8Yuhk3E#;{Wm}0OS8yZ*)tHg ztyZolr6x73WZ z=i)%(Q`v`}29MlM^-S}z6gMsDLa#g8L=FgG?#aj;b1^kS301L)&Nh|<=xbwtYfkEb zfx4>j!3Jrj9lD=Vf&;lP|DN;ts=(hEVE!v82Hbk*{d~)7323+8aUU&iM%p3Y=b8V* zFTQ|tuxb%xvqsYc4|TskV-IF%;0JEKv;A#4051-J`+KfjE;#E% zzWZ-A4VZWvu?_s?*|uj;|7y1&oj}pzb7&}Z!9B|#x_ZcCMx#|=*44yGQEQ{d2C5<; z>zJW6w*ciK)f0#V4&M}@gwILtL?%g1JehRxz+`qxby_W6#z@m;F||#xt&ZdXF~&jF zJZTnVpv)LvHp*-`viif%>|sEA8ENLJfi#&S>_m~wO|qFLd|q=nUCp!so!fqtgSVdU zr>hWjg18$CgbfWuJ4YPS-Hv?0k(Np;V(Y>n<2D-5x`6MDyy2DK6+ZNd%fpYo`LDxk zf9Y?+8~)RO;SaBW`49hR_^rSEr|_qL|ABDx?f3Q$IJnUPSNQ<0bh@yK+FH4)XTagB z8aYRIawppk{t_jh%Zq%a(gwVRcz?^4#^DEV;?mB^KHv+gcxK_30J?yEi~$j!&vfB{ zO&h`+f9wU}10VfTc=;RuH2lb${v!Oue|%f`ncw*P@Qc6qKf-VR*}K9Y|G)3!V^Kpq z?u_KIl?Bzwiz252if1W(`7Ic-Z#^3M)dsp-MRXDlMYUc-FyL${LXDiNR2Aj_aEQ3F z;j0@RbZiM)5c7e89x_-&BE#p1ZaHOL(X?Jhi3!DM>R5HsFmVi44){#YZ^jKVNA1Cw z^2A*du*{4!bCk}zLN{gLHXO@%4b&d;{^^6C4ZrvYZx6rl`$E{zI6M$3l`LLY(Y}85 zE#cmt+luiMHNXE$Kg@6KVW7YV^yoy+rk&WdL92}n7rlF4nN4WT}2qsR^JuQ z?%neC95Cn#NA0#71^^q>Yrvgt_?@+(Coq49i1P56RUZ!Av@v|;8#nOp#B~8*3jL#B z|FLk&iAV7j-sUY^!`=684maI)Pq^}$Tf^tSat(iOjTl$rs z`u_0CZ}?umtBTvhgvPkR8UA3t3%howj<&vVqd48ekO*laP%## z61a123k{t2J|H(rl)x2>uZv^a1$>rTTd@Y4iC-l^1TR->G@F&0iDkf~)aDWewxt)LgOlv#u`oL#6hZz^HzL?>o zmwq+earXmUrw^ynE9>9;#aHm#YTm{hzrQ?5(vn;0`sPUjwc-aQ*>( zzg&&qF|(7j?JYI@L=IBAuK3W|4+RD&?3f`}I2dqnEIxSAWqcd@5S)I}(c!JX`YQg- zy1n;W%f~>Dr~noZ1QHORHFgPl?8IbB0Ye<|0nx-(u;esJQ6F=SWV#{6*+Lv-WpZ#E zpth4Y8ifhDRN&k+_Mnl1-nBrb8Eaj#bIKJCozb2c3=qeOp3$m#jb_&Q=K}_)gNY4d z#JG%#o$9!DRr5I#FPBfYUpJn_wxATEtCJz>4whEP74)186kd+gCBn|XNSgI98?eAi zGuPa32md^O34HhEnj7yxGyL;4Z+h(u_zJ@S`%SNXVL0LFL#UmZaP zx`4r}Hi&xQF9Zz!hKWA3UE$bWV)wON;Q&V*LRWVR-K(v@6%LU8N}(M*AX54^Iu^hG zH~-vvl~n@A;u%jpDg42Id}X}(0853g2S)tD(4!x+=zG}fg^c{yB~Gk}hhKu@}9P7|#< z6$imTJCv_``Lp>|YKc>ycx2dX-D+<86)!rEU&-V108ePI_@48qoj|#(xK4>Po_uup z$sc|W=U{nhf-kg=1OGGgyMO(EssmRW@RKpW{D$x2&s(S&c}3p=e^t{v;LzaJcV&RP z=L~%Vj@>rBnmYEjTcYi=oBJMUA9#;AR0ka1cVf1|?mnE;fu{>HILWcO{jU4Num90I z`7@oNz-{Dsi;Zs(aVy4_G|e-f%qL1A26Xu5B%i>N)Q7_{B?nn^I%I~AXo*?StGE!cS(g$i<|M4$Qmh$9X0;LTnHJ8@lu}2)h zzm8nPgIl(S2OrwTKVIptY)T-84rVjuqD~EG(x7wf5eLe0;|l0H^CTK#=y3n!?>`X! z-*58lkxWbYB z&~=5gN%oieUBC+i zMqAhxX;j*@_N7n->xhEI(uWJ*ayiUCJ5V_;dIW1NF@@OLCaEzX zx7x7*zW3|_5|w;~gAQ7V!AHrN4kW}5xFB95iY*u~Qg^`NpAc?2W|nl|TWkw0 zf;Ir5zAFZRo4}JZ-{=I2Nhe7;MC2RAa2ksteCG12!>`gS?2A78bv|Z&IRC5@!iM$h z^!p#}z;}6c5iBb6-z)vlCEq>PfgO5<({)R<{mnt!U1|UZc?=}jW867* zz&^w28w>#qIM_LIGzeN;{P`=xn|}Kr!oOc~#h_zx;n^q3&lR~5cS?O*t=xGtb$#jhRUv!E{E z3yTa|aNiwmTet5B_uk*$@dNn%HrWyy%zA!zjekmqw!7`~8vt$KUsdK1cHL*u?9KTe#P+TND1}BVXXZ%I^D#Ash?; z%M|G7c|CPqxyWoC1XzKqHqCIFh=&~UEocLWPui>*F0`PesPMPDV2afE%q;t^WMi+Nnj9t=$D#8OT^-gerLHK3z9 z>tuPm?OnJ7t#StzG~9s(oOSZCt)F4oG4)J*Zj~k`QJlv1HkY8!YlauHuwPg z4}bYb!drj!NBMvG|KM-_x%cywefQam28iw}5?s~bR%T3nS2*}#&U^0f{!Yq%_`y&; z0BxVk81A~~K~C+u!oh#h{K>DsI=toQ^1pm9fh$Joh;-pCz^?)zqwl9^@PZKg4u7Eb zN5A%}@TdRj)#1;7<2B(ge)F~AFW>Ux;jez{$HQO$_D}HJoWJ>J@9ur;a^IGH!E3AQ zYyt&7j|sJCNoOhxcVaZ^Ow&jK z={1Fz=nBWKZiG0|{MAQ4Wq^`8IpY8pW0gUK^V}e!%a%N~DaJXbt5)VGO*>E4#g-WC zVj!|Oc8U3z$Vk4$R3{%ZAIF?02ntxyQ$uRINX1>;8zp?47U4jXdiHJ_nmdphjx4>HWYH>K+8UL;J5jxGsR~sUBDM;v3~w1j%wJx zb2s0<{;AJjsY)I4%Mz2pwubwE*m&3mk`c!QE&L#3A<+wm<9>4Cl2vifup%{>P*J@^ z)J<)tPtP3XGQo9ke!!uwFxqy7W2w@SHYuHbB)6edEgv9|FLl!3V7k{*yV15bsm$BN zt1*p1bEUU^DdeqEjqIqKFIw7m><@S@mnRVs*OVAHz+z7g^QAVZP}eCFqr0vyKrzX3 z(8>SXC%;T}7Q?H5@ag>BmlDuk{XmqU&PaA(iJj~l~1lm&FZiw zc4HvQVxl33HCJYJc^fRIS2-LLU1-~ye5qH-!T!^kP5jUpV09!>bhgYOvhM{JrCzEF z_QCRGUFwt1QZ$4*@Ex3o=#~AEhi(dI=v!+w;4ZhLCHEVm{*N1a?yTV zfGwS&kby@GKQUrV>5$}s6WVVjwUe=uGibv42s8MAvXts5vzCKBs2o(f!kMRzmpbi8 z_;`OF*@@Nx)`?Evy@lpUZKh72O0_wkm*;h~AvU*VF=8yOzK@lfmT|dRse=uCUs~O$ z(N;U39!fEyj=keztZ+;;0EN|qr&$7(nJRfelQ`PUNi#=Fo{$cA(G>%JnHXQp^t|q- zJHr>RxQ<`3KjEl@x>}%I?*@l+v6Hm=TV(wAk5SCPU zY3A4qUYkPES`0t*lW$U6@THG_P%Xf9m<8H4jCGpHPNPy2)l0q_veQx$+g+L~+2RtW z)etS_m<^MQR41;3&MZ%Clu?OwfY=Uu1Ts=MwGa3lS2&2m^JcIGZAV4X6ZY_nwEY3` zc^94uw@L9EX-mbg{n0z<#fQ92$7fSK zrO1#+JkPjP4Nsaz45gbT8_1u324@m-k1Dw1S5jj~t``AR6qje;nu84$`>)K2)+g0jgayrdZ4CF~;niGk1iOPih4$>@D?BWFQ z)v%2qp6qR%wugPjf@8(U%T0O9$@Hs#)pfUr%>%#W*#=y#-AGqb0Dj*8Q=k6^+cm6P zySj6*!Bv{Q#bn*k2S0upm($?=ANvyT7a(4lRDf^yf8Xog8h+sQe-vKw(|;2F_Xp(; zz&6O+YD?=TvET4Jc!n#lzNPmT^gi5q&x87zkQ`ymWfnb#*<6|&^Xg?Q+-~UIBb9`u z?ZwG}Wz|?kB{7+45~T&HLX#82AHf7@Mus}G3pBti%%g**(lJ%giFyPhce3bod9cbU zZ<9Il00CFu<)e%*z)X9tZyyTxh{5iBTHQw`~&++kOP@Dh!;m;5Lr2-F} z&u{ymABk<*bMjMPxH5csf}eRY;5$qo`IP<*Hw_M5|38GkSHSaRo?Z;%zjgY)?-Fku zm=gG%xWD>`4~6ac!Y4qRyo;9ozutGL_*3Ft@4qxYx6meLa?D}FWsiL;Q(;a~Mzr{) zoS`$gH2BWD#tAUEY9&eBasVolYA91%(y<5iC|2N(fl-Uu1v;VPKm%LJCjpa9A_fQ{ zC6my+3NmJ$6rQMTyFsUqd~!B5-}%>UF12pd%rEqE8TEWxbziTj!*p6&hV6W308XobYRdw`=gZ#gm?JxGHtvPq%P$00wDB&nni!*!N%l z`VBmYAA96My+0EJpd)|#doK>}|L7NG*?#flnfVao+t$e%P*nl5O#h;boa~-_(gtxTd<0o`*HyqYiFvH(% z!mlv50iQ)(_Vw$-i=K6+D*eC!jGw6ai~s&X{Z~$TJsd#}js^bE4#(p7qYobRvpD$8 zxqtYlPlW$NSC;lX0=R8m058cFM(38q?De?BP|6@GWqiv}V{Aq##axjR9GVJHR?N{N zKjOf8)Yyt5C~jws1pgeWK2rtzA91W&l6CKOUn{c3n>qBfABuYHYN>eTn|?K`@P!Y* zUoEe;A#Ds>(bZFeW+Lfa#q7l4M-;>^wCGVqb!Em6b|_>e&zsAN@jOo-ETA+QGvu%d zPwPP_HJ(>=z+$ct___ly>6bT`0<8aYFE}MU_rg* zIp>^uTzK*cNAS|MIEt`M>%9J{&&&>91;Y{zZvw(Mcy99-e*vDLnY#7Y6VfZMdq! z|Hypub6@AHHTzzY>whP}3=Q;$@y!Ztz}434e&uiZOQ5HmcqD(|kEqP7p-#Q%A-cC8!> zeAaWrEqBo%c~iLbi{In{kn3ri9!bidiz3-`jAvY08?1{HV{9f#=IR5^RP@C?@?4MZ zdXEk|Ppu*-ZbuCbb>^x3#Pgq%Wqj+S?-YYXUw`J{Q@-ElslFIq`E$R{uHo|^exF)H zkPbz(*wE91W}>?jNeZ))UDMc>lILcNqqdX~P0rer2hA)VTaI;86W;gjxsv8FpJyr0 z6|s#tFX9QQy&U=BS_-Pocfj@oUa@x8)opL>SgmpvcY{I=6l}&tDVM{p6TL4s9_mZM z#v5P#f`GqEt^pnO&;QOp$RD9mu2u7GRdOhn@>DlJlIo)kN3N&sEeEkKC2M)MPH{b8caiFFTVz+M?dJ9PbZ{){ zR4KVMmq~SqkeP)qHd`tHqWt?M?SG|=ANj2PPmn;nn3kTVCPRyzYZZ9}9)2+aR}uK0 z%(m@2_=*W{iDCckrsuBx`t)GP4q>ws15yTo+Tp{Y4)1k#$P$r{SB!JG%+V6ERuUhX zDaLUwWa5C5ia9LVKOj4_Ry$*vgK2fh#B zJ66e`Tes;6Z;@6~5S`tr=RXs*BW}Isn`&vh6*QhaD#WK%Oz?hs(y^tQ!PkvylHxpv z)39v?XbYv(P)vzJoGHl8Ty4Q*E@5HcK`3>zqe(N&wU(Gn*f48wX;ZTg)%=Fg4_~E? zlOgTfHb^`rMN4(>i!Fxf_>AYNryt+=m212`^hba9KK`<14doe_otG$xWljVJ9Y^>= z#Ds8%B0Yx^qU#z;n#{5)K8bl~#}U7neL|J0iMnOWIN*Na@W{ z*h=(ZSe8SjT~q8lofug~_dGB}p&k>hh!pxJ_Zbdw*ELsgi54-YXj+(CO9PG#G}7A% zPon`xa~OWWX`uRDPrL>?D@f(&q(Zz0nBPClLQuxUP#_rE!w&^_bS$ZTa7sL9A$vdNwqstG(>7Q~jaChP6j7A<><4Oh@S zm&0v$-XG35>FDsc@Ayb~=ld>g{+1Z;pc2JrTIw{;LlUMsHzxqMpJt3`Iiu9_=cLIs zZE|$hi|x`HXkvNgVr9%FflD^cVi|L`0T)t;kjX`ktF0xW$T2iz7Fv=OozY7D?$(AQ zJ8RhyCF*L#=Lt~J&xzf3yS1l?O}bF23~PTo@EMiNiIAph|}+!l?9 zN9V55otLStCyLlorNzcv9)(TtZDoNhR0nTVv1PnJ6lC%amxl^s0cK)nMwq6#F(xh> zJi$>y<`9tNPR2?DS#5&>!>AU`IG*GNdcqXw+xe3rE~j;Y2HBqsmn)_US&UPy}~I^+(IEY`R#*_%wp8X zFqcQP)sngTK-RvNfVaDVU6DYZ6XYPMUk^S?N6TbSht^O-m>#Xov;;(U!G=k5)m(@i+5Z{xos{YiK<#{kX3R0H&4j##%wwl~ z{>dzAYD6U~lB3q1L2O^wLKl_>8;i0Nb4+zlbBC(fB3ny}ma2yAdbTIG9#*voHga3~ zuLdmGaq7en8!0il?wlthdj@!)Z8fxjwf~WNg`@KA-@07-GNs)>Ab&CK0!FE+wX4v$ zPh}UAxMDaTP+v^4)RAS1D~tE-&|Ds(AjUq*x-V%i&dsRp^)~9=SYn%=?$QEfCz6Iy z+}*upcVO|CY5C4B$!8rl=Sn^CMYlV)czMX-x|7rDmgKlCqaZI|*QF6F{K!hKkwUrF zkxP#rN*Gr{NtzMkDI?bqNXvBuVyQdAW2;vMrUWzi@uep#dED( zzWAzA(Y}6&cutA9I?a7Ag_hz-79SUAC>=Rd>Uh%3<+2-T2FJ?wBJ+IKT5}WSxs&QL zZQ_^^f#f3xl2vdqo+KVo2<9?rmbJrE(qo(67bo-EDBDNoyo{`1@j<=hzBsv_Q3PC9fTljOMw7A8qLHMTm1<7w_|iIzQ7gA2wX^;Y3@@oaN3| z^5EfiymsOii|<`R=K~|;K}RW_d&-ecUE6heF<#J?+e%#~FV~SZjc1zd0=4T*xt>-p z)rAw|ZXXNt+(}8Z7FMN_tCE6P4!+35E={h&ivIFi(08@gf@lTj8czT zOc9rT(L~6Odln~1ies7IBr3(J5>KqRY0v*AHNW!C0_zRUNU?mabV8l3dTm6%QfNHA zWmH^E(>96(2yVeGgx~>!GdLl5a2ecnuz|sy;2zxF-QC^Y-Q6KLfiw5}ob|0W|MuS9 zHQiO!)mK@)BaQ4c(s0yjK!|i13?cy<$9~pqQx7ZGw9`!-?^80z-@M+D5~;2cGdNLB zSGu3O=$u6?DMwZ&DJwWWi94Dp5$xTsY#7h!nPi_ylg_rL4(< zZ`k;mHmh0no7%*~xr^uc9l5b!KaCL*e4%`19Xv8r1$EHYF(*7R8Gnj*P5wic+YitT zF1G99r`(yg4xmx@V;UCCr0-Q=&b3YcL{S45$NqhMl2>tbt3IN%OkDSmuMyo~G_0R_ ztA>sk3ddwS%DOSrKA^f8WmKC|ti+A4S^O{MSAi(bAyyS^ipV9YQS~|#&z}nt7MovF zR@N$;1Z7sYVZ}GaZ~f%n<*(S*=%drg_KSabnQ8mPvwcM^a;dvfqY@jgiBLwUikM&n zsNRSzk~)^hCyCaDSj+#)FCcSu#j258cf2Pxi?HWpIrxI9*>+-wG&6l-e8jk-^$s?3(=@6ZX3^q)C6kBFk}|i-SIS zHoMdQe3@@Jsz0Yg=h_%37>x+gPN@KKh*StA0yNncGUCSh*S9<=w# zx|#GtPDb>P`38nPehu*xBvMbl6@rjTPpNV}yA(98A0UR6BrBh7MzWL1vjJbLuI}@o zfe&V8wBq*q*W;lYZKz}+>Q6X-)L9JAMi8Hq@=|E_=q5iXg?-qgryhNZR1C=6Mm!>6+d_8Dcjy*7{7kjf)sEAuH^tWp!k7sC$I z@sX>P#DmRkxGT|EOxyMD_ZR!~2xot-iza!h^Cipk6Y!2*P(Ut*kdHUD>-dT4s}SQO zRSk(vGoQ!lidJv$J?Aut)LW71? z7uWFx-G+fZtPdOueR`CIqTdzU|mF{5bmcf z9VoiJp+;o(tF?yB-K$A)F{VU)tKHD54fBMxd^K@^7IujenOa|2X7Tb7?ABxOiU;=2fljtD9iB)w(YpH>~049V^L$rlN zYRhq8fce(<+@l{}*=j%ZXMQM(DM{wm5OoPyLQEsjIakfpv!+WehJu|hH_yJDCp#bL z)N-rU;^+N2;#66w#u2{@EP_qBXossER5fIH$I}l&2y-HN8E@@7mA3VKXVkcow8f*%6u(n?5r{HBitqpv(R-2N#2?w^bZyb?b<=pbT=j7DC9;5j4auF zp=t2cmG`n9ob_Y(VGGnRM&@i>G1Uu~#GPzMT%{?DcRic!!({HOA`R?U$GS1D5G~8? zDs|B2^f+zN>h;9r&jW1ac+X(oV!2-um zu>mWRP$%72EM6t_TYi_Zj{$cGvaW-SNzG(`rQ@l8LnN)fhHx(>RC=C@(^R;jX;~<+ zk@dA0Qsg7dC&XUKjy&9Tr`mP~8FA0duel4oHiHk>EnFWPr=#@T#G3X{pXKx1VQSt0 z>Qc1=p`iEg^i?UdO4(-aCLpzA>hW-zk>evxYRdiMk(9+^=H5Ym9nU|vbCvVg*Wqpc zq30a)tY$mgdi+LP**JNyL5RO&`13n5rD}(Gq<&%fVdI<86DKFb&dUTFlguKF9*C>*fVdf47KR&vVC`_WgY8& z!0WZ`q=2svJ4MoWfxWF8-WJd>YUbTdMtEo%Ah7A`3|Bd~572_*`rIskz;o4g5Y)@} zzHj)}e<1I1f4c3bLLunT%RV6xGC}r_r&S&ERWE$IOgR$ubfN6v(z{qa!Y{b6p& z>lJ}>g8&IMN$b1XbN^KgVq14fnU&D#pwH>5ntMG2s}%?NZ9T>?Qx>%RA=8+Rx-1sC zj5XF~avag|3le7jyrPy&#+cfVt=~q?X|7LkEALK(aV1VKeLUf&v;fy(uNq*mR;@1@0 zd04Ym3?i!!HLv`&As6OkP8F-Jwv)({NqPEY`Az6^e;d|p9IU4~v>2-#S%!lHDZ}I< zVds%-k#SI0Zbj%Of9uZtlD7z$+mmt}WnJ$pYGm8L-Q$2JQdu=D1zm7r8)Y=&F);F! zSa*Fva5P_F+gh5QruvCcoTsc2LyN>SV$22cARz~%hER^O?WF?87wx~O*HV)Z#(l+3 zA!`34TVO$6Xh7~r5nIH|MEprH7A*>$sc(z$ms%eICcB-=$f`j%2hywxx7$`cK=%&j zQOnp%=9gU`BK&YKh)_xIkYPzM=7@s8FyeA0CFqq3cj5g)Yfek}i`>=95ba!L#-5+t zYbY)xC5Iwo5IL3N%K#~?H6tFC!%c>$?jsR!>RG|kpXf8wCYoUPi6!vJS$1*EMWGoS zR;<6`#|122){B>8-D@VEA#v|Am*Oj!G^5H?d689wrZD=Jru>&SqwRc~ezv>Twdzt2 z0UaMk=%+YkxD6n0TgU_GsW$A>5Zhie&e`2l9LuRTAIuw#0~drNmj>x#qp4yIC3em6 z*ae2qi@rJ>u%Iu6iQDEC2iH$6ZXKG=-83z`fP-UEWv#;qr8oUlQ{tyx0{o(Bl`eH| ztJZCv{z~Tj*hw&II3mB2VM|jeMQZwlU>(EToY8A&ZMV!hFuY}HS{B-8&Wk<#lSw_^ zwE}f61OaYGhBDS70bY#yb`BVTV@+hg6VeOmb5Z&eodc>i?U*4B$Fe3s=RLV5vr3V5 zY6;O_jr`l~iGB}2_2B}kH`_;!%Fn7|*a*U4EY-2{A2;1mpt41)qGJnDG*&|r>^SghxNLf;iA`U<=R{VyPQV!%!azhNp-Lyl3pW&$1_%D{tK}oyr~2b&5>xsv`<@%D%<}Yce@Oo z&F*t@e9h1B-ut}dXoO_eUktxyOvf4O&9An(KD@c?GI4HY2Q>zPEn1*l~qavZhprDxK5(lnEP!fH?V6t}AjWp9X?60)`Uslvj#C|Gt)*Jk{^% zsteSKV4AcS^JCo-H=}1G%Wl_pxHqzWn_P0G`xYfD8`<&0)2|VIp2xOM^!UY^wstL% z&{8ta53K-JGA2TMn00`SDE7qFhv?LYSw)oU0s$}m_|Ihvf22BOQIqfP9!;$=FS~$x zujHVaJ-Cwj>(OUdr<;#IcO^c}MF$dz=q~jR= z3Sl9;INuPzbxzxsNe_%5StwS8B`ZQdRem)9R{E1Ij&^!^F8zSV^yx<1yiVRcMKDQU-<%x7&t?QA7t;DpS zGDP#}|FPy0_#|z|XHDIhXRtnymcg;6{9!EfHR52@P^*ws1*19F(%YG7n5nrGnwrx@mMl%cG=8_|Z0iToCzbBPiP|&Op+?+v%pZalUD)NvntAlLTP;1CP5p>)HI?Lz9h1iQR$#l0z>4!MOv`Mb2!m@fD)-&UNW zleo(3-^vl~pI!Mszo#AIU9x@v;*w-P>d{s*pYBD!>!z+6{$utDC5%)+9 zQjkyZ_rJaK``cY;p-OKVQr;mX?A07|WpMKu`SZXt|Y=Q>% zu5}c;j{0_u!#8e3c8B!*HI(TI7bitVxh3BxXzykC#9zi56cuv0imQNz`$G}_ zb5SuC_dfTotND0EPc)Z*bG3?*c>&J9MdXoP7+RlS_2Ipn<|hWWEH15jRR0L;3F!* z;h;j!nKJ5M)8@G~{^t#W^V&THw@AA}6Z)pN?7k%0=LCWuJX3omSlWMkKYuY`U3=f^ z-S#)aG_gHTQQaPPptj$Feev(b*oZBSJm@)= z7YsC7Z8+bu{b%&=EN{?W-mNG4W+#;S6d*n;+qj8)(c;Wr?`wU0*!^;e8_E9{rXsBI zFSxalDL1Og{USUza-Mq9pRuCN*A`T?|NF&Sd$RMq;bFsGj7#D)qVWs&?PaE-JEKKv zvA_q`^Tx}K?WSA|j6n*B4H zm-C8|u%-?c>q+0qh=^}nqOlQD>_}=ZEMma^$iGrFUi8znrBPG=e3XY;dkS4Q9OUSJ z$X^B&;&Nt$e<{Yni@A@})U=q0`dF4>4-B{$O+v;(d0IL6j*@WuuqoHB<|m^={?T)g zO#&Js9-HYqdbYuaq6+ryZgkP6`T~+sf=Zece|DSKu1?uMH82kxE2iP^tvHIpz5bY& zi7Beq0#)6TUN7m(peg0+XVT*HP(ESR!N@`V$IjXUzPy6oi}Re^8`v8Umzj&L^Bl=O zG&U{g7gv`Y!Aq4N^kD$cSMaV?A|WE^T`c$>d&+tkjXOcYBz#NfcROEueD3Q@ZB$sg zLB@F+Bmfb`u*R5MR%bd-BoFyx6KLWY;+m`qkmj{v4K>pd|6QDv_><}iA_kwi&|Ao7 zEL$OBJ4eD>ZG_Q><}F>z*$5)$bhH|Wbcha}pU*5TF4k_7EPdbAkG#pjxF19wSpn+S zG|jT=F$YDdqJ2D1ZApycqC0&8@DFvk#*tl~(Ow)vJ~Dek1dW3$km}Y_ov5G2Hp8zRXV5TECW|qVLu$x=Xtcq1R}8ULO6Ccq5S=4D zT_AHbG3%0IVoqnWkAXJ%tMI3W*;296Fhl+l7*bv$P03}?@It9PM;~Q5Gt2)aj3{s~ z?kEyNq~j&!B{4owyLdi&HarYB|1YT2_kIY=+hHEc?P>%;flhR|858adf_+tJ%|~-Ls3At2pz-q^EC%r#Ys#<)afrYXY={E z92r_(S-H=Z$x)>Q(SSa=8JCHUIjo|nuXgDy#J`HSJsVtfMVVqQna_kd1$KO~l4#k+ zNj2=RnGc57$4zj2u<=8wTJzyM8w$;oa^IP^87? zGyJ?#ourrx_$3CX-ZVim;-O)RCvA^M6Fj75k2h?<7>2hs;{Nemo(h4fwdL{0UY&s^ z;!49Azv9>cZc$d84$nmsOpva=SF4j$QuK-_GaOr>pV&FXl zpo1b4!bFPt{5ka?aYwT_`9KL`^@0jT-wJm0Y6mvcWT%{-JwR4UMwcS6oYWkY@^}^^ z`$@txqB?VVSV2|c*?&fUDt%9%w%wO$R=sd{I2IArbg-T4>9G;D_O8dtWs~*5E_8-N zBK>NsN7)(gz*S%tp(wMzEJwcNM{J!^M|d8Ph(NfRH$J!+TTOxqBKGB{XxW}q4rBR0 z549yo5&RIHhG^=Ba6?Z&7k3tj`eX4fN+C?1L^y|~xug9F%)*H{uYtkOmJ2^QMpMjG9>WKx*ni}yq;7sjn9C-H_jRi>>6$L`kGw6!=AcL1dN4zhjoUzcks+o@yajEBtt;;QE7J{gFEf zvzB4liVbd`;dJqD!c$?$A|8r%LLb<4t~MkJ2|-(qcSBkzzFJUDxiBK#+Mr!)K?kmR zqK;Q7>Y&D(Ct+5!HU+TIr=add!dMhIk1Y`P-DREuFK3Q}6qNEgqxd4OJfr;^7nOpv z9Na`^of1O2?9y#2OqdjVoBKd34XxY<1~QT#j3g1%UaN*(C?M(P=H4#%I)Ea)iTkgL zX!BcLg_O$8h*$q2IJ009x^QG-3Cav&`puW*anqSx&DvP4&;4k_dR*UO)c={ z7o64(_k1um)bgw+O7Qzz1W4_2a_E;+gndyjSjH8-*J#FcjZ8+Yf%G~gojoUg_tq8D zc&!Mzm1${7w;DdRYR#(`nWNX>=xH(x*Wa8AMA8-C$QnMf zacvxJcO7(m`u!Hi>atc9`&O%wPw-<-ai^;G!nlr)EqzNghOAS5-w+DBg|9S>3gym` zMKbuV3HM4rnVFV~iOVYUwHSu2*3FL?oWpIB`BTA0#Biao5V#)e~wqaV7Z{(4rbi73T^ngM+6LQ=; z2#DH%7Liua4P2UJU6{(Vq|axFKTeZVDf6vet*#(sN|{fBKlLmQhufDwlzRM$mz~dK zo}+%AQ&oDpeH_11*}=1@YCUEdi)A1^KFgh+F$SIyw$YLKhp9ntiP z@Uqffm~KwlVmVIKJ!Zg191O!wMMA%ZiZXv%5_ zHbluGpk`H%67gkXvM?OtRn21jh9GS)h&S<7I3O)qqLzU(LqGJek#!BU&=_Uvo`$C~ zlM*Al!-DR1BPQb;`%Bi>O*;=asa$P*)p#4tROS$0THH2r$)|SdlU^yVgXgm_-}iG- zyRAdwbIXE7+#P^&{=B1gUCo#^v<6Ham&NbGIWS*oj%~K5{jpelTBznw5>-^6NmU{h zs0|LUNLze$<|W%qN%xbN3c}uw_Ad}N#mBi4RwAFYQ$?U~#3Wqe=xxtK73@GvpEeph z^!k94^v%s<^3+?b9BzD$I;*uhpBZ!l$?dAKxv8s)SFecBPSiR<=br>Y9Am2mmBFDb2)n=z2I(-~jd1W+JjsC2!qRD5? zDswB^%nPc!jT9hD4SS0t5M@T$G#K1%ngL3})11RoRF!Q@DZm#Z8bkW&mj;`Xf;c=3 za^uckqQ6fItYTkc(O?>R4rE#JMxk{cc`GlbccdVOBnzb(jZhdS0g~ zca=5eyTDUPnn7~>MAN$y46(S@=!c9H-#AJ8`QjY!Qd~)0r160!ociK!LKTDGYP1?I5*7Sm2}pO!5-MX6?l^7X&r+n* z#AeMdk#vvE@HOz6_v;n}9cVPPDwdpoVwO&dae>sMmTI7e`LSeT4=;zzuh!EW^+%F~ z4G0MVoP;goqs~3@VGW$|oU?biJsu7`G{MF4T6*@sa6E|gU>x_ZL~kF(l*hP9Fy#z| zMk4^wXhE;8z(8-r`lPt;-x7%+vXF*_09Z^KQ#y5QziwBIvwfvwoD^w9^i`bJsmyAJ zznRAsxQsEeG6}qb`O|=by1A$RACU0{EYTl%io@9GnlFljqzxa-q|8d~8rm}ts|HQT zfs|iB7_#{YWam|djQXck4F`%A0DM!%h3c3?kPHz7kG*i#CszA2wOpu`Xvy6y3hm!- zLp@P_wV!*K#>Ngpfzz4QX)ZsVr2{L@ z#drP;&ysNf6gM{DM52|c`~`dH(Lqo^hN3y~4e zl2Bu<>+?SUX9M2<(AsfD)@tZxVHtR&^tEa?#=ot@T0InrLt15mmm^>}W~k>j4jVO1 zFDg*YV4~3g{X^#Lo-L!Q*H&X;2=O~rTgauCZPg*WtHB#vbh>IG*vg*{=Tm~`)#c0` z2MiBcU(e+yKP~_k>j}61B(21-00NWEy%hd5EvELxM=hNLLQ-}UMAa0f$Fe9>kJm&3 z^0?VPd~N(m&Upoxw>Q*~01m{;s8RLviom9_(#o4|%AA!5OP=R(l}BExh{dMx7lA+K zE8Z0~^MZ0e6-6X{{9s1Qn)3xPms?g4z(#z!C7odjN5CfIsuaAg1jk+|6an=J(h9o= z5DqJadN`hz&&@mi6$)5`G{Q4m05am^#|hg^;`eDSLgPnE(26L4bd}A;ffV=-%^qs5 zwr%D32PE@;Ftcw*LvO?)t&wzJaY)+wP@GRATTU0eeJUwYpwD+XqGD)_&6Yda@SE5{ zqr!8>s70kp?o)t6UknvIYM7zuZqlvdGbxvbZ$C8U4mOksT_q20JiMsSq@;kEMIJ#a z+GkmDS3Hv)x98;yT7a`e8J|4gU@#%=So5W!Y5-{Vi9HCX$EpLzR;3QC2 z8yxwRz2`Is%iAm9sFi)1N`OnL<=seZRl*{MqKQPRc;Kq%zRORO-niIAh3{*)!emA* z3r-_L`go5TL5P%aQ_f`wnYwlyUf?QLAYn8djiNcQf)5y#Tt>+GCN8s(i+CQXDbEnC z^Jk1-)nA)x)A5@|I7HQeuX_>#GNIe_^%Cpw^t(SZJ! z!k#XHlBrq{nHIAMy4tsc-}`Re(B>B!rmKI8ss`XACAqXvQqX_qTf)XNJ5SXH#xS^^ zt8%i{ol|#nxd`(ugYNbqF2bp!u+IEJq#XmA0Lo-B{O0Bzwq+F|#<60Dr5kWVf(A3H zVyv%-xm}glT~40w;9zWeBZ22HaFb`oD%A-h>S?%Q6VXo_WDF4v$C<+u;kpc|ulpq* z<9`J@ZVA_=br(F-$65g~C0$L(*sj2=Lgtc51?ngoz|>!6tx0u1xJb(Eh9NK^((%0h$ zO#^v;gD_dFkzpJ1uMS8XhBBINFS0vj#h8?qe9RPxLCXpO0p@&?noK#>Ty-C0T#t^Y zx<24(DH|24iBJzXo$M=(QHK=6;W5WqZ8n4!i`G~DHMi3j9>z>DL>BdA&MqO_JwR0# z9ftKXu6pERN~=;tfYrR z-bmx?`nmA4V?@h3py9T&oqzMhtcHEi7Xo)*39Q0;rCPr9;>nSMXY}DuZ^AG?nf>=n zJUj`8piRFtoQ`)XNfv%Wrhi~;8~Rku@_$bWBT;p)zK`!)b8yGP7Lr=|jIs!-l>cv1 zLmp<2ZBgEdqb&F>ltYL19_+8T&`*K?`;?#Ik1n6n#y2o6bN&)4h(!UGFTR(4UCX;qh)eLia#ovwo~@) zugTtbrsE=isWmXQ32;Lu=r|JD;3Bi%L7esR>r8S|xV({x#5aQe(~m>Wxz&TD=gUOvmkcUeSmr|Ni8WH&f_Ungy44%kub9s7pPGx!hg z8#XDk$Miq9@SWwp4m6&4Kj$av!4gjB>ht~$+09g6qr#b{v>Ya5Sv?9L-eGf`7+#13 zoMx5xHn3gh-9{2q>ng^Q@qxZn5(s^mCS)~q8>`^wwc>d;IoWTz5_>ptrJ+qtw`VWZ zQ_$X~WA5DJsTU7l65WzZMsFyO1J0US7XIp3c7?WVsBILi>%Av)@OTmRsJ^p~+R{@T zeVLn4%tiNta!F2CX#HWpU66oIJ1KN6$US$4Y6mk!$>1lhK@pGlaAeG0`UOFeG7b%N zV)E&19-AUsg;s*R`)#!od`C5L!1?QP%=5DR+y&sg?+y$;(|_DYZlvCR-EVLXOIw<_ z+e5IPFYk3x{DpTziBF__@Z-)vY&O?j(n;>_U4!F5UJ(mfZU59$0fr{8*=bYx9B^Sp z_6UmZ0KHr*A?@d!2WLm0-WuKJxhGY9A<^5YjwPaLqM{y zCq>TIz3wgxcC8qE?s_W@$62j>prtoFPU*F4gLKY%6GHdn|3+HMT{^AG#9&;wDAbKa z)pOx<>=ly;hn47fEQTfMe2s~nOCd#VZ3qmqc{aNHPm&D#jL_XFo@5N1_BHS9wXb@# z`i2J5`oD*L*_cD@O#;N)86>Xt@cf@(k%uLrvO`LX%c5Yz4Xb=fyk(dM4V%t(l;<)? z`N-QStvV0SPa^&s6RM9)O)=3)B3+rjVWVhY{U&h?9-d~~+PXw8pa3_lL&TPvpZxyc zy9a6+I13clU+z+P-Vqi{#lTc!V?^?$Xgqn^PS?dJzaoQdUyPU9|K0w-FVrsX{#IRN z6_zaaJxzAXG5MjfKSyPbvmVySr&lcOxf~Td_y??W7jgfOa2fUX$*`W3e=C>9g6~g@ zQ*D5Xu{0@oIc41*AJGWwj_pgh_nf2u(+@6V2Isykn57HQ%g;D;>=MA*A7S{3QB<8Z z7SEGk%(VSGuN75K1@98=|ECtN)q9^s^+*oXY*i{lZaZF5LHoU^0bK!3^ zl|&@z6XDj_$#=f6?gE@JE4a+{u{3D1F4W=H@fcD&pMu6m-b8cO^e+1UR>kxH<0Eu4 zQSMH7E?xChW%M_PlL4p6LfRBy<`kQ*Wv2&%-ijch(*K{5Zw5AZAqJJA8Kt^phXR)< z567}KrW0NVjHU1s1kAh=<-=E3))dIMe4Y8w6NX*TZg}D<PLoJZ$i#$acQ1Z>%g^*lXG5yWBrI)$5jgIz zQGy!f&F*A??R_|rcxPM_(ZFq!1ct?UzrQBiJ_TN&v^oVVuzk3!%h^*YjioZYl|-*RleDlc^o5_&CVGWge$T;+8BD=8JV&DPW+(DOT=%**eO z=x@aiXu7YjoSN=^!K93fnFI?Lo1P-}7q`qn#=)`WNe~fO@aKX$yUVg`gUcUOi!?2ah|{lnf&{M=%9 z#VVIbnV(1_n3WA#h+%C0t#p+8om{xmv+~$%b`UmLQ`unl^;h9>oog-~P>8@UA;??5 zb-wa#)>5@?6HusCQrLQqwp={}qu?ikdDSjoUaQ=8apy{R*A8_G@Vg_vUl;hsaNx`S zdR<=J=`pQ2_sflrGGj(`@G31hC~vI%=>3>@yS<0n7zk{$ac?@&jA0zTPD|F1GHGv* zsjVFnbSWJsHmkqL4v#_8E*o7z25GF{7{U0 z-xtCd$O5s6L`;(=5pA-5`PFnDnQyyU|0ohE{jznN5fIs_TRCuQn^M{U8FxIQJ8_gI zw|hJRud&`aiAR1g1C|v+0?wEXv*-~?vUX8uDdq#gcHD0t%gITe9(Q-XIchT&E9=tO zr0QXNy)lJta|-dv`zd%PL*m`6)5J6^j6PO&hGbBQxzAp;q^@RKPP%iU2gmbTw;e|| ze;3-cIy^}&D%)FpTr(@rIrOfLh^C6DWxS%`xl_-PAa>nTUM9B8Rl_8368HrH+3!hy z5e&)5XN=rGcsT+cLdjSJjGIi9rVH` zksk|K$5g$Gj*_1k8w+U0a}V@>xlg`|e3&r|HL1vhElkj(vLAgGb?s&1Xi{BCi(6FY ztH1B&EH&+|WzO=gR;r93{OC#2I0eJesW8dZ47$^H8EBrpjE#=+oEY0?$zPpZ{`r~0 z3TBN^icB>2PQ0bL>Qsbbh#U|T+-Q1mP}I97`WhjWjE*Ug#uAH^CT$bJSQLBbNV|>B z%`(}rE)1lozmJ%7f4(}0t?WUEt9YyD-r+iOvl)iS=}|U@v_4ZwxJ^{7shq#0T48X( zR74jkJP){jN)1PCy{tT;qA1*hMIt-M*zVOj>=AlX?ij;^a?0#tY8>}Q3;(LqY&qn$ z0ccIM1z}FJ0swE(;Xc>d4muSng{W4oZSUiX!NsnQ@G1 zZifxpuP@FM0q1-(Y`~rKY-!zyM?I&`j@T=4Vmgqu+(>%sL66SELLw}=>(Vcm9lPF# z-Ffc4Rfl!iyEfuXS3%xTkEj1pUs%Gefh34rvIp#!V`lz_b={kO_c%02Rh*kfHoz{Q zjQswP`h({!$*nEoLFhYyptI`<-4jY-3@}$)Bkpu<(wff{T3k_qR>xxYHVgj5ZTQso zLO1GAmq)oAxLeP$b!ELP{Z>{S1GLXXuidVTEeb8=vo{`Ij&}#%IUSfcGZAOk7;+O3 zI4Oy6*%XsP_l7ZTdAV7H|DtFas!jr~D&L#BDvvAy)~_>okEA~n0NmVd7hfvCbsJyX zju#9@dCsN&ekebpw%wbwI~j$`bnLEj>MCD7=pl2?Z&}>bo@8`=TYfB~)w>vqrZxkf zsh+>5a=4^!T8-jbGu#O>pAE<-%^6WqRQ?>~4`&3<6iYfTl&2!wdYl__7DhlT35PcQ z(%zo42c_Mk9E!Jqit2$kpUA-{tn%6ca|uTLhkvo|S4wpo2TCgw8|NErGqbyq;H3p7 zZ+}BhM#%we(Yik;wnvBR)up2HxGTVW4Aj(U`#mhibbcc*Ps+lUitu z<}fAu^N;b2*WImi>8WH3!+y$`JRSkFldNVXnQt#7|k;t%mLSauKyXA~M z7Xi;T;qpSx*_w?5mRGqsDoD;n^E=d&LhjKsr=w(m8J^z8pRoeLcz?nZU6`Xx#XBB} zCJ@kgT%o)8kcWXz!GZDF`K{tYkmSnCR-kcU98>CFbMy9Hfv3#*!75N?^_D*vaSX4H z8OiEIFEik28GLKKZd*#`rtndoKl0u@-%ARO!zBz`=s+VZk^l0W=1-I4{}UF{XEM?@ zA1ezg0{*s*K`eX%a)-B}=+7G)!~-?Z*^cp4sVgH=8zo6z7qqE$cY8j;W7vdroRYWU zsoKs4GjiGMXU@Y8(lK_Uh}B{ZQY=RiVpt2Ub-K zTjUwXn_z03)mOGC-Sd4>=G~`o=&HJFz8`plJtR7u0G=+m%-`9!Ix-!EFcwl_kk}Fu zE>AAw#d;wHnO`Oqhnc1Qi2r!|(#+H8hf*UE`8RJC)!T^Q|LE0YJ*WYr64hq!-TzCf z5WB^I!d7Dy~z#f$`{&enQgkD(;in07IUc6$vu$=bk|SVjk9ntOPRcpFJD_ z|FOiFbym*1_2$p0JeFA>_Kok~YbI876gi)H9~Va|_3CR!aY1cPVY9EIF6*-YGIvR<-VLEAf{Rx9#=zITQW6G<$g|zC(Cl|V zDy!5hsB%g254(Ms^++3_&wOO!B$f>PBTiZ@y3e=K+K@6kFq_F=DKod4!wBHqVd5<1 zHeRWQaIHCBR!xHM2Zcpv-~RHK_gl8XHnL(SK~r6}ol70Bi_P->amnq@agJ9kHBMhT z*RYxUy0GLT#C`V<3;VmI6cypIR(n6vGO&JIyM3#ti|6%(d5=NhNlf9gcq?6@M*)re zI*T0b)dJPG5fjjO$jI7+R5b24bC=H&LpRFte!YqC;1U1Q3!~W%rtf~?M1G_e+D5RG z2oN6Yi4-(ZS<-^WjsA^!D%R7kZPvs%_VLbV1!vguYSN^>aU3+22`t|Mb9L2pn zzyFx+iK!lXqQ-7;blDcFuFwxR{&Kln#kMi z?M8>McamOl28Sb|y^|S2%_Ha;3MwM(Ce%b2BL~Fj@ z_E?m+%=en~`bmt0uu9kENN`{F(|mnfzS<-U;P?S-L;lDJ|8kkA2hfKeCGpViI?dos z_+A@<_{RB@bF^(hVSXbebi?=1HXI4x$kM`}ifYk-JgwZoyJ#wr_YyaN>&*4-wqvE$ z+c8Cj8|aBs&Q0s@6k{3_)P@;k(IIR0g>Ain^lgL-b1g$Zu|+{i>5+8+B%`#sN;W2db)bBT_?p5Alz)HPmoC4VT zc~9epg$BFjVbY(!mT=4Ma)49%FN>g}pL$4Myv5#eSqPRvZzmqV9)9SMEO+`gW{bXh z`E&`rYDe!nzuSvGPKjC0oeq}7hk4w=K@G(V@J2FUud>`G(Ly=X1fsKi2GV@HJd zFa%4^`=+AGX53J{K2&lvkxgN+Z7357c9Pdy;;{#)7Vv(9@yh>_F&OmL+1eX;*W2*K zX}iIq?I|GmKomGDw}SU}@NfaN?F;rQTYl$!Ui{E|oksDPMM&sPx+4o8AonM_BrJ?$ zYYvJTh(4{l+dkYgs&dw=ApX<2 zVZlK_>WwAz+P6HAygc0D2fr{O@EwE4r!vOfk@7G$I_zp?&Ze@iHdm=lM6=<+TPca%x9R8hsDE%8{dDdJ?;z^CO6&@jdqXkoj5O~WB!4o42(6CN!ZJ5~K3R*jQ&PPp=-b)R zE>nrmb-#0q(k?4p>;N}q;B__P&za*N)+gJaKie#|dhxNJ#=mmyRAL3fG=djT8Wk(R zPyjK|0?Gg*Fn$C8-YY`-mEUfn1N{MHGfP9!OnZ%U3~nUXC#?nYKX?mEpOsuD|MkAP zpsz^+**VF80M7P^CeD_E#I(Qcq_5LDvJ`-t5y0z_ZteRe)rNSOU$~|1GgK35{f-t$ z+be(tFIKqm#ZKAuYs+oO0C_mu#hZI9Di#OOaWQxr(O*a)x%{J$OR4_k}#G-2Ocd18p!WA2)*LNLX{=Ye{-nWGmIo*j~3vh4S!) z;UhlTbiuA=-G+F3C2KmKc^u6ec)bwJldu~8BoKUBuHSBaBXxd7>%|Vbz<7TwbS_!M zKsyn7F7ShDs;Ev6$m28xAyOLlza$;IU+V3bVe_eIEUxH?q+|+fO);1}K8P=fX=IqM zmg-BM>26Ro`KagqoPFDOyw+er?|l3K=<%pjpv^R_rRQErTZq(pWO$O{ewc?|CuW^R zR$K0=9lZ_0t)4HvDSQpa<{T>*WGq{G@wlVu9rb$cg*Hc9`cbIo>%wffXK}dG^9b)l zC63mg!Wp)`1%KGIG)2-9W8N{DvVo>CvjXIusQ$9qU*?&59b zVj!T(;4+|Uu|*7u>r5uVO0JM0rDBV+vhP=-`MeTEzMKVyXyw^Ga|UbVM@vepYj>Hr zQghkw4MkIR?gIF@*P*i3A@X^H$A@p>Zw2Rn>H({%DOfM9pRvl#}}10C~nK2jZSXeZo+8DJmmK0rq=F@iI>s7)j`C8J}bqIlnJ;mu+B0 zaP^fNNBs|}|B`S+MmmMbw!9^(C{F6|jPv?4{8)GC zDay6*nXFd6<6&@_rMl|0qUtu=`Tqym?+Kek8(RAnCSo`xn6XXjt_g^hLTUEH6Ap6Y z_?MKp{w;rR#px8DK+Qy{e1D4i{{puONcL1~HwGMl1|k}8enPz*^E<8%yS9Eny%8fu zjQDngb#>N3OWEwCsdGgK&30avdh&_vOPMqs2;y>3>awYnb)ofQn_lU|Hlo92Soxig zH_(6s*rwSaQyp-y-Jg2ze^4jKuC1S^LFZESMvNHo*a3P6>kO@<)XtMTRqAxv$E#qq z{VV6_OXr+?lte0PucpOEiDjam*}5Llb{)0)3Em#@Xyd2eEWZ|QM`h{(XXloG3yZtH zsosbYBjjmCj2$F8Q!TB7rA|1$<>5+xl6UbB;ySI)4}5nI{!Y8p0NUDpvK_8@-x z&2oiPo@yNf&g<04v2*kP42$!3sW)Q8w4jqLc7E1Lg05pFHeN|nN1Qt36pL?hSf?F* zE2%?{zAlUN%too}q60_%Y8tR|#E21H_?chO0jEI6fb)~;cr1n;54?>^yHjn%BMr=k%0a!U=#E8cOe&!b|f51lQ z7;s*%PQv2i&am^rzgF)%3D)6BhnRPu*0Gvh>y(LHN6PrBo3&cUJ>=CiNbACO*-3+d zl_N%s81bEhpZUdqQ!7Wufb#}*5*Ft-hn-t+OEfx3>!kC}IKI76bkyx1AR^DVhq(CG zIX7NSvo9U<*inxdF=E8G7vA`bA5tqvKH#{1x;Eg97%^hRh!K5wW9J6tF9W zkt0Wr9653dnrTp52AmiyGe(XaIdbI4NvSAYcZK6rhGmW%IdbI4k(00v9dK$1WdkEe zjvP61K0p8D!pk@-W%B&OZ89qXGbj{Gxr)7C9u;&Js&1XYY)X1Alo>}RD zr;`B&Z1Ig^G)@pIeH&c5d0r$Z^9iv%mxGxWQBF=j{lp8%7z?5K$`mk-S}|hszLI8m zWLji7kwyiT1$D8QH`)LtL^cRtYNQ;vqML>k^ChM^@YzfnXNn_nNrA_DENNyXI+>)o zI9`x=KeF_#4YGB@g9}$`Boc_{I|MkI$H&+G7fOx&=+2U8oNIF2zvf$p>4caPa~$lr#^c*|a){1#%Y_oe zqNS6;gu=G05r{yXU?WlF4CTp_!eq%qYy)e_PwlC}g=Um71KfdZN;=VkJ$Xe6jp^&A zG^Pc_xBOyKU6UlgGFe>mIW3YAW5|{S&QoH>6G|44;(UIXt#QO8AUel6!ljRy&n0|m zAlj0{Nt$O&vE+-E{`5+G82C0DCT^Zfu`?i*4V>piT-{vN=SlIri7(!=usT!1)?Es* z-^?@qn|@b@-d$#n8e~ z@)KS~v!e!JrPxO)E*p{1tPS;TE)RvX*i=8}Bp)*^6e$CBxg5x3bi>#2lm%8uQQa#! zY35QQS!0tXa*PsCpC`#Ny&1FiMCTlhiiU&~w;axjzSJw=5I1)=lxh>8~ zw&|?-$#RUUQGoz!01DG3H)%}HBCt_?hh2e4`J53cwIr_>~-6&}vm zN`*8NMuVt9g}G7kg3?!mZEZE0^D&(YnF+;?r9pBmi8I(1*KAlCMcp89eqL!ua}B&#qULQfZChD(0U(76 z6q(J03|V$1cUcDO;&o%l3z(>^E#l zKKW|7NpoM9Cxs@NE`mU-z>>HL@_?$Ew^2%*Z3#B>7-F-BQc^@`Nn;F+vu1JijWNfO zYl;m+G&lm*J@kBc&wv4-yh`dcLropJ#=5S4{Vfm`mzZlwjXJF4Fno;H-fx<_k})j~ zKx%8P1Q!Qnf6G#w$?(3(F6=<6C1(lZi$vS0F`OG7ejN;r^Pq^QcDo@tnyJMe8*l)$ z;n@jI=*?@uD*Bpa$M(c%?nIzCAv`GLpCmJK1~tGEW<*=0_tIOa>eI zwlc^NKTRw{*Q6LH!Ioh@1TMVKmDFc5w~-xfejskLYFr0CB(YiJi6!wXq**FC8x`jvERqxdK|pdxJa|i zRz(bICi)Dw1h;&%rNA6pga7~l07*qoM6N<$g7i+3ZU6uP literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_1.png b/assets/images/tutorial_own_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b12929cfd8dcdb8b9bef4f32f6861785250a22a4 GIT binary patch literal 5153 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 literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_11.png b/assets/images/tutorial_own_11.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff494fd94a192b623e2b508bec8b24fae9f4ccc GIT binary patch literal 1034 zcmeAS@N?(olHy`uVBq!ia0y~yV0r{(TX3)e$sIT6#sewF;vjb?hIQv;UIIBR>5jgR z3=A9lx&I`x0{NT;9+AZi419+{nDKc2iWCM0=J}p3jv*CsZ|~T8sdzIS_&Dpix|P-n zj%93oatdfJvdtpQLG7*)HW*mcM&9 z#iq_aW7(?R>32T(=Z8+$n(Czsw9@yh|1TB>hFKmR%nS}}PBIJ(Mgl-bPiPciXK3JQ zv0z|GQ8>cLpunui$G{-TQOLk>!hwL&=AflPE0=!cep+O?W$V_Zk_-$V0?W(G7e=jJ zcJp-{@5g`t{uR{M%V%v3mzHH-J>~c-`GR?cl+K^_O>CxO!Do zPEPI;PlJ78e!hN5Sy|iNyLU^})&s4+aQpV}+<&$V|HD7pKDvJWdgixD>d0Z>kXAU; zBW9OSzs0)f$VkrY?Ci{M8gcP4F*?US78e(9-m(7Q-}v|QXU(eGCDvc@zWDt5qt%QV za*BKtF5bBlbK~AUzQ>OrA1$n`yeV+{y`-F+p55c}>C>hidhsITMdANk1nYdsqqTi5v?*3X|mKl;NoJv}}1%ZeDi<$?@nfzfT$mAz;2FQJJN zkL!bMPci@qcl%!-f2?+D$3vqyX-P@V zYc2I5G1YR{8?Wz|@0a+_P{Y5}YiW@8W2Zm)XKvrVZNkjJuy57gy?@XCwVH=J-CYoP zwDnf^^cBDa9seaR+Pvk*)vKW&XNfW}Jb0ZHe0*D-_u=Xzi~IWeF5JB<3pC#fXlzYL zjgXx3pJ&h1=4O7$0-DWGKmF`1l9K*~62(6(k`tMfGiql86C?wJr>mdKI;Vst03nsF A*8l(j literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_12.png b/assets/images/tutorial_own_12.png new file mode 100644 index 0000000000000000000000000000000000000000..0e96942fc735f04c7b2193de32c4a932c001178b GIT binary patch literal 35726 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 literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_2.png b/assets/images/tutorial_own_2.png new file mode 100644 index 0000000000000000000000000000000000000000..13813aec70310548a11e1c1eea13998f2d4e0c5e GIT binary patch literal 2388 zcmbuBX;@Ro9>#}75pk;v$o|+0h>BbZ!cAEsn}8sx#*H1Sf*K&m5|#)-Tda616pf&O zNmT?F2uLJIfCNQFmJn=^Ko*cKVM_u8f+QsL*!#6l?}z*0EOVa!ne)DLW`6JF{1D*1 zey!130Kj@*AJ1a|Xih`-$JeZe&i$4@GNFq`;xTV`K<+Y`fEwD-Zb#ezc#)^K9JvZ= z>&E*8CIYabI-lzcV{SWY83@gHZ?fO9M$=%( zee1*PyKX$m-sD;NGuF*Gc+B#=!OO#%ud_ED${&8V=7#2@6On7YynOflJl$L7j=%gq zO?uyHvBX(~t)kE2%(hD!VWLJ@v_vSQi<}apsF=ab#~J`Uv!^7A0u=@Z{1lgj=L4t?tCrP7bBmG%6(x%%;TwoM80^^bW1ubxY>6G22_#@jtWnmiKr7jTW3^bE5*;e)+s&}mUhk; zp_*Z2DCOB1X&I|Gcr1m$qvVLC(c6OF#|b5<@_<^^C}m#RHcO4=QR7RbbS1edV8v3Y zjCAtrdSI&(2Iu}EecfvDu%M~pY3TeG3l#5c# zicn=}G9SInP%EY^S|vI&35|AV%u@!^L~lMnz`J@F{+pm0qZDLrewJsB7$AGgqko&j z)G)NgHKQg9JD>5z;@1J>U~+f}E$KpAv^d-YfH+r_j(l9_ZD<4bfEAJ$!}&#Fu|v1W z*dbcqJm@xQu+msm$%><%Bg0cQO+)5z8|k z4Rr1`m5_D^UHsaoS5{A;1HfNCxwUUg_m&aNxn*^*44X=ZpH8=SSY(6mYq1 z{wYx`l+m%S*j*H^b@W8x$BJt!b|1#4HtzeDV*{J=qQ`y^wL9vKtpL!>yx?`kMZ?9- zg(9>@8d?n5C-dGtDesuqQk)9U_$24p9tjjTn^>p#w)q>L{k7N&c|WBq`myL=6%-`m z`8R!RDKwnCT5@J^_X=X3=?wdW}yh`;b@KZh5=Q$D)|p z%xS;z&d!v{9+)z8K*n?&OsWcVfd^>f;D_Q4np#n2;H`HE1*P^Dk@Y54mwjL^5o>SHiqY$f!UXYrsiJcyW&i7+nZsus>+9T{J5V9&l?2>C1>@C+$Tj%Wm z`e5aV-NMVopJ=$P5a9laSuqd8zZcMw(K4l!ky6=K0#7XKZ^ET;Xp$Q zWkjG4z-gDd!AzX2!kK z3)x77IOs^?=!g8M)?Cw2^wV`_cGtH%`T&q+9C<jEG3$St@P4m z-&NYWgm^F|xJN)h(Wx;|__*+t#V{6LMow+>P_Nn0i7`xJTaR~H|3Bpfnh-L)(7 ziN(cPGO0cvq?|@k^11Mfqonl7r&yP;)S>Kb+EOM7Qu%yJzYn&DD0*DJvy4HAH|0@d zjo~QQq%Si=+4MR7{7Y}&o0rp$pDDPMEc;r1K=~L2Kt#Q<+OHg11(V^jbL0} zN`S#&>{{p#-0>+3pc3DEUU5N)7;yp`8OrJk&;QPI#ZYN~f4{uY3ug2M!aA)I>bo?q zeyqUZ6v;Is{aK(KS{t2A<^d<{^m&I^ZjTvc`mVoalWoYW?h>aI@;wqsN)3n_{+jn8 nc;aTQ|2y{oevfdHy}WTNlQnkzoc>2>Cj@-G0zAp?5m)~NC`6-} literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_3.png b/assets/images/tutorial_own_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8d8e889435b6151fa7b6c77049bb2fd0d5d2f7 GIT binary patch literal 3037 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 literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_4.png b/assets/images/tutorial_own_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b025c32b4ad1abc58dc1beb716c6c75b1de1da5f GIT binary patch literal 2741 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 F{{`tq7!d#f literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_6.png b/assets/images/tutorial_own_6.png new file mode 100644 index 0000000000000000000000000000000000000000..79461fe4c01947333297cef9e2971baf2e106867 GIT binary patch literal 1909 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 A*8l(j literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_8.png b/assets/images/tutorial_own_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e4dbf8ad908d18d3f70b3c2519cf42cf9abb1c57 GIT binary patch literal 2270 zcmbVOc|6qX8vj|su^cLws3fJvFp5E;EJN9%$(n5(+t^8CIkriEUKro-(lq{J1)0RWJ) zvNX2`0D*Fz>?YhV1o+2DzYHJDrH8~Pn-g|iZFV`$xQ2_93 z8-EGBizxR405O!6xvAsth}B6-h@8cNzZgl=XN;?EE5)m=zW*c*a|i1wXSF4(S><&!Vf#zDVu zdx(a0%oXBvj-=tySB8e8bEAuKi<3HbgVIlzp`^r_ zOuFj(8QN1Ciwetf<8X z_3=SZ8mUwkHlne0O*_n~*xI_R1Kz-fp({g?ZllBrcElJb{k+j5EtZ+c9zf%pxuInfUb*t_PZxPLGAZs&U`0j8G@&vTk0zOqtSRK7f231c1sYrb6ndbKlAfa zu~4BKDYRmE128dIkECrE#3#agEySd{^{_q2&PCr$KR5v7itz!w7iUC@I}-*Z&zSPP zS@|V%Xxp*<3-|TUbGC=#q2Hwec+$`N=Az{YRYQlNmW}n%b-i!DVm%_3j@5A+id|CK z)W!6pyOb;T33NZS%GDJxY0Whi0L)cPcu?t>to@7_E^$((v%SV9=$7&R1lDt@wh(U) z5tZ>qFB<_7{*mFU`G$$~wKgB@j7n4))$9&qFAe}yc0o601?$$EbV}3fY+m@rYSE=8 zUWd}0YZ1Olr|OmP6c5%+!RsJgCfg_YR3h~7?v>5c2`my zP~Io73*e_-qhAIXIUGIUnpUK5uuY!%+s)m4ra+)g5K1*6meu+!;h+Hp+OBeU#0KqY z>6UW%e^?kj%paHaRK(7sye^hA>1qG zbQhzxESXg@I091v2V(rEB49`AGK-L>Er~y`fZ1Hj(VE+YkspKSoUHF*8!vlayb zsr$TQF`LQafjR}vic23@OlNYSj$$D(rned2<19L*U2cH9RMdqdpp<;C?ESLCq{pre z3`T`OHx_LtGnA=^2-gjWMvcpnNmJV`E9$b)&M!Mt&5CyvgQk)6kB~`qc?DSj#}b2^ zDBIX%cpijfAPH^=MD?KVLTmd5gL#WK6gVC4x^aJQEH{MUGT{TP}Vn%${6Ieu*` z<8l-wo5!%nR|D)52mXSNE!xtW96PtOoK3$V6ZxyB{$Z~pX2I7Q6AsH8goxgR$kcm)OWlOT{Ja46r2^#o^kn_r z>yW2>bJ5NMgvcfhZd#>t4jQhcL#_cT&As2Ii=;( zS(xVi&l~l(RbnR_lU`_J;#0)Bi?OaFilc5*2j>>8e}vwrqe#Y*;cBh%tGY~%x^*q< z@9=f{LY8Pvg=D+VbSSscbAOKp*Ni>zjk~!QPBjbinC@>E@|>-CFqKFmsk)~@xz6+E z4QI<7a(xSzZ9Q!;o767EWqvLiOhrxR5aQ9+az9)YXIH$d+(-VQPXCcHlhV0FRHyc+gf%D(`r8#$5y literal 0 HcmV?d00001 diff --git a/assets/images/tutorial_own_9.png b/assets/images/tutorial_own_9.png new file mode 100644 index 0000000000000000000000000000000000000000..11f8b419fbc043b7fa37316e65095c9a668489c2 GIT binary patch literal 9108 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 literal 0 HcmV?d00001 diff --git a/lib/cli.dart b/lib/cli.dart index 47554a2..cabfa19 100644 --- a/lib/cli.dart +++ b/lib/cli.dart @@ -19,11 +19,7 @@ late String dll; late FortniteVersion version; late bool autoRestart; -void main(List args){ - handleCLI(args); -} - -Future handleCLI(List args) async { +void main(List args) async { stdout.writeln("Reboot Launcher"); stdout.writeln("Wrote by Auties00"); stdout.writeln("Version 5.3"); diff --git a/lib/main.dart b/lib/main.dart index d620f64..9704854 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,7 +4,6 @@ import 'dart:io'; import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:bitsdojo_window_windows/bitsdojo_window_windows.dart' show WinDesktopWindow; -import 'package:dart_vlc/dart_vlc.dart'; import 'package:fluent_ui/fluent_ui.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; @@ -21,17 +20,10 @@ import 'package:window_manager/window_manager.dart'; final GlobalKey appKey = GlobalKey(); -void main(List args) async { +void main() async { await Directory(safeBinariesDirectory) .create(recursive: true); - if(args.isNotEmpty){ - handleCLI(args); - return; - } - WidgetsFlutterBinding.ensureInitialized(); - DartVLC.initialize(); - await SystemTheme.accentColor.load(); await GetStorage.init("game"); await GetStorage.init("server"); diff --git a/lib/src/controller/game_controller.dart b/lib/src/controller/game_controller.dart index 1eefe68..b036159 100644 --- a/lib/src/controller/game_controller.dart +++ b/lib/src/controller/game_controller.dart @@ -1,3 +1,4 @@ +import 'dart:collection'; import 'dart:convert'; import 'dart:io'; @@ -6,6 +7,7 @@ import 'package:fluent_ui/fluent_ui.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:reboot_launcher/src/model/fortnite_version.dart'; +import 'package:reboot_launcher/src/model/game_instance.dart'; import 'package:reboot_launcher/src/model/game_type.dart'; class GameController extends GetxController { @@ -15,11 +17,10 @@ class GameController extends GetxController { late final Rx> versions; late final Rxn _selectedVersion; late final Rx type; + late final HashMap gameInstancesMap; late final RxBool started; + late bool updated; Future? updater; - Process? gameProcess; - Process? launcherProcess; - Process? eacProcess; GameController() { _storage = GetStorage("game"); @@ -40,19 +41,22 @@ class GameController extends GetxController { type = Rx(GameType.values.elementAt(_storage.read("type") ?? 0)); type.listen((value) { _storage.write("type", value.index); - username.text = _storage.read("${type.value == GameType.client ? 'game' : 'host'}_username") ?? ""; + username.text = _readUsername(); }); - username = TextEditingController(text: _storage.read("${type.value == GameType.client ? 'game' : 'host'}_username") ?? ""); + username = TextEditingController(text: _readUsername()); username.addListener(() => _storage.write("${type.value == GameType.client ? 'game' : 'host'}_username", username.text)); + gameInstancesMap= HashMap(); + started = RxBool(false); + + updated = false; } - void kill() { - gameProcess?.kill(ProcessSignal.sigabrt); - launcherProcess?.kill(ProcessSignal.sigabrt); - eacProcess?.kill(ProcessSignal.sigabrt); + String _readUsername() { + var client = type.value == GameType.client; + return _storage.read("${client ? 'game' : 'host'}_username") ?? (client ? "" : "HostingServer"); } FortniteVersion? getVersionByName(String name) { @@ -86,6 +90,8 @@ class GameController extends GetxController { Rxn get selectedVersionObs => _selectedVersion; + GameInstance? get currentGameInstance => gameInstancesMap[type()]; + set selectedVersion(FortniteVersion? version) { _selectedVersion(version); _storage.write("version", version?.name); diff --git a/lib/src/controller/settings_controller.dart b/lib/src/controller/settings_controller.dart index 7b7bffc..87d5284 100644 --- a/lib/src/controller/settings_controller.dart +++ b/lib/src/controller/settings_controller.dart @@ -1,7 +1,7 @@ -import 'package:dart_vlc/dart_vlc.dart'; import 'package:fluent_ui/fluent_ui.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:reboot_launcher/src/model/tutorial_page.dart'; import 'package:reboot_launcher/src/util/os.dart'; import 'dart:ui'; @@ -13,11 +13,13 @@ class SettingsController extends GetxController { late final TextEditingController authDll; late final TextEditingController matchmakingIp; late final Rx displayType; + late final RxBool doNotAskAgain; + late Rx tutorialPage; late double width; late double height; late double? offsetX; late double? offsetY; - Player? player; + late double scrollingDistance; SettingsController() { _storage = GetStorage("settings"); @@ -31,11 +33,18 @@ class SettingsController extends GetxController { _storage.write("ip", text); }); + doNotAskAgain = RxBool(_storage.read("do_not_ask_again") ?? false); + doNotAskAgain.listen((value) => _storage.write("do_not_ask_again", value)); + width = _storage.read("width") ?? window.physicalSize.width; height = _storage.read("height") ?? window.physicalSize.height; offsetX = _storage.read("offset_x"); offsetY = _storage.read("offset_y"); displayType = Rx(PaneDisplayMode.top); + + scrollingDistance = 0.0; + + tutorialPage = Rx(TutorialPage.start); } TextEditingController _createController(String key, String name) { diff --git a/lib/src/dialog/dialog.dart b/lib/src/dialog/dialog.dart index 2786522..09bb183 100644 --- a/lib/src/dialog/dialog.dart +++ b/lib/src/dialog/dialog.dart @@ -29,7 +29,7 @@ class GenericDialog extends AbstractDialog { ), ContentDialog( - style: ContentDialogThemeData( + style: ContentDialogThemeData( padding: padding ?? const EdgeInsets.only(left: 20, right: 20, top: 15.0, bottom: 5.0) ), content: header, diff --git a/lib/src/dialog/server_dialogs.dart b/lib/src/dialog/server_dialogs.dart index 9b17554..38f18ef 100644 --- a/lib/src/dialog/server_dialogs.dart +++ b/lib/src/dialog/server_dialogs.dart @@ -1,6 +1,6 @@ import 'package:fluent_ui/fluent_ui.dart'; +import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; -import 'package:reboot_launcher/src/controller/game_controller.dart'; import 'package:reboot_launcher/src/controller/server_controller.dart'; import 'package:reboot_launcher/src/controller/settings_controller.dart'; import 'package:reboot_launcher/src/dialog/dialog.dart'; @@ -159,7 +159,7 @@ extension ServerControllerDialog on ServerController { builder: (context) => FutureBuilderDialog( future: Future.wait([ - pingSelf(port.text), + compute(pingSelf, port.text), Future.delayed(const Duration(seconds: 1)) ]), loadingMessage: "Pinging ${type().id} server...", diff --git a/lib/src/embedded/server.dart b/lib/src/embedded/server.dart index 2b8801c..131f3e5 100644 --- a/lib/src/embedded/server.dart +++ b/lib/src/embedded/server.dart @@ -105,7 +105,7 @@ Jaguar _createServer(String Function() ipQuery) { server.getJson("/fortnite/api/game/v2/privacy/account/:accountId", getPrivacy); server.postJson("/fortnite/api/game/v2/privacy/account/:accountId", postPrivacy); - return _addLoggingCapabilities(server); + return server; } Jaguar _createMatchmaker(){ var server = Jaguar(address: "127.0.0.1", port: 8080); diff --git a/lib/src/model/game_instance.dart b/lib/src/model/game_instance.dart new file mode 100644 index 0000000..521324c --- /dev/null +++ b/lib/src/model/game_instance.dart @@ -0,0 +1,15 @@ +import 'dart:io'; + +class GameInstance { + final Process gameProcess; + final Process? launcherProcess; + final Process? eacProcess; + + GameInstance(this.gameProcess, this.launcherProcess, this.eacProcess); + + void kill() { + gameProcess.kill(ProcessSignal.sigabrt); + launcherProcess?.kill(ProcessSignal.sigabrt); + eacProcess?.kill(ProcessSignal.sigabrt); + } +} diff --git a/lib/src/model/tutorial_page.dart b/lib/src/model/tutorial_page.dart new file mode 100644 index 0000000..f8ffbd9 --- /dev/null +++ b/lib/src/model/tutorial_page.dart @@ -0,0 +1,5 @@ +enum TutorialPage { + start, + someoneElse, + yourOwn +} \ No newline at end of file diff --git a/lib/src/page/home_page.dart b/lib/src/page/home_page.dart index 696f8e6..f213085 100644 --- a/lib/src/page/home_page.dart +++ b/lib/src/page/home_page.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:ui'; import 'package:bitsdojo_window/bitsdojo_window.dart' hide WindowBorder; @@ -18,6 +17,7 @@ import 'package:reboot_launcher/src/widget/os/window_buttons.dart'; import 'package:window_manager/window_manager.dart'; import '../controller/settings_controller.dart'; +import '../model/tutorial_page.dart'; import 'info_page.dart'; class HomePage extends StatefulWidget { @@ -31,7 +31,6 @@ class _HomePageState extends State with WindowListener { static const double _headerSize = 48.0; static const double _sectionSize = 100.0; static const double _defaultPadding = 12.0; - static const double _openMenuSize = 320.0; static const int _headerButtonCount = 3; static const int _sectionButtonCount = 4; @@ -45,6 +44,7 @@ class _HomePageState extends State with WindowListener { final Rxn> _searchItems = Rxn(); final RxBool _focused = RxBool(true); final RxInt _index = RxInt(0); + bool _navigated = false; bool _shouldMaximize = false; @@ -125,7 +125,11 @@ class _HomePageState extends State with WindowListener { child: Obx(() => Stack( children: [ _createNavigationView(), - _createTitleBar(), + if(_settingsController.displayType() == PaneDisplayMode.top) + Align( + alignment: Alignment.topRight, + child: WindowTitleBar(focused: _focused()) + ), if(_settingsController.displayType() == PaneDisplayMode.top) _createTopDisplayGestures(), if(_focused() && isWin11) @@ -161,49 +165,82 @@ class _HomePageState extends State with WindowListener { child: child ); - NavigationView _createNavigationView() => NavigationView( - paneBodyBuilder: (body) => _createPage(body), - pane: NavigationPane( - size: const NavigationPaneSize( - topHeight: _headerSize + NavigationView _createNavigationView() { + return NavigationView( + paneBodyBuilder: (body) => _createPage(body), + pane: NavigationPane( + size: const NavigationPaneSize( + topHeight: _headerSize + ), + selected: _selectedIndex, + onChanged: _onIndexChanged, + displayMode: _settingsController.displayType(), + items: _createItems(), + indicator: const EndNavigationIndicator(), + footerItems: _createFooterItems(), + header: _settingsController.displayType() != PaneDisplayMode.open ? null : const SizedBox(height: _defaultPadding), + autoSuggestBox: _createAutoSuggestBox(), + autoSuggestBoxReplacement: _settingsController.displayType() == PaneDisplayMode.top ? null : const Icon(FluentIcons.search), ), - selected: _selectedIndex, - onChanged: (index) { - _settingsController.player?.pause(); - _index.value = index; - }, - displayMode: _settingsController.displayType(), - indicator: const EndNavigationIndicator(), - items: _createItems(), - footerItems: _createFooterItems(), - header: _settingsController.displayType() != PaneDisplayMode.open ? null : const SizedBox(height: _defaultPadding), - autoSuggestBox: _settingsController.displayType() == PaneDisplayMode.top ? null : TextBox( - key: _searchKey, - controller: _searchController, - placeholder: 'Search', - focusNode: _searchFocusNode - ), - autoSuggestBoxReplacement: _settingsController.displayType() == PaneDisplayMode.top ? null : const Icon(FluentIcons.search), - ), - onOpenSearch: () => _searchFocusNode.requestFocus(), - transitionBuilder: _settingsController.displayType() == PaneDisplayMode.top ? null : (child, animation) => child - ); + onOpenSearch: () => _searchFocusNode.requestFocus(), + transitionBuilder: _settingsController.displayType() == PaneDisplayMode.top ? null : (child, animation) => child + ); + } - RenderObjectWidget _createPage(Widget? body) => Padding( - padding: _createPagePadding(), - child: body - ); + void _onIndexChanged(int index) { + _index.value = index; + _navigated = true; + } - EdgeInsets _createPagePadding() { + TextBox? _createAutoSuggestBox() { if (_settingsController.displayType() == PaneDisplayMode.top) { - return const EdgeInsets.all(_defaultPadding); + return null; } - return const EdgeInsets.only( - top: 32, - left: _defaultPadding, - right: _defaultPadding, - bottom: _defaultPadding + return TextBox( + key: _searchKey, + controller: _searchController, + placeholder: 'Search', + focusNode: _searchFocusNode + ); + } + + RenderObjectWidget _createPage(Widget? body) { + if(_settingsController.displayType() == PaneDisplayMode.top){ + return Padding( + padding: const EdgeInsets.all(_defaultPadding), + child: body + ); + } + + return Column( + children: [ + Row( + children: [ + Expanded( + child: _createWindowGestures( + child: Container( + height: _headerSize, + color: Colors.transparent + ) + ) + ), + + WindowTitleBar(focused: _focused()) + ], + ), + + Expanded( + child: Padding( + padding: const EdgeInsets.only( + left: _defaultPadding, + right: _defaultPadding, + bottom: _defaultPadding + ), + child: body + ) + ) + ], ); } @@ -232,7 +269,8 @@ class _HomePageState extends State with WindowListener { PaneItem( title: const Text("Tutorial"), icon: const Icon(FluentIcons.info), - body: const InfoPage() + body: const InfoPage(), + onTap: _onTutorial ) ]; @@ -259,10 +297,22 @@ class _HomePageState extends State with WindowListener { PaneItem( title: const Text("Tutorial"), icon: const Icon(FluentIcons.info), - body: const InfoPage() + body: const InfoPage(), + onTap: _onTutorial ) ]; + void _onTutorial() { + if(!_navigated){ + setState(() { + _settingsController.tutorialPage.value = TutorialPage.start; + _settingsController.scrollingDistance = 0; + }); + } + + _navigated = false; + } + bool _calculateSize() { WidgetsBinding.instance.addPostFrameCallback((_) { _settingsController.saveWindowSize(); @@ -288,35 +338,5 @@ class _HomePageState extends State with WindowListener { return true; } - Widget _createTitleBar() => Align( - alignment: Alignment.topRight, - child: _createTitleBarContent(), - ); - - Widget _createTitleBarContent() { - if(_settingsController.displayType() == PaneDisplayMode.top) { - return WindowTitleBar(focused: _focused()); - } - - return Row( - children: [ - SizedBox( - width: _settingsController.displayType() == PaneDisplayMode.open ? _openMenuSize : _headerSize, - height: _headerSize - ), - - Expanded( - child: _createWindowGestures( - child: Container( - height: _headerSize, - color: Colors.transparent - ) - ) - ), - WindowTitleBar(focused: _focused()) - ], - ); - } - String get searchValue => _searchController.text; } diff --git a/lib/src/page/info_page.dart b/lib/src/page/info_page.dart index 1222ddd..b98b0f5 100644 --- a/lib/src/page/info_page.dart +++ b/lib/src/page/info_page.dart @@ -1,11 +1,9 @@ - -import 'package:dart_vlc/dart_vlc.dart'; -import 'package:fluent_ui/fluent_ui.dart' hide Card; +import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../controller/settings_controller.dart'; +import '../model/tutorial_page.dart'; class InfoPage extends StatefulWidget { const InfoPage({Key? key}) : super(key: key); @@ -15,36 +13,149 @@ class InfoPage extends StatefulWidget { } class _InfoPageState extends State { + final List _elseTitles = [ + "Open the settings tab", + "Type the ip address of the host, including the port if it's not 7777\n The complete address should follow the schema ip:port", + "Open the home page", + "Type your username if you haven't already", + "Select the exact version that the host is using from the dropdown menu\n If necessary, install it using the download button", + "As you want to play, select client from the dropdown menu", + "Click launch to open the game", + "Once you are in game, click PLAY to enter in-game\n If this doesn't work open the Fortnite console by clicking the button above tab\n If nothing happens, make sure that your keyboard locale is set to English\n Type 'open TYPE_THE_IP' without the quotes, for example: open 85.182.12.1" + ]; + final List _ownTitles = [ + "Open the settings tab", + "Type 127.0.0.1 as the matchmaking host", + "Open the home page", + "Type your username if you haven't already", + "Select the version you want to host\n If necessary, install it using the download button", + "As you want to host, select Headless Server from the dropdown menu\n If the headless server doesn't work for your version, use the normal server instead", + "Click launch to start the server and wait until the Reboot GUI shows up", + "To allow your friends to join your server, follow the instructions on playit.gg\n If you are an advanced user, open port 7777 on your router\n Finally, share your playit ip or public IPv4 address with your friends\n If you just want to play by yourself, skip this step", + "When you want to start the game, click on the 'Start Bus Countdown' button", + "If you also want to play, start a client by selecting Client from the dropdown menu\n Don't close or open again the launcher, use the same window", + "Click launch to open the game", + "Once you are in game, click PLAY to enter in-game\n If this doesn't work open the Fortnite console by clicking the button above tab\n If nothing happens, make sure that your keyboard locale is set to English\n Type 'open TYPE_THE_IP' without the quotes, for example: open 85.182.12.1" + ]; + final SettingsController _settingsController = Get.find(); + late final ScrollController _controller; @override void initState() { - if(_settingsController.player == null){ - var player = Player(id: 1); - player.open( - Media.network("https://cdn.discordapp.com/attachments/1006260074416701450/1038844107986055190/tutorial.mp4") - ); - _settingsController.player = player; - } - - _settingsController.player?.play(); + _controller = ScrollController(initialScrollOffset: _settingsController.scrollingDistance); + _controller.addListener(() { + _settingsController.scrollingDistance = _controller.offset; + }); super.initState(); } + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return SizedBox( - width: double.infinity, - height: double.infinity, - child: Card( - child: Video( - player: _settingsController.player, - height: MediaQuery.of(context).size.height * 0.85, - width: MediaQuery.of(context).size.width * 0.90, - scale: 1.0, - showControls: true, + switch(_settingsController.tutorialPage()) { + case TutorialPage.start: + return _createHomeScreen(); + case TutorialPage.someoneElse: + return _createInstructions(false); + case TutorialPage.yourOwn: + return _createInstructions(true); + } + } + + SizedBox _createInstructions(bool own) { + var titles = own ? _ownTitles : _elseTitles; + var codeName = own ? "own" : "else"; + return SizedBox.expand( + child: ListView.separated( + controller: _controller, + itemBuilder: (context, index) => Padding( + padding: const EdgeInsets.only( + right: 20.0 + ), + child: Card( + borderRadius: const BorderRadius.all(Radius.circular(12.0)), + child: ListTile( + title: SelectableText("${index + 1}. ${titles[index]}"), + subtitle: Padding( + padding: const EdgeInsets.only(top: 12.0), + child: Image.asset("assets/images/tutorial_${codeName}_${index + 1}.png"), + ) + ) + ), + ), + separatorBuilder: (context, index) => const SizedBox(height: 8.0), + itemCount: titles.length, ) - ), + ); + } + + Widget _createHomeScreen() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _createCardWidget( + text: "Play on someone else's server", + description: "If one of your friends is hosting a game server, click here", + onClick: () => setState(() => _settingsController.tutorialPage.value = TutorialPage.someoneElse) + ), + + const SizedBox( + width: 8.0, + ), + + _createCardWidget( + text: "Host your own server", + description: "If you want to create your own server to invite your friends or to play around by yourself, click here", + onClick: () => setState(() => _settingsController.tutorialPage.value = TutorialPage.yourOwn) + ) + ] + ); + } + + Widget _createCardWidget({required String text, required String description, required Function() onClick}) { + return Expanded( + child: SizedBox( + height: double.infinity, + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: onClick, + child: Card( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + text, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold + ), + ), + + const SizedBox( + height: 8.0, + ), + + Text( + description, + textAlign: TextAlign.center + ), + ], + ) + ) + ) + ) + ) + ) ); } } \ No newline at end of file diff --git a/lib/src/page/launcher_page.dart b/lib/src/page/launcher_page.dart index 080ec43..a17cbe2 100644 --- a/lib/src/page/launcher_page.dart +++ b/lib/src/page/launcher_page.dart @@ -1,4 +1,6 @@ +import 'dart:async'; + import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; @@ -30,7 +32,8 @@ class _LauncherPageState extends State { void initState() { if(_gameController.updater == null){ _gameController.updater = compute(downloadRebootDll, _updateTime) - ..then((value) => _updateTime = value); + ..then((value) => _updateTime = value) + ..then((value) => _gameController.updated = true); _buildController.cancelledDownload .listen((value) => value ? _onCancelWarning() : {}); } @@ -65,7 +68,7 @@ class _LauncherPageState extends State { return FutureBuilder( future: _gameController.updater ?? Future.value(true), builder: (context, snapshot) { - if (!snapshot.hasData && !snapshot.hasError) { + if (!_gameController.updated && !snapshot.hasData && !snapshot.hasError) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/lib/src/page/settings_page.dart b/lib/src/page/settings_page.dart index 9c736c5..16661de 100644 --- a/lib/src/page/settings_page.dart +++ b/lib/src/page/settings_page.dart @@ -4,6 +4,7 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:reboot_launcher/src/controller/server_controller.dart'; import 'package:reboot_launcher/src/controller/settings_controller.dart'; +import 'package:reboot_launcher/src/dialog/snackbar.dart'; import 'package:reboot_launcher/src/model/server_type.dart'; import 'package:reboot_launcher/src/widget/shared/smart_switch.dart'; @@ -24,17 +25,16 @@ class SettingsPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Tooltip( - message: "The hostname of the server that hosts the multiplayer matches", - child: Obx(() => SmartInput( - label: "Matchmaking Host", - placeholder: - "Type the hostname of the server that hosts the multiplayer matches", - controller: _settingsController.matchmakingIp, - validatorMode: AutovalidateMode.always, - validator: checkMatchmaking, - enabled: _serverController.type() == ServerType.embedded - )) - ), + message: + "The hostname of the server that hosts the multiplayer matches", + child: Obx(() => SmartInput( + label: "Matchmaking Host", + placeholder: + "Type the hostname of the server that hosts the multiplayer matches", + controller: _settingsController.matchmakingIp, + validatorMode: AutovalidateMode.always, + validator: checkMatchmaking, + enabled: _serverController.type() == ServerType.embedded))), Tooltip( message: "The dll that is injected when a server is launched", child: FileSelector( @@ -63,13 +63,25 @@ class SettingsPage extends StatelessWidget { message: "The dll that is injected to make the game work", child: FileSelector( label: "Cranium DLL", - placeholder: "Type the path to the dll used for authentication", + placeholder: + "Type the path to the dll used for authentication", controller: _settingsController.authDll, windowTitle: "Select a dll", folder: false, extension: "dll", validator: checkDll, - validatorMode: AutovalidateMode.always)) + validatorMode: AutovalidateMode.always)), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("Version Status"), + const SizedBox(height: 6.0), + Button( + child: const Text("6.0${kDebugMode ? '-DEBUG' : '-RELEASE'}"), + onPressed: () => showMessage("What a nice launcher") + ) + ], + ) ]); } } diff --git a/lib/src/util/future.dart b/lib/src/util/future.dart deleted file mode 100644 index b7e96c8..0000000 --- a/lib/src/util/future.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'dart:async'; - -extension FutureExtension on Future { - bool isCompleted() { - final completer = Completer(); - then(completer.complete).catchError(completer.completeError); - return completer.isCompleted; - } -} \ No newline at end of file diff --git a/lib/src/widget/home/game_type_selector.dart b/lib/src/widget/home/game_type_selector.dart index baabba7..df05b6f 100644 --- a/lib/src/widget/home/game_type_selector.dart +++ b/lib/src/widget/home/game_type_selector.dart @@ -35,7 +35,10 @@ class GameTypeSelector extends StatelessWidget { child: Text(type.name) ) ), - onPressed: () => _gameController.type(type) + onPressed: () { + _gameController.type(type); + _gameController.started.value = _gameController.currentGameInstance != null; + } ); } } diff --git a/lib/src/widget/home/launch_button.dart b/lib/src/widget/home/launch_button.dart index 9ea4ced..548489f 100644 --- a/lib/src/widget/home/launch_button.dart +++ b/lib/src/widget/home/launch_button.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:io'; -import 'package:async/async.dart'; import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; @@ -11,6 +10,7 @@ import 'package:reboot_launcher/src/controller/server_controller.dart'; import 'package:reboot_launcher/src/dialog/dialog.dart'; import 'package:reboot_launcher/src/dialog/game_dialogs.dart'; import 'package:reboot_launcher/src/dialog/server_dialogs.dart'; +import 'package:reboot_launcher/src/model/fortnite_version.dart'; import 'package:reboot_launcher/src/model/game_type.dart'; import 'package:reboot_launcher/src/model/server_type.dart'; import 'package:reboot_launcher/src/util/os.dart'; @@ -21,9 +21,12 @@ import 'package:reboot_launcher/src/util/server.dart'; import 'package:win32_suspend_process/win32_suspend_process.dart'; import 'package:path/path.dart' as path; -import '../../../main.dart'; -import '../../controller/settings_controller.dart'; -import '../../dialog/snackbar.dart'; +import 'package:reboot_launcher/src/../main.dart'; +import 'package:reboot_launcher/src/controller/settings_controller.dart'; +import 'package:reboot_launcher/src/dialog/snackbar.dart'; +import 'package:reboot_launcher/src/model/game_instance.dart'; + +import '../shared/smart_check_box.dart'; class LaunchButton extends StatefulWidget { const LaunchButton( @@ -35,6 +38,7 @@ class LaunchButton extends StatefulWidget { } class _LaunchButtonState extends State { + final String _shutdownLine = "FOnlineSubsystemGoogleCommon::Shutdown()"; final List _errorStrings = [ "port 3551 failed: Connection refused", "Unable to login to Fortnite servers", @@ -43,7 +47,6 @@ class _LaunchButtonState extends State { "UOnlineAccountCommon::ForceLogout" ]; - final GameController _gameController = Get.find(); final ServerController _serverController = Get.find(); final SettingsController _settingsController = Get.find(); @@ -76,83 +79,180 @@ class _LaunchButtonState extends State { void _onPressed() async { if (_gameController.started()) { - _onStop(); - return; - } - - if (_gameController.username.text.isEmpty && _gameController.type() != GameType.client) { - showMessage("Missing username"); - _gameController.started.value = false; + _onStop(_gameController.type()); return; } _gameController.started.value = true; - if (_gameController.selectedVersionObs.value == null) { - showMessage("No version is selected"); - _gameController.started.value = false; - return; + if (_gameController.username.text.isEmpty) { + if(_serverController.type() != ServerType.local){ + showMessage("Missing username"); + _onStop(_gameController.type()); + return; + } + + showMessage("No username: expecting self sign in"); } + if (_gameController.selectedVersionObs.value == null) { + showMessage("No version is selected"); + _onStop(_gameController.type()); + return; + } + try { + await _resetLogFile(); + var version = _gameController.selectedVersionObs.value!; var gamePath = version.executable?.path; if(gamePath == null){ - _onError("${version.location.path} no longer contains a Fortnite executable, did you delete or move it?", null); - _onStop(); + _onError("${version.location.path} no longer contains a Fortnite executable, did you delete it?", null); + _onStop(_gameController.type()); return; } - - if (version.launcher != null) { - _gameController.launcherProcess = await Process.start(version.launcher!.path, []); - Win32Process(_gameController.launcherProcess!.pid).suspend(); - } - - if (version.eacExecutable != null) { - _gameController.eacProcess = await Process.start(version.eacExecutable!.path, []); - Win32Process(_gameController.eacProcess!.pid).suspend(); - } - - var result = await _serverController.start( - required: true, - askPortKill: false, - ); + + var result = await _serverController.start(required: true, askPortKill: false); if(!result){ showMessage("Cannot launch the game as the backend didn't start up correctly"); - _onStop(); + _onStop(_gameController.type()); return; } - if(_logFile != null && await _logFile!.exists()){ - await _logFile!.delete(); - } - await compute(patchMatchmaking, version.executable!); await compute(patchHeadless, version.executable!); - var headlessHosting = _gameController.type() == GameType.headlessServer; - var arguments = createRebootArgs(_gameController.username.text, _gameController.type.value); - _gameController.gameProcess = await Process.start(gamePath, arguments) - ..exitCode.then((_) => _onEnd()) - ..outLines.forEach((line) => _onGameOutput(line)) - ..errLines.forEach((line) => _onGameOutput(line)); - _injectOrShowError(Injectable.cranium); - if(headlessHosting){ + await _startMatchMakingServer(); + await _startGameProcesses(version, _gameController.type()); + + if(_gameController.type() == GameType.headlessServer){ await _showServerLaunchingWarning(); } } catch (exception, stacktrace) { _closeDialogIfOpen(false); _onError(exception, stacktrace); - _onStop(); + _onStop(_gameController.type()); } } - void _onEnd() { + Future _startGameProcesses(FortniteVersion version, GameType type) async { + var launcherProcess = await _createLauncherProcess(version); + var eacProcess = await _createEacProcess(version); + var gameProcess = await _createGameProcess(version.executable!.path, type); + _gameController.gameInstancesMap[type] = GameInstance(gameProcess, launcherProcess, eacProcess); + _injectOrShowError(Injectable.cranium, type); + } + + Future _startMatchMakingServer() async { + if(_gameController.type() != GameType.client || _settingsController.doNotAskAgain()){ + return; + } + + var matchmakingIp = _settingsController.matchmakingIp.text; + if(!matchmakingIp.contains("127.0.0.1") && !matchmakingIp.contains("localhost")) { + return; + } + + var headlessServer = _gameController.gameInstancesMap[GameType.headlessServer] != null; + var server = _gameController.gameInstancesMap[GameType.server] != null; + if(headlessServer || server){ + return; + } + + var controller = CheckboxController(); + var result = await showDialog( + context: context, + builder: (context) => ContentDialog( + content: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + width: double.infinity, + child: Text( + "The matchmaking ip is set to the local machine, but no server is running. " + "If you want to start a match for your friends or just test out Reboot, you need to start a server, either now from this prompt or later manually.", + textAlign: TextAlign.start, + ) + ), + + const SizedBox(height: 12.0), + + SmartCheckBox( + controller: controller, + content: const Text("Don't ask again") + ) + ], + ), + actions: [ + Button( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('Ignore'), + ), + FilledButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('Start a server'), + ) + ], + ) + ) ?? false; + _settingsController.doNotAskAgain.value = controller.value; + + if(!result){ + return; + } + + var version = _gameController.selectedVersionObs.value!; + _startGameProcesses( + version, + GameType.headlessServer + ); + } + + Future _createGameProcess(String gamePath, GameType type) async { + var gameProcess = await Process.start(gamePath, createRebootArgs(_gameController.username.text, type)); + gameProcess + ..exitCode.then((_) => _onEnd(type)) + ..outLines.forEach((line) => _onGameOutput(line, type)) + ..errLines.forEach((line) => _onGameOutput(line, type)); + return gameProcess; + } + + Future _resetLogFile() async { + if(_logFile != null && await _logFile!.exists()){ + await _logFile!.delete(); + } + } + + Future _createLauncherProcess(FortniteVersion version) async { + var launcherFile = version.launcher; + if (launcherFile == null) { + return null; + } + + var launcherProcess = await Process.start(launcherFile.path, []); + Win32Process(launcherProcess.pid).suspend(); + return launcherProcess; + } + + Future _createEacProcess(FortniteVersion version) async { + var eacFile = version.eacExecutable; + if (eacFile == null) { + return null; + } + + var eacProcess = await Process.start(eacFile.path, []); + Win32Process(eacProcess.pid).suspend(); + return eacProcess; + } + + void _onEnd(GameType type) { if(_fail){ return; } _closeDialogIfOpen(false); - _onStop(); + _onStop(type); } void _closeDialogIfOpen(bool success) { @@ -169,27 +269,24 @@ class _LaunchButtonState extends State { context: appKey.currentContext!, builder: (context) => ProgressDialog( text: "Launching headless server...", - onStop: () { - Navigator.of(context).pop(false); - _onStop(); - } + onStop: () =>_onEnd(_gameController.type()) ) - ); + ) ?? false; - if(result != null && result){ + if(result){ return; } - _onStop(); + _onStop(_gameController.type()); } - void _onGameOutput(String line) { + void _onGameOutput(String line, GameType type) { if(_logFile != null){ _logFile!.writeAsString("$line\n", mode: FileMode.append); } - if (line.contains("FOnlineSubsystemGoogleCommon::Shutdown()")) { - _onStop(); + if (line.contains(_shutdownLine)) { + _onStop(type); return; } @@ -205,14 +302,14 @@ class _LaunchButtonState extends State { } if(line.contains("Region ")){ - if(_gameController.type.value == GameType.client){ - _injectOrShowError(Injectable.console); + if(type == GameType.client){ + _injectOrShowError(Injectable.console, type); }else { - _injectOrShowError(Injectable.reboot) + _injectOrShowError(Injectable.reboot, type) .then((value) => _closeDialogIfOpen(true)); } - _injectOrShowError(Injectable.memoryFix); + _injectOrShowError(Injectable.memoryFix, type); } } @@ -239,13 +336,16 @@ class _LaunchButtonState extends State { ); } - void _onStop() { - _gameController.started.value = false; - _gameController.kill(); + void _onStop(GameType type) { + _gameController.gameInstancesMap[type]?.kill(); + _gameController.gameInstancesMap.remove(type); + if(type == _gameController.type()) { + _gameController.started.value = false; + } } - Future _injectOrShowError(Injectable injectable) async { - var gameProcess = _gameController.gameProcess; + Future _injectOrShowError(Injectable injectable, GameType type) async { + var gameProcess = _gameController.gameInstancesMap[type]?.gameProcess; if (gameProcess == null) { return; } @@ -255,25 +355,19 @@ class _LaunchButtonState extends State { if(!dllPath.existsSync()) { await _downloadMissingDll(injectable); if(!dllPath.existsSync()){ - _onDllFail(dllPath); + _onDllFail(dllPath, type); return; } } await injectDll(gameProcess.pid, dllPath.path); } catch (exception) { - showSnackbar( - appKey.currentContext!, - Snackbar( - content: Text("Cannot inject $injectable.dll: $exception", textAlign: TextAlign.center), - extended: true - ) - ); - _onStop(); + showMessage("Cannot inject $injectable.dll: $exception"); + _onStop(type); } } - void _onDllFail(File dllPath) { + void _onDllFail(File dllPath, GameType type) { WidgetsBinding.instance.addPostFrameCallback((_) { if(_fail){ return; @@ -282,7 +376,7 @@ class _LaunchButtonState extends State { _fail = true; _closeDialogIfOpen(false); showMissingDllError(path.basename(dllPath.path)); - _onStop(); + _onStop(type); }); } diff --git a/lib/src/widget/home/version_selector.dart b/lib/src/widget/home/version_selector.dart index 6bb58ec..9904d73 100644 --- a/lib/src/widget/home/version_selector.dart +++ b/lib/src/widget/home/version_selector.dart @@ -12,8 +12,8 @@ import 'package:reboot_launcher/src/dialog/add_local_version.dart'; import 'package:reboot_launcher/src/widget/shared/smart_check_box.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../../dialog/add_server_version.dart'; -import '../../util/checks.dart'; +import 'package:reboot_launcher/src/dialog/add_server_version.dart'; +import 'package:reboot_launcher/src/util/checks.dart'; import '../shared/file_selector.dart'; class VersionSelector extends StatefulWidget { diff --git a/lib/src/widget/shared/file_selector.dart b/lib/src/widget/shared/file_selector.dart index d6e65b7..eac22e9 100644 --- a/lib/src/widget/shared/file_selector.dart +++ b/lib/src/widget/shared/file_selector.dart @@ -6,7 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; import 'package:reboot_launcher/src/dialog/snackbar.dart'; -import '../../util/selector.dart'; +import 'package:reboot_launcher/src/util/selector.dart'; class FileSelector extends StatefulWidget { final String label; diff --git a/pubspec.yaml b/pubspec.yaml index 7d10aea..8591219 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: reboot_launcher description: Launcher for project reboot -version: "5.4.0" +version: "6.0.0" publish_to: 'none' @@ -13,7 +13,7 @@ dependencies: bitsdojo_window: path: ./dependencies/bitsdojo_window-0.1.5 - fluent_ui: ^4.0.3+1 + fluent_ui: ^4.1.3 bitsdojo_window_windows: ^0.1.5 system_theme: ^2.0.0 http: ^0.13.5 @@ -41,7 +41,6 @@ dependencies: jaguar: ^3.1.3 hex: ^0.2.0 uuid: ^3.0.6 - dart_vlc: ^0.4.0 dependency_overrides: win32: ^3.0.0 @@ -67,7 +66,7 @@ msix_config: display_name: Reboot Launcher publisher_display_name: Auties00 identity_name: 31868Auties00.RebootLauncher - msix_version: 5.4.0.0 + msix_version: 6.0.0.0 publisher: CN=E6CD08C6-DECF-4034-A3EB-2D5FA2CA8029 logo_path: ./assets/icons/reboot.ico architecture: x64 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index e8dc4a7..731d46f 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,7 +7,6 @@ #include "generated_plugin_registrant.h" #include -#include #include #include #include @@ -16,8 +15,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { BitsdojoWindowPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("BitsdojoWindowPlugin")); - DartVlcPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("DartVlcPlugin")); ScreenRetrieverPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); SystemThemePluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index bf449aa..7993f64 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,7 +4,6 @@ list(APPEND FLUTTER_PLUGIN_LIST bitsdojo_window_windows - dart_vlc screen_retriever system_theme url_launcher_windows diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 85c23db..c24283a 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -13,13 +13,37 @@ auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP); #include #include +bool CheckOneInstance() +{ + HANDLE m_hStartEvent = CreateEventW( NULL, FALSE, FALSE, L"reboot_launcher"); + if(m_hStartEvent == NULL) + { + CloseHandle( m_hStartEvent ); + return false; + } + + if (GetLastError() == ERROR_ALREADY_EXISTS) + { + CloseHandle( m_hStartEvent ); + m_hStartEvent = NULL; + return false; + } + + return true; +} + int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, _In_ wchar_t *command_line, _In_ int show_command) { - std::vector command_line_arguments = GetCommandLineArguments(); - if (!command_line_arguments.empty() || (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent())) { - CreateAndAttachConsole(); + if(!CheckOneInstance()){ + return false; } + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + std::vector command_line_arguments = GetCommandLineArguments(); + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } // Initialize COM, so that it is available for use in the library and/or // plugins. @@ -44,6 +68,5 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, } ::CoUninitialize(); - std::cout << "Done" << std::endl; return EXIT_SUCCESS; }