From 8aa67003c8d69b5df66e2175b6b00ead5fa12452 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Fri, 10 Jul 2026 16:44:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=90=AD=E5=BB=BA=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 包含应用入口、根组件、路由配置(含登录守卫)、主布局、全局样式、ECharts 插件、类型定义、常量映射表及静态资源。 --- frontend/public/favicon.ico | 1 + frontend/public/logo.png | Bin 0 -> 100395 bytes frontend/src/App.vue | 7 + frontend/src/constants/dimension.ts | 106 ++++++++++++ frontend/src/constants/index.ts | 144 +++++++++++++++ frontend/src/layouts/MainLayout.vue | 116 +++++++++++++ frontend/src/main.ts | 25 +++ frontend/src/plugins/echarts.ts | 24 +++ frontend/src/router/index.ts | 239 +++++++++++++++++++++++++ frontend/src/styles/index.scss | 190 ++++++++++++++++++++ frontend/src/types/index.ts | 260 ++++++++++++++++++++++++++++ 11 files changed, 1112 insertions(+) create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/logo.png create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/constants/dimension.ts create mode 100644 frontend/src/constants/index.ts create mode 100644 frontend/src/layouts/MainLayout.vue create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/plugins/echarts.ts create mode 100644 frontend/src/router/index.ts create mode 100644 frontend/src/styles/index.scss create mode 100644 frontend/src/types/index.ts diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/frontend/public/favicon.ico @@ -0,0 +1 @@ + diff --git a/frontend/public/logo.png b/frontend/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1de89ad3ce2497a4143b5f79db4b13b7be747fae GIT binary patch literal 100395 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 UFCP)qD!>`k| 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 z zn45juNqXGvTa@yA)N;AlyD^h3Jk+S)6s+@`n*TJv)#YT04sUnxY8ecO7 zs=sjE`!S z{lblF-@nRB#X;xG4N}B3zbPs1DXsm_*e$;2*btEqJAUHhHfE~d`8-9kPx~rOGJJBZ z&V*IIA}mc#PL3^0>wpXa-Um`rN_(Ykyt=-gd1XnU-MJ+Mg;y8b8=0A=3zs(uUd>j{ z`H~pL4PCwe^CsYaWaOGn;=2f+IW|hZ?-y6abM<&DqM})R%Yk|MgZA_WHO^ZuG1TCy z$7U-~Zn3Kg)YMKc`aa5VLuHuRZK#}HO6)3h%8UC<*?iqJkh7|@5p*R^Qv-XgX0gj-AY7X<+e$jU(EFCy|e~ZN!C9lzvh<5qD)!^WtpyRFCqedNP5Z;ZQR7of(C~#;c zp?*wW|8l69j(u+MGIB%Kh%qh@->s*sOUW$p^{o<mSFDq3+`1=@2y(?skjDoS?Z`y?bGP=eGs zV)@0v8KtT3uAq69&_uP(h7m|uMro<5$AAaPfV?by?4XSh;noeKnQ3$-F)`%4m8_V(85|nO12jfRigoVAT zwq*!*3dTgKl!upO}5%`ISr(K?~=rm%Np(xDBhrifBo&~&^B&_b$ZCc zS;CN4jFTj6qgblG6$H|ohOb*lgO6zh^et!7b2vce^^s_JkFD2`{emF3?!8rT$O`V8 zb`1l!SYp-7Qca4Pmb z{7kF|ZDk8r7G{Jy8~Vuh?+;hn(N)TeZhf^b^73Jn28-o3lh1#d3hyLT=G5(yq)8FL z(s(w^r}C@O>o6+j;cVQQPuJUtFF|^F?zVeik3=c5!U_FiiYK5SatejT&CPG}hV#u- z%T~>t@I&ruAC;AtahZ<|k02B>;|SBA2?^zYgTm`^eqZ4xUR?va9d_N(Eo4?94moT= zRFas=JAP1-0*?*Vj-s5J0?!t0r;Uv|Ik~Z)Ps?R~QO0#~HoSlzxF^rPbWU z6%ds~v*?|%6$q8pxse#ZFVzo?FQ*;K$LkhQ-s-MSeBV;j-v)p`kXL(2e2JRRT z|1Ym22wj&3n`q0d#~Ewexquc$|B~ugLTCzQ*T~Gl!XRyiSfLo*ByMf(Az=^b8Z4S=3v|raeCz zyjG+CKFy^Np16Y-Ao&nv>A=%D2`BSc^)cVRtL3WZxO(c}h^AXxTdU#Tu&}bq8p+3N zE^!&_4$bEhYwC;Rzr3|Uzzw<^yX!49-@L6G)>O9u-b}DGK-Y|WE!OZ@RcjwaZ5m43 z?t*7Cxj^G*$vgmSOMh^6jOP}@$5)7wEuz@?2XZupsm4g33)#EmpD#AS*GtXE6L?%_ z@5djBy@C#*8tghHW6Qm3O1h!+Ww=jf>%FX$D|D+7;EH|8^K8@{l&9`HyY93cJ*?x= zbrjW&ya|iD_*-polzW~xfXLNDHI-&5P!2y#`xfo?6Args4^Ng+kU;>C^rwOx6=BGD zJd!IxwS`My|KqkOCnu+~Y)^Fm0l5TaC&#dE_#W3E-4{oRLA5$_#k`A^;3CC(Z`{5o zijArTp()z4!KN8|K(3=1N2yZH5&1h-?Qmu@IUiZ1q{zXbJA^U8T)*Ek_|>l!3ulpjk$RxCO0&cDM+rvfdr&YosBC-hLh>*_?XKHwtv>ct_^ z@Xq5WPp}E8T-&3O^!X9j zv}9<)%!foqj<6`ZM)TpaIO0C{M}%bG)sGltKFwBp<*|hnzt;X_Q^keq)oM3uVJbz4 z3TMe9-O(qV%8DBB^U-|O>TaiT{{1%|%u0=~{igvr&cC!YzjPneMa;+Yn1@b6r$6xS zg&W8t64vp~7`1)#S#lC`8>*A|8uKlh1yBFzIODjviFEp9T0dCRVY)FN;HiN7@j4sA zYnJHATKyvDr`00=@{RHO#*Yi00U9|nCuil^hCdh#%$NRi_;*PS&&{=zx3y)r6GU|S zudu!O#>vG;3_GY(H+W7?G<4P1Xur_>dlnDxpF{;b3gwoSNZm0^S?bjxPi`^BkT4W^ zQ$COOEAb9U%T725hEof?3f*zIP6y915JQ&tuaR{LWB(Lk!X_q&Xgk3rC8JahH5CTu ztD?LAUHlZv3Tj}i6mW>kNa-wiZC=$KiVhU?TG=FhV_jv&p=&9>K}K(M)!cUAb46X< zUGnb7=UF%cB(pJZ1TYwM$FP#CRO(;WigL8m^QHxkASukRQkf3S$8pxGR=oqdFZZ9H zBCCe{0Hz=W9ccBz{NVul*M5puNQB|NmXjv&Ai5MKne5pHHx-aZ0{<)+|?YVy!dm@~Ud1GO*UWFPHG! z_+wOT@w1@)`!mlYdEzT?5z~)lB^p6H98| zjj?&I{jw~oUsIG&--2pk1GD3*K3ceY5g)luhM*9w7ESZ;>CS=0EW=wDi8VXq$iV4L z8yWZd?Kbf4*veqO>+qWD6Oeb&OK!MSV9{PYwrQ-OGcwNElvT@C{L>niSfhI~h8X1; zEd}^b{kUJMU#&q-Drj^^g~^H~ZGnZOi*KeUmYwL4l)eEmkx$0;0c8P?Qa1a>B!>h zA%K%3Ob0JpUU5tgT4tj=hvUp=)#c zGb&BKnTwf^h1O)fiE=Q7S&)NONYx^aLS*2hmPKHPPxNZh_E)D)dNnShwNB^bZDs9P z%Zycl(^b+c2ICZ8Gg#I8HLI`TbSA5qIEH@(>wBkaqN^f<2QcbY?T zn)I~S`JnqXf1H7bBLYZIz3+0!Q`v@gs~aTa1wC_~9q2pI7T!mto*o|ig zat>b@8|f!ZhEh54K7CO{G)JLHC2aJIs?Qx)OX8OA6Ssy-IriTIj=O)IMOu8F?WgP` zfBqz(8q2#}X}BKQ|2D2&>fLg~@#3Vqw^!CiVq?WDmU8$pyTRTW!a6~ch@KJu(bF@X z%W(7jFOP5BzHI<%!F{juSKASqdbPtARaMGb{0>(!oNmR;pf6s><=x`NSj#z@sr+M>CYw&3Jzjw}AtlfLITEqKXZ zkI#bFfr|-Xtk5UHAe{mb<*#v?%)Ux;v9JSax@JU`;tPYt#Sp?xM8}iICnkhM-T3>K zQ=eZsY_6t5@fAo|X#HT)RG<~*{h?k@SGlyP{PFEurV`H;2ahav&+mB6yWxS;CDM%Y zh15)?8Q^^lTqpiO&a;vD%#keF644!Zm!}49-ey~Yp`&nS($C=ew@n5-#NsVOr1tnp z)m9gDiiLNagymJPRA1KX`tb7W=#-Uh+juAfYErJ(uYQ^yQWtzV#m?k*j-?tCbK2GW2C zf6sEfuI*^L@?y$Ctr5Jm;=1fcOUeEqN)i~lBq%Q$0$R>BKrXSQKP3|$Mo98D*X|no zNtJcgKK#WPbm)Y0`j%N7uG?&V31s#9_^b^vq(qkAzB5tXjh+>b+f03; z6)3V}1|^sibv7MOwabY%rv*dCg(slPhr~wnJx|K=D)3}WWK1&3Zl(^lS=L43RvU0D z9h+S4*=;VT14VV?xdWf~Hd^l_cn)>Rn5MKLHSN09hp=(_XeAADCLCaoRks9SJLJ$s3h1SB({W)mDN&GY5I&tF6YIHi zBxKn;kqDktNqQrQ{|+%nSP32&)vvs;tuUjxnU1PU@Gu^y@UHMeB>nl7_?4u(DA=V% zuh`wjFMefT%_=i>;f?nN(%$26-Rlma#+i17t=Dp9q1}^)cKqP4!;4n=7mw`l`hN+W z-bk+P#iEIcQRlE2XCxO5r54WoE8{flHgE99qQ$+6=;qRX{X$X_$Wqc%;?l?qR%&Qy z#1gI}I)WsHQ?gu>y@@<|W~Pa0<1A4JZytz9wAYPrvuRLHr#*Y=sOI?YV;P)*2Lub~ zv%#Uo`u0#-H$Qdu2zVnEJSj<^Gt>yAu56XFZ0kLiUTRs_%Y|gp7cwxi4rdd7+n7y5 z#l_8;y6A@e$;@QN5BE-!yIOLjzT;?6?^bAQtIHd*Dc3DP&>5cZn!kF@CBvE*tKZ3S3Dwt2(gtrKiu>NWJa*Fkjs_ZAg=a*kQ^gHmIiW9b61L6(|H|i*HXj@!w>QA zgl%|vAZ%v1y>|x}@T#c&nfIIJ;^C40^?jeKOC=(8CSj|ir~lLx!e?<$^&PS2`1#Px zWpnY&J#T(Wx1Tr|>lS{h(izDo9NudT%*)A%i;IrVILfknYV`4e6dAGkcwIGmwU}4% zeGJRdHu2m~kK^VH(e-R?AG%q$v?vCXP zE6LT|Yg;W|bWtx<8cE);J}0JG6TkW%>}FHpih#Qf;3SQQyB~FPK6};`u~Gc`gxk@n zSP&FbU?GhDDSu~`cP7x|NniLmS#NpSCIHH5d{qs%zy&*2n1uH`&O)d>rPn%c{P&_O zp9v`aB|plm4TM2g>(81WLznL29CMxp%1-TZzSdg(*Y4X!9e8;or5^?IZt`h1b5em3 z4-9`o7xq8QlpM;}`yJhWAB3pss0*HR$PYxVSyN7aA_}nv^C<^NL(}5Xe(|xMFo$nk z&IzLm@fFOn%uF^msS(t*is15J@iS(Si8qI_PMNOrRi@AYa+&s3-0vabSH;nUh-xrH z6gD&T-vd35<4o}mQd^CK1L2@L{V+!KYSQmUJNnMRqq{A6yiq*9IGhon=RVjCN)1x1Uvz>0 z6bHM&-%DAeMP8@HOsB1G)5O&3)mGGb;88-AK2e0258i=LI-yYAzWMm!olheT%m48C z?BLsDKTY+(C=*|3ePY;K&cwetj|K~9bVrXp_8KHws^P@6)|(>{A!lIJ|F%jD+gjk- zx_^emmCupCy=6C?(6Z0o``Fp)dMcNNrCK)(5cP=k*Agg@SQ=q5yJnI}q=hdT=liZ! z#j9ogcE4BU^#KOsQKO(U21CA5VCXw7>Rf1wFE^v(SaRx}2X%xRzn30R)>$c<$id2= zi*!I0eN?iJfE7#J8xzPr9d?m~E~Cv(;^37Pm#`lT9zmLxR@o*+oq)_oH!&aYG#tim zM0yDMGne%4GP76Lf#N&W)&_bqcWug?=b%Iv>lP{I+deN`Dt8tDinXJt|8*;<#IrFn zz7}wtQ*^@7>w7!y21b6l841cheCHn49M$-z8BE*-#f%SPqx5@04bmJ5GBu#Av8W#^ z#d-X{b^qCE&ok58kvKL4C7kz_xd>SS%2#TW#z+Z+suBWIzVU;${4a;I!Qz6;q-YJ* z26bcP?$d zFL}MRU+FFchO$&qz!gRgH@d(gQvr+!P+5c#{HOI$g_t(i?_}Zdu)HRL5C*6SYH4Th zgUVdsQE$jO$ZvtQ{0D7k%4lb6(fa5J$D28?f=&T^LVj?a3RTzFlvlVOm`2OY0WcTX zOFL+%e22S#E}N^zJF_f}b-V?YpyrHdGLM4Qp$5HBM+Cqpf{Gdv%&bwvK)KaP5}RjR znPSZn16a3W_4XZgM$0`a-I-(mHxeH+(pj0aS}dE>wz(Wsb2v zk5PsvSvNyb)w4ZaeQL&u5~~nuC}<|F)>yYR2eafsjMaGeZLVj6jEy|85gZ94mi zFbT8jp#FYQufU9YdIyrW2!cZ2$}Pd?jm`kN{89kI3|2dzwvJXX0^kC$VmBb(J-Tfh zo?43r7}sDhNN|lx;J0p#r>RR2HfE*=4={t=*zJX+@5hXC$7J@H; z1~5z@fR8X6r&QW_kJtL-c;gAc@Bf5KhMjd6T#nXDwn5klzSzluk%2NIH{9^j$wiL{ zFj>vMFbM}lDokZD|WLv16cKOlc$_SOyK zY*G&p0cNEr>c(0?zlpu*rg)k_scw?c>`WmXl+>|rK#K2!QK_%pma!cnv9Cll+XR9* z-2hl(3uqr6t}UIWo}3y}5R4YGHyBR5H7;KCAG6Y>C~) zRUqk48vSdas~v)=-a8M}T(z)B2iQeW-^PWRbg+G^+F`W_(Nmo7^!GaCGG4ppbAgxh zQp2B>02nv;d$5})_b{x{Y^n4}E^E9e08rW|l>@MKfFR8h;ax^PPMzhB-@NUAa9?wKvsx*_2*=gLYHV7Ng1^ z$~2vucE)?qeOf5r3#dj`BJcpjmG?s;&K-6c zP?uxUofE52d0422OgDc7aWmyN=Ifb`YO1PM1NPpOcWE>tVPuNGfpXQ46QIn9d5>%~ z2kNRsF{3>(qfI-%WS^Cd_%+!zssl*GY8OzjJkjapp+wlYT!JbKEEYpAJI0rgEDeuC zm6uZ9@3_qpajS-$o2mt8Sv@LjRO<7I0Tu(4fn#Q!HTj4#*O9j;@F9uSO@filt3$vf zB)RLxR0g~l4>OV)Gg3dp)N~_mnqSiUe-?6H3NaRo)I-76jWK8?Fy|vL%*XBSkCYH} zdgnSwueAX^^*)-kZyR$kJ*W3i&=DwxOzChSXY$v8?XaW=`l>*EGWIPnk^ZNC&& z$>gfB$w-5A*Vh@t_uuCLV?1p1+4!xayE^^2mT$q!TFoDUftVg|D$|lk%d!g!oSM1D}%qaQ^bJ7OH zF5BbkOeR!-D>1nfT=M}_VW{J_GBkXcZ=FckLN#CvnV58J$S9<&E45~wg|5`h4qz-K zZmS_w9NtBN+%is(!whUC#td8mFo#m0m2*Y_?r+wyj8f?mt~uY*4g(Cu!fM4B@RWaN z2bEh>9JNcJJm4$BFOS0-%(SR7{T*Y~TJfQo6emos5y+ZC2Un%v&LoE&(7fMlkpI{ z?h-@ndNk+aaYHWNbI^_)0N%YIaF8V^Hm~=f%BKSD9sp7U<0_VVRze0$`$SyO902$2 zHUmJA*$^5ioDZFsmkU85!9m~_6~>fQ^00@Kv$=Q{#REvXh=PF^T+e2GE#>bPPF`M4 z?h+>4YR1IwohHE}Eoym*m*l1W*xeh;2`4Pk%=`g$Gd$Vf0^==tA5d#}RmYcvME0}T|y478IIcJ}DNv_wH+oopYWK9Y>=0rTh) zq`hjHlZ7!*%@{+z)a9}hii1}OUZ??0|F9Xp(YlB*NlwhysWFpsgib7Y z{Y$r7wFjWI{rzVz3%(Thb^X#f4~i!p8aeC6tR4qi{VoU2RgFvgsr*|XF!XB4>b>MW z2+-e^(er=p<0eLmF}LB@V`8!ijG|m+Ikf#mC)utUBnb8Q_76>M-Fs!RHQ9kL z`XrOwERk?t0g@&N6k)JQtvXgx_WBjH#=kc)gv)#+9;Ohsv}M9OJ%K8`S>;8wU3vvS zs>VE*iiC;y8qkX-L_ZP46`dAHQRgvEdjy$qUmu7@U)^rfF&~c)Z&-Bzf{Ww4ahrFs zbE^P@{5Hcm`2m^Kl|wG<@T+y5#xSkDCzuGe5i)7M|E;MHEOGL88kd-@K~U#cGq{6|{7hZV!jc;Vucxk@*lSu3ziq*!Wrnjn z4jEgKJogFr`5Vz=}1`y19Nzo(v8 zuPzp+>%{iMz6)cbjqU%LKTEZO-q86(f0oD&==}PIxy~DaD?cRSN6Eyh#R~WL?N}pg z|E#$|p@%PqaaeY_Q5^gGE9?4fU5muGEiy7`YswdUx4vTMJNY>l>F>DpTbQ0V`N!)d z89~OR${#WTFO<3!(Jhc&_~|eE$>wRpRk#v8kJOdyel1ey)ADR9Sn7SrH+| z;PP`W)K{fADeRvBVUGl6Ib4_c(?}SMJtA{R&?_v{tlN20Kn>XeS&+dX=p(njN$tC)O{oZ;Sytiu#LI|_XO=&k)2*(3c`tQ2i;is|W;tcRZ>B=;&M*0Xa1x(0`VU%$qP_VQ zuq^x#+EkpVghr_`R6~z8(8u~OpsA&S^|i~I)}(;clS&GVeSScIAxi6`U@9KfIrrmm z*BU(eIM`wT%5$wS<_+CP)*W@?l3>;HT+^U424MO=#?2_+QK?a%lMaK9&uGm>hi5{( zO+R7GcR_7;Gu{ui*nz%{kC+cE{ZIH+Sz=l5Q&*T3k@BZmRqm`b{O<^SquKfDDsNU# zz1ri`^R+3^VhT8AI*6o{DDJVb5+Vgl;TY=JO9NM`y5)EkWo>msAXl0~$#vT^rfU*( z$jO#2Eu?Uj5dhSSXhp~UZZl52{bd2ddP5)^@49LOJ%|_cXiPwJ65LQB*^NGb zK`tPqS-ZWth?~!a?V+IW1y}K!iu>zpgJYTde|$zG^ocoeH*R7;@@=KHgFLp)=hDUV z{Gg|jabX&D|9ea;S_qzP6;R6mcHHb=qUKD!uUl+(>jA;Xwk`n(qlh-9BM6NIS#alQmuTNjeOQ?}H zw)ze02$n6paeQ?aKul5Ia{jR5k+SXUmj=0NNt+KYj8G}Ll$N=Zka7Fl2+T%=0>8Ah z1gCgQu33FpapyNTs~A!e z;VL=OH2aUYQ+OJ(@Ld^O+LV@Y7+ORDExU5^jwOcepe+MM6Fm>tn`X<8fnP>@2|}{t z59Xv9FSOyZnLmzJrr%yq)9;|O0ocPzOY5eE2K-@)Ud}(Kg7>62&X(#v*|}+v-6rZ- z+5(7|$FdHTSw0+x#*6Sg_Sz0iFMt~tAy-kVO}+gKY9~qbF*Vxj78nw)TOO0AbMR@f zEtHgPNsesylKr$arsqx%xr>AR3!r$m$9!%4FZR-4FloQBJ%Tg@-Dv%7W-iv>NASKL$M=gd1W!+l zTLGdZAjmt9jMiO_(rt0r{6j{3vC?2|3uAX6z}inhh&Wl7=$?)*Wj`UXlhihyrT$xm z4OYmLf>7z}J6rb}{cq^d?Pnql$gVHEg6!}I8?t|i_^FcZ*Lyz!3@}e0XNK{iHZOYA zZlqhTP~w0!S392KIp=4`9L@0;QL-+{jaSNPTf-r<$s{8orTsT99>wNs6cvYuP4Km* zelkoPfR^=CP}cGFr;?H~W!stcpPLRDJ|&e3;UM>hGyX$Nw`8`1^2u+PV)~Bov3Ho#NiVbMx{HI&Q}$vy(SxvfyUH37JN?HL451+><;mdW}9RMvIJ zte&q#-1aq{S>QGi>1)N}+M-&)yKURxU)wg3*n_5RTWbl`x6-(4VTSwQO{nSXNr`#q zT3|6TwE(4N8m~=P1P^*qFuehoFS4bsuwbFbNfb@fk~G9-XmJ=?gNG#+Y1oOYjJq?7 z=sFbTVL^45i~RgfV6{#=&+8(qVk$Ox%jNQDLx7j}c4ngB?-vJ$6ImJ!n}WF_^D*wr z*2x)kRHmo%;%_3uSlRXa?|qfcP7o`e2%EO%VyW0Di42u~4kO0$&1{aqf6w^opyKs- zu&>f2dEuv$zMyOmtgFZJ(hl!L|8WKA`FP7sk8-z^d5{}84Tzi{vZ#L&pTt`)kY)

