From ea9be0110bebd8a284e172a97906a7f6f347dc9b Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 12 Dec 2019 10:28:19 +0800 Subject: [PATCH 01/29] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=88=86=E7=8F=AD?= =?UTF-8?q?=E5=AD=A6=E7=94=9F=E6=88=90=E7=BB=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 2 +- app/helpers/export_helper.rb | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index b08ba2dbd..c360972c3 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1318,7 +1318,7 @@ class CoursesController < ApplicationController @c_tasks = @course.graduation_tasks.task_published.order("graduation_tasks.publish_time asc, graduation_tasks.created_at asc") set_export_cookies - member_to_xlsx(@course, @all_members, @c_homeworks, @c_exercises, @c_tasks) + member_to_xlsx(@course, @all_members.includes(user: :user_extension), @c_homeworks, @c_exercises, @c_tasks) filename_ = "#{current_user.real_name}_#{@course.name}_总成绩_#{Time.now.strftime('%Y%m%d_%H%M%S')}" render xlsx: "#{format_sheet_name filename_.strip}",template: "courses/export_member_scores_excel.xlsx.axlsx", locals: {course_scores:@course_user_scores,shixun_works:@shixun_work_arrays, diff --git a/app/helpers/export_helper.rb b/app/helpers/export_helper.rb index 12f1ccdae..ef6f3255c 100644 --- a/app/helpers/export_helper.rb +++ b/app/helpers/export_helper.rb @@ -22,21 +22,21 @@ module ExportHelper end end - shixun_homeworks = shixun_homeworks&.includes(score_student_works: :user) + shixun_homeworks = shixun_homeworks&.includes(:score_student_works) common_homeworks = homeworks.search_homework_type(1) #全部普通作业 common_titles = common_homeworks.pluck(:name)+ ["总得分"] - common_homeworks = common_homeworks&.includes(score_student_works: :user) + common_homeworks = common_homeworks&.includes(:score_student_works) group_homeworks = homeworks.search_homework_type(3) #全部分组作业 group_titles = group_homeworks.pluck(:name)+ ["总得分"] - group_homeworks = group_homeworks&.includes(score_student_works: :user) + group_homeworks = group_homeworks&.includes(:score_student_works) task_titles = tasks.pluck(:name) + ["总得分"] - tasks = tasks&.includes(user: :user_extension, score_graduation_works: :user) + tasks = tasks&.includes(:score_graduation_works) exercise_titles = exercises.pluck(:exercise_name) + ["总得分"] - exercises = exercises&.includes(user: :user_extension, score_exercise_users: :user) + exercises = exercises&.includes(:score_exercise_users) total_user_score_array = [] #学生总成绩集合 @@ -168,7 +168,7 @@ module ExportHelper #实训作业 shixun_homeworks.each_with_index do |s,index| - all_student_works = s.score_student_works.select{|work| all_user_ids.include?(work.user_id)} #该实训题的全部用户回答 + all_student_works = s.score_student_works.where(user_id: all_user_ids) #该实训题的全部用户回答 title_no = index.to_i + 1 student_work_to_xlsx(all_student_works,s) shixun_work_display_name = format_sheet_name (title_no.to_s + "." + s.name).strip.first(30) @@ -178,7 +178,7 @@ module ExportHelper #普通作业 common_homeworks.each_with_index do |c,index| - all_student_works = c.score_student_works.select{|work| all_user_ids.include?(work.user_id)} #当前用户的对该作业的回答 + all_student_works = c.score_student_works.where(user_id: all_user_ids) #当前用户的对该作业的回答 title_no = count_1 + index.to_i + 1 student_work_to_xlsx(all_student_works,c) @@ -190,7 +190,7 @@ module ExportHelper #分组作业 group_homeworks.each_with_index do |c,index| - all_student_works = c.score_student_works.select{|work| all_user_ids.include?(work.user_id)} #当前用户的对该作业的回答 + all_student_works = c.score_student_works.where(user_id: all_user_ids) #当前用户的对该作业的回答 title_no = count_1 + count_2 + index.to_i + 1 student_work_to_xlsx(all_student_works,c) work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) @@ -200,7 +200,7 @@ module ExportHelper #毕设任务 tasks.each_with_index do |c,index| - all_student_works = c.score_graduation_works.select{|work| all_user_ids.include?(work.user_id)} #当前用户的对该作业的回答 + all_student_works = c.score_graduation_works.where(user_id: all_user_ids) #当前用户的对该作业的回答 title_no = count_1 + count_2 + count_3 + index.to_i + 1 graduation_work_to_xlsx(all_student_works,c,current_user) work_name = format_sheet_name (title_no.to_s + "." + c.name).strip.first(30) @@ -210,7 +210,7 @@ module ExportHelper #试卷的导出 exercises.each_with_index do |c,index| - all_student_works = c.score_exercise_users.select{|work| all_user_ids.include?(work.user_id)} #当前用户的对该作业的回答 + all_student_works = c.score_exercise_users.where(user_id: all_user_ids) #当前用户的对该作业的回答 title_no = count_1 + count_2 + count_3 + count_4 + index.to_i + 1 get_export_users(c,course,all_student_works) work_name = format_sheet_name (title_no.to_s + "." + c.exercise_name).strip.first(30) From 287b80b1e991c37ab07d31889856887a67dcc516 Mon Sep 17 00:00:00 2001 From: tangjiang <465264938@qq.com> Date: Thu, 12 Dec 2019 10:29:51 +0800 Subject: [PATCH 02/29] add jupyter url --- public/react/src/App.js | 9 ++-- public/react/src/AppConfig.js | 3 +- public/react/src/images/oj/oj_banner.jpg | Bin 0 -> 114822 bytes public/react/src/modules/developer/index.scss | 13 +++--- public/react/src/modules/tpm/jupyter/index.js | 33 ++++++++++++-- public/react/src/redux/actions/actionTypes.js | 4 ++ public/react/src/redux/actions/index.js | 10 ++++- public/react/src/redux/actions/jupyter.js | 38 ++++++++++++++++ public/react/src/redux/reducers/index.js | 4 +- .../src/redux/reducers/jupyterReducer.js | 41 ++++++++++++++++++ public/react/src/services/jupyterServer.js | 20 +++++++++ 11 files changed, 159 insertions(+), 16 deletions(-) create mode 100644 public/react/src/images/oj/oj_banner.jpg create mode 100644 public/react/src/redux/actions/jupyter.js create mode 100644 public/react/src/redux/reducers/jupyterReducer.js create mode 100644 public/react/src/services/jupyterServer.js diff --git a/public/react/src/App.js b/public/react/src/App.js index 7b276c9eb..0bea5bbde 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -615,6 +615,11 @@ class App extends Component { + {/* jupyter */} + + @@ -702,10 +707,6 @@ class App extends Component { (props) => () }/> - - & zG&ODwm*>(gV!mJ7%M?k$fpx!Ju|x6-2cbR%-av?QnjL`kA)LWaiWnBoCSA-EuZO38 zg&kM1SR>P17oq>=?G5d~8aicLDfYRBXSsLfq&zjudFSxBNgpD$O2V6DjQFTVmL(ZJ z12}Y&H{<~T?FSANkYWIne*#hrm%XS3E>k`z7Fj%iFP-TRkyLoe%tOH;#X!k~1L3)x zwPBk%moBGE20%nX97WVi7O%)?X_lyoz3oBHu4Vf+vaEoCnvg?YxxltVi|M_B48(#D z>2Rwg2RFR-M|c7=QQ8iK(GGhcFj7rfnj8xoQuH>@Od5ErVS9;ytKs*h-w`%NM&n(< zvn_~5J<6Bq7^lO|)C$VQka}t$wKEjs-uRilvo4ekwSIRWD-^&|N|Po80IID^s{T{J z2HyZeYY~8DXa@tRdHn#aaG*6DyU7n<65x`@S2iP$;sC0mznE*n+WG*z5TG@RiZJ@S z^4oW@CEskbDBgW{?vHmd2|@9???M2EYD;EvQeHBd&*WI- zybo*#uBsHsBh4B7@;ey^^8Mawk=o|J$^D*|siqBK^;Ey{>?^yLea2j1frGxD^wsD2%3hy5I-23*Ot$Kt8O zF4zAIv^*<R@m88YE?`SrcT@t?z4>hiV7jmt>WJ6^dvn4((-pmA;?O&>BW79ev6E z@!HSw?x;sV9!f_8UjP8w0!{&6>;;%!VfuSE|0L(Lzw8BT#%AWZoOFWmbY*mdZV}J| z%7e^&J4p0cCP@1T$oE*0gUS#_OGn~&3LJ*-`X7KC!cnIQy=&SUaU%iysxm@A|Hn;A zq@@`TQ!!&xXb`vlJW@?w9ygNkjXcwhTRB(WncI+(3!-o3az4;yZa0qIWeLvRcoRCZ48~wSW!V))^&2udp2{+cMU66g0>rlJ zH?G_V@azlxKqQFb{*!tC)rTScvcMem2*9&OHsC9p0yqo+9}Hx5g%?=iZ=`Iq_$>SY z7#}DWAPN}5TWzx#HLVS+aQzt++(ASYo3}&t7o{~}v1K=jjBLj^ZQ|n-a*O$pc@NZ? zTT2+C7mV5O*L?;!bOGQhVPH_P`R8aATXx-iZ99sL$=w19B->kUC)qDN_X86P2-W4K zwE}Z9*+E?R)0FURqhdS}9Yz)Vs?qBSsDyb0>49(R1;B8u&EW>cyBYLuQ&Cw?)HHJz z5_KgO#q-zdAPugH;a7X@`~aQXl?{K*^PgsfB}aY$V^AetE>ijrhfwoj&uU_Y-%v1b zASddFfC~kTi4P_NkuoRpqvnIY?T8|7cq7H!XGlbWFNuszdl{?$17eysq&%iAudF}7 z*e|Ui-BPa6z{!!T2vFepVOvLxYGDxxQWCCj(?T}=UAAoH`uHOME4ueRWGnNEL%R-{u zGdfLWsfIHYGuSC|+t{xL$3VsIH115Lb&<>#-kVz8PxVLK++5g69XTId49ht$Si4Ti zy?D^*t}iMyNBcP!sTDbxnMbuOrIhB>!Klldw%XQwxxh64C0lqrX`jJKzL5lze+qxA zmrIl4w`@rXGT|^Vgu?)&cH!l+nhY*4*e#F-K4osj0vMn4k4PelyLM@Lt>#j$%5T%i zi58S!Yt2JIQvkxDhevJ`vom;?xviZ;L!BvB0U(T5R-nw6gtgpI(NvUC)^}7KvgG8w z+VNIqh;hH1O~3f#(TyBE9yTQ7YF1JDP5lr&t%BT=;O}W4JNswOvM}_?BB@jGCA5jl z$yDAsVdJlEoE=o%o)I^>kN*j()Om4IWGglElzr!EChvqKR84kMQ9E~lYUf!lRj@jx za`C(Sfq063S7NwCQqwVAMKlSWd-(56iHeyU_i?imALB4 z#Zd;lga_WpR^^ZpYx)8)47Ovkv!r~iAup5?u z2@ilP4Z|J;)jSRZRult=?jJUc*RSGh0JS`*>N$u2BVKZAWNs0ME-1syk*iSSrq`Cr z8DLS8j}$b0%m3s*y{Ij z!%2xO?WNMe4c5%?03fqh3|Tkhemy&D-J$#5u%}Oj zQ+Zb5@hOc?zidA5Gy{mDTO45WpTi$B5_bar8SL8{3K|mtXfCy2F*o1^F;Vl*w*a^a z{p=Gr67Z!7@uJvsC{(7ID)|6vK6aT=J|aFChr+AxJ46(?-*>6mEpj6}VsiH>>mWTP z)^)Mky_A7T6kJG4b67%~^_za3)>H3Tl4QBKN<5LTm1&}_F?h0j3nS6)^KNom%wc1*hhFno zN6+iIRi+PnPL)aP-c-q}Csijb^r^M*zC#n|T+ziC9^Jb)6S<@4c*Cez-Gee3Nk67~ z`bzsepYrA=c<;vl$k#+?K45Nh5KiCaCjAz;I%?qT9VXcP!qvn0IpwX!@xd;X9ds^U zgs3I!<}(mOe_7rCIiA5DcqN>d_6q2A8E~qB+#B6?z*I#R|Jzul$c2LX2CpMeHztFU z30sM&tk01Uua)nHJgntb?hsQcL_?krUy?%?dso>ofvKeFwcSv^RzLd>;wS z{h>(6OXcq+&1MvQoEFjx_ZY+D6C!WOaA(*c&e*^0nU$DX<%?Bkk? zL#*r{74}D4|0ARWmnO1yh#_bsld}3Y8Vfhl5Cs2OIj@-#s)?iNlvZY-?#>sX)bxDN}!l2>bI@Q)RmxIUaS7O;X2TX?3^(%2&k+oUG|YZCo73KJKKA0F~4hfg`roAi}&lUpmMATc$xad_3kzVreEt>m}a`&%dDp+10=8#L)OxJ~0CDCV1eSif-rB-hU6%=Mnd13*0Q|( zlOyuF|k5joIfHum#@?JA%7IL|LT z%<5W+-A4SugRvx3^T!F5f`^v#UZMpYmLo;4s(dzyZcYW;?pMWbUM-mwu0ugbt9)+q`3PL&DD1ba-N?qPN6@oKQ^nuJl-$#?enEBo;)3g zn;lysRx73_=m|WNMbn8->5qp}^WlrCnc^bQ>Zj(Fua42(*gKxeLcDhIdaQUJG&{eI&TLTa@b%5aa8IrJ zF_7Rm+mA!j=VC$@lF9kWEkLDq1C)5|E9|!*UkljCB%kHq zXcFRisvM1&7&~?A@O9ksF4(>RD&b~JURRnQ_ZxNJ-Lg= zzWW&}IpkN~-Pdj#dkcLp%(xN@8tb?>FJobhIYpq`cWEX4WiS4x6#rvos>F2wSm69x zL$9f97f|so48p#74L=Ei8pN3hDC^T2=yz1|>+vkxlqT9#E)DcHH(ykyh@k}E}ml`-#E%oN8YIHtPBK66Ij z7B=p20cgOVqB|w5{PU`B4x}PB{dSLW@}8#uMD%mtO`W>{diFd?@>HW!rH0R>;oM*9 zXHv}G!0RV}h>^Fn9;KYPiHxHRxR>eY4K4uk^Do(Z1`YN{>2)DhRUYDG-d>-Eyao@R z#B}e|EQ-_%)uFPLUA{iKHj3!v_Cg$2oGy%DeBB82TJa|k^ z!Etp=p;do`NQ*3pars6BE<`b0OIKDtg8}#EEwj*g$Ef{lN2xuozi7qHH_c9y&oFVy z*6AR<>36N_=6o*c{Ys(-MPF-uAWT2tO_S(>=%Jf994^@w96Pt_^YO>Hbv&gUgXn5hg8=zP80$kDiMRxw1>!oDC^JH|Yh zD*;OE-f&+MD2OQv&T0Uepc14xF4=!d_=!wcVv^|??zo#OS7%Y9`V}Q; z)j*d{5Kt#hpE_AjGK9b?-Pjb2TdK%wJjOfH-V7JR=QJ`&_ARwOPWO*mmWb$_qOI93 zh*yUA-1OE|%CE>d!9SfFI$bzRO5Iyq^734^cBJPzJI@Y2v#cMSN^v;JMz6!)A3u#; z2{3x)bR^Pec2c+fD-P1IL-KWaPbayvx|j8I`>ZAy`SKRT5@K$-ZO{Z$=2Z9W(r-{; zmc)9)Np3A8%l>G&R$GhdEyxD2Gd~~O-A~({^$}-J1Ll`DlQUGD#JGQgD}Y=LN^muM zsgN=W6|^l{{mFYXX=f|0e1`DE)So05Bv9v|1+=vYCi0JM;R}8Oa&yAYbjZe?^H7XQe!V zA^C+~%)puqeo-T>%coQd=EOtw1>goJLuhe}lG&-reW4+_M*oZ`;UVQLB?^FoBO#=d zf~lCfRk@}y$+x$@^`Mq=<;7urpZSR$rT`HmK4;Q8acbanmHw!cOK%y+k3dQ`$2-olh*g8 zxK_>9+S+Y8?mgi%?qT$}np7Br&g@=9Qol_5jBG z7#R&U9IEuagQL9ugL)B`NHLHH);0|j$Hr00KB(PE_HhGogWpULe;&8hl`}H6(e=cj z<`kVZmn3u;_hjwdalbwt)#9Uoxd5*E+8&3gx|4L!-xfV6-sXPNH+*e2GGGnebm&Xs z6LClodmggn8fqM3ot-v_5u>jazqXqiPiN2%Kj|#CmCRIE(3qndZYGV8L`!4+jsk*_ zZO~#f{0BVnr^|ndaRH!zhGUd!tODUUdGD=Uku{2_sh>D9%3tG0(%MK{yM$=#+2#w%kWmKDkIYvwPX<$v#MyZS@l;zmNS zw%Va}mv-&=|=XZ6p=AlDp%5 z4Eo*gA|FkIaTavAS}4Ev*J_IoAKzkUO8y-)h7Mnn{(s>v5y1=?z&G$guY78E)G&WY zCE(^zKwF;GUC=XGUN!c!`s6x7)orwQ0<*k+`%Fb!Sv1Z$qGWn`nRneeCGOLB(Z=>2 z<0Y%T+V_c7p5v*jC#pGfX;yhhs2Zd&N<-9FZr&I-MKZ4K7M-WsI+KRKX`05D}dayMyQe>=hHKvM`S0F z+3$zNb?=)jj89(Qzg>UNCn39Yk6z!$p=Ls~1~Z|w^FaxUd_|Gkc`$jHs5HmI{P{-W zWbv!99smhT(*Axk_pLN=qf91GF%VjM=S^s_?tO1jl|5cWS)OxRqdAib8 zRB7r_>zUG`xF7ri__9BY*-Rf5Nv02{&l4Bf-vkv*Z>`JzX3I}!=PzwSb>b$i<2xk1 zLf)hEXI5FF1R0y%pUyBd_3L3JE{HU=Nf-SmA5Je41*&I-a)PUx+>PE3X2dohdpU~L zJ9(2R9*feJz8hPkoA8mfafPd-qndBMv({KnjA_zh3(3+QNMiuqY{qAmx0=f(0bthotr?tLq8zm(bAQuR#WhNDY5~AVI`Ox9y#cBFl zwLwizxpCcxt`Usj*WR)6$@!yA3(4qYC_#`CrF$t2;s- z5`xb4;%*1s?=OH7@z!DScVi|uPTRKyhmOUO)6eG`-80T>&IPO5>$1C!0|vK6(!Y73 zKJ48V(_7~Eez4PRa#!WBLT0_MMOP2$ z|A+&~jP4`X9uRUUn73YrK>RFVRpt$xE^i|Z)m{tgYY;_62o!7>M5-iMmr)o-I#5av zMhOwSs=Zfe{m9KW=D@?pdcP6^G3PY&!y&~tO}_tHH!xa?`HGbCdjaCo8jGdlu*p;B zSLhXAwJFeeD$_WBxqF;kp~E7u1lx6tp8&2lew#AfrbX-ItvC_|w4HY^dem|Ip^Yy9 ziJ9^LgHW%3noysjciLC$xHvmIdnYCGnmj}#q$|k}R2yM?66D+;QD{t|_k7(`%(u1E zu1%d;$E+7h9a{X_x4w{NHVZdiBZ_R!Bn9610UFET9w@jY{lAFt{olf+4+K>{h-ur?$f3>`k~Ez=b4tyYZC{#C2~^b>-(3%K4*(>S=x1m>+!BjZ~rl_YnxbR8fmr zeQU3n_i(NYfp(f0daT!p^cNuLv^VEKM1Xb;op?uI%G8oU&aunHHu{CLH-Q+pGX1(i)+X9Mm3cM@k9FH0%; z7E2Y!b}hRH4m4-}J8s9D^E)1P*{bhSszp=lEO~;nzP`IJlj9`Kza7W?K{4$!NPF$J z5#TTH>mTlvy^#cE6HCzKKA3_B5g-To>31Ar_Yy)MqTulx?u~{C1)#x2)f&0i9Yx1q zEW20bvRWQobs%~iItt?=k{bbWxI6vpk^A#W4 zCMo>ZxtraZ5=GfxPlyDo@2t^$wEFN;u!H=^e%_nTS7@%@dZH;b%Cw@h-aBuX`-lC@ z37h`02aUJ##thq!?hURviz)3P9#h7i3FJ0#WWfmEt%L)n`V_o=x;G?czC*Co@otuu zd((&PTXlN}tTbY{D>12=Jx4eP;*{}Xv8n2AF6c4G?#Zwt9@)TS`Wj9W}I(2Fn-CR?Ba(YrwvM27+UAt6wXmTR5RtJ*Tr=Ao}V)Jd)htGSi z8{T(}rpMc;SR2ne4O7Y&?S33F?Nmw~Mj@-1mXmu|k(A9)?Sm(yrX@dHupbn_W>)h1 zd+`M+^q<2YZ~Tu%bm>q1bVXX;rlq0D8cH$Hv>BS56e#2OK<=wNjom0tuU@xV_dMg& z+S(E8dfMs#b5S(L<8DQ&qOfX z5vWg1TvXdJCFQr+5ziDYKIm%uQ8iq~Q~+71dK3jbzI47RcDEC*$8A`S_G&7ihD7mT z@#jW(YB=?ctig46%(9dpmDp^<`e!=dSN-QK^1DY8cRZMban{?Rm047*aawVB8@EOE z_NtH=6S@GpE(GM7v7s=nmk>e)Es*uGhKfB3KDuNYS|iT+OTDV4IfWk#wi&=Jl1&T{ zZTp9#j!%icEXO_o_k_WqTf_rOB$;kxQxL2Lz=|@Z2J{SIMGN|vCO3v0^$s4BvR5ph zYjk(?O{1;K6=B0w%%MmHK~Jx)c}##WT^y$af7w%;k6K@6Puw|zxVVDkxw4)Sh8V|U z4}H^n>(@@v#NW~qtSqZ21pw*<4_4;(10=XdNIp7x7!1rEh3);)?krZrrNw-i^Jq4a zsBjVs=qGvWO|-6zi;I!MX=Zb4PU8ZNPOt%_!}z?^WMk6z7>pcM9kk%gLM!_ub& z>C3}>S=!Yyu}nCOZDV^1%pnxad`X-P_$q!dHoaF*6{H|i8ed!$6udgLIj!4;?4pe4 zLrP~FnFAxZU_6oZjHr2tnsRTvz96{t2S)xO4mBTb5p;8@#g2t98dGh&{&VH zgF|&q((~BG`kMKo+}^scYcwTTU=uM%1t1}y$LNe;n3wGsC?`Nsd%CZ7mag^DVbTec3Q`L z3`p+LbPQN^6M39Bx4T|v*Rl7hV0b%PRmWK@z;3VB5;VWK19s&eGg{a|q{7LhB6un5 zD44348$hunP6Aq_IQ$vS9~9ei2Z+5`OxDY$&=%cRjxreIyj8-L22;s`3?}R9AzpzgJIoy=!*iL~HB$ zQcr#2Zq6gc?a5REyPpd$eN^*8Sna*Uwofg0hYwX&%iS%NkxlwPcqgE@i&|};i`@2# zZBCg>Qhm{xXV-IenAt8ILdx))p4fL4|DtQJ>DXAAo9m}L8}&L4e;WU4`TxkM%USbQ zrU!O;Rx65a-HL4md5ukfcQFhHh!c44D#BXronyhRn+~_YZ-VW&vTB$2TzOX~`LmVs zk`(e%A-A<0n5=&Ct#+o{qbsVH`e}>=Dh$V5%N!oL>436W0*n0NXLP@8=%pkKUy`EQ zfPBej!_w@sVrZ?LUD4${R+Vvs9^CQxg zj;VJLA5R`RMqM{NEHR9TFbwqP5(!rvG$6&f$Hbstx!|RZM25O1cFtOs+V=H!2ttt} zH>DWvs=eP%idg0LK3s$7A48{2G{*!m_9)7+mlr@YecGwmnd2!Uy{WHH=SziVCi+!% z?bMP__VNYLB1X{P9l7r^l9a{1<6s!SC|sZCpW}7=C*_xrrKx@oAFX};+I#5%Z(La4 z_vU}|%}u3SKYM)`XBA_ssTz4gcR&!fTl;IGG`-%r=BIPs;t@Cd!1Lozp*l@X)hMMr zhq^7D`W2M6tLt)M;fNsdangHll}7QDlCcIxP2e|y{~{VAIfr}0pEB0_DuEBz-?w)y zZ;Tm$#}@y8f-=7mt?*SF2lYT`+OWbBx$X1yXP4 z(B9uWyJExM(+^$oJec=sM0kjy0)CmVr-(adO+nVZ$QvCuJfI)e=SBorXDP;rJ5gdrT!%8HV*5d^D@tM@G?YEPi!AL20*7~FkCF9vvt0#DCd(= zyC`_irja-2UM*(RVaItlZVL4Xu7pV`h3Z#e*}Ier`voZj>;^+s(u3L!zv+j4mk%BK zy96fJ#6`#H1+$AWp89YP$-is==bUdbYi4w4cpr&8bFi-hwew#9k{5KewKl<*Q}cl# z4M}wHm=VXAk?8M~V`Oig28*xmJF@^2?tHH;4+NFSRzn)H7)w5Bm~ z*nF-U>znTL1!J}8E8A;PA1cA_BN}L$>}PTf0`3oA$x@V)L~4PhOQ72J`<-7V${V+7 zPQ7A=#`ntqUHPxp|6ZVW)_nPE^_S6vikqgfwls@VXLc=Y=~sDg z=R@$K0r)s>T%-aM0Moz6C9KJ%9BQf(8yFuen@&~c7g(;ZU7k305UlTHR75OLYwR>> zCr|(?$-3gU&zcYiarmKt0FTv(Hq+(cwDre_iv)LeHWFU*1>$IZoTyu<5UazShYf88 zA5@1;xtm1R=bjVw8Rsc^EO<(I`oNEevr(EGwd}i3-9qbr1!x?rI7GRo3kW`%w^;bu zu@^t{NmP_QFNFAQ-l#juc`s^_{`N8JR@ku7yYG9uExEDg-@H~{+Pat^jvPTRq)WAJ zw{p`^Ap4z9`vywZ=hJbv!GYT>a&a+>IkRJdrCa_Xp4jBY&r1t0E zh2IH{YvB^j{Jub^Si`?7|KCd3D!x`auDkkP0Z{$^%ZISwdkg3OO7X{>bP8ibL-yKQ z(L}PZM!3A(R6C&z5 zab>Xy1`WfXrB(HBu5w(6WHlYaXgV7?Z}# z5h5oduM9Eor@omaGsbCMJJhcik6iWxh;r@&SQO3w=v!Xa3r%e=6@SBwuhbS+tedT!FWxD& z1h5ao&0?hktMA^42v{=iTRImXo*6kHL0V+8}M_l9@q6G+Wl|X*ZgC zP(pjhw@-{=E}4Y6FO~I>`#Ofs4!_VyfFqtWoH+5Y;eVhC;4oH`3=J6@-`n>C(fmI{ zYh(=~y>H?S5}R&Cb@?cfaqY>Fvll%WZN8Sz*lX~E*bWQpMlw}4LNrdZ5FVg&o!Aer z6?~A`W0ZvoJi}_-@JEVv43j^+pin`)@{?N#c;eF7J!C!v-ka&P91M}wDoB%$PhiZu zOQuN9QxyF}Hq$yjNV=U;!%-kQPf*W5*+{QUkD^SusQ?T)mV_tel1T!1gE5leXY@xl zBNO;EMp+{Vl7@!CFs%XYm{zWtfY8T<8UoMb5J|u>(L?Bf+^VMb7rI20`*FK*y;9eC zw&okxqHUk|cNyXpZ^Vjp*groTjR_a93nd4&+PWZ88eqN0`^8-4XWO_ru?GqY)D z*qf>i=-DI`z3(liPSx!PaF$iW&%YcY8ms4;PD`T08E+fGs~wc9jSL6B1EB4IFB(6J zZAJzT5(HKm$=~^3iT&6eI^L!Yo0aJQTKoT0ZcR)Y&hDA0gQO@8{BEBV);~kvbRXVDcOt{j$QL)Z^JKn@6kV!7;fp3=qC}85AxI^9Z&Q-WU zewDBETs7*gD;EjrDyKxJXd``Cf+v0BnbLCD_Y1(lm7ZYCU2wy=eV$~MJ8Q4P&6VA_ zdg}sUTjfqVl~BmZ;`NiZzz&%iE{{{?iqquel?T{uhxQErwz>gm^PjQ(NwJHc^EPkT z)1uNE{%iGrFLT>&iswD{*sT_<{oRNY<5ngTxBQdih?VIxArl$l)i)V>%r=zZ$xxih z=@f%pGDDE-fNP41nakGbJ9se27;0_-%5+oa%pKe|h^~ArbM+F>e`I8*0Jp?*Kjb9$sXHFc} zh=^sIcPv)kld^lU@pb7qlm%zpxlYdJg;5-P!%s-<1M~4ZS`o|7;B6-W0MD*o9UDaY zwG3Cal~oEYT>%+56I^&M`5nBpLHKSN9f}uaF$!Q?M%=jMW z_&k2B^xhxteE#V`f*!+JNRm)@up3h7O|tsDV#|biB`o2TLJQi04W*T5q=<%sgOx2F zc3fPye&t*|pF60>6Z8j{*mrehCI1xvq*z*&ED5{E%0dnQwH7SXgLh`7Z-CbcuyC+( zK=&9A7Yh%J;A3HfS84%LG6M3OcX@9x-lCvnxW~gMAStD0%Jksj3w~*JCqHIE4YS8G zvgR*8gBNSBfERADuHak%$3I?6LCq(pGv{0*Xu8jZwV&x4(l_epOh5Pgbd+1;VPljx zrmbk(7IFd5S|7Vui8{oI$7YE=yctYj+g2B;nMBz7QM*Qu_+}W(50Z1i*&ApHrXZ@) z=l5g}$i&v6HRU?ii8Wy7L8Oj$c!=4x??fXrRk|0z;kcfP#Y?SQKHP5`bIFvGgfncr z)QxjPnyl@gb!=HeGCmNq5Na?M`+Vw_%j#@d>uKC>JoT3Nb~-g@;R=6zDkM&PDDpFC zbTd0Jb*84iv1#j5=BDqDkI8QzH{;8R$PTW*f<|hZvffj$&oo0bdG|_a&K(5Q7@kS2 zkiTjBD4+d;=y0)k-YB7vWUkv7CI7Wx=OrT|`&53#yYvp#K!$5b4zUeQ6GjNg6;xAn z3w-hLOhO|~%u?ufLm*vTOh<9p!XdFQJ#*v0+b|t$9QURuS^`J%iMdW33Pbwb+!7d` zn-FB1z^Uv+4n_HXK-1m%t_z={A`8<8UVz{H_yYJr8u;Gx3Qx7KfQ<2Oh_KhyH~U$q zE#w(P?XYF{bEqEt2VF?o>UVb4(w_*atVVzKrYG}D%j=7YUNMvwT7x}m0y1-Zd*S2Q zmFoIu5~_pIuR3uUw84S zA49TP$X@nORV0op*ynUHoTG%sArF{%k9|JnMSjWe*gsPi>SM_LD*q&5Ra*GFQu?6< zsWIgNz6WmjIqYUSUT(AR4_ck$rPX`470hXt)Q5Bliag5p2T&&vo&I^rkpp*!55|jO z7{>OfD=qFt&asc+oSY@(D(toQ+oVXZvW3p)k5J4-(dpLoA~t3pd-7V2wkCoH^{082 z1Dz7KU`rlZ%V)+$SFa3U9p?tmsOlV8;N5F+*HP zRUJR8mz*7c{_3(xai;HwcnE;d9dMRExTe)krUX~ldVa1^|?rO5osP{?E8U=M~tD7pU6nF>U7CI%rFK<+F8huQT43N zKbq|E;+dV~Uyd*zBys0@(KG z2+?5{>2^uw}}0)HW>Aab0_24VTC;r)%ePE zruIg&zMK>)tNq*t`SOcL%}Gh&%dECxAylIC&kLaJyI87Kf43@o>;8!Owc6Xm>^f2M zItd=6CB(h1YB2ZI&UdWD=df)na9P2E*XgSDR4DKtY$fZ{3PqE%%D$ zDj+4hQlV@*&!%oz)+VZ(>OSNsf9S82hQ8O+2fsp$&Kew;O0#U$|1!0czzN)1&a}#dbSIl7R<6Eb$~Dj+P^p=xNAuB zEA-ma4|j}aDcVmTT>uX**W%Y_?k*9&k364OA~$A_UKx8Y-%5xcTRH^Co6$P^a$rm( zSOScMlpRq$qT9ThYEU(ECPVD0oSG3sN9%6Cfi~jG>cd5yLeUScwgeB1TDruS4}DYH zy>H=FRNlOrc0eA+Ep+APco{{rI`=EXn?XOLd-yK^NrA_@xror$nv8S?lKl?!Z|Skx z)eNZ7W6v^(U_$qjU0SgUZ$a;h=FPzv!hcEXUd@S!FIo-If9fOFLU){|ADnM*<(G5I zOz7~;e`;L&dmfG6G}}83NinN)YEr{m@L(sNjecC*9pi_st}(mHM--Jq1VL>-KBq9{ zeT*0zHE1iQ)9GJ1{N%-9VMkow<+%P@i6(c{?P=3PJ`z_?ny<(YHco>LJ$un~J8Eu9-DP|8YxUv5fYHG%ibN%gL>G)x!{S$tR`(%ULj7@XRo5?)RH*`ko2cRujrj0XQC9Y@orIlsO! z48v=(mim=`I6#jQ6Of&3I;wD8$2ZCZ+uACmnwkgtl>WJt9cRw9Ia?d&uO+Twb`Bvr z`WFD@ZNWETk>s#}lSq@%uT< z`;%^(+W+w*2G)rNw&20pS-D5LZ|_4>q;o-AQU4(nJ&wA9j;e=V{;(k}-wfvPM}qbu z)YU$#F2qvXYI_}XKYl|{w@uPS>Jdugfzhk#E&+E8r`GIT#JvR#HS}DPv#_yxSQ`d zzl@C}uoQYR-x}nSs9{l=XHGL8#yNCHNg#~!j`CEba)r*ogW}OC0^PN2J)Z5+1@o5G z`70LdN=KI21LFDLQ<;nJ@~lSG%G8d*l|-`)ml=4W)Fr^?2VZh>HbvIq@;VWP&n-y< zuLq*$uGOtSPba&EXY3pLw3T)AcE!E+bn=^Y3?{uV9IMs%1=npsxj*j(-Ww%=MuKyd z3(oP@8sqtkUH9|5UlW-uq#x9%oW`xal9|xxy53e@ivB!$#wh#AH{jE4%Y3^lfoFzg zl@lxJ4cTP@o-8sEpP*@4^Wx3j1_D+#gu@tF zHwmUMfa)&KDuI5w{GoHNl?4rt`yDfomf)|oWtyzsvdpvQ#rS(Py&FP5-Ja*i@8cBt zvHQue!|wDc{B#RrdAC&^#N10XVeelp72U-dp+w5aLEZgk&skZAw(!BCexmhl%Hh%2 z`ZzrHpU=VfIAHrRUX`>oMCuVpItPBf#C^w`~*?-*C<uw=Tmnf|^(QzOxcP=!Nn zUp4Lm-mzOrI(@6AFz0+0V_5HJ>H4_qrL-%0h*f`wtXH<-(l6_IB5yZB57+HF%9|_r z{XYU#4k5yCI8@kn+NrBLYGHMk{Gpp-4Yw?W^S)ZqdV#0)(W+U5iD)Y3pzUda3?p-~PG^ng{5X}9@o&yT1-OGJiUa?QhA7r>&Zbym1sbI`V&3oUMO(cj8~TY_s$@%GVe z27G*ktvTBdMt*}yLhSg}mMyXLs?dA4-oCy2hT%I0W|NdZcynt@V0FivgCvQDR%Fe5 zyzhHEE%qUC@c4B^nN>(`f~+HPU6j^LX=cR_m50Z~3Uy!4LOPr>b_HQ@ft3Ew*Suz?|QBmTq73ETUAgHw5J;!&Bz|=P(6k=**@@jgTlRcopZT z+HyDX6hZ0i6Hl7^TYuj2gz6!BN~7f}5L;*@6|* zP@Km}PK&Mq>`c(ekEO8dPzK_KamoEDEMtiOT4Gt@iBmAiuGA0V9Xqie055%qhka_-RT&(Y#(=D?A=Rz*_Hu&?lKXD+CgkLn*FrSm@X zQ&Z<3fNlGB?&{^`Q?K>hcM$9%CoJ+%=R>^YBbrb)4#q$26HZ0CZW`2BSleuRLy>AK zxPX)#eMn=e=;SXB`8>v7Y9h9(_k*(A&X3j@{aP@|IzC`YD9Jy?_d9 zX6*%Q+O(6zhJfAfggjzv9xKr3T^scP2NO~<9Ze{DgF5=>3!k_8SDG@DfMs0npzd%a zF>c5A_OJ=;1AzyW%Z8kYOfy??%e!q+az5SwWqhWS4jym9GM#3`kSL2Gf>u7l`d{-s zi4wF?5qauEg6XjJQLE6G9K*4_&pJYJE2Wp+3USBwnx0_T2!_SRv;B0P39unN5$gyn z6H&eO6@&6zPlTdMPtKOV@h*%cl#J;$ni_>t!U3OTAcWh(BfFAyF~jOVz@{l{ zgl!3HPV?Qm9Daicd_2b-)%l1Re57#HUY%}~Vf@J;CnoaxuaIMZxjZ;oQG7}85o&8M zgm>zQ1<47TuA(@s7!!m@%^T65n*LDpIn^TJz4QU6O=3aN>5Gf8e-4L)A2aJJ;S1E7 zYMq_6E)>SMCf+_tRDq&3mfB~p0V`0$w!1eLI0vbQl|R#~b(BMehM9KexA&z}=7okF z5JDnI-)GX~h|I`lwG0tO->x;w^#XLDYRM zi|^xCg-H>PI!&N2w`NQeR-NpxPeU}IT-{y$#wJH%q!+WP892Bs`PEwwg}LOPhl#ty=QYSrv0G1uKh?o~Ax5F@I%#Rrzslyc@FPri`#N5yWNctS zK3$WoMrJtuC|P6lu@h&D(V9RxCXbw8V6^!Q%_Y(YZgVG};sDQE2A=L`&m`m3qPpJY z@OhDnoD5yXYhf}UTa9D)9M@#qb&|cqpTWT zStYDVAx;xgok^*R%J$A93WXrFNfefo((jK~ut(4z+1NtUEp86Tn5vQ2AB;4ai3|?X zk>rS}1IeNzOZT^1?x1gkIzK9-ShMOqbeSH_Kf#2mQa?`x7Y~b$9{_VpnCh|TggJ*M ze+iU)uU}UZxU7)X)4sevd&GcWOexrE!$naWhDMcjRxvWZGOjlbN3jHd>V7L=s~bVG z)K8{3+x|M7`ZWW~OC`Olqce%kqh}tk8$zf}=~m=b?N`}fltabgbb+;F0_9?Z2P;QU!U7le^!NW@N_6I*Zv>Cmi8fgGVaf*z9spZw=Vljmvkciz5zw8 zybS5hX)Lpj)IR_*a(l`xxG{I$I2o1G;J4fbcZa0p8P$cL_<2d_^!NbYs?U1fsw1Zt zJmns&7(Ep)GbsTo!j$&7+tifr5AdREV<)yVFT;9KaWOf;I<|q z==`{k6sKN_X?pojtX2Qzyxi=JgA7sDA z2Ri;=J6!PTQCI12O){WvOvIT9#rMJvVzquX?&37|2%({!<*tat}M67DF|s_ox+`W98Hk4}!J z@SNX*CE!o~R8T9`7pyrGK5D3Wd80};RNi!G2Yg$vru$B>0o``fTie5EeoUyGia}#F zVh$~!z>kuXcxGvfq@l&$=*&@49?Xtf!Hgse=Z9L0$m^AM3x405#|JLf$)?GrER*PF zu553XZSSBJi?CVW2~2jP+e81nmH5rrqiBMgxGS7m`Kxv}V^}mBfz{D+M9tANLAnzZ zylNvz_kx-)*E2??*J-9T@xqa~sxNUYleUzy*Fq7A7fcj0%UJKUCFoQ%ssLZP*KrQ+sw3?t!UD$ypEv!f@Cr;5d63@s4N3V^Sr{QvPaD$=q{qY{3E1U6pU}K#Hjj;;mppMGE6x%p1d$I@&C~qpRLlN zC<6T~-T5K3&)MB1VoOj-esfRau0`?vS2@a2vqb&L>bR4{FYmYS6(pdOdOpyhOQK5z zT(RjuTsFwKh}DTdujg}-s2P1&CH`+0$JYQ7olwjA50~v4rq5Y=72d^aH4pPiM{i9I zfeTPi%9lq8VxjbO2Ue>wW5>y%Up$V`2X6{R5BWl4${{=p^b^$Wu>sIU-i&CraLPuX z6`>*HPG*r9-@zYw92ZfzEWi%Cs25 zn(B{`24PNwvl-ALVFi95zBJXNt9Yj<#jQsUtbFJ<@Roglr`eK7J`;W)b1ac_)Z@4( z9dLXfi!o-cOQ`6D{uzF7({slDlEvvcSQt+_7j+8rQdfwlmJ&fx$7QCdOI^4wk&DX% zzDGIQ(4Ro|MxjjPFg9nRygyqWR*C$#XP4%aK()y>P!(6jXJ7;}pN6u#U@g(XC{?la zS3TK9oj~XJ2b{a5lN<|A?3PU!`K{xX;J+{R^l5T#Khc$<;?pCYVnkzDf2d>4SnN}B zgLL*6@eqBHER&qN*D{kTYWqMv1#ssz{h!_;=Z#bLwtH_@%O)AuuNMMR9Ho!;+LZ^@ z4lVPtp1EiJT)C#+souOX)N2M|>^GL$)w(jYx+kN~!yw`8^}M-RTvCM!}IVe^B35@CEs z?BCzoQ;q0cM%|hfcai#GKz)GVdrbStGXu5p9N7)Gv<0{D$w?!;gNfLa`Xo%i`OMzeDpvGr`Z052S?#4HV=s4V$8Dc{CpVD!Oz_Z%=g!A&nS zc2{+|gFxABNCrY6@TE;c&in`80SEaY(@lc4z`4uzEcnBm#6N&C##i?0w+GO7r@HxD z`5vi=oSqe=RBfV~`KDDJ7w0vb4w+@^jGaw;n`RlSTmj>yu^Pr@=+k}_60#ua$Btjy zVt~X8c+N$f44AFi-X+jFs(7Ia=~~t-+_wVD&oHBiy5zqxf%fr8wD|_jFcu{KmlhZR zk(+qh0)veiLKXt3A|m|)%!-7+0p?l$IqR*l8K5kvJ3Y!KW6?Uy`z1VdfLa*SE7zqj znx?U13mVqZa;{oHuUT+3vCHkkh?dn#d_z)RrVyY%5zPbI5R2EUtcJ zuTMx)I$SJ6MBL~h$`VbnL3!L5g*-Cj&_pb`5`IUm*<)bU3>fq${<>yMgc>})!I)@*gyEKNLnH#Ije6NwNX9Q4S8 zxkk;N7~m2NT9!52YoKM%ZNmv9A^Lmf4sK+j({;puM3#~>S42?ovcnSE6eFS+E4pl*lZo7R;}=cfdFGSM{oQG7{b(UXy)cK}pzxNJv_ za3Bqgby^r+Q@Q6RZLdMem%kns;-J|Ejvi7!?8 ztcyQSbLyNeN9*)CNU$sk<6{Q>X*NuKHonxcD42Vwz$f5VNZ2mKd=y~QTHpg5RHIrm zdbafCyT7fx|55hd7_++3s95gA1ENgvxJ58< z#ugkUyGJtakQpv+Un#x&E)n!9L5_sZZVsYPMRLn)S-pwJfczs}s)*m@^a4 z>`R)Su22QqR3{=*d}}o2abP)#3eU28L*psjfuu3S|c^(8DDUU-g$x z6-=yPdw$)a+`D>=V?Dd)xB8lNrGGU=Z2(K-%te(XDML_1zd|QnX`dLDo^>g)c;$J- zGhM;dW)?E=y~a8@>XKJ(hza`4;NFl$n}nN6QCNPN63y?XioC^*wA7KsH zUN2$KTWxlR#z)DyC20QxP`!}~^F=iaN5?w7w%3|t3$R^_%ejZWuw)NSvbmcN4TcFZ ze-}^KW48YAx9w?GZk-9J|F(5};B#{tp@?@T@(<8+fdf@}vfI|v_PIGbKD%RuPWncSXCCHTqRCZy$J*;`gK&uqF8mSR35nX46 z=ypA@0W8rJw!vTSnpSbA=|5xrBCdJn0nJnCNa{zUz~=*~7u z0C~+ww$hMfn{m{1Iy79X{N#^CN#P>U{KV<6(@LtLrLL9Q!|@NW{56rtM~$A0J_qbF zK%BC+mzV^plI*3+1#~r|qhhXW#-uHag+~0-lj~B$9Uy*Gozh-%?@-{RPWG!U_J1xq zQK#Bvvj%w?$8uW6GW%r4_aNHRTR`l;`rOpA(=21ZjI}iJP{1>kPZWIrQstS}(deLg zMJ*BM7A!JcI6dnU>)NR?+ahA9jO@#Y%%Cm|5^o+a7*fHcO)Qq9c2Pj=I|*^;^ReJk zns?UI%T)UCH2eb8|I2S5t@MGJ8mdc0u_Y^?gEyJK!>+hBbE2u&jOZbO%* z2H7oReMIa6*X%a7*TXVjNqZLY!%rVZBf2GVne=}AvBI~S>aL!&oHxaWIl=*IcJMr4 z;@8B7S(E_6}~fr5ESB@&Sb1krh$It5uj*`pH@Vc zQzY=#8BO4h`iSh>N|HGQ9C)M%h&-uQef?Y(Rk=6oxfKAo;RcP?v&`n(8f$moewPhc*in7H@s0{s9cem2auNG%1Vj@hdu}e5(1!&8yXz zrik>YF3r)liQe@tLQTm@5=66!)owACH{T!B;wNiX#QZIh$9jY+H!h)Ec53UJ|Fm%U zxW4&EJK<<0?H!Ku0coJYdP&-#NEFmx{cccEj0)CwtFuk59$qF zK5jl!W_>Hjzlifs-@nI8lk01$@ofDAJob$j1_NU!u7VDVxU#4KayT9_{{vw8NGW_E z`B6g4cf`-nZ=w-%IL5lhuTP-_QXgON=EHz;6yzSeJ0dJ&FL0u3=QFAwJ_;5#UFN>d zzazZhu28u9_od>h)*&Z_-*QxD7I$mw*HyF9GV8B+p z_XhZbzVUrDf^5)S3lfn_rHBXhw<7@+O)yrm73@Aw_6CI;+T_nVQLv@~e_V;fjrCK` zGcN;(SQ|_QLRrVb1$WJ%95DZrz*tPtu)TJcH6>t77B*l*;yLI}hvMrlXCqFLec5py zl38)30IPJ&{ypCS_ug27`%$Vd;cS$6HFvIOhY65&mFLvTa#jiD1L22 zLqH}A&GH#S&{!&oA{mLmjfVIwXM46ow`sD+6YNvmdGNaWRaj9=(k0;q&XgT&<@;HpJZqRmm8 zKbw<-yXrarP-{{^tygA6-6eaZPD68R%`o3GbQ~drYjXF>UiArbO_z(tz8J$IU3C1j z>=%>$D3q149Pg6iZ9ukKRBYt8RSF;!ubA03Ld%o=oO_Sdz!$&-W@v0(4?wtNwB0i} z%7fx@awLTtH8T)^`&pJ_c@DP~jN#H?bW6K^OY9vis(y5|jDlLRMt<%zvQ`bY?~7LG zklk{<(iM}vi)lAX;%EE_&MVu*r+e=>iD@Bg{zkJGAy9#n@!CH&2T(~a$XaHRZ}JUq zxFI|$fk8_QLAJQPe#rPvv_F(SX}7fq*0mhz0nJXL8P_yG4W8-desp}Q1O)M{WxMY< z;%AFL!1U^gf6^Yi{!U#o`rP(RNp*#M>njEFv(*}UW1I&h9=A1l#UPo1v|Gm@XzR+0 zf8IambK{8OA|@pSCvV2YD2A%-w1aez9ICN`#s~#2F9?++NoN8(WXt*u(D_oZOH>>Wk^>)9&h3+xqKfwR< zsp>jJ;XXS$j#k{{7>y5o+cgs*MkMV;;EU`UIfm@zz+UB2*BYyNz~S?dYjLp5F8z}n zdJFpLNo7>=wf}(D+rWV`zZ%QF>^bAdUNwQv3YCYK9PlCdSPLYZSFF>ZBAL5%l3T~4 zzt#uKRIsTfA)ka%BcQ{|D+J%4UUO*wQMKju3LR9?dbYi z!V1}?|HMH9k^}6dg{MEdhuMK^N#Er$~Z6kvJXMAVbH{UbI$a$_QwWb3;*3FES;s+rTQ+&jVepD;Vk=-lr|4LIwrT&uMhN-ar-cGrkKwkP|ueg+e=Pyi~ zhK&HV7`+|s!ao4n@rtsn(Xh4MQ!@@Rn5KvvU@hOh%iyk2VMbv_sX+|$Bgr0iq4c6u zzEDv)lZ-!XA!|G(zd}lPiU)tGLTYpDr}S#6k>=u0tu|USqU*4UgZO3j+0Fub4BNjF z`;=(76uQ?8o0`{a7AQcpWaOYw&o zx;{jS{+OZ>qoIquwTH#;YZ=@pb|umq*B8u<-s2O-(WM6%4<~M3kCWQ_?P)ry&miXX zpsvf`NH#W8f)l_HBcO&>e*6}H@%W?dYucL{{c6vd5lFkk$fiB@N^8yGzBClL)P|rv z?~fDFER9{fgQSC%fAxE5yi^P+ZvWO;3~ zJEeM#^7RwlroqSlSFK_#29vm9-JOy4Mv~K+GtEx4_5}0XVy%KjOXvpJwvH#}yPj)R z4w-5Wvt=cRCkl%Q>I~qO+t81bED=&$`28D>G)h{rIYyqQV2ymaa2nU{bP+H(fPve{Y^ryR(7D(=2z+8 zRWajO56;4nd!^>tRS6TG@u$KDQ5O#C7j2GGgI{zCmGt#Rm2dN3)d)+%N7Ov|2Vb-A zfpQ~-N}~IfJ-LS7a#A4`Qamm^-N9i?Y zy(1fKs?gyelsIr?ETHOhF-n?*I7Dx5r3542AJJ`^4<&XA;$Y^KMve*MDqoMo5aAKd z$o9$+6sg8^O}I6?63f1Uo+tL{iV7Z@;ncjkrS1%JXT>$*=d(3^88x~I#Ba;Fj(MAh zzihek)^xOOE{T)0@%ZaGu#X#WacI^nzvkuisdk}tEs~``u|sroC$Q=>>8YJlPduG< zO!F}2@nlO(`LEM!EX`AQhiQ|X+2RBXa@Fwp2x?L0bMP)nkD|=Gu;Y7~_uHHr9ldOY z@I*@uL};-?Ph70c>?cvy7UAaEQ_%R?wv}s5la|RRT<%f? z^(wB_1ultj@u@MQwOjJUlBxuO+3+>VpRU=}?${IUQplTChjx3MFd~JO&ZkfM+q5qm z(dHxb`w=C)b2#?Lm1+1<_n*#l@5+jp-{JX1-04S^fi-b%WtF{G@UE!bZLi|@kU!l2 zhQDDnvHqrt^awO6G>iQLAuBzv-140v#Y9yf<>I9l7u)iSg=qk>ybx z<~ROg+Y6SmhL76Z%Tx@8RmdzQFJ$5iqX|PEO-6HOEeVUXOjZ_K_?tn-Sfe7}*4H+_ za}&x=D`ZFE;AtGRy*#~CNN9#pb|j>lvp$ik^H$;=vGUuIx=?0@rPS~+m7TNN;d}IA z3xLoQhZe8U@+u^S&FF-v9qGqohIp-7B>ly-Mf6(ZczI6acO1fii-k1i{LgTo zstKk0s)HPO-x~YJN{npN5O%n4yN!p2t^v*5cr8AN!G?}jbAuw^Hry-!eh5i?;tyNC z%5CsB+67PR^HskshKDA7ORgKi=)u05hY7g0-S!^8Y-%~T+YP7h>+yb~&zSIEN3My4 zYz|$ksb?3-wrB%i#~A*~aaW_%^tRRxv`Uf4PWcgDK$OwRwXrRg@h<1q{>f$r_oO=l z^L+#U$$-xiN#V5l;HZZ%f1U)AG{EcEsL{TEDoGe!}l6T z_er+Vl5_IAsMlw=c%0TtxaH|gJV;IT37X%-+Q(j3P;HPf9vcB>SHhJZW>+%MZNZrl z`k0f^r~Z8#YTOS8z3ZJA5P_{V&gWzP`JEVGq-CFEb z&1p6-uZn6`92{QYV5E*p={J|6FWfUa7bM#cHEYJ$KGkN|%);OAM z5%~nh%PpPX!B~RNK#bhz1WFO{XHpYK%uwDmy3>2b)HPyb(`4dWUu1}Ls2-{u@dl+4CWaNjDiE9#4kHj zxVq~)cP}n#D~Ykfa8m?EtEuqirR=&r22<$R%@)_xz~u#|(KcFY`RRzi;n@DEsmgtR zZXO`KZ210n1V+DV7?1nDx10cDGpu9M;m^;lr3Fkxh3HM@Ha5OxuIRsI&%o5mB@r-V ztgFteY=@XoYVxdHQFG<9a(mfgrHbMq{xoXU2rC&DMa4h|?;T`|S-0F`8JEkQBFrx7 zGtcD~EZ}-aK%C+O^M}QMj?6lo-pN(#3N_StXMB*xQ%as83X6Wk^lY@j+ipXRD)~G! z31>d#I}mpKqPQ-UAZNc*2lJ{w@=UIw5qLHr(NR{MwlQZUD@c9jOcn_2JJNss`@m+E za=4uSl8Dmu)3n>-x% zbN^^|`-zXwB2zmJ!v*sK>Sg9)iV*^yj8+-ZB;#J2Aufo$)vJ)QiM^_trDFtYGR071 zvqP*MTVVX6T@b#0imLU;QMuot?l%XWh9`#4;<3l8P1e`cZ|edM(`Tw&`<~Wh2NMK> z#e^Kh+vw{xVLnve`A<}tgt^Sv9*YSmur3?(eaU>dW`1J`-=Nh;B<)oH0s7p%Ejf5d z`MR4797*Q9gzr%Dg^X)$sYy;{4z6}T5B|!2l3dC=c!uG!Y23YHh}h!K7J}WNmi=f% zJ5|Zxua)$!KtHxq4bVN3uj}0Ik;rhZ1Nw#pR^2pS?o{3L(V}o|B~KgGHrfk=#>CDp zhw!;N=hDUM_q$9Bew<7rjTPy-08Vz=qaT^5U!=~){sCemro0m*Gd|=`l)d5dI;MKE zc#?)^VWePueTFdO1w74F5DFtpS$jG${cja-5=8t|9rn8of2c-V#WsZUZJ)WGRUT)8 zW^j=3x{BcQcQGEeSZwWX$k#V192GLf(mU6G8DYmJVHQYgpRpeS>2!>3HXLDTS5Bd= zDr_bQ8Yx`_wx5(QqS@^JqrDjK#q6yDXIdhmVUL_=TK2OoRP*qqXH=8?yb%pJBeRVh zZ$m$(89lT<=&;A{0yVIOG$S>kL{&ad3J`4p#YUB=3ui;@bUyz8*>)j*837iCSOwOY zZY4|MjS7b8+8E|4$mD5d=L&53){bgLJU);q>S9zeU|v>q)SG)$XY zDmf2VrFY@U_8ZYp&aPCOt=DE8<+aFhTWo^5>rdKX+U2;IN1Py!WSj05kq#tYd)&rW zHD%c$S2ch6XTJS|E%#UvqQ7u~ngp44WinWJ#BhsiWdjmW3$}IkuD8j3{{X7~B7_ZZ@o)aga2p0%`tA6AY~VyY;}nk%q!kz{!GCDr zq&B2(0m~m3qDu6!>tH3nPSrX*01LoB>~dgjCO*pODn#=y;VjFp>T)^Uu^D(`|+xBGW7md^AHOyw>4B zVz!_N2x5AGP=P2)K8iLH|K>p7JOxE*@US0HpV~c5P?Vl`Fq?63{Qa@E_eWl;N5?Wn z`#zN3Pkc$D-bM9Invjf%j>?1scUp?e=3SJLnKqVsx|!}b9obhxEdRL%t;$OCzf%sp zsmJeF{e&n*^kC5m_`s)u(3vXK`q7b|zGF+V;w(71;rHFcNMoVTEo`6sdhOA*VpmAa!9s;nwYd=Sgs_o{be`of-5@Xlre0`a+ zh_F4TzCzkBjO-b+n1#aWbJL@;CbMs7qmgJ<)Esg z5T}x92f6q+*w^p(;%6$#7h6w}`_oJv7pR{y$YSLrQ_4tr=TXH5I>UTXT_vT%#8$ zbQ_zZO+`6G#Ptwv46Pe5nF7LF8?Wd6_H{^9fj*&_m>)SdJE1wDT|-ie<|NNn%(1za z&A$*Ymb8fqR+^AAq*D}efGn4`>^({TTcSdzxOOa3pvIl9T&_KHapHseRx)eiWuLQs zK{G)ay{tRmT18-;z^M;YBs8*qPb+EMobK#rTNvRCl4CgAuQ@ua6ng>F^_T#`&zxW1 zh8zEG1J>rj1?uAr^Xv4sIVO|v?N_45u+Vf^^FmMgPuIq#X)*lbtzre_4u)B3M5vWrJMNwp8s&FVm9PaWTY5|Rxsoxzcu7Me)rO#(bcLXn8d%-BLoADDo@vAGB+ICsPZ>oJ z`xKLUmW{{V(vfkN@jP89e(Sehxh~RX=XytkJoL9jiUhWS?QZv2YzwnGJ~V(opp~i6 zJ2J8->7;>O{P9wBjr`90`(wT^D~yOm9U+_Mfj(CVZ;+2mNL;`eYfh@!jwBzYwjZqq3d(Ejtx!lr8-=y1)fK;oE^Q4Xf=nC4h&-CCm3Xs1|L0JA zRz%HawT1-N-EzfZ8EMEf{f}0uSzaSwlKs_QjRdB;h-q-65hf#Ieb=SsQ|37K#`QF8 zPj`#WtngAKCU-OTeR6t$qz)chRP+!oa>Cqi#!bbu3K6qzLMCIDf+vcxy_E}@f>ZKN zo12*>9M(P;V{6SFT_Kp6HslF?_K-RE{OUbUWO(e9^(NO1N9z$483%E1zF^OkKSEXl zuPH4QgGl2Xnv9r^CD!Z9!>_dt*A6BLR9ug5f>C?4$+GH~@@&t}8IszB?)fLt#-7>n z7rI9ms)m-e?I=la&<_aO>yG%#t@md6mch+LT4N_=npcPoxH_J8^34Y+@xYIVVob(1 z-hSbay$I|S&72Xgx1mJ@5r$gNjE|$+@ak(V0tQe=Cx=IHwRL!mB_X$p?q0fOv-r#k zbq0*`b*+XZiFw0{I-{ujKsY`Z6@9YP2GM4-ZR1Vky!wfvI zGQR3@#do)kE5K^a6F!2|z`sSmp`T_63OD>_aEU|J&GtXUcSu7)m5AT(l~m=8X+XoG|H9euX5 zA>;G9Y76;pD$NJ!Gkdh=zdHCF4R$+pNZZpgh9Cc z-@s2xkV(vsyRZqx#f7B<2DyMLBBmfKDC)6K0nZN5}uHc&7gaDJ*d8@rYz%-Y>Hlznbi=kpy2w=~gBH-fAfu;z$DSGLPW8W!dPsuPHSo6);O6?VZ3;iGL5)R(S zor@#Gt1@htvW#|PQyU?5-R^B4XD*`yUF}xK3VazSKKm&o!cCe?B!gWK7R^(zrxr5w zD^+v9yeQnqn+8wAYYnDq;5~0XCAbDYzDYPJx}>`#Y3sa~3aLL9DpkC`TPNf>=Io0% z6*S2$vflnCD%^6VrzeYU0|tu42~>P0dPY>&Os}x7pKM>tXGOsEAlQVO*-nAYIbqsK zU@A2$3=vAXj7spHMgN=<0A&CDTfVMRt@P3f?#ja*1gcmnf8PQVfbp@3;;fP*agUwr ztZcpf1<~f*xQ1x6#epUH?c51v^-5m(-k5Nw`e~KOhW&^hqn9ES@(e7Ub~zJ+X=~5x z_ZjJ3E#4E-8T{B>`uqMqYhN|L&-Yxnt*VFELSDB&A32{GanD)QW+W_RNKiy%kf71Pq^e z>V7IZ7FHA$|EMg>vC%ztp{0{`a#n7%dr=ckp+Y^j zk>@w$mMgmw!2Z0ig!&iOzhjp?$;mg8+|0z+Y+NXj{WLyaNHBuW>LP+7f(pAsQ1T&! zW|>MW8Opy;M`u}DAI+ltF2dn|oY~=%e=X9$lb@Li6;QLcDbr-_Y@G1pvk@UZ%Zmuj z@Z)rBxhAcdB?Q4M2+Mi+>AcYHMD8iYSlz&sa&hTLiB9=Zi7&aFO}di(jTkFHI4#FN2Y|iGFix z!c_8Mhs}T4L!03zg*AgU!=pNZ>rSEzF%Rq#M^d$+&6D3NMD7gXsHF+CDI2I|ay}m? zU9TWL%ZPX_~Pa(z!FF;Kwf{Jo6g24BZoIVWHka}Jee@L9_6Oglle z+69L2`hoEkD0YV%d@2P%8|S;d%qJwZjkv2PIYo=*{_Ql~;3#8%RT9W@YHk!h;}7Dq zWb@`mLYrsW7H2&0VBln=Vmr{h_9X6z-*> z-;V3h=wGwZ9?S8EA(>)19p%co68A_jmiHdtu-Cb3UL#V8F1TWGRY-*I-I8*2`OqFK zg?KrUce+e`X0;@$e5?cd3^QP&*79W!EQ0x&@MZl%{31xw+w3&1Zz6ijvqqw_<}&5( zR`~L@Q>bIERRR}o^R28e5XO6AMQI~rE{8H6+=fVS)dURJ2r)wnTTnyad-*B^kFxi- zzE!?{=g9gmpG!RktE4!x7h!jMz1HzvsNQxe_=EU)1k%+D_l+ZR0*mpElE;KQMYkQi zN8i`c)IDGF5ypC|+dPPIKu}Bs&sYb!_axXZ!+mr1GOfIKZ6jaH2mj^U;Ca4PY^JT| zbZjs9p#4h#togvmL+J_sD@OSWPTna;<^t`LPB#Z*VxLv6#k#4=wql~CC$a}EZ>I+Y zNHyRRYt)rlL$6VF_8jvpH`B&~1Y%nVbnvy^+;L$HPO)IQx)mDFIN`=)#hA8mU0_^z_b&ECdbyP4IlV9Piuamj6zY+uop3g z5AW6YpU^cUDggYezloi*SFjC`@iKy z1b%#`2$aR{n17|wNn|J>JNLO+FwuYQuUHEQ+mpZl-b1+m27aXACPjf3_8h_djwldE z($5U$CMilDCWga(+pbzbc3Q>wJ(WqP_8%ZvB1@M$aw31U;8r?WTPiKjnHp8c71Gl^ zZLqE%b}cqjy=PJ4{_qfo?nu|#9cz$svy1QaMZ_P@e#fSe*e%)25H^Ea&wIN|mZLxGOWUi#pa93iDc`5LT5vYeWv zAl4^_6VWDl9fjLMoF5{xW(Z~s^J^f2*h%PFlC%Jk%Ak;ImMLXOnWgb-?*M#QpH{0E zrDr6A_ZH*|T`1c8n&9aa5i_OYo++4H3cnke0N%8_GYYipWinz|jkYF=3$OuWIGiUI z6OEyIROf#HBmcP5Cu=lVv^>~oL*0D%l5X#PZf;aDM5XLmNifPE2FF4(VYms&P6895 z5BYy#QWQiDBWMbEE56Q|N=6LT{GE#pqHbpuB@5M~--2}L;C@E~rUOZ4CqlQ1okDs! z0G1|}RJRh$VU||I7DvfVr?`)WJ2Q1&VRyzQxmB#|<~yVA82ylKV9_s-*{bOW3duM!L@zPj z4W_PHEXKwTW?G`5ek-76h9Vx#sJQiIja2?QcaQWyrT!C(uo1^ zTcarPA8`V(!a@ON=<2k;e1*!(I^-^?rk~FceMq(UT5*BUoB$eSz!UDzZ@F-tr1VFM zWfa=l^-t^(3S9n@2o(0Py{L+~e&I+rBd@Kuo-0LR`KT5Th=ak}1rq2ofK->_6v3Fr z!riqyy$$JO!?N6VoCvC8(Z+q_Vy!c{vL-j2696JC1GmVbpR@5+^_xAZ37T|MUizaF z1#uDWuR4#zvMo}$G_HMaWw}q|YlA>7d;Zy{0`*@4%sJ%F_=4nnMB;?}rO+wS9{X@B z7rC@=(-|MT&%EQLdc103Z8#yFNQwb}&gm)EzKK_}@a7z&gv`Q-aLJ=RWa2u|AuMlD zT*1JR2@1sa!O|uBBwpcPvnI~+gOUHrY~&OT$K#+Lt4RDUVMM#h4H-^Z@5RcPQrv&w zEeQt|CSG<0fJJpZ7RvN#TYW*ZhYjqOl;u(uC%g_?nj?nVg)CMwA84 zwF-j}P4G&@J?crt5=TgcVGW|#M^T)?f)EoEj}46+IRK@%A{qO38wYC*CoOins6PpZ zq6pI8Ud=q`vkM!`z}YE^6f0!LA(rY`K2dHD(o?{SChx%vG!yZf{<^*A)AF3+MyrjS zMbvtjn|8j2x!VP_3A~yQ7GCP6&)?!{9mQ~z7sa}=Dw#n>M-*s$i^&Z2aQ!8%F46)s!4%7A=HxsD!6FQA((fCBEvrbpf!F-T5+@qB5lEo4n_=6-=<|7dF$E9 zPayilT!rgF4zXdwe~+HS4Q-^&yc~MGglX=hEY(?K#*hCx$*&w6LizI#1+Onzf6n6D z>1P_R6^)%n$_64-7-n!Q93^mxwxSwA2^HBN`$rcwYDIY%peqo$ls~)%W?1TEgt8fv z&Q6%ElmEvmS&tT!&!6&{GFkKz9{d_In|_@miUn#CjjF|SNO%Kbog#;` zSepV{brk&-i5Q$^BB(rJ3291h>F0*}x(iN3zdChDIttr3@B=sz2m?5|yaH=Ug~W;_ z?FLazLuhXdCU$F+QMRG{ATa#gKW{q*4rLB!K3iZYJ085Df{YJgB9WG9_(?>7fQGcw zzi)JIJw7&NNS=z_`?z}Jr~$~L>@$RP`dI@}LJ|#7N2994kca@FC4t|yt72)>>T#NJ zZd|nZ9_HMFpnsw+lyvM790Ncf6Q+&DBNZQuM`h@I$#9c}hy<{gvxH(egOLOmQGM@5 zQvilKcY>>d1Wp>qn8&g@1@=3_^98LBHtZWkn=&fpFn5!0~y;NY3{KXR#s@Q1V0 zC9V>INf|*O0!h?De5(oT(G4VIFi?1VZ&Vu-x%i}245*>@YL5lKM>A?nJ&QPSa9nVM znh879Eq;!|e3}OPjN>&Bs)QV~iQ8qf19UMhhD#!!W#{`kg(N-n0zxa`BjC&G7)g?~ z_sE9j7mNCwbGu@T2;}7R_V=3;BCvXFA5HKN7IDrl{Sw$zvcCs8t%|!$j zxk%W@Fg;Yy5G)<%Nj5PzL_eKf`{9^7kLO=tuZrAE*){@?M!!MuOb@|)SpK<}*`stz zn-gj<{wyJ7u%I#mqo!RTy75oSvwZr-DiZPEFZsE}pWnD`od?lU6 z->3(+X~;ie2Ou)K$*<>f<{x(6`D^4HLkG-q4j%%i0Clo;^`UTtu*BGXSU95)KX&nT z`$-z|h@W~>^-eNJr`5q%FCXKz?Ux8s#0Fu7MW}iuPP7ILA)ErK6MBUQ`~&&3oTA>Bz=_bs zg#1gp!$tgNMEb#?Q0*Chp1OJAvaOLLz@Oq_tX(01zsVFZMVvB5Hg4&zptg_(jtLY_ z&dJFm5De^*6A1;a>Z>{}n?jIYYtn`CL1sZ3i7q9<7(OqMVo5aVDG(4-e|X+9*LuxeYq5%{(`}l=L57QZplNjm zYTU;$f++QmSHg51&1ODsz%lr&IUZP7O=RmFXdllzETI=R){DGD=e$7Qg?&c+IY#aj zv99{Fk-^Eo3e$o6;-qIhgkV!5)a9bT4cf9McppL!h7-96(kKMu@(t4V8uG+L|9VTyg! z=f~Q}L>jD5Rya2g2>MVop7EZ(_P7n*6+I~sFg~qZI@ycDZ_4Wf*e&MNO;)#6<%Kcz zoKg&%NtEfLbJxHFFhc=Qy?f&T`SVGXnf6Sp}nlQN?HJ!!TGzGC*=z5!_w@@b$WzLM6T;ve>t;}RivOZi zDeUcMA(h3*IK#z(`NPN}ZP=TpmN(!WZ~n`ct=C{b{kZpd6#oH~WX8KmHJ`dhs%MFl zNM(>6UZJDUp!JiVG4!CZpOj2Xc^#dt5;g?AdS}Ozq5o_cJor4Rsmg}m=n}ng7`S<% zf0*sdsoX}}SL1k{d|zp-FJw?y2CJ|kM4~2hd~^PSl>{g*P~#Nwp4cEy7{EC7i@zWBw$r zly%LxyvkB3D8M|M54S;4m~PQG>UJV!V=;>L0Fl2VE!Gg$m03YyQPSvXm*)kl!_DnD zzNdt-10A|&S(B%Ah#>*W;6~Q#Jzab;US_jxaYVg#=?8|wvxGQ}@Lc+Ml7uTn=A*`l z?c>LO*JX5f$PkHAy9M+;vL;T8q_+}(;ewk9kN`NMqt6%ME#G6wu-ISWDSDb>qKR3& zLn4hWJl)y#{k063THij`nZ`_{OAt(_x9T3$Yw-v)my2M|C!gGEx>QlcwQ1>5KJB%g z!n&>F%(UojJ&lDJSw*h^+h`t17GM|%yEivB3aQ2yt(MY46wEgO$4X-|1wEGCSLNBApQMXr9=&xAiVQE`js@=l(!Qx2#50IJPHCvzs7bCr!U zFSU=lh5`XbtZZ~Dx*9d`DtgF}0L6$X5l)YT#7eXK5M z>fS`(qd%bdI&fT$rCO5lqi$yg%Z)^5tQ*t#Em9I)YAnck)OyEnI7O?zE{WIH zmEv>!uQ{vG#PV$$7(k!1qD|rGk>5@l_BL_ptLcOMV!LCtTGnrQCzdG2?iY~i*QMy~ zMgWuD%_iduI;C6z8^C`6^|4e=vduO805Ml_GK^gllrpPbK&8#0FXt4`N?S1*Zaf_l zgWF19s2n>P5P#FRVNb{7N4XS0`edYqN`*B`y9+r^9X;&ud}4$O{!@$KRKpS>(02?a z;hKf}=EwBRli$PAXDdb59%dpFF;rBtk)e2540y3}z-cLB5HZ^bgFgBrsMHm1Ku4$` z@`-CmMbLnSJDOUF;~c+;rZP+Hk4E}e?Bb#0%WHowWnuz~>czgY`*=ZT;4<%xZ1}YC zJN@|$;2emS@pPU%xrbl`7>)f8@JV&xxVKr)GUAEbS>bOGO>k;jM&q9iE(oEmq7+#f zOke$h3hH1dY>amkYljl0hrYfi89Au=RoXgB2aNuglR@)_Ca6I#^Kbx@@4F0mC{z>r z+Q9%7KKu|+OoEx-fDt$TQ8d2%;nZWWp949lL^~bvjl&eOy`vHV-B$KuAyJ- zvMCA@s|c?Ij_5Eaf3qOUS9^wWHxl_WZ^}bTj1xx)r_!q)r)_Zahh;M?=c9ILe0!y& zCam;>&bh~{yzD5#e5*d~X!4A|t!mbmh0>(|$}W4&!Mj_Eh{maA1^JifItuvyp~!0) z**TzkdqI&tdJuI`%B_Mj8yPwpsQZ$tz8>hJHRS)qQZ_b~56NKyh8Kn^;@;S7e zK9Q~N&J233?ih+*gH~sblq7lX72COR)O1BRVdV@Vm*5 z69ouFyCwm+BNL<9?zaOPFr&NSw&`IHs@K|0duD8~{6kQ**IiyE|3J_!%rhvy5U|gw zZ*lq%Dc0prJ04T{xy4dbuQH^UKp|{&^vi1dhD@IvD2%i8Z>`kZn->6ZPbbMz?bEp> z(-WicGWw|M?NN4UQM8m5S}-Kcw~^v1ZVccJL}lClPGfi{9IL;E2?eB(5@>Kth#f9y z!1Wrn$X{vaz{dPAI)4Y0*pfJ_J|+~wquC&C+Dp$;j3=4d166L!EsV8@ZwzXOLs^ES zwD#H~_YGa%$Jp`nIdrJrh zD)!75JD;y9>gcxzxc=Lt`g$@As6V6IeC)m~tUim#!!zA5Wy&7=qvv)~&=ov95fhOg z&vbucQtF&J79YCW&HNVfI)@d)I09giJKZ3i100hTb58cZMsjj1uGLTn5UjCucRGZR zy+4g6u*&(zO*mm`)US|ih!@GKS*g$fJQQ4=T zEA;Q71n2?(`17RuBSbbU%`@ACc~S;V2`+^L^r*0^>p++?N*|ldRn=RjVGr@Hi|4+o za%M{0($NPcD>V>ERU3b1>f{dB+JF7H-tx-75#{KB&lyLqV)zJMyoYZ~S5G{5@@hqh z)5D#P(Fs~a$wJ5)=li)~J@a{U#pp}yR1swu)J^qy!xtY7TFSj4osA=gMR!-akV@9@MCGe89NW7*Sg~rN+VL$yFVM0AF3Be4eu2Ybr0~hGHIay*S*fylSiso1{-Ye5#htTBJR@+;#O=-@o_& ze!k4i){q06f9T76qg0=XZ<%C3=#a*TcDkxRH2uYTBlkp)Hbg#6ylFco9>V5yGlh@( zpk6d7)EKWRyvIc%;-QbWt_UA=(%XXKK(|3V#Gk)wJsV%^ppo~4vO{G~9qzHmB8%aV zJz)q=>r5)#?~ThJ*T0@Y#d6oun;ZWS-8{MZ-}U4V(c$gK@$bX;cKqSaD_(bla^*Om z7XIpm49xN0shCHbtrKt#Lp1ovoMUyPf!K+b+>&`}!(dc8MMY~_9*0skd-cTkBXfH3 z)TH(h$(TUvp1`;Q9(`U4nnv?J*0M&H*HyJ!f@D3armhlUiWSI~_+v3nqM86E?q3dR zK44RUZYI6mb|^>H=Y!%hJ)x;|FbbVWvyA|I#0Gzr;;0w)Wgz}i9l{6?0r)Yo<|Upp ztfxIoH;ZYvIw7J(I4dhCjg3H_$zGq$sV;RKCajK=bb78X^&j8j+$xv1}+RieVjOu%BCNY1YGpi`y8}k4G%E9 zhhpo_%t?UqR|`aw;@YF00ruyyFy2AwXE8F2tM zMU}-KHR4zBLz~+2uq`v^d8Pjwf3afI&yXWp@#&Q}odc@j8{{V&3c{CMf+% zX)M(tp)B%1mg4r=(p8>W`#tUen+UkAdF`&x7AKXSbfX?l#FTWy`Dk9rHu?5!PhHlo zog0p;1PV$wj?L>7OIk1bQ%wH?8?5yU^ zPdEkm#(*255LcFoY-H#`KjelH;EvZBg587mE%s<{Y~HI+3L?H!rL5WV(nquP@}-m* zENnEgc*tE78x!1;3Q&7Jq!U&r|GELbnI|kI$6K-I@M%!U+c<%^sp;)?^kvM;Dnk)* zL&H>dt%96ld+-gFf&A7d`SvK4rE3WpW&BKtatJM@Cx?44clv}~(`;BQ#j*#CbxhUc zLzPU-(8C=$VvM*1EEK{7_=WuwhI~e^=a~Dc4Idolb@wUt!u;9Ildq-Ex|43zO9#jy z&ql|$x!ljmF*99t8YaE00YuuOUaw6ob17)#hPy+JmS3!A0pJX3oDVfy zQVm!D=FtU?#?qFGNAlV(RCT>yJdvQ!0G-fS4gLh)JiJ{12o=Q`c!~WNdQYWa0D%arG&7F8dI`cx2}9+Iz9^?NwR4u4}=SUZFQHhvfsnE@V|@R7AJiR zr`45kBOxRS4Gg%Yw}^qfJ~x+t{9RWP6lVsPjen;6C*;$BM8VS&CnR+vmGTc)3fZ}? zAFm-OeZ^Qnmx|!3#+OjK&=R0AzA` z&ng7)?Sx|+`k{^^A_vcNIo@nldIQ*XoXyMdEZJqm0$+Aa<`neo&PxK`&x4o4u89AR)7z~fP- z7ZjS$T%vUAzOHd;{KJj?RW*{(S1hFpo?4R1@Y3zVPIq zQK!cCM9RAfMJEEoMbWrjV`aN5W(^SZK{@iHAr&#&;W0Cjx+7RS$pl?NA0Ax*PtHpI zdQHxFUyk;#JEToDmrl5FE+-wB>Z+-{6UZX&dqVzmM<^0_Q6{X!a37UM_9#=Qog;BM zX=;F>Si6z>Q4-=zg`qNsiBPT%YpKGD&MJ)cjYv|L&RN+mG0BX6mmQ-j63%cbT2Q?b zI9$Kmq2T{!cRhix=g;PnZZ)1^Qab=ypTCE$atsqs#j8ihUo#RT1B0*O?rZ<=M1KtkvZo1r;IMj5U~s^%<=Iss`Mv&-22AHFiU%c?7(MY%p6p=X2}~^8kJK>6L+2L zlS>|zg*iyzDevLsF?2RO@!yEgarZp0`V#$x+1ead^j5NFapk3(GRkpLWbkP@s6!f*6mwH?;IG*zZO-asC=_RmsEW!IPw^sSAqBod$u-k=*jr z3Pur6?S7{&=0ua|iNuG=h>g7o`s9TuWX&*Ko-$k*raCNMGs|d46R{w0pHS46lbbew z{YfZmMm(*!B8EWXCQdV^%(0cMo+XLk+YTyi-$E&b-^)fB1F}Jmg0ny*lgfRc`J@wY zrk4^M6Av3m@RJ)WAmIjz$M(imCjOIU7`ow$P9v%SwKH?dg}2a(*usE~^T8Sq)Gu_T zXbC#x*hzMyMg5bHBwDYY#9$+4Fa`MqiOnS-3fKOWJm~zvRd=Y6C7@9tWGC|#tIaHL zzRci$R6Pr~1YUN>`vyKe6eo=_|6>?pjK9=&oF5@D2>tksdr5Cw+l2IT)-U?aPh2-I zf`Mfm1WHf>)mUkq|CF;;r&{j^xbGDA&6J;_T|msL1elUr&KRp`Z(VT}vysUN7T8rB z(6W+Q&!k~b24bJ#fQVxzR9_Bovd?Crf?U(>RdriT^9i6U*(-Lqc=I?3cz;Y%<~^t= zEVE=H9bL68azh8E<(~Kx+xAk$BY znV+O1ZCC1G^geLEDK>zSEj?3aQQ3G*i;)YWUd6N6O|A89;YZ`cSn~Gr?aj{! zJw`3S79*i?g|KR`d8Kq9w9**9ukSYxWUSb-pfi^mQ;JRH@y=^VF{bbfY&QMTD`YDIGN(tO;HuSq9BtquN( zKL8;RTp1D=(=LxUYx5QSCtMyb51iA$!zdeV5b80ZWZhFwQx=)4GB5)0`B_SuMU)*x ziQ0T$J9j&snXHYP76%cDfNdXQxMpPq-_$_8>1%w961-&oYOH#@YS6u z0Vc08*rxX~RIicZB*DDIp4B&rQG71|>d_39*};mW$GtXdI~{VNl3%*El4sx#1@SMSM83Ty=00b z-#$J3;h!knr2bvU`Yeh1-qTR#>k0jvfy?EVE2W(8lrc21v!1HpYPA_#E1VzKdj=dn zb*a4Eup7~rHJ%FXOF!vIkgoD_1N-AlU>pU*1{_)eH}M`usQ?I-YhJo$ zk*LD94{w3OaSbU3GDJhU`o`xKApNFKiR+{@GvCj7{%<=L z0Grf}cwrl|v!EpVJLbo4&9Th8soBfAn+I=XandYuu`NDVrY~1APpxGjXJyfm{Ys)k zVlg@~q!8qI`bJea=>ZG^>cX>oF!brWzoUGt-zJ@`*t$=8VNT1Sr2HT@-;s*BRH2VR zgh>YAcF-kb5xV1i2GNWW0irnRRpKlZ`l{0%bph)<9_|EM0RkF})wtxtf+XuVAK;P{ zT<@Z;^}qhhzt#NO<^KoI5U9(NnJ7DKY0q=lZ(jLgH%n4pyFW{|Hg@Q4aCe9RLC;!O zP(7i=c1ZMh7|)g#3Irp4EsP(Z&M~$2@y25xc3z}pgtcjj%;Ic#Zb9R5r2B+YiCGxk zJ|s5ctw;($xj*{a3D4iWcPZN(^3e!Wo_mYD1YQzMx$*!O4UwUXIG95qR{DUA6g{VJ z&z(_YURmz`>WfD_lhz@VY++e0sLd>EM)^hj z=W4BsweQBWfewunYh2&?%YcgvV&wQ>h}raZlAcwRtQ|B}le6kp$<7;SwbVrbq5}e* zoX{;(MTBx0;6ksUx8NQflA^+ZN6gFCBR|5~&ejunN7*b{*j zzfTuIh&5R$nR)vj%|jYjyrIQ_?LVYst%__jN&E?4f1u|lo15kvBE-O=$6%EJR5!JO z41Axvn_6E0x*`CB5tq=!r0?2s&%Vb71z*63oASb43?!Ux#)ee&9dU?f>)7?*-IXLImlf#<^J=Bl}*R<3B)6FGWa-p;%qTq4ccHBCk=oTiN8kcmA`w(UTNU!L z2gBM~@$Nz!DdbD+#2#6~zAPQN8jS?q-n_gMspnfHyFr*2iI+qBlGab;q^zF>PX$qZUYa#`3j3{dt$5**Ja1ou38)r#QvaPlo-j^$`JCUs_tB#u zcTt>#={Fsg`M-2qponcfW(_k^D9?U5)$6%ON`%jI6kE-LKD9Q@NOw|>Q${?gTmA8M_q9mhv1k>9VTGIC1SwtAM1 z*=i{qt^Wg9QF6)?jr`4s#1ocHqhGCJ{aP7G@w}OjT)c+B0}!}1cIjm_C&joZfWxJ0DkM6Vc!Xg{{1?>gWXrP~MDqN7 zexYKll*BZb=D!V@&gZFHaP&vo1P=3hjRv!3%P`h|KaFSQh96k=qsO(@tNz|=C=O>V z#uFmVEPRbSQIgzkpsU4N1!9P(*|kT^r0u@GA{G8ObV{55cl5pUb zG8t`{;-vb5?JfC1y{D?C*9VM1X+kFTIf1b@CPt>nW$d*u{Bx1g%f?**`_G{SQtkvk zQ7GKN4N?xYO*HCU#qFwfb&PudyDc53%8AB-oyYjTNsT6Sp(~`nbP;afqs3jk*nrW; z^P?fJD8SXOrNf(9>oB~IVa2Pe-CqN(_L(*-EXax=Scr?*p5*yU3f4*tH@1?n=0?1! zr7nOxF|CtDYR5b2ov`v%2lLQQRy_PkEwvVQFR)U0)vBt;8z@oj732QxfiM&o5DM6Tv$R|}cmcp`S`<#C+U&NX{B598d-IN%ceqSVp z-uhg&4>1#-zC>xlwoEzeWCVe?eYKfyE-Yo#*zKWptc(i3C9W3|pT+s^5ZnD^jv2c; zoBj9aX_%!E9@t(^>1UhjJR=o-9wIBzde@-(i5`ugP%ULFF|M5pRgNpb@t{hMrUiv= zH2`M0Uj7lBeMgH$X{7^}iS26As63W7Ffwutg&IQ;Ol)R`NWKmMtmIF6|E5Rzr`;c%XZAl5^+q!uoF=cUZ4EiPl%&pfDIMV+gO55txj#Z} z#eA{VU1fD?cdKDY&l{2PKU3Dl-BQEi4>(OOcGYi9h7LV71 zRw{=toJ>4Ya@)~dezOzG>-U+IBSAD{=E&n9JUGb%&NvYe+WQ1{nLdE`J|?$@)G;V|i@xuZxK!=tDz@wetK#cdTR)2Va# z0j^482{}{$$OeHRj&Qms$J>rwz?gE6$?m`JL(sUmSo^Rw78sU*D6vXKt&vtYjl%wW zKiqjTz-{wlp~R3BYvkCeaanf=9HGV_Y08?{9+#C*j2*|)ZWV%X4+jfUY$HTdQ|K)f zyK*&q8CI2%<<4cu1kwR<`sYgR+5(yk<>EB zIcu-rSpm>g0+VG9>dITe8GgYjIStO*Y4V@GM8-OD^A?4(!gO^6&tKT8#z}o(XN22n z)ldw3KC^u!t0e6kpkX_J{RT~`ALhaTg{06h9=Iu{xF6Es{w$x$1(CR04Ts}gbvnv8NB+{fH*opb_}sNR~qtIrM^O|(`MZiZTbnnzH1*;>)YbrPDWXD zf=)=v}Ts_@=d z5qw}OEryf@DSwzH`leh@puG&7mftF2c;;}z%j$dAdU?(lA}n^z5Rt}yr8lRHGsI0v zI5s2K`2*t0*<@gP|MDd;gh%^0lhy>ZW0(^{`h*S!2yvG#fY9(I*h8jcc)w}{i#r*R zQC}G&OboP-O^|X`gi{KQ&&L^diKaC4VQZj1f%m1+-}uy3nl8p<*jmG?VAIy`gY%9U(itKSGde5`_=C*M;d8K#%<}6^_f%P=AlJQk)U%L z31En2+&DI>6}Wr7`eJtAL5KbVR#X;4MB&Mbrear@+YrPAk< z{r!91gpy*_3)KzoZq7BlcR!6v|LUqx11A0~>;xIms*CmUKL6(>#Id0ShvB}Sg#~vD zS>ZRZYrP}$ju8M!>tIMQAp4)__FlSbFF3A@vdo*%2$Cvt~e=~y+>*mun$=Iih#|izivmU|3?IVZ& zdjjTh!?&WH)`(ETXc9h9c-)2C7UK)u05oFEZd>~(vf*6lKS0&XYpXR3nS0Bpq{z#0 zFbM-Q)9EfEglDD}^Oq{BS%-U*X%^0*N#R+-2EHl@ROp53v9(FZquNFWMGwTs*uXFF z<+RU|yXjlCfhXxWy5YM^{T(EscvU$CBHL9KAYmBohQDO7AKRm-qwpww3XeX&emf*w z?mUFc2X8eLcxU=o@FwO?Ydlp3R0XwedHJOc|LbfTlmG7#MoB!(jPenXH1j#M^z@3O zZ{tzdo>3Zu84(QEgm2;cZG#5hw|~EQ>`i)kUKCHKHj`mFCw!%q{JH#j%$=TVPTOhI zRnjV`3{bm@RxeJ<_;84QWr+&<(mp@S8q1=!SV9vjgs*BK$5KcHdBVn14K@?jOrd*j zN@D0IC}Rr8_C(34A`hiC54AbN(G^$av7)?k0Ra{Mzy<=H{JEZ zp^4nnC^|o0?zhfDL|=`eJlysP9YyNb-?NRcbxbXqK5`EYBU1Hnc+x5Zh8yr5A{lf`8f%9z4OW%kDTad?2F?d9pqM-!d&0*;S0J(p*y10AVf|KU=pV77$ zR*jenZXFep#!Dvjnfe`$r8^zpO#GYG0V@lUQX$xrwjYtr#D+#|6aq`|Y@6{IkKrj~ z#V;>Fl0`;*00H?vTsLlJGyq^hJWQ@gol^G9rLs&T3^i+7#r>+fSWg0`Dg&M+yVST6 zP?tw$gpdlS&6Hkl?hGt*GgFrRVqA8ZXbm7`5&9@6;VFF=iFHPfhstHd$eb{MrFrhe7+_ zzpe9rqvJY!u%=)YBrgB;XG2KG46pE^1rf=|UK5{CE@|5Skz4vr`QZi4Tvuic0`G^x z)0}pAWn4jOMvB+S)pw3fv6hNu zlGaJKAKT*Ms5CnaiLIyZWs*ur5-~rb;<5`pGX2}M7^a9LPgx57f?H8aDBkV#-9p^_ zyFS2|1rP@Ml1W)?8eV>bit%AY}(`{{uL_Qy{}lp&I@R8tG%s8W8)5JsFs_ zc^(^Q|7y!hoZ&%2H5_yf({dWDKrnu1_%5^cv~Pq+&M-Par^Ho@i|C zB)9~?;ujd9yl8C2=^4VQ$alUi7BsBZ_jlv90ka( znoF8qXiR{>a!O{ZW1JXG+Lr3O6#`6SJ+gWPVVt9M8SiyrLcdKiPk4-Z9Bx7zVrPoP zJ!a#u<1*e2srCxXXo4S{-#Q?P3NY$RfpLc{EZ zl{=iN*2PR-rFSjku^-yIsY+K3l(54UK2H%}M$2pH{61jzHCqWgphVe1N45mcm)N~) zXRnA8)8b=D09dVjkldWTYff$>c!#Cy}o zb|m+6nEZE8k+QMjBfUqUbl`ibxR=={i?<`vkCVmH!VXE5mxbJ3_@;4;N+!$TvLK6r zc@OI0L^1^$?!bjaBPCk_z9(vpAyP-8|4X;s9?V^x4beWMv8LpS1o~eM3lnF@J?YVf zg`JQ7vAD4R=s4?R>Rgdc8z|3D54;<=E>TR#{oYVF=Bl^r7a`>H2UxT~f_IV8CrR8G zrhdl`a03ktPOl}Xh);>(WMxWR@=oI5OLsiS4k$V;d@aubVg9cU+h zTQ@C`J-~0U&yI2k6u%B_>rEELBL!qkdh7UonJg=jjmjh^~SY7smG-s~F@C zg{1C=pj)ll(XTYHoC~EAWxMz7;prv?$=U#8O-FBL9rx=bv{Bj07lLaxU-fyHX=`H`B%MwKdBQ^zsc7Fb z+R+~%)^?BXbfD9E7GCL_m7TfL@@>-Ha%DEnDYA9t&$kz9Q{m9oNyJ(#* z|M$dwe~?{8n>X&#DbiVF*P8ux`4+;=`xP1I$Gi5`?L#Fat8M_=Lt6mlYB}PfL64X0}WZJ5-@=smXq_kZE_$}02NO4zqJh-H`w^Bx~a z%tu!bh19kRU@7B{Y5xPfn|`p>OAOFgY&ala5z`K?!NGy7^=DJX&$W$8;doaq59louObjtvST(Rcj#=5C09Ac>%*#mlCO zZ$C)wBAipycDBGf^bgioN424aMs6_W!VY$X!kXMu2(13y=4hI1a$a)_KYUEVw|qU% zVh@GTb{s_EfOx;P;yf_Rvz*=Yp2o6;VRrQG)RRs>oyoU(Z|cNhH6;9>sQ*|I&SEd< zA%P7EK&0#HE!Q?Fe2|Jgy8oIY3ghcoH5$4Naz;d>g0@{7KFYjIZ~APe_BNyX22U$l zkQv8PIn0i7EHe?;h=ck+0PUPabCHtc?-#GKS?jp5jY^``j*^VWI6~h_GZCfeD$tr4 z1s&8;{b$lIX-2gm-FI37w!Dg3r`@3O#n>EmiD{bA2w5BXO*xv6K-NWkrJfLTprdX4 zlb{?sV^ijLpI8eA)03V5;X96+HmICZL+ir~9Y6jDSin(}?y(8Myw%YSz%dqajp2{i zlu*v(jsVK9%<$`Q3*xv*HM>0)v@D37=5uwwnTx%!t-5;?X^Bs8p5)4H*i_E%1pgox zNUDJJgKL-^4UP!)OTD(jjOXYvGG0+UX7tc}*?#)0^7;A}y+UOqOMHskDU%giggsTT zpkLkAM8B!&TtL08cWlpZI_HC;qKW#)!KKvCO#cC#LezPaYm+hrwktA?_!X&G3PS^Y zz08;nBP-SJCY!Gjwpn9~*Q1n!=D&YQ605ydAN#rCk-pt6?7*Zc8mRX`piZ!9}vdl7m zFkG9fzbrqGpo{5@Fa-UVOq3zg5FXX~4+({hb(7rrUsBw2DA)~k&D#7fANl3{RgEZo zVC*5bVy{y^CAUr8{Rhwo)uEYiouG8Q^XQ4hNc}+D`r%}7p(AOWOW?u>*S$B$&`qLf z+c6?H&MlnjkZlduY(_$e&*L|%#U8H2($GZ=?s;Dr6g7odL@s9~K!o>GA=1CtH>LzN z5Sp@Y;z3HN1cGH#VVK;kF?|nH$sEo1pd z)b9Sl;g20#RZ`2+7dzkQ0=(hhTbJa%Ys@(pOo0#gqu;KhPHqAh~J4jg|z7!t`Y!baDVYX*B6_K zSR(}M$hW%VUbg2iSP?*outSZ)i(&dvyC%@b6?4M$8!Zz5tdFOiqenUH6EjIa2>3dg zTOBf;?lo^L+Mgh@NvRpRs%|-p1W2n+Ykr>uyn^aQfC=Zsx8;X#r3oyo z6373JeIa;3iw8wiDAWu!MiY=fKg)V2xnaA!NecId>)Y}(*@=1spgpUS#|)p_P^WM> z0EH$uGRM$I3(p9*R`EgrD-MNclCNe15TtAnPY1!n zziNbOo3e#~Cxz+kC{T>=*Ym-2+|@n)SpIl{HA0hnr$}A=s|8f)>QGV8U;(hR6Iq9z zWkNN6suDPa!1pEIRtZ#AEK1?JF!G}Wg5@c6>>K+DAIB20sP|V}Z+hIndZe)6<-cej zA5^(o?N#Zd4_%m00l?wivf+i=JN4IyLp4a4W_vN{&=6QTM$GrW|haUHv0_uU-8~3nHQnoC~{{U^IAwkkU zvQPfhknGdPpDXYSr_}o6BF{J#?{vQG0d^t=+J6fZ%z{cl^S<)!iCzt9n`OV)F7t(f zbbnet_vMZa;mRq6()PPS!9ZI#nBBxCJcr;JEK|VqNQ^$ZW0=a`P=o0V9|fU+`+`MU z*{o=){diP5^p-CKlvO+PH!yDEbuA!2$_PObJz@_$sYkfj(u~nF5&ACTmdJ$Yx4#uB z8KQsIiFvq%-xO22_Cy*@n=OMRoK|}?E4|W_vPc3f3bW;u@8e7=Bq-<$7h}!D|bbA zCHQ}H^5us5P7)xzdcC8|;Yx(zIVBf@>%*E&asiYSbcFJ%xP>qKNL}lz$%Kishy;k1 z$Q7pxn;}xf+hLi>PWf9*BRLE9+)-t$v1mRU!PE& z)g`^Vgj-zeqY1!+ZR#Ix@3_NO-p%J!UsKTg3HtwM(2H(vhN{rxQ5PiB5A3qFy9 zDPI(NHDFVqtGT!747P@$kG+4aB*p^>01~u5+(eVmbtshqEHU1KNMvC66v>7bW z!tf->IpilR{}io0>a_eoY^RW;`sB&Y_0u<>k^c*V#t23-(ZzJvf_3S7GPbbl57)mx zE^D6!(>xtUm~!lysZV!qx7OZq{7Lslwn+3VDaAwnJy7R}(d9W7) z#F+R=W$6M)!5`U0r*aF$SlV|@LpYt{?CmzX8=>LuNhIu;Dxd7m_!A`{+*V7q0e_CNNkDV6pyKw?+ssc=L&Giky<>^eC1)1=VQ#A*Q7Tl_>q-%9f1!oMYr4>qiy6dZZP#8-us1W7_e;}7f-#mA&| zn!#_Dkc2=gg~Yb&>A#i7lhQZELWmoQwAk|R?NQ@Mvw`tgYHlOQ&I%0AuE_5_nFQCk zRkR@)xXzVHdH1(sHGdXOTu1#D6Q!?iw9vvmhLY3#)17GJ$@5g2(zThL6L-6K;ZLVx zJ&dMpY!+OxFg++R|{f{!)*i=Y)JM-(I3N*>=>@a&s;k> z8X2!x8Q$SxBI*7Ekf;Dp*hCGM7q#vMe*OnoCRlk!_>sj#-OZV4TY!9QG`cWtx)OrO zlFk2v6$b@Od-(oLRS?&p_Wr9EzX z6dx@k6S?+E05|{{>bTsISP~)*&pn%LNfoBQH2b7mzi#_s@X!m$4TJWGr0;xjU^11b zRPMsf29urU(w)lJA>TlK^1dFm!&Dq$xnzO>5*0*q1-*9BGDp>kaQKh5XN7k#jh7b`dgs%SfG|Z|uH%EOUw#}mlfMr#FQeD4Z2%pD8E%+Z-l(ZT!(H^+GQ5$UX#PX`sqQ zdasensQ)inbYlXKhVykheE?~m=hfo@8zk8PE&BI^59f_2SPMSjo%6u|wb~Pk3&N*c=<>KGzvSPPh^QPSiYT1edCSAsp(b{2DucR< zY9Q0ZaFa+8O@-@Sybb=V2c4w?(Wb%G6g01yHZo@VPUccv|Pc$PdDO@=Gh6Td>8)!1t~`2Yt4%ujs20^^%qC026N%_?+8JAsQBVa z?kXNsP|0XK6=39*dW1$&R&1bULw*(Q)-kx0r5H(y+xHyt?`r2I8C^Nf-hqR8c)L7@jEDrhXxc zp^DfQh>%RWhwodI-p>pZkZ+ZG3F?cJnj`!Gczvc~gZ5&tUjudTU+FFi1=K9iE$aTU}67FW0g zD)9!Ve2w1b6A^#mPIU*BTykGu1QEM8&OX9Cn#4!mC&HbBoMT z31Nfq*@|Ki!^hjG z;Z*wb{xPF2_#Yt5@r=zF?#pF=M#Rpoup4wHW&dyJz+E6Iatm?0-l8};roL-39I)D2yX^DRy^=9xST_m#EC*4a*B%|k zhTsvoJ9sOKqVbunVN@Klv-p3JcedU;ES{_rP*%Dfsb)cO*UZ%+4rRyvtcD?znC$Eg zKo<|y%`Ir-4HphH>hFGcO4<4cm=s|DArvS<2}c4Ur*a_qk`w%rll;?tRB#=u;8Yh& zOv}~+^{v%E+(G{VCDACvyZ~CBAA%vbpnHo53=}gxxGvaxSHf*g4kj={&;JqfmlT#r zj83i834R_-7#FB7KY)H57_C?(wh)>82l7)}M9+eNnn*ZWZ1b;>Q^1eqF*i!?HGk!o zl#lYnjR15+`T(O_$ZCJJVtG-EPnm^CF?S)&L+7ty;$S9~eGOUPROC%{I2qWUKzz7m zU76RQ5GAZDG_KsXH}N|y`A0W!`iJVe1B=Mu$DB-wo#{SJr`|sR?MvjoUrKNql<^H` z4Tb&-JPvXLx&$9iDB1(!*EmSXFd+wqzrvwLRSC$K2vuPNbToRxVZ!jJF{EvJMu!CN z3_H6sv#NJIklOHa!JPQTlVybz-`ZUP#`bFgS@}O1f3=LOUjP|87y}X1Qi0?6#=+8knUy&DMsnx{{ zz~(;k8zVv-CM?Cv*f&I?kGx zFM)ip!fop#;D^ zpq@tL@0Z{ENJ1Rgs<@IO_2=>QK7mqt4!%N;(i6}(fY0+rCEg-l@*79Y-@$5uR{@G} zB6i_~VN+opYjYy2(QvSM8SrMb?^B^Rkty_0dZbzWXq=NlZ^e|dd~ZAt&}1S)F>rg$ zs5iq*P>lXyF1A=OwgVm?6C$V;^bnGm;)J?qC)E6Fqca~%? z)$4Cg^M(bd`FlLbE#1MNw}TzEpmR9zPUuV!+nUMmnvH>Bi;Y28YQSXmQe7JW^?YLV zXYoWyxy_n4d5xw`X_*fE_LEU|n&x4XhL(_8&bV#dMDOpo^jRpSE;eG+bYu@DXilFtGwIm+MqN6(k|Z$P5@hn}on3Sv#ZVf>Ays#Dm!J z<_8{1BMhUi+vfR;=}s!iWrFoqhh%3dh}3-H)<9#T9km5btfgi#sT|xv6>^h$70Kn7 zy=@~?g3#3E<6PTPPXT%drM}E9ywe?2WrN?Je7T1w#1hvumX{mEuFr;E>g_oh7iE5R zUa7nS&Zh4C+9sMg6*UXk&39wjT8OS@xoDZ?COycH*2^|ql*PH0n)KvRMZI&ZcR!ys z1*6F8qvqSUVzjUWs*`hhF}ridw1S%ADut@Bx4vT*doG;SHpW=c^+kgB^1(O+U2ZyK2MGjS-rkj=N3{+Q)diOSlK!J^e8S6DGP z|I`p%yeK=oqT#bwdh-EYoj7~2U31KrGj%jtGE4^Zgoy6x^$A{q**FFh-?-~;L2LMiWDtcDPaK zur8#6nLw|sS9OwP`+nXNP$Tqtxb?J|ot(%`<3PkfG<2dkzD7LYaW8B158!v~VVW+O zFOYVPa)&9#TVypKV*yUUD-~x2Cq0gBsLkiG{t}f%lFEgC&F-1! zcI<#|kWyoxPBAa7ZL{Hu^fSr9>G=EG#2&Od{qO)*I1ljch4XxOr9N0OgNHBJ2`#Xa z5m@+L4ZZNt`P$xm80uxKE~}&8tBLhxsi~LKwy;}I)-ms#Gj4&A@AVA2DJ`yk#4WVH z%Aw7_X>sSqpf<0yKWDA_nJ7JBM2WNBx@-dsX*{j#?`*5XYY82wsB%Y(@b$so93HSU z8?-mHw@1O9c$(AXHuvx<(L8()(4mQQgT$H$qNLEzFIJ!7 zKpT-@s$VO)*09XmbCaV{e2@DNN{#_;P3>B??b#54#!ExSyqin<8CfFr^uRr3UHsHb z5ok{DdKx9kX2Hwcd9yx7d=wv#P6DWP3FME0&2*fgtV0lKjKPDy6pcJDy{Wz#(43!7 z+r_BHy#!wAZS8P8?jN7a!J)sR>+iSRcJ=t$Uu*F;9Xs(nl6_?uFP?5}u9&l0d&1E0 zLS|UzVPcooYG+dNk{oIECqc*Z>*Zg*tP95x6;Fu+0dHZ?Kyz?+UvGPN-m29D`rTVC z9|+41vo)C)?0Qga-11J$JfhMrYv5Gz+iP5%>KLGRKHS&MS7yY4b{i#l&cG@S=IV7L zlV0J9DY<5eRJN_ zWI<`Y&I}OoVM)<9z_wPG&uVwUaj)Hh!q2Hkrwx;~;Ix{?PO+)VumXhfzAUIT`kEcb z$e|js&b0pLv8Nv`mGNl&0K4g#+zw=w8SfhNj9#w|a-(B$K}SFTX8#Qc!P}e_xPm@2 zG)sRjypQ1)LvYkdsA?^YDOx`?OP5<1@;oNx5mt9KzjK7WsH!52T>LBRi1-RuIxL91H0KX7d=0z@bH7K=J$o;5}yafuSc zd3a{={coF-8dX@Hez%Q1M8ti2thUL`;KDuhy_Sk3CbhOnuhKZjMD?8~72}zN&mUU}$P(+uB3`r%2qnYA(_R(OJe$kNFllVHE z$1+}5`o&mcPZGXl{g%IS?N(baztRxXof3B4?dU^nNxv-SL?ub^u}lZ80#_yHPiv}E zq+P@~Un`G*hvz8YUBZr5m3~n=nSoJ+p;;N!+_pJ0IE~0j1m$?Dr))yJ6<%K&M|O*l z+JWBmCC<&CBHt+DWT{tlB8)jXrr|`JN&sb&0wWo97Aqs4xMO7>Db?5iM2q*XoFd1X z?Q7b0xcw}X3OOBe8kUzbo$yT;kuUS05n`h{SF{cW&qf`RB6@XltJewE%;LqCZn>`N z-!BH4{{Wm5YcreEV2Au2aXU%m7Ze;`dB(Ml=UDj@Pu2IRRR-Q9zqFe<<&}#9oty0> zE2v`}N(d^3oSSdeLI3U@9*<2o)_qFztG_b{d+Y^s8wso+JAU8nPOG+)`i=|6T)u4H zGYR4AcS_h0)*|26$6sJwTWiRPs@=-b=Sj$Ps|BH^KvGVS)6XHmr9i1JiABkWsFLcl ze0lg&h`~8PPg{o@whvnhJ2m`kPrWEv3DPX6jqpt^ww&NC+iLU8YTc=?0^e!q)tZ}% z`nrwYL2mynLyCj7gc5S|qq# z1}Z@gD|?;Laptx17D%=11Yn%6tVMYM@j5t|K%-f)J4E`!Uboty+3$ zapJp{scE?$4LmrM-0Y>7NF(PQ@;+&a7kqVGH&KWB2XMO59)0wDjvS^OhB&RMbCKH5 zQn#mzDeI039smlM~&2KIUNjkc3va3oO zC7ap38}%fuxjOp5GGygtiR$y(E>aD$i6}M#$;U))?D=_^x_GN%)Y+|h?lRom&aHVz z$AJax%p?%6Z-UAOu=NMQv;>s9!7F*MqS_^4(=E_05053q>Pwfcvs`FT5(ulx8;WWD zr`-2GpnV-zV=h^<-imxv=~u8z`oe)rE-{O;hqL}fZ5ljw1GZsX`gHU1!He~@*)8r8JVlOu@A8pW$L_ z=UuQgg7<{A<2|!Q2^W5Z>zqe9fuK(ptgM$XsiNFU90nB%+p_H3FsKCPIod_cWOH4| zD8fq(f%pP6<*3R-6_-fU*4jb%PLhN%5JV_N4J=7T?eMTgN#wyyWRxi&_g(yfyp|)0m_yY7v^F{`R3WHPUWCN!|__$fx?-j3!rGzkNgXH0p~~ zSfgDTgH6o&vWITjrE+XRQT60jYQ0RuSDl9bmg?V1OiP+9IA^%fD7brFq5gRJMqyW+ zmLRzxDt#AcjV=xZKP|%<1=DIDzHgvJe&y)0ek6B(xu5)h%Qez*D4T&Gx^^4=jzr_;VIS-316RwC4PqNU^IJLCe$biA zx{RYU@^r^!dtP~~`~Ftze%Qf_Kl;t32TWT}s)ag6u)5e?`Qj@Xeic2-`j@9XWEx+$ za$!!=FZfODy7s;~3QUm{+TPslAIP4$}mg))H!i&&npHo@XdVN!z2 z^vva^kK$d}}R_OfsL&wUM8J4Audr z-mSm}r#6+mpQekrzNfqONiEjvYs(M2vH_MC&rfNR1tjbI(w|NJYh9sZpBm%18wRm; z$W0QN7+d>-NYZde7c5V38{JYNJY`c*)85CiLwwdl(7KZS7P(G@Hwy!+#(GRtSzbeK z&Vet{e00fDGxYZnXGek}Hyj!s=;@pcBXR8|ak5bHh2*`A7**{u_H-JNBKIK_r)TktVqb8q#B~aB>#!AUfPUTfgcD7d>pL#k{9G}P;A4>t{ zRDOs9d2Y|(mlGVSn}LclR*7AqP3DzsH!GpQqaW7t`|Z1WU~%@?Ci`8{0-P=R!6T z0FPtb1KK)5tYqXNw+tUQ0sQ&Lk!P1Ko*X#~gnV@X&M4HX5%FF?S#r;dzp(75sWl(tw3{#2uig+eh>znEVx0yG998(-bAs?91V-(2A2bwI`an# z$O`KN3{I&OU7oE?`$2+2gzmGO(Ois+n&yIiaRZwB3K5PklWR|BZ2|Oq&g-XkaT)2_ zC!0u%J=oaZR8dRR{F@%OR^X+4kGz$yrt9k#t#x~L2YM9+hg7#jC5) z^*sjJ^eo?5F1IJD)ac8jCThuOUrMQ1XeA;;zxmfWKVP zM&ycDEcB!Ra!-FM0HJ42c3{dSMbXd1^|(QC%LOI8vgt6QcxQha$l}Oo@^B|$o8<^* zZ?u1~+LUcP7j2i%C~`w(4cqA#tg)Q7A>i)=g%8$dXCP51A&%|b?hrXc(k9Aw$>So# zcwC z0C$m4yXO~4Jppnc&mD+-c@~4S`I576g`PIr<5_~~7`VDk+T8F$8mC-#XeXT$%yYKm`LzO3Hk*wa7A(Ic{GbLq}Gu-H^9TP)k$SuW35Jva(-ti{v6M zd+H*IFe+ez%jy_)MUYEcfju5eW~WeS6E0k?Lx|xyBWo|!!+Zy5&Ho*Fl)p>G(a%si zw^(aoJM`C2(a@MsZAC#rc=tlpx{XqSyf<>VXuPB$qosWSiV8eT@zmDO&v8X`CgWGm z1O3w?OHeagu$b#H&H88w2niYF-~+x5K?g9m3JTHlaxt52sc2)1Y{oU-uqh@8PdbSz zY8W}QaYSs2$Kmb!X5Fjh#8~C<#7Td-WhazNahk#m#~%B&eoJf3kI=*ISIH~1v8Xbq z>W@*-mxzMII_KJkCH7rdmPpWuxL8u=s@-Y`!U9jaz!;YOo1&-{nYRg&Y?M_=but;b zt0O7sXpws>CT<+~Cy}U9q1xV;Fp`6pOW<2nte_CTDS=oQG7+%xyJ~jE0La{Izol>u zZAARCy~#KxU5_*Qi#dT==@&U?*`g2{4zq=X;qgN9>@cQDUThqCsg;P?5&kQ_NR+QO z)ON^-90x(FwRuTm+4k$sZ=FL7J}P%Dwm+3Ydu_1Wi&*+%KhZL@5*a7vt5`pKMzJ(2 zSP4Qx<9)a8V2X5N%FNj4N}RG&=aD=5W|GZD5Rq>tlz8wBnTMu^mLiNp-smF%P4CvS4z}0$3C?+l(#Z@9h*#120k+&to ze5$wZL$P5B9R;^xZs)_LcDYSEGWe&5U-N9eUSZ4IqIvm>v@z4*&S2ji^O>p^_W1glywT0nm$<&SC3?|%3>hBc?hf4Z=`;g@Vacf zTt!!2>bqSH4O~R0Eh{%n1)e9@GXq`g)vM-5_QCj1K5Z?!|E@WSR-`Fp zHx~zO?2Xpy>@LA4sg8hh#;wyiK-{~|(EX?wX=Pv`h+d_%9U?;BhC+;evl+8_Z z!_ubxV5~V_GrbL$3V}80Pg!nblGJ3!Ehb5Y-gBgcct_xN_(U(APel|ch6j|`cd`&l z!Bk3$=+ld7D^FBf8kKJz6JTyWRAc(a$v;N%@$7E~6Pf<$Yf#H=0XD~PobGG`;s&OT9nmF$gO9-BIrNSCHLj?&2|o4#qu z=f+&CaS?8)oSBKjmdlr}Wxa;d_sB`MEU9AUrIy@~d$^e!vh%c=Q`x~?ZZ4RgH_KtE z*u?at&uUyp_TfNPqBu&ZpPT%#t}0o+-+Je}f+WJX4VI4;_z1|2n`*ju1o2i0E&zKe z>~v0<+V74;3mgW>llB-@wj$9zbJ`dl_yc~cUo|sRy>>0Qdet?~XCy70-CgS%PGkF0 zP=gZx0gmv2!ePS@SKR2`2ct+-oELC^9o2(qx8lsx0I zcp)X`S+m$BUJa=w;3xVEMg3AkE#W>B4bwwAnH8A%v4_`=+ZgmPs(RQHB+~O)y#ez&x#lJ?}|G z1-NNK@5c;Bqsa5jK=!Ou9EDaQ)H)!r9V!{Hms48zQ7E-&O3j*BF0H9Gw^du#YHFzj zpGs@xb<+cE@bOSnXUgdsYG4?_kI%E_`=im^9xj+mVharo2LHWb?DmI* z4!z@=`3&145{S_`kRcc1KU-BAC}LuC*Gj{3D{X6g(sS}lLps|t?dGU$r%Oen&_|~I zTBZS*IV*xft@ytu^0h42!p)SNvvnnjl4D(^eFr78&FoHascm)7b=5H3!O>W1(x6#V zEvk)dO;Cpa+N`q`HOgQTW|gubGXKM7&ot*~XsL`#^YPQ5ZngTO+TkAnyvHWDz9B>M zC~5+P{RiLx7E z{lMy(c-z@?*4&n*G;-6nf^>XZE^-}&DgekM6b2=XR2jQ%WR71lG0{KaW*-^uqD1zK z<#b+aZR-t$X-lZ-BF%o$mXo`b8*@{CsJUYXY&7M9E<9@`_2rgRQ!b3H0o7qGgS7~{ zu%LM3{6336W?L=u1kBr>Hv5AY!0Ek-&)uHR=V}0B% zOisBX<-oeuOjyf=kGc-*OsERsD=@WY&A1}{p*qYMbdkhsq#KS01Z|xfRUYu{Vzl{U z63J*rpS46u^2)C-mK5qvHQ;cg?%z!ao3f`GIW-(Xt>qKS9D<96BvqYNXeRy2|5L40SP`gyT}9t%ARg+EF< zWj{Y^bdE6on(46Z(~JS6_gbNSuM%FQ%yRk57Jg?Yn5J>|FL&a%;dmY)N3uq%w6K*Y z%O@2Di`S@$uRC?nb68^%No6))s4E(;?E+@4kjKY*X4>vx2$A}mjQ>t-DDgkE06E__ z!UkP)Z;cOb63lCT`3$@ftR;zV?=Rt2Y4}>#ylCxe8L8eGrIXs3OFg%9bC^tX`4Ogb z`s~;3mGqgcbr*DP<+LzU;gb@V-iv?sJd|i+pE4J{9#f80sTCFN+2g>^_ga+pC&NE< znXmtjtwzqRd$#XtOQY9cZP48pc3mIGa7G6ZB^<*NrAQz9O2V)*B1X7v7KLP}$5k%+ zs*%@+9sC1aM1~x?oL0xp4CN*xw63||4|Ye2nIR>b97bh$>yA+T*2u2eAmMT+OorS* zT%AD?q%Wejai8T_mJ+_n6?|=ilj;wDha|6huz?yqYG>p=VvStr1h-!}wek6jTTQH9 zuvrdghf`<}pGtbgMEtg{{=s$|`nb1w*1FcV^Ua1a40GTF*%IfTZ{zy7Y9I_X@>4o*cZ6Yc0xov~Lmd z$64!LH(^=c8kuqD-q@KZy_Pz0lRxG+>=I`=kYA1lSW*;RNESLqHe9ik4w}v$huq3_ zT*R}J(-utH4QB4_-q{>LAMZz-rbDOA7Jb}>)xtNm_}cNi9|4edL33cgwgc>$VXAHZ z0iL*iE7JVl29H`OeZJ#r>zbFTL*%XfZ%k~oRSap@pdY!RG~gp~tS(V&)76k#U@Nln z#Wo~$KyGgZrQKE+2gGDWKi^VlE31`MOQov?O10LV*9@&?0AJQx>CXRG=%_he3{a^t z1A>n7F4{zUslH|%y*8Sy&T?T*IcsO-5jHk&YyuxwWFPzGttAT42P^Lx;t~#t1{#H7 z>?rzM$G6FdYMt$hsFZ?A*-kU~=0W*3qP$d0>Lu!zMzbk5e3Pk0u2OZ)N6=*2j4wY8Hl6K{C9hJ?|b^G#$-$5H5I0Y z+L)VzWmQa0<_F}D8ovAbyyA;$5l{`wnnd^v%f@SqgvOskbEV?H6#yk>m~4-&esqXm z@9>UMVn-q{jq^gos@SZ}q>jDr&om&V=QuaM885;00Md=2Ev_5hizNwl2J~{HiC}bH z%eu3`uz_neQHAQJ`&o!bWpWuq+Fyj&n9ZxTPDBT=XC7Z~`4}tjsOqP-wSufNC~rfR zg=gBwI;7VAvyy7uI^Q3})>#f764S3Rqq7=>8UbPPnOxhdMe0CoUC;4H?1VioK?pZU zCTY)2Csi{(;DM6A{-UMgR6953iX8;fYNOU$dGEr413{rCApv3W7^pcxrO%^=rY|>Wpu9Z#3 zu>?-1&x$QcQ|6k;m`wS0y+mIwc>hIvbwK&FQw{dBr{d`E?L{FNaeqmR!yn97)YZt; zJmOulFXiX4(QtkAY=vq4e9c|tPGP|!F_^}P`fynTZC1*WI$Hk#qz$#}IM`icY*?!e z>I-K{ZzI8T#@xh_k6bP~N(>0Y#ylSxl6)X`W<$(=_^a=iojaQO!R?b?#Ij543#?Vw z^<>7%C?qezUx~&2j6=8n4~e0tVxBB$bscE^s`kLGC`Xzf$ri?44HU*A& zS3`ZRanKnR>^IDfg?v2Zl*i`Y&+!jHBC+rxh=V*rQa-28L;A%*3^WU&!wq#9+!t}0 zae%sT8iMRA7ej%VY|vG8v6}U#yS#;SqqD5*$DgdzteSIa%df+%BiPDSp8|6sI7B7q zTBgYP)I9?GTllREcmLVekPaQU+$6gX;k0PbEj;nw$So912>X0R>&v)&ErxZRJ0^Y( zU6GZPbV)}?H%Dn(Br`{k?03*Sj5uH{hK3MU0BJ`b`(>IvXEA$pj-7AzXIw#X%_IE} z=&`QcC^17D6SyCW_J1pDSG~*HjQ^CWi{6V>T!}~^RU;ChgAeS4;}9_mrwT3ay0HcL z6u3J<6_T+>kpPM%cD0&EHAn{N(|mubAdkK`1=6k**HjPAJpr*>;r#LXqL1kGkQ?oo zpIMxDT#Qd!FFl@x@xeFQ0(DB$Enzmr={br$>>*;Dj&B2W*lP4*fgx7#Qi0(fEgCj~ zE8^UF6=Ee5V>l_RM6Uk$$u_v~j|$OyS0$@Ta%}?y^tF7|*K;DwXcaIqfTg+bvHt*R zd68>F57K<>%b3kUX-iiv>mD$6+{Mp7B(jHp6IfP(^W}(|m*m1>!$#P2q!RMBK5@_s zY&8p^{*-6|#8_kG(E5LJiAcKt1Dt0$rod%kqeI{5$j9oM-r1h^k=ueR(J&6Dfw-27 zy+E2h{=3^Yj_s;DT9|9(JpH2-BiE5M`qHl_8E$V|X-tGYf!J|N`zOR{XV%CX`6&_7@{f-KEg$*#Oo+~uA>T_=KKITUkPwW z$x`wQnjVsE85iu8D7ylgwL=wh?qbLo zS^8%uU7na4Vj)CTkWaTr4b3|H>9Rm4{w#}CABgXKyiAySc{ zB>bt7iBy1v0%bA0;W`?Vie&o|DK>!x1Y5<;#a{*b5oj?7e{#0Ui(K6EA}`myX&}iE zi#_KORtW}X2%cyNzXKc!`e!S-yc!NBK&P?aBzI<(OfPlbZKWV#F^F9YB%WWE%$IP@0)BwZK4)GbD_#n< z6Yn@T;~XN~mGkRLcA5uPZ<)GtwNj3I+C~ueW*UpPe16(9m_xAVL+m~Owy|J<5%FKL z=jCD?(dW$x&UQ-jSld(HWf%UV!sPi}3(xmXmzhF!Z9JFg(_Txm%0#&2MRCdMfp>YR zersTh+SwLjIE7>Lpu`Bg%G{V@ry0KT#Vqo#kCG%$2!((~6NN_m7$Vm+x5yoD;Ezv* zh4~TB)TB;Ck%rI@nz_|C_HlSndY2LZiZUDP+#+|Ra;%#5e63*Jv#Aw-ffMJdC>Irl zFiSqi@$25V^&MdrIG~{+)byW^tY~LduX&`UB~_G0U?usWX(Wx7_!!Y^%5SAg{&Mi4 zALbi^PNn#ho2BX)5Za3Y4cSqwD1rD3MFbpw>1Lw_UI{H%~S&H1dXT2KuyyI$FIbN1xpCf|1I52Kohx@^tW!dDxM>Ap|u- zUZ+{>DDV7&NJF2B05%p&Q=_(68Y10P8gcnsz!*>!8yIIvR@?XxY{`&nHwD_?c&=Viw70OC;37P@<`cqTGkNNKP~XX`d25 zSa+~|ENG|smu5BN&5gGr-AJl`4&V-m6tBiT(Cb*@=*KbGgoTFjNPmS5@qs3ak~EI4 zn~gUn?vD}-#a`jWeK`f9Gnaeie@t(8ED%$Q)R7 z%CS&bMr&Lh(umPNOJd3V>@O}K^FMIx^PQg|)r;yl+VHyh7>}07-JQMQRkzbv(XOCdy5;hbsy=X z7TjLX#e3Q}6C^C~f4yufd9|{_$8>+vEpj4?p%;*eh~Lu|HbRep$4+pmez>ps=3&It zKZ%N1dAbmJ6atzCLw({L1jfJ|Cy>@o|Ib(j1<;#LY!rFU{ z(Eds+O*_1eK7IIO2L8kw+sK5il@}7FM|7+o@w$y#>?mXEWILv6An%bL5p3o&7dkc8o!n#bM|z~f6c@kZ$m#*rO|B6Rv5 z5)#gpM|e%YOdn_e%ltRKnw3U&LgmbIo*m2jd7IP#Li$uIb7;~Sl~+emEGu}jS2GEw zTrAzaiW;ut2PI}cEvxMi{)h;p(Lyn}U2d)wJhJ$ZTVkjs_T*5NblwpC;a^tn zur#>eeA0hSxgBJPRbLcet^ETOS55g~vPs<^Ti5KEun8-63C`;a#g1*5XZtNzbI)1+ z!e%6PU-dFjwC}*Ldz0hO=?bY#pNk$w2~TgY=$ZSFqOcrgjh|%!&u4i5mk$651q%fS z{eKk&{(n9ICK?$VEEXxNh$uO`3O2Q1*$$%e#hxm&-GuQEH zEIj|=&G^Fhpz(P2H|Fkv_pW(&wEnzbIJ49LezbJvEjYj6xcQtpw+f`Izu^pLQ~T|= zoHtlNSHAh=u1+(Lx8~*k`@_BEa9d0J=QHTp`qhR~hbljc5+5XVP5}xyGZc!9rx0R% zqulenR2luPlAlbidhTB=5Su=XNZU>;j!%Utx2_f-`0oGEE97*^oYBPy;TlbTUYrMI z0G49;2XN)NwRv^{t(z9eLE*x{gW=Ayf1_L;GaqEy>v~7uOR$Uhi%_t8fnLnrDDTXg3pXA z@{|AC`*$~`Yr!>lCckUb>l2U9hjoR6{M(hb3ynuFW$AoQ++TUhHu~&cNleJ@WDiM_ zXkF?7&0lDkY6+BBy_MH%uUjWmHe1$4<>)z41T3(&;0|OIojwrum1XR?=FQ%g54<1L zs>sbHLKetNC{{l4W{CZ>g|vL9SH&n@&8d(P+VSSrh-XI92KaUy7*&ne@skZVnerF; zCBvJ)6hHgVy9c*`mpy-995{$D(u4}o?ROf$0<7`Anak?8qjpdHv7cFo^cpfzPRL== z3hsnI4JGN6#IdfXYjeKF=Hm8=t6l0u7qgZ$-YA^vXD`_g4ir*hNyRJXU*ULPY>Y`~Jtzxdt*x@9!mxbeZQ-DPB$+a|D9Ocp9-^us%^R#^X}PYwCEmGP7&yMf$ve4Yi%-srcgV6 zyq#7>tmbJ5)O8KgN=vJ$#pG%Y_04=5Ya^3zOVf*+=Yp^f!FV4K8g$0jnr4(TZYylt zlTNU*{BXN`cao384Xf9PJ_eJuF>+#~?+eg z+Hh<8C6!hSW{yu6$GP6sw^?4A5ICA)RRo@W^GP^b>C$+m!l2{f>ZnsPmpR!qhU^7 zoNB9ct8?q=uewSa)#vJi^kzCt=brpB%w0E)RFzN(2i_kIi^`*jm$^^p)=6U$P3{u{ zb5cj+K{&QL41Fg04m2nm>++?kQ;|3uLrB%$88_u{c-A|)=;*9D>NEaZh;m0G7f&PU zbPK;pp%k#KkaeqT;Umh>CA8~rXWJ>;#U1s|^S+mD!+i@k0;cxUk)v3rZ}{QLH)WbV zpl7rqN)n5!Nt3$h06$Z`jt@X}gx1It4my6t1U=8*sdN=UdtRca!=^YWZJByGodZ5! zA5SvA-&4KwJZM+5CjyF`LT5Nzv5Rgkwoar5Mfx(KmCrh9TeMf_K6YE;q<^u$8wrATlwLuKdk`n(lbKE(=E z5y3`bj<=FcLRXrzN5s2wCqHb%HTI_}IlareeQS2Pg!I?K=@m-tW@YA7$r9I8t8qzQ zhS4aAQ564lVqF%39dip=KMOYOHoyaR=jKaU8_#whBPZtVKwpJ$wn-)vgO>bcMn1fF z`$!g#d~V#1n}htb(!`cs`8I_vzfE!2Ny9t4t~CB#o?pi0x#PRabT>ER3BHZDhL8KmdiF@sMkdjd?HShXW}jY)CjT z97gtgrhT|D!G>|Mq*&`0Y-Io*S?MH+_d_z~rkdz+Jf-_=~ug4X}G97YTwM)C} zKdht)7aa?A@oSmXtcatR1JNqs8&6NZ>7p;TG-yDS(q^$UF86Eo zt2N1F?((i5M*Q{ayOi?A}a(9vuahwn|!cgsAy-Em1n}Svpr~q%>M#l-96TsaB~- zR-Kw!#2>au)i5Az5GM$0x8MOo^>hsnn@2A4w_Z!_`lfpuYEhB7lME`k38+sADa%<+ zNTd880Gak505a7V;q)#?Q=mlG_GUh+ryIBaH zlM=;tl(>THFV{fzy4EpUR#rz&_=z|N2C@DOWE)6DmD=!~il(`) zxON>Zu=fu@M1!ZbforX&DW7gphm)#SR$1jxDs8tVNQSdYcFVWMC3_RV040NznT106AY(JU4taQBjDJWx~^#BZ%C#xmd@=+*;6R5~HFaP0Dqc;$6bZ{#|Q=QZ-^a z=$)S%^IgGhv@RNjn~TQme8^{wW1?iq(RZ;`Q^}Q zS|~;QDrBzAKL%EM6I%1C&I4*`sMwWm`w6MaSOI*q#3{NChjpo)8b}o`dZQ9@`hWzj zgut`!%4VW=R-0=3!8gXL*sawrMgwvM6KVoh-;1@Tx?gzT7;lvP&E7X@Ng#)M+t2*| z4^3Yk7RC3*OE(Bhr*t<+gTzuxxO5}k-7O8f^wK4@bVxT!NQbm^3Ai93jiPw>`@8q< z{4w*)GtbV1*!-1mD;5s6TZsp}zeVzu%J38Opg8%;gV_xn^3N#TuG zS+(-2#G}%z-i;3y-;XDvxc*M0PIeC$ElxDq4WRI^ z!*-!_p8MfnvYscB8Ny_GK~gmD#j8uN>Hn=bKR%_AjZoE}~ z^wsRwt~+{|tkmSLBXZ$6{LOC%60?+7O)+y;XHt{otIKRF@~{zx?QmW#j}ah+@LQjh zciTe;%rSZcwF<_IUOC`FmE%`dM+i*f{eMhLI2ydX*;_0Q`xz+3}YAc z-UCVF%Ymi50F|I%L>|)F+klT>91nYZLulTrq(@-roc9P)U z@0$20myOVA^1QnoSwN+An8|hf4=tY8EsLdq9-3|X?@97zRt*M|Xh))R_ldUnG%)C# zRw3rL_D|ILcb{2)p}8K1T&nNt)iSvZw*}$3ZwA;)?8iUNlb-bVCkKz*c(DRYf7R62 z>FGp$jKCGNoqm%{mw_wVCv*MW{mt%MM^=tnm5;5C0Ec1h}T%AK@iwvwk ztMf|6pO*=1V2x56Jqx7!qr#J7^|@;t27oH#KTMc~Usx5=Yb>iUFjl znyN58HfE`4g;a0j`L~XJ_h~`($$I&;Zq|Z2Hc84ft2dN@^e!i&FZLMBt(vM7Q|nF< z1Z{qoVqHz9qWD0e`_ozHhz$pA%SM5%Eb?|InAnO5--}J0mFdy^r>t}@x!(TZ-*g|y zZ|p&7xN-g`^wmDPh!pppk5sBu;kBqWMA@_O70?q%vZ~p(ew^tkEI4r+_8z* z&iiHmfF$ljikm1SBajk~(d zBsF7Q>Km-Xv*m|pH$@NMqNNQO_Du(hFltop_n9U(JqCuKc37JAlHi$NCU3r^m|lV+ zQBNGo!>KwLIoaf#y=)W)!3cgD{AlJ6S{PZ0^-G}g)#xVwPGk<8HM#pjQ_I=(%*>p~?hOLMF$K0zzbNt;vd)N9>dU z+wNMnSCA3Dd>P9u-I0gz~YR0;&uTPPCmy&v9k}X_C8s(sy zzjb=Q@-vWZSe!nO1GvhBX()Y!m3Zs26EB{FS zL%AvcrJHocW#GRU!N&~ccil-yZxp`)Uz1n;MHu)SDVlm7mmbz5d1ngMMvT7<3(fK7 z!|K%^H55PjwU@-Ue~QftC*kZVU8=uYDkhEDeI@%__r|es{V+@8fh%+DTCc8mHF6vT zq2dfjeM08$nqaFc!Q4PeIV@rghop%U@_s7oAYN2I z_qYGoVJA>hnSA}}-e!wH?JUSG-XwjlE%SFeqIyYYF}|6lUEX<0(_TY7^waaw!o_7q zky`O;T;GLQ%{^JR?e#gmzn6zz#?Q}!VJvvEG_o@utR5EmMK_!oB$lwFw@FlmP3I%fP$`qh;xG{J)!8CbkxNESG_aT?vP%z&oU{mI3c-1f5|7 zooKR}4d1vV`Wh6_H=Vsx)O72=lhe0o z6oPk2s4KI$NcG{(0htinFiE2SeW}-rvR=YJ>p;yVPxMbbFdC=Z4C2UB_P6d=6J(vJ z=av5R_8lVD_lM#Q(q|D@ExN27Nf7FOe1Y)u}*sqddD|Zcqcz=nbB!g=V$qbBK zao7EVoZRVo7HUimMoC2cvUG1*+|lp(5O05y_@lCUVCvO(3Pjvv^7PRaE)%<63>g1B z;k`u8y>$dx%_LX0Threht8@2}gduWepXeU~J|T=^n`$Zd|0}s)8qp;uJo!OUM-1g^ z7BbWa?-MwS4ent%x}m%k_q+bCCLijQ^%1GvSuk^u`rA5ncV~L{cL^96Mj0q2Z{5J6 zgtuZ*UkY(*q0Z^9M?TWp@5_Zq>A9x~nw0LKFqt_k@sYqi6Kh@5L zr>jTl#{Ompj|iV&buYi{?FY|SGWd%vM^7Q<2W^Lw#S8+>-5P~#ax{+Ls~{@nQ(_;D zm%zQ^tQr}?yy_uBb{t!}er(ptw03^bx)0d11U*4!Rz;;wW+(f~qs--t!9Bp!RvH?U zcL%NX+;b67XzjvFe=atGUgR6&XjK2iDr+2U+-tmT{Jq1yBegBH>R(f@yJ|F^{U7G1 zqgd=uiurc<)i0d~(ItSTfrY1fkb!7Dk^rcj?vT{|Cm~~5Wm|aD0LS51*F#gE5IbXX zc@Rro2gaeqnB`8%eJZrOhplEKFV?fjnxo>i4-W)A*Rfi7iq{E#HBKI|&VF{*MlGIC zDJB}I!;vFrILm(e6c78L>ygYE2sC=?beUv7{q-`mf2v=I6^moO3oZK|);I0H6W_NI zSkZKS6qw)|e!3gbRg7%?!5g~)|MdjA|ISx5-FEE2U}{D|E*Yz)D51gQ7=lXgHmvmy>-&`HlV4 zzM5`Vbk~odA6~0Hzr)q~Yt=~`nV9@^Nq#6QhLe3Z!e8Jd#1)oCuvKN>VNAtl2~7o# zbs)-N)3!B3t6Ox5A1Av@`TLj9Yd<4t8sba|T0r{r5gh1|2or>QGen8xs!wymMkSy) zlRg^gyUH_L$(vr8^>LbMrP6!!MsHFZcL=AJ!JCVfp0#A*a>!Iwf2_YRh_kFJ&&p(0n#@vGe~%@yLgyRY zTVIt4bz-}EU3CL&ys#)@N_zJ5GW3q0bJ|sL%*s|crGjGK#`I(6{=-iNfo^oRQGLZ^9?f>(1x?D*okGe z=B``%I~y1+g$6A}2esBNFo?p_KO!Fam{9%huh{GX9dRCP9;*kdt&JLo9I!R?_-Lcl zp=xpWae71(k4KlnYIGqpa1;|0^MzE3hgVNGB1r?Tz-+y~i) zZ6;N=-Ir4CrS6hmxh%co94-P*EOMsix%Swk<_`SAdkmXvQT_xK84hOC#wtDSzny|N zjY;fi2s>|odbjv@ptYE?f86Ly=M%E_RZc%$H3(b&9ocO?Z~rbmujI`(cTLuZ7p?so zpt?^+%KC7>6NbM!3vkxApf_Tot)E6My^x_=n_hxLfWst(6{cOw%M)f))zPSY3e2M9 zT#oYQ-gk-d^8_Z9*d1?PyCs<7A%6*&zmOzcc3Tc+Av~{@;V&56b58Vv@G!2o7zhh$H5=e8zk%O;-i12OzAvO}t$mAj9-XqO;Ut|{cO4i);Kivzj z2Ewi@bp?6)SLa{m-qdn%iTkr!LLK+nDN zCVak8@uRcc+JZV8LdE_o0y45WlGUhgT5sTDI`s&i3IPNpzg-M)c zmVejCS<64Zydd|}&0c&fYe2#YNAok9byhcucYReb%UlQkcmSRtKZPbOoj^<{x#*>K zOm`X=kTKfY1jK>e^iO`Mtid)v+N$T z?Em1gaAb|ZI@nx5%h|O&x`w*QLz-n|a57$PZ$x5fJ1Sip{hK=eBUYH0PW{3?xvn*x z9=OMMN7qAFr<7d$3 zj);E!XX9e&T)-7#cRuj(C?3A(?Oe^khe|ZI`HrlJF_mYtC|^^_)$A+((#L1Bq-=xl zdrGEC%J8>%;lVu^GKrd6k`Z4G6i(kfL+b{@ZoE-Bw^)9RkWa^ll?r1XE)9QQB28c| z4<{|7rhLmM7hj?<_1~NRH+Fi^<9}-UuU74Ym{#G9@2cMlg|Ly};ANQi+0#fOl3aVo z`c$`EmvMiOKbPNEH%O%NM{{EEfN;ZQp z`B@FCuCKmC^K&KKT?>@^T{)6@RzK?}_Wr891^$*ONWo{Yrkz*_mZq+*x%F=@!MHMNbxig+y=sZBrt3JkEapLqU@MW$cxbBpbUfS_-?iw51&% zRAZkD(E{C!o^Oqun|$^QRPBRrZmmH5dePzTxT*!BAnWYkj>vQ|(hC_C4ILdD7ipo4 zhK)qOBH^zjXiP%H3OfIxU%jJ#q6-Rx|A&EPk=M2Iifr9iB(;eyzrxV7^?{WR|G%{H z{{XO?0N$FP@s8mm9i*twdpi~9i|kj@lx;B{8M^@&n;~*9J+#Pz3SJm6=o?>YaMs=* z8D7Ei!JA>@d2QLmpPjfvF*Z&47iuQukV;&Cf>*< z=2g66x2y9IMD8t{|O_sjWSS55w;-i>t@>cTE&Iq-pptlb%R)td_UVB%FVEe>&% zupPAuOZ0*4pXTPd;j|4cf|M5GeYk0j%T6LmVxb8(f$7&HNv}QmSJVIxg0*50`{Bjm zeiqB}51w)tnZIM+*|ar@2BLEPTW%A5oJST;t^DOrioBHUHt{#wL#I<5D?!@@bmWy- za-Dxew$##`i&9eAd}pY2FCMz z%bjr?UdBPi3>VRw&9@FG)usgN*|=e-@k@P2VePhPBD{=8Epc*uGAR>gk|gPif-H&9 z#Nuyr^ILhB$NPZ;SZoR$?xA2mYNdNTkvXp!dM#2+th5lxyx$FqNvy=`>2f@ZGVdU_ zKUX6e?*;z6$+(jr#d#Lechh-;KQ4qL9lnTS#4ZySJa~`$SEVvrpTa-~Tp{>DpK~Vg z%&4OLOON@7A$p3yG^xI#nls}*7OD~)>_>%(4=4*z z1X1|ow*tUzHRfsQ*!qeuX>YudE1GGOY6S8JN7$3 zI_2JNZFN%z#bQDr0UCBW|kmS(0TK0@(<R;nTIIx_?Ubk(dCH%?sC+# zL<$|0dlhCkGAmN;P6~qI`c zGuZ=|^U4=S7UazEqS8`F1tsmg|=X2Qr^X)PVYMws<2ZhU@_;+nb zLS)~J!TsVY5+zXL(GOqm<8=mg=qJLBIoEWWYclNgb(J&x$ujILvU~(~p^$t^s~%PC zPcA9>%3_Yl-EM+T8)wzb!?{l1{y~q52c7FLD0?hZCXx7aPWq+F(u|me>G>lav7=%T zwERkWpYTmIr}vnE1M=nxf^_6alRRYiN7j*Y6u!zWy=B>0C>j50oZ{@*5k9PDuFL`4 z!=3!>LcyeXDZ3pZl}cBmHA?vs_gW6=UsCkB{59O+YaPpL#dcdpH$R#g-j!c38Wr%- znM7G*FhpAvh5=xt2&%UoBdGxnUrKu9BPUSne>(-{62TLC{c}~p8zH-4fen+lvP(Q~ zAx0GvsoKwYiT3hyf(paZ&~B6ZYkVW52u2;}qyd?qflh%Gop}m+2r2Uk@Ko?%s{!CERA=l?E29yj0O)aF9vlb9yuB(e~K4GFnRFg^aIVaBG>P<0)gBUY1-;^3rUUFB*>a6!)5_fdP2_;FdiG zST?N=%kV>tds=Hp`7KZ zR*J)EhQJ}UFqOWHpz{3I?mFB2*Figd;e#wIM;H+y6feV&VS<~hyefIY3YsXP9G8Kn ztS|50%4mj3{30a-ZH;q~J?*k;$oiqps`-vFEFA>-gEeHGr{F{F<-$tRd&}rnvxnt@ zI>d_)rD+B)-x1-x-V00n;1WAR+>;oYtHUVrFV7F z^GBM0nAEJuJ}Q=c!9=3O8(z$WkQ~Si#~W{3`Ba4tj6A(#OuGx_B~%$1T&pPlS&*_t zu(waY6X!85qQY=XWgBvCQ4iwv`1{vOa%|*!-m6FM<}~JocdqI+o-$ot95ar@<9Ocf znGQ~wc&e2KZTeIaxp0-vRN6j+Q@aFS#PbSv4|ePaXRMbKAr}^L0i4%bKMUx$$j^GT z!bzKdKO84;J7O|L>gw2y?6fnD{X_Y>4E;-YU{8Unlndz#kPb7v3Tn3-zrwp5Rm#Tx zERl03SS7viT+N1j(uBXmNub9!YTk9TRH5_M&~uAQXXPu4r=L2Kzun*ZeOPGAeK{5wA8|I92~0&W&=}px${J z$v5Xo4C&PDhhrO&vMKy>A$? z7L3Y}NAj4w7Jh=Q_Wv(y33>HvnfpxIZef)KpCMRLW_??76YW6Q9dvAQvNr* zJ%r*}Z1%N^&K*-vDQmlMIN&b^zTRmhY{4V0xirupv&jli>LOD=)@QJ>cv*X-;x#Xz%fwXKYUrqdmFE(l=Q0J?V%o^_ z@3p~BjYVkq3D^91mxEN;M`4Jhi19s5DCPZ);)mu`{M+h%DZYY~71arw4(al zMN=y`ualS*@uaCTQH?01o)GK`P349()M98X=kn!c)nfwZ--}u3@27lIq?M-N-4LrB zIFZJZGBJBeIhsR~39<8$6?$MmNxt5rL2$AL3-X7O?BmTtl zm7JIg76eDlTFE!9ZEK8hETV*EG@E}YD)EUsJ#tZsE}ZDK;^j=mcNoJdnl418#Bs8u zRW$N7E|SZ>HQx~gwX3FO+@ftdm3Oqd^SZc%915$4w~X96rbF;S=~9(%>UP zQoBxGydE?A7+Kt&INpR^O8BJ;4WZ)+Wb&A&kQyW}kM@tfbu1GKw-uSEjsYLI`ks*C zH|V_LNHD-e=elots+t7!`|%iu+rvBk3K9{A`o9@n>d(YfuqUInf5U%GL9zw&grGwJwqtj>Yn&e7*>J05}E3@1Bz|8rfN2BYQ#! zV`_3QWAjEf&ZY(~!oPXm)1i7K=cL z!DY8-gBxkD9yZv_WiFW^wT}XG>JgUAqGo$+B(9y4A6u>hXAU$?)AOVq)rr79vPDgc z6@x{YJu3Ssad@F4@(s@*c}`|VFipu5UP6x0AB$YemsbwT)Z{cWC_Vd?wzA-= zCB(n_G|ox_(;TIVD=ypfr(CsQL;4iZZcCl{CYqIo*(nBCT|JNxV7dy1e^3p2w7#}= z^wqoAke%2kCJ;BarxR4Jh4Tp$Xz;~dFQ1wJL8|RUA4k>>>G3~alxDtTTtXrSevw4D zjBrO8gAbkbN=-vpjNixg^!iB_uYCAe;mIv}35pHSI0&z?30xUoR!z&NRZ@Wg zZ%e`G~q?$TSB?t8{9~c2D3rg@ z2QA^uFV}#Mqg9et4gHNzTs*|Mj?RVu%Qy>~Dg_xHkdP#r1>P|k$>8Cqa8!}6Cg;V_OCUNi7u zV3J4wYt;Md>c<*T-5L+s&9b~qO0^F+*Yr|MY5Og!>sqv%c&jG+q)G*w7J`2Ui`@HS zfLV^O(P3FOsxzAT;xb!^rVsQ@c*-U>=`@);8U>{nvZNFVv9C-E3(M+YngqT zZKI~Grt+-ZywJr`MOQ{qpJ0!}kdSwnZ7Wws#yq=6K{ICCJ}?Nn_{fbu&aSAL^-2=# ze92iwKRBP0&Pqqvd@OgJ6s#sUjh}3y-d8G;yt%W=L7;!a)~`y251cc7{7!W02Ut2a0hueVBOJM^}i9?nvD`vbmzSX z%WecaWH9Rs(elx=ADf5x-(BSNOz_cm+B-|#kFV_oXeBwbyPHwP1HxMh&n%=$$+L9ZcIKj=t6%-)eFCmim2GPV6b4 zl-wp^cvQgQOa)o$1FL-Ay{;}7CD5)`S(^lC%{}M^(YhnvEEh7^ORVAmu)%sn-~qS6 z_7}vG&bZ;uK)2DbWYgJK*fo6rP~HxG=SM+EWOVKLd^bzsxR(kzB@@Z*q{Z`33@k?! zoxV^6yI6qAAaE_3awk+<@Mlb%{aTO|<7gwQDLF7@_Wchf{u{FiQvvIPYG;=1WY74+ zEvd9P`qNo(bi6{p*>;We=dv>M3 zAu4m-7>$wF#v!@aksr2$`W};u%SJ^$-oU&mM)ifF34-`8W+e4zbtfJNV|4nyC7kg) zsIYF8Arn`Yi4>+v22nONsL-<`vs70mS7T08X+w*96OalXwvq^bmd29lDr~x41Cyf$ zr;Q5faC~%NZaJ=yk&!(ya}$V_UW!oe)+4zA%d+6G;xD=6&?6xI^0=0duOO42=;X}mL*B@uYjS@DZ; z@h2)WOo^=V2h2LD0n`TaB0WGHoeK87X;cM!FHFXswmhQAjEM`;Zxf(WiPo4n*0|%l zso8d7?y?QSMRluVRMxJeIPHER9oQx_o!SUKIoYqA6QFR+P_H^~TxQyX8&|#q6C!7w z_*y(JzT}Ap2i~4Y7d?G@Bp<>ef>?W=;pdUp)AK-?X%sLfWcb3Xt*t@r9>B}iAW2zt zA!>g95cF{~*S>!2F5$~f%uHvl@AY4sJSWTzN9+QdcfmWFRUL)!zm0@aBIrU@8Cz8k z<(Ii34H>RX)>#s4f99V9XaCv~D)3K?Tj>Prx0yc-Lv3|I#HdTRL%r=d2{>P~u#grc z88koSG2BhfzIQ54M25M9VHEA=pB3aaSPU4uKjmsVb(5LD4!jH%;d4ZEem%7`T$cBn z`C|{+Ay>(wnEqKFk0(+y%NqWByk`-icG(5Y3;)e+kK5!^r|jI|E}*=wlFM+(S_;*+ zY!PZHm@-aKrKLZ1Y8Gk=LDP`OLC6y&WEB8M7K=TB+r(0Go3 zNAa?-w}lbooY_gN(0nCSld@$GNx(Aa8d=GD6MDbPD(9m4jj_MJ_hO9wHs`4VudwXK zpV4WSc}m)DcQ~j9XHX}Tgo?<{auIG~@i9W+$wZpl@R#-3VD}+~2GrS>YpQ(W)X%;f zAM1zJw!Fsz&WWzHwPPM>pS;ZG<4cwsXDd^3$))zjvZ-B*qe z6gYntJNQ8!{Y&Gc@(-P+p2m6Nhee{I@eX@-uGm3nxYJnYRxmIpobyPP%P7lFZ0V#Tv(UASR~-3zuoUK9xZQLb78Qxy|tf)K?$t-AR>h#v6`L1n1a9gyek2x_MM>)aYi% zAFq-py4@;y9H|vr`>5Rr5xeDZ1vI-#E5cLmtxtfxR_(a_TbMriCp!bdvu29;YK8h) zlC2i)%@!3esK=vU+{#;`seC{~wwoO2)*TattY~;53xVnnb2O>R@vX<6ZKa>nJma1b931nb~(Z3A!g`Wf^lo&&={wSy-&fbtKnB_S4J z!{_|AmJ3ndju>r*j9YDF0}h$I19<4i>u;3dq2bZZan_*X=9t`&zpf{L!R~e6p!Cz6 z2_`)EwK5zhNmzP^Q-5PJhmHUIups&O(U1ub*Rj(b3_15<2kYmgO!4xGQMDpM zW{{+Z^4oyPNlwg#D5qC!_I)6J!J}za?%`?Yu5SZW{maw7a$m6t0Fz$q1^en%wq)J% zG9E{23F5 zu@?2Qcdp@%fgkTdU1%ELEY^c+ce^)>y)mXk^cwRu*;B>TMo~lKrn1Rd``6mJRXqd_ z7pu0>riwjjj|`qIX&ODRYrv&( zUrYPa!G)sQa(y=Z;j5qiZZIzqcW)0)Q@`mnYGHoIkWs6jpbbGaMXwx^dxkI9RImx2 zL}!QwRtH{pe9S6g4`CwP-(F}zg?NdP@&cA1DK`-`==QPni;WwXo9+`#7=i1=a%#~9 z7nDD{FJ1*)&`cHv7FzciJou$vD2Mg%Sf$-NfV@odDSc`O5Jfyh!Sv700pD6~%jYy^ zYW zMV%E(i5A`Vh0U@s#jlB6eIlbEss+WTXfk_!oipppOy(eUTUdLQ17-^)cW~&{7bX^! z;<^U-*rc-vBd+tP1bWHhtX83#IbGc9DNkRBj{uWcC1Q%2V8)_m&Npx9L(ytwbcxE!%xkcfLo8-Xn`_! zL=U3PKiEq?eFaebg&;Zq*QL7-I*^|+T2MP?o=$50v+j+&%ES2eB?%w;Yl|6O8&o}Q zezu4|^Mh8nhMnQFTBpx`=2_k~AvmYkv9&qc4);RWqS^%fMM3N%kAvi@qLWaVmp!Lu zzP+Pw&EkTBYvhdkvy=WiQ_u#6JX-4jO=|OZHyQy=+MuUw4VYqwwU|3BNVdO1^DCQG zLc~3UGS&>3QX_GYr%d$Qf{A08(hn6rWRQ0yv58mBV|s@B4ey@ju(KjMA18zUDDLS& zod&l%V;Z)r#=0`A&j8sF^D$0h5OyQ|kudA%PYRC85Y{BNWO~&~_Xm%E61VMt4&_ zJJ0=*kole9+J*EuXIbPT-D9rcGLX#K=lUv%Ou4wSl(T~igFt-|FjU~a@!LOwqOqIO zGG8xOp>iqLA+#kG2j5`n^V8PJcHv-?>3^|$+zci-g1^6EjN7NWIK)c1sndN?m4u-~ z4(`TUd7P4QTxiW0S1~I4sOoI?K`9 zQxEvkqM)VF1f%sd2GmT=q`_MMyi-0hnAP^*>sA!^7-?V1!|*LrZgCW?5O!BL>#=tZ zaU#FpTPp-!weO_9Hce0doM)$JuIZEEorihqcyZJz+?u5) z(P4fN;8DeAu#YB8`OF=rr)XN7RPA5JxeQdJ$%yqD<+iO!N{8d79vjZ^lxjoY`hI%c9aZf)*;RI*J& z5p`{p5~-^S4aNDfFYW7Jdvh2uaVEzJ11XT$8U7=#I$78HPf>8Wq2ZrQ(l$j%EC$~w zXa7;nYxy~~cISeX#kDm>5?1NXhI)4qz)+wftE6m2)j2V^Re!3cFA*fJD4B+O_)W(99rAjc%1*jjzvD zW+Bj1&(l3Q8C4c-U?DyDB4Bgb-&-meLKTs(p|-fvG)+F`%uTtO_kHFvC;C23ZKvrK zSmDKc{h3MLao+Fl?xnbVjJ5NqO;jH^<_4Og+fsncF_2=__oXwIIaq(iP9X{ydYN?$ z_8Licio3x<*Pz!uf?>?z%W+E9M_k7VcCOd$$WL0VjTU#X@r^%WHEMPHe(y~b)_Mz@op|HMtf=92b5>9po4TjPR^^9`5oB`b=5;?gm;`$Z`;o>#W$PxR5fwfJp|>qNF`d&cgfW!x^P z6vZ@fS=$?-mYGEk4puuO``qMi;z#DxU6)#0^szr@o%>?!m1Yd`yTPU^7C*V(@8-s1 zUNGlL0YaSnj zI%CL2Ek4nI$6wX##sNS#QQeXDgk50Tr_S9J6~e}5T!K%Ohke@OU*yNbxhW65YjZ1O zPWTR{sOQrm&VOs+M^-WF3S}5+zrJ9F{D-;{-^@58;{bU(ep7lvS=rsad@lEK|4=ta zXBLF3eQNfK9&0>NoSWj_+<>A`&_jicgQA~^?-c&bg2eWzU7nq|FWF4F(qGkN(@8|4 zW>4X5O;@O%ee}yk4a<(3U6%7?KbGHPaCwvWp+=$yqQ)KCB}EP9ql6WNMHKMlo~w9| z##ea;oboW8=RT4x`P{a2d@Pw)P}?h|5=GIDIYniQLfP>XMSRfq!tUiLMi=dxAo2hJ zsiD+myGBEYm-T-pE1bO4?xTU2+OJQ@NON(XWyb^D zsYocL@UfeBpRH!R<75z>S(oF&IGqxfw@1(!`6H^VpaHRpi<=J z-#j9>gA|5p7gK2C3kheP7JYm3=v(B4MZbOq%~<9#c6Y}=Q0rFl<`RvJxVXL*4j^Gs z8-@~QH9278lF84^j2>Ti3)Z25`?yPK8}#1E3mcfINLv$&Pc?=$_puELYWuxB^{z_2 z_=@dcb#`j7h$XtCq1+w6JWj;Tk4X1zMCDdm{_1Z$@MAj;S5B4H4NCStoV0U0lD~DZ%G{R{n-tE{t*>fs_lMUcawI>Kl$y%hnONjK z)RwZ<7SdKY%|$b_3iTgwxTrDFd>^3ot^6pw@R3W}`wg#%LQ+bhrelRa2Fa~L3EckH z%YSPg%m|%aJ>Ap^>{8=+baB*~N2gj8UO&Ms4LO{Kv*nfvrv9GB7~!RM6@MI!FyOZu z0AS#$Y2q7RlzPf#(fMkWi=3|)qLaxneST$+)b0eAm!dhKA3->GXIX+BFvp?& zxQFOC5alf9)eJk8Z}RSqV`#DIaS$;R-29kUU%|C{h%(FfZv-(;07g3?(C_u~Hw#jL z^mYFOd*cX;(L}T6>RlKuH2;S7J1q{bn*B(H zEp9@;8p?#a@~lDzIC^T`K3jia)|_z&gYkO{TY%R~oMK;$)-LDwJKHDbrt7Of;=9}z z*ErLw8O6!xYr2_03;=L*L`9dF4r3;$mcK1JjHKgDk2l7^Qimir56YL;Tp2(7ZoZb6 zA-QBquCW$trKg%|&ojj*tR_>=zI5(yfc)Qz-h{>mnb&6e+5p(5)nV@$i$pS`mpaWb zxze##Ml%1QtR~l|1;>YKRj_4Kau_-c4=(~Pj;2`B*2kzk)9v_zOX-;a+vzO+Gvo<3 z2+E`BZD*r379B@z%^X@U{>fklJrTk}32Dq7+=yrCv&v0FerunHHb4?tHa3<_rpBRr zfF9y0m#R|4Kc<(_zLaHK*T(0|V!hx1 z;|kRXpE(O!#y)Za{73>CcjDXp*;r1?Dyv`>xG17&vLiF8^~~v=_{u zoQw&e67@Ztg@#%M!-~{#;QStGWhFn!I;2REfQ}!KFW}NH5FhoJpO4C!Z!-!;)8PY; zft3Evl878E7<}X1K>w>P zIF49G+Q^EmM8qX~H8u@>a&|I4mGh|#mCwq|-Oes%6=$uKl~S{x@W7RLn(-?>^+84> zeBKyiBd@L7;K|?s5yeaSNO+bhTm=@?5m_8j|aYJb*}75CpbfD zS;%hF=X?%kd~ceeo0kVwD@u_Yd75ALHX&$t+!v>2FP&o=$^wM`QBqg$*@F|xRKN-9 zovJ?>3$Wczw#+l)*`vM+y-&*Kq_ubCT+b#|LDAh;DY-_0o7iy1`XUw1ke205z`k1g z+_ECxn$EO`j43f=tpfB1vssF^WMEF4O8%TRhsw01LnP1V_hF$Y`H^TS%+HpBK}~r& zrSG0nY5oZEv;xyS)I( z?K1$<|G|@mk})1M)5`X7biDtB!j=we&X<{ZI1f<4giY&DfWl@9dBf?!e{N3kZ2={d zn~J%7l3D_;oSsh)W5z{kw}&e_249FU^>brX3UA2}chiou&QGdzTn?VeH%8`Y?>#Rtnzf_^q)xK zyVf$maFMW@p(vTWO(-TqKX8#Ap?gG{5<4Hd($2kq#HrDvuM_JmBbNcT8W4bFCtQS* zF&Wp&Ky>VIS=aiMe{8$FpV^(g(eurhFBF&LvfHjRt1l4V02*Ov8XF%t!^d6hv#EIn z7xU1UvvrSL&@5RF(0*cDLGwQUxoUkp$fXA~-JzmS5&_zW_>H-(|75lb%NAuxIcLo* zIyy>gtIq(Ab|5JNJs9L?)p1`1G+rwObZ$)VImon}y!=eo<)d!b%FMY~9oA|wCxOnS zT%4M6l(-X2cNJrB?TK&5*QmGdMZg6ao06cFoWOsWw)Pl(5n~YYe*oY>AHM^JH3S$% zXpoEs{{Xtn=FBe&HF2!CASz37RY>~3a>)@`pm?jh4?N6q8rF*PbAZTW3_LpQwAkBJ zsIy4KkwP8s#f|k(w5dfiEW__rAhs?LoJT|iS@~}8zy|4gNsjCCYGG~WgCm>L(Ps)Y zivAV50Ku{#mmU$eDrnqxEu*}erLTds94hJZ((_;;M8Hm5r(4I^)%bKaF)VCzwt{ey z8onBgkRd7gG`vl^_sAySIqcfNwY}%|R4(?=8tCe6<_H8E{Lb{yOxlcLNC>b*c@yQ7 z7y-5gChz7kw=1?~C*8u5mIbn~>b}|M8v6oi8KfCg!hMuAutv@6U(g!uk}-(of*lj% zPlt`SNG3$8^Aa)T;VsA?H+$|wCgt5JVvI2G)x$=+MiXtQ& z0&iJm3IN#+o0pI!sl{OayH*#1L{g-8LttiX5O4)L8ZQm-+4AE>-hn@)_|VfvJUR`1@pMXW=Q6m@JZddx5XRo!W=xk=-cL3A%lm# z1yq3DozIFyH1?~AMuUzKih9Zh7#b`jh3Oh8Riqli%BLMGgE=7 zV;M=<7*d2 zmm>sGQKjDbLApdR#b+Udv&P(p!W3W}$Ej{&gE%j6aNiyTcr(l)@4Cm^C9N+z5}eTl zCx;QigyrQmYkjSfz-Lk+?nTY*Ba3vs7O$EXt)W18PvXPaP?>p*tV|*5h7AOu{*4$ybJuMD)W_aA_1&^BtDbWhS}L4bg35 zT0t$!Oue#?7z$w#fQU)eR^)5wf4N9DteMJT^FcgFs85~x ziIYOgO&)AaG>pz9$uweod}w1a0t#RzdUWd%!U{jmaF*;(gebLmv~8LcLIoe_JbS~l zCmEhqQ6OUxksUh(B9FZmV_ZZP8@OD}QLGr5#Uk-}V(ulM%s`nh!7}nRHF8J%!+kC>UfJsVJap zb^sQjZ(h_n*X3*QTJyxJhM&)HPWVcwK`K^jTvRZfM&r9!VOF=u_yoP2j zy_cdATw|n&SrQRCv=~s}UqW0XEqMdb-UvYed9)7Cv{CIg&PR@R=GU_7<)_T-qph!n zEto3GBA>eKCj-grlzvI95JYK|Hx%_adiHt;+_}$B%$S-5zQgQMKg3@E!o*&gdWDA$u`0<+`az*;4pRFvhfe&xi3ha1&1W1 zku0ssvsnpf$eqJ-Fx1~mM~;)j;L{A|j$@vK0JMM*XwlT|(uGp0sG8&!+ajr zV`*0H2sJ^L`pk}@FF{eHcj%UV2XRaE(ZuTD-lCsv8-71)_N42aPKm?}YTn~QXRW4X z5H}?OCq$f6!X$}?Z1)6HYas&O02lxOAUcui5oB@O=8{|?HtX6_A8JQKZi^%fk)b2- zPS{R4UEpfn)_sV_{ovWt#Q(#0{CgB?#DZB#8w|fK zNKMK~5g`+CEkU?bY^DLl+EKZ|arsK`wWcUofJ%7|EIvY`EUCaCfDM2EqWORZ5!oPo z3oSrZlSyaH?XC(V7UvOPiRnH;o*sXq@B{6G+B$1##1S z$GsnRk+JfZ+(z!~(qHhP%b)-^Y5?fNE|9t)ZbVuar3)x?+}6GQI4q`kVE}F(Np#)k zOpi6Xps{as*89P!<8yz*5}Z#A1>JDz!>6(2WvCVLhuby1{>Jb1SDS|C;g7X;u@E0j z`sX|qJxnNkr|ietrMy{w5mISK`@B*Su#{^nggmc4ng9VJR%LbBcGo0l$;O+Pf~s&P&~)CT8qO<{{doXH-IB8Fz1LT9dL& zSqAm<#Yb(1WPXQzs9^!V6Nxh>+f=2N(6hjsUL3a~$4RkaSwYxXm+oX0Vy^K>x)^fZ zN#W3OC;%Y@Lzk_uO{cp{+V2V7V)D;8pMYnP%AqXZ*MJ1+%ge|gp> zJ{Rt<519V|MO;JXSNf+J-Xr^^=h}jg_|Nr5eZxhe^8V^P+wc9<7Jlpdq!9d#Za>-H zrNR0B)Rc?c`>1xpo^*^4cz;!Q`0ZW<_kVQ$#L5|y;eS-@9s<7xrTD8Cl3JTkj%tPH zeI)A}YonD5bPkX*O5D;F8IMecfJ$%yDt4nVfS=-BvF3~z0H6*7&_ZJpEOP7}+7PQL z{sh>AyF-zXz@*~|Ey~cvEp%iq@>CNif9!OGL_`Ek(g$<$@x^>qFm`u5{M1JeKHp~X zCQP+P)Ua>KgUrE(kgjk!GE`okPL|5u#^5g09Zj(g<#_P-h}nIeO1 z$tB9XK}NVz8?X!BD=&>lIBh51Bit8YDk5cf@jRClVIF`r#9#&p)IEgSUM%fV#n=nH zn^7Wksz)`uLf-wK;3dXEDsFW0b<$I|?QIvk;&W)sB`Ok&uZ1lhV`}~%Bl?;p`2sJy zKZ?YK%lKlu90(4F51*!T`Z!1?Xyse{t^21+P6~eK^+TgwxA#b>PyN08-d3%>2YD#_ND*CA+uEpzNm3nuJQREo$awBGK=GB8{TLN2BDSB~u zN|w$VS4c!M408=#K;w|g3>dvXU&V<;M+lV-zBBnk_P>T{e`&+Yfr?mYj0Cwvq2~LW z1@d^Qf7xFv3x4*gO^nP%D#-=k_%ECBSv0Czx(rxf0`z6*hF*&Xu<1z}@FlOiqx(f( zyELmpen0%CzUSBKDsY@~SLLH%&rr)>!C5|wVSj?9f_Vx>9^phF{8NK?Xk!#OO+;%J z`KbyZbd6@wO#%g9DswstE*HT@5`JiG4HU1qsU-ya))7I%b{}BrM|y&ws3}p%LCDI9 z+zoNuOS!sTbP9GG5t;%*6tGKNL@y=8uiBp~AkTFi_WY>j?xu3Z*-jDmkVKSaZf2BnALy=lm#W!6Hb|ys0!D z)}kK=$k*J#*{$HbZ;r=mb|^+-JG0<|WkQRa-+plc<#?C4L8P@ z-O-oWRg25=<%#dz0cE~{8l0#>hUAQ=VVL_WVLywm$sN?!!8>+e9ye+TzgZ+f3C03d_wgb$~d?mLIRXibAwNTh%0W|2Sj;ZPQ? zq&YveUAsw|z5f8H+P1jf6Z7?;8WAnu)ngoXxitm6MW*Vxn#<+-qjFr^D35xWz<`${ zH5zikN~}%&sP#*5lXH56$JpJI;-puNRh3m~ayV8}&9`pDH4GSFAdU9TnuI3bFgGq) zT2bT5NyuRnXqlu|=1hp$Fvz`HRqMe3o$M5vTt#8nh)Rvxnw!?Hkp%a(2%0;sfF1~` z39D*J17mXp`J#?A>LXq}M&KTV-K0~onf&iPjB0!zlyGZlVVL-rSM&rej@;l5h z{{U=Ti&7;<5Ro!0kGks=(%hY9tZi+u-uCEj^lQ*$)ugGk^V?W={{VQJyY}cmGfv3! zH}bV6;ix)CUhb=ogFcCaTbD;bgmf+WL0sL+r(k$ZA!o%8_gos^51Px;VXgf+QM4{i zKsObHy@eZkXgBw0EwzLWp(&t7dnAMSdL$JsGZ|z>5unVwXFaidJtbV}H+UFJjuPV5 zYR#mMnZ$@yB;Gn9q!_M}U;&kF9q6c2apnOJi`%8$_+^$ulttRK5oBF&?MRb}ICgGb zs+9?+Q@b>;mm#2bp;aUWkuD}`I0D@KV^Ucq(7!D#EdhQ|0o|zD(#U*E!uW&CfSf$y)0H`BTSmisqu9K! z6I)if=d=ge9qFqh87BN+bH!WohS~GHe3Z6w@((QB`71hJ8%G;Q$wfvt3G+|?02GaD zVS8SYYKh9}JMaFm{LwxLn=W$(qU<-yWbNrRPbPSStZnh305w{Nww7s=G7K_E0c^uzD;y_$kBF`gDeRxmHJw9vTzW zFnVOO9%74E_~_YwZAr|J7JSg=IiQe}JEQfwS;rdLtFd z{Rp!|U_}1_2XGUcfm%YkF{!9b%mQmR!ZIdCi3%1rALjS(P@wFat`lm>(8jg9Cy{Ei zLOSajcV3TmdsLc|)ywVv&Yj<~b0Q|a@3<8Ulf{1-Q^CNF-*;~YsrP?aB;W|$LF0T1IDDuZyV1RB`ggqG$zrwuOWNfQj))0cPJ|NYSME1 z=a1Hze0rl1{{Tr~vI0h>o9@0J)d0u4r@rU@mPOvmy8*)O1vfmuY*mF1Sg6(cW9BG% z{{U3WQr@XTi08i41rExO<|#`7GCxU&qaLwJ^SgJ=NqeH-d8iBRm*Q*Z$NMV|yUwAq z?^=Pa+Je}-S7X{gY}MVq2lqqAYhCl7PcKIg`<|mFh!An9_|cz6PMB!tMqNR0QOm2_ zQMw8@H8+(QMFb1cHy`1vnU6Q3R1{gIaZEi@%&svAz~L~`0AZ8A=k~XHAs~q&Z`2T| zxNJ$LM&Tz>?fprMUEBdp@=bGH+bw}R#T746UFC#arz1x}-G8u5OBU@nR1J;bm9xJB zn;661+Ca0g%$*Ca6Orgg|Y!csxx?RC0#FR5i->qeg#0&YHI+ft{Sy!P%< zVKE?tbaW`_MF7u$Z)iwA!Ff**OIf;(~_kfXn`B zRrK+x$ov{}7sTl=%_5ca&Av?xz5f7NY6!Pvzb~zpn04gSmriv3b<5jPJo^-!J~Yty#}!BF2M=XpNQo+xunjsZSuDQ6>{{gmX?>!m@SU=R%9mNW#n$ zn}S+K&q|MOcqI~aNqbg;5-V8p?NN<%yFI`9UiK;K3M&U4&hNBP?)C*pVksP%{{RgC z0E4*)f9yA>nEPwzzaRO|%*ar&{rmG!0e$bkuEa(r72qjD?I^D{{SDAFYSmV`Ufwelk2&9v*-ei&7(9QzZ?8j&)gbN zgelHnG+#Axd=)%@D&wu$q2c~L=-Cy)U-{qay9FKPc2AoB08wA+ly+aSR==WwPwQXp z75+(IS2msfH5>ID=;wbFIg?%XfwKFxAin~QX040%HT@2UC#GTQ zWy06tg{fQ#;jTGI;8V8usV;u>{-CEYJkX_Ys2h+dglMc9`=k75o2FH9;W9l>9sR!M z-->Z&J8$khP%0GrxkL*yiDH4Q-=Ba;?K;7<%13>CYVyL2Bey33mX96}2hZtH$+NoG zZP&e}N1Ba$t$&EuZCRRRCn-~m1GTi~vvpydY^V135B z@-5NKG508_Y%a#z?VFn=Md%U%%JHp`~n( zidR1Ir)sBRU;eXP@?Sq=sO;uLgu~cSDy@`_zH0^-Wvgu6f#01Ic@Kop-8!S0W!0SZ+<{EWVyS8 zPf90}_SP)GPI?D4h@Y`siBUua$+iztDP{i*RQ!`;6 zR$lwiHk$LPJNc5B7$EDAsC1$ zV2A}^u{2Y~%tVGLXVMn12^fp{?@i#~fTSUfuS>S%>r#%~P#}^`CaEw&S|W-Ogzq9= zF1Cui*Bp#+zVwcudP+)QgtSF5@S8H5v3o@|!)53s_ky_u?**3(n?Zb2_hHcG*_6X- z5ayZhADSpQ^u%0OVP&1E$$3bCkZ#MolO<0GG$JBUNj)z(h2KN= zdb8L7@L#x7b>C4g$d)PWYS$5>ErfpVA?16p8L0RShR162?!LMVZ#RHjk{G^P+0^l6mJcogwU zK80wsr-HOs1rnWVCjvy)w5XLUg(XC;3gE3BEYi5#eJU>gf+y4Nf2FYgFj2;C@tg3P z1)7Cu7HSs)&LbQFR_S(;2o`V!Xc`i0(HFQeRm8Ebe0%@HEoK>oEXM)f5w9o0sU#=VhdWD(=@CE7>!Asjf3v~<7D}Xo+ zYpxmvYqp_U1wfQQtwMGsbwCVCs23>V4QoJ^D&;hzP*{njb5#3 zU<`d4N+lXmD3nU@LoO!-bVPVlRMw?x#c5j9s_v%4(<|*CR8KFBnOZtlsiUQ7mW{ZR zS0BMS{{T&n30=QnOPJp`K_z`B7a9O1iy2>T8;!b9j6X;f{s}-#*j{gAi*r|1j1@$Y} zWFVr86LC9K3WJRu(8v9K!G{d?!eXubnbQ^$se`h^n>4fP8&3g8Rl zBLFlv&@>B_5HEl)QUeh3MCSpLMe{g z-vt+Z5a~vVz>fuLoGZRe(|4$R3{-;y6o)m=>vr3<69`SJJM?$xdtsEoRwptiVFIhI z+ne7$@x-kwR~kB2gHhY*TzwZ}{{V-F{U?Xk=Hm)0j4SBj#I3ao;SCJ&8Z`@sfqE+V z0^nAmD!2ml2xuAwkTeS+J3%RdT7?iRfF*ANwF`lAu$O>+aE6Lz^Lf9}Os>6Sg1VwC zX_7S2B}&qgR;jIPl^U;fKQKAnfZy1u-9je;;JpW2NoO0G_ z@;=sC6^$lFB&{7@2Toc!(Zy&0-?YG!%RCsI9115(=7nXcxZ_?gQdZiOEsb(EYiB=B&bTW zM!7+$MsB0LO=>3Erl~8bFIV+zQlafO5oW+NENymNJeIft+@gf-SKY)Af`JoqoF`@h ztkg^$XKmNt&X)fGbSI;5WyRC%^oBN!L+`r0pKTm)rjH6t{)@unQ1%zf@jeiou4~rk zjD*j7&lHZ&EE zR*9`}CY7|aiPgu@UWLasGAn2ovAV@*5Bz9KU+RLKZF{bV66h>Z^db$z(KzT z5zxm7FMt=QY83*F0(apG(w0?d8U@OMdYY?IPG1og-Pqcl zXXV-WV?`XC1g#TCM;c|KCXSlc?>DjeWfb>SzN>2$0=$6z;m+jCM?Pg7$5$Lqbl-*C zuT0K!D!V|iTqm(F0$sYQzMWbAku&v-{{Wa5!a!M}pjQZ6pk9MRL8wkrpg^rM`VL@d z7r+5Qv!*XO1KauZCV7n*4*b-6k;@mrLG|^EluUTcIa&>DpRFAYp$(m zfrx2MTr?3@aHM{PvYoauN|>4^gpI7l&2)cmnsfG>)X`1)C-1Bs0`E7y`RyD1u)Lm+ z#b`N_R`KK^z7+Rv{M@Z-R}-BRSml9z-fyd}Mvn8K$aEctvL8Xx+oCfpngLWrsgA^} zQ?6f9zth~`NcuxMWx%cYD}FFj#BX?Q2PhV56#})U1xFBpzzfhU;S10%1v(oV8*m2z zQK)sDTp>gYfm$1y0jA7qrYF*;1u~dkG`3mKMqgNxo*PMIqEJM#Hf^Ohs*O2Tp#IKe zpbh%-g|zOInG~8jCnj@w)06s@gMGB6T{dGQV%>7O+s@e3ZMif1mMTzY;#XpW*1zt9 zeYH&;9UO3&`~&Z&Ei6@(_D|&1<2=0a%5KH3#O4}ZqO6;&>zCAV{-iVGGslL90fz<} zW%SGp0S;!Ne0=8h;5)#rFwkjQ1!w`T5HC}JaAq4Cg21f;w5=E%-3#>sQLm>R5GzER znkKVZPe)ySwaT^D&?UbJQPro6sBJZc^4-2bX%O z{m1h^t$tzsOYaArFo=&VmS;eyz|bvw5$D^h>E@?NyjgCB@WzQrf%MUkJV;dv8?1*% z6SMaHCu8mULFHAWY@bbO)UHyEEc&#BFG`rvNm^ABm_1@?R%vi+`~SoXskU{SM^*$Eq~+AZ~+ey_0vmCfIM$_WLRA1E#H>S=7aKS<<7+;Jufm^6zQh zG6jyL*j-aZD^?Y!h}&zUtDZN9Jt`bIWb_*dn8USvfW=W;SmRe5dx@h(a)sTIRcr46 zXZ>%8ZNReHENpKLxJ>dvsLZbFjPXEOnMCJ~!Lj(9@y=l2J3D;WS?gjy%0pyU-b;*W z+pKOon=rs^{5{}En?~SeUa)|a_qZyp9a&z+RbBB=p(Qeg=-?c;nLw>V&I~mTD}X7{ zB`NHJqXV!-6xgdv+IHT_+j}9=OppO=1zul{XYuO|Hr=-Ab$(XHfoVV$?J2t$f}E1n z^kuuQ0-h^I`D;t1_lEcMEtVzg{ZCJLi}a8%w08p7@mY~5`ZA%7+QIgOFLYM-6?k1@ zS8D3zX_ypt<$UX>h={1I&hTo`B~UjLs{meN>hLZs(?ZSCbSu@>(Y1moM zaFiEdm%BO4{*(Hj(tlHbFAl>yv78dNjs-g%t?3>eyDX`%bgv+bB-L{@%|+H`;Gn&; zVO#pb)P!j0->$pBfljq5v`rGvr$}5)ZQ!Z74K}Kku&^s19FJw4LK;vk2&1UtyWDLu zDeAV{tH#~ffU+WK@V_Mf$Etr>(TdaH{YOmO>3SF+(IIOr-86K%-Ffs`eSSb}@Mq7t z3X=SdnoleeY@!Afzj0S(bdMO{L^prb{|_l zJUHxTTv{r(1_iV&9$*wZ%%2gf?93!dWN{H<)$U7mZ0En%E0@BUiEUu5gYk%kYUB2` z-C=tHF+%-j`ggm&ch(p#4083ByH`B@-S>utmHoM1VgBu|!-y5YV~BNx3UzGgEqhJ5 z%7;Un^1be3@UQQj$9x9OgT186!9Gw~jm5pp-QjAZbR3I9`uA=;c44jSVMZ&Zz=T%s zYPVp#iuH*ptzB=O{{S-UZuZ;m!D83QKF{AnX9POl{^F~&SSbJ-a9|tf%G@YCrdEg7 zeT^;-V-vh8nVP(ILGF;z$kS#MP+nboG0_EE7h4qsa4na63(b|_ZkxHjqG*&F3e0!( z5yuYUDL1j=A0&prwu{X=b)We&8e{+lue#Efz2&C^cDJq9*N)Tw02f3_WGF19t#7|Z zvAv^wThf?-CD~_9d*Ou2v3s5B0U}xk17CJrD_xyvm+=C)_LLk3s`|CVQ*s;W^RY1v zw5vT^QqPF{>qLY5I+Obzsr_e0V>f1#nGL!dG`+i=&c9|dBJcPWYweCyMklFTpNt)t zzA_OdNlWhtHhXmGkZ58X_HQRGOuYzW@>ZvaqI0URCDV0T)Ghla$48X=Je(1 zw`psumErK=G4>l-P}dUcopa|2%R^B8~)n;RQ$7Rnv%wg~b} z{u$ndIrbC(05cSj;-a&=?FUzzt4;Ulk2&vE9p_yke9NJTDPA4J7)N7w(_FAvloyLC^Uon@-*ut?!k1pV{ovpY$DgOrS)C@|3VH0mKW5#b*+6 zRYAG)x_=S((FafJcPI8eQ~J(~F{0{Fbr%;owBJ)Bv%qc!(53HKtmy(BlJX&8AS#0E>>}Z#g~c zn2eC_3j)5FA=_eu;TzumaHvNIpws{7d>Ie&2ym-6m79J3~ z*Sv1Hr@%p&9ESVt>Ey>zy^1%R#s(SYsS}d(Pa;>j@EoiCz zk5vA%qb^#zDqODq1c0FA{KP2TVt{JhRX7#rnjN7>v(CqsPaB=31rfFd1&foY8%)?O9oW6_P#xw z0pJgs{2bSyTE-VP*Ee`$ zL$j6g>h>j$mb{b-3h3L}sH|BRmd@roR9-ZzdUw3CN2o5et$MZbH#4p7%KHoyMgS)! zTVFn;L+lE(z*XVvHrEm<=oNgN=f-~NlSMk*gWqp-00zh4Ol^dGHcrp<@h=aoZQL*3 zcK-mki9%h=yL-Am4bgVJoSpVBd^jQz1D>T{I{XM_W7OU2vU>z&GS!ql`S*8b!ug8_ zVfoIcTLAE*e#q12QB)y0n~!8^gmhXqD;oe-uvrT-yxVq%H?iu&ddCi2*R8yu0q11C zagF+6x*bCJtl-~3tr#^fU*GMFGE;a>%X$}AeHwc(-Dwrm z7a6d!6NwV(Zs(6F8MV7XTiPk-pLiWW*o`CEF)f&i^?J|fx}i++ypP%Z#}UkQBc!66 z14W$Z!Vh*)LT~F-wzTXX?6y#+3i)rz(|i%2O~4N*BxIxQ(0rd}(Q!fMf^;8&<{?Us z%3gOoEy$!Df|@9x0HEw|m2Kd7a?#>{nWOzV&Gk&mp_i7#4$xw=7dRn>D1-KrLh-r%Ka(Q3GcK-mPbW3nOHn&|s%hcstUCL+u2G}1jd3F}rxlac5(JmG! z*jYd`STCI$tSB@JJP^22wO&9QU0|85iUVcjRbSjD*2Fp5sPrptw*@7*ZaH?{dQI5j zWu^~7<?8fR&z2nPk?7BC!=LIlB45eY3s-vSycIQaLO;PS9)aE)$+Vxuc z4eOH+wfB~OnYZlpSn7k|8F$`Iq-Tuz-IvaCszGWTOfVXw>_0tmw;!&dk!+mA(R5mpuY_@I0NuKbhGQn{P zA%pgxj>u3RTDj~7>*Cl4(IgPx2;X$g9C2?`EBaWqEy`q zBj}6maodA%tZh|RWAa^*;|bi9dO7twCP=A?%Wuu>auGXBZ8-j`_hMK$VC%5=9+5VL1 zI93>+bo}Y#6$@FRxo#}xZvOyG6m`A~zfSwh)05n$A1%`K{P{NYeS$X|+k0)-m=~pt zTSDaBcWW2dayN*M6AV3;b>F9CeMaS&s?s){=%6mjyeph|1zBbvwh`GK#HM3Db3dZ$ zpAte|%a!iSr$74wF*Mm|w`Z-lU#4R7r+gTpU7kacPyprG2d3|*qEtl)Y;Jz(UEHm+ zy3d-o2YMYYCkyPd?d!?-UjrW@`M+S~b|{H$Ci~xA9O&rlj*hOc6QASJ{*5#BjQ)|S zm|zm}kqe|Mf(|9zJ%m`LR6}w8<^i(m9SlYbcK-l9VA8OQN}#;=#&ao!l~6#TfGVYU z+oZ4+?Y3Zmp>CxWQ{%+Q>#h0x#HAH?T(fm4cU=Df8$esGw;)$VUDqt)8dqH3u~NZn z^U9qzscw3*;me09hXXAz;50ZLrW$3#htgp29IxpD<_xNfQTgem-s$Ykxn57{j6-lD4`@8Ft?PS$N6?DE7V#fV)$Xhd zgn9=z^(mDaIylkC&>a02I=JJ@>QVlV!|NISQ!)2Z?Go$3Ep9t*qEnPR-Na>%N1OmH zjCfwVc#Ke6Ex>(McJnF*x!hoKfY@=jpS*l124-RgpzD{lLzMyR6*=y{Vw5Adh6E@R zcg=O$?xVmX2NbQ3IpB=_Qw|`+pjO~Iu0L@7*Lqa9Dy;RyvLdTzYf<)k@`e75l=H_e z@3qHGhH@vO3jE5gcE2hC=4b@BKs}h8y$1X07k)E1$Z4`qFc7$d!T&7Bs;5!m<_kV+iN%U zxoS|2_iUa#v~`DXa;XD5+7@i?Tpn9mECTsJ`GKQ$uK8~6Y*%>L7A>=2@GsI<(%_+f zEG|;7FuYxKd6iJ7R(1sNCBB0)kqJSrw1iK@w6q&lZR49$Vq%P>^9l>v^NCQsbL@`e z*@eV80aug|_kdKsnjHG)$u`g{cWT<@Zdq_GfJVa3+?=;5W1eaL;M(MNf40m#X?17PyS&4jm< zrgg9`u5VAipC^w|a)zB+e4AJ(YuoGxYdNgkwHt|ag@SJ6FdmskAP44h?3o_TI#7tqPYKEWMYW&qB66}?@0~gN zb%I+%(qMJeD%4K1Ll(Pu-iluV`sSFWiLi$0!GLFWva?ML- zps}*bV&g;uojImlXAq1u!-Pz%bH?Z0BQszlGa^;fYX{hYn%aG=+;^3}x1HLT>`(4@ zkBRr7f)dwtvG>PHCAisBUe z(1aUy!w7uPx>r_pZ z8-3`d&+Ym_Yj3&OZoS>&Mk@9>T|9Y}04Z)&w5QXP)@;a7Rw%lyKcnpcn;~=L*Nfg@ zYVcsT&z8N&0UMa}r6J4MO1~+_>Us;D`9kw_0%&8+%t1EUrX}H<)O@TMAfiJcR zezpQt^R4#0H4XOTz9GI4trY9G3Tno`E4zImNdZ^5q1~Bis{^Xdg;Si7D?WWZULGq` zo{2_5S6s?DaROr923i&PAQqyyR_%{$UeB4&{-Qcj|NWg05}P=(?xG(hJ7zVeFVr$twi+pUItTbt=+!CV{5$yD~*;H4!Pk9jt@nOM9Vz%KF;PvQ{| zH!p4BwA>_d_PAnk>Am&2RxGZUygn)la-LrH#z?-FT|i>3u_}T)RUP`lH`j|V$t^Ht zj@SBtRVQlN1)a*vmRhpMYyC~XlQdS{AWh5K?C5mU3DNX0*9{26LpmCYyB(9L#UUQ_ zZ1mjxz2@d}w-^3FT2K|ppg$9<*lTLZ7XsMroO{8;LN2%2SnUap!M}p8UTw7BXLa~E zmPaMNw&{I4RKg)hIgKI&N2r2ItKHxaS2q?2c22de{7djJapav60u^=Dh6U;A3Z;Qv zSQ@3++im6PwV2Ymp>3-Nyk8|f8BQ~>&qPxqZX|a!R_dyAtKF@yqZ4SQ3eDDiqrVyz z&l&cNRHTPK&$PQ+Jt|edn9g>TI@Pvx+*lqXD)j6>bJ7t6345fh^yv?K{{SGm*4xS*WvgGJS>9)Gg(aO!X^3dc zRj2A-A`OR;<7o9`b#ZyNPnJ9&w(cdVO}VoW6)oGT_$~K=T5t41qg+SP#+7jZp|IZL zz2!~hw5&65pb2Nk$&xBU(__DY>D{Be-0L1=E*o#vDq!J)sCrv|yLOZffxr=5C8uQ1 zh98H#%idGE_2l+zg0qI$G@>i-5Y&lwXa!cyE3Pb--lF(te8KY<(JYJVr%mX%CN!YC zTGru^*sF&Jwzu8zL`peazNhLOta+Rd3#*T!@hgjbLj^>^%&0a*I{q-{D0NsKtPhm! ze6#wNAN!g8OFyY+Z{~Jl$2rqk+)Hx!#4sf|sF(gAvc133nf)Vf3o>2Bj-)okDPbBj z8xDAcHXy8wrb_bIgEPgM;fUH%D2VqV{lof1;f%(oxw8z0&&Qd!xXh&^d$0Kg6SFO= zh+%iS^@NGcb$B$-gl~@xSV9^80B<(ir75o`3gEXSx!tT~^joh@GnsLmx(kf#y^m~s zLS;dK*e5M8(E5c|xvpLit~MKLZ7krewX$uY&l8wjby7_!cktz;{6%F!cHNJbjkJO-VvqNXu@Xqji$D^MH&k@^;ll|Q9sWm%{ zcd@i9luIjr~b0Eg%lW{3GA)U6JFq9qhs@B3peaPkn0|ny~$QPhW65`ly zDynR^J|vX)U@JuB3DcYlHV@l}lPy0D{{SV}Hgj?2<=|VZ9)~#5N!LxHJ92!IpYczx z?^l4!fydF=0_P~GkOw0T+8@YEguX7&W^yTg=QRAhPIO`|^@fvU@zya+<|KPv;MCapo2#C?%j|c% zzWrb!>_Dy0Qs*_w@4r|;J&uve+4$~hmWJdprc(|f(WviW!EFL#|OPwbNVd>58+o7f~pA=ui%k408qnvm-a5&)! zLgsj=bqsBw2l1Nv=uPHcGojW~kss&)Tuij|W)Iwl=46rU`XewNm-!(xdw%X^73zMV z`n_M={{Yi|*^2fEEPDhG2iSmeJ)u(F4b3|+$5CvbVk`Oyf9Q%oXZJ4X^u z_UjsGPW4A^7KT#}6GH)cFNV+)oG(nYKB1UnQ!>pYj*-*B5mt0N^S>$QJFufL158yd zSe`JQoZ$S(Q;l5k9BGFGs9u1s3YWfy(yxpyq7$0*g$K~C_RaRUq4|bQkuF7Sys7O{ zgr-#v`p(CePZXO_60qniTP8jFSfnu$3yEd;C)4#7JvW`_m)+c!4v=^CbbCIRrt%_Z zg?cl8-u!5QPV=9GpWD35j%B<501m`zudf2p4o5e^mR2X>yQVyQm}-by^5rf!J4!@K zVKRo2naa0QKD}klvrOhub#XAOj?UU}!-9hwa5}mE8;{~;VPBdBi}4W}f6eo=={YOO z{akl{WSqt7{Y)73FYgN4JbwcYI@=IBBdt`Yco#NAzcX`3w7}EC#odRrr?mMi_b|cm z{_1Aewac6i@~$h|Qf%fPP&jH|iB6KL2v}cPdLvuyrcy6*$iZYYr7ujT8W3pU!gGfK zp}v?y8s#w1(&e!{LmYW)hZY1~qrWH23hMhx@wZ3t!^`<4tCOtDMs8=6ZAqek z#fSAXl)D?u6g=HIjo|w@9B{wJ$^3IF$+|k6p8P~jzstn{nAUmQ@4QYU#`BxJpVdrS zdVe)=$~P9s&}VX8$_k5|TZJhSt|?r;*w=AMX6-hK1}tz`y&$j+`e*eA2K^e2-*({gp1tbHq z<}47os^B+SLiFg*tI7c|awhKVLG~pj5U^|KVfGIjy``3(Q?T^r_ictWs0F#R)ALmN z7RG44{QXI0!RlkwgH8O0#HO_Le+*RXUgWHc?}=$zy#eMS`jjx6nS9frEF47~tUlM4 z{m?E@gXn98{xcuS6K&0__ahrC{Ht$wyxoiB{=R2Dd4I@l0Cqq4tUrKbOicMFK|PuK zEafNH_cHnE!Zi)_%p2h`28eGm(=7pD2}CgIhZ`{BaSx<3z~fGhIsGtj&W2r*69B`d zDEjSbFGtYIa8;U0YrJl#i80Oa4|J$6n^+R|-Hz1+g~J1&lfBbcY8@_qx) zpvGM_gVmMiZhOiuwh=gDl-sbauO@JbIT?8WaAd9>0b)e4yeiMbG~LNkUUM zt&HT>cK-k+Qk|Qbb{oF<`^ zzmCMuq`-;c{m!y zIB_iGlbKWz!}YS4$l5kMY-ci7ik9_u&Chd}li8Mi(B*i48J420uH1Ub;kd%Qy@#0Q zcNEbWd%0eNE7%rNCk6BI`di$W%>Jv@e=95A-55N){9+s`3tp5f`PosA858I>c^6z{{Z9v0AhGXKlTXaInA$a5IMjIYBQk48A&UFZQqA>k!$7hPTWsAJ|iNcu@$!_=F{m#zF#5-q{o07HY5945`%79KE3fpZq(wYw;_G{9|yYZjJUa?>3%0e*+W)FC+HNvc9HY*YG{vxt;n~_!)H{8>rBJV^_whkYyn4F_mDnfSdvjF!% zW%eICG2yKsaUA({2Xf;diFmoJ^&xWToyTxea>_G#<^-1 z{{SRA@r-bY8^AUqo!wujhte8@d?x%?Gyee8Vw*ZmklE?{H)}!7*pG{gtRFsqg@twARe(DMVy8Se zGnC8^7x4-_@zu%`0e|*XxxWxzls3#)=40kLISBpam{e=;Q!>QohS(8r=#8@N17`mK zv7+ji?AE^XVCup9$EsRLfUz;kTcOy8Bv*A#x!H&?gh2*aE^!soUB0s}E3O_N5WT>XAk7>zR5FbRiNc*B=Qjz@C6UTlq&cwgm-N_RGIJI1-<4zKl*nUmfbb zs+LAO=!6rr3$jy~EllSZGrRmH0WXQepW<_m{{R{ASsk2z^MC)u04)�IF51p@;G z0RaI40000101+WEK@cEOVR0~lp^>rhKybm);ZX5lfdAS62mu2D0Y4D`0OhRxb@34W zFoz<`#52Ul6~3z1rEyo&w}QV!Fnuwubf{y3R2uXvkZ+Kj2i7zDlcDQr{{Rx+Ht@Z; zgrkPOz4Ft*E*uxlb3AC2ak5_(JT1bWOJ%aodtmxUIztd{R9kYK6OegAy?r140uD@i z*Tf(R%&%2%p>Haj*1^705PcD@cYwx`a*c3KLE)z%k5tF*FK^Zt^*Ho(KSmrhmn`9R zE%cUO=nh3Zq7ZM8Y7O!ks((1c&RMnoGq7t;ZG5$H^?;x`2zU|k$ncn=Rv>N-6avW?J&FH zmrJ`^A)&qRTa|4OD(t;~$8Dj?Ji~l1Ke~JIyn3#_n*RXKbl^oCmn@cWSx=~Eon^dj znUr&^mhe#W4M1>CBsm8CA*KbHy`az59%6Skt4{%dbO0l)BTM-nCVG)#ZcQ9P>!e)H zoQ60gxbQ!ESM;q(f2lA)u0@+mw~3w?&3sJy4<;riJqnnV@DzePqfl&#Tuec}LFX|Q z`oKLbe>qP(NAk)~*{pb2zAxo7?iTwnio|FJYp!bOMJ~}$DTS2WOGYx<8O#*s8mvagGWWs&hm-_HuQgnO^%EPxs#mYdh8~l`z5^p%h9a z!7N6TQ$)ipbX~fGQTmUBl^}vB46QXx9>TETBtpVeVY0CwMs9TN*yxnI?=5XpA$_yM zxej7-YT)U@xC{e8Y#m?ViPded2Y|sW;q0UF86!hR-HzvH(b2&s&G6{n_}r+gW7WII z&iBJU$7+Z@&i*>~mJ==GL&T}30>6?~^nUV_>YzM^YYE-kTlZ zg3sH1xW299(q-fRcC$}ISCdjQh`fqoaPCfrB5vewg}gytMO?2yV2->ji86DI99vg! z+B{5#2fy&y2R+DMc>^KWQXAkZ`(Jn-Ea6r>bbt}jj38Xr_rdmKw7GY-(B3QX zFOgOKDVI-ZMg>@OGBoV)H~i}pBDi?IJ)3*YA_Qk{p!Ka^7j+J2oaw_`6rV*nbhBI{ zY5RxleFI(vYi`78I-VI&r9lyA+pEFd4zMw`C?*`Mm1Y(XlcN9%KXJ~#tzv$ueFHHf z?Z&w2z$=%b=*xI#nu$aTl`2=DW0KV88sYdoqeY}2tfcH{m`@Yjju?C&hEi&CI)CDE z;LD+Y%O~N6pFBH0^}3uV)M*X|e9kCTx;G8=vI7Km*O7SeZJ}Hj12WJP@l;)7 zS=pVZ>l~Xr@rI^Z%SWq7LigaD+VEAc6DD{#9@kaq8n0lLNA6#$s*e{ldE0Zz#AoF8 zkIZ!-L0DK(3TV(BDa;H_3hI03-o1#}P$eEY!_p|SPzNw)owjOhn!(_~u)#J=` z?pe*FfM7|`KY36nI2yb)dPbbLW_8i}l+5qD-`rpVjXgS$9m|?P7#7~M^@s#?lq3$( z5d&Yh8u3r4LXNlwhY_&!gA-VpxC^-G^w!{%%kkzuR3etqq;-Q;y={SXA2^PMLfhi& zI*bz|w@h7KUs&~=gBq)`7d!f$5%9+Kn`|klKV7z#m6ZTm{F-@;t(A;Q4os8*rT+j_ z!0&HJ7SXG=C4O5b*j@On#Kpa0Rh>+@j3vDwwvAUxAoY)6!tcdqGj8ZA&Zb;NVXK1Z zy42FgOK{`YeI?5wwDDJimFX{U!_BO~5IsK8)_taR52V1MUf@!Tg)j+t zc9l_Na6cw7WTQvpbF=dl>dM5z-BDu9MHtfI!Y^XxsgDVydcR9ZUhzEx9APS>V_7Yc z(P>-Syt4Pjr3jBo*5I3~n%(E8zIhe?9V7D{P6}qK3UvmTw(G_^jPs%X2S@MJCQV(A zJY5}|Can%!c+CAncBW|!0?)OtpP`3~NTDD1sj11M&WOdj*Z#eXu#MejPX#bw`>lPt z@iWV#l>NH%6Hg(+C! zVFYn%HA^m}u*0~XG2oq@WwkCYn9S~c&iBmDvGtnp)nP=!(wwK(epeo#`oth()K2L! zZn1@l-6Pc^D;VKu-%_I3nEg<17Z$(}D{ovY6?t(eIYyjVV_9UfS<2;zBqyM>JVJv6 zqKC^^>*V|%(fN+21wS7!5~=D$L1Uv|bNYvJIy?P$_skyL!xYUK{*}EH^@=jH0{;Mk zeVS$rE;8oqv|gUYDc7*d@ze_du%%fgwY#BfgWpT_wV(YtUga9QRLCZ z(}4Phzqlkr5Q33ade_XPxPijY&3X|OIx*7aQqxRVm``_(9Om7idt}6NG~O(xyOQa+ zZHnBxCf{Zk7qflyM(sg^S9Yehvt}7>ZkVdqb>7z-+OeT%ZieoVFs5g1+OuY=?3te{$^G+>$9cw(XNoqfv6SULaOP!xkEET)@-)LXBxTv zMzz)@Nbf{qDp8AN@TCmEH;rw<;jZ2>Nf6yCrVFFI?=!m2>ji`ZMkNlgt;QQ=TqSB# zuO8C9u6}j?PtL!|_}BRr6!<0qyrBgAzxgo1ug;U@e{mh#A3VpVGnnjBAhVt<3;rg%| z2W@_v`+Xo(3K)s+a-o`)`@d%_R(eeXy~uRcOm6OY9^0M8IZRrbRbtYX^-W!HHO(9i zf1Tl`45Asj^WG=!k+&kqIUyG7g`G`GN{iqsgIyrOi=h!E1g1gS6d?3BjYSPs4ThTEEV&J#D=d3cw5+3Ezs0;ge!P@v-23?SOg zW&Z$EDK4+(CT#YO36u?!A`vU&kS~hM^%imzIFAr7NH@>$CWz~Xcn6rhEk4Zr$5Vos z30}mh-o{?bq#cftVo+-uQN^G}jZ(t>qXKH)(C*j6CusE=uGse*J1(M!@{1t;QgfP-9VpN1|by?~Qu&cxd990cZ*(brv)POvAUcG(NY;?={UF1IS&Vw%gFq z^6&PF>>$=On{sLUowp)Tz{_feN{&*q!wf zT?I5=v7mtg*tYr5f~R-Mxaw2m3=|AEb3(Q8yu^8PMHh9AUaZ^%rsJud`Y^`&8|dBQ zVKlkeZH->6VIZ|^D_POYpIP*@VNp}J3NeqUoxTE<4fZy{aow!75ZdJcFqtcX?;a0Q zAWdC3<7vVmy6{I)zlT?=^>gt7psl8e>y`z}u@!M^HF!y0 z(fN*~2-|-eF>NuGqg0ii*S~Bb_=|mIW79JkGWF*OZ)9RkJO$?QW=FWVfTnJ*!O6_a9cre3@RmY$ zba#JV`RynQe(zX%8}Ky!%sxd_ILUEb8)*ors9kOTQ5}-d zy4~$C&0EW54SVN8Td*{ggr>2hE~2$&+uZDb47OuuzOP~ly0pfRatqh0^Lk%pMb_3G zi`}oMmRFQ%?v{3SB}Mg_vb1(n{E)5PO5Gl7cWGDJQ>W&ns5CD3MylJs+Gzx#p4RB9 z#y4TcgnGAE?%GkVOqW{fz2aaq+TCMfw_@`Cs;l>H2DF!bIgE&Yb#iOIcW9r#&5> z@#|_+r_FrK#ohEedFk&nN{tOa*`i|Rt3TKeVpR{m@ou~WtqEU6j6-0%!c&`v*-Dyc zRlWmF5Mu^ybRAKI@f>HS#rDb~8v*Q^>omI`qes=@L!&Q=QEyO}+j`K#2HZOT>WvVS2HyL%VTL)zh>wcP{7@7=a6 zzuo!r#5pC-9^4pE z*M*`YhgqL~9S%=zfrS3f%qn!?I)`WT5zxx2yL)au%1HLt&XMr7>}iDR3?fo?Mu6Os(0bfv`dJt6 zgWz7i z+_hz2^A0Y*q^96kwQfsx6IpyqZyFM^0L?~s?l4Sm**#)P`QlQ#5hqwWxQC3M|BYVvJ~bJ+{m{OK#{6MM6FZO?sm zgHp?5b(+pEBr?(ubye=(4U<|6tz55oC3OEZy$gRtI*7Dj-y}jKCHG6b4Gga z?=rl6o=K_|g2_i8=jkg>{{Y+0S3(;!CQjq(_ai2oS4Nb4X%%CxF%Nyt&Bd@Lp-NPT zmnUc`&`Z5gPs2?wEclY>_HfWLLMwip2BK(#-%urw)+2cE9v44b zl)F0F{{RPKTj`xR8os8F+yb$*6teCQM+O3_8AaS;vHZ&#=HG@>OT5vB)C zS{I_}jrAc*VX@t!RyxfmatoiWc~$AtyjZM&4z2IDkj+D5wJ7|M#DqcA>c-kN5<^rM zT5D_y5N|rgX+n#*HIsHuva;87XaiRL@ImJ8H0F}@>sv*(^UHQ!ZKK;U?Okxt2KMUo zAo~5jYPNN)qT8zFyBuAbJ)#X_$kkaf)x(T_qaPMgA<MTohEA)q3a6rnUVTy~9O<}nJf zh~6~^(2dck+nQYI@1D|)2i@=9VRK#_KK}sj^V;mK?R0$zpZ0~DDceGw^=@0d1*fpMWon#h+${mv zHS;pRWZZ)6*}c!CyH&HO_;`LAX?bVFl^JBOePVH^fid}zD_jNwYc1Xl`lI(CoPmlO zz^GrI7ZeMXl^W~7q$9x&nN1qfAXynn!?X+(=+;Q0;?!WV2E^ODFwfR1B5amHfCho2 zA_kxfedTNGQeI*6puiXcYYz|t`GbP1C^WzViLBLa0^aZdMP&w`d5AV@wt;W7%&k%l zc)wR~P1GVZ!)e|m1XcG>k2F1^FWv!DCpQ|kMy%~GgjP<|THGZ=09mmcD&J;QMpIO; z#8pp7o(yU)NYl*}&Ae;oI0p7XDPlE_noFwm;r4&If(Qb$@Updqv#o zE=Ie;3T$-cPeE7H$qs8PGXB-B$Jo9g`VU75#ID9ka8DDADW^_j%|h0N0{p04WYJ1# zy@LA}@urgqZ)-aNul%PJU`smoCdnhFD&?y z{O{!|<&xJa(|`74;PtAE#2&j@qxT@`$mMu~m#7V0YvwInePY!|nuQ@~!`@_5O3n3^ zIr96P$I_XGCN6Il+Iz|sq8K9~ zg3b+R#54p4n@#Z6_0rae0q8>U4uYZAe78S@#58S6A@sfo}wgus-3d`)`+ zw8ZraF|S#0105Kk(EWIlrT!DyT}9f*DAxj*@ZvlJ-}oa|RG6G!F?lr1CZ|v83!Zv! z$WwttSRib(3q~ve*3Awhwx$qrSuQ?_mw$)QW0WyTPK`DuO*q6%?4>XUheKs`j_eSk z$(GdVx$VPC%RVH(JNa=sHB9ni2OS_4boAq*9+=bgMGazFpR7aw08t*Sb`(b6IPJr- zA3xmfpPuu>JKq!W1pL82Fi*q~>wH7A4uK8P4ey*czHr?bHudc^2++sh_IWJiV46d% z>jZ2?QRyEAtWiz~TC1o6g8pVZN)2Lmy86NyTKUlTiG>MbY@gRyy=wZ#ty(*;LNGU> zE<AW%(1JiM6;=Te4B)? zsObS(HCot)md7osuJ5I0S_Rf3HL_mcZOK>+x-A!0)`g!Bs{W5h5ds_Vc%re)5|@Uk z>%iwA1x59n@OUqmG1t&_;vP!ntZ}|mJk2zX9EVa8RiU`>^!J2}1_~%V5n`FQBC7nrTY~!6F4v2v~!zc&28+EF?_m*WN21f|k;Uj$dGzqlo zalRDFAgA)OHCNTG&xt9^-2QkTkda=H(~y|#&zN1P5a2*_9XKANnyPQN;%?Zj1W69L zeScM}s%Y+NRQrEXVXj#;@%H<{9Y1E(BUp790Y;I9I>*Fm7Ey-~G#bH{6Z0`x*v4n9 zBZaRR(R@RK)TcCk*dN?6dR=vliuHFMq%dnjYc#jOx}mkeq~Wm|Nmpe-D|>@m16t@I zSFcJm=TpNEf~Ff)Rd}e#O;uKoh3zfsx>2T`N3#IH#|^Nm@mP!^I@Pwe4&N^8E(3=R zS!+*H@9X~n0MnJ`I5zb4a*ZW5e3m>F;$}XG%)D@_IR}OH;)q-5pj=uEzEfkn9h7g> z@6#3YJu*E>Zu0Y1ci&mvXLFX>X}qsS9Y#~S5+Ry=Ll5IKC|nHw7-f&^?Ep!kr+K1^ z(#q>_JiiTmyFgZ;#7v5B7_0V{Z*{gSb#|z8S<`*G{q9?_?g2A>khjyihfTw@s#?q#s^aFSn%JZ{* zNwkXCw(&(%L)H~JO4}IeeJ>XqQKY(;kkZQEK4EG$Shn^Onmf#->g9}dzL$%*K7|yv zUf@w@c!EKc$!8|Y4B4xkdaj<4>8KGMPuGGI>k!fvx6V5O9+58J;ve}5_$n+wyXI;9 z0ReIFCtZg?hd_X9^M?E{W)Nsn3lA4rO;mN^T)N;?OKZ@;TQ58e6CC1^>GWI(^;W&R zy#p+yeWNc8yteirq+|H!A>72pC7tCN}r?*Lusp$SqrI``mXzLv~4DF8i zG1r$|1kzjaKeukwSP`64oF^A z33NNDr^U=vIc|XfE|El8pQE%-bXpgfw7_o5)(3J6cwM25Mfc#7||NQmU~KR z(zU2rEOdI!0iqF4FtMveg5K8#%uQRWY&7?%Iu%i1x8H^S)lG(;^)L)jfqY-<6g8UI z`@!fh25uEKM-_c>9XWJz0iw+bec&9^1csv29|YGtTonOkR|K#ScEwm8ohA+2SY;R-W&_3?`1k{CAcEnw!eBxyTR(s<_uWKek(nNMK z3)?B9j>^qqSTxJ;QexXW?<{SS>BJ6?3kggrw!!U7GZTZ+Ji}O+5g)NC#T+mal3#It z7Z0-*zmk%o_z=bH@^ANuOfAm6oqmkI;Q3$g(Vs#WPi8ttNWD{D&-)Fg@7`lDcwjR% zv-gM4zY+QZYfFzI7Xc(yHR3;2bvLkGz%p*`yZM-&&5zgnj$NC)s}`cRheuX-)q<3gj=J`Y z#=}|GUF;|wg}-+lqb%9l?0b7_0^)b`RlBW5GRC5Yh@aWOQhx|sL=(#3cXMrfK-R8mwLvu3ouwKQ?V zferSJ-|8D02lBzuFAYtoW26*{y2T8v10PgI+^}%gDVBntAU~;xbJu{Vt77H)rjh#C`2~CN`>c6kFX;0Fu z_KHsiFL>!RfE6%bGVx7D_p#8nDOFpvJQ^P_dD31ZuWym`ckwm<0G&Z-K9H+-{{Yo$ z>^D@;%HB+zoDyJ#Qy+de_X`1e?aLEMc0#5bm7s%917luOhMWh zokkF^ifYAQUrfQX&?BrjD$Y6?T{P@`hqjL7X5U;fe3jSS6H02~(ZgCb*3;Xsw7w4G zUv7}h{Ue2r2x|Z?X*oJanZz@6)ffUR!G(#c7J#*&x2l2FK%e12^y4msWKxJMcKPR?&lF)-CVEr}r`b@jEpy|;p5qEl_^cs$_(f~?qeqfak(9rjH z_Q!Svpc;LQM-|1eYVbK7c@IKs{{THI&1NeX%)yO4AO4qDR6dKF&3OF+I*CLd`5p^I z5Jdj~m#Luj%r=lsT85Z;Tqb7I!NsGjJWy(=Y=6(0j@%6Kp38ZlA2 z(wXaKp3|YwAKKTul<9*c6XWF6j=VHSSVK+}-tl06Z(=uv@6hmV_wP0T0L)JR00zV< z=&g?}4}A0(wCK3K+ph1hPN@fo^-VwP;PpB)05tUf0Otj@4?{J_uA(fkKB(QRm*88C zGM*+l8nsajeR9}Y{{S4*n@1vnFy?0IM+$d`Rvly7(VcQ__T2zcY~KR_Sy|U zyvMjYLqo&2IBjV(y}scZZ!} z_!}f(V&axg=8MzV!8Au$LF-M4Lfs>$yT8E$nMR-C{6`yYgIQhMM()66dk`^vufOoO zyiirIAf}8Q*C0A_>huhM*53o>Tpj-a^9Nd+5{<9WU7w^!qok%&#K#4)*U+^%4QbK; z02tSsM+FOJ7~IvI$2N~i=Q&*?uc@J%{=8BhNNlhj=XQ6Y)R#b=9#4aV8t1`gNgT^+k5>b0`IL~u4a|M-D=9Upx2@A zD;HU4@&5piDD@A!_6-BEN207v$_Dd5<~8IRf7i1V&82$n{{YH^Yc)@cSl02pb@K&u6TY3v@Bv@mm= z)d-QS9gh?K>lLZeUmyPfB#btVTKy3RSWUXXt$<+K2uRcKBoN7 zGx|+j#+-?VhR3VZvGzdxGLY&^;&bixr{)eBs3}@2I}93A-;(CpzIZr-WbtxU>$h># zdyI8eiZa*OitTpJP2ow>9Mz7=m)a?gioLz5?-H!# { + // 获取数据集 + + // 获取jupyter地址 + }, []); return (
@@ -44,4 +52,21 @@ function JupyterTPI (props) { ); } -export default JupyterTPI; +const mapStateToProps = (state) => { + const {jupyter_tpi_url, jupyter_data_set, jupyter_identifier} = state.jupyterReducer; + return { + url: jupyter_tpi_url, + dataSets: jupyter_data_set, + identifier: jupyter_identifier + }; +} + +const mapDispatchToProps = (dispatch) => ({ + getJupyterTpiDataSet: (identifier) => dispatch(actions.getJupyterTpiDataSet(identifier)), + getJupyterTpiUrl: (identifier) => dispatch(actions.getJupyterTpiUrl(identifier)) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(JupyterTPI); diff --git a/public/react/src/redux/actions/actionTypes.js b/public/react/src/redux/actions/actionTypes.js index 0f33b435c..e70ba3b8a 100644 --- a/public/react/src/redux/actions/actionTypes.js +++ b/public/react/src/redux/actions/actionTypes.js @@ -50,6 +50,10 @@ const types = { SAVE_USER_INFO: 'SAVE_USER_INFO', // 只在用户信息 SAVE_HACK_IDENTIFIER: 'SAVE_HACK_IDENTIFIER', // 用户界面跑到编辑界面需要用的id值 SAVE_EDITOR_CODE: 'SAVE_EDITOR_CODE', // 保存详情页面中编辑时的代码 + /*** jupyter */ + GET_JUPYTER_DATA_SETS: 'GET_JUPYTER_DATA_SETS', // jupyter 数据集 + GET_JUPYTER_TPI_URL: 'GET_JUPYTER_TPI_URL', // 获取 jupyter url + SAVE_JUPYTER_IDENTIFIER: 'SAVE_JUPYTER_IDENTIFIER', // 保存jupyter identifier } export default types; diff --git a/public/react/src/redux/actions/index.js b/public/react/src/redux/actions/index.js index e52b88fc5..74d4dad3b 100644 --- a/public/react/src/redux/actions/index.js +++ b/public/react/src/redux/actions/index.js @@ -62,6 +62,11 @@ import { getUserInfoForNew } from './user'; +import { + getJupyterTpiDataSet, + getJupyterTpiUrl +} from './jupyter'; + export default { toggleTodo, getOJList, @@ -103,6 +108,9 @@ export default { restoreInitialCode, getUserInfoForNew, saveUserCodeForInterval, - saveEditorCodeForDetail + saveEditorCodeForDetail, + // jupyter + getJupyterTpiDataSet, + getJupyterTpiUrl // isUpdateCodeCtx } \ No newline at end of file diff --git a/public/react/src/redux/actions/jupyter.js b/public/react/src/redux/actions/jupyter.js new file mode 100644 index 000000000..3c0fe6e11 --- /dev/null +++ b/public/react/src/redux/actions/jupyter.js @@ -0,0 +1,38 @@ +/* + * @Description: jupyter tpi 相关内容 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-12 09:01:30 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-12 09:30:53 + */ +import types from "./actionTypes"; +import { fetchJupyterTpiDataSet, fetchJupyterTpiUrl } from "../../services/jupyterServer"; + +// 获取 jupyter tpi 数据集 +export const getJupyterTpiDataSet = (identifier) => { + return (dispatch) => { + fetchJupyterTpiDataSet(identifier).then(res => { + if (res.data.status === 401) return; // 用户未登录 + console.log('数据集:', res); + }); + } +} + +// 获取 jupyter tpi 地址 +export const getJupyterTpiUrl = (identifier) => { + return (dispatch) => { + fetchJupyterTpiUrl(identifier).then(res => { + if (res.data.status === 401) return; // 用户未登录 + console.log('获取url', res); + }) + } +} + +// 保存 jupyter identifer +export const saveJupyterIdentifier = (identifier) => { + return { + type: types.SAVE_JUPYTER_IDENTIFIER, + payload: identifier + } +} diff --git a/public/react/src/redux/reducers/index.js b/public/react/src/redux/reducers/index.js index 620905459..9c28448a3 100644 --- a/public/react/src/redux/reducers/index.js +++ b/public/react/src/redux/reducers/index.js @@ -13,6 +13,7 @@ import ojListReducer from './ojListReducer'; import ojForUserReducer from './ojForUserReducer'; import commonReducer from './commonReducer'; import userReducer from './userReducer'; +import jupyterReducer from './jupyterReducer'; export default combineReducers({ testReducer, @@ -20,5 +21,6 @@ export default combineReducers({ ojListReducer, ojForUserReducer, commonReducer, - userReducer + userReducer, + jupyterReducer }); diff --git a/public/react/src/redux/reducers/jupyterReducer.js b/public/react/src/redux/reducers/jupyterReducer.js new file mode 100644 index 000000000..13e807e9c --- /dev/null +++ b/public/react/src/redux/reducers/jupyterReducer.js @@ -0,0 +1,41 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-12 09:01:39 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-12 09:29:49 + */ +import types from "../actions/actionTypes"; + +const initState = { + jupyter_tpi_url: '', + jupyter_data_set: [], + jupyter_identifier: '' +}; + +const JupyterReducer = (state = initState, action) => { + switch (action.type) { + case types.GET_JUPYTER_DATA_SETS: + return { + ...state, + jupyter_data_set: action.payload + } + case types.GET_JUPYTER_TPI_URL: + return { + ...state, + jupyter_tpi_url: action.payload + } + case types.SAVE_JUPYTER_IDENTIFIER: + return { + ...state, + jupyter_identifier: action.payload + } + default: + return { + ...state + } + } +} + +export default JupyterReducer; diff --git a/public/react/src/services/jupyterServer.js b/public/react/src/services/jupyterServer.js new file mode 100644 index 000000000..437fd4e76 --- /dev/null +++ b/public/react/src/services/jupyterServer.js @@ -0,0 +1,20 @@ +/* + * @Description: jupyter相关接口 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-12 09:07:07 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-12 09:10:58 + */ +import axios from 'axios'; + +// 获取数据集 +export async function fetchJupyterTpiDataSet (identifier) { + const url = `/shixuns/${identifier}/jupyter_data_sets.json`; + return axios.get(url); +} +// 获取 tpi url +export async function fetchJupyterTpiUrl (params) { + const url = `/jupyters/get_info_with_tpi.json`; + return axios.get(url, { params }); +} From e1bcd4b4856225f145a6c487450ec547481fb28a Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 12 Dec 2019 11:05:29 +0800 Subject: [PATCH 03/29] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E5=AF=BC=E5=87=BApdf?= =?UTF-8?q?=E6=88=90=E7=BB=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_works_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb index 637155a1a..680c067f7 100644 --- a/app/controllers/student_works_controller.rb +++ b/app/controllers/student_works_controller.rb @@ -530,7 +530,7 @@ class StudentWorksController < ApplicationController @myself_eff = @echart_data[:efficiency_list].find { |item| item.last == @user.id } @myself_consume = @echart_data[:consume_list].find { |item| item.last == @user.id } filename_ = "#{@use&.student_id}_#{@use&.real_name}_#{@shixun&.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - filename = Base64.urlsafe_encode64(filename_.strip) + filename = filename_.strip.tr("+/", "-_") stylesheets = %w(shixun_work/shixun_work.css shared/codemirror.css) if params[:export].present? && params[:export] normal_status(0,"正在下载中") From 0481aa11a25e688afd385dc675d4bc2f8e6f9e5b Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 12 Dec 2019 11:09:52 +0800 Subject: [PATCH 04/29] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E5=AF=BC=E5=87=BApdf?= =?UTF-8?q?=E6=88=90=E7=BB=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_works_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb index 680c067f7..dfdce7bd2 100644 --- a/app/controllers/student_works_controller.rb +++ b/app/controllers/student_works_controller.rb @@ -529,7 +529,7 @@ class StudentWorksController < ApplicationController @echart_data = student_efficiency(@homework, @work) @myself_eff = @echart_data[:efficiency_list].find { |item| item.last == @user.id } @myself_consume = @echart_data[:consume_list].find { |item| item.last == @user.id } - filename_ = "#{@use&.student_id}_#{@use&.real_name}_#{@shixun&.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" + filename_ = "#{@use&.student_id}_#{@use&.real_name}_#{@shixun&.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}.pdf" filename = filename_.strip.tr("+/", "-_") stylesheets = %w(shixun_work/shixun_work.css shared/codemirror.css) if params[:export].present? && params[:export] From 1c02c4ae64bb33e8c3974b23ac0be6be5e485eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 12 Dec 2019 11:24:51 +0800 Subject: [PATCH 05/29] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMDataset.js | 3 +-- public/react/src/modules/tpm/component/TPMNav.js | 5 +++++ .../tpm/shixunchild/Challenges/Challengesjupyter.js | 13 +++++++------ .../tpm/shixunchild/shixunchildCss/Challenges.css | 5 ++--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/public/react/src/modules/tpm/TPMDataset.js b/public/react/src/modules/tpm/TPMDataset.js index 91322d18e..bf9795952 100644 --- a/public/react/src/modules/tpm/TPMDataset.js +++ b/public/react/src/modules/tpm/TPMDataset.js @@ -237,7 +237,6 @@ class TPMDataset extends Component { // 附件相关 START handleChange = (info) => { - debugger if(info.file.status === 'uploading' || info.file.status === 'done' || info.file.status === 'removed') { let {fileList} = this.state; @@ -359,7 +358,7 @@ class TPMDataset extends Component { onChange: this.handleChange, onRemove: this.onAttachmentRemove, beforeUpload: (file, fileList) => { - debugger + if (this.state.fileList.length >= 1) { return false } diff --git a/public/react/src/modules/tpm/component/TPMNav.js b/public/react/src/modules/tpm/component/TPMNav.js index 6b259c95b..12906fe5a 100644 --- a/public/react/src/modules/tpm/component/TPMNav.js +++ b/public/react/src/modules/tpm/component/TPMNav.js @@ -5,6 +5,10 @@ import { BrowserRouter as Router, Route, Link } from "react-router-dom"; class TPMNav extends Component { render() { + console.log("componentDidMount"); + console.log("TPMNavTPMNavTPMNavTPMNav"); + console.log(this.props); + const { user, match, shixun, secret_repository,is_jupyter} = this.props; let isAdminOrCreator = false; if (user) { @@ -17,6 +21,7 @@ class TPMNav extends Component { // console.log(match.path) // console.log("TPMNavTPMNavTPMNav"); // console.log(is_jupyter); + const is_teacher = this.props&&this.props.current_user&&this.props.current_user.is_teacher?this.props.current_user.is_teacher:""; return (
{ debugger - if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { }else{ // console.log("componentDidMountChallengesjupyter"); // console.log(response.data); - debugger if(response.data.status===0){ this.setState({ jupyter_url:response.data.url, @@ -93,6 +93,7 @@ class Challengesjupyter extends Component { + } updatamakedown = (id) => { @@ -162,7 +163,7 @@ class Challengesjupyter extends Component { identifier:id, jupyter_port:jupyter_port, } - axios.post(url, data) + axios.get(url, {params: data}) .then((result) => { if (result.data.status === 0) { this.props.showNotification(`应用成功`); diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css index feb71fa46..d85d6b4c4 100644 --- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css +++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css @@ -49,17 +49,16 @@ line-height:30px; } .renwuxiangqdivtest{ - width:32px; height:30px; font-size:16px; line-height:30px; } .renwuxiangssi{ - width: 30%; + width: 50%; } .renwuxiangssit{ - width: 70%; + width: 50%; } .pb47{ From 154107cf01b4b379a9676f22df09fa6a4f5331b7 Mon Sep 17 00:00:00 2001 From: tangjiang <465264938@qq.com> Date: Thu, 12 Dec 2019 11:31:11 +0800 Subject: [PATCH 06/29] update jupyter tpi page --- public/react/src/App.js | 6 +- public/react/src/AppConfig.js | 2 +- public/react/src/common/components/MyIcon.js | 4 +- public/react/src/modules/tpm/jupyter/index.js | 22 ++++++-- .../src/modules/tpm/jupyter/leftPane/index.js | 55 +++++++++++++++++++ .../modules/tpm/jupyter/leftPane/index.scss | 50 +++++++++++++++++ 6 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 public/react/src/modules/tpm/jupyter/leftPane/index.js create mode 100644 public/react/src/modules/tpm/jupyter/leftPane/index.scss diff --git a/public/react/src/App.js b/public/react/src/App.js index 0bea5bbde..7d83757aa 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -617,7 +617,11 @@ class App extends Component { {/* jupyter */} { + return () + } + } /> diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index a2483ea6f..682a3e3a4 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -52,7 +52,7 @@ export function initAxiosInterceptors(props) { //proxy="http://47.96.87.25:48080" proxy="https://pre-newweb.educoder.net" proxy="https://test-newweb.educoder.net" - proxy="https://test-jupyterweb.educoder.net/" + proxy="https://test-jupyterweb.educoder.net" //proxy="http://192.168.2.63:3001" // 在这里使用requestMap控制,避免用户通过双击等操作发出重复的请求; diff --git a/public/react/src/common/components/MyIcon.js b/public/react/src/common/components/MyIcon.js index 7c6f4bb94..aa9f29a19 100644 --- a/public/react/src/common/components/MyIcon.js +++ b/public/react/src/common/components/MyIcon.js @@ -4,12 +4,12 @@ * @Github: * @Date: 2019-12-10 09:03:48 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-10 09:05:41 + * @LastEditTime: 2019-12-12 10:53:47 */ import { Icon } from 'antd'; const MyIcon = Icon.createFromIconfontCN({ - scriptUrl: '//at.alicdn.com/t/font_1535266_ss6796i6f6j.js' + scriptUrl: '//at.alicdn.com/t/font_1535266_i4ilpm93kp.js' }); export default MyIcon; diff --git a/public/react/src/modules/tpm/jupyter/index.js b/public/react/src/modules/tpm/jupyter/index.js index 5386f4cd7..9433a93f9 100644 --- a/public/react/src/modules/tpm/jupyter/index.js +++ b/public/react/src/modules/tpm/jupyter/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-12-11 08:35:23 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-12 09:26:17 + * @LastEditTime: 2019-12-12 11:26:33 */ import './index.scss'; import React, { useEffect } from 'react'; @@ -15,14 +15,28 @@ import { } from 'react-redux'; import UserInfo from '../../developer/components/userInfo'; import actions from '../../../redux/actions'; +import LeftPane from './leftPane'; function JupyterTPI (props) { + // 获取 identifier 值 + const { + match: { + params = {} + }, + getJupyterTpiDataSet, + getJupyterTpiUrl + } = props; + + const {identifier} = params; + console.log('props: ====>>>>', identifier); + useEffect(() => { // 获取数据集 - + console.log('useEffect: ====>>>>', identifier); + getJupyterTpiDataSet(identifier); // 获取jupyter地址 - }, []); + }, [identifier]); return (
@@ -40,7 +54,7 @@ function JupyterTPI (props) {
- 左侧内容 +
右侧内容
diff --git a/public/react/src/modules/tpm/jupyter/leftPane/index.js b/public/react/src/modules/tpm/jupyter/leftPane/index.js new file mode 100644 index 000000000..1de0062d3 --- /dev/null +++ b/public/react/src/modules/tpm/jupyter/leftPane/index.js @@ -0,0 +1,55 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-12 10:34:03 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-12 11:22:11 + */ +import './index.scss'; +import React from 'react'; +import {Icon, Empty} from 'antd'; +import MyIcon from '../../../../common/components/MyIcon'; + +function LeftPane (props) { + + // 获取数据集 + const { dataSets = [] } = props; + + // 渲染数据集 + const renderList = () => { + // 空数据 + if (dataSets.length === 0) { + return
+ +
+ } else { + // 渲染列表 + const oList = dataSets.map((item, i) => { + return ( +
  • + + {item.title} +
  • + ); + }); + return ( +
      + { oList } +
    + ); + + } + } + + return ( +
    +

    + 数据集 +

    + {renderList()} +
    + ) +} + +export default LeftPane; \ No newline at end of file diff --git a/public/react/src/modules/tpm/jupyter/leftPane/index.scss b/public/react/src/modules/tpm/jupyter/leftPane/index.scss new file mode 100644 index 000000000..d023403e6 --- /dev/null +++ b/public/react/src/modules/tpm/jupyter/leftPane/index.scss @@ -0,0 +1,50 @@ +.jupyter_data_sets_area{ + height: 100%; + .jupyter_h2_title{ + height: 50px; + line-height: 50px; + background-color: #EEEEEE; + padding: 0 30px; + .jupyter_data_icon{ + color: #7286ff; + font-size: 24px; + position: relative; + top: 2px; + transform: scale(1.5); + } + } + + .jupyter_data_list, + .jupyter_empty{ + height: calc(100vh - 110px); + } + + .jupyter_data_list{ + .jupyter_item{ + line-height:45px; + border-bottom: 1px solid rgba(238,238,238, 1); + padding: 0 30px 0 60px; + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; + cursor: pointer; + .jupyter_icon{ + color: rgb(74, 188, 125); + font-size: 16px; + transform: scale(1.2); + margin-right: 5px; + } + .jupyter_name{ + color: #000; + font-size: 16px; + } + } + } + + .jupyter_empty{ + display: flex; + align-items: center; + justify-content: center; + width: 100%; + } +} \ No newline at end of file From d36f297e4d497c8ee07da168f70c51fab5547784 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 12 Dec 2019 11:38:56 +0800 Subject: [PATCH 07/29] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=BA=93=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index efa37066d..1ef5a1696 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -716,7 +716,7 @@ class ShixunsController < ApplicationController project_fork(@myshixun, @repo_path, current_user.login) rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) uri = "#{cloud_bridge}/bridge/game/openGameInstance" - params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last} interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" end end From a1684721bde1f46b868bea57a091c4c8875854af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 12 Dec 2019 11:39:54 +0800 Subject: [PATCH 08/29] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/tpm/component/TPMNav.js | 40 +++++++++--- .../Challenges/Challengesjupyter.js | 62 +++++++++++-------- 2 files changed, 68 insertions(+), 34 deletions(-) diff --git a/public/react/src/modules/tpm/component/TPMNav.js b/public/react/src/modules/tpm/component/TPMNav.js index 12906fe5a..b18a1e909 100644 --- a/public/react/src/modules/tpm/component/TPMNav.js +++ b/public/react/src/modules/tpm/component/TPMNav.js @@ -53,20 +53,44 @@ class TPMNav extends Component { {/*jupyter*/} { this.props.is_jupyter===true? - 数据集 + ( + is_teacher===true? + 数据集 + :"" + ) + :"" } + { + this.props.is_jupyter === false ? + 评论 + :"" + } + { + this.props.is_jupyter === false ? + 排行榜:"" + } - 评论 + {this.props.identity >2||this.props.identity===undefined?"": + (this.props.is_jupyter === false? + 审核情况 + : + is_teacher===true? + 审核情况 + : + "" + + ) - 排行榜 - {this.props.identity >2||this.props.identity===undefined?"":审核情况} + + } {this.props.identity >4||this.props.identity===undefined ? "":配置} diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 744b23daa..b59c4ebc2 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -206,7 +206,7 @@ class Challengesjupyter extends Component { // // _iframe.style.display= "none"; //修改样式 // } - + const is_teacher = this.props&&this.props.current_user&&this.props.current_user.is_teacher?this.props.current_user.is_teacher:false; @@ -257,16 +257,22 @@ class Challengesjupyter extends Component { this.state.jupyter_url === null || this.state.jupyter_url === undefined ? "" : -
    -
    -

    任务详情

    -

    (请将实训题目写在下方)

    -
    -
    -
    this.modifyjupyter(this.state)}>

    应用到实训

    -
    -
    + ( + is_teacher===true? +
    +
    +

    任务详情

    +

    (请将实训题目写在下方)

    +
    +
    +
    this.modifyjupyter(this.state)}>

    应用到实训

    +
    +
    + : + "" + ) + } -
    - {/*https://48888.jupyter.educoder.net/tree?*/} - -
    - { - this.state.jupyter_url===null || this.state.jupyter_url===undefined? - "" - : - - } -
    -
    + { + is_teacher===true? +
    + {/*https://48888.jupyter.educoder.net/tree?*/} + +
    + { + this.state.jupyter_url===null || this.state.jupyter_url===undefined? + "" + : + + } +
    +
    + :"" + }
    From 78ac189f9f8238a301d5285cf76181d5f3ab3f86 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 12 Dec 2019 11:40:06 +0800 Subject: [PATCH 09/29] =?UTF-8?q?push=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 1ef5a1696..ca2dfa86b 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -716,7 +716,7 @@ class ShixunsController < ApplicationController project_fork(@myshixun, @repo_path, current_user.login) rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) uri = "#{cloud_bridge}/bridge/game/openGameInstance" - params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last} + params = {tpiID: "#{@myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last} interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" end end From 25f14a497bb3a5ac66c0001d48857d0a21902bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 12 Dec 2019 11:53:23 +0800 Subject: [PATCH 10/29] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMDataset.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/tpm/TPMDataset.js b/public/react/src/modules/tpm/TPMDataset.js index bf9795952..2d9d06200 100644 --- a/public/react/src/modules/tpm/TPMDataset.js +++ b/public/react/src/modules/tpm/TPMDataset.js @@ -241,16 +241,27 @@ class TPMDataset extends Component { let {fileList} = this.state; if (info.file.status === 'uploading' || info.file.status === 'done' || info.file.status === 'removed') { - console.log("handleChange1"); + console.log("handleChange1fileLists"); // if(fileList.length===0){ let fileLists = info.fileList; + console.log(fileLists); this.setState({ // fileList:appendFileSizeToUploadFileAll(fileList), fileList: fileLists, deleteisnot: false }); + } + if(info.file.status === 'done'){ + //done 成功就会调用这个方法 this.getdatas(); - // } + // this.props.showNotification(`上传文件成功`); + + }else if(info.file.status === 'removed'){ + // this.props.showNotification(`上传文件失败`); + + }else if(info.file.status === 'uploading'){ + // this.props.showNotification(`正在上传文件中`); + } } } From 6bee910e2d8dede153d4799166bb6b07ef09463a Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 12 Dec 2019 12:01:23 +0800 Subject: [PATCH 11/29] =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index 1816b032d..d55eb9211 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -3,7 +3,7 @@ class GamesController < ApplicationController before_action :find_game, except: [:jupyter] before_action :find_shixun, only: [:show, :answer, :rep_content, :choose_build, :game_build, :game_status] - before_action :allowed + before_action :allowed, except: [:jupyter] #require 'iconv' @@ -95,6 +95,9 @@ class GamesController < ApplicationController def jupyter # Jupyter没有challenge @myshixun = Myshixun.find_by_identifier params[:identifier] + unless current_user.id == @myshixun.user_id || current_user.admin_or_business? + raise Educoder::TipException.new(403, "..") + end @shixun = @myshixun.shixun # 判断tpm是否修改了 begin From dc71c78384a8654b2dfd05130b561470023f1485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 12 Dec 2019 13:57:18 +0800 Subject: [PATCH 12/29] =?UTF-8?q?=E8=B0=83=E6=95=B4=20jupyter=20=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/home/shixunsHome.js | 35 +++++++++++++++++- .../src/modules/user/usersInfo/InfosShixun.js | 37 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/home/shixunsHome.js b/public/react/src/modules/home/shixunsHome.js index 3a75be6eb..a495a97c3 100644 --- a/public/react/src/modules/home/shixunsHome.js +++ b/public/react/src/modules/home/shixunsHome.js @@ -334,6 +334,33 @@ class ShixunsHome extends Component { .square-Item:nth-child(4n+0) { margin-right: 25px; } + .tag-org{ + position: absolute; + left: 0px; + top: 20px; + } + .tag-org-name{ + width:66px; + height:28px; + background:#FF6802; + width:66px; + height:28px; + border-radius:0px 20px 20px 0px; + } + .tag-org-name-test{ + width:45px; + height:23px; + font-size:14px; + color:#FFFFFF; + line-height:19px; + margin-right: 6px; + } + .intermediatecenter{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } ` } @@ -345,7 +372,13 @@ class ShixunsHome extends Component { {item.tag_name} {/**/}
    - + { + item.is_jupyter===true? +
    +

    Jupyter

    + {/**/} +
    + :""}
    diff --git a/public/react/src/modules/user/usersInfo/InfosShixun.js b/public/react/src/modules/user/usersInfo/InfosShixun.js index 22c4e7fcf..4816b4ca6 100644 --- a/public/react/src/modules/user/usersInfo/InfosShixun.js +++ b/public/react/src/modules/user/usersInfo/InfosShixun.js @@ -329,6 +329,34 @@ class InfosShixun extends Component{ bottom: 100px; } .square-list{width: 100%;box-sizing: border-box;margin-top:10px} + + .tag-org{ + position: absolute; + left: 0px; + top: 20px; + } + .tag-org-name{ + width:66px; + height:28px; + background:#FF6802; + width:66px; + height:28px; + border-radius:0px 20px 20px 0px; + } + .tag-org-name-test{ + width:45px; + height:23px; + font-size:14px; + color:#FFFFFF; + line-height:19px; + margin-right: 6px; + } + .intermediatecenter{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } ` } @@ -350,6 +378,15 @@ class InfosShixun extends Component{ {/**/}
    } + { + item.is_jupyter===true? +
    +

    Jupyter

    + {/**/} +
    + :""} + +
    From ee9491c61c15213d0a644511f8e92863fe6525bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 12 Dec 2019 14:00:00 +0800 Subject: [PATCH 13/29] =?UTF-8?q?=E8=B0=83=E6=95=B4=20jupyter=20=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/Listofworksstudentone.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index 855f860ef..ab75b6c89 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -4005,7 +4005,7 @@ class Listofworksstudentone extends Component { height: 58px; } .ysltableows .ant-table-thead > tr > th, .ant-table-tbody > tr > td { - padding: 9px; + padding: 9px; } ` } From 67c65148e84bf60a474a69a43a1e708fed44680b Mon Sep 17 00:00:00 2001 From: guange Date: Thu, 12 Dec 2019 14:36:53 +0800 Subject: [PATCH 14/29] myshixun id --- app/controllers/jupyters_controller.rb | 96 ++------------------------ app/services/jupyter_service.rb | 40 +++++------ 2 files changed, 25 insertions(+), 111 deletions(-) diff --git a/app/controllers/jupyters_controller.rb b/app/controllers/jupyters_controller.rb index 1eefd3d53..ab3962cbc 100644 --- a/app/controllers/jupyters_controller.rb +++ b/app/controllers/jupyters_controller.rb @@ -1,4 +1,3 @@ -require 'net/http' class JupytersController < ApplicationController include JupyterService @@ -6,8 +5,8 @@ class JupytersController < ApplicationController before_action :shixun, only: [:open, :open1, :test, :save] def save_with_tpi - game = Game.find_by(identifier: params[:identifier]) - jupyter_save_with_game(game, params[:jupyter_port]) + myshixun = Myshixun.find_by(identifier: params[:identifier]) + jupyter_save_with_game(myshixun, params[:jupyter_port]) render json: {status: 0} end @@ -18,9 +17,9 @@ class JupytersController < ApplicationController end def get_info_with_tpi - game = Game.find_by(identifier: params[:identifier]) - url = jupyter_url_with_game(game) - port = jupyter_port_with_game(game) + myshixun = Myshixun.find_by(identifier: params[:identifier]) + url = jupyter_url_with_game(myshixun) + port = jupyter_port_with_game(myshixun) render json: {status: 0, url: url, port: port} end @@ -32,89 +31,4 @@ class JupytersController < ApplicationController end - private - - def open - #打开tpm - juypter接口 - shixun = @shixun - shixun_tomcat = edu_setting('cloud_bridge') - uri = "#{shixun_tomcat}/bridge/jupyter/get" - tpiID = "tpm#{shixun.id}" - params = {tpiID: tpiID, :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"} - - - logger.info "test_juypter: uri->#{uri}, params->#{params}" - - res = uri_post uri, params - - logger.info "test_juypter: #{res}" - - render plain: "https://#{res['port']}.jupyter.educoder.net/notebooks/data/workspace/myshixun_#{tpiID}/01.ipynb" - end - - def open1 - ## 打开tpi - game = Game.find(2170158) - shixun = game.myshixun.shixun - shixun_tomcat = edu_setting('cloud_bridge') - uri = "#{shixun_tomcat}/bridge/jupyter/get" - - tpiID = game.myshixun.id - params = {tpiID: tpiID, :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"} - res = uri_post uri, params - - logger.info "test_juypter: #{res}" - - if res && res['code'].to_i != 0 - raise("实训云平台繁忙(繁忙等级:99)") - end - - repo_save_path = game.myshixun.repo_save_path - - render plain: "https://#{res['port']}.jupyter.educoder.net/notebooks/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb" - end - - - def test - render plain: 'test' - end - - def save() - # 保存01.ipy - - author_name = current_user.real_name - author_email = current_user.git_mail - message = "User submitted" - - - #https://47526.jupyter.educoder.net/nbconvert/notebook/data/workspace/myshixun_570461/f2ef5p798r20191210163135/01.ipynb?download=true - src_url = URI("https://47519.jupyter.educoder.net/nbconvert/notebook/data/workspace/myshixun_tpm3575/01.ipynb?download=true") - response = Net::HTTP.get_response(src_url) - - if response.code.to_i != 200 - raise("获取文件内容失败:#{response.code}") - end - - content = response.body - - c = GitService.update_file(repo_path: @shixun.repo_path, - file_path: "01.ipynb", - message: message, - content: content, - author_name: author_name, - author_email: author_email) - - render plain: 'save: #{c.size}' - end - - - - - - private - def shixun - @shixun = Shixun.find(3575) - end - - end \ No newline at end of file diff --git a/app/services/jupyter_service.rb b/app/services/jupyter_service.rb index c9fdc71bc..7edcb58c3 100644 --- a/app/services/jupyter_service.rb +++ b/app/services/jupyter_service.rb @@ -36,15 +36,15 @@ module JupyterService end - def _open_game_jupyter(game) + def _open_game_jupyter(myshixun) ## 打开tpi - shixun = game.myshixun.shixun + shixun = myshixun.shixun if shixun.is_jupyter? shixun_tomcat = edu_setting('cloud_bridge') uri = "#{shixun_tomcat}/bridge/jupyter/get" - tpiID = game.myshixun.id + tpiID = myshixun.id params = {tpiID: tpiID, :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"} res = uri_post uri, params @@ -56,20 +56,20 @@ module JupyterService @game_jupyter_port = res['port'] - repo_save_path = game.myshixun.repo_save_path + repo_save_path = myshixun.repo_save_path "https://#{res['port']}.jupyter.educoder.net/notebooks/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb" end end - def jupyter_url_with_game(game) - _open_game_jupyter(game) + def jupyter_url_with_game(myshixun) + _open_game_jupyter(myshixun) end - def jupyter_port_with_game(game) + def jupyter_port_with_game(myshixun) if @game_jupyter_port.to_i <=0 - _open_game_jupyter(shixun) + _open_game_jupyter(myshixun) end @game_jupyter_port end @@ -82,11 +82,11 @@ module JupyterService tpiID = "tpm#{shixun.id}" #https://47526.jupyter.educoder.net/nbconvert/notebook/data/workspace/myshixun_570461/f2ef5p798r20191210163135/01.ipynb?download=true - src_url = URI("https://#{jupyter_port}.jupyter.educoder.net/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/01.ipynb?download=true") - response = Net::HTTP.get_response(src_url) + src_url = "https://#{jupyter_port}.jupyter.educoder.net/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/01.ipynb?download=true" + response = Faraday.get(src_url) - if response.code.to_i != 200 - raise("获取文件内容失败:#{response.code}") + if response.status.to_i != 200 + raise("获取文件内容失败:#{response.status}") end content = response.body @@ -101,25 +101,25 @@ module JupyterService return c.size end - def jupyter_save_with_game(game,jupyter_port) + def jupyter_save_with_game(myshixun,jupyter_port) author_name = current_user.real_name author_email = current_user.git_mail message = "User submitted" - tpiID = game.myshixun.id + tpiID = myshixun.id - repo_save_path = game.myshixun.repo_save_path + repo_save_path = myshixun.repo_save_path - src_url = URI("https://#{jupyter_port}.jupyter.educoder.net/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb?download=true") - response = Net::HTTP.get_response(src_url) + src_url = "https://#{jupyter_port}.jupyter.educoder.net/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb?download=true" + response = Faraday.get(src_url) - if response.code.to_i != 200 - raise("获取文件内容失败:#{response.code}") + if response.status.to_i != 200 + raise("获取文件内容失败:#{response.status}") end content = response.body - c = GitService.update_file(repo_path: game.myshixun.repo_path, + c = GitService.update_file(repo_path: myshixun.repo_path, file_path: "01.ipynb", message: message, content: content, From ba2f2124ad7f59acb6925acccf85d4da61d1b6c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 12 Dec 2019 14:57:58 +0800 Subject: [PATCH 15/29] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMDataset.js | 107 +++++++++++++----- .../modules/tpm/shixuns/ShixunSearchBar.js | 8 +- 2 files changed, 82 insertions(+), 33 deletions(-) diff --git a/public/react/src/modules/tpm/TPMDataset.js b/public/react/src/modules/tpm/TPMDataset.js index 2d9d06200..920e2e8d6 100644 --- a/public/react/src/modules/tpm/TPMDataset.js +++ b/public/react/src/modules/tpm/TPMDataset.js @@ -16,7 +16,6 @@ class TPMDataset extends Component { constructor(props) { super(props) this.state = { - datas: [0, 1, 2, 3, 4, 5], value: undefined, columns: [ { @@ -80,10 +79,15 @@ class TPMDataset extends Component { datalist:[], data_sets_count:0, selectedRowKeysdata:[], + loadingstate:false, + checked: false, } } componentDidMount() { + this.setState({ + loadingstate:true, + }) this.getdatas() } @@ -98,18 +102,20 @@ class TPMDataset extends Component { datas.push(i); } - this.setState({ selectedRowKeysdata:mydata, selectedRowKeys: datas, + checked:true, }) // console.log(mydata); // console.log(datas); - - } else { this.setState({ + selectedRowKeysdata:[], selectedRowKeys: [], + checked:false, + + }) } } @@ -143,11 +149,26 @@ class TPMDataset extends Component { collaboratorList: response.data, data_sets_count:response.data.data_sets_count, datalist:datalists, + selectedRowKeysdata:[], + selectedRowKeys: [], + checked:false, }); + } } + setTimeout(() => { + this.setState({ + loadingstate:false, + }) + }, 500) + }).catch((error)=>{ + setTimeout(() => { + this.setState({ + loadingstate:false, + }) + }, 500) console.log(error) }); @@ -181,11 +202,24 @@ class TPMDataset extends Component { collaboratorList: response.data, data_sets_count:response.data.data_sets_count, datalist:datalists, + selectedRowKeysdata:[], + selectedRowKeys: [], + checked:false, }); } } + setTimeout(() => { + this.setState({ + loadingstate:false, + }) + }, 500) }).catch((error)=>{ + setTimeout(() => { + this.setState({ + loadingstate:false, + }) + }, 500) console.log(error) }); @@ -206,7 +240,9 @@ class TPMDataset extends Component { // //console.log('Page: '); this.setState({ page: pageNumber, + loadingstate:true, }) + this.getdatastwo(pageNumber,10); } onSelectChange = (selectedRowKeys, selectedRows) => { @@ -267,7 +303,7 @@ class TPMDataset extends Component { } onAttachmentRemove = (file) => { - debugger + // debugger if(!file.percent || file.percent == 100){ confirm({ title: '确定要删除这个附件吗?', @@ -288,25 +324,39 @@ class TPMDataset extends Component { } deleteRemovedata(){ - debugger - console.log("删除"); - console.log(this.state.selectedRowKeysdata); - const url = `/attachments/destroy_files.json`; - axios.delete(url, { - id:this.state.selectedRowKeysdata, - }) - .then((response) => { - if (response.data) { - const { status } = response.data; - if (status == 0) { - this.props.showNotification(`删除成功`); - this.getdatas() - } - } - }) - .catch(function (error) { - console.log(error); - }); + // console.log("删除"); + // console.log(this.state.selectedRowKeysdata); + confirm({ + title: '确定要删除附件吗?', + okText: '确定', + cancelText: '取消', + // content: 'Some descriptions', + onOk: () => { + const url = `/attachments/destroy_files.json`; + axios.delete(url, + { params: { + id:this.state.selectedRowKeysdata, + }} + ) + .then((response) => { + if (response.data) { + const { status } = response.data; + if (status == 0) { + this.props.showNotification(`删除成功`); + + this.getdatas() + } + } + }) + .catch(function (error) { + console.log(error); + }); + }, + onCancel() { + console.log('Cancel'); + }, + }); + } deleteAttachment = (file) => { console.log(file); @@ -343,7 +393,7 @@ class TPMDataset extends Component { render() { const {tpmLoading, shixun, user, match} = this.props; - const {columns, datas, page, limit, selectedRowKeys,mylistansum,fileList,datalist,data_sets_count} = this.state; + const {columns, page, limit, selectedRowKeys,mylistansum,fileList,datalist,data_sets_count,loadingstate} = this.state; const rowSelection = { selectedRowKeys, onChange: this.onSelectChange, @@ -382,7 +432,6 @@ class TPMDataset extends Component { message: '提示', description: '文件大小必须小于50MB', - } ) } @@ -396,8 +445,6 @@ class TPMDataset extends Component { file:file }) } - - console.log("handleChange2"); return isLt150M; }, } @@ -418,7 +465,7 @@ class TPMDataset extends Component {
    - 全选 + 全选
    + + + { + this.props.identity < 5 && this.state.data && this.state.data.shixun.status == 0 ? + + : "" + } + { + this.props.identity == 1 && this.state.data && this.state.data.shixun.status == 2 ? + : "" + } + { + this.props.identity === 1 && this.state.data && this.state.data.shixun.status == 2 ? + : "" } - - - - -
    - }> - - - - - - - - - - -
    +
    + }> + + + + + + + + + + + +
    + {this.state.delType === 1 ?

    是否确认删除 ?

    : +

    关闭后,
    用户不能再开始挑战了是否确认关闭 ?

    } +
    +
    + 取消 + {this.state.delType === 1 ? 确定 : + 确定} +
    +
    +
    ); } diff --git a/public/react/src/modules/tpm/newshixuns/Newshixuns.js b/public/react/src/modules/tpm/newshixuns/Newshixuns.js index 8a1be807b..7621a82ca 100644 --- a/public/react/src/modules/tpm/newshixuns/Newshixuns.js +++ b/public/react/src/modules/tpm/newshixuns/Newshixuns.js @@ -4,7 +4,7 @@ import {TPMIndexHOC} from '../TPMIndexHOC'; import {SnackbarHOC} from 'educoder'; -import {Select, Radio, Input, Modal, Button, Form, Tooltip, Upload, Icon,notification} from 'antd'; +import {Select, Radio, Input, Modal, Button, Form, Tooltip, Upload, Icon, notification} from 'antd'; import axios from 'axios'; @@ -145,7 +145,7 @@ class Newshixuns extends Component { }); let newlist = "" e.map((item, key) => { - if(item.props.name!=""){ + if (item.props.name != "") { newlist = newlist + `${item.props.name}` } }) @@ -316,7 +316,7 @@ class Newshixuns extends Component { // 附件相关 START handleChange = (info) => { - if(info.file.status === 'uploading' || info.file.status === 'done' || info.file.status === 'removed') { + if (info.file.status === 'uploading' || info.file.status === 'done' || info.file.status === 'removed') { let {fileList} = this.state; if (info.file.status === 'uploading' || info.file.status === 'done' || info.file.status === 'removed') { @@ -334,7 +334,7 @@ class Newshixuns extends Component { } onAttachmentRemove = (file) => { - if(!file.percent || file.percent == 100){ + if (!file.percent || file.percent == 100) { Modal.confirm({ title: '确定要删除这个附件吗?', okText: '确定', @@ -355,13 +355,12 @@ class Newshixuns extends Component { deleteAttachment = (file) => { console.log(file); - let id=file.response ==undefined ? file.id : file.response.id + let id = file.response == undefined ? file.id : file.response.id const url = `/attachments/${id}.json` - axios.delete(url, { - }) + axios.delete(url, {}) .then((response) => { if (response.data) { - const { status } = response.data; + const {status} = response.data; if (status == 0) { // console.log('--- success') @@ -372,7 +371,7 @@ class Newshixuns extends Component { newFileList.splice(index, 1); return { fileList: newFileList, - deleteisnot:true + deleteisnot: true }; }); } @@ -503,8 +502,8 @@ class Newshixuns extends Component { > - - + +
    @@ -567,7 +566,7 @@ class Newshixuns extends Component {
    this.shixunScopeInput(value)} - onSearch={this.shixunHandleSearch} - showSearch - defaultActiveFirstOption={false} - showArrow={false} - filterOption={false} - notFoundContent={null} - className={this.props.scope_partmenttype===true?"bor-red":""} - > - {options} - +
    + {this.props.data && this.props.data.shixun.use_scope === 0 &&this.props.data && this.props.data.shixun.status === 2?"":
    + 公开程度: + + + 对所有单位公开 (实训发布后,所有用户可见) + 对指定单位公开 (实训发布后,仅对下方指定单位的用户可见) + + +
    +
    +
    +
    +
    + +
    + (请通过搜索并选中单位名称进行添加)
    - (搜索并选中添加单位名称)
    -
    -
    -
    - { - this.props.scope_partment===undefined?"":this.props.scope_partment.map((item,key)=>{ - - return( -
  • {item} - this.deleteScopeInput(key)} - > - {this.props.identity===1?"x":this.state.status===2&&this.props.scope_partment===this.props.scope_partments||this.state.status===1&&this.props.scope_partment===this.props.scope_partments?"":"×"} - -
  • - ) - }) - } +
    +
    + { + this.state.oldscope_partment.map((item,key)=>{ + return ( +
  • + +
  • + ) + }) + } + { + this.state.scope_partment === undefined ? "" : this.state.scope_partment.map((item, key) => { + + return ( +
  • + this.deleteScopeInput(key)}> + + +
  • + ) + }) + } +
    +
    + + + 请选择需要公开的单位 + +
    - - - 请选择需要公开的单位 - - - -
    - 开启时间: - - - - -
    + +
    } + +
    + 开启时间: + + + +
    + {this.state.opentime===false?"":
    + +
    } +
    + +
    + {this.props.identity < 5 ? + : ""}
    ); } diff --git a/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js b/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js index 02a58cda6..61f8c6bd8 100644 --- a/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js +++ b/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js @@ -5,19 +5,12 @@ import MonacoEditor from 'react-monaco-editor'; import { Input, Select, - Radio, Checkbox, - Popconfirm, - message, Modal, Icon, - DatePicker, - Breadcrumb, Upload, Button, - notification, Tooltip, - Tabs, Form } from 'antd'; @@ -72,6 +65,7 @@ class Shixuninformation extends Component { simichecked: this.props.data.shixun.is_secret_repository, shixun_service_configs: this.props.data.shixun.shixun_service_configs, standard_scripts:this.props.data.shixun.standard_scripts, + shixun_service_configlist:this.props.data.shixun.shixun_service_configs, }) if(this.props.data.shixun.choice_standard_scripts===null){ @@ -241,15 +235,8 @@ class Shixuninformation extends Component { fileList: [] }) } + this.props.showNotification("提交成功") - notification.open( - { - message: '提示', - description: - '提交成功!', - - } - ) this.sendhideModaly() } @@ -371,11 +358,14 @@ class Shixuninformation extends Component { mainvalues:e.props.name }) let list = [] - list.push(this.props.data.shixun.choice_main_type) - this.props.data.shixun.choice_small_type.map((item, key) => { + list.push(this.state.choice_main_type) + this.state.choice_small_type.map((item, key) => { list.push(item) }) - let newshixun_service_configs = this.props.data.shixun.shixun_service_configs; + + + let newshixun_service_configs = this.state.shixun_service_configs; + let newshixun_service_configsagin = []; newshixun_service_configs.map((item, key) => { list.map((its, index) => { @@ -386,6 +376,7 @@ class Shixuninformation extends Component { }) + this.props.data.shixun.main_type.some((item, key) => { if (item.id === value) { newshixun_service_configsagin[0] = { @@ -401,20 +392,16 @@ class Shixuninformation extends Component { } ) + + + this.props.form.setFieldsValue({ selectleft: value, }) + let url = `/shixuns/get_mirror_script.json?mirror_id=` + value; axios.get(url).then((response) => { if (response.status === 200) { - console.log(response.data[0].id) - this.get_mirror_script(response.data[0].id) - this.setState({ - choice_main_type: value, - standard_scripts: response.data, - shixun_service_configs: newshixun_service_configsagin, - shixun_service_configlist: newshixun_service_configsagin, - }) this.setState({ choice_standard_scripts:{id: response.data[0].id, value: ""}, choice_standard_scriptssum:response.data[0].id @@ -422,6 +409,14 @@ class Shixuninformation extends Component { this.props.form.setFieldsValue({ selectscripts:response.data[0].id }) + this.get_mirror_script(response.data[0].id) + this.setState({ + choice_main_type: value, + standard_scripts: response.data, + shixun_service_configs: newshixun_service_configsagin, + shixun_service_configlist: newshixun_service_configsagin, + }) + } }).catch((error) => { console.log(error) @@ -473,10 +468,10 @@ class Shixuninformation extends Component { }) } littleClass = (value,e) => { - let newshixun_service_configs = this.props.data.shixun.shixun_service_configs; - let newchoice_small_type = this.props.data.shixun.choice_small_type; + let newshixun_service_configs = this.state.shixun_service_configs; + let newchoice_small_type = this.state.choice_small_type; let list = [] - list.push(this.props.data.shixun.choice_main_type) + list.push(this.state.choice_main_type) newchoice_small_type.map((item, key) => { list.push(item) }) @@ -647,42 +642,56 @@ class Shixuninformation extends Component { onSubmits=()=>{ const mdContnet = this.contentMdRef.current.getValue().trim(); - console.log(mdContnet) + let{choice_standard_scriptssum,choice_standard_scripts}=this.state; this.props.form.validateFieldsAndScroll((err, values) => { if (!err) { console.log('Received values of form: ', values); + let url = `/shixuns/${this.props.match.params.shixunId}.json`; + let newshixun_service_configlist = this.state.shixun_service_configlist.map(v => { + let v1 = Object.assign({},v); + delete v1.name; + return v1 + }); - // let Url = `/shixuns.json`; - // axios.post(Url, { - // description: mdContnet, - // main_type: values.main_type, - // sub_type: values.sub_type, - // shixun: { - // name: values.name, - // trainee: values.select, - // is_jupyter: values.is_jupyter === "2" ? true : false, - // } - // } - // ).then((response) => { - // if (response.status === 200) { - // window.location.href = "/shixuns/" + response.data.shixun_identifier + "/challenges"; - // // window.open("/shixuns/"+response.data.shixun_identifier+"/challenges"); - // } else { - // this.setState({ - // bottonloading: false - // }) - // } - // }).catch((error) => { - // console.log(error) - // this.setState({ - // bottonloading: false - // }) - // }) + let data={ + main_type:this.state.choice_main_type, + sub_type:this.state.choice_small_type, + is_secret_repository:this.state.simichecked, + shixun:{ + name: values.name, + trainee: this.state.trainee, + is_jupyter: this.props.shixunsDetails.is_jupyter, + mirror_script_id: this.props.shixunsDetails.is_jupyter===true?null:this.state.choice_standard_scriptssum===undefined?this.state.choice_standard_scripts:this.state.choice_standard_scriptssum, + }, + shixun_info: { + description: mdContnet, + evaluate_script: this.props.shixunsDetails.is_jupyter===true?"":this.state.shixunmemoMDvalue + }, + shixun_service_configs:newshixun_service_configlist + } + axios.put(url, data).then((result) => { + if (result) { + if (result.data) { + this.props.getdatas() + if(result.data.shixun_identifier){ + this.props.showNotification("基本信息更新成功") + } + } + } + }).catch((error) => { + // ////console.log(error) + }); } }); } + + Selectthestudent = (value) => { + this.setState({ + trainee: value + }) + } render() { let operateauthority = this.props.identity === 1 ? true : this.props.identity < 5 && this.props.data.shixun.status == 0 ? true : false; @@ -712,14 +721,7 @@ class Shixuninformation extends Component { const isLt150M = file.size / 1024 / 1024 < 50; if (!isLt150M) { // this.props.showNotification(`文件大小必须小于50MB`); - notification.open( - { - message: '提示', - description: - '文件大小必须小于50MB', - - } - ) + this.props.showNotification("文件大小必须小于50MB") } if (this.state.file !== undefined) { this.setState({ @@ -892,7 +894,7 @@ class Shixuninformation extends Component {
    - - + } -
    + { this.props.shixunsDetails&&this.props.shixunsDetails.is_jupyter===true?"":
    @@ -989,14 +991,14 @@ class Shixuninformation extends Component { />
    - + } - 私密版本库: + { this.props.shixunsDetails&&this.props.shixunsDetails.is_jupyter===true?"": 私密版本库: (若需要对学员隐藏部分版本库内容时,请选中;选中即启用私密版本库,请将需要对学员隐藏的文件存储在私密版本库) - + value={this.state.simichecked}>(若需要对学员隐藏部分版本库内容时,请选中;选中保存后表示启用私密版本库,请将需要对学员隐藏的文件存储在私密版本库) + } {this.props.identity < 3 ?

    服务配置

    diff --git a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js index 6188fcafb..02ff6a660 100644 --- a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js +++ b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js @@ -29,11 +29,13 @@ export default class TPMsettings extends Component { componentDidMount() { + this.getdatas() + } - let id = this.props.match.params.shixunId; + getdatas=()=>{ + let id = this.props.match.params.shixunId; let Url = `/shixuns/` + id + `/settings.json`; - axios.get(Url).then((response) => { // alert(response.data.shixun.choice_standard_scripts) if (response.status === 200) { @@ -58,21 +60,6 @@ export default class TPMsettings extends Component { }); - - let departmentsUrl = `/shixuns/departments.json`; - axios.get(departmentsUrl).then((response) => { - if (response.status === 200) { - if (response.data.message === undefined) { - this.setState({ - departmentslist: response.data.shools_name - }); - } - } - }).catch((error) => { - console.log(error) - }); - - } operateshixuns = (value) => { @@ -126,6 +113,7 @@ export default class TPMsettings extends Component { render() { + let showtabs= this.props.shixunsDetails === undefined ?"":this.props.shixunsDetails.is_jupyter===true?"":"学习页面设置" return (
    @@ -142,7 +130,7 @@ export default class TPMsettings extends Component { ` } - { @@ -170,20 +158,22 @@ export default class TPMsettings extends Component { this.getdatas()} /> this.getdatas()} /> - - - + {/*{ this.props.shixunsDetails===undefined?"":this.props.shixunsDetails.is_jupyter===true?"":*/} + {/* */} + {/*}*/} Date: Thu, 12 Dec 2019 19:54:52 +0800 Subject: [PATCH 23/29] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMBanner.js | 152 +++++++++--------- public/react/src/modules/tpm/TPMIndex.js | 1 + .../src/modules/tpm/tpmmodel/tpmmodel.css | 8 + 3 files changed, 87 insertions(+), 74 deletions(-) diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index c78c05b92..6f72a2334 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -748,82 +748,86 @@ class TPMBanner extends Component { - -
    this.showonMouseOver()} - onMouseOut={() => this.hideonMouseOut()}> -
    学员评分
    -
    - -
    -
    this.hideonMouseOut()}> -
    - -
    -
    -
    + { + is_jupyter===false? +
    this.showonMouseOver()} + onMouseOut={() => this.hideonMouseOut()}> +
    学员评分
    +
    + +
    +
    this.hideonMouseOut()}> +
    + +
    +
    +
    {star_infos[0]}分 - 总评分 -
    - {showradios === true ? - - : ""} -
    -
    -
    -
    -
    -
    - {showradios === true ? - - : ""} -
    - - {star_infos[1]}% -
    -
    -
    - {showradios === true ? - - : ""} -
    - - {star_infos[2]}% -
    -
    -
    - {showradios === true ? - - : ""} -
    - - {star_infos[3]}% -
    -
    -
    - {showradios === true ? - - : ""} -
    - - {star_infos[4]}% -
    -
    -
    - {showradios === true ? - - : ""} -
    - - {star_infos[5]}% -
    -
    -
    -
    -
    + className="font-24 color-yellow-ff lineh-20 mb10 ml20">{star_infos[0]}分 + 总评分 +
    + {showradios === true ? + + : ""} +
    +
    +
    +
    +
    +
    + {showradios === true ? + + : ""} +
    + + {star_infos[1]}% +
    +
    +
    + {showradios === true ? + + : ""} +
    + + {star_infos[2]}% +
    +
    +
    + {showradios === true ? + + : ""} +
    + + {star_infos[3]}% +
    +
    +
    + {showradios === true ? + + : ""} +
    + + {star_infos[4]}% +
    +
    +
    + {showradios === true ? + + : ""} +
    + + {star_infos[5]}% +
    +
    +
    +
    +
    + +
    + :"" + } -
    { startbtn === false && shixunsDetails.shixun_status != -1 ? diff --git a/public/react/src/modules/tpm/TPMIndex.js b/public/react/src/modules/tpm/TPMIndex.js index ba7fb25e3..bb2aa4aed 100644 --- a/public/react/src/modules/tpm/TPMIndex.js +++ b/public/react/src/modules/tpm/TPMIndex.js @@ -288,6 +288,7 @@ class TPMIndex extends Component { } {/*筛选*/} diff --git a/public/react/src/modules/tpm/tpmmodel/tpmmodel.css b/public/react/src/modules/tpm/tpmmodel/tpmmodel.css index 52a8d65aa..168de71b3 100644 --- a/public/react/src/modules/tpm/tpmmodel/tpmmodel.css +++ b/public/react/src/modules/tpm/tpmmodel/tpmmodel.css @@ -66,6 +66,8 @@ height:30px; background:#C4C4C4; border-radius:3px; + cursor:pointer + } .deletebutomtext{ width:28px; @@ -73,12 +75,14 @@ font-size:14px; color:#FFFFFF; line-height:19px; + cursor:pointer } .deletebuttom{ width:85px; height:30px; background:#29BD8B; border-radius:3px; + cursor:pointer } .deletebuttomtest{ width:56px; @@ -86,6 +90,8 @@ font-size:14px; color:#FFFFFF; line-height:19px; + cursor:pointer + } .tpmwidth{ width: 50%; @@ -111,6 +117,8 @@ height:30px; background:#FF5555; border-radius:3px; + cursor:pointer + } .light-row{ background: #F7F7F8; From d4dcb1ae7f0c142f04906f3fccdaf2c12b2b4092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 12 Dec 2019 20:04:06 +0800 Subject: [PATCH 24/29] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMBanner.js | 2 +- public/react/src/modules/tpm/TPMDataset.js | 11 ++++++++--- .../tpm/shixunchild/shixunchildCss/Challenges.css | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index 6f72a2334..7befed4c4 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -749,7 +749,7 @@ class TPMBanner extends Component { { - is_jupyter===false? + this.props.is_jupyter===false?
    this.showonMouseOver()} onMouseOut={() => this.hideonMouseOut()}>
    学员评分
    diff --git a/public/react/src/modules/tpm/TPMDataset.js b/public/react/src/modules/tpm/TPMDataset.js index ba4b427f6..b7f168e0a 100644 --- a/public/react/src/modules/tpm/TPMDataset.js +++ b/public/react/src/modules/tpm/TPMDataset.js @@ -460,9 +460,14 @@ class TPMDataset extends Component {
    -
    - 全选 -
    + { + data_sets_count>0? +
    + 全选 +
    + :"" + } +