From 84b7c2563823fa92ec5bc8739a7fbf3dd27e5306 Mon Sep 17 00:00:00 2001 From: frankdelange Date: Sun, 21 Dec 2014 23:22:44 +0100 Subject: [PATCH] Fixed excessive rescans due to faulty time calculation, improved ISBN regexes (which can be improved further still) --- dist/files_opds-0.5.1.tar.gz | Bin 0 -> 43550 bytes files_opds/appinfo/info.xml | 2 +- files_opds/lib/isbn.php | 132 +++++++++++++++++++++-------------- files_opds/lib/meta.php | 2 +- 4 files changed, 81 insertions(+), 55 deletions(-) create mode 100644 dist/files_opds-0.5.1.tar.gz diff --git a/dist/files_opds-0.5.1.tar.gz b/dist/files_opds-0.5.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b8756272506d8a8ae430d328c38ea3f58b9444d8 GIT binary patch literal 43550 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

{b8O!Eyij!JAjR!o4Qfl)!_c-WqXeA5EcV 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 C)z{x}|v1tfYMU#*rk}u(c4vP*$Ba>L^JaU6k z3udKBOeqI@RvJpe=?}#RE~9UssUKK=&)qa%;fSZ-@GURL+U|sKABiUDqFKhz((IYH zI-XCAxe!LbSt0_~kI3Qy$EfeB=2Y;(& zVWMC50Yd2n&{cDr5ZO}QU0VJ<7)$q+{|?5_qQO=0&X+0%WHX>Za~mN!1_&+YsM~cs$}j&8ku>zgH$L++E_@!nF+o%wS2moIt7itPky}iy})helTL>I`8aOEPV*bwUC~*$b|$c63KAkf zZm_ux!+!0w>&*;3Y4vPdb7C=fg)Jnq^XuRsDo8x4u{V0sc((&i#R z2&rGm#)hArlo_zG0~NPQX5n=FI&r;3$G=9aXoWJhur&P(euk9@(_q?}%IQ7c6eLWyGuGA!sW$HE9=-=I~`jxf_Ci zJ2?2;i@hoopIy7Z;~119=TeEXBauGd4Y_A8pZ)hi<@iZipXIo}xhodxF-nhaS+)dG zt(y?qEdlwHPGkXv_x|c*O*VLf2SVZLW*!c*bk&ydPF;J%fV`&4(DDcst>GYGPi!6^ z(qmJOif}j#Z*XRR^Kavxs%=^51Z`POVy;MG?M&hcd0|uf%+^20{$*X1B`zDvo(Cg0 z5(N}Cmc{%9d{;U<)^AHAN)haWs|7K6n*<}R<}9|qL^Fue-R+&+XXlzk`QzkA&Mi&D zTFO#MK@W#lCd>hKALZQJG@33+yK{ zY6D5<&M9U)3*>ZZ*hetOJ6t3D_hS}`v0c|>6#T2)gA{27wg$L@(p5z0HH%6@Q)s26 zV`s^$V6Nah*jmhj%7rz1j8Ti~Ysw}#V-5ybHVB0++Nv7d%9fT3DS=6LGeNTvs4W$w z2t)1|TxDg;s-65uuup3Q_Oy0Z(*lC3ZGb_P>`Nv^2V$sL>P{(Wx<h1CuQT}Opj@?PNHE2Nco6~RFWJC3g$0v5RCaUvgp6Eb0yF{7WS7Fj1nI zL!-EYK-0w)a+)wspngGaxI9r7E@E@UGQ%}jC{3~xX6G=H3kCcytE$Ek3763JV~EC| zh>DSAt;n8O9UOF^nBP;prsb$s8q{EAvQKT!nwr`I?;j+JtbGR!)oSsqau`CYR=1v5 zt99W4JQ>AT!G-wJu!}-B%EJIl%roN59^j^8jI?`$hrMC|47qK=p{$A(9m8(sq@HD1 ziN(Z2Gpbx?RG?s;(ffiE1u9LVpd@Jm9kJC5NYtKnoVa2Ti?E-m z0|oG@I_Bo;fA%TQ{rHhn1UdzMLJ73MYlfq87IX@;lnI7Nw6jzoh*13Dt0PgcA<3eE zBPyup7{$|v@S}yz&)57E*#9&|bc1`d1DX>5t+Ux)6Y<~L8=W@B|6gD4F8u!=a ze`E-ij3JMV+0hiNMJz;+QZARVv61%>879O`T$DZFQ^6L?qxRb^!;;{X*4pWJzX#)% zopx+00Dmmwkg5>0*Y5kb{Lil#lN#7ZU{5CF2HU@2Pm3^VwJ3)H`aYo|CU=Hih~To) zj)o(R=AzD)@$jNvJ@%1N%2477+CE8 z5Ab|}`+sr#7gTk6=jEYa_KEUmN&!RaTID{>ZX<3YT9_?02Gt=rNod8s8x5`ySV0Zt zB*czAMR$I3X%#usoHp8)3g5SeMJ8Q42fKSZ1!JWspxD6}on5qFQGVxVrwrC4!Ty*H zY|WcW6N=akyE;h*!ih}@Lqmi<6l$vSn-#@(++qMHKzyFlZV2%MzN!OBcj^__TB$cF zIhRy1;Uomy#AQG7$3wik+O3oSX*Yj(d)5jl6;FeURbY!_#_mM4%d?{}R;d~sg@g7O zlHx+c*k;h>eXOM$g-39LJ zR^||Z-Rn9?D5jF{VeSzMLC7kWdHNwAv67i2WE!6r`!Dy8`+IM9_V#x7c4zMhYuU)e zxwJQLIItb1$QzJ3QK|=@+J#pK$NlFAZ(hxf^`|yW8{Qm^P8S@_ix#_AlShCYc4q%h z+Gom)6QW(V0 z_LBwY7`u_jz^Qn>430iJ8H;rIwzA`t77FDfg##5f263PkpPe~pTs`*{$7btW%L_c> zdnkMZHQ{?tt$j2tNg5W~8F`Z-#+~C(8fKgF(FaNKu0bM9>9CotET4S9j-s$^GPR8L zo!Y04cAmY;G+060Q*M4@*OL8FTgU@+LA7;n*wa4r0GLag{X1fvU;ILuYzc=F)EEWirOOnnCB!IAG_whOy_FE_c5{Ix_Nql~nXTRRB};zpI;Vj{n}-*x10p z5ADu+XLTX}e~{;^k^igYxYJUADMUHm0}46e25yg`^$;CF%xu1ByoI&t9ag-#3g7~C z<-YT+b00HiizKONrHwJVv6m!0*wmTL=?%(aay9el5SEP@()1RW7-6)6Veq?8 zK?r7u_^Lt@Dl0$2;PEHM?aG}0^z*(0KutOSyPI8(|I}S;cQ-aE{?qE(!v5<)p0DQo zr*|@%6B~EIZ*3$5yM-GJ!$>%bWvm0ZwzLV;wN5z!Z@JmPbBan5v*#-H9IdO^+l&`7 zG$@!4d`;>A$|hW`BcTZCddnc2t>vIdouSgy03PHmCb5{u4uGp`Be0+_IS61);oEge zn&KixUYHY`192B!!(`!W+?G{&@vFQz-Fvw-nXZxZW09kZD9?${1$6$QJm3QT8KY4m zu69w^mlUolle$D#y~tyrYF$mP-BApu0aY^-JJS~&_apd9_;4{1phULnqk<8tzJxzy zh*CYYd~{f4H%x{yi>8mM*&t-OREVFQjZ9C@w3%V7LB)3`$Jo&T3+b|equ>bN9Mszr z&Z1n59L?EfM@7$$MVMMFfmWV6mmR!;UC2q6`5??NgUbV8;ygT0T;zMbAo4MM9dV?~?Alcxnwi2Lxt6L_REpu}3Yke$ zDKqEnxRf)&LA-+y98tI-Af}o7BqD>|083|O6yOQypRj1B@AsWUQ7J0%)G*Cc2pU|WWj2#s@K96z-o34 zXa%MdP~`iKwRSsO$^^U7Ui&^@Lbf2P=PvUi3j0Mc!mW(+RnUM0BN})s1z5MTx_k>&s>VbW>0I$ezBfw5mi=yo`F$>x(__ub*p zv0D^)>1pr8YMwnk>72B?XJ=3APkT>K<8K}3hs~4ke>kf@J$c)1{?Pot|NH-({n2SR zI%^;6XeCO`HyBfO+A1XJ^-1T95QPEK!B23ss;p0K0F4!Nzz{x=wV5e?Rq&KB0p1pc z>=2`aBr#;$t|p8O?3lnpz|xgN{A+=yV#L z^^c1gDJq{@JMvr6T(t9ZQ8D_kMAYzq-{^Ec!q2y7|4#cz+V80%qh>BU8y`(LYNcU$ zOkavgoQktkX#$$(CNkrjQR4f8j(c?RVuU_?K&u1w z`(9lkrGX`kzz_p~O?4R|n~+X>x)q3I%4m@X@jltlIn&%&XS~=-ySWO02Zagl>-qJ(|3m;~iQ@ZGBS29Zawgs~+x!Kl^ zI~+`K4-wt*g3BP`z<>0c?=^HzU^Da^I%GYue!zdf`%dobECYqsPL=}}f!5yE^dZ8~ zzQeYm=fNm}emd}X(;|Tn?f=FGVAc?Y74Ui~0C|9Dm2xr8|yx|;pg zW-*pB)i%p_a^>5PH4m&3M#~yJ|9{ZnH?7XcoNwp>ot|5b|rTqXWfA-LhfUoVmKeJ&xNbp$t6tiN+` z`0M_wzcpX)J==Y`M=ebk0+Jqzokm^HJ0i~vR>&~%qe4c~Kjr3FPOir?rwLWey;X1> zL8GlFW@ZM9nVA_ZW@fY)EM{hA3oHhU!D2=WZGpusSdy!Ar<_8aiUioZq1uCwUu|vH$9fBJ_P&Nebc?w}uWu?fciOz9eWI2-%7MP8u<` z_VGT`{=&hcbtdd)S1&?3ka0449=Io;)T4Up1}nd-R*HPtWb+J~7{kBti+>6Z;C$@= z;jq~TSl0!kSvAk;_5s9qSANTb?@R!A+4JpcN%<#WU^v{b4lElR9svG1M@#}hc4A8p zP_ht|DL8h<<&MxQ+2~o}>Mk^W1KU*e-JT!P^pStf+L3}1%51E)lFbx>ivxGY=cFu( zqx#FSj{}L%r`BA{Gj>~?mAKhUwEPXHv)a(i@vTwjum6#&Ym639Vug`opy}D5t!>SX z$9G3zr_Y&PO~^>q^h2yed|SEk`6_Ixc6>zh^67l>!agnT9NE`@(4nP%)o^K9dDm-esxxbRZvGAcok zc`vVZ4ud>FT3<3fzm)Y|DzSOM*Kdo%er;)=W!vMJ1tds<@g7}lKBBUvEkBz&6+qjs zV_|@Q3>_D6yJ!$f{`7YY2aH~6I0G2?qrL-c7c;QHhpz?**L11dsmtJGVNMJ!hD5Ua z5E9F5zp@igjLRiUbFk%qCn>JIXUqn-ytVq+1mm3rH-YibfV04a2Vib)1Uxeh6oYI7 zEumlfmu4bCR}zKypcaJdqNnzU1upB4jjKz8&Ag~brluN==aROMTb#+jh)HT~J+w(=o zgmZ1ptGQAUb0@UPh)0aKCpek?;X>N!p58 z8pV5KPWG`s>1agVY(yx}^uu0HHJfUL8JJ46w7xoK$eIPsgm)I8qtJll&8ZG+?!sSq z(8mVgP;;-RJfx(Zb>yeUJeD5I%hqcxV>)CagSV}-K1~Jhw^h*6d3=YGY#YS=a`i># z+vogC2Q(z|??njI9x6efxcBArQ8mai^j;Gek(|r$EKajQSq99BVWY01`O+$gPMHs9 zEtJqeBuBjE%$+`1NZ8^E>l=C{Gf(c$sJTPK`d^*%Cj!LV*Dq5rC>(cS5}C` z%t))d8}Nl2*{i}fkb!vIYXVuh0sPg`U5UkD>}s}s&)mJ{HPm-hHQ`r8+8NW`MSZzRyJ>~e)_CmF|b3Ec3g>6dghBirBGg*D#JF>?feAgXvncrCQ z$uhb}%I; zc4t|czsS0X461aJ4$-QB3(j=G-j7Q6g}cFbLA?Win}oydFVjn2ncd0Om1oFi)j(Zg zB-nNkV7nJXexH;4u(^S6!%q59y4!yPR)fs{sYMqFE^hnz8~CrA|8xn$do3D$cPR$+ zkAv@9{;Of^;}TxRs(F_6VtJi` zZMks^eG8-Gq+#28Y52dV?FQiY`C@J5dUB!s{ECht2pgrV^}WtJ2?%;ClM#DZhHTu7 z?N6*dNzZyN?w?FK0`oT2sv5jTLhel_hAeFrQsZw!quhL+IxnR5`RNFaUFRBVdGpB! zVA1$$I;NjpCBZRAjqb3WBONF3cruggYsphq zPZ@wMj6%LjNnAmbjSW7LQ#H8%jDv=ag3Ssi3Ep$rr|)8qI0}4ZT4dMj(4M-5{gw{_dUg~ z4JGJ6PYRS^>j}J>^qi2(QxcECm$ZC-p$!oD?o(G+9|wFz?URC~!WCFi9xc=(zav{; z`0#8l{&Z}OBqwfhFDOGoyB9#-RZJb_dNT+ReeEIe`j_inV8onQ;Rocp8NUaiS&4{M z9ETE&v9}1Euod}gw=Mr0? zZ#@>{pjJ5K$au=ckqKS57rkFx!#ZN_;bZg+cz5?U_d(S*fvO!igWC#{RNl&HOwQa> zfd&PPm*qh_e-Bta-Tih}98=i+rmI+GB{1ikoS|${xltX?vl{_?1~eYux4Jd!l*OM7 zX;vgp1}x8RJOZYK5zBR^=A{IKR|-r$gsALrF4)lFRFYU>kdFcGgmaMPxFa_s@Mc=7 z;hjhg?;MTF9+YK_x$km!s5##T_y!g#Z4{Wtz-GfyV1^nRvnT+vD#dH?h8i|1^n*IMv-@?GUf5kf$OVxS;!(hz^Sff z@D)f*e0Z2aI|cXzk>9T1eWk&samg%_mc$B#3C}AQwygO*@6oB=hANl1<65Rb?ML$!+iC|?T{M+qFkT)gJd)ATyfWH>~*NyQ+@PE}m zIcx&|Rmir{w5IL5;;pC!E^8)$1t*t!F9tx>+sQH&IFcZ10yAL`h-xC51zW+@P@J75 zzs8y5<3Dm$L={jz2stqwFu?~m!GFtM-!l`#EOZ`7hocf_K%&dm#cM9KrazJ6{R)j2C zT@rf06%!`JhT2Su_}NWqQyQR5{fd_YNdd|JTeO1L`!r*`AbqM-juPKe_ghhDuaM$~ z6_$|01zMNP>s5Hftsr6NAA3)ei0tgXb}{!6pPolH3>WVZ{vB)LHwRw{C8~+{R8kBC zyvkmDmDq%eSM^9czDW8VET62&(r*!XhXw5{M{C}4{B*o#kF#{`QnwG#*CBs67uUi% zV<5jBg0~-&RL=)m=GX^oZ?Jo55lNnix^|(N62_6V;Qds0$a7R7<{LW*eYaqi>63aw zIMt*R#B16(c;t+&jq=Sh7Fq6?1hMxYAVl5&X@Bd=htAXrQ*8cDPcSlp8inG#iu}nZ zG5S*-I{1nuKX$p74BO;d$e#=^d$6bX8F#Isww`<5Q0GhEjd2l)u=%7RTiD%1qVwUN zAOWh2{TDm*7zH&rVSbe@861=Ss~vagF61y&gg59e;n>jkG0FhHUW%O+qNY_ut z)CiyY9)Bk{6}^FhG`e9;LP>&&A$`z2`cU=C~2)+qJ9 zCrefN6aCxjgi7tU>~7*$SRniXk!dZwE~8Sg=R0zvc8gAJNho`s{z0<;#CQ+zz7PoL za}La$1Iw57U%Q;9fuDV=CeMJ#NP0o=LN};yEobN>XjkVY4a$C4dL$YHjN~}=uK#o3 zKm!5*f6r^A4kd5?4GG@m)IGQx(ec+bVJjHWW;I6K0W0!UwH;}is*o^0l#WtxTD}dq zm$1rGe{^y}GL3xR_1-Wf42c1vc;Cv(yo$}9V$5L#_RnuhPIvZ$Y!sAtqS7xY-_~O_ z-;!67SO#C0h_c*9L+*n3V#cMO9&xAfN#CZIVcp2PcdJ6Hh>PhOr8%ymjE{$LDOD^= zYx)rN35M)`<=BbE4NXYM{!0Axlm#|uRu^_OG+f8)Zw<|`*g19b88&YA#-%%rWFPWz zDz)ivI{O+C3UKU?$R{cF>7^;T=Ub=otaWw8x(OHm$WBLJ8zi0R%bG(e&@lf}Hke{} z24%D71?#T^XB4bo;wpb?Tl4Mo(v}&wG`qT)JDub=>?G4XGYgvM@(~89o{%{KXW*;xv6dhZfk@+kbW`NK8!Ry^STM z@BIykPTU<90Sn2uj4Iy~{C)1zjXqsNE-O_uZnXP8wSDOzUB35nTp9^dx*8d*7I&W( z+5WM#>+2XeE5gtX)~4R@ceKoV=L4zT0LxwUfa#et>t7&T*cANQj|}wJ!p!)cVMzSk zBfNsIxYzLjNUV$$-8j;|C%ex&98-9*WW7eNkiHnKysLg!=k}J(-7GD)rqc8MGb+Uc z8PJ7;anujh-M8i}#yj|KfOfg8=-O{H7`t;Qv-7M;$p3;n@Rd*FcU_VVa zG0a_$$que-4VuOyO|IOPP^fD94z8cT#)j*vAIi9SxW+RQ4*rlqV3255iaZb1Y5o?+_C@l+m8w9p@+n@|)3< zXozDL)XQ^KOkx1_A?}lVgK3S}5Y?$e?;R`IJM#g63=aNS&VF2907>x2*C#lz=l4f} zALu{73#J4b{P1pp(N~~(`M;b0r=I^^+~Xh*2UJ049Jg9GfkL4l8N)v(l7q_kz~%s` z0U1c118`=6mBch$;bL9c%kG`DJ(R$q0@uk8a+}HFbJ1qo(xa^ZesG)a`etGz_(-CV z&NXUsg;O==X03v$m9?dqCbDFVdkvD+YjWy zc03wAflU0po&yShD}*2iW?%=(Md;d3h9KpNNjG&jx)24r!_wW1)LWRWgpXV8%aroa z+0~XQI(c#_#t#=tUp`n{@N>J_fs=h#J%hdL0XpO?yF~Qm$nsS~NZ>||2x?EAV$YYl zxoBMW$tE%R;2iuq34X;CeCuiUFhkTajh<08zA!AXW1NvN`U}n_(E6}lgyL!dN}l!m zutb0J1UED|v+e=H6L*ml0NJnm9)h^tHD!~yf%w_mrGqun(ZQ=A%NHUvvW<75DWCjQ z7}nc#1@58uCNCIkzw__)rvu4r4CkGnKVQRtp_YL}WOyKzLxGIve5U(>2d`UftqZ>v zWU3{UxDRlR^`&PWnJkJfwyep-5sXUkx*uF8s9cq9no$#yj)6YU+-y{lMnKm%`h(}KW4n&PlBL9>3hz>HPlOHfwb+-B4>HR^!$h;< z-MA0Y{hozH;$9RuCQkL+W#d;N2HOn{yc&ovIPMB~a)1$3{>aU)We&6?{HI zRa;p%xFG0p-D!pgt2t#_VK?iJjk6P(?7f~U7@a~({&6dcutrYz&{;y6bLo+ z-bltB4fB89UkV49euf{mPL1%tL{H^Wu}r%V=~rRkyg87ziK0-eb-TPuze50+JQ{=* zO2TZgcRHJu_kDj;Z!s?m*8u$JGHjd7?4c%zK4f2|DvE6f>|%?Fq-GV@doiQXthL#r zT)Bk$G%Pvk^Xpp$&Ut0IRrV43OFE-qeRFBoBL2x9er3d2>rF^-u5~x#lvw#kRGhJU z8;FA8Osw3DF_ZWk6P^NQFVq?7bKF}o#iq@nIBGcmAck%D_3N6`7?{BFuJU&i3E)0T z5{SN$HP)F-OUu$RgTBhU~Dka zNy!ntACN{}t(0%F?=Z=^)BVMB;u1I=M|Ie? zIH)7WAFZe4voPK^xMgmh^?>%o^(hp~3(oIx&6pMyX^@mwg`t=!){Vp^@%-1xPau10 zG~%+yjuVOFh0r8`KvzoL?vvaALKwpXKan@((DLuQ3@d1HE1?!Ysu=GOaBeLhUXcHJ znfv1_95j8xsiZiUZ+83quT(@?rFFg6_g!+@d+zv{;{Mh>hVPHsCb&9;Bn@SQZ(v3Z z9bMWn5LXs2X1c|SUSGi$$r7v!@(|OlVR#kWAM$>h8sL7p8k3bf30^<@&+2tW=q>bEBc8Nr3DoKtD)E@g5+$;eT5%a|&m-qy9S($Ybwjyrtb(X*(@QZ!M?(V|Uu0?&V?}`yW z#7N6pP|487j+BVZh$l}pYe}yyL|TyaMX9yKLMKzV$AvHM7u|zFP6Pd4$BfN&b&Ps{ zY}I-Wcn5PAQGAV(ndZ%1k6c@&UErDs_@%L9|7hwE2AtJ@6(lYLwv8r&$&ai50THGK zI9mgWGN(Rg-iPltnoTO}${PH;k;XfbWSp0-0f&WeIrx@#gQ%0qUq<7>K~AmrkfmkT zr|jlg51^k7q6`n-pA$j%0u+^gfh~MjgOVqp>>Rwbs(c4A*{WT*QoYR!hZf@cXOJ_x3?$QANuD`CKj_thvBb_CAAH49+kr_&G z@+$~wTWD%}GB=CzmUMGffh@WLwHEJg1xiZKBX>xz+?T60@qBrqwVZ|kL${xAqGUyq-X>FBqmHT}+Uij?I<^{$B~e($$MAhUU3!ZM88@uV zbGkT25e)}a85tFm4snzJNMH>b?Z(&?RYpb9o^#SkmTAgbG{jMWTrlukGS{bBmU0KR z9sm2{$t(w{zlRkxCNSBB*mJ;W$)5tPBcX`pOhc+pnHrQxBn=KG>52XpfU7URZ6|}% z;>Fb;QXe3EDcV`2`8R%5)!D5uX$#Mj`v>|rNjya#Zn02=_8WgX48-=eTB%(Tcwc$B zCxHp6j-G8XU-<#9M|ZNl6zA9S5w`}xvC+HbKs<1f>C3yzF2K;<7YQ6?)9)AvXU+`) zcTC$rKg!GY5a6*3bY25S&%vx9F??`Qyls;0N6ik<2Lb*V_TNpjf}F^}2ldPDe^mT; z-;X-Bbinj~4E?zMc*OrSW0tTf4bc8SOp zykr(V*1nkX{nc4s*4YKOcm3?@oB&=iRBga)!`JS|+of0dqMDZgvBQOO`Nv_x_=~CG z8S^E8ej7mf6x_2i^x(c@2ro3J!gHCdy$qJkm#;FIJJPp(8)u@x^(@ z|65-4n`WeB9qA(l_ATm=wi!0sD*9`wGZM-goQa_u7HsKf_3WKN8oI|#gnA_Wm0lxM ztZ%X*gTbu()(qN`K25NtBL;BpDzr_9t$z{}t%6+i{2NTkd$t5tHd`bKj*n?$0%eX ziX29qURwxuN*#qnq`z($_nqKgG0d{}3AI{;Z+(^2ArWeR7hE?!82nyAP6-KM548n| z-89@_{d8)J^gw-;dGKT3YGU)7DwqjROD6DjWH+6-Z=e*X^NIlTQ2oz%i8p@Q-erF| zp*fQWQ&N(rBJv*JHl_^+cV$FjRwFw#DhnLuivPk(3^Oo(S6Wg81Fl&FH(C1iPQ% zzsE0+oTKdu=zjunbVtBFyn@*E-pi4^R+4>~U2%$LBip$7;}&ARd4v9!KnEGt%e%k) z{|Dei@(^O-lB-6_JIe;q4MZP834ha=l(4)TUG&~1#*UvWFAW!(9Q$oZWt{U3}xo>6u%+YsDx)@8}dao{e`bMk&Gjak$d)xeTu7f#8i*K|H4J!MUy~0dX zUGvL_c<;pW+$pDJs5qNgW^U!{&78`=kmJ*BS5N;4@5`M6TlxnnFn|6J=%2|fZTTvX zr#85y!8~{^y%SJP+v)2Gdf-w9`uiBq``5k|EG2&J0le{^fN0;oyf=XO`#D7?3qFJy zWCxhd{Dme^#t%+Jmdp&IF7;c|*C2=YfPetI_k*#Jf*aD5(!7BaQ@20)pV5O{L<|@^ zt-ECnUB35~hD!!e`9y;MulN%Z3k+^^_aJ0%P9=+BG7H@v_v6Qo)&yt!<&NITk03^e ze82n6KLwilkbUU$0;0#3C4GBChl`{Kn~@fB(4~Kyr^H*fX^?#$)e?58l(N&(v9oG$ zDNC5K8_X~dl^asuunk(y{`bC5Ehs-csmUyV=}fIjEHR{Jk_7xZWMmxo9}ystvp#~E zf|iH(r#ItAik8Jhithg|aMz05@riYaLxqaaM2}T{F3$SnU@dV`ysFR6ue%e;^27hk zPGWG>N8>23Ga32?hg$70)_+=DDi>Wn}|qsOr_THq&~dBoo&)V^W+;&e!Pz*@ej zWQVlA<$Q>~2x^r+E!dd|7ngofwn~N^&Ba5;EpgC5KzQ`4F3(Zdpvxj^8wksY<^LW| zkt4Uki;#gqV*{a_iHnBtttj0pKpKMNKZpvbpKM9${iyAnLSjma?rCtEyaywu^=<3D zI2%PfXm4x4@<=lF|5HvyDtWPAF#4zs7xa`Ty!pUMg50nWA3;fhl0X%ddo--y0Ud4e zAA5$NsVK8`TEBw@TKEW4p`U`a$E_SOM6)D8bPyGM$LFEJ3LEf_l2=`Szwy0w;}v3% zDK7Lw29emu>W_s3ZlW4+q19$d;lLq8OV|*wL69-Cw_gK( zr4I}vO`A2ynSF@F43--F(BB=0IVaz5&mWjD&(F3mXmdM(O^*ZBpqi^-(sJNx$O}>T z11i}jL>&LNE%l)_y{kSZGKYV534Z=cd&nm9FT%+W#)U5^k3R3I&YM@I@FnY!ip$bs9!O2bu<^ht0)B==&oilort1%;E zWy$irUp;&_gk7gR59tIk11QpJA_ot56dd0?p{a#8R$4TXL#NMMx=~48+vSTI*!u+Z zez|24zHT=9m(lZIPUk=|!+Do!KC?ObgA z!w4)a8$SVnR8Ju}=tr&1I&lR`Rx@AKepOsH_DZG?BjOKNH`3&w3+HA0{4Iy(VvXtP zAO8sz|7Qx_3V%YHEn>px3pHg>kx>>hJu&j-{K1}|DO=HU+{|C6&lRAq zurOv4J{8DXHRRuH?yPq|nF|@0Fuj2>#Jc~SYm$4Kc^-d~MlkqOLTKo|`Cx9Xk+GhS z%PW2FVs~iat%g#sG=PO;1bXFP>rU9&v|zj5!{ z0B(vD&Mqu2#f-^4AfX>y?R-2Ug9Gw5z<+BTqxB!ARHWm@u3hRUQKN^{|QItBaTfSrgIiV4?o1?`E(p zFAX&?%D4=8)Xb_G(q0KaR5bahtwL%$RYgN!JuOTVED_P4`YoXejip|H>ss7!?^s|4 z312<$05{?h-4BeL>D6K1g`FX4+yO@-bjhpA~tf7?L z-0+F-{OH@H)%JzOujw(r2vSe(wM59^cA0TCk`C7OftQ%h7^5dWaLQF`coxzCdK?7x ze30d5IJ4_h%}UeF%!F&k&!0+SpS=houb`}gp9|AJMN@U1#9(6BS^XGvP1s?rau(U< zFTW0bD=XP6DF(^BY9uMj^VVWPa2CvHtg)BI;1P;{maSoL_>e>I;Su9CMjKUgvBBb+ zpVBzXY-#y8P}`czwH2M+E7R<4{w;q0evoXohR%^&qi%=$#*BKO=yJHgT%YdxRvd0q zD{IX>HUD%=#;zaJjql%|KzF09KZV*?y87xD(3M`-79Cb!~GS+MCZ#DXo^ms#!%){e&Y~u^|>Vbu>#xy0u(CTx&VBVuS z)qmh{P6pZzJEBU8a^5@{aK=W@TTe@8r25NT_8RaVTYv9b6+GX zsu>lNTRSx1^jn|yjoSLsdc0ptO4N#eCq$Gx=80@c@U;;6#DQm>X@%{XcFci{{8j@5 z?IdFl@m)(_rW51)D6T>Aqau;4Cd=Gp>}noOOg{Y$>zz@tvQmve>%|ti z)+JM5NWcGjw~|VCO?H;eIBge;@3~3;BOugq-N%97r+mv{ymj#`BV7CR^V$!F2Zhd) z@-0Trx!}pJ^$O7nkg%pHO17)8j6GR714$M=SEPrCa$LrWtbU7a9VTqC%rt=_WBgD= z?tG6z{+R&H>D}S8sT3z@!@sHBBSD9!0o}v^cz(Qo*t&af-`*3L&(?b%emy+;*tv*1 zsqNdRuB{}p^2}+M$bmlAGtM*)oo|{A@V0EsEP4nbit4Zgsy5-BUp&@>uh3~b+#5T) z1o~#(aY~}37VVu)pMUL~e)ZXJL zd|u)MV@_+(pV`cP0i1;H9#{lo)W`dZ$8rlr&+D1p%a;A#G-uKaiRDpVXb}fJU_k7J zZA<9cWsU7wwNvhzt&Qzkbp!dCtqlyT*Zc1!(&z{jzsw7&%L*g-H_b1`*+af`xx&7E zE1Kh1KA(`oHj0+xSJ~db=wNyEx%ViM?O}4|VO}rS(Bw3J>q?{H&?ejYH})E_Nq%)B zp~cT9Q__oG(Vvf|q~sY&o#E0Ozgt+3jOIG>Ts(eida&3E^33Jx^B(EVxo*C`wcxuv zCNUq`mtF&>3l$<0v(LH`@CL9?Zdn(j{6tf{+0|Jn^wbORbcJ!#d4x1G{iYH0d6?@? z(CyD2+i~N=6y|WPYdEaK;9OY6PH|(qu}0y-UD{*$pD8oGi~1(*q5*2%U;NPIhnel z5jI#)IC88Ta6J7gwq%6$S}R|_yL-!zVU^3U7t_vF96YAS3>~AwY`piW=CWus23#J(aasVM-o&@(gX3^RDxohq6YU2d{Sa2kmOUnJ4B@jO7!w^##?mLvwaP zE05c-Nt13BIJS;61qlxAjV`OehJ^emi}14K#gM&IKq_YX-34um;S;Nv2GptnG_zDs2#8-5#*+G{S6b7xNoKHEF zNx#EDjDKC6_icM92Y#No=CG2IB?@WjYHeD4S`iAk!xk_~J1Zz5H;*57!ZmW%{PVfv z#+C#}#>f58UIM4|d_<)t0qw`24EwEYmo)7dJibr{+k*81zPY-WT%S_5GCcoo3EN0F zN>Z*6H`YQ&QAc*uIZ)4Td=MajUM_l#Y^^vJl*EYwY2bN255A@ ze9{~V{fH!`CHd`(cI#EB`bs3R3O#4dtlhPx9F8Y+TQd$Bk7#D(x}QyY{@#6l*Oo8X zb0)tO{SfGwgp&hnu6T}xoIqZ6>MdeMP)`m#E&)^EBF$)>`xAH*ppqP>t}y7C4ZwT< zv%i2YG~oupvoj?6e$837B3Svgd#w1!C8vs@6@GtNjxn?JAvS&sjjiXpp*Yb#B`Z@m z9n>g~PNb}I)lxe%*WYjafv7U+^pRIKo< zhTAJqm5>-7l$6(>1=#dE#%NnPNm~Uf?Vl}zT6UILUD$6ea_Rz@$Wh0R8cH(^gwY?Z z?t^{ML>s{_xSHZE??*Pab-ju=MQdkg$nXEz>hyupS2Gtj!?Rs(YW-`2E>RU`>rKz2 z!V&vZOG9;G{^AbJpkMx8wyX*#G!dS^;Zv}d)kQ)gC&mm{Ez)Fg3Q3POvRJ^Vile2J zqBb3ZCB-9+lBI2$_dS3s#hX@4&(T18tmV##SRju>Hn<*RTJfd^$mP>VE7EqUrFbkYZq9D3%L0d#YXT;bgYol|;I zY+CWkny9R|O~%S$COTMWYDl{O96Dki@%xW|yp+x5UEQr9fA*|PCV(`dNGANpP63-X z%7l%0=s#XbcNC0)IZO|U+>xQrn6N`lO)Xx-oC#9&>@`H;2E!WK^c!B2&r+KbVsY16 zTKabCp`JOT%XyfRsJ($D*LeZM=O0MGxxBZA!gj54++8NcO-!Ehhvfw09j#v*vD}<@ zp77Ob39U^j5nR{-4$g958uqxLd!&^iQfjO5zYZABZwvR$BAelDE;#HIl)XKHFJW&? zTgZQijL$mv4Dm80P+2*{ywq_9tiP>Oi+G*uI4ln1w0j~E1s8#QF8o8+r|Ak%-tXKt zA`1TTb##}sIA184jpI;DhisU65J$bQ*)M-vcTST|N+fes9vP^gVz*|Hai)PKV4)}a zr(Tuk*zMD79sel2FpY3+b=Nhi+Ro^qn(jQnl;gM0g#3W^oY!1lTW6K3L8MOMqv*5I z#%B@=6T(Y`buxHQU0XII6NI7BpO%O!Cd9yHW(m*eoH;#o^89trFE%MyKVq82Ui(+l z0qf+q-_&vJbw8*F=t*Aj2j4Pwlm?WEYz&Xogcf&?tgbb$DXpK+jLmGS4V)q;gf2Bk1zC)Hu6wclA%QL5bk%Ib5Hzm8 ziYmFcT$C~=xH=KyfUY!3CCEsCZKuL4!Z77&zv&Ow)$OsScQ{GzVW2?czfjhFRh^&o z+V4`U>{x`1U}F7a-A1gZaHj7nErU*7<){ooVZy8!Y~{*a2!y(xo&KpDnLw|pQhRVj zOT9HZ9r3Cs{zEb(*Oc;L6jgKd=?#e-iQy}=18ILYcYS2~;RRE%4J?umA)A9q5R+XY zP0OM30%?DVKFxTWT892=Q^31&mtZ^(Wz2C-3k(eWW5hY^8u=Ys*fT(8^l{k7>uyS;+PIq2nP%dxEGJ_Ys=yU&@3erU9l zH|foyQ*OZ?y3C7~8DyKyj))}&e3Y$*P`7ji6HrK3?@Qx(j@K~g5km_z!X#EFH7vUY zU5_!4zRH=!hnS28!x969E5f2>;}s;hyRHOVJJaBQ+hZcy>&?Fr*P8Q2j8ccza!0Ul zhbr!K>w=Tsr@H7r8}Vj{pvyW_BhfoD$G;#y*L!-^ZfD76d|H9kMYg!*MU*v|(RU1v zwZSOwUKi?|o8^hU9siY_ZwXk)Ny80R8Et~tHwHjMD zYzz^8Bd(uBGhTwlWQ6$F5F#y%&|8t4O(#JI9IqstU>k*Yy|m*?-tff z$eSY~@qs7LsHi`fN;yZr;IF7!EyAVE7HCd;;Z2;(Hzu1Ud3VTuoLVzuS$5a|qJP%y zglCvXaYS{6E&mbo+W{{#qT;ur!uV{O?x4}2cVk-)Y$me9BS9(N(sG8f>lg`2qay~A zVXHRJhgX9IUjr)r+$PM1O3jc_9y4l#qhoS1OIzqA)vV|*!nyrLZ3Qfh_Bup3{c5&S z+yu*?dxmfvD?D3EzvBKh4UPRMmsHdQe8baGa{ZPrN#9b+HHbWP_=g@I;XK-;G!r(O zijk7!yW*r(g30o$87Eb7yym1R9&G}R-#r0~gT^pKQL2+;qq$@Y76sD7NGZ3N*wxem zSUA(B8x#b0)>eOlt&bGHJIrPUWPWR~F8w^2^%DivALb3uYZdOxNu)E$h)B)$XE>1! zxxLe5`x1X;Rq;51g1GL(jC9_|cz{UmE31Md9Dw{X;;m>%7-njDSUzG!G9SVS2d zgivaObbmdl!3-7egde_S%Ws*NNOMHXy1|B4#4{amo9Bzahi$m}mM|NQ{EM-Ua;R6! zv!a`xHK)c$dN$S3PNc$OExs7XNEE}wrJ6EG6=@RWKNjccuk=x#Qm^B#8l1E$TFd9* zX@lJolgH72LnEqL+S5N|kI<@f7HQHs8-n)XjB5x(z9~1yk95w6hRn*b9my3LP#z_) ze}Y5zAB7-rUk{V|cykCwZB8qQOf_P~$41*|bAC z5;>dXpa@Q{3!k!hH4o!=8>PTA7t@4C+R^+vJ+lOyYZkuUP*oy$BE3dn*@Z5n$Q?2t z>4nE!AK}YM%Yrypck(fLs4$TYH3MzMaiiYliNY> zKTsLQk|lT1ZWu)~$WYg|a213;#v*jFq6Gog8>7^wv}@RWa(O8-<)GzhOdcpy8bkdV zJXnZlKL14>4f;M%Qby?#r5j_=x||eMj%Y@vfMtKz`hifxA~OPkO&+WDyl^~P(y!7@ zacKX{jq&GsX=}LLrKB<%IaC(?ERINU#aR4yXad&vRw)NqFf(B@i;2htD!TH<&3Cb@DzX9t*u;BWC1c7Z7vjK$Z3F#Ks^C_&umqv_p?({{pZ++a~V)ki*1vEIh(Q@ z(yi=@4(1u%D+HWcS#bMYP~(-lywJR!Jdwr} z)y12_IRv}y`b$8wb1H&IGLHO4|X z{2v2&;|ZIwcG+<~K;__m43-fPtYOII7%a*H|kYXwyg-3}Nx@a4616tDC9QsyI9`Tu~ zQx0#B08s%ee;z)IR|9P_guwYUxS(||gX*nzKqFAducf8M+w)#ws9vAovNP@XX=!Q~ z^PGNW6dqb-O87xbHdBG^Qgj)6Oz{OB@+^lJRdT52jUORNpeHBZ$+eU9I0FmLq#P1F zqa(_mIE$!|$83k+B~#MOhp8XmXXHuk8Scx_Q=!3|ok1Emb1T;^tyF^0cro`h?_nu= z+MaQ^bk4jvm!ZDsO9-iq`Kr|y!ZV>ZRniM#|4jSFu#US*}QMwBZB?Uk({eoXf#zEw6kBiv~zugwowN#!YofX3Wh>s_S*MhBtF z*e+_#b|S34;(T8}3Xn-c{fzDranrhaNY5ti469k2BRaRH`N8lvQ^{C6Irh~0;ehrL zqcqcRnY$lW64gu-nUb4DU;VJg-&z;8#a2_|Pi720g>kue6g-j~W3^{g!i6oAI~q%) z7l~sC3XkSnz2;VEdpcbb_Iil@8)C&|eQ$wc%N2uKAdf2j+*T%Lj&w%}YXf_o`|tPh z*2bOB)9iHQr_TwmBT#dRmJ0MFg+~(n`9{ek_GN>=7>Ehv8|dFQdp%`e0;V_9JrVNf zICm0CZpV)oe5MoaXyJYbl2jAXB%HdV+y02%N13mW2{XGDpkmhkVwDb}0SYt=}h{k~8f&%W)+JYk{(vP{JNP>q*F@MAclWU=>pFu~W`xxPtTBsv zyb%3oz6!6#ChkTav52#+V&_+Gp|Y+!+RW+^+mfdB)1;qxMWG+Kyr-YJ0~ATa0;4iZ zq%$3QFzcf5B~&^S^+vtS4oiBR!)PJMsYpJ?If5X!HO$4l$-;u>=KzW@iab$cHP^QV z;*8OQFaQ2fG81!^ov^TS4B5dB?|2u5VN7G(Xh%|O=>$a#?yDxOX9@r(M}hDmdG26u zzHSnry8G{?v!e#6a;Yuyefh%_IrE}=WyMX$dl|O9CXe8S%tsKF>WVj|2k+`+k6qzV z;10Fr-V%C*lSyqer+q45pxe|=$Yy1y#!mj6w+NY`++iRmi8=p}CBbVrC6Ov9RbCA# zJYlG0!I4Y~p}Q<=CSmT5F_1UZewM*KDwEK|PR9$s$J!P3YiPNH<;U%wuCH6yle;~q zG1bxdCpld8LhK^sV~~{Z0PHK5Y^k)-MM*sygON7v*VuZ$)N%2pt~{geQUVp|8XH=# z3O4>rx$Dg9U5iiRv5re}uvA)sh`|#W<$iWA$BmQDIVje6%H*0Y5)}`5bb;4g+g?ym9Q_`Dt zIZDbZpRqX$#SLO|C93g%Rkwm=(6JcJp-2Nw55MRh$3V1gS1pF%hOW)Xn8P^YN0mb5 z-~W{T$wm-+%yYPhPG*jTI&gXg3gSq=Wf)!~pfMl1mB=xN%Z48q@%1U}n0WG&IIw&c z+>_51H>R_24W)?|2-7-@o6naRTDQShhi1iwDSFBGFsGmvUS zWed(4LN8U(vsR6f^Q%*egz3wdLo}(q{=Nk)X@Mi+1d^ z^^4XZh?tH;C<7=QxHLgEI}GMfJuFD8l(O&&785^>l?ez}I6@;s%9)}kLJ1M%AYa+1 zYPSzdX=VS7gmHw13O(GL2G<5Mzo@%xT2D_tr*@#j806 zCbL?XcjtFrm@i-@O)vM;8za!46K=sXa(pfgEzvfwgZ7e6yQ8BLi+l6fs$HP(&q+W; zk;@#o;4!szTT@1M#>k6TG|zQWaric;4=0@;*S2yVhI{VUk1~m*gA-Jv5Y_5C32Iv} zv`R!;$P;0x@p>50isaO+2mg6U|KRUl*F&qnQ7$EVWLeIP)%DE-=2Agnfy}pfzDKCS z^VTaOTnk#0aRf^T=XV+@^ARrTFGwgYpWqc)on1wD(v!*pTZ<=La9unk4 z|D|y$TaEFRjy%DVJ{|9kA_P8%=)j*o^>#@rLVqR*rG$g{cFHNqOIh&f$%OGMZbx( zrSPNRQ{7`i+1I(U+ne2zW~+l>l8GmY_x|1VMnDp{dia_K)P2Rf?T7d6BYG(^i~dX# z0(#d3^~)fmvHd|8KFcDB?}+)YA1KiRRz!t=yH(Ce*IeFiK0I!eJ0_8~ zw<5lurkDljys&65T|caBf7qL=$&>_aTi6RWOUyJhG1jKQAnQG(!vZivX$-+f+Vzs#=f9(c&5olm& z(5G(V);7KKWPEKV`AjhS5bF~_UVZY=&EC+#I(=m>?jagPtJ0H><>Fv)E+5cv3SOED z$T(5*JlF#>_Lw+nOXe{iXsO)Hv`^hUzl?Z3KGSOC?jQPNo`P6Y7yW$vyUSJTPi%xh znD9sAG_fpeMKyk?YsB}_&B1#fcFlXOhl@Z_xu7-FrTeeRx%>Vt`=evu(HH#x0>QwVaE=N~?+cJ@g&SGV~5dL4sLr1Q%M zQ&Iiw0c5Q{{AN_xArIzrk33CcePisXV{5-peG@py?ZbLk-B9)7; z<@xr!OU#e{ge4_9Sh1o-VqKe#h5s@Ep{Wsb@nmGc;EycOX47A@Knl#8Izx{P7!9N+ zoXLicx?Li?wOH%K^&E=O#m}XtmPR#6$d4R?)^N`e)7UNotf(;6IPg}c2EFS z;Q5;@x(!;CuO!%n$^Vl01U4p*#;`+4)M@}4$jv<{!rd<;GA4FDKHLCH)YuaUpI9fNc2`sAQ)sy@l1O4( zKIipi;rbMyRPMGjwS*&P`@M zmG-h&`7!-R5oi*AzNpXJ$imm|LCP=ECnsz1;=qaQ+OZ&CT}3QjUiD_7W)b^`4<>9; z$tR>}?L+k{Z^f&tdA6&?U7iYdzq|aS(~=v5v$yq1I!pvyp1SLa03$tKhnE<9&W_tR z37ZMQ#KqumUsF_SwmtzZybY_CBf-QN=3y;d28|na!2Ds1 z2f3$jZv8n~yCkmtI}308*Dz%7D6>QE|MXDi!B+7jp<1V|-W~l=95yzf)-t&gAZ9A+ zO-TX?MU@aaFI>R5PA41H8R`F#>Wy(>_o}x z)Vkinq(sGkNU9HtMEWVz?_0^FbT^rpF*hbv-mpULrMR)zrV31EMs3T^RK1%$Zce+{ z`PuY;j{A(ef1`Ou=874MR$^=)Qt3zawh{v+aNYU}2+O6%$20Lcc-xbNa`{;&89x%w z&j6d8E9TZxP|zoA;Gx^LWV!ceKSi2upyz;Z%O>Bo!>I2VlgrxyvZGe1A$ciPTC##q{S)I~7*!JbWN!cJ_AukzMn1cb zr}thD=EqD~?l(N2t^b};!HqV(+a`?@;?xQ!2HhGa!UU%(NK;FStRdC;vV5mtd$l~u z0DB}n)j$gpe3E97Y^sOjvKOLLEb46uew>E*(g{Ij=#yt~pj|DwR^Pcrze8;XJYIxt z6g0zImO+7f==`F2(%ycSVa-f^g4w)l@Es_j-K^a16h%J>(<3pRJO`?38+zJBEV(t) zU&GHBM&lZP!$UhjuiBGCWgf(&LiI#bDdrDS-0{it# zbS*?&j)KiKmxZP<%}gBkufE%<32ZZaGj@#+K1 znQ7&FR$MRCKkw|WByN_IEG=EFxQ+ZaP zg`v*HT8zaL*y^_0@fOY!8Ogi4fn2lbu=IAfBBk<|t=#C6!Dv>7K)lzS#XuyCLu)14 zD{eiqaUqhdG&a4q4a0FWYr1Yst1_jQggmHJflVklgb6*Ia)wh%?ay%_CP+GVW{@Ex ztEex>@KMKY&-=N7k@wv*IU`Mj%toJ7aTgnq_;!%DRy0+?lh_)94x2VD1wXku zb5Tlwn8bP}sgO*L&TVG4p`lS#0otQe#o@@pDF1;lr)LmMemo)q5N5ntd<5-#3nD^o>6wxf8WlPR0 zEhU1dKs2XTx?=`kHmV4JjQ+ul^3r9wpN|y3`Hv3zqe~{@*ghNqwl_1M_*XgDRd_7i zJv=i|p^R`~Cz=VY5g7KHFI1 zbxlypjkc!R!H9KpLhx2Z!eET^%&saA9?Pg-i5Vu|wHZLcv+16Kd~k>Cb67imR4MZF zsG|+90i1hA-%U?hoi-hftf-_I3Z{w>&C8?!8t=3uLyu#sJ`Vt$b%f3~%3;jFeFI_W z$Ou3Zz0d3NKvwA#YbIAxu|Hg~wDkKi#}msBaV~VLV^`xcBT}0!11Dj=v3v(z#7BZ< zi1VUbbPQgIw|cI??e{9Wp2#?hMC3?Eu2Pqgi!4HZz@(B4GyqJij~)6RzBQ~r&a2Gi zo36u4kqhn{BKQMHE#!S7if17KD`07ShXJl7{NrkXnpoFK{A)Nb>9KgZxtk-b%aYkD z)m#z-#SGC+q3}@fF$sps z5BRWGO@0;3sH`3+O(I%kzdSmr(LcMo+;=v$=Do6ie#yDyq;8=%j^{|a4?AMzKI?h- zo7Y=>VJKyTPm^WxwD^IVnt(ENGmR~QiDnGjAxt?Ecg5Ch*n(yYJ>w z**VUS)Z7cBL*#m~=u#;g2ye@@kaon2V`G9`v*D@qj(^5b{X*`z$psi3IV0$7<;XRn!&fpK)pq!V%xxR z2Y_|^e=qENxdphQ5Avy`RLZWH_j@cnrMlgVHq(oCOM7(J<*LCaWfod9Jv&8)XYQ?h z#=I@XZ_hLM>CNzEVK&QvE0Dy)3scrSy!3wqLDBPeO)J!*mVDXW2c0j@U#lH@Z78&H zxwpO4+D=KmD!BMGZQHz1Onw&pGxWJ7vt4M~{;jr*PjzhNt@glUdi4V;Jl?Yk1pgd& z)%H@>{~1LwZeoCwtF^2;*!;f(2r zkD9~iCD^;mO#U|RL(SFL`=6$LAO`ZyLl3M@Rhr-w$X znU=oZ+*t_;>qy^^)TO?q2VwT}!A2146&YcB23THq&>UhfAw)c8qu6NmRJu$k3z0iT z*)l~!Z7}pKSLG^V++^+CO&;fn87E$k&-$@C=m@nIcG%m4nBf zsggw2L&XVW=r_);1wlC!6zA8Uq0$N1?jgHj1CIP*u<$Q@c{>MVFIFsTIuOIq;1$j! zfFqo z*pM$6aKnJ-oU}#Qh2 zPD|;L~1Qb3a>7U3uesb)=4**nIIE5A!0Lc9`=$uon&u+UVVO} z=1-(n+O!n*Y5Z+&AI3N&_qz}Fl`?sUq3!e@PHN|^-YEGh{Qlc?K9S#5;N1Q0W3lp5 z$~#1dl>gb~SU02sTeMn$w0i>YDEdZo&F2lfe?_-vsM#ANXtQ}tKx*5(JMm7gia z@ceVhyrzEGMA_5&s}%EoZ-Ub5d@KCo2B1R5CI;94wAe#LE8Jr&%T(|AVsB{Y{s`b} za=Xf0f@E<$K02o7le{ikKR5UM>S3X--S?If&Qkj6F=%yN_d@4(nLHuOuwx$kF~K`p z8Pw`0To4Wes`n4Q9%Q4z3)z8Hx@1yACZMmKB$kLD55L3+4Ow$<3H56tCGk+%_Fzl_ zRspPNMYH15L2PNZv}6X(V!)oRHSlSvC?RDNwB4`doyjj@k15{}+MIVijjaINPw)A+ z3ZAxDr5xA2^x3YA`9=U?51w>P2@g1@g?n~#eiv*>m$w9Koe#R^To>67GlXf|*>{M> z0c#QEvc*&I?%MIsFA|iI3|}=qjc1!#Dc)LrU+ZT4>(JzemCWGLq3;JXFb^um%SOBe zNC48im^94IEaTu*8jN5F#Bx8>oFweEiN-7RS1!66f3Ed#uZREFK$Fw27{zQ^T5c7O zIE+47a!ffs?ykmd_f2Dz!X26F0Jdc@ad*2m^uP{LCD788u+FtKGAjOO#8N7#sbjqj zw{o&Rho#+Im2~8xV`&Z)!aSPFCd>S3Cbdian|rrg8zQ zd}pAb3#P90fJ~ma>GEL`2*f^QBPyq;E``_RA3;qv@&mK~fN2_F;k@fBV~>^e75AN4 z?!Uh?G(1kpuP7EhDS6ns`p9dzD=Npb6#YXydtL1@ZdH?H>WqU4eWhg=9+7Zd9{klY zcZFmc`qY?)^2O6mLGC3UBCY~O{@R4x%s9`~qR3=QOe@VN9H%V7txcw|%Xh|W64b>p z=9L>43H|j>@K!(i=?btILlMi_AnqzghUJi**Oc2pwUyS8GaDg8vJ|7fR-gO?2VKWj zlU2I&Bk?Pj*AcixOiQg;3oiUTSotpUA8(onV-?d2NV$q9hzQKX>sXv<#CEJ){0?M_ z`SN>f(MXBiQX!^jwT=@o%K^R1z*ptC1RsQeHNo{A`jLQAPbRV0z-8>N4hq1{exDIh z8```_q;eUo#COzE5MmdhpHe+Vj3NPOSS603Z`MFogC5b-7oVdNqrT^VzkBNgI z`rkKu20E8u3oQ8ak!;7r(S-RiE(c(4oxUeO5ShWHBOqoQL#aEds#dJ;=8Z_I8z>Fp zAlcat zCcox`sT!n6qmRZzufQHscVG;P^FZQAB}&|OPf+F%L*Q5`YD$S%->?>OON0;c_2*-9 zGA(Us^T-+Yn%u!MY`Sd0(zJcnxT#`OO6N7MM{`f^Z_}jA?B-sPKDuYVppwc6tVFKL zb0fm@9xX_iAk<^po!32KPGh-z)<9gB=VChg0y152l>vV`mi8Vw1zX%SssV=H2ru3e zmp4gRQJkju>I5Dz zah9zB!=55Se+pr|p*;bhf4MZHhqCLJ@Bd_AuV6;{65#Q$$%h4zOKuZGe0w)gIVN9f zp4ts&&WuQ~ZYp~B4k4`~`zpZE=&&afMc$-OWQ;4N@`sd?e5C5g>nH$6QRF>y^NUC@ zAE9rJ&^`W;pkfkmdjeQRHR0wQlEnZeC^L>DXIDuIiJAx0jyR1H$tUgwFYrS*#gXq3 zFqpGsH~q(3l7eH#0<$-|EO17x$B!w1+ZTk@*8H$!^jA9Rd+M2WB_$1=*N-D;Y*)o3 z>h*-m0ikiQnM%gA%yi)Z#==YHCR}4OchwzfFA|doFX^lW)MX85yu0I3jW$*Qbt4;J zl4flIWPbGFoCJ%dHqFyYI{60_gRp|z+t{f9Tr5YJM5mNT+u)5Hu~=6HKt17I5NKj8 zp=1ar(8e;u`^o(_4@pFGVAEko%8ih%;T634s>* z50BP95M*;@0+{c^J^JP&78|w=gz(P_#bzV~N+ zxfa`dgx)=1@J(*D?>+DK>Uq`sYwf$+>fN8K<(YQ(^$nr^g?H7T8V2t#IL5VI?m*<0 zUiVU^x6E&$bC#R9Rv{+4iffzhX&abkqGD4{DD8XB9})9lakNgTwTf{&u7w$M#_?x4 zY>3*-#PKZOk)##(z^v&Qu!bmmg@UhnX;v4NCAKX}_xp>7XSkZpC8YRX#JG=N8=()6 zb+^RyL}8{a=zeV#63BxiA&^e3tl1qDM_+dx`@ZB?IblVUD(e~_)$!McqG3WGJFGwJ zL6EfsMp|=2ts>K�DmlN^_D0hBo#X~k!rE{XNZOvtnY`*3XAK~~cKwc1Pj1r|+` zc#&5Mx+`d?pNSgEJLXrSPhe7`-$8I2BE~aI$LuJ}W7eF$I#1&9bzPyq|G0UWzNUPW LF|CNihlcb|Z8F>F literal 0 HcmV?d00001 diff --git a/files_opds/appinfo/info.xml b/files_opds/appinfo/info.xml index f1f0524..2a590ca 100644 --- a/files_opds/appinfo/info.xml +++ b/files_opds/appinfo/info.xml @@ -4,7 +4,7 @@ OPDS catalog Personal OPDS catalog AGPL - 0.5 + 0.5.1 Frank de Lange 7.0 true diff --git a/files_opds/lib/isbn.php b/files_opds/lib/isbn.php index b2a3e25..5499dd7 100644 --- a/files_opds/lib/isbn.php +++ b/files_opds/lib/isbn.php @@ -27,45 +27,55 @@ class Isbn /** * @brief try to find a valid ISBN in the given text, using a cascade of - * regexps. Can be optimized. + * regexps. * * @param string $text text to search through * @return string $hit ISBN on success, false otherwise */ public static function scan($text) { - if ($hits = preg_grep('/isbn/i',$text)) { - foreach ($hits as $hit) { - $hit = preg_replace('/.*ISBN(?:[ -]?1[03]:)?\s*([xX0-9-]{10,17}).*/i','$1',$hit,1); - //$hit = preg_replace('/isbn([ -]\(?1[03]\)?)?/i','',$hit); - $hit = preg_replace('/[^0-9X]/i','',$hit); - if(self::validate($hit)) { - return $hit; + $match = array(); + foreach($text as $line) { + /* generic ISBN 10/13 pattern */ + if(preg_match_all('/ISBN(?:[ -]?[1[03]]?)?:?\s*((97[89])?[X0-9-–]{10,14})/i',$line,$match)) { + foreach($match[1] as $hit) { + $hit = preg_replace('/[^0-9X]/i','',$hit); + if(self::validate($hit)) { + return $hit; + } + } + } + + /* single ISBN-13 targeted pattern (canonical format) */ + if(preg_match_all('/(97[89][ –-]?\d[ –-]?\d{4}[ –-]?\d{4}[ –-]?\d)/',$line,$match)) { + foreach($match[1] as $hit) { + $hit = preg_replace('/[^0-9]/','',$hit); + if(self::validate($hit)) { + return $hit; + } + } + } + + /* single ISBN-13 targeted pattern (free format) */ + if(preg_match_all('/(9[\d –-]{11,15}\d)/',$line,$match)) { + foreach($match[1] as $hit) { + $hit = preg_replace('/[^0-9]/','',$hit); + if(self::validate($hit)) { + return $hit; + } + } + } + + /* single ISBN-10 targeted pattern */ + if(preg_match_all('/(\d[\d –-]{8,11}[\dX])/i',$line,$match)) { + foreach($match[1] as $hit) { + $hit = preg_replace('/[^0-9X]/i','',$hit); + if(self::validate($hit)) { + return $hit; + } } } } - /* single ISBN-13 targeted pattern */ - if ($hits = preg_grep('/\d{3}[ -]?\d[ -]?\d{4}[ -]?\d{4}[ -]?\d/', $text)) { - foreach ($hits as $hit) { - $hit = preg_replace('/.*(\d{3}[ -]?\d[ -]?\d{4}[ -]?\d{4}[ -]?\d).*/','$1',$hit,1); - $hit = preg_replace('/[^0-9]/i','',$hit); - if(self::validate($hit)) { - return $hit; - } - } - } - - /* single ISBN-10 targeted pattern */ - if ($hits = preg_grep('/\d[\d -]{8,11}[\dX]/i', $text)) { - foreach ($hits as $hit) { - $hit = preg_replace('/.*(\d[\d -]{8,11}[\dX]).*/','$1',$hit,1); - $hit = preg_replace('/[^0-9X]/i','',$hit); - if(self::validate($hit)) { - return $hit; - } - } - } - return false; } @@ -115,22 +125,28 @@ class Isbn * @return bool true if valid ISBN-10 */ static function isIsbn10 ($isbn) { - $checksum = 0; - for ($i = 0; $i < 10; ++$i) { - if (!isset($isbn{$i})) { - return false; - } - if ('X' === $isbn{$i}) { - $digit = 10; - } elseif (ctype_digit($isbn{$i})) { - $digit = $isbn{$i}; - } else { - return false; - } - $checksum += $digit * intval(10 - $i); - } + $len = strlen($isbn); + if ($len == 10) { + //Calculate check digit + $check = 0; + for ($i = 0; $i < 9; $i++) { + if ($isbn[$i] === "X") { + $check += 10 * intval(10 - $i); + } else { + $check += intval($isbn[$i]) * intval(10 - $i); + } + } + $check = 11 - $check % 11; + if ($check === 10) { + $check = 'X'; + } elseif ($check === 11) { + $check = 0; + } - return 0 === $checkSum % 11 ? true : false; + return ($check == $isbn{$len - 1}); + } + + return false; } /** @@ -139,15 +155,25 @@ class Isbn * @return bool true if valid ISBN-13 */ static function isIsbn13 ($isbn) { - $checksum = 0; - for ($i = 0; $i < 13; $i +=2) { - $checksum += $isbn{$i}; - } - for ($i = 1; $i < 12; $i +=2) { - $checksum += $isbn{$i} * 3; - } + $len = strlen($isbn); + if ($len == 13) { + //Calculate check digit + $check = 0; + for ($i = 0; $i < 12; $i += 2) { + $check += substr($isbn, $i, 1); + } + for ($i = 1; $i < 12; $i += 2) { + $check += 3 * substr($isbn, $i, 1); + } + $check = 10 - $check % 10; + if ($check === 10) { + $check = 0; + } - return 0 === $checkSum % 10 ? true : false; + return ($check == $isbn{$len - 1}); + } + + return false; } } diff --git a/files_opds/lib/meta.php b/files_opds/lib/meta.php index 1ebdca8..c0f87f8 100644 --- a/files_opds/lib/meta.php +++ b/files_opds/lib/meta.php @@ -119,7 +119,7 @@ class Meta * @return array of metadata */ public static function get($id) { - if (!($meta = self::load($id)) || (isset($meta['rescan']) && time() > $meta['rescan'])) { + if (!($meta = self::load($id)) || (isset($meta['rescan']) && time() > strtotime($meta['rescan']))) { if(isset($meta['rescan'])) { $meta['rescan'] = null; }