8XcDoyP1kXZ+Qv6FKT|1Yo1ZEUQ;w+|g()8BbBH`e!R zh3_S5SdBPG%(wLM>#cVsrEHv@VG17*$p(uF56$9S);wp7I(-Y=m%Zn5DV!2En!x-pZit^n1&hem~AzXl!%zadg-+n|6q!^Ox zvOUCJPSBiNs>nBZEg-Yx`#8r7b3CxHxNisQKIL@DmuW})@v`prDq46qyab!a^m_GN z0Mwr!j~K;{)AjuBJ4YjpUw-<_YvWP-YF$K8PKb>yZl`P<=UC2MB=_jw0iS;h2{I=^ z>?)m;qH+AtSEFgey_)Z-9r_EzZj}$60m=8}3TPh~Dm?%%$O!#=^T=;gQB z@#Eh#N8>)LBTsz7Jl4V#p_!q>|%8p%SdLAgVBm(MZBzKO$3PSiKqh@h*vLFu8|I`F3O zmI!?9k{O|qGUWM+3H4sw_vH?(Z*5mJ=NpOoHe997JwIB!OCP@c$OuYI#gKSqfo0Bu z&2aBoz6%ARi%n@H&iQP;MaKB zpV209B@R6-F2w_(>xg=*TKjF)`uC*8N})Fol7}+qDwO1yd4ACxK4y8=6HtSf2XS`FQmbvsE0+h#~7l& z(8spCRT?6_PyT!|;d)bo3w-gZfV4}PTerZ@5nv)!rMb(H?dd-U0Ve7O#Y(^ZLr2%! z_wmAp)=Jig17tXi1eMUfo<(MbxD3Tjzg(ixij^Q2OBkpd_Ux9I2A{+1ze`+0IxFz2 zujle?HG)4^D?#(P*l;U8d{do`DnkRl>9NkP2uhR(+i(*F8qa^~XDrO5bWENysH`(T zZ78nY*)nx?&T`JF2&e%E4Vf29j$&77^Sr_MvD^2&PS@Wf|HJD3alH>q`xSvT^(&eD`UZe zy@uTKY{N8@#nn%*e^C$cz(%B~-My+_j}^J}pX{i~crQ6^r^(e?q@U<9s+aOA@8+n% zi+Y{V&~noob!R_+s>IjeeKYGHnul$MZU1Y4#i&3VfgPyJ!$5GZ$!K^+J@;85IS<+h z%lmC@v8U@iOYG+pDemQ2L{tdEL72;#EE0F$%qBOPveq?aWGY3&33V!@C62^tD{Z}= znSrqHH-YuC|yp&@j6Dg@XyoGwC?x5)D_SnGe@2r7fYX4_#NlP zgsmhbWGT7&dG>9oS#5pgjV2oXO}i@~!dCehMto7j1GeM#7bE}B7D~A+TWl;vvxkmq zcLlefxQ(5K#$7$>fSAd*q+36mpeH0^VD!?cQ!-&qg=}7vVf#Y|VcQm+s-?u=5Q&g* z(UzYYJQZu6o!l-`uBg?_#T*?htWnZHUDBVfD1Foy3a4=Cl9K1(SKow>$~i7)4dSH} z8OFwu^F?FRBm+B+9gu~Stjw#cJR6OqmySDi85Q2Oa?x|+3lmQBur~@>fY`KtOPu|s zg-eA*^C7>;rukjKq`~Lbi=aWr9M8sh8^ZReL`lf&(sP~tDXoW7OKYpR_@>lmmDBuu z-wOh1%k{y6BE!uv_*~hzK4!X`;_N>*56J6(l08SV_6_i5f=%cYa5coLE$izYrl~^^ zaas;-GQdb44EWtJZnwEJklCtc}s z^0k72RK{rfwqL5?<>Oqltms&FJ?)7c5-@{r&EJT;8_mRqJd?zs|60?PA=(3?z4pF6 zsXgp|6%;$un8y{ypsY|cRM+q=A z8;79!PShIR3ud>;TpP|}%~(MDyvFS`q!|iy?1F@YU-ah3c&f z7<`Z-T*hw;92HjNt`uL?=8bnf8%pC5rov1qKv3<-O!DoJ#B4yYdD|P3o6g9xl)t;v zOKVRiJ60~wwu^Nt>_3wwbNt!<-0Z|^L7TM9*PMTq|2L~JRoPMrEjA={^=qPNJ0Ad; z`3~VSK&?}{Uo3S8b90Tb*iQUn{apFyC>u!CgV4mqKK8W0Z9bXp$?-%p^ItN^8v$u8 zs9*zkbdK-WIKn6d8bJGhF?dRHZV!nr!i!lDZV3s|c60%wfw`^Y?{;rrA| zSn)d?;@spuEnel7ZoPik>#=T*_cT+8Bs;^T_h8~u(+~b`G**Iow$-aMHaW8GS=)Zi z_@Q!n+778c6Xyj<(dDN?`I#UEPeoAO`0j*1)o~``2ck{7iwV+!?AveV5W(4qR}zKa z53-b{(3L~alo(=aZhOPEmhYoEJ%e;q<5#cg+1bbw7;}H@o)AfJf9Aut0`2 zk817eVlomq`jlsEMz!i*mXWp>b&*s zHtoD+exbkFA~sgpi>0fmlO7EO$0goe3k47Wi4NMeueQiNEdE*>>uJ zcz-Kp7^S zlmav%+s}gtXFqcJ@Froay^d*jUz;N$Vpnn-4n`-FaP|OkUsxjh`dzR6 zVPayZJboVX{{E#Uv>g=rDt~4jj@Ur)j71=gH4B+f3lacni`N6a)i zNd{St`1i~|R$Ig4K84W;stODa(3oxJCP`Vj^X^aBv(1k#c8ZL$DZYAB{I>Al+v}nT zIj=ko$FdVKBo0=JEG7R^_l^J33iZWz=Boiq#+t%tjLbGEc^n&+*5{MLw5O(wfDnfJ zYHbN+(t4J;^#nvbgQhbIR?Py4&OaRW=c90?_A^2#pf53>iAbn%oBmct<3XnE3J%<& zJsuBcR#e(38EV@Oo+J?OPe~$iu8ZA1rRA6g)@ZT*r~f<^$ls6dj~DSHIQn>n8_TmP zbx0COW=sZu(Q7;)(YcaQ7|7C$C%{Uf{TWj@8((2HCzMr+4J)&;X;4D{rHerqR%&Vl zacFy9OggTUJr%+PpBgT9v-ys}9?%Yb%e*IU+dLX~1)VV`&R& ze!6-Ln9u^btV8Fr0H<)=!VEx_Rm1KkGEb(a%ub_aj}kK63=Zy{eLiP(ZjebZF?vZ< ziif3WOwn<{Y?>$_oPQ{t-0n`wIzRb_^hK6gAIx3AbKy`toEK7xas!uz^+`9HTGu?3 zXBcFol&bibyy+|(kLf%)u3=vVVRwL$4dND^dzERmgJ|zd&}XUk(J))59UP7yFF#`j zp7>wGIcR8*6I0jwq0Ee)=COaOUF4fOab(t%Epov?Ua+_+Bi}*3Ugl zwcNTG_PZiHWT^^JM4Q*#rpepv1ZT1$XRZ3f%dM%dG!<<^+R>S*XQ6-;rK8%z5Y(NB2B78OLiFkgV}ku%CI|M z?)xj*ux_ORuN(11o}fB)g2TkP7VY+|uZsuz5o@_?mtTY)wO=kGPwsDNuA}or8Esy| zgG1HZ(@Cnm*>Gn29GYxZ&lP!-SJA$;_*>iZp_G@n3RrPIH?3a3=`!3JL!bI3+UBs5$P=10M1H!yq6Q=ArZOPeDfJ*jjwYJ&ZBTtFN2fsF8rDL|}K>^Y}X)Js8LZEzUbyo3Pr! zUuve;<073D7#ghXhA)%&L?|EtLxu--m)SbpKXUwRd8wQyY4rYouQ&Z^yU*EA(Ynak zdE_>vCyj5|0(GU|e-oDt+TM8_7pD&Wm?Bcbp}+T_&J)>rx?jyAWSnNbPAj*lJ}h)` z@i|NnG){8Z7#Fr#+G~dz(c8MF$E|3sJVQ2DI!oEOHQl6>;r4yid z#p%#=pIQ-2)Yi<)@_lV|(WXmp+WldrgpQ2}!jgoznjX zC|T}JJDhHJZ};i7pGgKYDMw$N;#?s!$cq!Fp4Zziwhy!0VAv&DKKt?U{X|HsZiz~% zX37KQ*zOjBxmUelY401l2Cr3<$^A38xj1V5UXfIfFd$3^1l3aPm%}1Y&1i)*k!iPq z1pN)q?u}q2xkH$$13Li^uCqu0DzRo_um71uPRI+tNn}rg!`l|6b3C{uI9y{>D3Dg4 zJd(ZqoixV=TZ+E4!_06+d>a0^>Vd%9*C*}1IQ%&Fs#kMnCin=6HZ7^TIqk zqgR&VCBWmb&$>E`pkN%UkMVn$gE4C`=rORAnUThrx;^y33v%wH`=1y>tFF2SWJx?+Py_gkFH+Jf1g1$*S1W6PaJ;x!x+qE5 ziwK5~sE+0)PM*#ipTb1?m128PFxB(@IQXh;B(E;5d`|-e1cO5FDI7;!Hua-OolUbj z^?`JXB@G|b{4Q8j6&S8d?x0;KgX;(vHC-@PiV~g1Bx!sGc1h~d&xcVoDDrz1^#&5; zf+J6%nV#PPwrN{FHH1)c?$<0z&qfsGrgE z|NNQJL#fi&^PLH&_vNIY!cM{ZP`(9I&^a`d%^eCyE+V>wc&`OVQ3+2wK+by#DX%9~ zqxn~@WmaaQ>tyWHFVYvD6I9QPSU1IaAYxr?rZe4hsDR7(tLI4P*ygZjqO4wsjzOcr zjhZ59uoF2Ax9!m8{kc(Y|C)e2-7PuBj*7w(5A>L;agL5y!xX!)&*jBMm|pEDtU(Oe zv6;tcdi3;{XMUV<-#K=60J~FIKEC_vs3e zG#iuXx5#ESCyz1h5c=5Kn>N*MvOwCtTdO#T0^4aHG!r;;vZwNS>8Kw3;i#W1!_XaIL^J85sWll7x5ORZ7XJ8!L9+n^Ui}<~>eo<^Zwgv4Yp(7A@kRfFI{yq0; zIMh@xMSdT+)EF9|02YO`K{+~A-;jN65j{4M$HEiLci$73x)km~kxh1^5pgw?6CIVC zR_|m4f+FEmF z#MYTB6XgX3cfrWb%<}yG7&pDDRhgn^0MDfgGuVv{z&2ZPa#T976?<>;AMm-f#o{OdvJHkUEnO7&Bupa z_Po4Qq6cV0HF$ms-Z5go5dYAgKZg^wq9!o;gai;lF6& z`z>xk(;lKvZa-#sOpoLg{9 zd$O;ZRO~|j(%zN~=yM9IY>^7;^PagI;g1siDtl5mF3Fyg^9>!$g%vX#muV!YJ>XE&PO%=%{@a*!(7 zo$p0MrFqTF+Sy574POQr@sMgdFv+pzQSc=p>QkWC55LONG~VDX%j)f$+ocE6(URER z8k&csc0U|WKVM7EQW!bNRe-w7c`a_Uj|{*fz6X6PegD;z=cvUzY6gVhu}al@Ido}d z@A?mdh;Xjm^=xhLwz6KSJqua954)}rl5#*T2LikDMkdU6GM{@HmxTqKap-MXiqa$X zexUwD>kYfh@hqX?7N8*)xn{q001_L@el)Fv`tqB z^!Tt_#O0OlU%4O)Gy7|1qkB&tzkI5vlROj8uM znVM%Lg=zylmGmC_>b%O{u%dc_hUGGHE1038IV9J1Sh|Dbpe`0$5MU}`*xf{){r)u{ z19JJb>oaU%Ly>g1Vk3cra|ZcI8Toun{~GK!3Jr=@9ZtF??Rd!1SP7*A;3J(ng7`adS_JGYViN6p z#^Y(LPcVdqIZIY&`x~`~OF&TLz8HL^7L??33@{zKN#7%?41Q-%JSV^5r`2^GeAEor zzNh~K_4C}wN_W2pB%UwX!Z2@Q*Df}OBto=?5{kc5iQNU=+>?+{Rg{2cE@t-Z%@ay% z+2U)Ip3)Da%tsRLZyk3Y>k(k0D?H=@jN-qy`+$#y+_nq6-1-Gvq}r7ELQz9GHc;PI zZKe!2&+VzXPT%YU;F>X^i2QUw5=_e6rZA_}0K8u7>@f*-+L%eODrQN6;1IE$?OTVPOyce65QJycP$_>T7YjuqHf!@h$^Y)~O-PhH_i)>`xAxNa5xN{?QD_FCWmh#6;1oKoXd4OsU^%QKS*)=xG1Z65?g(>`3xEryht9%#+F& z5>WbYC%Fcs7<0o8Y^3I|14rYJuTvZAyy{!QM{HSw(OGOC-JyqrH{a9fQ*7qlq`e~p z&!OdH!Jt&Son6&{_ghy8=k@Jn!~(FCP1|>xu{3m-K&J0Hgrn zzJAoD5{83>;8p{R>8K;fC7hQ1Dg+1gS36lt#W+C?Z-P0()YQ1Yxs<+<6=Wos(S*f? z09l~)%5=PTE3C_WOgGWmWA$WUo=(eX2$8OZAGm?v5sC|9P{pir!$)x3kw+#=V=8>! zOUR3J?SbR6&xsB|@PN z4?U+D)jJRlR6!FB&_Wnwjr$L;{j0r{U|xx_!0Uk_+obj%hy99Hq9z#*ef+F9^_Bd3 z@2VWY#2)zSd?p`CGD>{LBTe=M{6MF5N+E}$`nt3I^LsBJ8AZXVRw<6mv(#NYs64O0 ziM%sURzfWo^e!s7E`{Vr_Pfv8g9JKs;jiIi@1LWuG`UN4GV7X@D>#0)DJuP|>EqV2 z#5pEzC|4PEk}A2^m2rK71gs5;M}+9oD1nZ<5z_0JW&=CS`w}RGyWA)8B&-&LoecFn0vj5;zrT4Eb&KV4D0Q2vG=r!P+)?s6lcojSNV z7${QGDhs=hSy_z98#CmUD}xXM0YDVda86>1Qr(!A%7Z+Ow&ABB@hYZ5Y|&vXTkE{{ z4H}~2(@b>Dp)wEzwDWYFOgfh}hR{2S`IgjgbQ=v35m?=!f^={TEs-|^Q*-DJja>BWmi3>=eH>+%o(;mU^74vSXp)Z>V}f(Wu37?&&1I$j z+#-3ioENJuE_xRrz%%|2iI9OqzizKShW6?yCv_6%H)Z42Z6t+AXw4O|DIBYsS=L+r z1in>;A3|%ez41KFJBFCoNzKPo&^c?YBgY+rkYYf@9&Fb7*&2jP0YQ9G@@8{z{`KkF zm4v4T?FcMvgPe148KX16YO`yBJ5H7-H6IN$KX6cqs6!Yl;vPHE!*SIS9}dSgDg33q+zNmai0PhzDH{C|FHE=k8~KeZ?0Tar=s76U+9cXW7~XFH zcCs|;&ZwS8P}*lP?jHv(rCNZ$!M3XI3;;cE0hVDf!B0@7i2`9a``{;&^DfbYM02oLg zLJL+0o~EBOXIUm9T*8|BsiVC7LnFdPIHCqiY-~8mQ#c;ohvrJ%CI*WOS6+J%Q=NWn~(c?ZlVIhRZZbFSl-RU0k(`~rj7@J*1VUW++o}SE(70) zl$sdMawwc$V-DE_;XpFSkCQ#Lp+*r(7(>XRP4b((o9B62iT-Z@YDqFwQ35C=nQ(z? zfs1g;689CaSu_*K*hh~XKu4AvL)0>-ZjvDI#iiboVbn@enh@YR7(8|K>|ekjFp$tz z0Ap5Vta=awQpT2z@Ag7%?`9#w|Nfr7(t0fqLOunntj>!;`TIjyuSZg z+&#MAlU=7U_iVOkg9?tQ5D=y&5=GFb_>l9>nBD4@dWT@(brE@fmcfLBOXba`-xM+=D zClZtSD9)i`(7q(n$3Fhbe{QauX$SJ8hs^NeoIo6B6Bz?!0OQ)GqHATS0;LlpZ1F$s0ef;dvw#{s0&w(5Tt* z|9r_WHEutaa35b$)l=}}Oy9VYoWAu@H>jVey&|sDC^eS)>IK+YQQpA^+gnEB<6LDE)oja+e9Q9&>XsAYfUjY4u@siq*BlvF^>rgGaV zSd|W$uj}#0q~K1pFE!$KWrerimjR^?4W-O>#f3fr%Ac?8vshXr2k4_dN+^%tG1vvu zC=;$isa&U$N451utl==3F%k)+j zXe2yv@+w}IQoF%ezp*y=XCr_s8Y>^0C_1s;4~a@of3`4LJ)}EUL;$9QbScqeUsC~5 z{!fj#O5lWpt-66kqA*AtjTkKl$byu(6?g7mYu@#ubl&c(uC|-|%KSaH4|n^$=k~yS zoCn>QkTh8A?;E6wo5QSft{>>Rg)~mVZiWNr)E@GQ?A$JHqAD4l0Q1@<=9I6nqT;!s z@4Dy4@_|AtBo{O>Qxq7_SO3PKci#py@`5QEvv<&7mjG1EDoFpG?EvCL{q%5=JwI+) zFKEPH!qv%oh4$iD|AfFb^kPocunQo!u!zb6g)+L$Y{93U|4=y-rZ3;u06AW>t6?v5 zwe9A%i}~V@hqIN(cc_4W@GuPcNof})4F4-v2K);%h5-($Gb&!|Ukd0HDS6Sam=y;; zcUm~EH$xb}S%2FjFLZtjNwc%Aq;y{}H@!nrP@At>G* zrf^_8(GpBxdYesSkws?GkSr(lH5t&BY5^}c*mwdOO4$n9$1*EHzpm%qlMj_ zGU^*0TYEGRq5_*V5q4=-hAf?uvss*rh{EtB{?T|`4Hm4tT#H@Ad37fhMI|`M;sIE9 zVu^2ncV!jBk&wKK*?9s%Y``smHObNQ794P`^xvpGW+8JUbpC_<00)~&U8m07)y6MT z7!$)Ujt18av+yl&-T#bhHN-kkNzG@lW(;&OY=#h+b7ra!le&!-QOkquaSXil?VW}# z6)@ln9O?^?=<$2FyT+fN#YOG{{TqrK1swM@6S=}jq*IE4>~i7*uCUi3HNbQXQcQn; zmiJ>X;9j}4)g6$#40@Bz0Z5!Y6G22yj1IxK<v@V+4z5rYOYO}g#h^7bqcT(f%L(W^<--u1vZM!>q+2#nObnn;-@l& zG&}pN-f^T=%TpX6*K84E5uc+Cvawx6NG}$+k=H~ZmZZs}BJ|c}wmBQukH8Wqe*c$i zAlP*XxBCOuDboW{z^*Ai9Uv5$d;~n7rTyHB=o;)9_3WO|ZjC_FIqSjEGYKn&Ueilv z7nqzkcc(j;+K>8UEd&6GQKiZ(H!CRu zHwowUWSnQmc!U1q1W0_qo}F<&Gw?}&)$MG0oJ0wzj4)X4H`nITdul3-9GM$GjaHB^ zx-lvWzW>lGSDcbz!OkaY28xz|!3P=MIFKk*)UY_iF{(1y)^O;ZI%)h(b$F{C{|d~E z0}84K#=He;Q1VG&jbatqhVr<^E_5$Wl6Z7Rp&v z1hbQ*bn@W9StzkQvNt7~Kc>jVJznVS5x7kd#zY;`8xtu|T7*b(1K}Hca>fwA2(&jF z)73LK0L;U0e=>gyB;YRsc|mR+=J|y}eBA9U{Pyq>I znvPO0q0(X#a9&3F+pvSLI}a`s=V;-6+~H7j>kS>0`<`x-7odxfuE>c8`@-x)P0b6* zByn~EixGF=K3{zEtgb)dXy6Bp{d{*pVD{|b_k6ph8!y1I4q4^F*5I-kJAHu+c~G-W z*RI=9@78!1fMYP?V9k)i_BFnIGFkMMi-Nwofe>mh+3!RZu;hD`iNEyR+Hztbz7fck z97agsBQGS?>@NyY&BY-+qsW^6Q+GoQEpYNp$M4_IkhkH@Vd6>wEluHufZaH9lz~Y`RoXZy(`0yEvC&n5926=d${kjP-pMOJ!13kg( z6f!x~V+W1Gm*F4CPzM2&=S^=dr@1PN?6dRjmVM7C$3vkt1T6ijO~+Y8Yv@O9HXNeS zee2W6Uwk*jZ9dQl6xGC%_-*N8A0MYHmuHXROw z&usvE2w;Y096?m}UhVTzGHc`G;vm&{k>PytR!PU54D$$Frj@p-#xc14#n$kWI)`^! z^d-<8*U6cIRo@JxCt$gp4Ez&g#`(5`%Lu(i{Jrws95*p;^Zn2hFDMJsJ&9Zjr#Vem zo!lykF@6|E4F`#`k!{H3IwP$5S)_b~4aYkzgWO;A@-=J_c_+vNs_OluXzhNNas}Ci zjVpx=I0F2G!pSaxFX#j9mBp#X{@&k2q!D!=j^tyZjQ&;F40&Q@<>Q4d_(jx5M4iA^9g5md332E z86+em#c~;t=`!0`L;{kor`1>|iA?mds5Z0>Fzg^i**SRbd;n9YQ29&@xKos*_FhdE zbJdG$(t4E^Zoa+SHy~w>>2lrqlA#vSHXGw>(PTLw*9eh+ffEI@=|GXhmS%LXk)iKI zOH6~p4DPob?AIoM-!{&XD9Zn?OZH-|TU{91k%K-yG0Pki#sO_A&P}}~be}N2H{H7u zTcGraO(*LuijtmeV5#MK8A=9)n?RxrFQ7d_z-n(}l~%JT;<3Y2-x^-bmbMKbU%Yz) z{5hx-^D_~_kGY0|Ol5SR`t5J#gZ<|n58NRSr@Egf)@Lj+4v$Y{(O8qd52~_9eVOBj z-AY(pjxg2`3r(5v3M~63n~a*MX_AEVX32gR88E#wBLBHUp*?{7=Tz>l0DkZDpo-Lr zq&Mk%VL4STNruf-Ljo|D-dBO%J8ejLbJ0)>m}X{e8x2)%y%h(Bkot5ert8d=<3HLz zvaMeowl8sc1={)YK%Edcq`Kb<^Y30si@0Aj${ZnWmq-hHPpzP?{;Svy4T~ULmshG1 z>w_4LhHHz9Z- zkssc$2oMg4o>4OYah#+6{h3L}$S~w$d5!#EbtX*&r1nwbCc>8EI!=pdke+^rk@W)Q z8vJl#P_5WkQYp<+VyR8^S&N4nFwwT_g5?W3qpy|D3j(QtofAwfqP-+0JQIVu6G0Af z&+mbHXJ8x;a_*RG^hI=xY4|hezHgVZ3e@zu(Z-l*()t{B#0OUZ=Cdoh&mT-pBUig> z?SKOU^Xcn7scD29q5l5$>u|hmK78cM4-yjmgxd8d0%k6ji@2iJof{keDg$fTwJ@>W zU(sy0wIM5eJd`T}=KkpQj~`Vhs7COH zKuV5p2W!SJ!aR3Mqb9f&aDvmpkd`d|Hk@p-2OxRHKp8;7hwH+R>Yxy?3IvDUlZM|c z$C7K)Z4t)6ThM#Fkb5Pqji9Jjs7}}4BLQOP8}GT=URH0Bz_K}@vZUI@fc99&4R2i* z{(LdEAzOiqA7`e(l>=J?#?-8QVJd_DqU2lLM}j55(>Mk-113LCT-M&jL~G>7R~q)d zaM~}FW%^!n3zpo<_w+|aBA4CQOCS#N=7^Yv&ne!~Nv_wGg@7PHtZx{nKCXM?mks%_ z8KAOeku0*nJvE8Pu6(ZW0Ml?C+~O-h0La;SvSS`l6t#yvWv-EpF01QiRLYf8Y2l^A3;0kwk zk;FmMrzqgaYDKDDv&L6YK?0iN0L_^W)~(PlZ<3s704th=sW(Ixg$U{{wMjUHW3H>$gR!rI zfG8{J<=$HPPJf0Bo*+Ec=E~6L2kM_=L7heu$9~Bp{*0I7C}BJxiHe{b!%JM2EiP%9ExncL61WYJ_U5^F$Ton88W6^D3R0Q|ghpt9n~q}J%$OHj1d zs^3tPX)|5%>}1X73fI?b7YVSAD+&rlO%T$lHZM^$Tv-M{w<|;8oROrJI*uFr5ei=k zAZ;_)y8g2|I%o;u`P)pc7Z8$?1s>NmiS|S2Y@^MPB52$vNkkna?+wj2Dky}FH3V=K znS`vZOUy^)+Y1yCBDQp1pomKGOSR3ARoLwYE3nqW&1jM8oN zdj6=tTfo^)tnFh9_e~Lx!WRj+$;3F|8i``cCxa8|Dt-}{d>Pz9Nm=_~hZf}Xkj9MV zD2TH$12kDHiqh6#yAm4@R!;mPwr;9GhJGy}Q@IOh9= zvLUT8zK~b{B^vAL#Ltq`wvv54`O`MX|j=a7HRydx&0Z zVWTI4-5G^+9HKj!Ggg53*s3(|KR0L}RayPZvobmRD4ODPYA1lJ=_;rB-~Un@eGEYi za#4}7w#!1t8ker;l7wq4a6N@U($u(Q5v8^kCt$a&-^g)FtVF*#^_dWPKvPa48o!9KGocK+B<2eFkC2jWq zTXycfE1dV)Mb53D@CSBUmG7Q1mLwBH#fES9Jqf2N6fa>X?TUsB%MizPydsW6kyB3^ zZ;Iu{4?`LWp}$^--Vkl_RcjgNp&=X0JsK^xS;uv?Sro5$KShf8!^m9;C{JE| zJW*eD)iv1JQt%i$=3z0erjOu&5zM`3ZwZ>HK>nHzu$l+nJ zWk09{{$LPaFs?}OnjC~S`OtxkM_179$*E_&>0;@=iN=k#cOdtC?%y7Psfj%5;3x=Q zzv{W4)qU+MU0=*I5<49ovc8c`b&%O)+Rw}T)vd0+eb7sY!ahQpTmNYiDF94VnR!`{JnI6Br zU_CiAoTZ_`Yt)}^oh#O)xeeZ8%UOiQ`k8Y|wE5%dSf0Z!^lsE|JZ_A_$fRj0||8IrdV&@>? zl}$Ky@R1v#JNN*$<=64uYQ(7ki z7bL!9d(1@6Y&~)gAsD%O3GzX6a2#hpGkYHZbWS00t58^TImB^8(Jv76Ju<6J;|D+` z7|i(xKY3jtI72{xLCF+^zQoi}N>@?aG*RM!6giJN2Ye|WfIq_C56sQ?M&p5k7ga0_ zXEG=jx*Vg055iRN?SR}gsQZKX7J$~9hoz4)&GUtd%W z4#XJKK&`@HQ4c^GKpo*)^0u{;B;e(p9Eeg5YnrC2BjZgFPFoc$*n?s2AA)*dAfS-| zTr=zyC?IgfXT;=YV6qcoIu z2Z)Gw>dpVFF5-d!5-6ru(v?jnn2&z(fKJ=I1O7Af1*#{n(6c{Z>M_>UR;g<8x|C9% zuTm&G>ax|1#Jr-$a)1OwDH@1k&lBsl^zHMIa2#Ny(_Ai*j;`lX#{6$_B0k?%<2Miw z3a04m_wGi}D(a^Dxx4r#sLJ<-hU(7@$Y~AGK@HX<;*3Bu2t#9q-GpGDH%a$z?U+PJ z5?oRTC847&0DZ6a;9Q$~-+etVJ5mdhCRpyAwX8)2q)?`8_ww_5mZd=P4PeOu5GZHz zYRPt7Q_L<@iJJ)M3V=xh+^yXIy}UCsuZILw{XB%oI$NTnB_fiWUx@VVc3M-j)7eNa zM+3iuh}3O^=j$(IAm+E`Uc-^x({q|Tx>Gp_ z(U@RjXb-s_J2vh%J^_OmbxlJLgbpae`Sc*BV{6@+5E72H-rgesWIE_B2Lzl9YX+x~ zz#?al4+I=c24;ZJEKL4>4Zo3mPagV#~Ttxb1?hoa@|zz@;0!^H?+~1 zGD+%DMGEqGwJ0dR0K0ivVnDHcaMV)i83pm$bKI%{)9%hwsH7TlZ=<%gAWxKN+Vg}K z1PW_bg&c4MXP||)i~fmLMiI!PDjPe30~HqV=zZ5V)*4nfC57>2%mB&*ns22emif&h zD|G(ke=!>0-}cqP&g16Z!ln?)(Mw|2HtL04?D4;)vTmq0w9e{I8&?}2$*CNmw-!-& zF@y`d2&20dUo2RTYx5HNepH)Uh4@# z*M#W1c&$B4Wz_WW58BvVBC)%VK#ec9kpJ&zAGocaEpj%4CcS-MvJ4dR2+yc))#z>P zb&ZLnZOq;Qwdqag9}9$zzMotw#pu+x&cUNRE*GB*ygYk;D01dy)poC3>FGMD%vHnO z-#ETXEazJIlZ)wDsd`h(^$dsb}LqOU`=eCcC3epkM4~WX_K#JIp^sw>1_HIeq6VRZpbWZ;RK$bBDPh| z_R%sB@yFdxN~RPtihMw`c)OZa&itsi1Qnl_+AZ4xfFJ(0BPvbQStdZHoBb6!)ocZc z9ewfiw3G@Fug>gJ1#LE~7FMXLBv%6FVi@wEE>JedW6{_Om$yUYD00x7{UU1v*ml_7 zh|QRfZve@CDtv(8sDL`e&o>2%J%i;yNH0_EF&Z|T?$1uJvsw%fn>uE~z!(%gv?x}jhd z3fRGlmpu^=Uph7S!s#a7Oe&yLgC8&47k?qqfaQk6S0!d73re0w%TSEep8G~4jc5G6 zt^!9^hXvZGeHTP&C8q^)ye?Ox>tUcUYyOYni;*dhrlHA$3#^#bSNnR*g7KwMrR4pk z+-3Cr#e8Fe+_m)P$?yCWyM7Sn7)4!=a`H-AJ=ko}MKh95J4{VGpjMAQB>1h)CG@)3 zAyNEAyJz?_Qxgm25=teV>uGc06QW-)Qg7co$T-{mQdCf^4N(DKr!u=0))*NrGij_= z!81`0Z4~WgzIx2qJQ<)P7tG%2?#-uc{gf7Z?lkRhU#i)&s_HUUX}8zTj#2+=qb0d0 zSLUj!$CH=0ldH#*L6q9TTEOM7voJ=uQ1W$Jbu7eADo1WKOgsO3oBMI0Z%zy75w_UX zrDIk9=4s~FGpPCfhO`ZH-T80b`W~yIEKPpoy__?x)B_XrYzbU9ekD)hGy(-PJiTvH2$OjNTv6Vl6W z_FZ$+b5<;r%JStqu(yP|t|qO+ziN7h%FL9X33=hNR{yALxOGK3(5lzWaDhZTggr4W_%?3Y$hH-GOu?_R3qM8|*kXI=i$%SoB zQLOFR4u4)cm6}06YdL4V3QiDtH<%=Vr=PrV-+pGUEN5U}Z$jbkw740t?<<5zyC`0_L z(^1g=2R;^gSkWCG!BJOH_hM@e$yocvot$08=bdN96$j{yZXr5#rN1-56p&rLuwP)B z^kLtq{W`(e4i|FJh3U0Nr|uec$#CcL)I$tJvIURM2e91>J(1N|5o;v&jJk@54nO}km;)`SNbE)L6Pgt(O2bt?nTrVMb!M)^Grm-q!2$r{9T0&YqDXa2f&oU zn~%ci`5JZjWA_~tB!q)6`lBz;#Rp46v$(X_?G(4{A?p5F)49i_;$hD2`&V<)94ACW zZEdUOzfU6X4{BbnBJ7ZjQ?#)zI!)m_0b|5ez1C2@6v7Yhj;ei`!!AoPa!rnq0!}jOJxy*~5vY4y)DM-nj z%qd?ZGT0uaE@T=nG3E7ceK=#LuP1~~&4eC1<8of6naFusyxk2skL|k?0fElh*wO1E_yN|#NK}QI}6|Cd*08q=Wdty_N40y zOM{}^=*HXerKG?Rd6)`rx*=VTO8;A%^d9ofTA9&%Xu0`XK}FM}yCqD>u%hs%wY>)f zz1_W>3jfWGmbJ)PQ({3Mng@Acg<*R&>(NQzv0tJv-FiOqpG=A&?NQG|3dZi~#>9@R zWS3oUUJZBKe%I{%krj*MKSA@p5cse%W>hIL0uSEMz_9sjS1u&h-{t#0%6y3bpOQP& zw;4%g=Pq+tR2U~Bl}9W(*Rdg|stkMyrrl>R*%r`eGQ}MfjI;!fEGF`oy)S+OkG@*R ziYy#SZ4aKXTYUCEZPk{Am57gW4d8VL;V7HF`=Dx1q~|K)(v_IU@!#G|J{}qny%%?jdiSxzf_it4_50aY}tlNwM7j zwDbF+KD~ug@t)`5+lk^}uEnlJ6(d?sq@_GsyL6DwfakwKG1Wp!kepXffqIj)ud+@S zDWoJSYTl^}mdyk*O3d7s3kic&CDOZFqYa`Ze>*HI6)bdhFZ{EE?36A%D=F^LmKQBg zbM^f5=B>mLn#R05Ip+`;q^YBW3vwqm)m1M%+;ZK%#l?ARUX!?&;Ln?>+xrd{bVE5d zB}E58YU;U6F&zHO#4eqPy5;e2;xUPuUyoh>XmzpQBAMwU)?7pE946DG6PRJC0W z5<`0}drh$*emw=fIvMlM#p*w=(#G!W>~=d>h{BhF)!o!9z)Z2Nen^PYamqn1=HKO< zdgN)_HT3V_m#Ib*W~4RSX44l;mKHks;%B#69`IK@AOYttL67(EK42m2 zXYOE$e?|p;25@MsjE$B_FxSNSk&3h{q7=Fl2zvT^-peT_hs@JDlmTrhvwO%DHMuET zcBu>>0WVD{+V0Pbu$%t^`rN$Dgx8N>B0WOV$D_(IlbkuRLz>^tq7zj!$_@X%cb&^* zg8m>dpVCLlwSX{Y!7hUZ`E}ZJ*hD1~oMp=zwY2^BMK8mO6HH3rnvPHGXP$lHgD3PH zND!3sK)QVqa(lx?{;KTcMIcG-^Kl zZIs^7`SR&n)!KK1^AuD@VC=?ZdpUDd`io=7G@)sd7#^BeZVaa(c95!pNf3G;Af(g zG*oyheue(jX3ud@Bza(drl4CMT>0gs7 zo0O@BtP|zsnTUDGkRMu=A5ysCgwIDUncd_vP)cflmdoJRc3L)vJ8N}d&!kIU4)<${ zm@~KaLyh;bLGe{`nJ8F4?&YeB;Um|k`9cK5-vz~IH}F2;cFsaQkQ4Ee&n>g*!4M4c zUyBuS7?zN#X1P9>)e&wf0%~AuogcdSbN!f3sCCQ`&l|Q*{o^|;N=r-Ux{dcbKZOT3 zFOANz6lRb0RPe{e#4ySr(uy%W7LR)L%Z(m@8!F_LUFZ*ndnjt+`SSI}5#pmFjPye( zDB6zot>OlgHi@cihkxQqzUC}{ky5LLTK7H_toGvEES%#t8-0v&AKfw>T3k;N{zHD04UZugaz;1H`K@DCSs)~%n^dBxyXXIrL-gAR7A!Ah--TZdn zBj_WJ=lyQNah}i3&kYJxjl50=%h9V>U-WDfEgHUR=U{KoLMdoJ8n%gc$tWLx)(hRw9^ftj*SfqOJNEuk;${EcfHXf87v@+ z5RYTieC9>umXw83BCU0;^&E)K(FxpJTNxlc#&V>2|3pobpr3DR!fUIT3{J>I4Yuoz z%>4XQx;dv0`b2!{@>5pTa~q53M)ggRm>dW157(bLxPI9SG-u3qxPIsThCxi_`Zzib zTm#a&2)p1-Xx7r{yGc}=;jr^%`4RZIQGS%ZTCF_dKqs)mW}RiqD!bxsUpV$4S@I!J zD~~2Evi8b8UB&t__S6HzhRvW6OjvWzrAVqkt3pH>+%4mF#8pF}kGF9wr=6KR^C|nx zRk#Y=Xb)|Y#yr)${dOh8HtJ*`X`?18gJjpt2eY>+EaQ=uNK)3d;U3SCB0Z|_ts2Iy zCd_YR%(g#;5D`Sl#C;Q^#E17Mma+9g6H)*A7sZD|} z$KkpGzs>1XSXw(Jh$;J*X^BDza-6wG)UC3O*5ke@wH@Ais2g z?$`S<;U^3XnLfLy^#Cx`X8Eug3+6lVCAaprJ~EIPMnw%pnon2`=kI;}+kfO+6;{p! zJnF72ITlbjZChu(n;BKPPuLBDgT~RGSdX>N`F2FM194_*YPfy#gk%iRF^nR5t=N5~ z6(u6_i07d<@39ya=r-EnsLvNHcdAbM-(xiy=NI4r>rd|oCYOF;agm$Xdg94fDuoxo zMHZ~I)*O~dTgRg0fnkH&PAxYby4)y%mXSX`wq#{u$pjJW%I@shiNwb%rhXvI6)0>E zM!CPg(BlKL!=_a;nPR`#HC;{GJ%EN=xVtBiLm#%6fV8}KFRDM=L98=n;p*$#SmJ3a z$2h(s-=2S58r1aUGt7-TsEB{ZPR?Umchw8h;g zmB?N$pH$fnsc~qRA_V+s*Wh-kLkkFPIF z>O7Xev&L|enV6WcD4H^d0>xx$U_^S~^T3mick!zL(a*Q)xeUP+cf}CmxAw36RWo7& zB_ozqhLZg8H*e0he?#pn%FD}RgU_^@EQNEa8?M8rc#=4?o{#c#XlOOKAL(Ey6$O+v z?N2bj1-+guXlY|8n|V#X7YBfwq4&Tlweiwxl(_a#VklG93S9Sk2gyjCoHlBL;$0S4$= zck=kb%_tVtK!(eoq``nYR$XBN?3$;@_ zG5c;jPmOJ&(yEn38^cDcwT2h0kR&n$G?YeEu4-eo8v+AHl0Nb6%%vl`z6|NlW^VVbKcK7s6V*eNd943k!HY7~3aB^R_w%uucbOUQTQd_YB;jVh0fx2R>V$`{wm*&tQb$4ha6@QmcHTTV#G~$Yw@|yxR_SpL8 z>~WjbAp$b*oE)r!OQ~YCtIT&p!97(mFf5??TM|ib`*~m-ZZ*JM*v1-w9T3BojDi`f8+9TKEvuv>pTop{ zk7~tnpP$pUwAicwDYW`GXM69T6D5Mk$Vla!GVk|7?(g+28_w!JL$+54eynzv+rb$q z6ZAtHzXK2Ay<%24Ve+@CdT!6Ece}hO-gtkPvzo=uyNMCi_3@a#(_^8|{BCM}y z$`mAwOGs##^$+oB?RN!rYKv?y!6(}hZ{&BSPQUj~AM9DG`lqf|hA=0xEnjpS>V z4KwC0Pb1wn|J~3PY%QY-&f&Tq9v7F}>~Ax3B!d7d=V0`A?d|&}55VwNz^%JO^xf*C zO2UnK?O&h2={@6{XP3m*$Gbr$3v^+og+P5B*9YU44B%e zsi-gKUoX(Eb;VLQZOR3%@Ea5RCpLfP1Rm)|(_vy@~(8WTQG6!M(x>_hGUY-69u&n|;G_YVxP5>O|f(0=wS!Wyz1d~Lt? zd(OJ^+R8V*3qYdgiv)LaO`SMzlG~0|e~jT~8I!t=7sH0=9s1zBIl1z+ahVqXj=ues zna%u6*@?DH_Og|4iD=^L4OZq5U?Rf8!a8?_sea;_ z@?i1oWB+`Or=o{)gv}ZbL>`rjR6KUN_Q0)R!J=+YK5xW<=YG>Bu%Rf?c$)SAGjLG)F(pOe42NKz;;Gp!aF8;6M)iD$ zYG`+%QkqHX<1%S~1sYM_!wHX4hf>z!y^FQL3H^f$_{q(ul)F2|oh1p(dZ&u%H32K; z_WoCRPAbc{zSJLpL$!@rVhjuQKUY-K3PD4sDKqJ{GZ={07xEeo7LZXIB`%~GDI$1V z)i2bby2`5ru7+M|f^$ecwLB&+5)2Eg2Rl}KvtgWMnR9M4>^6f0&g>e~Z49ORK4g0> zKGz%#^51-FGx=!Ab<}#VSu`mwS_`Qi6MTa>wktKrx9xK>UX0+^9sZF*E##Q-g&4^pV@LmwKl>e}nw$GzdqIgG}r+q ze3u)~S&9=`VKH?6VQ>f?3XC%@Z@?Fi9OZG&mFypJ!lqPk94Y5@i;kHA&xSPM67(0p zOVfx)?y5QPFCABC1mHFMfLQIKKh-#|eVEr_q;wt+hGP>=bz|JjZLA3j@iHb6FBO2K31L0N3{{*cUG0b z%AR?w4`prA7q)eGcIFft&r9f0hg=JPwXr%<#PfZHqV?+MJ%ZD0ZrE$C%8AmFZ!_01 zlw#fAe@yD$k>Q9hc>G$QW|NNAerIQg>@xwr2Uc$)836QbM}K4f_<9dIKV3x;ItY4N z;Xn})8%Y*HeCGdC)LDl$`Mzy@ii(1Ofl?BRAky6-Qqm35C7^T;X%H0!>5d7~9U?hk zh=g>*Xr%_DrDO2k58vN$y#IU1v+aJa>pVZ_xjo=bT%#Bg9U2;9b{1j`pflfQdj$Jr zd_qi3KYmner+?f1e!7Jz??P<`P|JuSIdi5ju3iU}fld3mHKyYEnDn+%YSF$}}sdIH7=i%wBuetP;=j4*zH zpnjcs_VoCWAALDo)~lnlbBUaYOMK-*Q{87To0cS@^`LqV)|$b2U{J4Cf!2z*jZFc8 zdwd48I#m*RJwayU?E2(UhKH5T5-R+if}(Qq12VG0Gk)>L6`Z#RQUVCf=W(Sq`c*c# z*K-R`MLLCh*S9$BG2kKbAB>U0k)ejLR)%ecgNdH4rC|zK%ge^DC<{g@qCH1V{7b@i z36}CqwRU)jt}(|SR#YnL)|bd_Y&QOGczqelPdA*X8uEN_5*;cWTqCr&&Uf}c_~aG# zfu(kIPmY_{!KZNFooi{;fx3?y7cM^=cUwk3ol8XKo*i;!z61LrOnhR3tY9oJYL`K% z_P%@k;Na`YeLt{F*047mdo`}EwB@kwR4%9_i(2B379|i*#u-m3Zsc*rvr~(>v+pNN z=2+d|0HQNYZ1H;``jtH$HT4duLwQ-|iqg+^UECHK3|$BxqF`ivjCV~0J@SB7$rhxHVs z)a9Srw_+>#89Z-#``=24W}&B#$=zK&c!3C7=k6J6U`Nje{zILm=DEhk8h%T9qG13Y zF7GuCzRKgA3mldkIj7TB5?D-=ni!_gz@R5XnHSRh9&byhHCvi zY?>rdamtI`!e|HI$CQN?_~eeqW4(=pGw6z@gD|H zrMucAx@(=AK_>@wH(1DYi|m(#$AL*xK+GQw&{xE>87~9Z7@5A4AS|G*84A#X4!FPy z?uvzSKbZ954kk-@n4(6l!m3!6ghryU)~oejG1^@Zv<+teh9}n@hbDr?f`;`GRn^}= z-!e({z)4tPGb(qPiC$z`vsO--yGKfHDv7|C4)Ud&t$Rc7n2Yk@RDr|Lrrx)pWsR0mtoFoUiZkg1lS^#@d_xfiQe3(Kk?j`!qUa{ZfCC=ZFc`pRwWi?8>0~hsp!>X>sIZKwc^72@xa*nG4 zjxSLkh2@-;llUzZE3A6b;`X<-3$+zTH^w%nDkCF*8ZONdoOGMp^RxrA_K6tKvsjAB zXNx*5)BgOb9o@gxc7^{6b^Pja$A)71CYCUmgxp^IDN|bm5%-Ndy}h1UZ~frAs+*0z z97MES*y{%Ly*Uh;3z3iQ)~7=g1zYE4{OcFRC$i=A?AN{z%(=4Nw5u znCOWwt`gjY%fMFxM)xAUI7Ogj3gr=j2UygGgqMD(a1c}CDRXUC0_%hfLMj#=YuOlU z*l>n-nV8y@8qD6;zgKpLh{Amj)N}GgE;M-Fw=;Y7kI;V?z#V1gO|KTr)ZNs-42lV1 zMH-b@vVEZwo8R{U{>T_q)#b>8t`X&Xq7%j(R8(Xa4vp73FC1PzH%!d%0=hgR8g0w}jLMzbmHr{+=t|`G4^C z1-ZwV#ZW#EX&e0K#(3euJ>VZ(_$^$@5Z;1Mp5%f6Q2n-hhqk7!e|g_xq)cdhF-<5| zDDYg(#q;%QxY7I`5s@#TYMDURxBFihCeTU<=(Dsry5<%RsA>KnF0{I~p>YDHVZuc&EhDP;CO41e|N)fI<8 zK)vbMrowkNnb{4V2u--GUBW&fg>TG=Bu|GN@AZN27P+nWZ)7s@+?c$=QfS1WcbEN% z?nC5vg+<3W7VR_Re3!*dJ0r)P`)p}d1Fuig-BbA01*0x05HOHEd;Y^_l$UKDqsoAN z&_qJbtIwcm9m$V8pe8pHY&m@F9v*FKO+)4`o+Ida_wLa1JASl=zk7P(cK+>_WdLZJ zU;BZou_=KjhEa987jT$oUf&kpNq6*g{G5FQ5V!t}@e@YyBA7HVOhs9maoz{(-ty|| zTt+WF{c^M3|0AM%qjvq7xoC(NIxa#)9vq2JA;{J3H^USJL(np7S3xMcJ;<(7LAkCm z7Ae8##?@RTA4#L$&Wv`Wml-dTI_9-5V|XUG7G4LztFRx?$1+P}Ehmwt89yv^$V$(n z`B0o)W!gwZh<>!ml)f)iRM=BM?D&EV0K(g9y1H`EQT(>O>y(xn z6Qdaj4q{@#O&BTgBkz?e-wY)*9Pc(rL#2+#3HT%ese{8{g+jU$#FEdB!AZP6UNr7H zs(x`{_b8l^s&2c4M1Xwjg{PDy2;;$CJOO{`A!U~19|60T7j`uufq4E4ynsZZQJ(2> zWpayykpUt9DO`)G*%u<%90~YrU+^N`38()9nc%}PT=O}EutUDA)nPkV+TbD)Jj})!@%8jHht}`V#Wp()U^z`4bkaQUCYY-k@cTX^pge-`g55b@d zkh16HrFnaFxT;lRcti!|v#D#a2Q(R{<{GV{|vSgO1S`3{=1{Y5_*HqA}68^bRff}PD1-y19O;C zw})jo#J`eo6v79K>!BJg{pyLdPV`f5Aix3n7)(!T8_RXwQK^Y(Wt?&s|r zHypJ;aQQj!4UG^A&tV;2BuS=rmw#Pp!yr_vHz&lZ;0WPOP>6W8^2*W*cx0w9kIg&D zTh76@3KSF+A-e2Fyu(zSTdd$nLl6HZO_bZfyXiv2Xy2U6l*|tGzIRQn%A!m6U?NwS*RN9< z#rtZQTV&8^y!KU$ClwqD*|2gq3hv>BD`28AA-p{{cVDQg7D^*Bd8f+m>!znS!Cb++ z%@hF2W{^2YS6ZCRLDUeaYxA?_Rzl_O?&;8DcYbC5t>*0Bh97k;-+L&flhz##Bd8Ji zIWudm(uEx&UBdBQXASVx(W05A-v0SV26|;2)MvZ1SI*eBfmGjF$JDA}m_lrZayZ89 zrt%Q1!-|uG4Y&ZcIXOUwA)}?L zePloi(?u~HK>J(A=?splpE4ZJ>XUar6lM7SxJ@~+#v4f4J%6Oh`b4Ef>h9jy(tKz) zkecwk{6aa~)m;(Y)D!>n{o;v}gH6g0!5`k3)cOo;S-s9Pc5q}XD4VqOj9&RnZr?V?YA``0Baz^mfes^{j2)-ya(Q@8Q+u}FY{^YC>Mvc)O-lXT@ zkqX2K&o-jj!YXoca(*X!jo>Ip3=R$gf#Kz@WFCl0k9_D=kjJk5SdI%zdq7hfaCy1hcHHYjWCO@#S?=CW&=Wyl?&q{L|(;C)+G-M zh(bq;3=ek)#Z~`jS8nHA3>O3uR(+yC8=_+TuYbiC$B>~XYq!j#x*VTA9r@)jy*8FCmREMeN{ij=C7k4iv8k&0hEbr0YN_Tv{ z?0UL6ajW{1g6;v0rzfH0Wq+jX;KZ(nH64sR){N&pKsfocTs9|5Nw?x8IM@&d^-6$iiF1nov`Qe zh~C?MWVl`)y!_=CJ{=0VS#esn$2N8ZE)caFr>ZG2K2LW^EMO+} z5oga+nXcP}3vQM}9nm?oWH>>7PAwTTQN27bZg1uTk*745&e9yCMY-rk^ zz%u9Z#SRQ`ivc(pEhNaE!u{r*1RyC*;rGo~6*1#4X>)rYv92+%l?p5!5K-}k*pHRq z8uqD$W#JoxeD%&TjHUS%@-alKqb1&uD+RCES;X0e&LBb&NRO6aAS)+#lPdUKgcwZ( zQkg}&WM-Rw2MaI=Fg5wCgv4ERN~!aiYVocSiBDGK;E^UdfN=UP=4m{fy0rLc6)oo9$PL_&K+z z1%E%=H#RmtiWcp)oHa(`yblDgvyi2&Pc?Y(is&<8|KcfQSy3l(`A2F}xGf$@ zjMG9C`S&ED=^%t9L|NhP<_F>lw}IXWIEV7z2TL4=+`jR9*UZF%C!N2lXjhRMx)9wA z^EuRT3A&8eL&j<>3?vP#KQcMGORLnFK0hlWzbNCMGPzz&Q{%LyE#>6v*G^tqKR10; z($=RlZ83+CFS))dq!4s(v*T`in)rX2u9}bWR~ns*ToT+#*cHA{zEF+?J8dzhMLP>A zCY1g-@f~6?tMSIDsERuzkINZgo(BPReg&88aDFM!Zociymzy%`7-m*+b{!*hS`>Ir zQ&z!3yzH-!VdnWfryUSRWH%wSr!T6|A0K!wNygzZ2c`%3aTx&`2P>ELL}YN_f3ohd zB7#<&*KqkYDh=%5cvcg$U=k@he4Tv#y-+5enw>r7 z4cc&R3x5Z@Vs?{w;qs?lZ;kLHRX|mIphiB19DCD0I&w>=GP}-3*n5Xs+ppZgwJ zfpSWthL)BR#|AlIZ&tQCA)*@r)NBij^SKsQc5b0D{SVBk$SWOk;yY(vA`g~5l?`%d zk0#t#8%uRdji1Y(-OT%8GjbgDjvQnFEza@vV(g#TtP`OS3ml+#Km)qx_Ntizrt!!2 z;lm){IY<8|juo*F4CTQu0W54{c#?rBS*!RM_-!CxVmjDpWl6b%h=8-&H5CPdn^Rqc zu=}iP3YY6$pmEn;mr;EiI{~4=tCqZh;DV4tMKQBy9k@^x1aeA8U0wd@4Ck#4f|KS^ z!Me3sTixV#asNHpBS)D+*Mt%?A8~yq2?>-Bx;O=g4g;myE2&8IhxJos&`9AIEY>?; zTZthC@s1ho1kl6XlTU|XbiSff;i`-C3GXt`o$ggP1pr`Mrf2Gth}*+1c8zkF$X5S! zI675FNd_H$P>dJSz@)=Zm!tH2*lLHY^&MZCJOCb(C3XsBs(U?GDXrYHtBt5Ize3GI zjIBvNUq2`+_^E~5`j;;HCal9tVDKT~e6Mba_=gJJ{9y_>#Lnq!ZbSQ-{b+Uweo5MnhHX{X3W^1U&fAB_Fn$X~1z4p=xkza(i z&57FXk7;c{)z|xcgw~HD8OP1rRwZ-hn(-ezzjDF0NPv$hGx|vH7l)K$Ke5*>eaSu| zQvRJ!K(}Ppt~Go+$%bzrfn;{{vcJ#U^TvUUBjOV<#22@ms~<4p*J$Ce)P;uM&N^L6XaPy%|99?1gJkO@cahN~0{9+nx%E zASC9lNV9c)%*UtwLHKUm86H03v*(F1JNFzsjY5;r+y5+8D_Hn$e+nmDiOvLd2+{D8 z{1G;AeqlRHj&_!oZi=4^v)H+(-E?1_wrRSX_0 z8CQGxY(|xa!Iu8k$q6~ZX|#k1QEkTNcgIrdNzQl7Bn&!~8vt=9;C3?ef{g@s;Du0;ixhq|D3b{dG|;vp_ny`Qz)F3v{V5B} z`Eq8l@AmOXVbJ@i!Yp)B?b_w5kU%3UXRBRH`AMN!q%u;Zw>l(m;=evv4|A2zO>^Kx z;?7*x)+Rnp{`GxC|Hum!7GZk~(#T}H2BH%#hDF=G)YMc0Ezb}6MkmA`Q=$#m&dyxr z<>lSe#5@Q8uEexcr-}OxKK#3GFtRy|(pEl7*1%0x$J+P^s*-f}{#rl$;p+|G`FAQJ z!;t-hzGOodY$DhdXECo=jG#BB;Cin*pfNCt#8JV44m3=7Z%;-W1Sm(0tWT~AowPYk zs$iV)@K;YXt(n!bZALgC8PMY}td|E?{;CBVH6p^--K`gR=8f#!T;1=S6nBnyJ7U6z z^+H@AmksK4`NKkg&PD4ZEPlfX$}Eo1UpN73Deu#fQtlB|Jb8;JMV|&bO|3I=dWjp- zvirj87?I<#&GsPh^@8iOCW;$~-=B;#u50Mn{ra4*bN5^*q5^7|@f6#G@5|G&Xyrx9 zAc&r6czPoeYy8%e_c}V#Y&ETqV)Xc3Q@!>!T$7-AtD#|T6zu6r;y6*~dk1(;g$P<1 zcP?Od<-sj?J5!c69)#a4>+|CYI5Dq%f*VNp3fhEP1>5jFB@ceKR3p-;xVWBgy?C(Z zo%U#NsFi1{Q-WqK;50O|)rVq>ZilN9V>O?#w#sb9RQBN6M%-neVK97Ud1*;4)8(6|{ZL!QlA8YE-(u{AlKsai;diPge|B2S&q6Q%S>FBb-Mg!@V)dm* z3)}PIKGRwXkr1L5>NcrK1h0l;pWz0woPl`l?HxW)y!;qO+1}al857*+wMSK7td)O< zBfR{QaIKJ#3rD8OYtp?{3I8)KukBOMN&JINTTjnAgKf{1!Mr=EVFsjCUEC%L?5>b{ zLYDuVX^`u)1%yP@pwt+51s<3M+&e8Lza6O};x?>PWy8m*?2WPCjD*N+whvBU45$L! zK&Bjm!G4Ht|HNDX(oY~PBi(2G8)T=~$Yy<6C5@(h=1q@R3Ag;^t5-jy$xVyi%yVr@ zEAPRAT_vZtKI38f{_m}M^E3v6=#@!OhPt*pY`kcG#bfsihGIXb3(HOM-`WDFJt`?s9Hl+VzkS)U-&!%7)EZ z4JVdoLx85zcI>P_yKt!(YJa+L(SVaToWEVcJrV5Ri|Xoq@kC+Yr6s>Q zFG+|Q)@cb|;51 zQNj7h7!s&0M$R@evb!FDsS&UX6)XgJXqUXUni@R;POxqHtsdN!z>(H9^4891BRP(x z%88E#{N}*#^65o%XauUXj~vShQ{!LD3x?1}d8I74@5-o0B9Lk1N&pNM=oH2)Auc_e zNF<^1GfY)<(Cclxmn9kW(b+CYNdBca32g3f+H_o)vXYp(%cT}t5q$U`Q{2#C{gpub zGfhsTTb*&X83o6}b8ta^jZ3$_joMF$+JT_#Z$+-EFsSw9e{JwGf$RkM4|cjCfmxtTN&LFyq#8m1+ZbymBJ2WmEA-cvw*-s1SSK|zs4(-TpIC>>3_YQztb)O z|6kiVMAWu!&CgX4SC)qNdKNoOmlE2Zt|Q?QBWvh0UoS6x1~V~y7;GnvL`>>qGQh(x zVDK66b&T^g)vsHr(jY>B6FpmZ&dyA{vFq4 z?yTbhiYIdsbzbBIJ3_I*#2AtgI*uZdI$wVH-X?@)?4?Cd0wW%o%xCL+d@7VrY)J=W z65+Shqf{t)_pZ6G3FMxI0=E09;G31jFB?V~!AjhG5<%;caq)+)Y0as*=pBht`54D^ zQOAWgi`yC#HH>KF0v5zn2cu&>Pj0lbv%z|z7n=+VIKk7;s+?ay?B_8f<7g%@i4gmo zcR9>^igZy11}^o6aOp_3b+zv1ojb{D)|VphUz3$mdD@-QwYo^34Agi%uD7gb<)6%6 z>YCvJrgTP&Qfz8&5TaBvd-X6nu`?r=;N;Xl79H9^r2?k5`#u-B8Vg{s9##}K*VNM8 zjB9EX+aDIH8I{)Fi<=#9`Z`iL_9CPAkqX+`S-^2teY)<=d;wyznmxN0kB$f(r+!zH zC*m&6MofMMX`As~$Sw17(_m#tAI{D%JQagydnb=b&lVN2dS(DK7kH-aA_B+yAf4wK zxggT573kN_-#5NeZ>{vxA>Ve)F>xDra!|1Lpg#b#bks0-e|W&V9j#CTNBLpko30c; z;qQQZ?nN&d#^fr`3fmrQmG*-=nFi)kq#N+vX$tHt)hSgD)!Y^2ZK3l%=(@#afo%fJ zyP)o(Tvf5Ci}c|x>=WvI+}`!m=Z??QA|9+6*ERo)Q8kw@7LImX>N*jgQ=SN68cyWC z8~FM89YHiq@Vt`>H|J>(QUvoEk(HX4gxIh21ryQGUl(!v;xDIT0?&5%Pos($GP-rf7 Txjh6K0Zd*-MY`m<>AU{}?sA+` literal 0 HcmV?d00001 diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..856a59f --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,7 @@ + + + diff --git a/frontend/src/constants/dimension.ts b/frontend/src/constants/dimension.ts new file mode 100644 index 0000000..7258d24 --- /dev/null +++ b/frontend/src/constants/dimension.ts @@ -0,0 +1,106 @@ +import type { DimensionType } from '@/types' + +/** 各指标类型的评估方法选项 */ +export const EVAL_METHODS: Record< + DimensionType | string, + { value: string; name: string; desc: string }[] +> = { + classification: [ + { value: 'standard', name: '标准匹配', desc: '根据预设标准评估' }, + { value: 'sentiment', name: '情感分析', desc: '识别文本情感倾向' }, + { value: 'custom', name: '自定义评分器', desc: '自定义评估规则' }, + ], + metric: [ + { value: 'metric_standard', name: '综合评测', desc: '根据预设标准评分' }, + { value: 'semantic', name: '语义相似度', desc: '计算语义相似程度' }, + { value: 'custom', name: '自定义评分器', desc: '自定义评估规则' }, + ], + text_similarity: [ + { value: 'bleu_4', name: 'BLEU-4', desc: 'N-gram 精确度评估' }, + { value: 'cosine', name: 'Cosine', desc: '余弦相似度' }, + { value: 'rouge_1', name: 'ROUGE-1', desc: 'unigram 重叠评估' }, + { value: 'rouge_2', name: 'ROUGE-2', desc: 'bigram 重叠评估' }, + { value: 'rouge_4', name: 'ROUGE-4', desc: '4-gram 重叠评估' }, + ], +} + +/** 各评估方法的预置 Prompt 模板 */ +export const EVAL_METHOD_PROMPTS: Record = { + standard: `# 角色 +你是一位专业的对话评估专家,擅长根据提供的标准对助理在对话中的最终反应进行评估,并确定其是否[[Pass]]或[[Fail]]。 + +## 技能 +### 技能 1: 对话回顾 +- 通读整个对话以理解上下文和背景信息。 +- 确保全面理解对话的意图和用户的需求。 + +### 技能 2: 最终回答识别 +- 从对话中准确识别出助理给出的最后一个回答。 +- 确保关注的是最终的回答,而不是中间的部分。 + +### 技能 3: 标准应用 +- 仔细审查每个评价标准。 +- 将助理的最终回答与标准的各个方面进行详细比较。 + +### 技能 4: 逐步推理 +- 记录每个标准以及最终响应如何满足或不满足该标准。 +- 提供详细的证据,并解释为什么最终答复满足或不满足期望。 + +### 技能 5: 结果判定 +- 根据逐步推理的结果,判断最终回答是[[Pass]]或[[Fail]] +- 提供明确的结论并解释理由。 + +## 输出格式 +以下列格式提供结果: +- **分步推理:**[详细推理在这里] +- **最终结果:**[[Pass]]或[[Fail]] + +## 限制 +- 只针对对话中的最终回答进行评估。 +- 在评估过程中,确保遵循提供的标准,避免主观判断。`, + + sentiment: `# 角色 +你是一位专业的情感分析专家,擅长识别文本中的情感倾向,并给出[[Positive]]、[[Neutral]]或[[Negative]]的判断。 + +## 技能 +### 技能 1: 文本理解 +- 通读输入文本,理解其内容和语境。 + +### 技能 2: 情感识别 +- 识别文本中表达的情感词汇、语气和情感强度。 +- 分析上下文中的情感线索。 + +### 技能 3: 情感判定 +- 根据识别到的情感信息,判断整体情感倾向。 + +## 输出格式 +- **情感分析:**[分析过程] +- **最终结果:**[[Positive]]/[[Neutral]]/[[Negative]]`, + + metric_standard: `# 角色 +你是一位专业的模型评估专家,擅长根据预设标准对模型输出进行综合评分(0-5分)。 + +## 评估标准 +请从以下维度对模型输出进行评分: +1. 准确性:回答是否准确无误 +2. 完整性:是否完整覆盖了问题的各个方面 +3. 连贯性:回答是否逻辑清晰、结构合理 +4. 可读性:语言表达是否流畅、易懂 + +## 输出格式 +- **评分理由:**[详细说明] +- **最终评分:**[0-5 的分数]`, + + semantic: `# 角色 +你是一位专业的语义相似度评估专家,擅长计算两段文本之间的语义相似程度。 + +## 任务 +请评估生成文本与参考文本在语义上的相似程度,给出 0-1 之间的分数。 + +## 输出格式 +- **相似度分析:**[分析过程] +- **相似度分数:**[0-1 的分数]`, + + custom: `# 自定义评估器 +请在此编写您的自定义评估 Prompt...`, +} diff --git a/frontend/src/constants/index.ts b/frontend/src/constants/index.ts new file mode 100644 index 0000000..48eb5b8 --- /dev/null +++ b/frontend/src/constants/index.ts @@ -0,0 +1,144 @@ +/** + * 全局常量与映射表 + */ + +/** 模型类型 */ +export const MODEL_TYPE_MAP: Record = { + LLM: '大语言模型', + CV: '计算机视觉', + NLP: '自然语言处理', + Embedding: '向量模型', + Other: '其他', +} + +/** 模型用途 */ +export const PURPOSE_MAP: Record = { + training: { text: '训练', type: 'primary' }, + inference: { text: '推理', type: 'success' }, + evaluation: { text: '评测', type: 'warning' }, +} + +/** 模型来源 */ +export const MODEL_SOURCE_MAP: Record = { + local: '本地模型', + api: '在线模型', + online: '在线模型', +} + +/** 训练方式 */ +export const TRAIN_TYPE_MAP: Record = { + SFT: 'SFT', + DPO: 'DPO', + CPT: 'CPT', +} + +/** 训练方法 */ +export const TRAIN_METHOD_MAP: Record = { + lora: 'LoRA', + qlora: 'QLoRA', + full: '全量微调', + prefix: 'Prefix Tuning', + adapter: 'Adapter', + peft: 'PEFT', + adalora: 'AdaLoRA', + longlora: 'LongLoRA', + dpo: 'DPO', + cpt: 'CPT', +} + +/** 数据集类型 */ +export const DATASET_TYPE_MAP: Record = { + train: '训练数据', + test: '测试数据', + eval: '评测数据', + val: '验证数据', + other: '其他', +} + +/** 存储位置 */ +export const STORAGE_MAP: Record = { + local: '本地存储', + minio: 'MinIO', + cloud: '云存储', +} + +/** 评测维度指标类型 */ +export const DIMENSION_TYPE_MAP: Record = { + classification: '大模型-分类型', + metric: '大模型-指标型', + text_similarity: '规则-文本相似度', +} + +/** 学习率调度器类型 */ +export const LR_SCHEDULER_OPTIONS = [ + { label: 'cosine', value: 'cosine' }, + { label: 'linear', value: 'linear' }, + { label: 'constant', value: 'constant' }, +] + +/** 训练模板分组(按模型系列) */ +export const TEMPLATE_GROUPS: { label: string; options: { label: string; value: string }[] }[] = [ + { + label: 'Qwen 系列', + options: [ + { label: 'qwen', value: 'qwen' }, + { label: 'qwen2', value: 'qwen2' }, + { label: 'qwen2_5', value: 'qwen2_5' }, + ], + }, + { + label: 'Llama 系列', + options: [ + { label: 'llama2', value: 'llama2' }, + { label: 'llama3', value: 'llama3' }, + { label: 'llama3_1', value: 'llama3_1' }, + ], + }, + { + label: 'DeepSeek 系列', + options: [ + { label: 'deepseek', value: 'deepseek' }, + { label: 'deepseek2', value: 'deepseek2' }, + ], + }, + { + label: '其他系列', + options: [ + { label: 'glm4', value: 'glm4' }, + { label: 'chatglm3', value: 'chatglm3' }, + { label: 'gemma', value: 'gemma' }, + { label: 'gemma2', value: 'gemma2' }, + { label: 'phi', value: 'phi' }, + { label: 'intern2', value: 'intern2' }, + { label: 'mistral', value: 'mistral' }, + { label: 'default', value: 'default' }, + ], + }, +] + +/** 默认工具列表(其他工具页) */ +export const DEFAULT_TOOLS = [ + { id: 'data-generate', name: '数据生成', icon: 'fa-database', description: '基于LLM生成微调数据集' }, + { id: 'json2jsonl', name: 'JSON转JSONL', icon: 'fa-code', description: '将JSON文件转换为JSONL格式' }, + { id: 'md-convert', name: '转换Markdown', icon: 'fa-file-text', description: '将Markdown文件转换为训练数据' }, +] + +/** 自定义工具可选图标 */ +export const TOOL_ICONS = [ + 'fa-cog', 'fa-database', 'fa-code', 'fa-file-text', 'fa-wrench', 'fa-cube', + 'fa-line-chart', 'fa-bar-chart', 'fa-server', 'fa-cogs', 'fa-tasks', 'fa-trophy', + 'fa-sliders', 'fa-rocket', 'fa-cloud', 'fa-cloud-download', 'fa-microchip', + 'fa-hdd-o', 'fa-globe', 'fa-info-circle', 'fa-question-circle-o', 'fa-user-o', + 'fa-lock-o', 'fa-sign-in', 'fa-sign-out', 'fa-search', 'fa-plus', 'fa-refresh', + 'fa-times', 'fa-check', 'fa-pencil', 'fa-trash', 'fa-play', 'fa-arrow-left', + 'fa-arrow-down', 'fa-arrow-up', +] + +/** 会话超时:5 分钟 */ +export const SESSION_TIMEOUT = 5 * 60 * 1000 + +/** 系统监控刷新间隔 */ +export const METRICS_INTERVAL = 30000 + +/** 训练进度刷新间隔 */ +export const TRAINING_REFRESH_INTERVAL = 5000 diff --git a/frontend/src/layouts/MainLayout.vue b/frontend/src/layouts/MainLayout.vue new file mode 100644 index 0000000..ff87d99 --- /dev/null +++ b/frontend/src/layouts/MainLayout.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..c2516ea --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,25 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import ElementPlus from 'element-plus' +import zhCn from 'element-plus/es/locale/lang/zh-cn' +import 'element-plus/dist/index.css' + +// Font Awesome 图标 +import '@/assets/font-awesome/css/font-awesome.min.css' + +// ECharts(按需引入)+ vue-echarts 组件 +import '@/plugins/echarts' +import VChart from 'vue-echarts' + +import App from './App.vue' +import router from './router' +import './styles/index.scss' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) +app.use(ElementPlus, { locale: zhCn }) +app.component('VChart', VChart) + +app.mount('#app') diff --git a/frontend/src/plugins/echarts.ts b/frontend/src/plugins/echarts.ts new file mode 100644 index 0000000..7be7f7e --- /dev/null +++ b/frontend/src/plugins/echarts.ts @@ -0,0 +1,24 @@ +/** + * ECharts 按需引入 + * 仅注册训练曲线所需的模块,避免引入全量包以减小体积 + */ +import { use } from 'echarts/core' +import { CanvasRenderer } from 'echarts/renderers' +import { LineChart } from 'echarts/charts' +import { + GridComponent, + TooltipComponent, + LegendComponent, + DataZoomComponent, + MarkLineComponent, +} from 'echarts/components' + +use([ + CanvasRenderer, + LineChart, + GridComponent, + TooltipComponent, + LegendComponent, + DataZoomComponent, + MarkLineComponent, +]) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts new file mode 100644 index 0000000..4f1d313 --- /dev/null +++ b/frontend/src/router/index.ts @@ -0,0 +1,239 @@ +import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router' +import { useAuthStore } from '@/stores/auth' + +const routes: RouteRecordRaw[] = [ + { + path: '/login', + name: 'login', + component: () => import('@/views/login/LoginView.vue'), + meta: { title: '登录', public: true }, + }, + { + path: '/', + component: () => import('@/layouts/MainLayout.vue'), + redirect: '/fine-tune', + children: [ + // 服务看板 + { + path: 'dashboard', + name: 'dashboard', + component: () => import('@/components/PlaceholderView.vue'), + meta: { title: '服务看板' }, + }, + // 模型调优 + { + path: 'fine-tune', + name: 'fine-tune', + component: () => import('@/views/fine-tune/FineTuneListView.vue'), + meta: { title: '模型微调', pageSurface: 'self' }, + }, + { + path: 'fine-tune/create', + name: 'fine-tune-create', + component: () => import('@/views/fine-tune/FineTuneCreateView.vue'), + meta: { title: '创建训练任务' }, + }, + // 模型评测 + { + path: 'model-eval', + name: 'model-eval', + component: () => import('@/views/eval/EvalView.vue'), + meta: { title: '模型评测', pageSurface: 'self' }, + }, + { + path: 'model-eval/create', + name: 'model-eval-create', + component: () => import('@/views/eval/EvalCreateView.vue'), + meta: { title: '新建评测' }, + }, + { + path: 'model-eval/dimension/create', + name: 'dimension-create', + component: () => import('@/views/eval/DimensionCreateView.vue'), + meta: { title: '添加评测维度' }, + }, + { + path: 'model-eval/dimension/:id/edit', + name: 'dimension-edit', + component: () => import('@/views/eval/DimensionCreateView.vue'), + meta: { title: '编辑评测维度' }, + }, + // 模型推理 + { + path: 'model-inference', + name: 'model-inference', + component: () => import('@/views/inference/InferenceListView.vue'), + meta: { title: '模型推理', pageSurface: 'self' }, + }, + { + path: 'model-inference/create', + name: 'model-inference-create', + component: () => import('@/views/inference/InferenceCreateView.vue'), + meta: { title: '新建推理' }, + }, + { + path: 'model-inference/chat/:id', + name: 'inference-chat', + component: () => import('@/views/inference/InferenceChatView.vue'), + meta: { title: '模型对话', pageSurface: 'self' }, + }, + // 模型对比 + { + path: 'model-compare/chat/:id', + name: 'compare-chat', + component: () => import('@/views/compare/CompareChatView.vue'), + meta: { title: '模型对比' }, + }, + { + path: 'model-compare/result', + name: 'compare-result', + component: () => import('@/views/compare/CompareResultView.vue'), + meta: { title: '对比结果' }, + }, + // 模型管理 + { + path: 'model-manage', + name: 'model-manage', + component: () => import('@/views/model/ModelManageView.vue'), + meta: { title: '模型管理', pageSurface: 'self' }, + }, + { + path: 'model-manage/create', + name: 'model-manage-create', + component: () => import('@/views/model/ModelCreateView.vue'), + meta: { title: '添加模型' }, + }, + { + path: 'model-manage/:id/edit', + name: 'model-manage-edit', + component: () => import('@/views/model/ModelCreateView.vue'), + meta: { title: '编辑模型' }, + }, + { + path: 'model-manage/merge', + name: 'merge-weights', + component: () => import('@/views/model/MergeWeightsView.vue'), + meta: { title: '合并权重' }, + }, + // 数据处理 + { + path: 'data-process', + name: 'data-process', + component: () => import('@/views/data-process/DataProcessListView.vue'), + meta: { title: '数据处理', pageSurface: 'self' }, + }, + { + path: 'data-process/create', + name: 'data-process-create', + component: () => import('@/views/data-process/DataProcessCreateView.vue'), + meta: { title: '新建数据处理任务', pageSurface: 'self' }, + }, + // 数据集管理 + { + path: 'dataset', + name: 'dataset', + component: () => import('@/views/dataset/DatasetListView.vue'), + meta: { title: '数据集管理', pageSurface: 'self' }, + }, + { + path: 'dataset/create', + name: 'dataset-create', + component: () => import('@/views/dataset/DatasetCreateView.vue'), + meta: { title: '上传数据集' }, + }, + { + path: 'dataset/:id/edit', + name: 'dataset-edit', + component: () => import('@/views/dataset/DatasetCreateView.vue'), + meta: { title: '编辑数据集' }, + }, + { + path: 'dataset/:id/preview', + name: 'dataset-preview', + component: () => import('@/views/dataset/DatasetPreviewView.vue'), + meta: { title: '数据集预览' }, + }, + // 其他工具 + { + path: 'tools', + name: 'tools', + component: () => import('@/views/tools/ToolsView.vue'), + meta: { title: '其他工具' }, + }, + { + path: 'tools/create', + name: 'tools-create', + component: () => import('@/views/tools/ToolCreateView.vue'), + meta: { title: '添加自定义工具' }, + }, + { + path: 'tools/:id/edit', + name: 'tools-edit', + component: () => import('@/views/tools/ToolCreateView.vue'), + meta: { title: '编辑自定义工具' }, + }, + // 数据类型转换 + { + path: 'data-convert', + name: 'data-convert', + component: () => import('@/components/PlaceholderView.vue'), + meta: { title: '数据类型转换' }, + }, + // 系统设置 + { + path: 'hardware', + name: 'hardware', + component: () => import('@/views/system/HardwareView.vue'), + meta: { title: '平台性能' }, + }, + { + path: 'logs', + name: 'logs', + component: () => import('@/views/system/LogsView.vue'), + meta: { title: '查看日志' }, + }, + { + path: 'training-log/:id', + name: 'training-log', + component: () => import('@/views/system/TrainingLogView.vue'), + meta: { title: '训练日志' }, + }, + ], + }, + { + path: '/:pathMatch(.*)*', + redirect: '/fine-tune', + }, +] + +const router = createRouter({ + history: createWebHistory(), + routes, +}) + +// 全局守卫:登录校验 + 会话超时 +router.beforeEach((to, _from, next) => { + const auth = useAuthStore() + document.title = to.meta.title ? `${to.meta.title} - 远光软件微调平台` : '远光软件微调平台' + + if (to.meta.public) { + // 已登录访问登录页则跳转主页 + if (to.name === 'login' && auth.isLoggedIn) { + next('/fine-tune') + return + } + next() + return + } + + if (!auth.isLoggedIn) { + next({ name: 'login' }) + return + } + + // 续期会话 + auth.refresh() + next() +}) + +export default router diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss new file mode 100644 index 0000000..7ad1238 --- /dev/null +++ b/frontend/src/styles/index.scss @@ -0,0 +1,190 @@ +/* Element Plus 主题变量覆盖:使用原生 CSS 变量替代 SCSS 编译以解决加载卡顿和 FOUC 问题 */ +:root { + /* 全局页面层级:灰色仅作为外层留白,业务页面统一使用白色画布 */ + --app-shell-bg: #f3f5f8; + --app-page-bg: #ffffff; + --app-surface-bg: #ffffff; + --el-bg-color-page: var(--app-shell-bg); + + /* Element Plus 基础颜色覆盖 */ + --el-color-primary: #4f46e5; + --el-color-primary-light-3: #818cf8; + --el-color-primary-light-5: #a5b4fc; + --el-color-primary-light-7: #c7d2fe; + --el-color-primary-light-8: #e0e7ff; + --el-color-primary-light-9: #eef2ff; + --el-color-primary-dark-2: #4338ca; + + --el-color-success: #10b981; + --el-color-warning: #f59e0b; + --el-color-danger: #ef4444; + --el-color-info: #64748b; + + /* Element Plus 圆角覆盖 */ + --el-border-radius-base: 8px; + --el-border-radius-small: 6px; + --el-border-radius-round: 20px; + + /* 项目自定义 CSS 变量 */ + --primary-color: var(--el-color-primary); + --primary-hover: var(--el-color-primary-light-3); + --danger-color: var(--el-color-danger); + --success-color: var(--el-color-success); + --sidebar-bg: #f9fafb; /* Light Gray */ + --sidebar-text: #606266; /* Regular Text */ + --sidebar-active-bg: #f1f5f9; /* Active Item Bg */ + --sidebar-active-text: #303133; /* Darker Text for Active */ + --card-shadow: 0 4px 24px rgba(0, 0, 0, 0.04); + --header-height: 60px; +} + +html, +body, +#app { + height: 100%; + margin: 0; + padding: 0; +} + +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + 'Helvetica Neue', Arial, 'PingFang SC', sans-serif; + background-color: var(--app-shell-bg); + color: var(--el-text-color-primary); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +* { + box-sizing: border-box; +} + +/* 滚动条美化 */ +::-webkit-scrollbar { + width: 6px; + height: 6px; +} +::-webkit-scrollbar-thumb { + background-color: rgba(148, 163, 184, 0.4); + border-radius: 4px; + transition: all 0.3s; +} +::-webkit-scrollbar-thumb:hover { + background-color: rgba(148, 163, 184, 0.7); +} +::-webkit-scrollbar-track { + background: transparent; +} + +/* 覆盖 Element Plus 的一些默认样式,使其更高级 */ + +/* 1. 卡片 (el-card) 无边框,柔和阴影 */ +.el-card { + background-color: var(--app-surface-bg); + border: none !important; + box-shadow: var(--card-shadow) !important; + border-radius: 12px !important; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +/* 2. 表格 (el-table) 现代化 */ +.el-table { + --el-table-border-color: #f1f5f9; + --el-table-header-bg-color: #f8fafc; + --el-table-header-text-color: #475569; + border-radius: 8px; + overflow: hidden; +} +.el-table th.el-table__cell { + font-weight: 600 !important; + font-size: 13px; + text-transform: uppercase; + letter-spacing: 0.5px; + border-bottom: 1px solid var(--el-table-border-color) !important; +} +.el-table td.el-table__cell { + padding: 12px 0 !important; +} +.el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell { + background-color: #f8fafc !important; +} +.el-table::before { + display: none; /* 移除底部基础边框 */ +} + +/* 3. 按钮动效 */ +.el-button { + font-weight: 500; + transition: all 0.2s ease; +} +.el-button:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); +} +.el-button:active { + transform: translateY(0); +} +.el-button.is-link:hover { + transform: none; + box-shadow: none; +} + +/* 4. 标签 (el-tag) 圆润化 */ +.el-tag { + border-radius: 6px; + border: none !important; + font-weight: 500; +} +.el-tag--primary { + background-color: rgba(79, 70, 229, 0.1); + color: #4f46e5; +} +.el-tag--success { + background-color: rgba(16, 185, 129, 0.1); + color: #10b981; +} +.el-tag--warning { + background-color: rgba(245, 158, 11, 0.1); + color: #d97706; +} +.el-tag--danger { + background-color: rgba(239, 68, 68, 0.1); + color: #ef4444; +} +.el-tag--info { + background-color: rgba(100, 116, 139, 0.1); + color: #475569; +} + +/* 5. 分页组件 */ +.el-pagination { + --el-pagination-bg-color: #ffffff; + --el-pagination-hover-color: var(--primary-color); + margin-top: 16px; + justify-content: flex-end; +} +.el-pagination.is-background .el-pager li { + border-radius: 6px; + background-color: #f1f5f9; + border: none; +} +.el-pagination.is-background .el-pager li.is-active { + background-color: var(--primary-color); + color: #fff; + box-shadow: 0 2px 8px rgba(79, 70, 229, 0.3); +} + +/* 6. 模态框 (Dialog) */ +.el-dialog { + border-radius: 16px !important; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1) !important; +} +.el-dialog__header { + margin-right: 0 !important; + padding-bottom: 16px !important; + border-bottom: 1px solid #f1f5f9; +} +.el-dialog__title { + font-weight: 600 !important; + font-size: 16px !important; +} diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts new file mode 100644 index 0000000..258ac9b --- /dev/null +++ b/frontend/src/types/index.ts @@ -0,0 +1,260 @@ +/** + * 全局业务类型定义 + */ + +/** 通用分页/列表响应暂用数组,后端未分页 */ + +// ============ 模型管理 ============ +export type ModelType = 'LLM' | 'CV' | 'NLP' | 'Embedding' | 'Other' +export type ModelPurpose = 'training' | 'inference' | 'evaluation' +export type ModelSource = 'local' | 'api' | 'online' + +export interface TrainMethod { + name: string +} + +/** 数据库配置模型 */ +export interface ModelItem { + id: number | string + name: string + type: ModelType | string + purpose: ModelPurpose | string + model_source: ModelSource | string + description?: string + path?: string + api_url?: string + api_key?: string + online_model_name?: string + create_time?: string +} + +/** 已训练模型 */ +export interface TrainedModel { + id: number | string + name: string + train_methods?: TrainMethod[] + base_model_path?: string + create_time?: string + merged?: boolean + merging?: boolean + merged_path?: string +} + +/** 创建/编辑模型请求体 */ +export interface ModelForm { + id?: number | string + name: string + type: ModelType | string + purpose: ModelPurpose | string + model_source: ModelSource | string + description?: string + path?: string + api_url?: string + api_key?: string + online_model_name?: string +} + +// ============ 数据集 ============ +export type DatasetType = 'train' | 'test' | 'eval' | 'val' | 'other' +export type DatasetStorage = 'local' | 'cloud' | 'minio' + +export interface DatasetFile { + id?: string + name: string + size?: string | number + [k: string]: any +} + +export interface DatasetItem { + id: number | string + name: string + type: DatasetType | string + storage_type: DatasetStorage | string + size?: string | number + count?: number + description?: string + create_time?: string + files?: DatasetFile[] +} + +// ============ 训练任务 ============ +export type TrainType = 'SFT' | 'DPO' | 'CPT' +export type TrainMethodType = 'lora' | 'full' +export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed' | string + +export interface FineTuneTask { + id: number | string + name: string + description?: string + status: TaskStatus + train_type: TrainType | string + train_method?: TrainMethodType | string + template?: string + base_model: number | string + train_dataset_id?: number | string + output_model_name?: string + gpus?: number[] + batch_size?: number + learning_rate?: number + n_epochs?: number + save_steps?: number + lr_scheduler_type?: string + max_length?: number + warmup_ratio?: number + weight_decay?: number + lora_alpha?: number + lora_dropout?: number + lora_rank?: number + progress?: number + process_id?: number + train_duration?: string + create_time?: string +} + +export interface TrainingProgress { + status?: string + progress?: number + step?: string + speed?: string + eta?: string +} + +// ============ 模型推理 / 对比 (model-compare) ============ +export interface LoadedModel { + model_id?: number | string + model_name?: string + status?: string + pid?: number + port?: number +} + +export interface CompareTask { + id: number | string + model_name?: string + name?: string + description?: string + status?: string + models?: CompareModelRef[] | string + load_status?: string | { loaded_models: LoadedModel[] } + create_time?: string +} + +export interface CompareModelRef { + model_id: number | string + model_name: string + model_path: string + gpu_id: number + source?: string + port?: number +} + +// ============ 模型评测 ============ +export type EvalType = 'custom' | 'baseline' +export type DimensionType = 'classification' | 'metric' | 'text_similarity' + +export interface EvalTask { + id: number | string + eval_task_name?: string + model_name?: string + model_id?: number | string + dataset?: string + metric?: string + score?: number + status?: string + create_time?: string +} + +export interface Dimension { + id: number | string + name: string + type: DimensionType | string + description?: string + eval_model?: string + eval_method?: string | string[] + eval_prompt?: string + is_active?: boolean + is_default?: boolean + bleu_n?: number + output_precision?: number + score_min?: number + score_max?: number + pass_threshold?: number + create_time?: string +} + +// ============ 系统监控 ============ +export interface GpuInfo { + name: string + gpu_percent: number + memory_used_gb: number + memory_total_gb: number + temperature: number + power_w: number + fan_speed?: number + clock_mhz?: number + driver_version?: string +} + +export interface SystemInfo { + cpu?: { + percent: number + cores: number + percents?: number[] + } + memory?: { + used_gb: number + total_gb: number + percent: number + available_gb: number + cached_gb: number + } + disk?: { + used_gb: number + total_gb: number + percent: number + } + gpu?: GpuInfo[] + network?: { + download_mb?: number + upload_mb?: number + } + system?: { + uptime_seconds?: number + process_count?: number + os?: string + } +} + +export interface HealthMetrics { + cpu_percent?: number + memory_percent?: number + disk_percent?: number +} + +// ============ 日志 ============ +export interface LogFile { + file: string + name: string + size: string + pid?: number + date?: string +} + +export interface LogContent { + content: string + file: string + size: string +} + +export interface TrainingLogFile extends LogFile { + pid?: number +} + +// ============ 其他工具 ============ +export interface CustomTool { + id: string + name: string + description: string + url: string + icon: string +}