From c7f6a9b5eedd62149c7581fe0917b974d91957e7 Mon Sep 17 00:00:00 2001 From: Rider21 <58046032+Rider21@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:42:47 +0300 Subject: [PATCH] Update(template): lightnovel (#956) * ippotranslations, cpunovel * fix * test * [ranobelib] heading -> h2 (fixes LNReader/lnreader-plugins#960) * icon --- icons/multisrc/lightnovelwp/cpunovel/icon.png | Bin 0 -> 5934 bytes .../lightnovelwp}/ellotl/icon.png | Bin .../lightnovelwp/ippotranslations/icon.png | Bin 0 -> 1340 bytes icons/src/en/relibrary/icon.png | Bin 26486 -> 4288 bytes icons/src/fr/phenixscans/icon.png | Bin 17689 -> 5672 bytes icons/src/uk/smakolykytl/icon.png | Bin 1919 -> 3205 bytes plugins/english/ellotl.ts | 426 ---------------- plugins/russian/ranobelib.ts | 8 +- .../lightnovelwp/filters/cpunovel.json | 164 ++++++ .../multisrc/lightnovelwp/filters/ellotl.json | 65 +++ .../filters/ippotranslations.json | 128 +++++ scripts/multisrc/lightnovelwp/sources.json | 39 +- scripts/multisrc/lightnovelwp/template.ts | 473 +++++++++++------- 13 files changed, 698 insertions(+), 605 deletions(-) create mode 100644 icons/multisrc/lightnovelwp/cpunovel/icon.png rename icons/{src/en => multisrc/lightnovelwp}/ellotl/icon.png (100%) create mode 100644 icons/multisrc/lightnovelwp/ippotranslations/icon.png delete mode 100644 plugins/english/ellotl.ts create mode 100644 scripts/multisrc/lightnovelwp/filters/cpunovel.json create mode 100644 scripts/multisrc/lightnovelwp/filters/ellotl.json create mode 100644 scripts/multisrc/lightnovelwp/filters/ippotranslations.json diff --git a/icons/multisrc/lightnovelwp/cpunovel/icon.png b/icons/multisrc/lightnovelwp/cpunovel/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eb2259fde0b3a520edb183d7ed0c93394df20fd5 GIT binary patch literal 5934 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 Q@&Et;07*qoM6N<$f?QADC;$Ke literal 0 HcmV?d00001 diff --git a/icons/src/en/ellotl/icon.png b/icons/multisrc/lightnovelwp/ellotl/icon.png similarity index 100% rename from icons/src/en/ellotl/icon.png rename to icons/multisrc/lightnovelwp/ellotl/icon.png diff --git a/icons/multisrc/lightnovelwp/ippotranslations/icon.png b/icons/multisrc/lightnovelwp/ippotranslations/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..763b5254c1e18b5dae34cdaf6195085ba1e02020 GIT binary patch literal 1340 zcmV-C1;hG@P)j!8s8RA_;Qtgp?1mWz5MZnb(h5@% z%ybY|mOWWQE{qXe(Wy#EXVTKuDwLq^v|B-U zwUASio%F(RrcBeW$!D~UQH&e0M*{Sc@!JRXNu%aW?vSt*=$mis8I5JKvYY5BeJOpC z;3-GN5Qee3oSslCW<(*qsyGv0ZNEfo7_W*vfn;i9_UA$MERaqJaoCduh7`=jZY}$K{ism0=tD$1*g}e!idp&e=y1t|&k%!t4cmMFHRi zK361jMkBfgqAl}tt4@u98LhIpRTc8oAb!9oFSw$)Dgu05zC$t z62nzhI9BQZKKTC>3ZS1X_wgP9@^W#Q?Gb3uHCLsTXpcab1PUwB9)b390gNW9(zbe! zfJSFoED-Mi#R45m1>_ci*aP>!bchE9^!&{~IOx;_O$c+Nq*DU-ziHCT*T-a{rIU5k zaR@Q=x(`EeF2p|cLysbO*9RAIS@+-^b?75fcqH?FbU3BtFGx;a35*`>QIBAABQ6kY z7@db*`cX$edeRDU04HwZ+>c1@hrVB$qJ0}^qaTAF2gp1G29SplIUfhm5h-aVfl*VQ zsGQJWP*I?*nhGjGVh+8dvn1g0aRX#PtHTfj{zjh!h9OzUAy=^9D_4^QmW^E?uaPx< zNH&E>z1G3Q&Eyh|t0CYoTundp$E7oPe?di!-MYESRK_U0xy4!MJN;wfVbf3Mg01y1Qg+PFFY6Eis_u@ zbvlRHlVd?EzL-2cZB8>|HKlg)q+qk26lCJ!X-%4#wYwJ%Uh#fn_Qa{>>WzU2{G>+j zx5@D|y?=tEYi564$PxCq!sjKB;|ibok1yhUTO>-$PzRQ|s;~UX({^XXwIvI6R9ltY z)jKq@XsMCbdif4B!92Wp#a9@%b-lFNu-rQpV#|VcXE$U&gBG~$bxZDS-ZW5u?dNoD zcWoMAX-5c0)|wCg)(!0~Fk>5nWS3FfJ@09T_MjA4x(q9~>GW9U7XFffN`V6c`>878wx|67k)c>C=(n%8BjR zl>-6-+{T3o3=ZYbjG~cjrk8awEF(NOER=#?R!%;fi)Oy3Z`8hk92*!WBOHTiK81Ey z%d~iRT{UJ{KTA6#uAzUFc}YDm8?l*VXkkzy84Gk~N_TEq-OZft+@qq1RbEIc&cBs~ zd}qM2jFO6V@ZqrF#`_Wg000YgQchCzFqz^j`BpP!%8$>--}@)P5?-+uf2{Le&BCzJO{thjEJl}+PpjjgjalOzG;pGo}s`uh0# zoKB}de@0PJlwn9hw}vSOBq!agdy?FL`wbWWeS<;n=QLKN*l=q|p@wPDz{I=v^aLUX zK5LT(x_tea&@b3m8kc5^vE4$-mIgflqkx1HBvJ)}d#Jo4z&-dxbtRG~DujzC` zmMu!mm#iRXYKmzJ$#^a1X&8w#4PH5pDPRU*_vD^gL0|=(2bQILAQZlYai{K2#f5!^ zTnM2#%L&srw_Bk^C%&_{u#9oX+xxv~!XnC|D9!UcwbC?>Q`@#J7t>aC_4*jJds z*>;k}Yhi3@Zqq!U$<9VUg!ru!xe6o&={1hy>-9?phKj#_4VUxHdDE8S*7dR zQEzmqNhscg0vi@CW)$RlUTp98yLl#!!dS6k-V==?&aHSa2N-EI0Mr=&uk-AOxlCNT5v@A9Y7zdz7^Qcy=;>9blgMY+1u@Qhn-Jj z!KA^X)1IQ~X`<&))j+k$&xiGHxnA$OaZlX@m_r+COjTd5SH+we%^t6%PxCAJ`d0v< zv$FLT%gv4egjny^We~N{<9u^DQ+q)7tjY)Wok3`vVOq$dXv&x z2Ebug8#xn;67$7Sq9|%mCOqB;a#4$nP}}fXGIS zKjx6TS*_>m)m$)0kI~rd*3}KJ<|Tq@cRoCQU2>SH$3+m4EcQx+L=Jo!KXTr=}^_7o2q0Z$K%nWqbUmKR)esXM%timpoFxQhZZD4M;g$Qp_uOgZ&qVw78@f10t5me=TG9R zP(&>f8y3dBnxo>8606~P9MSN7%%RaCwO%{Yc zQPH5Xrrk?h0+4uht+|)z)~F{@{jBW(Ejk z{ch_zV!|wSYXArc09s$s(97kI`9^BCoWlpmN3{rC$|VQy;@Er^CSoekipDzIMzB14NY~ZxUK5>h)~y$ z`sOH{Ok}2HA{Wb-vymU923YF^z>tV#*#jhEUDt^P`}F=L$&Uvjz`(9MfMXP-X##xt zN{K$2jY=~`QOrq$bqAn^qSPfotR`@7Xeqc-J-S?YyWO#&=OUj|Ci3mPNdy4d(`~YV zKf_dLfTHRbsDpxl|Lc$dBB%snbyIZMA0b;MhEZbI%ORQ#nR{mYr36rlu(DF|hrPge zfKX!{ay_cLm|BBUo7hxf=i@3qZDCL=RMy8jNwNH_2T=d!H>KFkh$cD+rHKmk3cF7J z+6lC*qOL`TE%sOr);3B2W1|jv03g}9W(N>LH4Dv_FZZatG=v5jHE}&+YawSo!*;V+ zwF>WdC+af>dw|c!0Q$X;(rM9dTGa~xEZ>j3jzA34=6<_ej|kO0|F$I=3Wn%G?YjWH z^&K55H@t261V|!31K@o220~(Ut*9hHGFDgz-vRWfb6L3q37Cx3 z2Z(J>loY<}GpjhA27*BV)QDxjFa)A%+iKAjzCIH!>O?d~e)0=|@CGLh&?E%_bOcWV zX1db$fOYQ)N`;%D_F>em=8pir&t_x!0ucFVx`QJDI>J@}R9@V6BP$J*&5)+hirr{W z&-^wP0GqPwaFihdmx!oAwBJh|fN(m1lI(WR1hQN%M+i|}H>+;|t{_M77ZbS-0T==H zQit<7w3%E+WuHElgRlFgw-kojR1p9O-438qPPFwGKqa<9;js&PoF%P>@ntdYr zB(kU)BwF3IZyf;n+Rid(gEJPmOOwGT%I3rH=<*! zAQBqLP(r8B6>grIo?Lvg9^DetC{XETVUraF-Rk@-0blRZE|kEbgt&ma8TJ!10U*Rt z0DQII-~^38c&2GKwrzElew1u@?9Er+6VMl9c*275eMGL6T0C&+_*1&!_0KMf zvM6jiiR9xQqzn^g8R)+cBS43MWVb~1=SqeEI<8tT7c0*Q$0quwL5_l7_@i^d z@1mcsV0lRE&a_h#OOF;fD8@e7Zi_zz*h-G{fc>;O5+%~q$UfcC1P@B8NKPJ}>4wSS zwBK#F=C*Ndn@d2T&R(qqfJ=a5&YzK^io;FxCr=mCm5c{8f6qxZ^K$VVBS{jcEbX_q zx9L>eE&Z4x?R;x4xupdA%YI+jd@u~!6D5jDtX@&s=qMN2!Sw^j^Df7*h(d@qiV_p| zC)4TI$Mb&g$0V@iJ(525SfE(f>;7~pZFzHs4(-E49>5mZ*dUf|-*T}N)tu9HkAi33 zO-tu*@9)!J+^qhX`gE{1n1cWT-PkKq&XIr_&lM}roUabd48P6Siu(8m9We-zuAT^S}Z#7BZOgT<^4`~l#!;fBuVsN{b9m1 zu!3iR_%RW#Dc!H4vtra6XCGTZX`I6F7@Z-yX~>h4&Xa#*d`>`MGF+IS#_2V>B2VmP z-KQhzYwSjJgEkDqI8EQD)6cK}5mFHo?(;!OmaWIexd{O+1vYM`uX|a|Iy74 iTG($>v2y;ssQ&>sFXUe${g?s(0000K-j;DP)oHvf+#9EiYQ401q4J9j3o4W@M zvj_+P4~T#Y)cpeDVMtj;E02(p) ze`x>zp#wtVA^{L~-div7Zw>!tyzzTYkYPkbFl1a5W#Z$4{S)E>WJ3c2{zuJxARagZ zGhhg000TtqU5q{D0u=Ygcn}AIfj>ytn*)F>2;Ce1XYBtMOJJlV{4*Ox$E3!E28Sfj z6y+6Eq-iF5Wz(DzqN5lziDZU0d$BSHfhQSppGT4Gcn zBaY@rGm2yQC4?q1XhzYIk|p$?YYOi(mx%MFd0#GU&4Z z^x_|G|Lx9yc#IEHQv5F$L^K2dwXnPULlgi^835bIcX$6Z?e1=$-s52&fYGS`#7Cb3 zKz)7BfBZi_kwyS0`2Y;u{EyGS3V=(80N{KUkQkTruaD`!b^|a#0u(?448ZN3Bf{QE zA_L0aOJ=|VSOFVg2b_Qla04E|3;2NmpaDT33`Bq^5Cal`4kUrp9!s)74#@9Or393L z3Qz;;Km%w3EuaH*fgaG`Kr3hi?Vtmk z1D&7?Tmapm2lRqI&<_T{C2$#B0Yl&_7zQI?6kG>m;3gOc6W|uO1MY%*;69iH55W|8 z1ZKcv@C3|)Iq(cT2lL=1SOBlUYw!lV1@FLnumV=W2k;4e24BEe@D2O`Kfwmr1i!!* z_ye}V4%met2!@al3c^5G2oDh;5=4e55Hm!DSRpou1LB0ZAs&bi5`bus5F`wVLSm2v zM2Dmx8AukAhZG3(|&kA$`aIGJ;GXQ^*{$gsdPN$PTiH93f|DALI(T zLmrS9eMM2R}EEEqVLP<~xbO1_+GNCLe2g-vAphHj*bQn4U zl|aX#Qm7oNgsPw#s19m?8lfiW4AcU(L1&?JP$zUA>V|ruK4<_MgswnWp!C&C-@H)H+Z^7H}E&@iN5Lg5rK|(MgSP*OoP6Q8vA3;M1 zBg7DNgfv1Hp@2|Es39~FItV?4A;JVJTRpO^9Yh8=?czh3H0HL<}GPn+kpv_KNky_DIgz|b z0i+O86iG))Bju1vNL8c;QU|GzG(wsoEs-`z2c$F773qoeLHZ*Z$Pi=%G8!3=OhTq2 zGmzQHeB>cyF|q_%imX7^AnTE*kY|u>$PVOrWDl|*If%T996{bdP9X0hCy|ekPmpuS zdE_hP5^@>&0l9|!j$B9nMsA}33W>s^2q+4Q1;viyM)9MBP@*V0N(QBXQbwtxv{Cvf zBa|7+3T20KM7f|mP(CPsR1hi@6^V*PC8APM8K@joKB^FP1a%x$j;co0qfVikQSGQs z)CJT<)FspqY6NuybqjS5^$<0Knnk@pEuxlC%czg2FQ}iWU#P!mfJUORXd;>k&5Gtk z^P&aOqG&o=2CaZrL2ICO(S~SKv?baW?Sytkd!l{O0q78P1Ud$tfKEkcpmWd#=)>p| zbSb(DU59Q&H>2Cpo#-BPKl(Cy7(IrbK;J_@L_bE)q36-B(eKb7&}-=L=uPw=48R~U zI1C9x#js;|Faj76j08poqkvJxXkzp*Mi_I94aNcEg7LukVgfKBm`F@4CJB><$-?Ag ziZDkprI;#A9p)6K1#=d29&-_M33C;59W#Nsi+PB7jCqE6iFt!r#(ctj!>nVrFuPbJ z7KbHasaOsyFIEsMhLys~VU@8OSY50U)*Netb;P=2y|8}RAZ$1`2AhaIfX%|@V~emQ z*fMN2wgGz@+lKAL_FxCFL)cO5IQA~~A@(u$8Fmr-7Q2dF!~Vej!fxXbI4q8YqvAMl zd^jPTI8GX;fK$V1;|y@7IBT2(&IRX*^TP$pTD~a{Q)5Lb-1!6yOh&V>PO`Ie? zA-*8KCaw_Ii0i~ZB#4A1kx6VM9+DtQf+R~)A!(5eN#-Ow(ms+G$)6NTiY6tI(n)!w zBGPeEC8>ebOzI%@kS>viN#mq@q-oMK(jw_S=@aP(X^RYzF=R5Cjm$$9BGbuoWL2^b z*_doeb|AZveaS)O2y#6606B+TNG>5)kn723$Q|S!@*sJbJWjq(o*_Rczb3DczmPY` z+Y}^)K%r8&C^U*VMV6vM(WV$tEGZ5YH;OMMh!ROjprlc9DMggylxj*NrIpe}>7xu$ z#wd3wk0^7LMap~1XUaO|FB5_Z&qQV7VxlpLGs!WjGU+fGGg&h^F?lfgGleq6Fr_eM zF&$(oVX9ziU}|PM$8?eD3eyTm6?ZGm|2opky(S; zfZ3ecp4pYzmpPa@iaCingSmkDD04Y;J##bjIp&MZL(F5$cbTV|pE18?USP=-(BdLkh3~E002(_GAPi>}lQv0Y^sW++jsgJ2I zs7ut3)F0G8EC?0?3kwSmi!h56ixP_#i!qBei!+NCOCU=GO9D$eOFqjHmU5N`mKK&S zmVTCNEaNN>Se~*hu)JqkW7%NYWyP>kSUFf}tP-s9tm>==tQM>etRAfXtYNJ2tZA%y ztVdYOS?gI_Si4vUSch3BSRb;^vc6(nVg1JXn+;;avr*Z2*o4`n*_7FI*i6`L*<9It z*+ST2*izYY*bcLmvDL9PvvsodvkkLNusvj(V|&H6%J!XYiygsEWM^gPV;5tWV^?F> zXSZN?WcOeXV2@x=WY1(j$bO8yn!Sm=gZ(1=5c^H`2kcMT7ui?Xzp-y|AUKE|tQ>qC zVjOZD>Kq0fmK;tTUK|XLD2`-~Y>pz1QjU6#7LM~AmpDc_?r=Wt{b#t(+G)2RX+$?{PlnT;N>h{K~n- zh2SD`v2zJ<(YX}4w75*TY`NUH{J6ro61XzC4so5}s^x0t>f*Y@HOh6DYliD3*L$w7 zTwB}-ZW1>;H;r48TZvnT+mzd$+k-oRJCZw@JBRx)cRBY-?l$fo?ji1R?n&-B?l;_@ zxYxONd2l=|JbXOjJn}r6JjOh>JZ?PxJP|yJJXt(NJY_r$JZ(HZJVQL=JP&!E@htIt z=Go+hcnQ30yaK#*UL{@~UNc??UQb>IZw&7N-hAE?-fG^{yq&xQyw`c}@jl^Q{)@M-ax@Y(Zu@CEWk^QH3T@s;pZ^PT4F;=9Cmo$o&1Q@+=HANkh# z0Y9FfjbDIYl3$r$m*0ZliQk7mgg>4?gTIi!jK6`uoxhj=8viZ+Y5sZsW&ZE{e+4iC zQ~_QAaREgEZ2>a@M*%N^V1YP+bb&(xr2-8CZ34Xl*92}0ObfgeSP}RkutUSrSZMq- zI!&3TN3*0k(|l=Rv_x7qt(aCxYoc}1F44wl4`_3=CE6P8w;)oGBFHT$Dkv|gC1@(> zAm}9+EEp%4DOe;}F4!p8A=ocCDtKRTR`8ABXTe`WNFj<4w~(liypXn#nUJH9k5H&k zf>4%Fu~4N@lTeq?pwJDWheFSV-V1#b`YVhTW)T(;mK0VIHW0QJb`uT|jut*3d{Fp= zaD#BWaG&sq@IB$D!f%Avgnx^mM3_W)MI=O&MD#?gL|jDtMWRGfMG8bth}4U;i}Z<% zh};vI6Bi?xgOiH(Zg7n>7%EA~}vTO23OCN3y0 zBd#HCD()!mBOWH6B%UXJOuSCKO}tNhRQ$g9Gx2xg-^8~i@Dl72!V+>4S`y|G&Jz12 zA|+BK4oZ|toRl~xaY^E)#FWHKiB*XWI!vd~dFT>!Wx4^~hVDTRrpME>=||`_^j3N= zeT06WK1Y8?|3=@DBuH{fibyI*>PlKlx=IF0#!6;L9+s?WEa0REt!v)QHr5sb^B}rG7|5(qw5KX$ff+X+vo{ zX)oze=_Khq>EqHTrO!zZN{>rVOD{@)mfn)V$gs)?%E-xR%UH;`$OOv7%4EtE%hbrU z%3PGWE;A|fLS|KFLl!B^EXyw|Evq4GChIKgCmSuBE_+zEO14F|S9VnPf$R&}71<3r zgdDRRznrw3rkt7FJ~@B67`aTjV!0Z*Hn~2zF}W$ZmvSHFe#@ifS>=V~<>Ynbt>oS1 zgXI(CbLEfApOo*Ezbt=C{)zmO{5Sbs1(E`{f`o#qg0X_5!hVG)g>;3(3e^g&3VjM= z3R4OT3ZE3V6tRlziXw`Niu#JSie8Fgim8f+6e|?ZDE26hC_Ye}SNx#(O9`#SswAwW zprof{qvWL&rj(*|P^m)cj8c!%sM4g;ywXRd-^v(ec4ZM|C1nF;J7pi`2<0^8BIRo3 zR^@)>8_Ltluav(iZ>tbhxK-#XYAU8G&ME;aaVps=$5a|rI#q^L?x@VEEUT=mB2`&b z1y$u$^;B(Dy;Q?h52zNYR;jkC_N(4hol$+Q`c-vTjjYC}CatEWW})V$7Oa+}R-jg{ zc1EpN?Yi2O+M?Q;+O|4Tokv|#T|?bm-BmqEJyAVhy-fYIdXM^b^(pm5^)>Zv4Wb5* zhLnb;hJ}WkMzBV*#zBn=jb@ELjT;)%8m~3JX#!1(rhulbrjDkKrk7^8W}4<<&05W~ znuD6RHD@)KH8-@-T5MXPTFP3+T25L4T5(#rS|_xcw7RuMwWhQdwZ3TWXp^=1wPmz* zv~9G#v?H|BwTrduw9jc@(Y~wwT>FFeZylTtmkwP=L&sdlO(#SrMW;}wTBl9tlFlui zS)FB_OD&02SOS-poXLXl#H}x=j9D3q{C z8QwFTH~eh4ZA3N_Fp@LUH*zrYGm10HGb%S~HtIK;Fq$=5Hu`0ZGv+pyGS)J-Hug4- zGR`tSZro(tYdmH=WBk^5-2`pIVIpCoVPa|GX%bgUg%9O)Y z!c@c5($v#5!ZgG5nCU6g9@88)g_YPBXfhmYKDgw^@`~w%G}@(`J2U<7Q9I zR?L2zq%q!(T^=qmZMrqnV?JW29rYW2s|{i@J-Ii?2(ZOMy#` zOQ*|-%Z$r=mn~P4E6r8e)y&n?HOe*DwZiqR>s8k&*Cp3YH@q9an}VB(o10sNTee%7 zTbtVzw@J4*ZtLzicRqJ{cVl-q_i*TJa8U-9ts{N9_}6y9@!q{ z9_=1iJ*GU~di?SvcnWwbd7628dPaNZc~*Iz^BnP<@m%)&<3;fj_EPh*^4jl};8o~V z@73*f(`(M_lQ-ne=1uq3@pkZLcpvaC@jmT6;C;_~(ffxF)`!9YsIP{vt*^gtvTw2PDc?TdJH9V{zwbxy=h-i}-*~^<{>c5g`z!aK z+ds1Z@&48Q+kR9(aX&3Tdq0NX0lyNzGk$}95By&HZTJ)XY5pqy7XCi|@&1MW4gS6U zxBOrDe+@tda0kc*7zelqLh6QE?Rs?ngjs!jq zTn*e|urTNhU4|1Qgpt80W3)4_F{T+SjO`$5ka&@Y&$u;K#wM!Mh=>A(A0_A^SqYLb5|DL(YX<4|y8$DHIOn2$cyn z3Uv#O3e69#3B3?H9{M8mYZy9=H%u|iJj^>RKCCFLF|0rAZrH1^jc{VPP`G-yZFpe# zf$-zut>IV0r^8pmcOqCLBqQ`ATp}VOawDoE&PUvgcpmXJ5*^7KsT64u=^L3CSsd9E zIT$$^`8IMZiaAO=N+-%GDl95Hsxqo8>PFPFsISrJXx?b0Xp89m(Mi!qqR&KMj-HBs zAH5yJ5+fO-ALAMm8IvDV8`BeWD`p|)XDlIBC{{hzE;cAOJ+>^iBX%@)Hg+uz8OIZ+ z7-t^m8yh_+iBqxd`>LfZRh9~AG)+BZ(-b!3Z+(;rNi6m(yIVOcA zw2-u(OiUI@)=G9v4ol8Su1@YwzLmU?ypcjm5lzufaZU+O$xW$E=}Ebh@+#$5DkW7s zRX5coH7d0rwIQ`H^?vG7>YoEF2P6*|9`HC2d!Xn*(}BSQQwLVkKpIDyT$)*$Z(34X zNm^^#aN5(fwRBWEU%E=VO*$hzBfTQMD}6kDKK*9~F+(InJHt66A|pSeKBF(=LB_j` z?M${znM{*R@65!^qnRz4!qkvK%QD9Ku zQ4m*9T+m!_t>9_FmxI`Yf(JDZIvtESSa9&`42O zu_Nu|md2JAm$sIUmOd~2Sw<D&l%Qk#;?;)L-qp#~rPW>4x2u<`cWSt5lxys2!fFa?PSp(6 zJgxawORN>IHLUfiO|31jy-<6%_FWyQMxbF7Q3E39j-8>xF661JpPyWBWNwsh zG;a)O%xbJ_9B7l-H@0Q{|_+Pu)AU+=OTnXwqzQX^LwqY3gX2XnNhW zeVXgE%4vtwk*AAJx17Fy`sL~0XV}gtoUu6*dZyq^)0t~$o}F25W^R^gwrFNF=QN*e zzS8`(`FjhwMY6@LC7>m%rLJYL<#Ef`R$?o?)uh$0HM6z0b)a>o^-CL}O`^@XZGT%v zTTRe&WhK?&8vmHOqF`bh+XL&C8T;91;=dPW5er~gqwNt*+rZcSbP-k=J_0EOPKV6(% zDqW6U(OpNn&UQ_7Eu9DF`Oa&ecRinQzV!Ts^Y_oMUO-=R(?r>I?lBW-ff~ zCUr}8n|Cw1bGsY6uXR7~-t1xPQS7nriR?Mt)7~@Qv(yWE`Fpi`-FuUI%X@ozANGE_ zh`%U)(d454#q5hGFAiONc5$PRwNJ6nt}n8$xUao$qVH`#+%M3t)9=}z+F#k<*FW9= zb$~n|Jzy~qJWw!jX5jk3;=uMLo=X~+TrVYFD!bHk>EWf%gM>l)pxGc}FmJGFaAff1 z;GfG}m(?%3Tu!)Ldb#`Z?%IKBFE89anLz+WwLrFswLl=i0 z4Sl^zzAAIo>T1~4!mF)U$FDA3gRjx9>0R@_mVT}7+U09=*EWXPhLwgLhhvA24WA!= zF#K@@KSCcd8wnaI7-=3E8+knnMg>N7N4-YVMr%hekIs#5UT3?meBJ4K-1QUJyRSdI zzBWc0lOD4g3mYpMYahEc_WlOyhR6-08~!(PZk)O?dSmg%&P~3X+BZFKrroT)dHLqt z&CPL+anau5VB+&F;w|Z0R=2`$9lq6Z>&~s! z+t}L@x6N(`-#&P|_4fGfcXv>CMD7^h3A~ec=ggfOci!BE?+V>Dxa)T}=Wf&8(Yvqi zfqS%j`uBYAW!-DMH*#=_&msbaPq zlLC`^lfIK#lZ}%jlZ%tP4`~neAMSsc{qWSo>knT~K~sWLhEx7ixl^a7ZcHsbLOc?A zWc-NnsNhk{qlriFr!mvw(`M5l(}mM#r|(REn8D9T%~;Pw%p9HRnwgwgdrWyO|JeR< z?BmkMy^m)e|9rywMCFOgljJ8=PX?bnd$RSE`>EDbucsMLPd*)ax;P7F1!oOs17`DQ zTV^L_m*=o^^f}A9@VO&%U2~IjU!E~NQ+Ve1EdE*fv;JpKpZ$8y^<4A0=kxUEC!dcz zfAs=-A@sud1>?oR7ws?Zy!bFrn3tKiosXVBG2c7?cz*pQ`%Cqg?l03`*1sHnxwrr= z2rU>dFcuCiv@hIU__Rn`lv}i4j9V;U>|dN+{QZjimGS6Q!`Ufp>0?ltmP5}-l)BCe{{e||$=u6O-qA#6a9)9`$mF=tgSI@7RUz@&;e_i=T_$K?!;akGD>Tg5e7QRE@ zMZTMV5C2~Bz32Or@4tTV{LuU1|D)i?*&p|ReErGtQ}w6E&y1fArY+?yx2^Q8Q(HH;R{jwG$p3Nvlk%tj&*-1Gf3bh1|Jwge z{9E()+TYjPsBQYT&34>&<@S~Bg&lZDe8*}hdZ&D6aA$rO?27JM>_+aE?hfp}*xmj2 zzmh#e{4<=H1;9BS0P6<;)YJkX77PHz>;D0*qMc)+baiY1000SaNLh0L01FZT01FZU z(%pXi001BWNklprGOS@KB1zLfUC@~Wx7yu&YoF?b#>D*o6{r`Wf z2Lpga4|i$%>^bj}jhX4LuDbPy?~nHu@c)m0*P+!r;NN5Pb~WQn{}{SEnl;DuwC?68 z7W8yuCNqOapWElw`~Jlv8j38q@#;nQR7%A{W@e_-Fv6SQR)1b97o*{5^4>@!QtoJp zx=raObhNc-sdSfBvE7}TX6$?TXFu(KdfVa0ETfA?|iVq)Tw312+^RT)r|hL%(u&FO?*s=|v{p0;S=0#qH~eH$CRw}0Xh zZ|-+A?cyl~)^;_8oJGr*;nay!UO3>sGa89>M52*WDi!O9MI*^Tz*rxP$7Y(6!4@N6 zSf1wvg25oH01=;vZJ8PZI^19+r9~p9N7rD!>l$2-E{Jd_2+}mqbsS`K1x?p=&^hTK zlNe-b`I3WT1xO^~PBxbx4+TSyr&5Wd_x*yp2o&VPsp`hBFeI&r$5l%60f$mrriJ&)I=;2iii}an^Ul?2oXs~&@$k< zE_5QBCxeOXp=wv4c`gyvAUJc8o0);38?eF=goyAaX^2OBaB1##wZhl}I+i5?#X^q% z^mN_wgi@ZP2dpS6q$$aUMnq$&-0uCyt$4C=(1Z28y}S2h`p=#G-lNa%8LW4swNaM= z>CRDT7cU~& z)AGgX@lDZC;JSv^wA0koY-l>s%C^@9iONBeS}R~677K&a9swe9G#VqixL&DL@*LZS zZ9Aw|s+t}!HI{16wdo&%kVq5(GXTeNv{mCVxG>a)43`l zKy(nDvjQs=l8IY%9?PQngyS#*LFNm}<+58M2_&{^v3Lrj<2ekCW-vKjz}YjWP98mR zCga(agG&}J`omv5{!I3A1ggt`%MZPYW?bxON%mS^xiOO~6`PY*Q=+ls52~J9p^2|u z(3*6a7^!%CQ6$mm!Onz3kr@3QA$YJz{h3D&t2}hWL?jeoSg=X(NSbwxFxikR(M&zN zj6$)bl`B<&st{`e6H16yruPiFBPJ4Gvs!Tp&%<)8Nq@`D(lM2C1;u=h2ug&nmXXhw zNXt`T4Rc5f9M=(ITUHn*2}8v;FgP?y=L{lGN^7pA#;qWx!?2W;I7K;*GSpgG-kBG#>XiUUJ&7(vF7N-gUf2o+H->ZblMDT!4ch9flVF<+11!x9D9#9uYi9_uQ1Qv{)plheBaGciCful1!#5R?xaEZF$sXK)GC4{D#{${l z$@9$`w#V;jA;M#tvk;1zVVOEfye-71w-6*LH;A!xzoc+vYsmBvkLYtpaGT&=ycf6P z2xPDkCANYku}Vz0?J5d|EFEXiaX=xP#i3(oFg%u*dn6uVDw{*TP(ph;i8u+()YKF_ z%|(fr9VNc5S+;=S3usQ7n9AE2pUxmn0!Ej@bisu|^9`9cCWHi`$wS!Z>~Aw9}Xjc~vjZOwe0elb&16>g8e~;Fy+Ib?iVkTVUMO!Zisn zh`2N>#%+skjwRW!EHb1)!SQT1Lxdv&(~ED&Wy{9^%-CFE!j8C@ijftkGx`iHR86rxlZ7Hoy*tPzaCd@RF_P0Vu05=7!L!FDqk6`$Rv zTgv826qIF=A;Oo6MP$YXFg-mf#!#p8FIm(@nwdj^=9WxEv3S`sVp@X4%_3Nep{u9GaS9xN1=XolP6@izjwq`_99p zK@l{sXru3x@%;89Brq1%FKtDtF^T>AhOpzr48fX>jVoJWQcT2xP$ni&6hpzLc0rK& zN~10WHMh2J^0WZwLgsK&BdHagI)Y>>i6f^536^YJyRsW=7pIY#o+6+jVBaw^~R|{CSxC<+mG*YxZhO;O838#s93Gy@s`Y>^N7zwQvJuCV5^RiDlkB+At|17U;& zvw!{486ob?*Ds}OCWvt*oEezFbas>&)(9_{z`m0ifmFjv$-SN&C(mjmL)st0+TJLx zTGR0(s6PdvojnFVLI>P+dtfb7j~bd??uR) z3Ud%AwutY*Bkf@@2xtLubs^~rjReS&pD*ki#*uSbf==ZQPfn37A`Exv95BcLbFe6$ znG1*Pnn8055Y$x41;i=dNhQhurwGlUmlf2J3|j=Dpa892E^!_V2nd>8%1ZA7c=Kle z)#)ZVl~N`HIZ7TuoQO~*ZZ(ti8z`bHT}8smpgHBCC7Hm|CHIQ=R3(EOB7@xAOfbd- zB1Z5HcXoB)(5Vvs?u*|-Pgg7Mx$7F}&J_9iE*&37p&G(hzWESd+;ax8L>D;?bkj6r znUSY#7f+Q!K9X(~S3trs4eAeKiWS9JmTUzM)C_eBg z?l8%#dU@YzgabCNTiQ(UsZk_vQtVOXNRqBs7vbl_0H@@5q{A1TOY_dZ;a%{V`a>l( z$xSPk2@c3(AeXR%jO*_{_-+c!rpbL{!$+}1*pTEF>ybuop2ql_s}ci=_#K_tci=Ss z_6t8i_ktdL^gq8FsYsQiG=PcW3GuhT^39)O%gbjFjy6f2M@X)zmrTM_^K+rkO1~!b zbR^DDg5(PEbaE#>$&osIG`+8j_u~o^4Y@Pn4|zMTe}5G{fdePUv2JlQ#SNZlWPu!t zD7m(VSJwvDX8?Qi^dn368eyq}x(A6^d8kXg8mE=i7$gl@GP;}&n4X-FAccdlwzf9x zKX?v3Jsq$DB?;6rs?gaRQG&a|9pz#8+_d{cpy9`n~(f3o7B0pZx|N-MSC) zSOY%#$$x}NH^hO^XTJCy^6g7Fd1e5o`$xn92$+qq!VMzXGM7tg3IA(Dcjul*yWqTv z{OWIpHKH^|rYfX`eOS^F0<$t(tU@O{%z>qPvT&Co6& zx(`0YbWO5c>LvDuekt1;PSE^%I~&oOj-yDyWVYft!{gb1DikZjuW~6Fbs4Z};|6Qb z!6Wy&mE7{T-FGK8Ubjl?q)>iva2TT_69|(uD{atTp_-+jiqisb`>hRVNyjiWIEgju zR)B(83Too$ADSRL;gAbDiIIss5jJ)nCdBv&h)L?&v`iS9aw7!|g;E#Wpw~XmOSLcC zHHczk!Q9o=C!As_SIbg6Fbs;`$(xH16mr&-?L;&j#gU`O(bn96$xPW9B?e^cFrY33 z?cKAl5{}06Pi)zV7hl}rty-~IyZ`?Car+&2;FrI70uMj@C@7W^!m&h(_;_=2P?}1v zC1Mt;#XL?AWy#Hq5CbOgzTde6x7>CI-tz8`!X*N8q|C=^k`?tts$Hp7)e>~%y?6?R zJxyJsrhhe9nD01m!#tIv;@`#K+MKx+tk=9M!6&(}^sY$+U%PZ6IOWcPU?bg6V~XzC zjN`!3v)Ff}A7xN4^uocYwGT^KOe$j*}iYDO-~Bn+VVz$8YPLB5tphTTA#BHTzMM6P57oo#7~ z(0kyPvlPAODB6$0(mg2*ak7x_AzeTTu5WVxWkxo`gGOY1r8ilfr z9ea;p`;MKs^`@(EA3@V+K6xd!Y<&SwKKZQVax6BM*9GRS{uI5`y3HS@q7q`;5Z*I&?K&B$R6tk0<92=)2Nh_lPiA!vgt8+!kX>nSd&Anp=1&sEuo z62&jY3TYO<@6^Yjx(r}Njgq0S0Rdk~6SogS0MjJbi{R<;XAhB2egwDQdM$3eW(_vo zbPWz2J%jH(^ed2eiNS$kq~Z%C_wJHW=495LZ@vqUZSO;gFjZ;>t}o3s(rcbiOKldj zB>?oJWd6)1IB=aZSnyc7IbF;yD&soShl#)v9k4sOwFSJlAx(db0wM>j_W%S zmmhT*5C@aQ(+t%`Bg6IamNkJ5u1yn5G$iR~6^}ms5`OdKbJ%#pb$HK%_u~5NufoSa z@p%jnjp4SN*CH9^qIeO*qh);er(2~86$%Bo8Nr7OML-qBD~%{q09WNgJX9bQ3R^1g zPO9G2MnO=jMe;M;;MLKbL{n25r_c7`95Fpec+8Db17mrLP>Zl4QEc6HoC3NpFo1h1IHjfG0@)PY6KvPiyEYjlmQwbHbehl$+xB7WbI;?gZ@F7M zhg`0J=H?U`-V|~L4WIq|cktA+yAVmGa9GQ;MUHgXM5;km85uyfB*Y~O!^ zBJ(6BvK4&%GvB~}{@{byykU{#m$>PuDtRei>qy%9r%vy2i%Zci3G{Fcgqsa)`aK{r zQ&z%AQezVYmB|ZAL?RR_zYfVb9@?ybGIuDhb6Sh3r=5Qb9A0oAO_AKv9s5sX0mTiK z>{&^+nIR2>BYCN!g-P-}BBDhuUNEE+h8D1NMGpluZCH2Z5-cURuS$5@-ei(*os)Rf55S)QksD4Pe#6cC1*q5$}FrGah+*KmN<- z{|7-Kc_~^9pZ&`B(Uks=xasO{*b_sNcwz11Vm=)}hIfkQ8HYo$N|20pTSpU0Wcx-b zen~ebr7j!^6=^P#suR25h_SZ>7VC|9F@Vl&olm~GP<>=`+z}t2g%O^gqJWa>Fn2uA zq{>9d#+EL8^&h{7>1-8-6@{BEAWeq(Qy>3BY`A72W~K(o1&pDgAwg2AIwV*-$Y@AP z*=5xy@1ju5@~x6Fv;-nJW(WlXKIU>_Eg%wEC=}7y5Eqw`zi*O2JouIy38td>#NT}j z;{^*|AcFtr@BTYJ{*m|LruAu5OId;=4*?=9LsBf6M6p;Af_HSc2!Xk#(9+UGPDmMH zZhf>A840MBk>(miNVG?P1y|yNagkH^%7ZYjk1Jo?K;_MG6)!g!7kOf%W0N>>>NL0+ zix8EhRpsJYbC@xUdppTqtVG1jqqjSWbOSIob{6^UIPCHiN#F<_&%uKy-3S_cGh{2m zv6ytMv2BV*!jN9jApeZ0;yy7Y7K7$ zDS)qj<6qD>Qbi=5Cc>AA=v9o3&&YQhn-W;LW|2A%cga!E7@`;^66TJ%kfMaRtLH_Y zGofYME4&(gYGYmuAoJVLDOw8sHFg8F`WXy=NRN^jSn*ou#V*{?=p;#!C+XzrsR^05 zL6V)%vr*H8kSzH{A_Tj6rBYQo-PqmWt_$vT2+()Avn?31gt+05A=<(1EgWfcdtx*k zr0>Zr1k1zG5D_y;^C{pBx2(e7{MGLhp^BtEL7W{N!_R)bjquwfLmZMqeiI#Qg(5;= zoA892zqn_Kg@C;_W&k(#CR0tq6!zLUh7L#?HE8s9B;Q+)Li1t(*`gC{XW?@Dra`d| zHzIlT!t6^8P5IxfdEDqpFOC)~;t#rnosQ_y-hGEruDX(F%jWZ1Y7Ch+(EztW0 zw~?@Plh>2a7vxiJ#ASF9BT1Lx)TcO%(|A_b6no~~#}V^f1LLVAwKZRCcrX(D<hAYuIt>${+vuC&Jl910}K=;kN0$QNyyFSoax?HeLu2XN~2Fb+_>;{{?O92^Bx z98B_{c@ay?&0K~)Jm$rKLN=psc+)MoX5AI|`7eKiJ%>(_p^6Y5hUD{CWduVG2R=}4 zYnj41?)NEDq!}b)a%K}Q!HhVxnn01*Eh+Xxf*_5LBf=$`8i|3r5Strh8Ga7!JA<9O zjtE00W+=888petxow#Y^)mU{!H>O9=2+<3L5+dXZbDY7hX_d9IQlcQ`sIXrGhr7 z#5FU94Ry+@#xI)+#XK3%)YgvYUwoO|+A@c*UWUotZ$wBAid^kH zqN#KOrviMU@{L#W;@h*443Tur6!O03s`;+04`Ffw2;K`U34=ozA1mQ=U;Z(k+i^s4 zF*(wtnS54klFJD`zUE{5(D>b_@RiT~DQ>x;lb~i?7HM#LAsh(`3^7w1(@mI~9LK7a z%h2B5jHBnyAQp|{`CVu5A3pFoau!OYRVod^v#)ya-H!s<0uzbGCglk_+H6#=`DuC6 zVEuG;GoY_SoiQ&P!2L2MQqM=8dI6vQ+<%pV_3ys>op{&VZbRHElk3KcrVH_SQsT1u zwN{aSp1h}v_rh;mqX)56=vY#Ue5hc2OD1xY;+EjFT3Y#Au3VMsut<21cjLm@EWf zYf(uzgIyj4{Yd{Gx z{L}Y-gz0na?UpNw>)qzg3h zngXJIhNhwzW`xu*{1q|cV)J};4#J8Ojk|PTb~%G`VG7ma6kK{)C?aZ-Mv?G^0%h?} z1b!GoMO(S`-lS+bRJSo`UJxV#Em>AixpR>?PWMmYtKa?!Hf_8Pci(jzHcU<9z`;Y< zzV|foz!Ye5J%#Oz;Ux-cS_#Vb96TxKyioRCG0@7Nc11HZ-JLx~+Pul4a!|#Ao$Jm> zmxAtVkV?h)vAV~!G(?gQ9q$vE;s&tUAYD_xN#=kPc!uv%d#>~n*(4nCuugCkmhS05 zK*RFI9cWCE`)ZeA(cjmsUxt>ZsCaeb(^dTa*B-)np6*kl=vT6_95gywu~ckAoiRTK zpr!@N;EL>0BpadE)|d9;=9uLXHh5>%ZHy00PJdLD@eWo;Peom|hazSV}NDrV{}mG@6I zq!1)mv_$bmklb0GhXhNKEmfKonC)C3Yem=SZVTfhfAlUa=xUM`L(w_erBHz3Cm`P|RqChX=EVTUbhjp9P^CiF2sS-t zI4TTz>iPZTH5|b^?!6hm{lMK=xP3piY(IcpS*4oUpcP1B!ZgW<<)Ndk0mYnKDgXc= z07*naRA>7~P}2oYC#W>HrbL>vjJ{D5Tfs$~fM0j^p~km-^8H%sR}3=2U{I@IX-^9= zjjl~LA*87mN`@ka3Z6SRQ02%&s*pY6g?m+!{x{#g32(XkN|N@BlqOm0%atrD`4X2D z;1Twdeu)Rf?fLBL$^sKFL(HbYkYX6uQw#k(r`{5}dD;MfcmlN=qz9i3sz{xzYysV9 z0!1>^|Ko>G;LG3qDR~*qc>6t@ar=$yRdvY-5)75l+Y&}+QwVETub7pvaz!Q9s*Xxz z&9=LE-mHu3)o`ANt`vAZYCc;J2gpBZ5-!wSDt79+l5%X z5qtKY!Rd2j6nKTC)p5fOD@iKzQjB4{!vz_Re0jMMza;WD4Z?Sdyu)F{;}OJTmIx#V zq!veE{yd#JaT1UDX@De(y+G~EwN&)%;GRhibjUF3rX?NC-~HhuXlYKNb3w0E#H!@) zbHi$5GK?s>gAIw0uT>NmkQBN>Po!9EjpiFjC}S@1fidTL@VhV=Qb@A7VXT&i;q^gL zqliEH;Cs-~-iZ9nDA}WkVya(9RtrL^2y#LF*eJ3TLvWMT;@%dtHaCbcNE0v4Hv{k& z4Y5^*EHL3U3gK8BF}6))A6Qd3foS5wdDa_s84zylU@f1ZJ3U2zvRgH4&n_9v2>vh- zl#b;QGEn{FM`W_>Rk-xxTnZOG;!%dy} zKeq;YGBjCm zBE6(?Bd>!EC{7OIitd(?{;GN0InRJs9a0Eqgyr%eFRUhF3)BeP)KXM|ZS@aqB05)@ z(9^CuDH!)T*W>xEDV&esV>wsEITrq$K4ZLHv$O||F#~UY)6KYg-4ZDo^0Lu(f}cWu zi~=yeMy-=dxe+Yc92v)wjd<$uU3g~u5qK2UFHDDV_wDOwt~ps&rBYg&%vmrUoLJ;$ zG?gxKESs2HRjV~wlMS`hHWE>*J2^rQ2VMsaFq3WCuD;=NOKbapA8geJHc@p~qG4Aq z@k(D&E-hz2$HsUeT{|7m`lE}q39!4KpLA2LDqPFubF;Br(z_Vn_{vAn+nFQ?8z-?Y zE4P%co6Bc}(YPQTuOf1`H?c$#=LYil^yj}W$Jv!4)~#8CrHj+3mb0q5RU4YBfiu7} z#JEyuSBp|)Wj?1#;!!cU%rHw<-a}Rd>Fg1qa><>~9d#KH3kQv!c(dK_1V*%)&v+SZ zQ-PNphgTvzf5x3;Cr1sz}0RHCeT47sh0vEtVy}c^Uix^dz zL1uhhYzJp89Lb21AtcD-U`w@4DoetIDi&3`n`!u&FMJEb8CO1Qh`9KJ-+zD{2}{~2 zX9INq7cNc8xqN1D+~)ckEj5x_@tqG5$H0*!VaRxOI@Ly9FDO8=x2J!M1+wDVOx%E& zBWVi}fYzbBBTo^ZXCaYWKn$dssOIB3O;)#%tD4xc_oS#ZPrg_zNFke#<&t8pM(oO} zO2tIR`r7XhNp_`v957TGLDd`_iLhA{q;AJwhl&Y``64+1WT2B>_}2HH$8WYAp!ZEA z!WzE$U;h%*+~%?fluRx@hqqSC!w;m$kG0fk%eg|9q}Z+`b@ zMNou%JHc=V}f@%-~UQFaWR>7T;bR9^0dGp&^h2ZAKWJtB*CoVoBT57q}$Jkt7$o zxz$@5bLA^i`;s8b_5FLc2jcI0zKwx`D89DjoS1-YE2Jo5%cdK=xdvxZN5%{I>(71@ zzuvM3!7#-ptqFYj^B>0bS9OxBI*eE}M8Xsi=^Yy?;PA0w61NZz9zKVI2M)s4qd0c- z6b>9YDG@ODDHX~UVKmpEO$suZ=oPyDBr&|(N3FdyCKX#urx55!%u(l zl(uqdH{N>Ro!Gf^4_?}Nlw8Sx>@FgKl~+T|OHM=+x95DOAcu!d9t>}UVM{NiE|n!A zw0{ep?~C*Myt7qJyCjF?)_(fB#9a%9a(63aP$RLhls`{Wv}=V@6m5HGX=z7m+XBqw z2yOyx*t+u+UfT93X^DwL2hU;K%ln9z0qFzfjtE}z>gho#LdjAkigBVrPc%$yf}{t? z-(feE&d=IiEZeh!a=B5T0scwo8YTx=70>iu-ggee!(+H(^9^WhYQ?U7N2EmOnL$~h z=+=laXSkX|RE87fdz@z!cRe_=>j?!jR_#5NA+0f#|K=1(f+UswbeE3hLODmEybFq< z`Ow6XG1(a|g>n}|xm3cUMcsJg?Kj{bzx^;m;RYN(bq*i?^DmOeGbPY8l-a> z(sd`*Gsawkn_!eR%8~gi?PD#hB@-Pn#$p>78kG_vlP^eTg|1(W2A7WdN1O*~C9xy{ z+}<}lS;6=JI93TE`# z%kZ8N68LD|YW?J_9!e)V88w_+e%!hN)nVcfwNh&`>E%;6uN=8A}(Y zCGEl87hAXO#f!Vo;HBMX3B$Q-uZ^^#RTi8}g-=&KJ`8(Ot7E5ti%PSyrKvQCuz^$P zuH=_Wr2<{U7H4BV8c>%3wJlfZr>jmVWfpR_Nz%d`?y11;mylf|c;n7h^gh|d{aNZH2EmJsOARnE(i@6i7T28#RY=bSPoEw6ZcRRvXRq{$!B!+M_Mbe&>rB>{j@wPU# zUQc=XH1OnAb3gqBfKbIIDd0d8*O%)9`GO;`Sgu}*0#nzyySV;sAJ>pFZamp=Dx3<@JFePf(42R!2Q${iK8> z>0Ndmc}*?nXvodme|!wz`u?L7oHXD)Z{3XEc3!dW_x*Fdm2fehh>{U(Mss5f3p$%+ zkpoA@Y@jn!IUz>1?5Gtea{ih$s;dV~RX*hU!c$xJk`ZlGuC1@_e2i)aQ%sRX+d^c5 zuaJ$~ZoGmb=!z^Jna>b{dtS}+m9=3!2Zzp=WB1jqO6;JHWCmE6$(N+-;&p)_&CmUi zik*NYHl*FbQ+aq#Ns>SS*IT0~lInf`#}8x2zGGOu>Iz(c^%bO!^fig!88NGpv9t(B z!a+WjD~q{aY5? z4@A@0b94l!`X&iuK}9w;AS26Soho2@9gypLQ7nGCnA=&EoYQGGRz-(JkkvZCUi zFKLqQ)rpl+Jp9NO+;q)vD=Du{N>|2LZ4U}z0(&oPARCiS_{bl<1AqFlZ(t%<75vxy zR7thUl3VfvKZY1tUr(?Xl|H17)=s?d-G6{|Q<7j%$Kpku_^0nZg@5?^zknB)a0ZyY z3e9&g<}>Ouz+VVlv5V7|9xefXnn6=JAVvBbI{IuN?(>ElGXxXUBx$^=oxP!&QI+F7 zSNiMu7KZevoN0cO0QU{tkTg@BcWScApWyxYcioGP=!tvt+IDKjqy}e0POL-x_ zTU$ux)fRd{rIzV-%f%d4Ea|}F1#KAJ-^V2uik7otW4b$1XzyvKITo;b#S*Mq)+Jl- zTz}&lbal51?4}Yy!FFL3iNMk&3kc504*7VmsHL{PoR4j(%K%Qn@(3Ab#O2k~l89sR zz5K};m2}<%4n8_+Ds{lU^*k}zotD>H(N9imA%br5KBbl92_ajK60*#n6-c> zjZ%P`0_WfRMl;y9_cVHXuf=&o;D|AlZ7e;NSyi5wg3J)PsPBFEojCC4pT)xNUTnO1 z69qXXtXa7PD+xBa`yrVOA<4wncA^aSd{_uDXoxTDt;+p>T9w zMz}5myx9eFUKwho8!(%ktuty8plLo6lz%Tp`dk)cmM#gfVv#%Cin8m7bYc7bKH;!R z1Zoa<91}C_$}Ifw0ql}25+2HQ7L1NHmkBJ z9+&$JAz0AkwiY_4$;pF^0fikO~qM}6bUOswR` zapmd-;=)dk4??w^Yx3gAT5?ugbN1AEI8j(rFeQW%10xdQ^$4n3X8TKOIgkqn4aK}V zqrQ&#SIy_5j%ifgs7X?47opn`$~uj(jZ&OFcff?_0UumJNKScafEEvs^S2*hW)cI)j^@s zM#e0Vs@S0hnYt<@c@Ap9oJxDUq7j~dET4~;LDed6{Grq^L=ufz1isvuHv@Wmc})~> z?8I5ze8U=Cw{9uC3isewpc+VY>3FO8(Xx_;ZK zI9QWi6-lBhg}g9;{c2`ac6x?1fFaQGnXI_a{`^#4!{b}_khZvTewEC-P%Y0#y-Kp> zrKxl_AI7z4o}=rj#G7$FYnA*`9RO?cQ}j(kGmXkc<|=ByZ*s5(s@I zN?thT&47Gvoc#BYY>xVyC$=IHk7LuuYmo@s;y+7;Oz7dwnxeTw6=MwYcx>sA(`)$3 z++n-IzY`(Z1?4cl>KSSy?P^(Wa7K2u8)Mx4w}jI<^} z2$O;vh~tSZyUCeg9j1Aa2lb!c{}$Z)TQ^H8Vm>NR*9+qD!pvXndxct4NXalpJI})8FWlIXo~SH z5;20@rWo*K({5gSRV@{zSi)NeD#_Bsh^x$`(gv2sNTd-@Kf4RJUcU^hm!%~6$IDo` zTSCPiny&%MhB(Tt6Io$WNkz_&irM|<1sl8qlWoEN>%kNy=DtJwPg0Cf%rMd9oLE zg(SYn&l3o+gtBW`m0e@)s);c1j@{U*Q?me&^D~y~q@5XZ7WV8rNs;bV^maw0UDs`C zf#Gz5^$%Yd8wF-53gmLR zym)H7q=^}z8xcfeyz(W8vg0cEQ4dKm*#0I3xSh1*MfSAX!&- zF`K0a)bl&Ec|HdZ?8Uj$H)H9N2BcD9(w5LHL zyfA@_-|W~tw)G&cTDKav-Lejc4jjPF!=o_6$yvvYm-dv(E?V0{2vXFWj1Vm46(-w$ zOG%X>SvGJrrT3EenuZgQh?5N}XHmJ|Q!nUZ!Cc=1lNI`!E%syI$x(d$J5S=iJFk)L z=_5f~G?pEONs4ZF9v%>FIeO$cj+{J8-wWde!6)ym%OtCm)s_cVD2%3-F1b%l6`$eg z$`h&$-VB^=2A4{?AfTb#6ZT2d$l z+i#7jGwL!xhHuSD$Vy7#{oxxKDcnm13Z&i*m>{u!`q|xBxpJA&qeOV)qk)Mko_cOKrZYL* zecO83exB*T%Zp09YDR;UCD}MuNs2NvS!o?qtLid;j8Lx2ojwcuCF9Ft(mkYY)# z62Vn!e?6v>bfzn>$fUbtdlQMp5hi=XkDlW7Z5(iMn!@Jxc&LsCSz@cHR`yF@ipjkH zgRXciffqmcjrXc}VdoM2-XDLFY@rfQe$LF1!>5pUW<~W?$GjLYX9(?e@8T1mXNc+% zg=9Hh@)DkXX%|h*#+r5OP-`_&kucwh3dp!!yhv^ht1h>vaC;CN(=z+uymv%6jzCin zhH^n{-Eoqn%k={}Wrx(@pZe^d@|UOi=?MD6)&#p9)lUMo--WK=boMU1*+^dOir-b? z)zV(G8bCr*n8DR6+9>GiL^d;pXSckF{=N|@@UWw?aA7yrUeSwsV}1}cXVi#)0S|n8 zQ2V{sRwygetr(tqaW5>2qIGF6f!GWVkoXZKwRK<=gHa4X*y)rd>@1Krn2{(ZMrZKc zzH_K}mh3M#ktvfQv{Wv~H*&IO%~P-?lCM+%Ds^3hrJ5(ETwhLQaMn^aeR(43k_qKn zw5>FhQ{!BZutKI()A&IY^6W9v#;dMq#+N?x0m*Cq@{#Az+R})%t9vjubWV0?;RPv; zvHHol*T?`()YP35gWlp8`AxiX zj823tpdn$PBb`KNYm1bzS1wyhk+qJ8fA&+{x@i**A2~`43geT1^?o$Qr7;q}_wHN8 zCKa<2@{l3fnwb}-ydInOT{33x-~w}u*+R)hLrp=Kk6cZ8FQq~eO-(7>d(S3p-+2H} zKerQECxz)#5U2lgGok>kTiH8i~P#pjII%mBe~UZwa-=3_1tUHYMXE@=SL01E{y z?J%&UV?ELhN&NJQ17rtu)y>8Mmg~$ppLd>+UJaWSk!RzQORlS_ujAE*<~u>mt}4Pt z3Gcf1E?mF188d|G9BZ6Dc@kgz(m!L(>LpmeZV~K49~Si{rRQ{NY($`jAIn0aF?yFQ z#zQ}T(o3d0SjgPTjO|WL)!)4PH8OxaX4CNa*>|;6?}az0h&(&yXoNJi`Yj$46kHXG zRZP=O@P0o%9SQKFe)3A;@q!E3mn}I9$(c#IGQ3=8F#H_8lpw{pz5?kr&7YsrC|OcS z=gDWs@ZfK4z^Y{}m>3&IoFsaDDvy8s+P`4)#;bA9o34ag$$+0CRV6#sv!EF-Z#{s; zE0!RhO1XnW8I0{Zr)8>PZQqVF6#EPtWE+gL=LRmF!$spYF@T6}MJ!X3?l1CO^vmfu z4}m22(C7JgLW|vAh$u8UUC_zmFNo7z;IlK#CW%iVsVi0FYJy{{+B1oP` zu}rhF!qP=?USa(C`Gl`^S@T?YcSY{;;%$lVzhgZfxbJ2d&LrV}97Cf8eC=C5!}I5sK!Y zBlmfmWd-Ycne$>m?SAMMcajgkKO73KNyQ`XOund`?#nVk;edb-5hq8IpXOzvCJ}++ zfsu(RbT8<_TkmPdW6vLw=gsf~*IeC!=A94uXJN;!aB~TkE^5Wn#oY+fas1Gr(*qei z`s~ZnDsP!F$(D*8;F>^{Hwg?NB2V_y#B*7(dO6OVID{LnU4ysWbsfqx{TLn^M_=Cr z;;jq3?nP_d+it&u>kL{TwOAXO32KK=^~=t%KmYshV00o^DOEM^#HqoD9lLZo)tDZP zH!ObCsTPgyMB~Zbhqjeol_qn>t3%|gjD_vZjYUuYLMR-6Zy;b)XJ(24@~>x`z+|bA zKtQeV;rTvGKs=y^n1N-z&6pZKiECH&AQ|H)X`~TrY{4(Lp2bryk(c2a0yAbnZ41od z5ig2h$XUIp5$}KScBE6f?A^%)ahI3DQp~aC`Gfe;ueM=$sw%5uI5i&79C=a)Z@1sm z-7HDDLx)d;A4A&^F5|=RzY}}*9z;_rg6poif|RQ4RJ4R~a;T(n3*sY>Zo%+amY7B! z+W7bmnpeqn_3hcr%;&+nLomuzuQb+?Q+zi~a5FI#|z9)1o3 zV?~M`Lg+hl3SpgW3}z7Gpw2M7x7@KBJxf>0!{W?n1S{9ypmEFk|NPZHEnmn7rYY8V zaogdi$p1G2R&Xew8;_Pu2Q-4ElS;zRqR5f38Ox`g>tL2D%1}LLwh_Q@WE>`t6piDk< zS8D^h+G6rF(#Ln4lPBISXpiIVcU>$6b9GJ}tEW@c+(3Th%(|W= zEH6*-Kt-O>%Rw2JB|{Vw@Ma#|n;8x1VvKnueIgOZ*}-wrh_Kh&(?On7#%*e9bYtWb z^G4aH`^O0D2Y8Qt96LKXQz#VAnE`VwS8@Kqsg@?%+ZLSb?>lqu;(O?5OB=~3KX^3e zzO?7CciolCv3>8+SGe1Mz45=y03I#vofsV&ASSdKV^tU%RU}$p2YidaF zroG6Mz0H?AqD}9_cg; zH_(Yh(C|V8-%~l;8yOq9jQ{*^Gyb<2z@u~VVhm8o9!sUQ-1NBI(7L7RcXlsc{i#Bs zu=K#uGaM8e+{w&6Hr#K!p2B%vM^@1Z>otB>Joo9xIR)S)k_j&siC`vI&>lzeRepNkG|JWb z+sgl2jsI;1@R)0qHs5lU_Vly6yyo`KH5=A;Jxmnn-L~hrWI7Gqq^Q-w6+KPRsx$Bm ze%_xY@p7d|FyxSHLAHaRSDdfd9tGa^biTZsKHk?53ytI)^GAt*<7~eAokzd*voDT)VFktRr!?>ciA+Yz@AQPzV_uqB*mnNsC-nnc4 zX*XBa>2psbuf?G#*RWkp8<{G~!#+7BLC#5*EX7`mC32pteaWsk$2%7+oIG$~_w>cr z>1b^xRvKQw&>a=F!F#;gcWy>t8;$?Gt;C4yfn3 z5bW>+(THw)p_^nowWoDm8z8^+;MmB(Q?GVTaz|w=4A%>I|C*l3zvcK>VL%O%?%sU8 zriaSfFMqwqUE166=1kH1I#GQmS>taQfgmqK-|7~#<&lx0$=Y|@TABi~V->jnLpmnB hf#LekQ(Iwp-5-LcC2uLH+-GWGu8jUd6 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 Ze7dAxmDtK?pa1SIKvPvmrCJ#g`acE-7*qfN literal 17689 zcmV)AK*Ya^P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DM6O9hK~#8N?R^KB z73J0cnVCCt``x>}(tAfb2!bdIV(%ugCiYlkH%3!zpC;DWF!mZFD2if1ML@cA78Z74 z*=76g?RDD!cjn$DqJT)q_vQaQIq>fEcg}nIdCOcfO>@5`6^(kM*G~90vT^13eO>== z$rN4FrIxpzxV>fhl4JLE{Xj*e13+r|$0tcG)jj1NgVtwH{TKEDq9p2$@h80Ndi(bO zi8nTM&7M9e*e?T8vA9Q^`_L^~w?P|ayFHmb{a@G*xXQZKXu0LPjKBTnFvHpyYE#~DM$A70b#!k5Gof=CIOty$#2V^`Y-$l*b9qy zoBoP=cl(9`sj77&v!@RT`(!}4xvj(%+tGzYlMEAF_%9q3h?1no4cQRQv_varpP4;< zKoB?-`aZ;JtNXie>t9KNL8;4LztBGA+*h)f{!c(ptBRqf6+s{&S-X9(7;i6A6dXt> z5Fu^>H$&4PFy4|~_L6RuhC!x;;DL#fspWqMTCW;YSr}N;Ka|^lyZg~^2iX)koxQYA z*e3(D-P`(0Hw~;5Y&s=>_SChG8CN{P=i}i>jwGO6USEfG<6#EVFvN6wdy%$b^*GwO zZID@CIog>g3tFtP2Sw|8%MPZts)&*x5r|I`9ulzyXDnT2jggPv zbF3he^fZ5B~U1a+Cv7Ll3oywBV0v2{LMaJXm7fGy0ZY1*W8+R=ZV zUOsV-*lpr$XKB}Mf*|~`@&6)(t~;VKr)^z-1Jc`Z^WrH5!^SMmUfL%xsy_e=t84@9 ziTZMuOg`llqdr?;(YH&rGojBlq2Hwm5K)gZFuh;*`mhZ9n0hhikl7%xIG=8&${`$alhSRSX32FO`>pHVfOTXVV?|8 zb*=$BHi5*J)gu$_O=W!EE~Oo2)5?j4uCwgz7u00R*|28K`0SyDXtJtuXyT#UpVlus zWy!Mp9=@|AxU1X5t}+!3%Ohc883}!IK`ez#K_&whhGY;?1`?eGHlLsrWXHa>Ma9-R zKIX#A!ZV#r+rt!CE3Zfeee5I^xKqiJ(Vv96TyncG@Phj&)n1<1y>)a3%byM!2rsXB z>bgi>)j&Q@bhH=AiRMB}Gc5pqKLWt~hmh1|RhJzqGe8ic9)0VlCs-Hsv|S0UACroN z@~q>1KspxlHY}KZk;Cf^!!ruWZCi$<9=`b*`T7$V2i|z~vdW!d@5FM2iu&Y`IkA+4 z?p_cb83!z-mavfl>_tc|6VB8Sx2&mEe3oxlCz*QDCVpEmUNGC8lT8fN&% zDYXwsw$$}>tGf&AvD%(|9N)BLij-{4X9gG&@&Ru_t99c6V4pq!66{d#9J$%0ZS6r` zXi~}e)$S`k8z(g`ovtsqa&B_Mlc&1-PMMp%Jp*V&aO=9UX5;FK&f%xMYz9NQ=G#x+ z>{>MEEF&Jy+1?*@}_30CBS;LFR6hrX-my2@-YC z#=fMlIR5v((;_76)2<@I>^jd zNXc=M!)+tcCX$ADCmmMFoo^$_^&Pr0Gf8Xk-3+Uld-#R<0dZ983g?hC(|F)r<;;<*#1n;lDeVQN!p~uuO zOcAYw{gq_RE^T`3jW>STUgN5Tgvl|iBuM2GSGPQ(Mm z5%0sS_`s;a#bnIrLdF&SN&4LgQf?edu3z>h->F?F|HuL=9N?#%au?Zi?Ie2@a^~A9 zr>BQ(emD%JvnXg2w~Gt!L-Sy=Bq{ClnqOULuf26~eB`aAz{>`G-&tA{*J zGCU5gI`@vd%G&2#=~SA#RLSQ)*6++)Z){t(;3WHkJDyp!qhHmy`W3@mYQWDDV8nq$ z3X+J8S>_?L+zs;rIUW!95lj%RY$l-%BFbjRl5D&bLtJZ~5kIL3^$Dp;+dK z+s~R{B40xhj5H2aN*N`an;V9H;;Kt(p0h7{(pg@%%c?I6!5x)jJg-gu#%9K)_UW(x z%(3=`^WD`STAgs_P7g)Tc=4BxlV`pWfBEJ|?bTl&<@leqmZSbY?3V#nh;{v?ALbRk zH$#AmlS`(!;Ey(U^xDAx}Hz2IJX-tQh=u`=dA&P$10E$p}23p-44*=nGf zV<$b=MPiW$TID2jc{7Q1QMM`>DaTf~xf02~gVxf~C(NNSM}DSs=~kt<9C60u`@ndq z9WC93$d+S`*p?|`eEU?%7A`bw_OxKj-v!%~GQm|&f5BVOU$dK9psOe(VWU83iwPjK zRauq+Y=#Ur+-dkJ2nDtXIAFih6k8G|vC_Xyz4Y$ueUqkqj0!D+bu4=G_PhmG-p6ft zeQU2B=k}?rkkqtHDzxGAp7HowAC00_Z~ol3;NDw8c|$iBJhXf`KlgpuCj-*8OQ*(k zUx=E5d7g*PpC?aG$>fHrBFsy{+1c@kp5vy^Ur%Vku&s4KOKWLQmr8cU6YVnbN=x#Y0VzC?BtgSgOL8;!-GynV;BB=)T6k_`w?mHLZk4|N2?~<&RyFMQJbC zCj&ZGy?c?X>bYBEqaV6ReE#_xd>tR2BOMK@aX5#N(S&0aM2XgH??P>VUr*g6o$_Rz zay_uwFg*g>9TqVO_fG-wtAZr%N`df@G>D9vliwDaaqdgX89#f<*QIRd{xVW6ttuVs zS063K8V0#a^Exz7*%sMXR_X9~LfKmm2~0I@H$#mBjqt`Zh2)l#O|hZBXmSh;A<>|C zC_)-rE(w^+M4Z&^DGI!&r`5Bseb9c&*?;%WyL6E~u*y%|CILK$)*H1Dy!m<5GR_PZ z6*aqrbXqYDIOL0FpOriDXqs2yd7mt8Ix8;+M! z4aJ<42q}bWXcxs1nT5fKV3NX{4Qg2^rDM}i>=>H+afu+{9u69yK}ItKb8bEf<#7^^ zXhvgExh9b2?Y=X0$I4Oe+}!re8~28NG63g<*w=r0+|%&FuMNc$*|o;0S9}Hg-WyKz zSlD(rKNxPjK&G9MQB?ca_sI{5FSHw!3vEzrKxUYWq%A5M0?Du$lq~79EpgTDx8zPa z`h$ZVVS}@k{?|t1&}Kc<*2QT2;#x|7_H$dTwnT_S(ZXOtAW3>arRJzW&5H%S_5T{ z=*BUEO%Nm&@ezn>*uJlUbgBv>8@xOkprTRZsi6%_YHYQ-XKXN=U=3-KV6;y=?`6+T z_gv%3^Y2py|Kk9`f#7t9guEjb=(Z6{wT|jRk=B;7mM{s)q?fw&8AqD9B1eT%x!S`<2U3C7`-f0@xEcd41j$`@-uL?9;xdmrFQg1d=253 zNGydW3TENe4GRH zHJSJ@w}`OQ_KN!5!|(c|y|_4JbNIrFC-;CIa{T0eLEW|J6s>vvk>M`a-4gPi{<1;t z7)!Uw*%oI~>^`zCM9fo3{_Hg>^AUA_*=RR&mN)F_`d3jV)ct!QL227pG2e##}@%j=$JS_Hk*c(Qz)%SLb|`E zG&gAMpyyA<0awezon&^y&BW1O9pX?Y= z+-8#3X(OeFNOB>F3+GR1=wK4%Yn6=h0y2Lwjm+--+f())e--^*UO+5do2mIfA2<|m z-oE`rXYH!zy$hc%5=FQ%WcgMaq`~YoYA{b=Ko>+tMR2}0oMRa?Op3ZDf9^Q``I$EP z$H$)!$N+{=)2=>_EmwYF*IO#Max1~$WM72>q+tu&INU@e%{EgLpLN4^?lu!QZ&?di%nce4>ygJ{QFL)|PF* z0>aDKN1kI9BxNZxr!6+(^<(n7^*gBfvdK7+7Hd2T$x#nGVF3X@9z~o$ zq6=Fa+r_Mjfjtzs4`>3e1=A$G2&XmcH4;CcUF6uk>~5uL<+A9`P4~n@;fl-y|2Ytk zM00kpUwd`3a_N%Xb@T4BfA*YD)Q|~Vb|3BINQY@)70>|LzEwCe#U_p5WZ4T**+@%2 zD*2soKp()+v3~uisz2O&ch#npv&&EykL+1Q=19njf)IxC2+*Fw8iGW`;zudAEl|-7 z$QJ8bNeXU8df)7oUFH-~3!M{ai~4oZx!LY?{GT~%HZ{>epi6vL^##K2%4fVyl^3`c zyi=rXTZNzxjo}#>EN@)6uOAVRwY3WGvj&(HLJRJDBu?U%sKaL(a^ca(d~`6gE)Hmd zH28qJTd#Vp`LhpBj}6VIopmNnIon6QdLjgXsi72zp8yg(cN(^zlBkOdd_l%c@i`az|#rMSj-c<^pu6dwlyP?FgHO#rt%xg$WzS5PNZa9r0v_&q{aox zvny2Yh9;)KT#FGX4G{MG50QG#Hvcd35;>$Eynl%T8w;Pm-EQ zy0jb5{=z8kUL#%qr>hB0r>rC$MFF0CwObOi3dlfc*$c3y9qe#wDRGxj4>)PY9c&Rq3Qcq8vG`q`M3J z3Ar%h^ye+K5IBs`TDxnKS-<5id)D48j2$ZlYLz3uZ^~ z@;Tt#Y40EF`hZ^&nkn6yAH ztJujn@C1hN)-A&wpS^u?Jd$=PV<&ztiXwZ`AA+gtlI^p%&sRiK;z?2taNY%5r*>%c z(Vv=V=N1sriUNQXW6j+XjBV!>LYQ)ngs5{~n1BWuItguvkg60CceqFb6A899{biig z02)@i2029J)a(;`fbC{7)KXytcl0w`clJv(HFWQsiKfCwwJ-YW6fK?Rx9ti z$V5`cbDDO*(!cc_+5!6X&(}yt5YiX{?G}G>TDB4k0)@S+U&nThSk zN^VuuLzR8S^$TYjfjqaoaSI8pdNMZjnD<0aUc0=0+2qi~Q(rAO?~;dEnljk`6GF{R zV;v1!{%)K5W>;ZXBgK}0@U1$8+e9=6rgKEYM0A1!r4SGwaOCb>NHjT70h=DS`PMPE zkbXXIf=N1<~cHXJoQU`!OqM^LO}POvN$SOtMFNrxG5j&qUO zdvcrXFZrt>x!WRD8~WK-&bm zM~;9x%?=7@0^0%_RW@t1XnUNtR_gRQG`D_-L{7xzc`(CyAh;IQsS77*Ff5I&0u9Iy z`65RgH`i5CY>k7s@^afF%amhKnIP_}rP$^WvU5l{(15o>ffg#zPGqwtgp77ONoWSu zan3TAOcgF{S#jBwBT)AqcIwktp|MA}Xu{DB`o*Pgy7)R99epMupE8MjJpZ((i$qzZ zt}L{W`D8+~nRPY&86O5~YJ6$;YK=SZVhL~J%LS+MYxV-Yp{|G0yt6kGPvZjn%#{iW zk=!sve)s|h%!)(IYqc~?;C?AG zb2ShjWZKIoh(tMoU)u$gum!U!YK*krG89tOW(25opj6hVWLd8)LmX3jtL$bZCf* zHb=i%J~e~acfeTw)p4+j5KbV8t7ZUR9!N`B26$jUJvI=~Gv-rm#FJygU2nNO>>B%3 zTJ%H>sH+J;KyM73;?-jO4h*EWkbignse3sqW9(4YTV^m@KK=@L;-|`74 zOcln}YJ-G?U!k~RqnZvIE%-*Gc~7P2x$9!Ib-66Tk6|(0mWGiryqu36gDNsp) zK;bA%l)~Kw{{+wAp({0W_c?YxbH2#>$1q@>YeB=D}r=2Y+C{Z9rB* zRm^}K_`8B5j#%dO_yYd^GoSZPeROJY?2AJiNBnhC)3^stUtKu;g%4|0vodDF_d=z) zVT=a1KOaPHN6^xQ#DVQD&hcrZg`M^f8NgEB;`FDiDd_ANIWYnQy?VmU&+QLnoH-9z%#!#QXIKBvv*XG;d3S{=Onk3)ZHr z5VK-1QQz^XH3E7RImqU9k&y3$hPz1V!N~-2qg=Q=1RadVcR?&DY*ZoHJh_i$K$O$X z-7=Rzk2vgqT}?m6B*m%@`zW%_<^e_^$I*iwTHuCjuoaioXCH%>Y@Xn$fBF9W`X`<& z+;!jcBZUtyIcbDV7+5Y)t{0Na9Y|a_wnj8z_K2~L;Ynry8V=%UEr_II?CyRDiVu_r zzpN<4h5Hemh-xG!(%f2_x#Nexj@FFCNNY@Hw9Go2k$n+%UVyz95Rrk>AU;lVVL@Sn zVJkZ&swk9bOka^s9xKyD)9rNWsSY~xM43uTMI_5EvbAXB&hwGOpM$VEkI0)xwthKe zLa=;D($c73+!M}bK=kEws0dRu)?)Botmxw9&I1d~WYT48*<~?=qnUUNat}gr7Y!>e z$OX*=a(0{M9W-Qx^$;MgdD@M5Lr*2WeW+vv^Eh%aA*H58c(jNKZ#51Dk|qE-p;rP# zU@-syN0VnuhuUqr#`9hN38`etS>#7vicFPQ=9vi&m_;>_L&1*yGJvJosBI<@$=`Ru zL|Z_9G7$!I<}2hu>-de?h-VL;)}jzd8Z?fJF5Aqsk{j7=J7ZRD;Eca|Aqb9`N;!G9}+Yz-1S2+6EU|@jr5dld}jjy0*)DeAq!=so6ht>?(k z)$);_hrHuHZ7;p_uJrKdhL#?A{gv*5(%o8Iqv8TYd+pEymz_k12T@fXNyUZ85hQZi z;oxD$b#w3hM1V;}5Mgp8lm>G|In~fJon7$~-?U+5Mkhgh<`9r&W*}S3G=R5YfX2&+ zI$M+lZ*Fc|?x2}}^Gv?)By;8)-L#Y6D^8vBkBZfOes#_38#~N|(;#mSo@X1*4Msg; z36v2Lk&Hx$LsIjj^$vYU6+++)#KO@$XJYFOO1Ki<3{PM+rdnmrT2##L|2y5wsN6!`6Gq zxBTu-Xy3AZkebpIi@r{01m-aA5>nv;z9=Q4UhpfkIuXRTJT*%#gT(|KW5Y?*{(uow zJ9Z4$s^7gqTXfy$qvB6Iam8_Np?5K)h3n-;vq^&JiwoG;*WbDG?Q0!tZk;DBx_Es$*w_PCEeN!ze!$dKMQmDhnn$l53`->&u$P)gRMUC+O{-&4 zYJCDp8SF1F0MR2ro>kEX+YHX8zpU!wyXo%Ns$Y5eg#zb}i)3|!l>rK!=7$N!8U$fb znyUuH7cDsbyWwcCwY{tK!F%`HKHH@5RB;PaFu~#0$idQIkRlPT0b3e-@~+iK)6kPlN#vCg{^^zpN|hr1Ux_r?^~?j0wKa8= z8e@B1c&HMUAmjZ@#|h6*LJ)_bg2<+e~f^p{&G}GF4F6-g&_c2$jw63OKuT ztF|7@f~4uP3S78L$8*HcWuoB7Yn8%VM{B8+gUySzwiZlK5OJ{gNLYCUD&12|2;g2g z?Gu1#)LGnXt&l%ph2ib7QQY>?#YM|*d#8uo*o&8rn!E}!o9r+}^gs@xE4F`l$KWDz z_42}5ZYG0ArFiXa=b*S1r9dMhr~{5&ZjBTcKKhqG7oKxYW#I+C`Z(vUPe-RhkTBrQ zM7M)!IR#*{I~(m}iEnb@mG=lY*)*04E#17I-THp&gIhj|RIfb7Fu?YGjL>;q6=Nr;zoae;p{Wd~2pCHJT?i-qq^E*4@jF9$f9%NO(x>bq8S_a3%f zQd_%efyQne^_U)10?BY8e&>KK!DGGv%aU3gV$-?DGaNLic*1ZO1P#TlYEFlmDCt_$ zs>m?>&&5xua;n$OH{WU5zbqK=Yk_r@BiIDFM-E%+Eh%ge)0!Mg9Mx15zjsP+G~u{-{@=pYHq21 z&HH8T(|>(~zswb}hyke<;QY*lLQdFesW+d47_$nZaQ|4Q6?i49IF}MgQ6rcN252!6 zIg3mY6mFcw9?+GYt&MXH)-pCpZ?oR&6&4fY94dvrO6}z zc%Cu#zLOOvaN7^q9k39<*Hcl9Y?@VyRV!0?p*iA9GW`V&_VUs?zP}S=hxU2-yNO!9+G=a=y+>nivNzIJDjm zfe;b(X(*A1OtH9#&@*$Mk>p@PwsCX?qF97SeX#XrmiXj>8hHik-#zYg)qQYrOm+u_ zK{KBh`p$UX)qC>WIR%9W92RwgJ~q%7 zgR^ITGRWTC7Ins*7soFA+c>X3Cn4lJ_1(}mJ=fHuu*-57;bRJt#hs%l0&KmIh7|J@ zNJx*x1jxCgH%t}?%|{lJ7NXdIQLfwsIrEYk{{bi4kwf~Hsi!^D(SO7ewWO%YC@E<& z^2-}jg@ae?zAjs=Dh>jYv4lsGk_FsDOinuq#W_F)`<78=`-tp0m@=i&lja-gv_0|V zC#Ums3{5N6PT)Q@d%s?r{e5~=@;On?FRj*;R2)u65~g*l0u}y zzM&JWT`<8|ziQ%vdLs`6iVKlM?~$MT%eqwOO+W9E(DlzAX&*a&;jRm=zg6p6T-Q#8 zt0)TZ8--nkbW;KaOt7Z9Ads<$j6(s;a`r|N$K$zt8t6!z$Y_v6cGPTs*phn@_6t_Q)Q*|~OeY>%t^4@PQ#q_JoIdqEG24|cO0t|vD_uA7fhW4;3`0T< zHUxN1nf%ZKzAM3!XK4US7&jJW!?)wLeI!9Y1z_e3xm*8bWdjC$TX^@=Q;Mgb`igk{ zeV6$zy7NSeD7y@^8&MdI;vpBFX~7!7@f({WZZHHzgeh@$11aF793Z~amm+6j6kNtF zAb!jt8O;@4w;LY2>1|kYT57{r=O9_sK`foO`-*f91p3Y`qis$k526I$FOsW*2fl$L z`=u-s^uj)0i8=lb(dmr&FS+twen+&iwM^St*V{m1R61kIdsbxtYYDwjI&2|V;DBSY zxxhhiH<2S#8r080(h}Pf388)~3qxZAjm7DmJNJzC91ig2=eFjL8$aLU_ctd!!=5y> ze3QbE<``JcgJss-Q#6wM_qoCB_h5^8+}Z&q2swzg6eN&-;GF9Xv`syBjx$eDg^O;x zDs;)iC&VXR{#((dWQN@i5mMEgr&*SUZGH~yKSyXx_^dH7G*MT6cGVT)_w0Z3hRWe` zJmz%_8Mrz(Ykn9qlr0&yP#0i?xelviN+fr&lh(B;ROHnt!WpGydvV<=@B_Lg>kB{I zYt;X6g4ku`%c)4t7Q%dme9x5g9`p>F`j+*ALx5OYN0C&wX&Os8FHkY^ zIhnAyk+}g|!F28-hvx@t!de!uJlZA-M(@ji{%GenHW(}hNcr8@8&Y9&hLbpj#@XPw zf{GK2mMDUTgXS3~SodIq6Vj4TPT|;=>p0v1Eoe;+I{OmcR?=b`K*rJlyqg)2)j~Pi zPI6!erH?&|B7Fuo^`3F;N8tzWJ8Rt4m;cHA*z@CayLH{>opjtAQc0H|T_|xdkXpL< zc*$v2a3_zNG|67!10ymr%wUno^scozU3?I4V zr|n*EFkLYE6U&KMNe>FlP-$O@);7tcV?SNMoW@J6P%yLO*jd#-vVQ$I>%zYQ3VZfj z7A%|bd(~HDSo2VMW*s*z`>hBzL%hOWS@#tQ$BosD;iJFKA3AV_lH+UVuaxX-s>-1P zcMj?w|Kmbi&mv?%5_L2OsiJ?Ee=>ma0Z8`3J>OXkZQt4V>l^QRs(tg;A@Qx-2X?>s zyr=A*z1PcSo@Pf>K54ejABkfLXZs2#Q{2}^5hN8Ih=jthwFZY?xX#+ZUDT4AvKxPY z`C6-ve-rqJOnfn(GvsqaM$n&>C|Lt0=qTI_%kDB0baH(;yFzWOx|P=!TMr&)NbacV z@7lalGhXNe(otRTep1& zvh0IDDX^nui=?SEog|kPQNr{Tx2{y6Mor zrubvPT@sqAQnH}?TCqp>&1Oi7mHzhD>jU1hM#~{{;aMEIN}dJp^p)3r`Fee2^kNpYV+Slx*h)Ktx;n}>v(nv7Ez3R(p(f8l|rB%^k1pZ`=x^C48>6zDDlskIFLhq#U z9~PZ;^7Dpain3F3Slyop6gopxj*^7!^^{Y&s;~axTd&0e!IErMKN*5GJNoCm^w@7D zL$?{D24sd*nb;Qb4M=*7A~kTE*pKcGlCS%~Ih8NHeOYk*<|9fcjQYCvjdw2Ub?xQ< z)43L4U$7Sg80=+zR;zhq=35Cy))e(0?}ydVX?M&PElY5^Z}=FZ_|psA_1H`LmTN7bwhIVzCBqin!8 zQ3D}aQ$q#K8~Rnh|Ndo%;-6TX#it*-U+HKlXL~P99ce{=mgZX~2X_7+tI1!M3jrjm zU$iw8t8b~;0O{{~+6ixOyzk*ZD!qGb9dOCH&t_`eH~e6BG&eA1E3B337XDl`4NzJj zrx(%3js!*9O^U}1>Rup{ILt{Vw1K}>#Es@}bc*SuTiCXBh<4<(x$T# zk*(r@zzl1j^~_y4AHROFU>K4LBHJ#Qfz*fvGUEjdXxzGcXH$=#^VCn7zPj^m$Ig!z z9Vx})?nqVDfcDMR1CM&+xzl}R#k;Ks_5(lA00w85zN_K|NBupM`QjF6!mwitU}(W&JoMh% zzl+uH?!z&yIv4I5YRHXKxbIIs_1nn=t`oM|-i$8qa0dymcfg4(v%NX^7N08`NgnJH(a{DYf7WVV^?X+AENmreY zyc9g+1Qo=GOQ5AUy+Jv{x>4!GKJ@Lg3n{dDHz^zu$x^!F%F7;`bk}uveYekNf3V+0 zdW=kT`G?oIH_!Tu$ZUq4Z?8|&hfnSxQJ1J^j!NTCbCKBFLHdFSi7-)_H32{Z$Z9sh zY#VptT+bbUxYUz>;4g+83~(~kuwnBF^2!CX3YW|)5rb{8`|wip~rh92{RS~%*{%sh38@=Kl6e;iMuGpG(WxAse<3~h*yj)s!tI~Y3z1i%te z5uCD6xa`A|QxDwvT%sdrP5e3(V8Vpk10{`LFMPniaL(IBU(NyXTgeRD$lMJR&|y+| zz@X)Q&N}@iUa_9EKHBg@V8`vv%Wd}-7dCS7_;Uh#h!5t3zg{@g`@k(PNXbBn7*R91 zM@b&prjE*theH5O6fLgPrYAoGNdzhwP)?PzS8#i^vSTLApZxC2GsoU^#k~hhe1`op zfI)V-qT2BDZ`Gvy7B)kC`^ag9WWYKLOJ5guCUrr+(+W=bE?0NLz`(vywqv#5p8fJRQ4eC^I0N zcx`%V5v5wC**F3zJ3Z!IzVUGTH#j(+8-Gt0(}SOUqln0m1Aqn|2JeE!yOR8ZyS z4b#9a2$Doap?#8=WH zRdm~app`A$nHKJ7?-s1Cyqs2l@_fOP`KLI)`OGJEGzmN=VC-^GELGaDr?Qgjszx68-rpa2W>Jvy$ z8>CJcO7;^tnP$O5K|{jzAzF6FKZw^{_>ZXI<2RZEktI}%}L!fu^JUUhCE4}rjcF%rzR zEt-E?xT<<+s!Ok}j{LlqP7}b8PNf~e=7wWp8(03`wPemCIbXg#)4g)3Pikuf;WaYr z6w-G&wD5=#3o6f;`bxp3O-ISUx%L*{h@sXu*<`4FyrsRw&Ofm-VeH3NrTc*tq&_tF z{R{2)-}=0#dczpxGXf7^iav!>st&i3L+)EoCxPeuSZ%OGi5A~Ao8miyWEUWWCmcaF zAFZGXmz?=b{^X-SupIOuzj3fggO(a7CeuXZIBEbr8NmId}e@2cT z#lV#vFU%1(RUfUR)%VONyUj*Xn7RI!OrWB0az*)rPoCl^Jn%G@1HnNvfFZWKzOU`G zM`qhYwS(B!8<3W--rY?NRUu2ta~v8?8Dx-qTmcC=b}}mCB(CG%`+@yrKh9pY2C}WCx;ANDa<_P9c9$u#ZI3WFWNt_ z!>)Sj)jLYhnDLUYq;O9HWD$PDx^epJf4kAM{EO+5ns8XNCQ@)3Ea3xkC=gevc}0|p zZ$5zvCik<5&jQ0Z2X+VP;|pFUC8ZI6jlsxw(WK*gG!yjw?&+e0ke)&jmGdufP~^T^&amy8fX;ib*+sE}$jh8r9q zg#v<;QV88LAqxZ%cC|$l)xnqj@-N=e!ZkNeGRM$`yrH(aG%D-R&bvYNAt$@s)r5~D` zhNgdb#p{%;?y$Z)qQkNtG2D~tfBysLyCzQi$9K)>p}>#(fbW5`xU?oj`8(u>4aZ1& z%E@7W_rV3!jwCGHmavvz?&=W89gdP1N|I2TgM=*)#D_h_bq?kDD~noMqlgB_1``lN z%M#$EL}@9RiaF(iyjIicj4QdhZTxwcgBe=nvFUU)>Wi-5FgE((++V0KK7FU{$p;=# zzWDGgdq+!&XdrokIT1Ld<}vOr9!ihRr)>)Z)V4W6`KOPhZs#N3?_>~EmH#cg_ao}~ zwuzEx7hB%G-Ies9YcKt?YxHTKb z({dsTO#pHZH!b<7o~qY0T8)r^ZADI+`j(*n-o;cjpnxQVc*goBGIw@B@^w<-AT%_V zd$n~mmVF^l2!>PvGn=kE9Z9+OfDJ-naf55<5zB0Od2LJt28&Giqqemcr#7q`Yin*Q z7pk`mmb8T3W*Q=gk9-dcD3cQvqd>A@8qE;})DeYUpWlWsRHw4DMo{02$KzgH=l&i% z$aDXf&st1dURw)(@d=`CMWT7sHD|rzxZ=*sC1_?c6!Fi$`qo!fBWXYLwdbdQzuV+s z;E)(#0qkx2(uHSx7r*#dB^k`;WX*Kv(uQR%wEBx`wl$Pl+N#pv;xxJZGD&^Psl1;b zc?06fO-QEd;2%Iyc5)UTmg+<9m~wn*?PLxz9Z;geYg@n3_N?!d8Hv++@n^<8Z+!l>|&0AHl~ zT(o^J05&g_~!ke3uj+>-?Uq<_`{+4f`5qtoecQy zLrQ7%Z;k<)Zam0Zm#r7|Eqmu%S~hDX{BK4OdgUAH)N9Ush0eSBZg)xX?j$6C@o(>c zBzN6M=LC+q;E5@>Ty@V+>3aA+92N#Jqym8=?Sq#dbZ-9id_j^W^1$&zq`qCWo7OL{ zvz#x#iW$LeRUoQ8dM;KS0TXS+Egx?OQJ_h<)TflxNjLxU5zqNo-_1V^+P-aPzqNmS@XrI(Eko^hJaKyN zfB|beC)pk<95x0pq@poz;>!=N@-BV%7Ew>+QBE!zYNOVMI4%Bo8@08@tw@5U5OQZV z(pt(1Q&i$K$pxZn@M8|Y0!!v5F-In+&qf|6XWk+yP!wJ`Zos~4nn5W9<%zgS@h~E= z4vhk>Dl{&E(2;A;L@hjvf&FTasr_igg`>%p1F2`iGcfUSy}dC^b07GE+N$_BB7m1D z=_7~uT8CYB{$G7(U2OGiwpH!uzvY%2-yH6bdBxv7eX^@(ug#fC{xvwP46p!VAKP9v z!Zvr-!?yZOM~V6Qh|57@ggTp7HPNbNyD7;Zbz%X`N+6piq(#}nK_IU~(+GlXEeY%4 z)v2akp%9dSvuf)fDzL0SG>ZT6QyhY@3*cOXtCpZ4J&x){L(dvc{xUd!zQHop%o#*o zxOv$J8|a%?*N_1t!k2x8{^kMR1R?vA9=hq4E;DDmBPdD|^bvM{vtmm6se2zObD5HU z=M!hRd-T|fTMr8yegjwJW{8bzpjPH?IBx85Gc4l$=yf$A1<6Z4BsycrwE{sQ^I^|5CN%?)w)&q~Q}~kwe#D4*eF~{)P$^Z6>`opZ zh;A_mBXLhQ?!2Zc3L%W3q=|-Kc&UYR$SijQCFY$?MB*uU51k z%aqI?i{NS0w|iF$)mFC9j&B>NZgYz@V8>$_d|eU+quYo9tET_)H@6mz9kmF)$%s`~ z4@|%N(hc5k=KaES=d?vHxak)EaVNZWC`s1A!2b#ZI>BN@<+{n@k`Hfjv{X$JwG`4) zv;XDtIkN1S}@yC*+#*OhXvzukzzWWMzHAC)iP zzfefTJkb$TJ`jI-%PpSnUAI{e{+r-`l>wb#^-gZxJV9Ky@Iqz#@>8T_Bv<0lhH-(j zPNfXmRvV=q^+~GRou)_}#)s)=@q_L&eFN4Jg>{^cA<&IAL z_4$uZxcdCRIDDRv5DDd*Z$156bM9-`#GJ*Ak&`d@OWtW`&2o4TZII=s!2byYI)O9k zWFS~*R;@dZHY_DH>Y7v3)Sjl6ph1D4N(o3jkIOQB zxdqIC48Z|l0-rNDLqq$VvPgNz%L?5l<=SkNbK)s49&z_wSD7mp&k*LnbE#2VGccYu zgxE2sy&xZZ(rfuWx*S$Vdm#8fWx#jA>OSu1C^C0ejiZ{4ljNqIgM@~f;Zic_7j^gy ziy`cW8DGJQreZOj;s|L|X&z(X{D39gKnROm0?`wHQqqM`G?6r^rp=)30VLc>k%m;* zV#5b_-;&2p^{|P zhVk}Ps6a?1Jh3gC#@N)jCzEa=r{I4Oc3xE2RNqn@45l5yI8j^Jq(EG!e5XKt-3Imb zN)%L0J(ORzQy72L$GOvIzFIzP(CY91SR9W_^O(Y+_V4@@_|Ij)0RT8>ZOz`GCz7uD z7hO5e2!@LNZaL9=?2r}if}Dky0RsaA1OWvA z000000003300R*r1TjGp6H#%2k?=w?GhwmO|Jncy0|5X65d#qbKLGv5Ue~l8+T#VP zf@;c=d$@*3QIf>$0QDq+sw4q(ECNl0DVQRbVgLgqo|=@X?Y%QGOI;03ZO0auaesrLO-Cl=m|#G*00HfITowaH zq3u@+ib*lfC-Aq$c^{b8vDS94jhI!^H+FCo!GwHy@0|Py9-0CwI=Vsp6teJeOG<{AKO;7T`;7HO;4*P$JSBMcCv}XMRqG~szKsO z+yrk`bAPcPzMsQ1bH=hl>m+P4u7@CxL#T0AY`fH?FT9*2ta71N9(xh3X`Q<>Q{PjD zYgDcG@F*?ZvHt)O0R6|$pEIcIi8g@!RMoKDTAGc zqiN3)Epg14ueYqoI7=g=aU_e)8_a9E3xAZdRmDegjRb{H1d4nT5srtE$4}o*C#EBi z(o3xol>tND%Nqxc@$Rty0GRk4V9Hl`La=dT4~65g-XW__7^v#lLsBz^4fr4Hx9arO zlCWS1IU0qw)vetpg0>K{Lxqw&Y3I^6#f|89limTzJI!7 zqOYFW_JHc?en)YS5Ewc{fa-3CRowMvJ4ZfupFRu0stZjr>GIDrn`-M5&#^abTaw*gTGO zVswFsE2A8lNo971daG>iUP@=T0Rel8dYcMHT|9bntuf<<($b?M#I}~&E3&4+(k^E;-5{+`j=6uAp7^)@t4{$ z$x&Ox5h$qF6I8okcY}5V(ML1panS4KO*+dEblq5FA2F$_%IG_~Y8!NY?IcI|SdWX^ zWXb#2^Ij~FKO1GXQJoKJz1N$Uuv?GX3}g>mG>w?!9dN^&dXEmkD1X2wS-(pR&FP~I ztlcF0D*7gn9_FD0OhDw|_rrlXQYvJUrk-9cik8U)bI2{FveTPw;KmrVH6f*3 z{uc+tK6%f`>Z&PLAdJhVLv6^!Z(Tu0c%n3S2>9bWs}Fe(nx2PI_X=vOH1Shir6vL4 zqq?f+gkb&LqkN2Hb-*W>$QDpOKsqJT8oGC;tBGZXL54>e2Y+3qP7L6Zo{~z6<049w zl~9JBD9mXVaw=)qc%cWA0ym8LjvVinVeO%*BPMepS~{u|C;iniiDG|=L_adaNpF@p zY;l~4YHYk&jzr#S5`4VZ(~MeeA3;*M>p|`HGDyxLl-?S*hWPMMTIJWG#fJg?U0x zAgVWW)RMXKO1BB>OUuTwM;2JiC%Yb7i;Ls#fHx$fo|Y)*%F;7AE?Nj=&!Wf4**y-^@j{*k%= z0O!w6Zm^cLr2yV)f{-RTh9?|fE`Kd0XEj};rAR?0pNPoZz~aW=9fAJ(qKOFYHLomX zJTjgJ{C@+7-~LPb&bXw#P6wH#X6RA;T+RDqAG6PFxsl+fl*KE4RFDCa`ht(1mtQF) zxFk

)%t7>PX7AMmT?cTgre%Fndt(I0r}8;3D3cY zmX6m^H|_`)maaN^5q++=zl+4BBvMvHJk^IWrhn1ClwGJQ*0x&9Vxy85zJ<2pBd9$N zG3V1=Tka`S9}?wAJS?rTL)0BEhmaUtN72X#D&Q3(1RcQ|hrQTpZTBfY%C}8ZYpG5) zf)k$ZUH4zh)8&!yt4VXn>vWv2Bdu1Yx0wJ`+(`b<*lH`TedXfcEEd{j;)#)wHu`VX){mgHBtS)=entbsDAcB@kHL%^mjAtEGHYke89LIRH7a@&nIY z+-{K4pfWz~vZ&m#@&ik))U(}gBCe{P)(F?Z8y)>m$CuMslQ%>FbseGIm4aBQXRDSU zyp`F`Pm2VTs!qw$nW@dQKy7}q)OqJQYW9;erB@HDz4p77?5+rU#nE;Czyb=w>jdYU7TkLgi%||mIWvFsV$=|zTdifrs)ExzJv46o` zTGK;3kW0ci+7}}yraNg&vZ7r>#B;7Xg4x_8L>cR6QC;L{`!a1V$v^ylR_;cvP&*85N=X14e6H=c!7sK@* z*BXB!-rEtIF)oBNIH-?-vH4DNPk)v``D-a|6c3m#NNJy}RcXL}S?BQ?&<#n~acFwh zR^tAVBX)+L@b}C-))yoBYb36?T-}n}2vi3h0N|ylG4H`3rFK^t z*oMXk(G=pMwxuJp(zGjrWuBr2L<681!DF8!X*mbJUDoE^jPn-iDq&=~#IalHWo# zMI31wDn_AIMidS}d1(3?6MNKv*VbS3^-Iy{~DQ M01F7bl1n+QPx6O@D{C^c# zwPH1UCR>+YD;WbI(n~ThFbuE-n(aOj`_Fd&yp9hJ!l}%-T0laV2Y1yuKv_qJ?cuA~ zA2!V(^RK!z>oxX=P)-$1k#Ki?qV%JC-(@5Cma*Oq5rJQ9#bHVA!W#@hC@*}fvu=4U zDC=gc>R`?&ZL%fv+~7plA@c+so({jN=`!La?*M>x^xGO6BI7pdjYY7vXhFLN`()f@h}RS2>*L;>GXoEj<{AXLDqTUQ zZ2{H=b8+>>#y041%q!c0^O0H#M*;YPrqwo`TRld65)fF?_Wjw}>nd_N2LRBDy&bXV zAbuJp(xv(Jx4V8(Fr7k6bc*6BM&t@MpOX#xw|6W5R*i?ZZeBWc-gCD5$5%VnZKAv> z3MawS=;ZOwl9Ro>+)Hug(TB+%Rmo~DE$j5V>95(zF%F)h(mEU84G&-+1pT@zfz-rM zql##v7W01*uj}w5?}5H!Mr8-XPp>`*@t!ACVoC#CE@tonr71+;Gb*8ciEW7O^uAw0 z42r;vWcQ^H2;4m2&75n6r`r7 z`M_!8<`Ko=Li5_EB^4>64u=?Ujw2KxSdRff)LjyLK4HO#@)-*v*LG_kyI7VqH& znE&G#bEO^g<=-t~3x3cCF$oP$kkY~*r%2U{Glu%nt)H^~l3qIyuvchj!+*hTB7 zWS4Vw(^K8XT(4!&-8=9BokXV+lSp$hJewJhh|3>a!u2%5`X{W9$_T$4z7dgTzYn(N$v zG)m4mFX-DbWEuo?`e>!DO>t(gR_d)L*6MsUk{ZW&cQzHQ!5JKm*J?J+@ z7?9F8e^lS)`eO94|5e}NKdnB+7bu|Nal+%EVzy_`9et~02 z&zf+W4+bFL()BwkIMi<6-G{J@GP;2wA=tTSHZj+1)r*6vn2Fu8oXeE}q*i!(jMi$A zZ@BV-p4QU{96Yi1W+JdGNV7U2yBWscXI4mb7Y(bMrpD@Qtuvqb?+WF9acmEJWAuoc zd_;VPPpUL^`HNj8eVq>|q?>5FZM2Mk&M8o9P+z*cY;hc#%LSApR2MI$#L+rQFV1jQ z%u_=-byt*Ha-1$h)|)e&t?-*Bl_ranl48r|EJk68@wm6RK-$JYjPY;sc`1YS>x+!e|FWS5_^O6PM;b1| zm_!xkTp&X~k{KV!I+=$5cW~$9fs(d%-xeglGAX<8C+VNwKVum5UOnWVpdKcS&;C5g i6MsP{?5lEaQ;BEh6c!VJxf`Iq-;)OpVu5IoWc1%Q_BXcx diff --git a/plugins/english/ellotl.ts b/plugins/english/ellotl.ts deleted file mode 100644 index 7c058e2..0000000 --- a/plugins/english/ellotl.ts +++ /dev/null @@ -1,426 +0,0 @@ -import { Parser } from 'htmlparser2'; -import { fetchFile } from '@libs/fetch'; -import { Plugin } from '@typings/plugin'; -import { NovelStatus } from '@libs/novelStatus'; -import { Filters, FilterTypes } from '@libs/filterInputs'; - -class ElloTL implements Plugin.PluginBase { - id = 'ellotl'; - name = 'ElloTL'; - icon = 'src/en/ellotl/icon.png'; - site = 'https://ellotl.com'; - version = '1.0.0'; - - parseNovels(url: string) { - return fetch(url) - .then(res => res.text()) - .then(html => { - let isParsingNovel = false; - let tempNovel = {} as Plugin.NovelItem; - const novels: Plugin.NovelItem[] = []; - const parser = new Parser({ - onopentag(name, attribs) { - if (attribs['class']?.includes('maindet')) { - isParsingNovel = true; - } - if (isParsingNovel) { - switch (name) { - case 'a': - tempNovel.path = attribs['href'] - .replace('https://ellotl.com', '') - .trim(); - break; - case 'img': - tempNovel.name = attribs['title']; - tempNovel.cover = attribs['src']; - break; - } - if (tempNovel.path && tempNovel.name) { - novels.push(tempNovel); - tempNovel = {} as Plugin.NovelItem; - isParsingNovel = false; - } - } - }, - }); - parser.write(html); - parser.end(); - return novels; - }); - } - - popularNovels( - pageNo: number, - { - showLatestNovels, - filters, - }: Plugin.PopularNovelsOptions, - ): Promise { - let link = this.site + '/series'; - if (showLatestNovels) { - link += '/?order=update&page=' + pageNo; - } else if (filters) { - const params = new URLSearchParams(); - for (const genre of filters.genres.value) { - params.append('genre[]', genre); - } - for (const type of filters.type.value) { - params.append('type[]', type); - } - params.append('status', filters.status.value); - params.append('order', filters.sort.value); - link += '/?' + params.toString() + '&page=' + pageNo; - } else { - link += '/?page=' + pageNo; - } - return this.parseNovels(link); - } - - parseNovel(novelPath: string): Promise { - return fetch(this.site + novelPath) - .then(res => res.text()) - .then(html => { - function extractChapterNumber( - data: string, - tempChapter: Plugin.ChapterItem, - ) { - let tempChapterNumber = data.match(/(\d+)$/); - if (tempChapterNumber !== null) { - tempChapter.chapterNumber = parseInt(tempChapterNumber[0]); - } - } - const novel: Plugin.SourceNovel = { - path: novelPath, - name: '', - genres: '', - summary: '', - author: '', - status: '', - chapters: [] as Plugin.ChapterItem[], - }; - let isParsingGenres = false; - let isReadingGenre = false; - let isReadingSummary = false; - let isParsingInfo = false; - let isReadingInfo = false; - let isReadingAuthor = false; - let isReadingStatus = false; - let isParsingChapterList = false; - let isReadingChapter = false; - let isReadingChapterInfo = 0; - const chapters: Plugin.ChapterItem[] = []; - let tempChapter = {} as Plugin.ChapterItem; - const parser = new Parser({ - onopentag(name, attribs) { - // name and cover - if ( - !novel.cover && - attribs['class']?.includes('ts-post-image' || 'wp-post-image') - ) { - novel.name = attribs['title']; - novel.cover = attribs['src']; - } // genres - else if (attribs['class'] === 'genxed') { - isParsingGenres = true; - } else if (isParsingGenres && name === 'a') { - isReadingGenre = true; - } // summary - else if (attribs['class'] === 'entry-content') { - isReadingSummary = true; - } // author and status - else if (attribs['class'] === 'spe') { - isParsingInfo = true; - } else if (isParsingInfo && name === 'span') { - isReadingInfo = true; - } // chapters - else if (attribs['class'] === 'eplister eplisterfull') { - isParsingChapterList = true; - } else if (isParsingChapterList && name === 'li') { - isReadingChapter = true; - } else if (isReadingChapter) { - if (name === 'a') { - tempChapter.path = attribs['href'] - .replace('https://ellotl.com', '') - .trim(); - } else if (attribs['class'] === 'epl-num') { - isReadingChapterInfo = 1; - } else if (attribs['class'] === 'epl-title') { - isReadingChapterInfo = 2; - } else if (attribs['class'] === 'epl-date') { - isReadingChapterInfo = 3; - } - } - }, - ontext(data) { - // genres - if (isParsingGenres) { - if (isReadingGenre) { - novel.genres += data + ', '; - } - } // summary - else if (isReadingSummary) { - novel.summary += data.trim(); - } // author and status - else if (isParsingInfo) { - if (isReadingInfo) { - if (data === 'Author:') { - isReadingAuthor = true; - } else if (data === 'Status:') { - isReadingStatus = true; - } else if (isReadingAuthor) { - novel.author += data; - } else if (isReadingStatus) { - novel.status = data; - } - } - } // chapters - else if (isParsingChapterList) { - if (isReadingChapter) { - if (isReadingChapterInfo === 1) { - extractChapterNumber(data, tempChapter); - } else if (isReadingChapterInfo === 2) { - tempChapter.name = - data - .match( - RegExp( - `^${novel.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*(.+)`, - ), - )?.[1] - ?.trim() || data.trim(); - if (!tempChapter.chapterNumber) { - extractChapterNumber(data, tempChapter); - } - } else if (isReadingChapterInfo === 3) { - tempChapter.releaseTime = data; //new Date(data).toISOString(); - } - } - } - }, - onclosetag(name) { - // genres - if (isParsingGenres) { - if (isReadingGenre) { - isReadingGenre = false; // stop reading genre - } else { - isParsingGenres = false; // stop parsing genres - novel.genres = novel.genres?.replace(/,*\s*$/, ''); // remove trailing comma - } - } // summary - else if (isReadingSummary) { - if (name === 'br') { - novel.summary += '\n'; - } else if (name === 'div') { - isReadingSummary = false; - } - } // author and status - else if (isParsingInfo) { - if (isReadingInfo) { - if (name === 'span') { - isReadingInfo = false; - if (isReadingAuthor) { - isReadingAuthor = false; - } else if (isReadingStatus) { - isReadingStatus = false; - } - } - } else if (name === 'div') { - isParsingInfo = false; - novel.author = novel.author?.trim(); - novel.status = novel.status?.trim(); - } - } // chapters - else if (isParsingChapterList) { - if (isReadingChapter) { - if (isReadingChapterInfo === 1) { - isReadingChapterInfo = 0; - } else if (isReadingChapterInfo === 2) { - isReadingChapterInfo = 0; - } else if (isReadingChapterInfo === 3) { - isReadingChapterInfo = 0; - } else if (name === 'li') { - isReadingChapter = false; - if (!tempChapter.chapterNumber) tempChapter.chapterNumber = 0; - chapters.push(tempChapter); - tempChapter = {} as Plugin.ChapterItem; - } - } else if (name === 'ul') { - isParsingChapterList = false; - novel.chapters = chapters.reverse(); - } - } - }, - }); - parser.write(html); - parser.end(); - switch (novel.status?.trim()) { - case 'Ongoing': - novel.status = NovelStatus.Ongoing; - break; - case 'Hiatus': - novel.status = NovelStatus.OnHiatus; - break; - case 'Completed': - novel.status = NovelStatus.Completed; - break; - default: - novel.status = NovelStatus.Unknown; - } - return novel; - }); - } - - parseChapter(chapterPath: string): Promise { - return fetch(this.site + chapterPath) - .then(res => res.text()) - .then(html => { - let isParsingTitleBlock = false; - let isParsingTitle = false; - let isParsingSubtitle = false; - let isParsingContent = false; - let chapterContent = ''; - let notContent = false; - - const parser = new Parser({ - onopentag(name, attribs) { - if (attribs['class']?.includes('epheader')) { - chapterContent += `

