From 0a05bf41e7d0e8bcfc605d4c821328e95e65bc81 Mon Sep 17 00:00:00 2001 From: Levi Date: Wed, 15 Nov 2023 16:26:29 +0800 Subject: [PATCH] fix: incorrect storage path in linux (#270) --- .github/workflows/build.yml | 139 ++++++++++-------- ui/flutter/assets/icon/icon_512.png | Bin 0 -> 33633 bytes .../app/controllers/app_controller.dart | 13 +- ui/flutter/lib/core/libgopeed_boot.dart | 2 - ui/flutter/lib/main.dart | 8 +- ui/flutter/lib/util/log_util.dart | 20 ++- ui/flutter/lib/util/util.dart | 16 +- .../linux/com.gopeed.Gopeed.metainfo.xml | 41 ++++++ ui/flutter/linux/gopeed.desktop | 10 ++ 9 files changed, 164 insertions(+), 85 deletions(-) create mode 100644 ui/flutter/assets/icon/icon_512.png create mode 100644 ui/flutter/linux/com.gopeed.Gopeed.metainfo.xml create mode 100644 ui/flutter/linux/gopeed.desktop diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4b805de2..c2cefe34 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,10 @@ on: description: 'Build platform' required: true default: 'all' + channel: + description: 'Snap channel' + required: true + default: 'stable' env: GO_VERSION: "1.19" @@ -208,7 +212,7 @@ jobs: overwrite: true build-linux: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'linux' }} - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 needs: [ get-release ] steps: - uses: actions/checkout@v3 @@ -221,10 +225,6 @@ jobs: - run: | sudo apt-get update -y sudo apt-get install -y ninja-build libgtk-3-dev libayatana-appindicator3-dev - - name: Setup LXD - uses: canonical/setup-lxd@v0.1.1 - with: - channel: latest/stable - name: Build env: VERSION: ${{ needs.get-release.outputs.tag_name }} @@ -237,41 +237,45 @@ jobs: # Build portable tar -C build/linux/x64/release/bundle -czaf build/dist/Gopeed-$VERSION-linux-amd64-portable.tar.gz ./ - # Build deb package - mkdir -p debian/gui - cp assets/icon/icon_1024.png debian/gui/gopeed.png - cat>debian/debian.yaml<debian/gui/gopeed.desktop<debian/gopeed/DEBIAN/postinst<debian/gopeed/DEBIAN/postrm<debian/gopeed/DEBIAN/control<snap/snapcraft.yaml<snap/gui/gopeed.desktop<fM2u*bb985|~003~56kojt03`5NBme^q{Bi0zeGUGAxV%=70jkHScfb!Q zmeOj{0Prmi>-Ie=`1y&WqP`0NU=ciiLjufA696FST}SUG;N_QW{p%Pz_L+QjgCO2qVJPOw9oDH zpX@&5v^qRtv3PI!vD8=6oUio)hrYEAk>i7Ch7*FjKYnch&ppwg0z&==o_9Tw#vhX! z2&UpHu8R6p#N#j(i{&E~DlVIf3(7Fd{nN#Ztq&IzwOBT8{Iy^EhWPg3WyZyru17HI zF2Qez)6||xJpHqmWOma5uVmY2(shzsfH-khXf8we_TTF2#2}&q%scrnX~F{NfFdCj zP-p*MPkd{PpdN|REMigKv?HE0WQ(0sb?qMY4H0v$5xJUv>pH5|i}&dpf?Z9n-!>ek zcC_H8tLt{}BA_iELFR~^mq96{wCH#9R8*K`4YAdgA9{ILy%{N4%H;02UJyV==bhug z9?31C#WBGVgdC82$!W2+j=a{n4!uMyFn7nuu6^rgbcib`Z^h1be=T63#hX{)9m^LM zi~(5DV*tSGchiYlUb_A!-^}`8goUT)W&%s{u8Vf!E4GD~{_GPIjU;~d`Q-25nB zr%=ZM7hgl&6q_RlE+Xll>PKrd71f{4i~_pnXDB}8Ct|R{_P5n6USkK|)%H|a9-&$*ya{ZS{`(i^Q7w)~$T7U(& zJoq8U%$0i;@Z_MEDiWLcGT>Lf@2G>Kf&zpdrW7X8cH)D^j-vb2)Q zrQU%%@rf7@LSx;81c!=6eVT)9F9AB&Q^AuX$3McttD7hywwgr5Wucb_3$*BH1ydKp zzNY$&L7{PdWWFh$GlUE7vm>+uo0^BrK$jCe09-~VxG03y-zM_Y^zW~iD{J(XE_cA) z^mN#Gv3l4%_RIJLu3AbyFkt{5A;u zDm<6hF3hH`hBo?)Lf~p zn2$*jo9uTzw3x}tb~BBCFiC37-Y%%8VKQX9svrmk8!_*T-)6^~-?kVCq*vb)aM+00$1 z*NIA3Hv=yAV_fglL+n@7ixr_uiD_5GQ1(d>%Zvbv}*_ouPXaS zTZ0oEhRTgi5S!|BQ`e3Ly-Nu$GM*oyX^~%t()$NLca*kOSP$*RYMkUAh~ zC0LrLHq-ZPB~rcS6=N%WbSE$qIsP6WkP_7n<)mHu@@Z34SG%La%0P$_kI_$&n;QF& z4+6(|OX74?q9Z}zFxFX_^DwD>$IOXkf)?)%F8tGMy}ZruCfELkcY4ncM)i*Lv)l3) z?zkekQatNu58^{YNE&+s+t+jqqZKz}Z!PVt096FPm&YL=^am6GCXvYC*7HFf+s&?p zi0irZkbL>Y`4g*L+dX7+%H}WhU!&rPzq6b9DC(L_xZY)`)%e~Xh+VV?7s!sUg1ZN| zc>OfaHahMox7v*{`{A0yG4@o{Z|<*)Ne~&toX;t3M%a|zEMC|8C@_rfckB%Z>u!|B zMRx5=PZFsi1^}8&b$pA@`SA6P-jxK-i4nq}j>V|U_WJu%x{^zVD5nl680cKu`23}G zQ_}oGK92o+`PbNq!ogpW6|^6|o~@+`Bi_?JT{#*id+42~_jJVUvs1`M@*jN&0ruMz zC)1f^kAdRSilGnOux4i){X;frkqiJRd7Rwx!o4F!joKFM1u#b%ob4oSKK#I=cU+@K zM;eKk-xG%gWQrqp^zWE!(qaH5(18*^_O3Yv`-Ryv_qB5AkVgnRjcs`FOgwSqh{QmV z5$q>7OgVaeKT!7^2Hk$otAhzb1+?)9W^@5XE2&{%6IrIOd!O%l|6%Gz)swRcJ02ecpl6Vm5aIiJ%F-c?eb8CCYa`haI6spr?t}-Z zZ@G*Kv4dn8z=f;>8+#JZh!Z`~CfZa`77ll+}GU8>a4nAc(Dl%uP*$W7v z$^k8YAb>udv)2Ll8CqAi*g2U(*N8*qh6r0=0INS7`%PbK3U}*GPssn?9w|L&)dzzN4t z;J`plJD_Z5m)^frc;+pLZ<)o|6$rq_y>c!b`rPS!D^`l;f`jW2{Z zTK&B?8;?GiHB(tWhau?FGuhW$oYv#vcClEy0X2=GAIzJSA{PgQLTk%a6+^}!{mXdC z4y89Gp#QWC^)+ulIWWiFE6-RY)qVi*fsG~v2c_7E_H-_#*GD1s0~gM$5%l<~AMsqY zl)2r_zb~>@#DCKcRH4hX@vV(Ip7fjo*#am%ji?`c;ZCoUXV z8@MQd$h!?650j0IYlrA?rx=b6qCQtifI21()fdJnbRYp2J-;kPm-x=qgrbiLks@uq zZ{A}}IJdl&(%KG_@6fW+Gi#v(Vl^g+`A%fb;@|C`8$WpLo7#!*NKn7bs>cV+%k!~* z`AW~tNKz1-m@yyFx6%Q-s#tqPJCqJozQc{}bTDdRYbD1g-!YJ&9Q?OuylTm2XQgXB ztuf*GhPtG?=g3{G+Lyk8zDfVeNY4DOlUlyt;!Sl1|AEY-fDBPcIE?64l;6z{;APwD z^(Abe17~jxUkyYWoMhP``s=tegt?ngC~!g4ru%wBDh0~TyVtrYt<3}Ia|h^vBKd^2 zqdk-GM!bF|YZqbJ|$@qomg!%tEvg0NWc6`!rih^Qcy_&`vu zvPx4LGMiI2+nWTASm6~KYnX>$0vLMh|BAG(DcH9_D(;JTz5Rg z+0II*(AQN1RYA)@#`g0#-Sp0p7#zTIYhW`g+d>DdOB*8djP1D3*T$Ck(bWy`je-P1 z0Q#61I!TkI%i>^3U1Ezi+DV*N$_RfTe);mVG_$?lb?U_w#T~Ocb|wQ31E8oaG)m=H zQf*BXgLJ~Kc!~^-{yUdU_{J?|G5zHdJNw=J2)iXMMzsv3G!P#eI!fh}LHfFsoZy7I z^68iY3c4Nu@C6slKEp6bnN_f__v@cBP5&<3gkp^Zk;<~kFIy?JOdTq zOXMUXRz%KPwRuA_L0rO5+vw|mtT5H^NJ6-yQk+U8MFRln6oUpa2Zob>SCq0&yWRC_ zm~ya6JOE-_{TBNGdo6RCxP1$YbAjUlz*!*+G1n9AHi7GsO@%Ot1&2R5tC-V7NKlmK zqa`t)(C%L<-o4uc=-^~QYArmFgbe%ocVpGwN8HR7L90;jE-okv`SsX7Sti3Bi7OZh z27g*&q=)>)Vj=dn*uL@bz|G93?iNJ&}gturyrrgHd>*R?2)nX$XKm5)bK z6sc>SKsx)!`u!%I?=NL=IR>Q5`qBs<=S2(_acdQU1_M@>pJM`W9%Fzse-@IfaVbW& zBp`LobF6mEQ951j+9|k)m1KgKnU6c}myPtuzx6NX$rIIMn$qd0tCe(K$L_^d%q)~t zVE4b3l!O;%>fLYD+CQsW%+_A~${{lfOp+3MgT8$W0Ve6V(VLw9;g+$xS}+Gba_>Tp z`V?c8GpHH^>G~;#FoCNjGmq~w4H--5Q78sLx$wA(FGvgjDet?5-LkRO`S#LJ*qML% zBW2))C!pW^QlorUewvoXdV1NU*B=t}5g#8w zdF-{k2@p@}SbX){I7ojW0aEfOa`^NIJ0IU$De6B_!!VGR0`Pf;@l-KLLOWs~buoO| zG4g~5b95oBQ*uj4+ICD9pvV3qblstuFQTk|6D0%=wam#@P6i|9i^$R?>CTt8ze&5O z4_}Si$*xe{8Q1ZghFi97h?tCni1Uj4f+i%6i)^+7UsX!ls0H9fS-3#x7}bphV^RC7 z3bPg`W-C+x`t>;;9^XKH*6Zi$bEFMLB2xeKR@`+r5CiZ}a7c_&U5Gj+|Bi{yD3e1~(w!G;KQkr=bKk%-NQb z!E&1**s~P8gLZ9`A0C`+G z#?QedR1v!(?6aB-58C>gR1fJ2_bTMp>iHGW8}^<|DF6U8_3D)Z8$1T$#DYI!XSO|U zO4R-C{ABePsz?2y;J(t#c(*+@=+{6N60d-}8E!7c_`uu@b6x%GcQ4R@$OE6aP)u1G z;e1Aq7owo0KAjksG`GA-2DryAy55p zC}6@7L-0gC)oz-kJHJ5&r1%D|feK~!>H9xZ$jo<)R%34|=m6|59twCfJS$`?>1H`4 zppF$uCEkuih%9{S-@EzOr6dM!l{}#Wteen~J(bHf+n{)iG4wm0B_cZHHkApItX4yB zDQEy{Hune9CSmdMtrJja;5D=nEi|%w4#$w^dMuBX(c&Lr*Z4(0?xgH4)mrX5Z`|+q zAQd;8MzofOKk%JEys9Ue{L1oU0QSws%~i#g#(1|Vn0Nri=08<|k!z|H$G4vRR%0v~ z%_y1_cb%F}8{(~mhM?8ty&ousCLXRjenIv?SEG2oo(hD*=zKzKDjuHa62p#y-T(k} zdP+6McdpWT{T`|x%;ZlgVEH*Z6S7(!@H)BEs^l@60F=~pLN)M=tH=XMadWSaoT%nH zz^a}?zgnl^Yg|UZ29&q;gJ8xBB=bP5>Ndq=>WA@BY)N z_`1wr?dhs8o|QW3kJdGnESZVQ^qL4vW+%juJ~C4Wi9l)gk8H^0c_KpaOmOq!miLj)0CCP6WS-E_EFHvy(PoMO5hBO4To9rsT`^QUO9?mo{X41Ljf3!Lw4(ZN` zi3Ewndo{g)+KSv5&+Q5NbZu}-yZlicrT_?1ZkNN!|1+i!PWJ|7EQ>m4DJv*y*3b7p z0-@aGKEbrSIdYGBH5XOK(9!8TGiv!HpBuJ}lQ|`0FbYJQNVG_aFO`PZqCC3le@L<| zTg~TmzhE>q=%dyQRY=h9&Mm_nm>vxYm!OB}2jSIXk%ZpZ3E-9JhIIYVM|w<7=O(>( zn*67~sy9)pK;33&;8AV#W~mV{B7(}>@86ON2$lWFfE=pA;rRtT|0zXOeWXNFYx`@N zv6sX6^y;J;+Plk}58kXL=N$!_11|AbU==j4!0%<4XMA8dbXCWd-Nb5T&tuJtylQ=_ z!nh*!SSIO5SvJYaB|M$H%SBVesrYFL%1r4KQes`>0*@Pc)cwbb>O_RL(YLIQDRlMw zXIA$3IHJfr%XBr@u@|=gFCwL8*MC-L9le>!MOVWqkw%7|Vd0uMY=m6rFM}%Cz-%32 znwhSqk_cEVmevloss*4LimwN6LJC;O@4$dCc6jxptG4>801rEp@>MV@VBd5oUq?UP z6Kf!i1x6+N)itTia#M*o6m@sp|$fv2#C0NEV6 zrxJ?oXiosoQ-^^G$=OH$7Mh=VL2;GO{rS&}PA)6u@?>;i4%R8uT^O*89ysyHA_t6F zj%2A8{;)lXCd|UJ36YYR7s?2EAN{x-?nIlFK)35x;>ELB2e9G*p8KXK;vP3SVUKH} zS*V%=dTl=aadf$p5+cO`8AdnU04VsEDAuJlK&ie*JJp37~lv|Qf zfUKpmvY~dqYJvn@kicym;<`uy`&iuV(|EEg>l5HlI(qfwNpwfqmPu5{IKsr>g6+Qw%t4){D0Ka6BS2drgm2yQ9Ggb6k@rK55{;dQJ(T8=A^y=?R zPhXf5yQ`t(!=QA)61f1g+@vMoJ52Xs>&v6R0P5f<9IOJcXhtbW1fHwCwgl|G5jnV- z2OPRMf-804RUDYQu;~ale*Md43K`3uefSwH?b7|+4NYoh-%z&i{bRZX+%^ojGUO8Y zKYe$=%uIZ04e2U-UKlx8`d)qUiNPZuMYoxDfz^m5rt8;?R%%T}sK89BmtPtE;+Wjy z4vxxM>1y)5;@p%%)tH%tT&$3;czBrAQ~&1CwD+px;N278*1fPLsO?&exkM@O+~_qD z)bUFyvY_nVFab6Q%@WlY*U+t|y*_BNm)4ef{v5z(d@wu{m#uyeLc7XOsN)(@LX|EQ zP}H8J90Kni80-B4NRB&S9zK68~4G6)cz$_HLgqpXK-65K;m^a1eA~ zGp0;ic;{D@l0euP{u=QpYLQy+QjgRgoz&iN1lhpBQf~3d8@fc)Z zs=zu_K6W#?V&gP@;$ebD`ovmg02`|CM@UwV;lC4BS`+08!IXV&*5zk6uETwX3v6hG z`X-R5$n|YF;)dZi;7k_*@)#qQ?Ai$C4CuGGWEI!=(^Z3(7&GRIei4P9VWKw z6HgAD?bcJR{y>HrnsgM8U)r~T=dDqJ_1RdgtB!yas{a2r+r8q$IP}|e z7I`L#Q%V9P@4MWTRs2Dnc_c|GKT5xdkUYKf87sFI5d^`Wkd;p4a;NIq> zp)#3U#-sw-iQ2e;@H&_i*d&rcAV3*T9?V`Kdp_98WF_*vlp09iH*hBn*u2UKc?9P% z9KG>fDTII>S*6^#jwOgt*71N^*d@UGDCKx<6GtsAFXi3_E_UYbzhq=!<)V|Nl-d`( za0cg65shnm@3So-TzHQ_B&Z>LW#O&(S^qhxKImze-}eHxG;Do|WpM3AG7@0;?Zzr} zIa&oDJXooolTUHP1zf-K+e>vw4nb({EjRg9**z#yJeT+c^Oq0?wW%4E;1bbt7l0m* z`p~*I>R-SkU9B%kaQ49`fXrxS_VfEl7pF^*Qz`Fqk&HRS$$s;St-+MDvl}ju9M9J^ zz~9rh`N-=e`o(BPem#$@drjU>(JnP`8Of)~|D%T=2L#5`3JYmqPY!Cgbx2Ps&9DOC zI43zjer2w{_E8J;G)MEGM?~NN65N#l@Vkks#@8K~L0h3yGw9v}SI}jpj4RqZ+^wIsHx_JOC zcJd3tYwe*-T@0d534AvAVWm*y+IRn-&`c-5KXd2X0e3((9Bg3-GLSa<*z@c|k@ z876C_v;VlW5i>R*-!4({Ry-SFc1H(_%;-o9)wsV}hsVwZmwXU?58!k1wM4KKpq@Y4 zvN;-zAlN;3Y?*p_iOEW|gb3_KDo+KD)pYH_c_je-(J$gtQ4Vh{%B`gze}W9~9v~`q z*Pf??Fkk>f5H%3{C}Fa`Wb=0{6>!;66JClXPW6}#p{m`|&^2w?>eL5Od%*F8`GPn~ zvLMPx<&kJKfevEd>#TBJ=KEiAaG|hM4Hm01k%S382<1a(M%;9)oJW(|59jT;fMAx6 zIo&w&%((kUaS9!eJ8Z1H+*L({tgf@x(ScXSr}1Nhz<<%%94P}M-NBJNKz;mFgjo@( zXiOL!C;{~RteEg)_H0{;o3;;V03$pW`{W!#w)dz!ioyDqW60a0{Tk{Wxpm z55IlU5xn!C6uqsN#Bw`L_nE<{(o+P+_|zx~cQK7k2; z1oAGYwO~C2T_D+vp$k9S@h=7})2vpaL%hhq>*Ux92Cn=E&?^QMjj*KR9F^XQs=V<1 z^$i&~7WKw0c{Cfoi~=@sl5yV4Qzxck1xQGA z{t?xm7>zt2OF3UD+#dTPp2abm#@rA|8GFWV-|Kev3^cFzNKd^7>73qb8a^!sNC3#H zj#K|gc0D_7EFy7T#N3OtZ&6scRjb0eqI|Nvz`6CcM89#=*VUh$X;^90Cuvp}y}5cf z-u~720rLB~JpuMQw^z3phbxv*opU5L@CV#`gmf3sT(PAJ6c^L6IS>la{IUoFM~L_7 zHSD41gb1LE3w%SsaiA*FnjSFYe!e&#S)J-C$E+&p>$L0 zEkA34oT8o^8|j?QkuCNNF`eIiM~^gsjz6QGtV4l)sq-;yxU+7uIyKwhj=l>F4iOnUMUj zuaTbPNFdt{Ni{p$#uNF@%oUNi;v8bvGVRdJurIHP>UahDqBaY^=|2@ce|qE;;hW7M z>V5F9xlZi`u4>biM{jU&;Ook0Ww|^@dVfXnv`+23k>$L^jVQwqkR|u4_q$%El5OVtBc^f`ga7`TbyS(33z!ACwqR zv^%2(rV)8k1O_7+lSo4zx>X_O^!I}Tk=^Dg{r)_4E4??i2Da4fK)MBKXqXuqKz}n6 z`_C&gYjelT*`On4dwXHCzJ&i|LDTSPkz@K58q$2UC8WSU+C7T?o#7eo(Ql% z5dYG1KPzd6VomzhvR=W%{pIeS=1I7pzpy+zm{> zWxUX}E0%p@9Ulii`@l63?Mj3cu@`ndYn{yG2ZeD!Rh!g8{N97FP(`quzve8;-T#%H zM*{Fs#2tGXFOnAC##0u^=bKH;Hx`b`WtX|USKytL4DJSB2WdPT<6M3B&bW`sz_>#l z1!bX32L(ku%B+HEN17HQ)xvX({k`Jf#rnd9@B6XFEouq)Lm99thKRNONVRM*I<6vq zb7%|D_Z*5!cwDxn!saik7&*(Mwhvp$JW5s}dTD0GRD zdX_^i(ebgRWQl^ko!8Do#d{7!>gT3+^RBjmRq$eRjKpE4FEc+x6O)|2?ocsTA-}D} z)QWgq-z+)6UP*74LDcU)y>Uz0x$kAvtnQ~|$j`~ilppopVXACj=Sd^p0hFOOR?pDR zEIPZ zs;Hv zhpjAKYqGvQv1aNpjdzVK8IW$TsL)eIoE(0UKAC`Y)#CkHreec>`7UiPc@qVC`cpE= z2rW%4fU9Auu88W)+L__(({xO?4T~p9k(m0^+skoh1J_kXgEtMCL;o=O;#jNm2WtG+>b^`?C51Au6Z?Iassu}HXS3f(81Y=5YPqGcA}HIMj!b^VXDI@0 zcW16%!_v;Dus$1lmqS9S*4x?X8f)&B+M{M2Gh(e~?dO#w$KN4y1=@h9SzCgeWVB0U)#)hof=^p@CSuIjH9%a`3ln9r#m@VU|12@VA(5()%C3&>1RB#D45UdF@(ry z?l)as!lX0``9ZCi^#{Mm#T2=hrzc_NIQmm!#e|}mXCE_0>2<#tv-@@9v6P} zcpPi&8UFW4~m@D{R3K;w)=i{0EFw*wI zRc=^i1AJU_f=rE-E6L*l^Yykx+&snq&8T6sVV4KE=?-f4wis|K;2pU=gKK zMlgHvS71MOzgW+sLkY2OsJQ7KB3?}~8009PS?(m*)o!D@C+>GBTfBJQ=@C^K=BJMN z>W&Wjd5zJ+%a9B)*I6>N>AKP^S>#ZE$0iz3mX`W=%T*=JVT#*(k-d@N7@|r2t{|L> zI;shWcWT%LSA&cO7x0DI7U470q0k3Pw0-4RJ9zaRP)Hzv(mjRQnoK#q0`fdfIto}Q-&|Pf^#66vh|plz(1$<`3ViegS46Tzt~;LtD|jyL z??z}LSrR$^n{}&RUuNUo=Z1FfA!K)W+grtwAweRcj;DjNOkTWA-A;5 zyt{H+w}1dl*Pf%Lnp%fD1WHi4==K>5s<>9(qn=QG0IJQ@cos3X8}#etcBs2)VI9^O zX7vV_y6;8}7A%zd`%u{kR~ns5NNbbrpe1ebo8KhPv!B^l=c_pvY@L|jN#9?huiH=bTnm5(St`$T6`>`m(dyqmnzk{(KIfQ&?4Yqgw7`uuM;%UA zboX;T&kAmYvCwFd@j;~Gg66n)E@p43j#123f&ft$_V;kE$(>Zn|Cz+arOVNX<(`WZ z^)itI8yc91r=RJ_jLN9>6+QvIG3klRtr30orolV>leN>DY=?1nv3vG3)Z>s5uq#e8il=+KhTFcC*0h5{$E<88)#Xu@8TZm_ zRszNn9yg$)hFSTZfc#bOMX5;rs4XWmj@DM|11-;@43zC~eQ(|_?_!6uBkiw4KiP>7)L-l6`6&3M90)A9Mu z;lE$075hKFIb+#X|B>R)ZsYA7vP~4Cg@7-pj?|_J8JD6cbGc!g4vg|i^Pfw18Y2kqc8}eDG?*dV zRs3NqJrY@cpS3zLwSB8t8hfuZjfN`jqy5EvfFDI|^w)HG8KWEPKSkpxQLSOclju94 z91Iwmc>Ru-fo_93iVO>VGL|{eH3Jl$mu1{BNiaRK@cZ`LI%5oDCwQ;t=*ugSYr4qO zIe$LvYPVPE=`7ZiIPYoasdj~Cpx+VtCb=pftnmt}4DRr^` z%iB3(n-%sPfPPpdc&d?cEO2B;<4`abVu`NDNA}>88Z~x5HA%AOCAc3)7r%ES-d&SD z3DXtiM=^j4Q6`{?KK zW<^Q6dEZf~>%?KtC8bF?+ym73gX1qzy5*j;n|{}8-1=DagJek$t1OiBp|OX_e^mj6 zLKkfcwrsP*^}YwEA|hWu{>WX(20VhqvFJTW!=d46e(q7Y$6z^O{WB16^B4o+yGk9T zYN`N#{uPTVSK(&u#-bX%<6(Z7g=et5fsE77?5Oqj>MxK7uOeH?3ptHi6jnzFyp(k}F%V zI1Iqsv@#6riO9me5*>|!@}_#RxF~7%{Z3^D z1<%GoSQ$~u&uMgYi6RS&%1y4|kNLkSnsdewA+*npH{Q&qfcN%hs<(*G|MH`Nt{4#q zMsUiEYjRTMTv@J>gtc=p)@Zrt%}us;1*>kf{#7D!n!DsMOu(jLJ(oijr!L8BllH{( z6n5#k+=nh%{5(t|U-pfNAg*9yGjc{~@bZar%S390-S=O}=#T-d0bFW8nD>STjDr32 zd$1c^zveTN)1_F(vhe}D>Y`3J5~`hInwrU}FQ&;6#wqqG)H^QdeKaJ`@X&R$xVz#o zTa}q~{pmZ{^XJJPbK5Fv72mMq46`j&ZqX? z857pd?H85}w=p>@*B%C14XK_EVsN&B2?=?7);?2*0}hexwF@HVw_NyvUFW;meDC9j zg2ThJYbN` zucApLtS_9d@a|NzPW;^vZgM5_*h=TyR1JGVn`B;oB- z*rzODc**A_=syh(R2|P>RXws&7*^Ip9}E;$peM?v2e$7lUKU+|aiO`Oq)8*$o7kfS z;nA#3i=8wEmi`6$h9-INhTGr+^(OHw&m0K3_TA>RX4otxHW3PgfGp)311fA$%D67u?p{eyO%aO(I(Q> zg-Z9YwzJX>cdLbVj$$;1FR>z)i?0iP7NHW!@0d+a;rw^TrL@0t28yV=c-SLGLd|J^&1W5tkO6iw&D zFb;KesBRJ|-DSFe`X0W<0Xg=@l@Fkd5>eJA9B zN(7^+ZBwfGQy@J(P6RlC_dVKB2u@{81$3NBdoQrRhr@69k|b!v9;#**cJSDl$45rF z<2Uuqrs)!N=KzT)%V6Oru7+poEdevcnGH@abcJ<)&Yb>~?y91(Pqf4+aygKxJ|Q_f zjM;Jo@|x~x=bU4)p8$NMaZ(jaHq9?G?6V&NJUST_?!ZXORC?ouNwR7#%=~%y<%2Dp zYVGa>sNymuGg6{^FZgWO+Qkn?LW^iJLMCTVWMct6DD=VYqI&)PEZTRZ&IB(MXZ@%^ zu#$c+ZQCPeo-$G7rZG8BNkxbo$u7&yFqc93@-FE$E)d;YR~xP#S^Ys z@M`t)WpDo**y1tL%i3!K&|$^PRImi4yY{EQ)wX9v1fSA-dxRO?9bQj7Fx?8aEB7Yg zzJN$Etz!l(MULe=W!onS4Z0rI7(0w3`mAE`4p_&rcy_}+uNE^NSY0Jco4j7L3EKIL zC)%QNOWlCk7~d>B-qnPeC*$6c8^B|AWeTj$tA}`gx0OI15cf^8PMT9bP}$l!3;p$T zfN{@qJc%kd#cgHkIep;2pFhnza=7=7U5?81+;4@N5@|2t2`)&Oa;sDqU-L*PgQyp8 zlt*GNP1J@7AW-A|WI}GpJ4}ENyYs`<*6UBilfTs)HK#O_GO=*16kO9rjvo*QjjUfo zE#A{X&HtiEFTc5-E`eJQUGG@epZlx7S7@o5Qf#K~A0{2=5xz3jx(!Ab`Xo#p0X9G~ zqnI?gWyEI+^i#jrO1g#85IHY{#<+ypt?Y!wNp1qz=?X|JY|Xn#$9BSW%Jc~_ruJG_ z@+H4!(g%;bIytSMY}!*VxR~4FS^;e+tLzpxnFulQseq
bxdHE&inhz!%;FHcr< zLUXRvyppV~9RB(1srS)_(L*b$$P?`!gl<0_?~0YQoWB>hFg2 zcTpD}@Y?w=vwNm^!jPdi-iwyy9p6nScu;|i;JNu4d%^S$*I%2`Dm|-If54oXXn0Ev zQ@e3lVrbp8_4>i>4!v));cIXAFd6@IXm9hNwmWqyB8^hOO>rBesYb9eUpbz=x6B^>oIUq*WtmPgk3z;9*uHVex| zp`XC@qd!&TdrK+hL2BT5I7p+o5D7@zUM0{)f=rUmT{zHKD|zI+eEo*bmZjKT zjawt3@q<5!3J|{~oRqFG-{{^Jktz7@*F)f?bW6aQIXJ)h&`g4LbHhO66yu+Rb9n(K zg#7xrL5sRjclGz^luonw8C_9DUBsHi&YWqzde>!+Rg#k4_BBKHQJ{>M0d0Gy1HsFtEdo(18q8{etYJg! z0(L`_Oj3wa!}_AX7jdmje=Y>y_<>gFVEQAL4CU$uUu^u9s!vYG`UH0_ZU4>k)z3Z$ z8@hVCMd{=h&FfV96pm|<+AB+el7cJm7+q1;47C% zQ}TgnHm!8m;rX04ygRmxIQ>(BipP3&O=2grRYELVvi|`mStGtymm>kd^1C>}TfBv2 zss3M6Gf|uu?|k41F>TG}kpOMl{U-u@c{SOX@(6ty8qBex1}{s^y|z^6XMYAbaL;op zi_izHZs9X%7=k~60GDQ#SEFhS+P$7jrnh2@B8FfUbWoJ6~}STQwh-d zUC@0y%sI$`b4<7jMi)aj)+b)-A)Lh(4lL4W+O~C+U-d6DO(tfBH5EEMV_zVllGFJ_ zIs`!HI#b>qZw*Ad(4Iw+7chn62heI%rOcDK4zLy9eMA0X`s(&J7#1h%p0OCIU6*5$ z#L_D*+k%F2>$V2$C@lS&yuuMU3owVnR+yoxzgn%DbP#wgi>zn_Rl&2NN4drhQy-`- zwO-*28=%F%t;jzj?8;Xh5x3l3ML$O$Ran_~$PRE=Z!)Wz!fxlSA(LA3Dj=%N{skxc z8yRCJ%HLTZ9RwS(Wt6a2iID@keoB2mJpTd?*^d<`IA<2D?E2*Y&@8EdHx6y~kpxJV zb*0)onmalZ@eOm6jj&tq@kE2|TL!8l`qgMftn2r46F9UWDMF1c@GNI=+r$<3?#Im%&i75cY)SJv z*C$B02F0ht76FN<(K3{n*3T0YEaQzWI$wgL^Wk2*yF;W0xOX<#mEVIy`kEh=PR`nX zN8VyJtuDYg-=fjSD%0sEW;f2=)ZZIDTt zU*(gZ4%4m_f~|M(?DRavl3IX~AOXmNATE-p$g1TM!g{=_9t+R+72a3>SIZ8bN`!iK8li|bc7nr8L(X3tt` zDynb0Gvt$or8sK83L)~Bv;3UrOB<{{#qJr=;})+ADvCMqS0^5D_B)jC`sTQ1aDU-V z1lyKOmQ>iKr+)tWi-rr1QC0a{kxXEhA?j2B1y=^FlC5LNJrDmeJ_}8-OthV^@dszF zLcvTsCy*{XKOYLOYkHy3=TL3kg`=>(?GDo^lkekwLJR(K?j?gpQyL}mAD?7{%>deq zea_M+!~2+jzzNVp)gUg4r_N+y5!TY|d#jHX#0?oZDKN6JT4T9$D>& z+6wH(mR>jagokUbt&$>d&&IB#qE8Fp38~F1ip+be#Uf{@WS%9}k+(&?tHD4KC%|~N z9+r%ZeJ_TPfHx%PB4ER~cs1GbbTmfbYdUAlxE7CB9>eI|ddDMD6-Pit#C$mEKU0~C z%nq?6KGeChBja4+l>k)~pfdR5jtfL8&d|I5nMSkHL9Y}ilxVHqZ~4oZ1reISo?4>^ zwX$AA+pB{<*qbc;-x8g6_!vKm{AMA|h0qnQ25K;J7o$u3 z8tOOeTgc6!!BDjn!_7oG7>YozfjBqnzv%rE9Fi}aBPdxC5`X9FjKhq)9e0SLJkY>< zGw@MT=i3Xv7Tp=0r3-urHJ;_z39I8$l<08mgKbq!>ilhU0TaHJEVA6H_PdR#hHZ7W zx*9TmNd` zJdobxja*>fRKFb5caB}i=&UhUytz!&Dple_ci(qCq`}^*(Khr=*A$wg0PWey9|5wx z=JKVvozz&NNeZ)PS(U>1-&7{%om=8Hwik@*)ztG{=p99y!U+Om91y~)V**8!tv3>R z%t9~O6{v-0@SG`NzDE=7S;#$CD%pK7&x)Bh0>;jV+9LQ;!v5X@+KjNHIeCv48MV%1 zVhR=)0bIbgza6>)_Yhq{$m#3=vM^=bwaC+hr41R%g&orQo%fZ>F*5B^zQ$a6?pIaT zhBNAas8#|D>LAocPThZn{`iYnDaGh+?pbxWSUac5wjd?}Mb!Iw-QK$x+hE6KjaIZW zf-e3*>d*gT_xoU*)`@aZ4v(Wcy$7#12!YE53A*RO6#FDP~TH=U%S_N+!}8Bvcn zV;4cwE8(VS=vr#6lq#t6nBHzb0)lAx!#La zcv$>Dr&kW>biRKb~iku$O20I9NDrub+1ySg|aF~ zZBtpLzG5YpuhDE3(*;2JJ zyi5Fk;qOX+I>Oy~l8wMHC`}oBVmU12AMHBkFN7sezgDIgThE9ZxZ+ zprggAGM$_UlV}wbnZ3`xaCaWlJ5Ko4&*RDrC6p&gx;yn5?4&#PLT^Cf_Eo4Hw-9Sh zD8G)x6Kg7aHQ2Ve8Uu_t#LcSG#|4ho6cCHbKd5zW#S8Dx1zAIyMwYWQ)G?W%$&aM{ z$46ui-J+IdE=6lYw*@y-=94)Sp6+lYQ1Q}Kf5I-rI>}%+hN3lBK3o_REol zeu!uugm|gbXY^7Oe z-t&Y%{wf6I(`2#Amj+q!CpA5vdrhY`8!d=fN_U5BfA0Pd@&4L|GO)~{r~+OTaFQ*t z_#|({Z7s&U5a#rQ&%L2%6;vGZK!(3;=EdvwKe;T>yo_%w`ZUN_#KXt+DrMr2DARnj zz4E046+*80=+`#5=8{Zb#8d>xQP6l3N(_ zNA9Y{VYWSz^XyX|;fr|Lig@W2aK6+-*q(p!p@5SnNuxhoT}y$Kcyl8B(E0tOu6GFc z@LoOU<~W(qUn^;;N=El>cY&sS+aoq@_T25f#@)ng{{4MIow~6g;&lf*+wGaUSait@ zE2FSo9wCX&nMeQMS-mEI=|{%0jC7~L)Qp$kNM8jlm&p8JeA`>eN>+yW3QqcOa-b+m zVgEbQ(x;6v_M@B%CzR3wN7>JM)}s3UM4`tcs_W;qA>*FZYL}@jAb3Kj>=wIT+chPJ z!M8;!wqCv2raTvJ3bx;J(4KlpkYH$bI6j9Eat0~X0Z?nOv)0X8if2WX=Eb6qo~oI| z=DUQLa{MY^nmE{5ismQ4Yu*`>E&dvxP?m)UQrfyKe+N6N^`ch|67QWX=b&7Y_p#IoCaIvnOkA>87({R;pVnJpXO#8WT^8ONRyRL zE>qT^0E}cryx6_@Y&bX!bsK!jWnr3U-X}{=Czut20yCkteBMmN}=47SDKn zzpY(L(75K5*Ia20#(0=52Kn_^TqDLFPU+O?#{W{yujVGj{qUH@$1!lLT<nf4ktAU=VU2Y(03}nu?bDk=k1%L-bbn(q%@Zn5`x%Y}Ualohct7L9S@3--U zBaA31VlxLzCan6 zTYRGtT{m{JE+=r~4vqQFfwNC5VG-(+t-3*^GrFjGpq-qS%ON7I5`i}VAS|s$xxCzt zxJVdG*H_QN+4FCUJM?4q!5UUk1_{|We0Jq?_p2U~aR{8)J7p3=6~*R#>w_;1!X3Lt zO|*;6e%(qDg6^ckcA!fcVL^UqzKcnzk@=KlojvonaQLI2A(mw2-YF)Nd-Yz<`_v6D zJ19I-%KxkIqQCMP!!_hh8|f2#jZy6B8Gp0E$fUZf#W6tJ+_;32RdG6kdpx1KA8^0Y zC{ZZ%Uk!{k&{JzyqJdR2aO_(+x!+z|8(SFZ-Zc zQmpi(0nDZu7GG`(>D+XU#;TqJHY=1vmUfiVg1l9Frwvh29Z~f)x8GUpzQ&MF1vd{l zl;U-jK2~Z`Q4-+VTh^TeWw;(0*GC)vT~4UR8vGaFAsa;+EA?~Hri&iNfqyN# zDr`$!CiErgBL>}}e;+LO^*|&$??ik@zvz95NpNUUcJZl8CMmEcLZsD9PpWgwVzq9# z{7HGTJ7gD{#nYE#1~FXK48Wfy2&vD?!XkDCZ}P?j7qFNvpUKd$M~)_~96@@6<@%D! zn8_G3Ll^J;ByID-w*&%dq)L;xT9b@_@6F#7Sm*WF*A3G;I3)v!Sd z3%=G^jC@hIM30?29?W;gC*--Po_47Y4EtTF$fMJ*KBCR~ASsqeY;W5u9uJ2t9T1k% z7^&VaxxmSRNplA8bTvNUnyiFUa0V-Lis_(Lx-{FeL*+Y1M^{mkMBNF71rm@9d zsdwW6d`XGVq%KhDvpvz;EP;dhzF+~PYzq)u$tx7*HjwQ3SRQz1} z$FZxA4Bn~3yU)MW&goVkGC1yuGyzqK0i*b2?Fjl{6|t3!nqivLcqiX~E6R%&wWF_= zfv&lJ#;(Lpgh8mN=r4MKOUHH_KxOCM{?RE0_!_}p`j<9i_2rmK?X5o4cdn(cWj&BE z$~v9T-s{sP=j3(61^xeWqA-St->>=4f-dVyk@=X{XLsyMrtTVvc@vZJWFoh{=z-(( zK37g+Rgo<{FZXNus)tH7i_Qhl3!-1*58ydrkY+PlUQ!4wnf5RI$Hs7qa^W1-YjY6+ zl>&?BHDH;!DxD06O<%L+XHwD0B3?E=jNwq+09D8#xc+6_b<<|)e0SkANa(2BdqvR>`NlL#Oc&vzYI?o_Q>1n{A$*Ui}rt~!285SU!+)3cAMjNRxs9jV&RE~rP~@hEj-wS^J~lM@Ujc%2PCk=-kHDOyi$ zI`EHQUeg*4AqvM%yqDJJevxi$7rQtlA*-F5>IBUr=8TG`$~2A+lLA+c%;%0La(Dk_ zu!*^!Z>-Rlhls@a7p`fyPvg~5pcrBDNaG7pRjTasidecQU%+De_e&6w0@JmQ!{ZHc zQ_Nwj?zdsv{P{s}Y_Kz2LPE~mOZLW|G2`FI@E8$x56=IxX3N*;B)w(92;xknroRl1 zPbiJgHV~CcA^gB8-t=RW7u4SftPCcM>|aB_o9jJ{Lhl&Qd| zJs|+6r~*goVuAQ(L}^#Oq=V$S3OD zzs`Y^eqhfuETO|zK|N9}s-;>o>*etr#tfth70wL*ovAa;@vVimTKA752X_z+Z_N5! zWp9>{2sxUON`hqH1#)%<@|o;%FfcX%5!&VoGB5NQ;4e|c1-5!+LO z&B~~ChxdaquhMo#;QG?aJu3Rl7mU(DaGu8U#P$nZEtx_w@4F$jlb@6@3Dx(M--~;5 zSUxYY8<+P=LZ6OkuN6k~FF{PMK*%F{F6f)wymBf4vYMoH=_p)W5Q zLhY$jG5W8OPr$#XA8S}g_gr&w-!>n4K)5kL(IVP&8pg}7pxa6Ly(2tjU?JGkaq*>7 zr){IOsV(&oR@tQhLdK+ucuL?Q9o>i#kPJ*C(iAb@adn71XP_x?783yj}Oe7mjPB z8)_rXffKp=RM)=akPniHxmWa@yJuWuG#sBdWDEq3L?JD#+}MBKJS-Y#y=c+9q8T(= z>2O!*)udgsg{}jg$eHGp(n!qo@aX@05eup zD(W+Yju%V2upV@o+L*O*)?`8*(QIS}zQ&*Deg9Ti>@{@KeylkY-ebiDoJ*3rnjbVX zK%UPpzTKMEn#Cfdk{KGbiC98bt{SDC7rH^M3ZHc1R(GR6-yTxh{~XcVt3HhK*7$NQ zc40~m*8rCwO~ZR-+${ZQsHa0Dt@&DmojJxe9 z|DPoOU(T;RP?v_iekZFhaJ@iLk|{kMp2uXrRs7@I7cSh29S**f6BZ=W(qJabpr;lH%^EqS118i3HiXX-c(#wvw&C-jxe!sX`(>?o5s;H z&Tj4z0@&9m&PQ*bxpthS@2!0QT*&x{LlA211Q3t2QJg8!EZ+xJ6n{ZnG$ zXr(%fjW2uy|9QqAXkNS;Iq}c)PnRy*c&UP{6HxVi0wjVGGEy((+IK2%i;JY zdb9I7+QHMvpBoD>@nijMR$Wmu1A9ae4wQ0;4@K!zF!)mBmX1k)hrf{hyY7P|<9wWz zP?~}MT6Lm71HeYG$^S(E(A~G_Y;z*wz%m-h-FP_m4$ffDJ`w)-=F!=PO3vF^xVY^i z79HAZ74rz8#$F;w^lYHoXrCUgH~97OEi!0E4g=roKINM$|3)N<)A~n>p`!a{xqXQL z&~dE^d|<73pIjAB9-0+32Nz?R|0VIIe%cu_rE|ibe~6(KLJOC#n|)X_G5x{Hj|S@KA_KKaRw$s zCWLju$CE!~;N8~FKzEe}CJKBTvAMfpngkrP?G_3|&u>BBvN$6>e{fUWiwVc^HU8eT zKbZD`^C?lGlB0gzD6ofhWpi?M%(!cre?0JqdqUfa`8 zMJtDpZU>6AN0@>XkzuaV?CZC$wR65SED>J>G(-NLLBdAz#QU=Ei= zR55u?4gySI!z*0W7YJ?GdlP*T=3?>LrGjh8M&+dAnp}uYK?}#%;zFuXNwV)nN4(6l z5i8Y>-#OcR|3;Qs4Ag0bf$J?MNMggOAtnVE-m)qVDb{mfg`Ua}DP&}EMP45iYsYFY z@I{S68G&cYjgoq$v|U%lBnk;f*(bkaYUuy_ZXhT1;A5%EY&CyU{ZQ1smkcK z^jvJ2ceV!F|K9Smmxd4Fly0k>McE4xhKh6*RoNxp`S$QK(9t_GKE8~|Fecm6(E?PC zZ%^9)3=_bDd|OYPO{`bUeB~F7${c9Zx3XwyJG$Rdg%-05pOx#q!1gt`V&^}kyMQU0 zI5}gTmZ0NSYzlk%$PDjBoUp zuIlr+r2CLLCz-^PKkDXhnE*yr<`Vk9<39lb)S;-Um6s3fmCF&u^670qRXTWo^{tTL z!0FL2n6WvIj`2!0reO7gj6n5yLIw0@yd&1cZK*$5(P!Tr%Q^u|S`y%`V(55T`@k}# zd5D7zJ^W;ZeJA^{8yAkZ485_ZAM6LL;;f-(cQVsm8^X#g#e!K3U*TgHN@AxeVair6 z-FQp$vylQR5|iSp^GSc~hHAYek!%n09DVqNP;2oF_s{17T1FKuo00uVbFq{?p(}%6gBKj+igTeHr=LqOA z`n9uB8s7ZUJqj`6Rwb+h5g=%npap7Gme31kVKU*{W$a2f#-!X`TRI97D9X&erWJ5F z)6zIDzR8oG(gORE76bHHj9A0UJ1Q7Nom73B!o2Mwo5v9%UF*pz$w#rCQre$lvBbW} z-n_NPg|~5iCa+A+-xaH@Ts2RHurH^zlc*Cvl_b-WrO*F>HQMM!AF#&Rn~?Ln%u3t^d zbAavs#!%l&yiAuW67d6x92{k$6@tF`?B&!bK)Y@x1Y(Kb95X@6@O0F zHuU^g_76jxaCEe@-4XwyveuBKNwhEh2_W^8^uuU)ojM~ojc-eETo`(up&?> zT?Bj#>#W{rtEsis z;l;fx>oe1}v(oax{xy382Ts$0*dXxPhaMXbt>+20$Yx7;2NB6LE_^ns;3{SFREf*? zOAxB9x&`GOA$Kz}Xyu|Xb+*$$# zmh6;Ov>fb)@iMOyB3)XfS+GpgmT$#c3f`Hb4bR2(^`rqUn`bNL=RF&boQjZElSLUz zWN(vz*?wc`?NCiAp|siqD;fyb=MhVuciW%m`u6&RBd<-eP$lkBKr+HYalT(gDDDG6 z1vEnmc6Zg0g=aiXAQj5QlFPfe?k1ehHt`dOai}~2Cc|%kkv~(^wpnX535-Cr)EtHu zpG-rgx8CeJ8a_v-*@wD&y*hZiNdF({5U80C;n*-_f&*-U%)lQ#X~$xOb&3-^O4vva(ViZ@1KmtYE9gk!Md8ub=+bhT)gaR;>Cr6Jvpu<7q+iv zTmI4AkJ%Nz11)Y%Y&D6Wt7FsU2pw1mAuTd2ne98N1(Nu4`*vrJ%?z35nRzVt)|6A_ z9}j~4*_y#VDW2_b2Xe=K=nNx%D#U9h2Mx+edUN{ujtleV2j!nJqIQLN`Co@?!XA=f z`;Iz3E!R6 z7XI^M{?I=UWVNTdzj@oU5V{+9$+l2?8Cvk$UgY=gqD55VKYaZk5!QncntvsFZ(ivc zKTUAUg{H3V4p?k9iIkAbUG*^eI~rOePVc;Qc0kH@eM{=V>_hN-59a%Kpd1Els30ts zmuA;F3u&%^9=!B1zP zfNx#=D!O$zl)0i)Km+nEP^aSz*)Gpx#x*@o{D440Iyc3W!5#^dY*g80vElbZ|~X_&2U9-g8lfEXDFeQ6^#gd zbvScqwf@4xeQW73%nX?`;o77?)nCZA6DDny;C}AYXOYOdbo?`f&?emde5UXPchAHy zV@D^_!j?<`AnY>K+*L%=kGt#MO&7ThzkgspGLUesIUXh!aR1XzShJPVuH)~{&c59? zt=7%9{E7pl!%?=5bzBepA=q9D=gqMDZ_i^br~NfC5HY{phYbM{5uu5rZ5F@B3zzEw z+;sD=F9Fc%(VLRfpF1c^IG}P)gejWAz^h5tPrJmslrq{-XDy-n>O%C&e&rdceLw3X zj$k@x>OaRgf}wM;;y~;yWz{M@dROkpbv}y&qf{o9=1X(CZJTR+I33A&xm(_oc5UGB z=)IX2^tcrD%d>O;PwkJ*VvpY#XK*r5waQbh&(+%sXSjFu>p)2dukSuLw@2@NfA;I? za53cQ!AmWT8;IfEmzq@M(Ax6rt7UPofUhMn4Pnoj`a8T*Cey=bb;tF>Q&y_ zYY+)0n3H_l*BJb|SHTW_+s(b@*pc`8-wT@-21RcNFhCO4fed#AugbiO_kMXLQMzHP zg8Ye99M+h43oLhDFjw>P?kz1vArO-} zawn1hrQsbRi`)`Y=+&Qz}wE9yrG^i6ePSVmE77(zeJ_ z#Vj|*=U1*vF4B%N#>pY8lzG&ZD4h%IW;`!-@0rp z=8bMUg9!02qt!<@;8mkvII?p)aQ)XU$--~CV`ZKD0s7Rp<44eTMfZF7XN^a9ASMgP zceT2-p04JY5ExmK(+f3xC}loVes)0*;Y9^M1L4-pT`tmCU2;#9Zrl!6XiRM3g4liN zzjc3(9aqU6{D!HbM>Jnj!JUe=%|{~@yu2m1=MG&^w^qP^cSCvY+lE;sGM)q>B52S& z8o1yGC&LN6?0e_R|87U2`BE!*E&HE~(L;}=7l%UXY8-bWw>|;XUuexmfXjY|??91j zkSe3-SuB9YcAr7MQc@0!JjLDDSa32OVXx;9RB@YZ*BzDcpazay9e$1}wCb~4+rq9S zP;EvP1xqoJk;;XGn<&ZL-~#9`SE1`)i8$;aXm)16_GRs*eSCHSvO6vabI2MTaXv^g z46eUTE$Kc@x48XnKOy5jE-sW#j{0HoRhJz3$jEO5^f(Ymy4Sh){68>1QzcljK9p5* z5LT;2@7XvVcgY`kNJ7V4EBQ|V-T_;d(LY`jT2Dpe*J4jC16Y|L(ZIr{ym+yT6u1G^ zUWXA6SlkZ%;(Qw_0H70*OFFtoPQkLfW*fQ|F z4CHWEkU*+Y*U>6i*UV0ks28wApkdX%PFQnq`G58)QkLDB8TTV_uw>|8GCp>!wlJ8O z8hh#orcLN!uTH$k=Fs65ZbUD&rpILk%I}#NoAG5OyaP^ZzU}}yaU*; zH_vw+FBP-?3~~sKAjOWlM+gmS44zE@zWj)TC}FT+ve_hf!;}j(p5vw>r9c}3RXSYJ zv2mKxqEoHWTgoJ+0QSSr${1z%=bRx2^NZ|yGqd?abb7_w#oFa20bo;09t0>&M3CS?rUE*DQF<>MAxeLtfXIKn|Cx%4a;==&q-nNL#=Y!|VtghQ%%4tomY{^v%Ays= zc>HX5f^`FKmgvYq_hMJV8|f7C)s$u`3xJ;0<=J$3^io3>o1mhKWYLIjYJDiimDGgk z%xLc#WQo&k2bhJQ`IQ6s${7Lm2-2-dHP9Nj)Zv9rfP2?iS#ZVsZ2GvGr z37nnLMrseac0fN0@c)ZER1zqYPup=y!iHL1Fq| zBq?uhp80$6;tXR4Jf_O6g1H-+dNj!EX)1RdFKFj(aIKSTf4N+WZ2uwL{Qg*&_=Jyv9^i`ANd+}eLg8Y=f4EH;5HWYPrfbHZ)YPGdLJ$OGlzKzPa_r}I> zG4V1J6kQ&vKT8{YL|&sdHmXcPmfwAS090Sw24ZM>6UNWDZFgm2NK7BEMk=;nMx))A z4Hu=t%3V?&Vsv`Lv_GXO!8XL>#c5ng%AgPN1rM@YO48&Q84cOz2F_%;M?=;ws~!5Z zLTtofNt14i=_?#j8sD&#V{%8RTZZ0$D1QN(`P?BdS)63>^A#Va3NK2rHZ=GV$Y(j~ ze-mdC$(YZ}cPNSU=A2z5XfTUowDZvSmm7R$iX%`@om-c?WCb7I!}fh>C~i08mnL#z zSiUwD=b=p8#RP4%YkU;9Oc(+N!_nd)1m(Df4VJ(k;NTks1dZ-Q9@{GkVI%X|%0_Sd z(dM_~Y}zKE3&AZgi<7_uop5w-$cFq;x0zzI0Z#%>hT6-q4C5iGD%SdB4`FFjd^~7< zduQ4-TWs1iGnmj&tQ>EHPlt{@f68QYa{OZ@zA6F+Q1+lr0k%r|tE%x2=7aL>g+BC9PBPp$)LM0eA50kNiAV_#(PMMux#4#E+0 z4sgBYM0~P$7wD5%(xvO%O(!1odmAuU14iKXve;ktS2U7{Zb2*??x#^(5;wLY&?v-e z_17~MtNnV84kc;xVl^!If#AL>0FET4ssBo25Oq{{xD`W!B}2rUzUQdhm?dYzpeLMnd<6DaYkT>(>5(N8vGV6xULg_(GGPulQP)9yjsYi_zu% zak<4|n!`!OADXw3NFrv5+)rS!9A6Y=UdxUN&4x_Ma;Fd`5UxJcRdlOQwfWHe%3h>5Jd6F zIL&wMowsoKcsp5&ee8rQfwZ4LH*`CDlq;WLLRt=Z;Wg7DqzQ4K* zw7^$8Q*yx5BDt@78*Flq%3o=2hN)FIeMT~glH;p=Q75UAOlB`dhCbB+g)1yA{?*@> z-GTYbZSrSebCMsjj=B2R{TDe~RKzbWvKxKkr!okEv9-p->OQFF!;jrHU9RnV{WR1~ zXr7(TQ!L5J#;H-2@|dd7JQb(W9cNl`e`LK8XmB{!tgwF-GQj5# zdj6WBW&iA|P1lmi9hDbN&iLh`FgOaCO`EhTA5G&RV8k00dFT3hjiXLMwjonae+gK; zD$^#pUN`|h8-5cP#yzEnye9;L=jvWUmVx+z_kD%-*O$WPb{r2n7-L>sJqyUZJ4!72 zWR9U$us+!}VNP)y2ocL^LKNwW}b}n zR&Y?4Zn}<~0n{$45AcI`jmcE7Ia=}b0qZJTfRA!?O%hS^Sf-+}2F|QHEt)K(`z$j( zc92AM{IG`WADXwpY3<*q$WjtM*`!tp(c8SpjbHwXI|u1j!^(&7B=M+;{!<;<)5auP zEa3n@ul==|m@=?0wVzkH;Hes&e4YvU*;U}+zIsC_7sAzQLr0@HMoRV6LAvf_EWmD^qh(V&Ldk?s41{w8KzY3}{ zkC7NIRJwPgfTKs-uGA@OdltN?9#Wt|2%#WkWj`4krhh^=zG<4anfjjkn}stblI_#L zQXw+!3UfF}1V}t;Tlx-D$B#e--od?z7}bK$R$c0$}$$%_j_aTU1do;)Ag z|7(7N!{hC=_i5A6RL~Q7!Bs{rG}tL9G@!VUF%T2rcbOz7n@S|1ao{jAPt>};u$2c) zN1vbS*kwxI_PmPx!$TO2uBB>Txpq)Q-GUiOQ)pi&LMqVxRnRDd&NlGNEsy5O*`hB? zJfGeNH&9b0D;#3#XBD;%rhy_QKag1M>f=`SVcT`2hRvd=HQD}mu2QnbZ_WcHD(w8= zk>G>YA%OlSfsn zynT!l)dnp2jU_#|rA#%wa>LUsTy%x;DzTL2X|W`-8a`xZ%&GFVHro}%B6mE(%;AXV z?3bB?14D(77dNakY#e^y)n|$01!RoB^&3 z;DERf5{*2Tc%nbfE@(zRSC4$)$mjMLBofZ{(f)G2^|5T}(nYW3IX`{^lmA=guWZuZ zUPDS!iYB}21AB%K5bWkS*p03|3a`h%mdB=lQ>{Hq-%DV~vakR7gDbRGVxdW!PT^@wPbZ#D)p_COTcD3^ zWws2r^K-ciKbojm$GQbx(#^|U-nl{?eE_<;AUW7e65_fgw6pR|tyEXYZ+mZ#dDeSJ z7Ra=Q9}D$@&tpe!4`?gmc+q@$yAeuU}MrPbF3( z1=GfFOM`W;jmd%sz+(w|842I$4Ug0Zg9s9|WFz1drG*QO?ELl#67eU$o zaTAzT-r_R_ksy&TVI4Y18~HCiqOyY_Vr_9Vzl5=CUohzt+uA-QGGtDW{NYFq>Pl>9D_kL)&5NS|44A4EfgKLFP)Inka4zG7RF-rfyLCAYyUR&y!eik zO8pR7!xzQO3_3xJP42^)@q|YyzXE)gU6Ace4c&&B?sMMiM~R{wwYXx~Dv;RP$RBE- zzw3bq=mIALUp^sXf3r_?(>!mA*zJnvo&%=K`XW0`#+pjRDX@!MjmOihoS62s?bOYT znBHR%S^ZiUalpZ`>g8sR>0-oBU=DhN&-ACu>{HaSpsIdLNdecSCU-tI79XX~mi)R( zDPQ($3DVn!%&&PRPsybkR~^s12dd>@6}6gavSlm#UETv+@fR2O6W-Lr5|}}|mD8;6 zs5`9l>6_$B*y=M(Del|L1n$l1Pec?&($0kIo42ZExj!TWp~adyfJr>mV7NlxP212H zYmGEG@S3=q?e!@@k-ft9Z5{qYU25&Qg%Ere=ppkZqCOcflVwP7RsQ)~hWmSmupJUh zI%|1g?jDo}4Ll8Cp88xWnCHJ45$Hi|N^8z%+V+ z5UZF-kGzHc=Tj`uoa}{+sT@cZy5QC(#Y@0?hzmMrh%}4TH)KA7Y3Qu5S3b5i)QvA8 zjW0b7VqP_HQi66!=CeODSMIqEz{-kvKKT4GxTrZULk}szK>cWWp$m+z@?)9@y`b>*L;7JV z+oUdB_!c6aVfL}MPs{1QAX_K-KkzVhjO=n~1X4iUN0gTk%9wMvlF=P&phR5+8nlXG zPimWdBmS);K6Y3Q>N|ZFvv;cG>J7biDLgFu-aB2PG{Q5453B+S&B3K~+uw)oz|h6l z?Kj$xTYNYv)S%bn<6ks0!Wv(c?Ku?g-{m4vO8LfH9APFtaKgFz`^M=t{L!xLmLcx5xN)wGQqIzueOfl&f-O^toR_Z3oZX;8 zB&!D()-W~oGEHRUI5lzL(9^|u_pa|}8PKE6`5;STy1x0Tj%Hl)QPfc4w7VXYcFi5b zG*z&lo`|EEV{w?Jz8acU9H2Dn*s^1V%@mRCQManowtRSeUZm}+%vzY6h=C#zxE@$` z&qY3LulXrA`=q+p%(6>2jdlulg-m$?`-bdq4bJV3LXClZMmKsDaCE@k8q}yY|8-Mz z0IZe1-lpqC(%#Jrk5}6ZZVGpH8Bs@hN;Us{5I63!wqhs-G*QioQ19-H+^+AfX!+~yYX)$WuuP4A*+i}71}4WaXdEY1PDBHKfh8$K#Q0&V|n3cO5K??ERm7d@Ay z2T4U<&l&|i_cGaq>#$7>x0&WKSugTq_~1{171O<)_4HCylyNS8KTy_1pQTCs2}SV3+}6L^we>)>l-Q86M0Wfafpp=adW~bkAvfK}+Zdf~i;wTDd3Ui`>aQXI2m-C{sC?GjiO)s%V z`xZR{QsIuCdhMfh4t!}%^2WPNTVVhC;yB{z<~r!IW&NbPK3;N1ixoz>Ac-}nFz;yh z3Ezm_!D|o2bbUPp6cNDC4L(wuz_9`$q)v+_s^S1U{(8Qrl?3w7=vYIJw*3N0!Nm227dEfTcM0lGD zmH-&&y^rS8U6B!D`&JWI;zcmDNz!vKvkrMi6ToAOEGuJ7ZU zHW`%Do2&Icupu#!uJw~HDoOz))>w+R52UjHePD_u+Pp`xJKkFGAa`@xC!pDTb;4gy zG)-MafAFf9F_P;O>xnnT%=`4mUWmE>h<1DuDopr zx6^sjU6c%^+-vEgk}5UW1bx64MAd%d#1Ah!BrDzH#4Ss>+0^(>r|F89w08c zp1&3*9-5x@j&(ps_gNg8x-+Adij4eDaI+~sz7c0ItYtH0x&S~Vgpr(dKlpuoeQFk& zfqCy^?V!4y(tx^T_<*UYZaMwrK|CoYL%rKWRU76=4^J(!Vhk-m3?*$!W~f(}oiz51 z1^cW+lIZvUW=KVz>gHGO6iSKSyVImb({a)e+Fx9Ey4O8%KvI{Ga&YUN-WQVLb%InS z?UPGqKNwz7qxJdH#`CIrCwi*SM9b8Yb=tq~(tD4tu2A>?L~pqj%ZvVJ_*r+eJuE)C ztlr%FGJD?*zr~;82vP$|FkjrI75{Fn(tvVzi;JY;=SOj_X^S6qyv4aUUTx6^gdHG< zugZ1}qJOmQbQ<#^Trf#pRc}yALvm8(KTqOHLti}TSo5hwb3f3{x@{k`E~5w)qw}LS^TnalV5RTwLgZwml&6Wv2pjdzC$Utbxb$M`H3#P&lJ0Z- z3`6sEI+COzEf`;SUW>_{TMPsp?-MLx52vz=iuQN#eDOisXr^DmYC7a(YO!e5edg`m z4m9ss(rK-{ml2Efazv7PzZKWi>5-DX=6qz`oNUiLZDe _initForegroundTask() async { + if (!Util.isMobile()) { + return; + } + FlutterForegroundTask.init( androidNotificationOptions: AndroidNotificationOptions( channelId: 'gopeed_service', @@ -269,13 +273,8 @@ class AppController extends GetxController with WindowListener, TrayListener { _defaultStartConfig!.address = "127.0.0.1:0"; } else { _defaultStartConfig!.network = "unix"; - if (Util.isDesktop()) { - _defaultStartConfig!.address = unixSocketPath; - } - if (Util.isMobile()) { - _defaultStartConfig!.address = - "${(await getTemporaryDirectory()).path}/$unixSocketPath"; - } + _defaultStartConfig!.address = + "${(await getTemporaryDirectory()).path}/$unixSocketPath"; } _defaultStartConfig!.apiToken = ''; return _defaultStartConfig!; diff --git a/ui/flutter/lib/core/libgopeed_boot.dart b/ui/flutter/lib/core/libgopeed_boot.dart index 53d7d370..98bf3dc8 100644 --- a/ui/flutter/lib/core/libgopeed_boot.dart +++ b/ui/flutter/lib/core/libgopeed_boot.dart @@ -4,8 +4,6 @@ import "libgopeed_boot_stub.dart" if (dart.library.io) 'entry/libgopeed_boot_native.dart'; abstract class LibgopeedBoot { - static const unixSocketPath = 'gopeed.sock'; - static LibgopeedBoot? _instance; static LibgopeedBoot get instance { diff --git a/ui/flutter/lib/main.dart b/ui/flutter/lib/main.dart index b1c4164b..8ca0359b 100644 --- a/ui/flutter/lib/main.dart +++ b/ui/flutter/lib/main.dart @@ -37,11 +37,13 @@ Future init() async { }); } + if (!Util.isWeb()) { + await Util.initStorageDir(); + } + initLogger(); + final controller = Get.put(AppController()); try { - if (!Util.isWeb()) { - await Util.initStorageDir(); - } await controller.loadStartConfig(); final startCfg = controller.startConfig.value; controller.runningPort.value = await LibgopeedBoot.instance.start(startCfg); diff --git a/ui/flutter/lib/util/log_util.dart b/ui/flutter/lib/util/log_util.dart index 92af13a7..9a1ac689 100644 --- a/ui/flutter/lib/util/log_util.dart +++ b/ui/flutter/lib/util/log_util.dart @@ -1,18 +1,24 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:logger/logger.dart'; +import 'package:path/path.dart' as path; import 'util.dart'; -final logger = Logger( - filter: ProductionFilter(), - printer: SimplePrinter(printTime: true, colors: false), - output: buildOutput(), -); +late final Logger logger; -buildOutput() { +initLogger() { + // if is debug mode, don't log to file + logger = Logger( + filter: ProductionFilter(), + printer: SimplePrinter(printTime: true, colors: false), + output: _buildOutput(), + ); +} + +_buildOutput() { // if is debug mode, don't log to file if (!kDebugMode && Util.isDesktop()) { - const logDirPath = 'logs'; + final logDirPath = path.join(Util.getStorageDir(), 'logs'); var logDir = Directory(logDirPath); if (!logDir.existsSync()) { logDir.createSync(); diff --git a/ui/flutter/lib/util/util.dart b/ui/flutter/lib/util/util.dart index 8304dee3..8f150ce2 100644 --- a/ui/flutter/lib/util/util.dart +++ b/ui/flutter/lib/util/util.dart @@ -6,6 +6,8 @@ import 'package:flutter/foundation.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; +import 'log_util.dart'; + class Util { static String? _storageDir; @@ -55,6 +57,16 @@ class Util { storageDir = (await getExternalStorageDirectory())?.path ?? storageDir; } else if (Platform.isIOS) { storageDir = (await getLibraryDirectory()).path; + } else if (Util.isLinux()) { + storageDir = File(Platform.resolvedExecutable).parent.path; + // check has write permission, if not, fallback to application support dir + try { + final testFile = File(path.join(storageDir, ".test")); + await testFile.writeAsString("test"); + await testFile.delete(); + } catch (e) { + storageDir = (await getApplicationSupportDirectory()).path; + } } _storageDir = storageDir; } @@ -63,10 +75,6 @@ class Util { return _storageDir!; } - static String getStorageAsset(String asset) { - return path.join(getStorageDir(), asset); - } - static isAndroid() { return !kIsWeb && Platform.isAndroid; } diff --git a/ui/flutter/linux/com.gopeed.Gopeed.metainfo.xml b/ui/flutter/linux/com.gopeed.Gopeed.metainfo.xml new file mode 100644 index 00000000..3dbf8420 --- /dev/null +++ b/ui/flutter/linux/com.gopeed.Gopeed.metainfo.xml @@ -0,0 +1,41 @@ + + + com.gopeed.Gopeed + + Gopeed + High speed downloader that supports all platforms. + https://gopeed.com + https://github.com/GopeedLab/gopeed/issues + https://docs.gopeed.com/donate.html + https://github.com/GopeedLab/gopeed/blob/main/CONTRIBUTING.md#translation + + + MIT + GPL-3.0-only + monkeyWie + + + pointing + keyboard + touch + + + +

+ Gopeed (full name Go Speed), a high-speed downloader developed by Golang + Flutter, supports (HTTP, BitTorrent, Magnet) protocol, and supports all platforms. +

+
+ + + + com.gopeed.Gopeed.desktop + + + https://raw.githubusercontent.com/GopeedLab/gopeed/v1.4.4/_docs/img/ui-demo.png + + + + + + +
\ No newline at end of file diff --git a/ui/flutter/linux/gopeed.desktop b/ui/flutter/linux/gopeed.desktop new file mode 100644 index 00000000..2e35e9c2 --- /dev/null +++ b/ui/flutter/linux/gopeed.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Gopeed +GenericName=Downloader Manager +Comment=High speed downloader that supports all platforms. +Exec=gopeed +Icon=gopeed +Terminal=false +Type=Application +Categories=Utility +Keywords=HTTP;Bittorrent;Downloader; \ No newline at end of file