`; - isParsingTitleBlock = true; - isParsingTitle = true; - } - if (isParsingSubtitle) { - chapterContent += ' | '; - } - if (attribs['class']?.includes('entry-content')) { - isParsingContent = true; - } - if (isParsingContent && !notContent) { - chapterContent += `<${name}`; - for (let attrib in attribs) { - chapterContent += ` ${attrib}="${attribs[attrib]}"`; - } - chapterContent += `>`; - } - if (attribs['class']?.includes('mb-center')) { - notContent = true; - } - }, - ontext(data) { - if (isParsingTitle) { - chapterContent += data; - } - if (isParsingSubtitle) { - chapterContent += data; - } - if (isParsingContent && !notContent) { - chapterContent += data; - } - }, - onclosetag(name) { - if (isParsingTitle && name === 'h1') { - isParsingTitle = false; - isParsingSubtitle = true; - } - if (isParsingSubtitle && name === 'div') { - isParsingSubtitle = false; - } - if (isParsingTitleBlock && !isParsingTitle && !isParsingSubtitle) { - chapterContent += `


`; - isParsingTitleBlock = false; - } - if (isParsingContent && !notContent) { - chapterContent += ``; - } - if (notContent && name === 'span') { - notContent = false; - } - if (isParsingContent && name === 'div') { - isParsingContent = false; - } - }, - }); - parser.write(html); - parser.end(); - return chapterContent.trim(); - }); - } - - searchNovels( - searchTerm: string, - pageNo: number, - ): Promise { - const url = this.site + '/?s=' + searchTerm + '&page=' + pageNo; - return this.parseNovels(url); - } - - fetchImage(url: string): Promise { - // if your plugin has images, and they won't load - // this is the function to fiddle with - return fetchFile(url); - } - - filters = { - genres: { - type: FilterTypes.CheckboxGroup, - label: 'Genres', - value: [], - options: [ - { label: 'Action', value: 'action' }, - { label: 'Adventure', value: 'adventure' }, - { label: 'Comedy', value: 'comedy' }, - { label: 'Drama', value: 'drama' }, - { label: 'Ecchi', value: 'ecchi' }, - { label: 'Fantasy', value: 'fantasy' }, - { label: 'Gender Bender', value: 'gender-bender' }, - { label: 'Harem', value: 'harem' }, - { label: 'Martial Arts', value: 'martial-arts' }, - { label: 'Mature', value: 'mature' }, - { label: 'Mystery', value: 'mystery' }, - { label: 'Psychological', value: 'psychological' }, - { label: 'Romance', value: 'romance' }, - { label: 'School Life', value: 'school-life' }, - { label: 'Seinen', value: 'seinen' }, - { label: 'Shounen', value: 'shounen' }, - { label: 'Slice of Life', value: 'slice-of-life' }, - { label: 'Supernatural', value: 'supernatural' }, - { label: 'Tragedy', value: 'tragedy' }, - ], - }, - type: { - type: FilterTypes.CheckboxGroup, - label: 'Type', - value: [], - options: [ - { label: 'Japanese Web Novel', value: 'japanese-web-novel' }, - { label: 'Korean Web Novel', value: 'korean-web-novel' }, - { label: 'Light Novel (JP)', value: 'light-novel-jp' }, - { label: 'Web Novel', value: 'web-novel' }, - ], - }, - status: { - type: FilterTypes.Picker, - label: 'Status', - value: '', - options: [ - { label: 'All', value: '' }, - { label: 'Ongoing', value: 'ongoing' }, - { label: 'Hiatus', value: 'hiatus' }, - { label: 'Completed', value: 'completed' }, - ], - }, - sort: { - type: FilterTypes.Picker, - label: 'Sort', - value: 'popular', - options: [ - { label: 'Popular', value: 'popular' }, - { label: 'A-Z', value: 'title' }, - { label: 'Z-A', value: 'titlereverse' }, - { label: 'Latest Update', value: 'update' }, - { label: 'Latest Added', value: 'latest' }, - { label: 'Rating', value: 'rating' }, - ], - }, - } satisfies Filters; -} - -export default new ElloTL(); diff --git a/plugins/russian/ranobelib.ts b/plugins/russian/ranobelib.ts index 921c71b..f4f6c1d 100644 --- a/plugins/russian/ranobelib.ts +++ b/plugins/russian/ranobelib.ts @@ -18,7 +18,7 @@ class RLIB implements Plugin.PluginBase { name = 'RanobeLib'; site = 'https://ranobelib.me'; apiSite = 'https://api.lib.social/api/manga/'; - version = '2.0.0'; + version = '2.0.1'; icon = 'src/ru/ranobelib/icon.png'; webStorageUtilized = true; @@ -501,6 +501,12 @@ function jsonToHtml(json: HTML[], html: string = '') { (element.content ? jsonToHtml(element.content) : '
') + '

'; break; + case 'heading': + html += + '

' + + (element.content ? jsonToHtml(element.content) : '
') + + '

'; + break; case 'text': html += element.text; break; diff --git a/scripts/multisrc/lightnovelwp/filters/cpunovel.json b/scripts/multisrc/lightnovelwp/filters/cpunovel.json new file mode 100644 index 0000000..575df02 --- /dev/null +++ b/scripts/multisrc/lightnovelwp/filters/cpunovel.json @@ -0,0 +1,164 @@ +{ + "filters": { + "genre[]": { + "type": "Checkbox", + "label": "Genre", + "value": [], + "options": [ + { + "label": "Action", + "value": "action" + }, + { + "label": "Adventure", + "value": "adventure" + }, + { + "label": "Comedy", + "value": "comedy" + }, + { + "label": "Drama", + "value": "drama" + }, + { + "label": "Fantasy", + "value": "fantasy" + }, + { + "label": "Gender Bender", + "value": "gender-bender" + }, + { + "label": "Harem", + "value": "harem" + }, + { + "label": "Horror", + "value": "horror" + }, + { + "label": "Martial Arts", + "value": "martial-arts" + }, + { + "label": "Mature", + "value": "mature" + }, + { + "label": "Mystery", + "value": "mystery" + }, + { + "label": "Psychological", + "value": "psychological" + }, + { + "label": "Romance", + "value": "romance" + }, + { + "label": "School Life", + "value": "school-life" + }, + { + "label": "Sci-fi", + "value": "sci-fi" + }, + { + "label": "Seinen", + "value": "seinen" + }, + { + "label": "Shounen", + "value": "shounen" + }, + { + "label": "Slice of Life", + "value": "slice-of-life" + }, + { + "label": "Supernatural", + "value": "supernatural" + }, + { + "label": "Tragedy", + "value": "tragedy" + }, + { + "label": "Wuxia", + "value": "wuxia" + } + ] + }, + "type[]": { + "type": "Checkbox", + "label": "Type", + "value": [], + "options": [ + { + "label": "Web Novel", + "value": "web-novel" + } + ] + }, + "status": { + "type": "Picker", + "label": "Status", + "value": "", + "options": [ + { + "label": "All", + "value": "" + }, + { + "label": "Ongoing", + "value": "ongoing" + }, + { + "label": "Hiatus", + "value": "hiatus" + }, + { + "label": "Completed", + "value": "completed" + } + ] + }, + "order": { + "type": "Picker", + "label": "Order by", + "value": "", + "options": [ + { + "label": "Default", + "value": "" + }, + { + "label": "A-Z", + "value": "title" + }, + { + "label": "Z-A", + "value": "titlereverse" + }, + { + "label": "Latest Update", + "value": "update" + }, + { + "label": "Latest Added", + "value": "latest" + }, + { + "label": "Popular", + "value": "popular" + }, + { + "label": "Rating", + "value": "rating" + } + ] + } + } +} \ No newline at end of file diff --git a/scripts/multisrc/lightnovelwp/filters/ellotl.json b/scripts/multisrc/lightnovelwp/filters/ellotl.json new file mode 100644 index 0000000..9fb1ec0 --- /dev/null +++ b/scripts/multisrc/lightnovelwp/filters/ellotl.json @@ -0,0 +1,65 @@ +{ + "filters": { + "genre[]": { + "type": "Checkbox", + "label": "Genres", + "value": [], + "options": [ + { "label": "Action", "value": "action" }, + { "label": "Adventure", "value": "adventure" }, + { "label": "Comedy", "value": "comedy" }, + { "label": "Drama", "value": "drama" }, + { "label": "Ecchi", "value": "ecchi" }, + { "label": "Fantasy", "value": "fantasy" }, + { "label": "Gender Bender", "value": "gender-bender" }, + { "label": "Harem", "value": "harem" }, + { "label": "Martial Arts", "value": "martial-arts" }, + { "label": "Mature", "value": "mature" }, + { "label": "Mystery", "value": "mystery" }, + { "label": "Psychological", "value": "psychological" }, + { "label": "Romance", "value": "romance" }, + { "label": "School Life", "value": "school-life" }, + { "label": "Seinen", "value": "seinen" }, + { "label": "Shounen", "value": "shounen" }, + { "label": "Slice of Life", "value": "slice-of-life" }, + { "label": "Supernatural", "value": "supernatural" }, + { "label": "Tragedy", "value": "tragedy" } + ] + }, + "type[]": { + "type": "Checkbox", + "label": "Type", + "value": [], + "options": [ + { "label": "Japanese Web Novel", "value": "japanese-web-novel" }, + { "label": "Korean Web Novel", "value": "korean-web-novel" }, + { "label": "Light Novel (JP)", "value": "light-novel-jp" }, + { "label": "Web Novel", "value": "web-novel" } + ] + }, + "status": { + "type": "Picker", + "label": "Status", + "value": "", + "options": [ + { "label": "All", "value": "" }, + { "label": "Ongoing", "value": "ongoing" }, + { "label": "Hiatus", "value": "hiatus" }, + { "label": "Completed", "value": "completed" } + ] + }, + "order": { + "type": "Picker", + "label": "Sort", + "value": "popular", + "options": [ + { "label": "Popular", "value": "popular" }, + { "label": "A-Z", "value": "title" }, + { "label": "Z-A", "value": "titlereverse" }, + { "label": "Latest Update", "value": "update" }, + { "label": "Latest Added", "value": "latest" }, + { "label": "Rating", "value": "rating" } + ] + } + } +} \ No newline at end of file diff --git a/scripts/multisrc/lightnovelwp/filters/ippotranslations.json b/scripts/multisrc/lightnovelwp/filters/ippotranslations.json new file mode 100644 index 0000000..864f838 --- /dev/null +++ b/scripts/multisrc/lightnovelwp/filters/ippotranslations.json @@ -0,0 +1,128 @@ +{ + "filters": { + "genre[]": { + "type": "Checkbox", + "label": "Genre", + "value": [], + "options": [ + { + "label": "Action", + "value": "action" + }, + { + "label": "Adventure", + "value": "adventure" + }, + { + "label": "Comedy", + "value": "comedy" + }, + { + "label": "Fantasy", + "value": "fantasy" + }, + { + "label": "Harem", + "value": "harem" + }, + { + "label": "Mystery", + "value": "mystery" + }, + { + "label": "Psychological", + "value": "psychological" + }, + { + "label": "Romance", + "value": "romance" + }, + { + "label": "School Life", + "value": "school-life" + }, + { + "label": "Seinen", + "value": "seinen" + }, + { + "label": "Slice of Life", + "value": "slice-of-life" + } + ] + }, + "type[]": { + "type": "Checkbox", + "label": "Type", + "value": [], + "options": [ + { + "label": "Dropped", + "value": "dropped" + }, + { + "label": "Web Novel", + "value": "web-novel" + } + ] + }, + "status": { + "type": "Picker", + "label": "Status", + "value": "", + "options": [ + { + "label": "All", + "value": "" + }, + { + "label": "Ongoing", + "value": "ongoing" + }, + { + "label": "Hiatus", + "value": "hiatus" + }, + { + "label": "Completed", + "value": "completed" + } + ] + }, + "order": { + "type": "Picker", + "label": "Order by", + "value": "", + "options": [ + { + "label": "Default", + "value": "" + }, + { + "label": "A-Z", + "value": "title" + }, + { + "label": "Z-A", + "value": "titlereverse" + }, + { + "label": "Latest Update", + "value": "update" + }, + { + "label": "Latest Added", + "value": "latest" + }, + { + "label": "Popular", + "value": "popular" + }, + { + "label": "Rating", + "value": "rating" + } + ] + } + } +} \ No newline at end of file diff --git a/scripts/multisrc/lightnovelwp/sources.json b/scripts/multisrc/lightnovelwp/sources.json index 8e11f91..19f5a37 100644 --- a/scripts/multisrc/lightnovelwp/sources.json +++ b/scripts/multisrc/lightnovelwp/sources.json @@ -15,8 +15,7 @@ "options": { "lang": "Arabic", "reverseChapters": true, - "customJs": "let ignore = $('article > style').text().trim().split(',');ignore.push(...(ignore.pop()?.match(/^\\.\\w+/) || []));ignore.map(tag => $(`p${tag}`).remove());", - "versionIncrements": 1 + "customJs": "let ignore = $('article > style').text().trim().split(',');ignore.push(...(ignore.pop()?.match(/^\\.\\w+/) || []));ignore.map(tag => $(`p${tag}`).remove());" } }, { @@ -52,8 +51,7 @@ "sourceName": "DaoTranslate", "options": { "lang": "English", - "reverseChapters": true, - "versionIncrements": 2 + "reverseChapters": true } }, { @@ -62,8 +60,7 @@ "sourceName": "جنة الروايات", "options": { "lang": "Arabic", - "reverseChapters": true, - "versionIncrements": 1 + "reverseChapters": true } }, { @@ -80,8 +77,7 @@ "sourceSite": "https://noveltr.com/", "sourceName": "NovelTR", "options": { - "lang": "Turkish", - "reverseChapters": true + "lang": "Turkish" } }, { @@ -100,7 +96,6 @@ "options": { "lang": "English", "reverseChapters": false, - "versionIncrements": 1, "customJs": "$('.genesistls-watermark').remove();$('.epcontent p').each((i, el) => { if ($(el).html() === ' ') $(el).remove(); });" } }, @@ -176,5 +171,31 @@ "lang": "Portuguese", "reverseChapters": true } + }, + { + "id": "ellotl", + "sourceSite": "https://ellotl.com/", + "sourceName": "ElloTL", + "options": { + "lang": "English", + "reverseChapters": true + } + }, + { + "id": "ippotranslations", + "sourceSite": "https://ippotranslations.com/", + "sourceName": "Ippotranslations", + "options": { + "lang": "English" + } + }, + { + "id": "cpunovel", + "sourceSite": "https://cpunovel.com/", + "sourceName": "CPUnovel", + "options": { + "lang": "English", + "reverseChapters": true + } } ] diff --git a/scripts/multisrc/lightnovelwp/template.ts b/scripts/multisrc/lightnovelwp/template.ts index 4dc74a1..4bb7789 100644 --- a/scripts/multisrc/lightnovelwp/template.ts +++ b/scripts/multisrc/lightnovelwp/template.ts @@ -1,4 +1,5 @@ -import { CheerioAPI, load } from 'cheerio'; +import { load } from 'cheerio'; +import { Parser } from 'htmlparser2'; import { fetchApi, fetchFile } from '@libs/fetch'; import { Plugin } from '@typings/plugin'; import { NovelStatus } from '@libs/novelStatus'; @@ -36,7 +37,7 @@ class LightNovelWPPlugin implements Plugin.PluginBase { this.icon = `multisrc/lightnovelwp/${metadata.id.toLowerCase()}/icon.png`; this.site = metadata.sourceSite; const versionIncrements = metadata.options?.versionIncrements || 0; - this.version = `1.0.${5 + versionIncrements}`; + this.version = `1.1.${versionIncrements}`; this.options = metadata.options ?? ({} as LightNovelWPOptions); this.filters = metadata.filters satisfies Filters; } @@ -48,43 +49,49 @@ class LightNovelWPPlugin implements Plugin.PluginBase { return url_parts.join('.'); } - async getCheerio(url: string, search: boolean): Promise { + async safeFecth(url: string, search: boolean): Promise { const r = await fetchApi(url); if (!r.ok && search != true) throw new Error( 'Could not reach site (' + r.status + ') try to open in webview.', ); - const $ = load(await r.text()); - const title = $('title').text().trim(); + const data = await r.text(); + const title = data.match(/(.*?)<\/title>/)?.[1]?.trim(); + if ( this.getHostname(url) != this.getHostname(r.url) || - title == 'Bot Verification' || - title == 'You are being redirected...' || - title == 'Un instant...' || - title == 'Just a moment...' || - title == 'Redirecting...' + (title && + (title == 'Bot Verification' || + title == 'You are being redirected...' || + title == 'Un instant...' || + title == 'Just a moment...' || + title == 'Redirecting...')) ) throw new Error('Captcha error, please open in webview'); - return $; + return data; } - parseNovels($: CheerioAPI): Plugin.NovelItem[] { + parseNovels(html: string): Plugin.NovelItem[] { const novels: Plugin.NovelItem[] = []; - $('div.listupd > article').each((i, elem) => { - const novelName = $(elem).find('h2').text(); - const image = $(elem).find('img'); - const novelUrl = $(elem).find('a').attr('href'); + const articles = html.match(/<article([\s\S]*?)<\/article>/g) || []; + articles.forEach(article => { + const novelName = article.match(/<a.*title="(.*?)"/)?.[1]; + const novelUrl = article.match(/<a href="(.*?)"/)?.[1]; + + if (novelName && novelUrl) { + const novelCover = + article.match(/<img.*src="(.*?)"(?:\sdata-src="(.*?)")?.*\/>/) || []; - if (novelUrl) { novels.push({ name: novelName, - cover: image.attr('data-src') || image.attr('src') || defaultCover, - path: novelUrl.replace(/https?:\/\/.*?\//, '/'), + cover: novelCover[2] || novelCover[1] || defaultCover, + path: novelUrl.replace(this.site, ''), }); } }); + return novels; } @@ -105,168 +112,289 @@ class LightNovelWPPlugin implements Plugin.PluginBase { url += `&${key}=${value}`; else if (filters[key].value) url += `&${key}=${filters[key].value}`; } - const $ = await this.getCheerio(url, false); - return this.parseNovels($); + const html = await this.safeFecth(url, false); + return this.parseNovels(html); } async parseNovel(novelPath: string): Promise<Plugin.SourceNovel> { - const $ = await this.getCheerio(this.site + novelPath, false); + const baseURL = this.site; + const html = await this.safeFecth(baseURL + novelPath, false); const novel: Plugin.SourceNovel = { - path: novelPath.replace(/https?:\/\/.*?\//, '/'), - name: 'Untitled', + path: novelPath, + name: '', + genres: '', + summary: '', + author: '', + artist: '', + status: '', + chapters: [] as Plugin.ChapterItem[], }; + let isParsingGenres = false; + let isReadingGenre = false; + let isReadingSummary = false; + let isParsingInfo = false; + let isReadingInfo = false; + let isReadingAuthor = false; + let isReadingArtist = false; + let isReadingStatus = false; + let isParsingChapterList = false; + let isReadingChapter = false; + let isReadingChapterInfo = 0; + let isPaidChapter = false; + const chapters: Plugin.ChapterItem[] = []; + let tempChapter = {} as Plugin.ChapterItem; - novel.name = $('h1.entry-title').text().trim(); - const image = $('img.wp-post-image'); - novel.cover = image.attr('data-src') || image.attr('src') || defaultCover; - switch ($('div.sertostat > span').attr('class')?.toLowerCase() || '') { - case 'completed': - novel.status = NovelStatus.Completed; - break; - case 'ongoing': - novel.status = NovelStatus.Ongoing; - break; - case 'hiatus': - novel.status = NovelStatus.OnHiatus; - break; - default: - novel.status = NovelStatus.Unknown; - break; + const parser = new Parser({ + onopentag(name, attribs) { + // name and cover + if ( + !novel.cover && + attribs['class']?.includes('ts-post-image' || 'wp-post-image') + ) { + novel.name = attribs['title']; + novel.cover = attribs['data-src'] || attribs['src'] || defaultCover; + } // genres + else if ( + attribs['class'] === 'genxed' || + attribs['class'] === 'sertogenre' + ) { + isParsingGenres = true; + } else if (isParsingGenres && name === 'a') { + isReadingGenre = true; + } // summary + else if ( + name === 'div' && + (attribs['class'] === 'entry-content' || + attribs['itemprop'] === 'description') + ) { + isReadingSummary = true; + } // author and status + else if (attribs['class'] === 'spe' || attribs['class'] === 'serl') { + isParsingInfo = true; + } else if (isParsingInfo && name === 'span') { + isReadingInfo = true; + } else if (name === 'div' && attribs['class'] === 'sertostat') { + isParsingInfo = true; + isReadingInfo = true; + isReadingStatus = true; + } + // chapters + else if (attribs['class'] === 'eplister eplisterfull') { + isParsingChapterList = true; + } else if (isParsingChapterList && name === 'li') { + isReadingChapter = true; + } else if (isReadingChapter) { + if (name === 'a') { + tempChapter.path = attribs['href'].replace(baseURL, '').trim(); + } else if (attribs['class'] === 'epl-num') { + isReadingChapterInfo = 1; + } else if (attribs['class'] === 'epl-title') { + isReadingChapterInfo = 2; + } else if (attribs['class'] === 'epl-date') { + isReadingChapterInfo = 3; + } else if (attribs['class'] === 'epl-price') { + isReadingChapterInfo = 4; + } + } + }, + ontext(data) { + // genres + if (isParsingGenres) { + if (isReadingGenre) { + novel.genres += data + ', '; + } + } // summary + else if (isReadingSummary) { + novel.summary += data.trim(); + } // author and status + else if (isParsingInfo) { + if (isReadingInfo) { + const detailName = data.toLowerCase().replace(':', '').trim(); + + if (isReadingAuthor) { + novel.author += data || 'Unknown'; + } else if (isReadingArtist) { + novel.artist += data || 'Unknown'; + } else if (isReadingStatus) { + switch (detailName) { + case 'مكتملة': + case 'completed': + case 'complété': + case 'completo': + case 'completado': + case 'tamamlandı': + novel.status = NovelStatus.Completed; + break; + case 'مستمرة': + case 'ongoing': + case 'en cours': + case 'em andamento': + case 'en progreso': + case 'devam ediyor': + novel.status = NovelStatus.Ongoing; + break; + case 'متوقفة': + case 'hiatus': + case 'en pause': + case 'hiato': + case 'pausa': + case 'pausado': + case 'duraklatıldı': + novel.status = NovelStatus.OnHiatus; + break; + default: + novel.status = NovelStatus.Unknown; + break; + } + } + + switch (detailName) { + case 'الكاتب': + case 'author': + case 'auteur': + case 'autor': + case 'yazar': + isReadingAuthor = true; + break; + case 'الحالة': + case 'status': + case 'statut': + case 'estado': + case 'durum': + isReadingStatus = true; + break; + case 'الفنان': + case 'artist': + case 'artiste': + case 'artista': + case 'çizer': + isReadingArtist = true; + break; + } + } + } // chapters + else if (isParsingChapterList) { + if (isReadingChapter) { + if (isReadingChapterInfo === 1) { + extractChapterNumber(data, tempChapter); + } else if (isReadingChapterInfo === 2) { + tempChapter.name = + data + .match( + RegExp( + `^${novel.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*(.+)`, + ), + )?.[1] + ?.trim() || data.trim(); + if (!tempChapter.chapterNumber) { + extractChapterNumber(data, tempChapter); + } + } else if (isReadingChapterInfo === 3) { + tempChapter.releaseTime = data; //new Date(data).toISOString(); + } else if (isReadingChapterInfo === 4) { + const detailName = data.toLowerCase().trim(); + switch (detailName) { + case 'free': + case 'gratuit': + case 'مجاني': + case 'livre': + case '': + isPaidChapter = false; + break; + default: + isPaidChapter = true; + break; + } + } + } + } + }, + onclosetag(name) { + // genres + if (isParsingGenres) { + if (isReadingGenre) { + isReadingGenre = false; // stop reading genre + } else { + isParsingGenres = false; // stop parsing genres + novel.genres = novel.genres?.slice(0, -2); // remove trailing comma + } + } // summary + else if (isReadingSummary) { + if (name === 'br') { + novel.summary += '\n'; + } else if (name === 'div') { + isReadingSummary = false; + } + } // author and status + else if (isParsingInfo) { + if (isReadingInfo) { + if (name === 'span') { + isReadingInfo = false; + if (isReadingAuthor && novel.author) { + isReadingAuthor = false; + } else if (isReadingArtist && novel.artist) { + isReadingArtist = false; + } else if (isReadingStatus && novel.status !== '') { + isReadingStatus = false; + } + } + } else if (name === 'div') { + isParsingInfo = false; + novel.author = novel.author?.trim(); + novel.artist = novel.artist?.trim(); + } + } // chapters + else if (isParsingChapterList) { + if (isReadingChapter) { + if (isReadingChapterInfo === 1) { + isReadingChapterInfo = 0; + } else if (isReadingChapterInfo === 2) { + isReadingChapterInfo = 0; + } else if (isReadingChapterInfo === 3) { + isReadingChapterInfo = 0; + } else if (isReadingChapterInfo === 4) { + isReadingChapterInfo = 0; + } else if (name === 'li') { + isReadingChapter = false; + if (!tempChapter.chapterNumber) tempChapter.chapterNumber = 0; + if (!isPaidChapter) chapters.push(tempChapter); + tempChapter = {} as Plugin.ChapterItem; + } + } else if (name === 'ul') { + isParsingChapterList = false; + } + } + }, + }); + + parser.write(html); + parser.end(); + + if (chapters.length) { + if (this.options?.reverseChapters) chapters.reverse(); + novel.chapters = chapters; } - let details = $('div.serl'); - if (!details.length) details = $('div.spe > span'); - details.each(function () { - const detailName = $(this) - .contents() - .first() - .text() - .replace(':', '') - .trim() - .toLowerCase(); - const detail = $(this).contents().last().text().trim().toLowerCase(); - - switch (detailName) { - case 'الكاتب': - case 'author': - case 'auteur': - case 'autor': - case 'yazar': - novel.author = detail; - break; - case 'الحالة': - case 'status': - case 'statut': - case 'estado': - case 'durum': - switch (detail) { - case 'مكتملة': - case 'completed': - case 'complété': - case 'completo': - case 'completado': - case 'tamamlandı': - novel.status = NovelStatus.Completed; - break; - case 'مستمرة': - case 'ongoing': - case 'en cours': - case 'em andamento': - case 'en progreso': - case 'devam ediyor': - novel.status = NovelStatus.Ongoing; - break; - case 'متوقفة': - case 'hiatus': - case 'en pause': - case 'hiato': - case 'pausa': - case 'pausado': - case 'duraklatıldı': - novel.status = NovelStatus.OnHiatus; - break; - default: - novel.status = NovelStatus.Unknown; - break; - } - break; - case 'الفنان': - case 'artist': - case 'artiste': - case 'artista': - case 'çizer': - novel.artist = detail; - break; - } - }); - - let genres = $('.sertogenre'); - if (!genres.length) genres = $('.genxed'); - novel.genres = genres - .children('a') - .map((i, el) => $(el).text()) - .toArray() - .join(','); - - let summary = $('.sersys > p') - .map((i, el) => $(el).text().trim()) - .toArray(); - if (!summary.length) - summary = $('.entry-content > p') - .map((i, el) => $(el).text().trim()) - .toArray(); - novel.summary = summary.join('\n'); - - const chapters: Plugin.ChapterItem[] = []; - $('.eplister li').each((i, elem) => { - const chapterName = - $(elem).find('.epl-num').text() + - ' ' + - $(elem).find('.epl-title').text(); - const chapterUrl = $(elem).find('a').attr('href') || ''; - const releaseTime = $(elem).find('.epl-date').text().trim(); - let isFreeChapter: boolean; - switch ($(elem).find('.epl-price').text().trim().toLowerCase()) { - case 'free': - case 'gratuit': - case 'مجاني': - case 'livre': - case '': - isFreeChapter = true; - break; - default: - isFreeChapter = false; - break; - } - if (isFreeChapter) - chapters.push({ - name: chapterName, - path: chapterUrl.replace(/https?:\/\/.*?\//, '/'), - releaseTime: releaseTime, - }); - }); - - if (this.options?.reverseChapters && chapters.length) chapters.reverse(); - - novel.chapters = chapters; return novel; } async parseChapter(chapterPath: string): Promise<string> { - const $ = await this.getCheerio(this.site + chapterPath, false); - try { - // CustomJS HERE - } catch (error) { - console.error('Error executing customJs:', error); - throw error; + const data = await this.safeFecth(this.site + chapterPath, false); + const chapterText = data.match( + /<div.*class="epcontent ([\s\S]*?)<div.*class="bottomnav"/g, + )?.[0]; + if (this.options?.customJs) { + try { + const $ = load(chapterText || data); + // CustomJS HERE + return $.html(); + } catch (error) { + console.error('Error executing customJs:', error); + throw error; + } } - return ( - $('.epcontent p') - .map((i, el) => $(el)) - .toArray() - .join('\n') || '' - ); + return chapterText || ''; } async searchNovels( @@ -274,9 +402,16 @@ class LightNovelWPPlugin implements Plugin.PluginBase { page: number, ): Promise<Plugin.NovelItem[]> { const url = this.site + 'page/' + page + '/?s=' + searchTerm; - const $ = await this.getCheerio(url, true); - return this.parseNovels($); + const html = await this.safeFecth(url, true); + return this.parseNovels(html); } fetchImage = fetchFile; } + +function extractChapterNumber(data: string, tempChapter: Plugin.ChapterItem) { + const tempChapterNumber = data.match(/(\d+)$/); + if (tempChapterNumber && tempChapterNumber[0]) { + tempChapter.chapterNumber = parseInt(tempChapterNumber[0]); + } +}