From 357e9ae715f627a785e2d9de19ed805c7d7db7f6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rog=C3=A9rio=20Brito?= Date: Wed, 7 Aug 2013 20:21:53 -0300 Subject: [PATCH] Imported Upstream version 2013.08.08 --- test/test_youtube_sig.py | 79 --------------------------- youtube-dl | Bin 169216 -> 173074 bytes youtube_dl/extractor/__init__.py | 3 + youtube_dl/extractor/arte.py | 32 ++++++++++- youtube_dl/extractor/collegehumor.py | 2 +- youtube_dl/extractor/muzu.py | 64 ++++++++++++++++++++++ youtube_dl/extractor/myvideo.py | 18 +++++- youtube_dl/extractor/ooyala.py | 52 ++++++++++++++++++ youtube_dl/extractor/videofyme.py | 49 +++++++++++++++++ youtube_dl/extractor/youtube.py | 8 +-- youtube_dl/utils.py | 2 +- youtube_dl/version.py | 2 +- 12 files changed, 222 insertions(+), 89 deletions(-) delete mode 100644 test/test_youtube_sig.py create mode 100644 youtube_dl/extractor/muzu.py create mode 100644 youtube_dl/extractor/ooyala.py create mode 100644 youtube_dl/extractor/videofyme.py diff --git a/test/test_youtube_sig.py b/test/test_youtube_sig.py deleted file mode 100644 index d645c08..0000000 --- a/test/test_youtube_sig.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python - -import unittest -import sys - -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -from youtube_dl.extractor.youtube import YoutubeIE -from helper import FakeYDL - -ie = YoutubeIE(FakeYDL()) -sig = ie._decrypt_signature -sig_age_gate = ie._decrypt_signature_age_gate - -class TestYoutubeSig(unittest.TestCase): - def test_92(self): - wrong = "F9F9B6E6FD47029957AB911A964CC20D95A181A5D37A2DBEFD67D403DB0E8BE4F4910053E4E8A79.0B70B.0B80B8" - right = "69B6E6FD47029957AB911A9F4CC20D95A181A5D3.A2DBEFD67D403DB0E8BE4F4910053E4E8A7980B7" - self.assertEqual(sig(wrong), right) - - def test_90(self): - wrong = "qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`" - right = "mrtyuioplkjhgfdsazxcvbne1234567890QWER[YUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={`]}|" - self.assertEqual(sig(wrong), right) - - def test_88(self): - wrong = "qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<" - right = "J:|}][{=+-_)(*&;%$#@>MNBVCXZASDFGH^KLPOIUYTREWQ0987654321mnbvcxzasdfghrklpoiuytej" - self.assertEqual(sig(wrong), right) - - def test_87(self): - wrong = "qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$^&*()_-+={[]}|:;?/>.<" - right = "tyuioplkjhgfdsazxcv" - self.assertEqual(sig(wrong), right) - - def test_86(self): - wrong = "qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[|};?/>.<" - right = ">.1}|[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKNVH zDxeA`X#%D}*&4nB7eWM<=!-*?00`(e*}$3*Dnz%7YLOU0@Tw+l+@*GH4n(}34tuANW zl0?4TNwpO57{(P3@brz$bP!L#4jAJlt&%ZI7z_o*hb=JAL9eh+3{7nV!w4Kk8-;tW z4m_t(jh)EAZV5KaL&qgNWXa9^*2vN;O$n8ZW`pFI-wkv^X2s$RZZq``s9Pew?3N27 z5X~)0WjWk4`pnd}E&8Jix|E``EUV-B+g#LrWgx&Kkbma^kn(r(UEh~RZLv9|fHMl7 z8r0?qY3PuMg$jXlp-z}<_}i*+#LVgqbiAL43x~TO$^ixq{Gmvn%F5;|4{GTNJE)jQ zD>${~J{|m(pue!FW>NfY1y2gGig3U=PaFVF3+i7rskTjl`1`a1u4W>Oru7FB0cy&>!0qE2 z;ZGy2U$>rFkHqE7MUly|X9$`>S1wUV11_a(i94A(Z3}J66!qX=(;|E-aDd8`*HA#z zjssr=V4zT=J*omai{dZ~78p*e`>CSd3ye9e6UFDNH5yi$ZYL~$isRzN8wTyOB=f%Z z-C&WwCo7y;l<|r8B`CgN^*bqoLI#3whXrzK(~&ug2sAp{6I7lJ@}pK|dv}$;0-@a_ zGZafWbql{T)$~Bu()!@jjeQw1+Q5E1=&4fy!1DK%Y7*?N7F|6>IveMvU_FR(^eFBr zs^6&93s1_xjUA!x#TQNdoD)m_DG@!pnYI!*v?5JJMOwk)HUhc}A{DQdP7`Jk``Ucz zx}NNUwf^K{%WN3i{VL3@3gZR#G(ct%PisCTl~nO$N?o8)>Zd_4lt*HfL~whd3sl+< zkj-M3VI3o;v+uT|D2qYwq%NE03cYk}z!S94m)hpoR9fzN z!Pt2HTkDlU)qc9PGd#>VFIp>;zHdj<{U@q#URNHd?v^m-x=qA3yCb=x} zhDWm(8)w`7t}fsiktX2YSABfnaLIvAdHiCU2`6)5YJ&P3WCp`wKzN^C##QJ6fU8~* zv1r%;hD~LD&WZ4NGCU}!K4Coe^<;_!3oQJ{^ZDFSNBW>)yziskkhRJ(8uas$a%FL&ZLq@Nqro;$47|=HC60dp z2ck6a*+WnOxC|m!-M4ztE&SENVW{!MU@Mwo2WLCZe|Xehia84ivbSVvdr|9!kvoK) zh&acz2*;k9y&!*Th>}+py6g_+9NayH3oLQ0pq;!7h$%K9*aUM9rOu%TFx%#_iR&Ng zJk9{_!#%yZFG+noRa;%RET~xf#mXmYf#i%>R9Sw%M;9IsJf@ChcXI%irM_6kk4Oo> z-yfS7)X#xbE%zFyZGP8;s)`5$gV$pjc)sZ2?Rr2rPCGMhaeg zv|>?|(zzyo$s`K(NBlbzpr9s?RHTJ2b~Jy%o$bOiFM^GKO>D0_mVU1)R|w~U!l-mm_kpy&pO zJuxGxc&NRa)6esqjZapOy#pg%i2=8_iVI1X1os_EZGsD{CV**zDLFrK|K@pI!y&K# zpTk?wVu?nLRLnp6JEy&O9^o!ccQKiNB>fZ9MQv$ zqHg>85lDAm`{tv5H_82~v7Pc+klHDNFE=<~4;cNp*!%T@n$!RHaP&c{ej7#4V~V27 zgeetMm!2%u@x(V*&-e#C2a6k_*^?gi{BMcJF?W?7XCDx7PE{0XUyY8FoA}cRL|vpRam7^TfRsA3HH> zQJVj@E<^U%d}>LOhd6})Zk~!VjiWxIq7$UVg2f4y8rn%3>>reks$&q@^kJ69Fo*$4 zMnuSce!w0BXsau@HM}tzGz^c2hoA5<$FZImnS!m>lBysLy_BsWl?}=(8Wk(En|$5C zpF|yOP(zzKrvZ{#}b&z@p&e-ufydT5#so|R#dVeG?I z5u&%sKkKecXR(ur^x|iNmh*rhtyft$wNOhFGuE^Mu+VLTlBn<1fc4G-(|tzavaGl< zguB@y!A`;SP)8bC9J5T%hXVdi@y?(=3!PiG^8=1l0Xz6SNM~q zx$6_b05v%gE;<&A*b=k-n-M`3XM^E{5{6hHmWPFq58rDQ4^THFRj{q#xiMSL3%Ah; zA#1$>Q072W}UE}t;k-H{Av8&>nk~X3Y*m$*!>}tJ7(YxjvZyw zN==-Pg{~t#;Nf9r6@_$t4w|qjHP^6`=L92wJR))nd>M~wXZ&1(-Ybbtee+b=P0x%o z0iz0g@u&34t)F`iL$YR#pza?+wCRw$zrqvFt<2xgpUa&%54gF?n$%#xi7>5@cQsVE={f5CNBfF&GZVx`$j~3a!i&}XUN7_G ziuUq-!+03RUFOzR9AD+=i8?Xzvk)2pj{fOd+H%2lJFuW1U(5Izf${QX)$%iXFTcOA6(A#8RjxSyk=< zV}m9lA$)kOofqP1G32nwOCToTgf$%=g0-g{z+YgXXY0>;{b%RZvf`+!MEiL0l^pN9 z)=)J0nhE>tK(Tev&2z9^AV05gnE0uAtkjP7G}T&ZM@Tv99_NLw1%i^Y-k<`45YPwk`S<#K6Wv~4 zzTofm-k_5os`Q0si5!%c3o`X^Xdb1M)o@(-Mqn>En$Lk#E^F9Z^MK2CxCpu(voJD}BjJ83q`$`5<%5pFl~dUC;=hq9xce z*#Oy5Zqy`ZO+$Su{XuSISJtZOhyn2)6B|P`e5h6_+Z6cWzY@~`o%_M?w|X}Ov7dMl z5I7L({3l{~Mq+o-^fQeH!py0L71z#9&8ImmC-$9NGEO);`=EKhh9U*5kizqXAQzc` z08lX;CC8S6Q{hwbL;q%9EiEQL3owUHfrMB9O$TWV+_-BCmtvaIbM;k%06=>Ym)?Zx3^2p&%neIS6DQdLbKV zM$)dcjeDU{DyDXII`s+7cva&jyh!?T0MJPt3}PtE*#|rT>;ca!RxnUlYh;>4BmL-f zlEKGz}9 z-!Hs}oNrSANGpU4w#i|%ui^=8@J|16*Q2X_0TQI*E#czO;snH#rf$cX)SHoc{GH%g zpNhk8aNuT_3f@?ilgF{;RQ%GU*0d?tJA;tEUqNU#UArEv9O!_J-|m`u$c;py#~EJ>scdHe@TH3!(liY(cZP69P3Na4W_o2HVPd zLHsWt$IBk29@7afDD3AC;9c12nYlM1oYL-`{2wlK{ZDsv-UG<{=G9!l}E z-@_lk^7Tj>*sTDM(#Y|Zk^A3R*QB&N&q}O1Qxc1}@n_ko*`%;8lResC6b8$>2wGf- zScMxWqiDsUoU($Fke7N+#gyqPDOnNGS{$sWQn0~GA?BSQLB)G`6!l*ZDe-yzVwgV3 zS`ql(hi7t3&B@!okiy`@Vi z#t_G@K&Q0H9Nq)<+)VdIQjp><1sqv@vxWDhSVZ$p)}d5Bt0Z=%s{2e;)C zW=v~+YAXLIhYc^zJ5fwl%p4=pvLwbEX`PYEX(CO6B@-im#DrjVzlmaM3kxWy*@P^+Wt z1VUM}yU-cN(&24)4a=+x0ET$p?QFG$4(%@bq6qm99C0yeH0P?chwL2ZAg!w+_|NJu ztp)mZnTsgML(mdX0$kY&^EKPhnadrqzjNBQBmI@wbr`kQjba9(vu7?I9=_F~CufAtmna+Vq{lXQ z+7OLyl=$a?1dr9?R+RAP@?NU;-rZnK-%n3r=dpAe9Y+H2w3ez9yeN)TyC}2t;KAv4 zv1Y)L8kAD&5awpV<(qOnz~lO5ZV>{p(!b9=Z@ze! z?y~ed=k~?irzJ+5?h0X8~yQYxAB`)AD2)iWS# zIq)^EmgeV|gA9r%uxlZ;iCFbp=(H^SbGkIHi-Y9>K*f(A@ zZQNXo#CpZI3?BBVPnf#^GJL`%;u0kLqn{vuYq-O!-Hkjr#;aN0j1{&RxK6XNA(1K4 z5%UYo@Fi4>Gxg&y7m>Vc`70N$u_`e#89u9D?8Q1Ro_W>cd`#@2F3d5~JsATUjJN|_ z3X78fXk5TjeYrEC-debZ>q%#)h_%Zv<1l>6=K1<4|D18JbT_+7S{Z4S3TwEJhYiln z1uPine|@%_sh}qPO(oEEf1rD9AjZU?FmnJC)%Fo8&G9pA4gQ+>_%=R z(HyF89)+pu8?7>gs)Emwc!gVXZ|A*HjF-6v;JBhfZR8Q7AGNwy)ZpOq8vW60F~aJ^ zP8-v6OXA{ZS5+WP4}*2G;!{73Y;$Wt4R>#>-k&7n8G^7R6YoWUP341*v|A4#?Ys&Y z2L2srxr?H6S6=%df~TR_+Mq7-z1dTJG4fD+4$X~Zj7d0 z2tnI~!C>b=%to5zKRgRYH}o;ZcDImfttbq(am4AhX)FQldH>{CDIs$I_6*+@J(4IW z^MT2yKa|jzY7h$xdR(Tx0^Si7WkA6YV1WJ`*I-a0JKrIG$yX5+P}wse%Kyz|>_{qH zPD+^n)}j5U2ny)GFgv@7qKOI|2q+05y&eq&H$B=B1RfR|2=sqp?d14KT);-2Icu`W zQl`6eg59Jui2%)1lS=$JXktM`#7GlSML56@lc*E6vlDAigs4H2jy*Gw83!i$*qU~* zhEz@6(3aIY)2F!)8?k9FC5gKq#*+3!L!F_Gj!n5f)%?Th`VY3caCszE^{(Th5j$E{ zlTH#ceHzD+!p?bPT3D@k6hJPhc=y_|pvui2bwhg1CrmbSp{OFN?3OQ`ZxDkDrZde; zC5TvKS`Hr*OD2;5rLq0WH=y)pXD7F zt88LSc5FpF4Rj?O_8+Q#lNru5t)oJ(r^negnn!Aap#C5IsKPr(Q5f8v+)-6isQ@`* zfM)jH5>7)*Ejh~M7EIDsS=!az>oo0Me|!jZqnBJKDPVa|4~6?hDA|f?MJAud7fLgj zg-ABs!|iKlO0cPB#Vorc=w4dEW*2sNXaBvA5TmBv_TSG40f5lj2dY(LT0~eFp}T}_ z85_}x$V?|dy9kq!6x(*+FyXH7Qx_Db^#14OY0*AdHg(!dOfX*PI&i6?BE3Uk3<>I0 ztqe`ah)EIcl zLU7m7fFUIL)ch-)Ryz=Fs9bP~q-QGeR8ixDFJDSGK0aw4@245f*j)+@PFQKP5RJJEv5Omf&= z1WaQJbj*aV3Gx4jcGzOSnoXwHuSofRNI%Ez-Ied(>`Jv3G4gW_BpsgKN`c4jAjl>f z`)3{j+K(m|Gt5qhpBm@IA}hr$o_Ov4;6CS7y*%wavB2`1s%GZ-4RkQ$iz2kV<|A}i zehh|}-vZ4tzWmDTTlSH{oyeg^WK*Q*V#A1Pga~udF<1mc{rj<%(v^kkLade+NI9U&)tntm?!<-3q32|>k}(q!OBI@kLTw_LsuVuj)6N17NThe zK;c$%bb8cQfCn3VE(0!)kHPjpxA#AyCUWJ#w2t%q*Hz9%xvAQh@QS)B|C%?RFVcw! zjFL#COa19q8Nld9!w`AbFio6G8N{BvYa#P6Ykpu!L?i}h{QF|lFZFe*O}TrKndHDgX4$jn-hBg;!=Y(#Snf{zc8SxC3Ma-h7*4)8 z+3WgwcblLO*<2Y%3WM-pNrm?3jA4fc0z$%17s3X?1sFNInlU(fsj2?IWYx_R76=&Z z925xXe~wyBABXKO^nZK#L6YlA)_9#4Ft#jP=AF^eA0&2BW9=S-C{Rseo3bzWKO@n?Prqs?~2XvnrBvpcnPkC(svGN5H(CWCZl*wcVjkXwmj zQ8a95b+I&buEvrlUTX6i9GsPd+wdvUP3EOQD`;xTXf124Q?2hvt(($Z_= z%%_lM&J^j9MB}4G0i4<;Noi*qG@ZY*7Wy^{fT~Rd1cc{1<6$sTy@`M zKkQz9UpBCs)Q$V=tN_4uz)aQ-1{L*>OaxtLR2ub@I`w-!T4gM6512}6z`_(E?_dy} zay9(ln$2F~mBGUNKVV2imRugP&&nn?-TPQmZ?TpN6NiV_ATHCU6kL$Oi87LFRLx)_ zQczN`UKl}4)COVOl9J|?N^H2>P-Y3dlS?CNkCEysKD?qH1&aVtoC&+BR0+zJer|8C zBSmLPr2?T0L;4MNu>7KV-f(e?Zprana-mYqUjBO`YYK0XiN5)R+K{uWef7_l>HD5; z$5pSfX&wSpm~N$osJW+Zs*^v!-SU$vQj;pR*5R|O<9^|dIQB4=pW>bekH?1UEu0BT zxO)nvo3qt_#zX*h&{N;>O^P!jED$yj=Tu#HUjjyl(lLFxeAvc+MM`5$sWg;BZPa^y zJlSEXxmWc)trgQHTq{2!1lR(6}$U3Gz zSLSSVT!PJHu)=Oht6>k;AQCSxFGw#>d-gOLdqs=2&{%P=ai>;e;4tQ45uC?VT=<-a z!sF<-xf3CS*(urcMair4x%&*oXMS!k`RB7hxGia8h4$&7muLS}Fl_AeBpojOQy}DV$BISjDo34w`jo_o zOcNH*o~r!yM;9F-zls^umvX8g@8C)7dXnbrCK&;MsxZ0OHu^PVL5dR-czYFrU$oz) zxxtqzZBPE{d#<4uV3x#EFlB3_&txphR9SnDPP3O(NrgH!PA`*0UCFO*RU>1?leD#A zi|1?!n|vz9E9EVq>Ug$`akJ39Ln>O+GpFc-5qCkwZ4KD(T}P|l+-wEpY0)4&lx`+Y zJ%j?rf-vCfV6t6;*4JllW3Pchr0X#%iJ5;&lTZP56=9#~mI4{St}NC@VSfw`I3EpU zA1k9B#R`KKvYlvgE~9Dcl-G_lXWm>!Wb458ih}I;m(BQdXDj;S+y7eY9Cadi@=)^C z(+_V__g0G2f)uYlW%o8%tC&yo9$IN2b5;Oq#ZqQj?yvo02TTSelb_>mi9fb9aX;Z! zSfShOqkTS*M?x!`OqXnQD^cav1^FbsA_Zd`huv#Nic0gsIb1)hzi5(&{ zRmncF51aKaQFXoymt?_mUt1Pf&ULo5Eh?umn*D6cTU7Xo|6$?mOD`y3Qkvff_$~qz z1{Y6;>i)v1?Yu%;$)Z5nQ8aviHv=KtUn@bQx8t&n`3f^c$E*@e6hZ1yrq?hhk1!~0 z(613=Mb(812wFiY&FB0JZAFs$QRpU zOORy-6-Uegz_hr%eG+Mc@N5DYA$SnN=TUeDl+P;gR3F2^Eo~8ZA9ww^UIvZs z>f$dFXo-Lt<6A?HtLL?2$nkJrGYYG8)kCU_k0{WHj`50Uvl=rbqQmL0!;LhRd2wAy z8W|ilyeoPu3+cnGa=NH)jfPd>U%sPfShxFf4x!6KiwbRk(xz@XU*M_X0B?Y3!CAHi z&sn$^7QObLlTo`)B#{F?Rv91WfMx2IQdaFhocTC)&>dOw#tBiSw(xH4`fqOqoC@$+ zA96MoE2Qq?lIrc$)S8sqehaLXXk-O0z zzxI^&X%kzk7K<5r>hl*~svoX1p^af_Q>GMc-KV(5hXkemQ|2-Y!onLpVobGF9dJEl z@wgKzLy5L(OMjrv4aE=U7exu5hEA8a>{GYd(p;^Z=^J|`q}mV9^KK^a)fX^#%WuoW zD$r>0(f)cMw|*{ut~B5_hbX+7(>3n0Tl6jZEk3`%vE3f;a=G8=vLky($S7yLzW3_= ze&h|I?|ah&QNEOzsJ0$_Po=ENA!jwZpjz|cutV9s=q=&&?7VV?4>WA-2l#$t6>X%+ zLv=-cG_sd zhR=2W9{;MIj($IVqjeT%{o%obPai`&vD~;3C;hv#x3|}1nc`Vd8VcxYZFC*xNeudg z*@RoFM{*lpbP(tyP3+5lMo=h+RPr!IoF)%52}!(<^CR?==v{w!d0%GR`aX1bS3?6W z7Wr-`DDY#QWxwHWo)djLZsG9c;k-PIlte&HJ*uZ81Mtdr9F#6rX@cC?8qSA;LF!jG z)o@xvn_e{f>=EYRkpq5!6%^u^L*C*czFl{-XZP~*zBlghpY&y<45g1$$sp9SCBJzv zn}T^g^z%$!=6lnReaqAJ8AF*DiY{}oReZA9t1C=Ic&hokq-+;yN) z3$+k?sVF~|#a=)m7Y}3(o5R*tk(98ZTcNS8HEPn2ZHg(GcR*OJ2dRgu@`A^rtnKAG z9HroHpmrUXkdzPGCCjDkHdO*Ovnp)e zveqq}p$qNN)DiGl?JUXHHs&UN4Rgq+nG;%>8ys(0l3Fg2lCV?US5UF<#K_V9mF3d->3~^Hq#W9yZ;Y&L~j7A*~eYFUP z&}gr1a)5(D_>^ApIC3<1j`k3;-605Cj$ZD8GJN`FQ7cZ|2LJdU!FDi%n{m08f2*nP ztvt)zy+J$WJbX*~_*4C@BH5}vOQqN)LF1iw9KSVk{VUCX7_s}Z0<$BZifgtldMV30 zcZM;l`iR#SVsM|W*qsRRmv5*KPTrdA9kTzK69Ep$fqN;DuX^kf7v!Uai;L_1D8qDe z->;Qxk^`6s;!`J4uEH^4M>TK2Rr1da$<(_#9Vv!~2Uqm%lPCkArKjK?cv8e?jmB^C zu}9Fjf>->*YWG$}9F5J&2K)av8JqWk6w$|fq*3}0PfI5R0wM>(1M+fkb9GCW8YhQ( zl>t%yZ#KJ+2lf4rie3c(Ex9vG@SilfLw()J7Ir64vxejZpj%(wXio*kXTOR4C9_ z9)p2cCo(Aahl=a8)TW!hBdEpdngGq)lb))ZEK2ytR36SBR^Nj^uP>-x3S_x9xm5=R zi<-6S?lFQojJW7uHw|6C`2HWskbobkU3IHELtbYA1N~T}+(i_@TH%+Q^HTuETmDn3 z7ju;TGH_pPE+{Q<$i58}&Yxs{l_zkr7o?0iG6i!ta@8G+u0G?%A_lVjhY+!s41u*H zS*QNKW8et!<~^G>o*RhTn+-TGu+GKDmAK{CJV89y$0vWrYcKkLLr*;NXGNHB>;5cioDfqAoQJ7fU*A?^h)EdwHw zQNXKg6kV+%!9rClG7ZTjt4Jm3s@)L?iUF9SS6N|#B__1;vJ@op`>cgt2s1bA?_*Tn zgMb-};J;``Fyqt=)ehSG8KD!+-sThzun_|F@B7%I<5_kji}%(zR*C?Bs@d$Av#(Bb z?VV^&ZX01sTp=|s!zMs-E~~Kukpi(65j$_R*#{1#E+RI-0BM)gPn^JCyraQo!gJao z|Bbl&5`R_a@0mf|;uoJFx*=KyCK(pap8h?W@B%Mz3zjEHzK6kCmy4m##MNLugC3&RKcXmRb^dwli+Z}1x6k5;kMTU_VR&kh4L{S2ck$zk-MRL8gmXuk~wE(QA^ zk;s+MO__oM0t&@RFN^}F0sQ|BBUqcx+nkR(27!;ZAkK6u;Wv0yR8=!$lcvn>WoTmZ zwKWZ%f+S--5JdDgDj#olKs{2El_$ZXKz<&@h)YCqnnAWW+J6h5Bg}20lP%6ZrkXp> zRCo-Sllp&Vi|@}ZXN!Qa<D01-{ehzHzVzLFUyWXRJ*F|39B^TaKrV2FmJ>c-+T zH)`wDPl1KlIx)$0pyIz$&dBIXG9yPv zCXKTow1q@IPBDgv;N3of)*T~2oTHPvJs(fQI#1Kr3amnKHp`9aWDgyCfc5hGz8!l9 zc)u*-T@Z6Z_w>EbYE+;N?Z~5-)|36`lS|R?bO#mAg;;||vY&&c9)A}%XjhdSB}K^7 z@5d*+w*Ki7piWE?5 zif$f0CF{fFp9J1HQy%oDT=8o(Qyzu@0A8iR#~bYD$T`H&ip0M--5^oP*u;hWU|@FE z2W6cR!#(ntaRQ?f!Y^tftSP!oFWGwvAPX{!5lW;Bh9V=B!V%JQK>f;VW$>%456E6?GZVrNhxhZ#vVRrK`gLLu=MS0y`yvp8PKPRCSSb9yO z74z9&qi)Vc&WClrb?F*{F4Ar~=Ful0c|tT=9uynGlEn;k`v~?f&$6r0#t2Oq?-rsl zwj)@aEl_Uc<1|-r0OJY#O2AK25#eRhtoJyJKZSt}qXd=VdLYnCTMWw=My(2`x+8iFPj!k#5VWQ|nE|Y_)f?ha<;4yt zLer`OlM|+R8l@aqQpy-G$`a`5!(z(2r|9*j1zK@zWHI)hfaAeZTuG-a`-FwSi1lX} zYH_+fG8#SVqy%Id(cp<+9aAb}FcM5jq+(fpKC%H=%Pw`Ol;SHYGPiA(Xy+x##;lIL zw=@Mku$8fM=y5|3spbK-b$B9*q>e@-B^;Y!n31peAt!Wm_P!6CaE3=(S~Gy|Ja~q~?Cwl6 zc!s{YKJWEt4}d5~^yU!$*yLG#UTcSL4qL-;#}&OZeGG)44H zfY6;(k*lbV@%UO8n#HE}3JvmcxN{4$u6-2+_<(vGz@^ykTq4cJ98x<}tX{A_LgO! zy?ctR)iXdR#B7r5G9W#*h$%Q7tgjL+2)BV45yzjLSU;GgUNBL^ueCA2n`zp`d76m&w1#!QiNjs=em{= z;p-8}UScnDh;2ueaq=H(rB*kTv1?o6nCy=Yz~}aIK02&%*Kp>D>KM}Ad3TZkDr8t8 zYR{atFmZ}G$+8b8DS|#h*!4OL=rrr{0sd>VQ^quKGITZ87PNfw^BH_Cn|re3x31{D zVM9z2`gPj2bqlomP*3O)Oj?&{OTDoh#cHe_4=Ivd2ric*i4l73Z2{yQKL#;ULlMmm zU~dWjwOQRT_Hx@^7n2U*4pnPiso2=8ji4@5IYjU&P&GPEtt%NNU>xm}XWK4?#Ozji{b>Q)_iD zN`5lCZ=v{jk5$QmfK>|8Y@L>7MBxS&E=c82Dk+HlL^gC%K8%+mUv`Q+D72{f&`M^oT|uBHm-j$H zj#7Gfq#Rg|;!L3y&6p3Kl4s~j_1U^#tuv7*I0A;tSG8DARn7+RS!bzlH3CQQg=TCT z^m5|3N@B4^BHOIMfMmaL{pH#VSblt3>iDiRq%RNuR9u$buZ?{pGz#LmaP-K|;FZzb z>^(7&&ZyM5QIjh(}lfMQHk_9Cz5UD9KxfJgTs`G+rAsn{$+ z0u9_@8v@9!dgVy(OI5pSFP*wlysa=3>CIevMC2vKo_+Mk2-%*ze87bPXssb*-TV6(&#Q0wM4x|B{su#NX!hy1A$o)+@q7#3$^|b)3i7SPasaAOTyE{ zzn2~6-&RrP@uf1_sqrhdzA4ZO+?_t!OqmRj_M-O}32d_X;4wvJ2&&Fg3LIVRh$2d< zf!sc|aR%G&Khnz$SX?~;3e;Xg2z{u`P2~uq-jh7FC~U<`f{?6q3#uMD=BDyVmQ_@{ z7kKk!R39p`nrEJ>9EOa~0R`A-#~v>L=-u~3yN~{E&HTPJ zqmQaPcmu+9pFI%~k2ghO(pdrQyP(o8NrDGP2*md3{aFMXeA58Xo|RJo+W)jNhFsACo|LV$hX(7 zB_fe7+#5|3J@!7l9@u%p2x@(QdOY>+c{lM6W=I&Zsa0X)zI*Apljx&#E^$zO?zt1E z(`WuvQglCv;r};sF^_c2efRHoZIoWdoujiCG_U+SU2CtvAVyjQwnWzlhOD-70g#ta zod<%ytq)k>;l9AnfBht!i~AbRGY#BenoL$pN0I9)o4ZwxVx+sMi!9Nj`3S3Ikh0XE zuIj>-&!kc@=S)WC55FU^!AYb~7W?BxKbq~MMoaAn*C!wMuS;RLn&~1uSYhWT-2gNF z!D0D7Yhzx%VLYvH#POPWhx93!T`G-zJe;#RVn>9X-8eP+ zNb=$ZzNGT3XtMGi6huoY%NDVe5z|qsqM>~ye=tkAeG%A}83Afo>_y8gYQSg_l|s`g z40sY>%z{}K$|MTD9gpPb0_cEQf-Y@6#nC1||F%Dfc#C1131(6y-4cRhIKC;~MS-Sd z8&kX(OE!7toM})VQ@LW$X3oK5%7bsaaWfNHfMk!4@`?S0!;Lvt+M50B4n&Hb5UzP% z_G2G&_nZL+`*x(YZ0WjI4?q@*1KOqo4MC6fq}GQPJ5nExAqTvbjl-m|ha))9>(AmK zcl<+DrqS^9`I1EdR!Msji449Anp#4yFD#Jo%D?X7J2dgTD!O{Az`3d7L*huV!f41g z*+QFK8nbfY?iZ2+e#|JkP-9UDn|q5<0{qD6h^Vuon~a0Eye4?W4S-m8p$h`N%+jA` zA`3qyhb>cuWt~*DC0yER%Hk=WLq#iF5t2QtuehW6Ji`fEcsb-@_7kQEwjQt7v%0%B zzc-1$o2#qT=BVy`lly7|c-LQs5cWrW$Yu_GwIk<1c|D;A+m=i)SxdO;&-rX<7qbF2 z7QU+Tc1L??ccfLD%K#cD-oL@#v}O2s4nsSN!bLyryg~+E z+KeU5<;Jf?hPQJbWGTzeh3%EtE*qM-PNj&hE%?=D)%Z}>cv)XX2#5eYqD$JN(ts-r|3?|ZyB46QL4bg;Ad?r* zaRKgDre+T2UUvVd|MXnd|G*U{q~AOPWUH&3iWx!JQn9NlX%QS{otw~?qnn*?mFJ`FT)+)&3p>R+$Fje`hAsPhrRx~>&Czmp zdQayA+G}t&BO&L{R_ z)Dq?&JNL+K2)j*PXC3>#4<{ZRMKJLt8y1!VwPJu;?japvD-t$#HzCs z>f{MyHDpxt2ANIxV5_S1JHgG6i1@w{{)6-+2_jO7rU?o)mVwv;LIBN0#9t_%Y)g@J zub!g8+aEXLXPlD1XoIoMXMp2RQPO{=giU(+fZALQ4tmK8!+hiIkS!_(bs;}sSuqmm z5*@79UzE^XVIZx@(Ke;vCQzKzg(gMlRUj8i^r|hp{eqFi08XH5S6{_IAODlEfgtPQ zyR&+J$r_4-np5CV?Gw4}q|ZI7n8G@cfazD?QBA#>SN90`irMX9bO2i@$}fvE4gYW2 z7lDm>)n8g_#Ez6^)BFWsuy^1hHl|=ce%_SPu8A~~Q!5VCZUAqx`!WZ9Hsv^@vO-8& zURtH@i&)N2EkrH#VhmgvQ;t&s-{sH91%HJJ8D=*OknNc86OgI6{EBlpglZ^YOdE#CIAW6^t z1G@6k9tgfbNQvNVmn&UDf(&<6ZFSW^O{2d1JP9QD&67FUU_ zJuO^VQAXK#ByQC@#s|V^h@SD_iakEK;*5VeO5e%LG#nu>ARanI=Bj7GUTOsOh=!<1 zz8ak1FKelqf;2i1jM=gBESQ`+4UNH?r<`6VSblMBe!0=ZX|qa}p6|)pG!p>m(XOhb?wYDG-^A{WBM1IcOO>)P9=bw6V42jry4$ zCpQU4li+oz)p+ECocU!m6}8Z!4)$EL`+WZLG_0}g;SfJTu(+_b`2JwB-1I#XP3m{> z1)FZ%&(B|WP-?PB3OMl0s_+5aUv^gDn7h^2)ji`f#IJ4}bos3KAT2OClbkDh)IS*> z-1hR!MPXv$~#gsJIBd@mb=#pYNIs=0juT=*!9P z@@Mw(dOjZBuY!F*Q+z+LbLAu_GZg|^IiGYeK+8eaSbB#9Msm6wevAM{+fX5A6mlZK z{_eKfj<+WZ^z-=gc)_6LW!j5!1=w;!5(+yi=q>B8l3dP-^+)#kOy{An#9h!tNL?pK zjDba>T4v?FV)QjM5qvFAz)-*7L_$Sum*6`ArmfGnG*d?xLD zQg=jSP$M|S~!-|F3 zYdT{sk<--(kr-ujorzoMiwmYN0H;_?BKNx$vgO{CEfofepqr!~RnUPm40#cP;IId9 zC~Ck~5hFY0vU!v-FGIEiI+Q0pI$h+H96RV*)chmD!!{CY?wE*o_m!Y-6B;@^9d?}| zmFcAElzLpGai=y68vA?2VM(`UPWXi$@a(s_T|eH5fZt6{mI|)i?cbsuqEVui1(ejN!yY! zbC|l8rS!P#?3hF}Ym$nfX*A#?I;H>Swo+xfo^Ji@W3k+xKYKw7ORAm`Qf%PWu zV5P?pdGy?EPIBNYUUVEr^bi%pW ziYdptU zZwh`FA1Mc}2n^~Mxcq|@`QbT23Mf}xvY9O|bt(M%lqVOnLh(fv!Uo6chWzsnaM`mN z<7hSYSC-s|TP(M%bfiXk1YG)AG!b>FZ}f}R=L`~oBx`z8O9 z)T>VM!1Rdq5j#aT-LI41r9EHl{3%w}Nq zJoi<_soSG|vEusxuH029AKv&PYw=)Rv=77=)pDP0k7tgX z7}%ZgPYUN#D}gIvAH}zq{q&IL*;>^;CKPn!D`H_$PbcDxsx3C4Nb7^buh}LxP6SXw zS(HQdWIZ;RW74kfGnKzo|89$BkF#`x%NAj42`>CTTCtO#u7pEQS9cCf#1R$8+Q~!j zlle-!E&u8H8qYU2W4qbWWxh#p5`_feFnpis_?20`{-@}fE=Q3!2vVWxlYL5MMK832 z2YIH8>9Bi_5kt@zjWF-#LL=3bK}{rN$P)9!P*&CwmWhi4j1qmjgb($h^IVypI%btg z&8@rZGjx8IwTLeTyI4Ii;_7Ad;KHVDqw(w4Tem@k<;nsU%f!23ro*+!s>W6$c`bhj ztg88_&nnTJ{t*Q8)e+)4h~qd@Hv|FC2wgb_f_(E?zbS%)LP(}tKJqQE37gTMm-;$h z^yykXjXgssxtQe~lE#yLaGE73S=*gMCJ~MvnM*W{`=uJI&wGhUuAN~&j_iO*&5>2= zZ>Luzye7Q5v1Y6wq`Vq^D9V7D0t-460dU~>#Fnex?U@lX=)k-jUixC>o&6Yc0I`Vz zD1cj>7ok+vXOv>M#t3<11|7^yk#-bSj-gAB10$-mQ5e>CbIv(Pa-`=*X9oRt@oq9d zvQL40t1p(X+}9~hUON4hQRy{}eZ|0rL_*eidthU-1jJS7q;UtzNGJIW4|?iqP?nH` zT@xPd^Cltca*(!$7jAfl0pqk-0* z_~RS=J6=g0=zhQNwBzj~*^7fUjcZaONvCk&_zh@W`K#;rN!xbxHOV2Wn z_qn?E^OpQ=WYtU3@vNms1nlda3DAfqtJ#*G9GJ6|VTRZxSi0p-s>YBRK_rP^_MV`O zmSBXA=pdow@w25`1{0T-GIx41L9CvmczU1zgii^Ch5lH|L3NqLbi zh65bL$QZFY=dUv=njbV4{1l#Wa;g!F1ublhboi3wioas_@2gUhna;Xvq5vZzD(XrZ zPAcO7orN=qeo8uPn%MHXZl8P*!{ntHDGBx$q$^YHOFmt`XzmIj*3`bVXF+6W;0&i3{ED8v3-zWUZpvy=UuMIXM~K?f=BTjp$(j9i5T<%DFb z5>XdP`jwCYW4kyqTU7eG?<8v1=M!WlWM#izuR6ajFkEKvv+OBQF^~u}iACEbtLyW^ zx(<>~Yn=?lX`(hzyD!%pVD7|VD|bybgFq4hMqo+8U(_%#_3 zLF72L|0G=l1c_ger*>RINkH;my{GrohiZxUxPm5L@)$`}4zy31Uz*M(5#kl#p*Tm& zQ!>nRf=>RlPB#6czl)2o+3&iGmnd#u@IcaylXarTVK!40wRUi0$^#nbL!YG7Gf{BC z4+rJs*^Pj^)Kf*^L}jROt!RYAS4j3R=smckmz#3v0EE>a5E^k$p|v51GC4nnn9Cl9 zsbWkD{kN+uIo&6b5D$1{1rpnKJF(aTXqJMHKPu@jMmMTKn#>&ENwtTP7pJo|`mV2w zF5x5pfD(b~G10D8hlD4~&~+)n`C(6~LdUp4@Q(0jM1^oXFnN1tx7DoU;X(bOKUUUe zBf~lhZAgM*E|yoAR>GTAEIYy3T*JEIY$LYvkntZ;#eF;tKAyF2FT9)21nM78U$DCJYA5+>?5K!4$wuQ53dzQR7g*N=B(O^mu+ zVL{WbCPxX8b?oYmDBZaC2nW-vQ@=_U<}SustA)$`$S@a63rQ_G!YjU6WFpkgX14Ax zX=djPKBN2?zx`k%mNxMbBKn2qNx0WdtIWR{QOA^WIwgZMx=>wye zbjiEx1>o=Gsrx=6JM50m>dbmuJ$}hN?GImV4@}#k;WCV!zBb>Wb?tB^=@j+ocISWa z?kjKIAcfO3nLt(8y3r5n!$l;LaqBDp#vMFNcNU?ks(Pf?dv#ZXqjxPSjrDbjlIwD8 z{N$6P9+YAMyCNjQ)~%;S9$TQX5w1JOCAHnsHZw3zTa=9$Ta*9BUZ7*@K9M8RW=^;<-axwu$GGtY_+XS==}*j%FI8G`!=ox^tvHePF^HYhKPhjH;$3aqE@#|vxKs&3YC zzojyLx{)GAzY;}77P-*A$B7`4wY@p!w*p@S2IVz(@ylSao}n-_AKng28QQ{M!lv!> z-9ks6S+9|3*l(OB@_+nTY1WM@vSU&{x!x43w$Q$Fvr`AUb*Ax-pD^q+Xlu7H6EAx5 zDNVeN@bWsQ#^=Hu%F!_E?SvvMCHsB*e3ZR9(yk2aPs+U6b1Z#X}dB6-vKp=rB?jFu6Znt&`v>* zde}3N7~!3s8Xr~Cej#2)K@#`FGLqGjHH80~7v++;%$KSP#Si^`++5Vm`1W8vy7aiz z&mn|jevWFSCRW>#1xw$dsRs8TMx0S)f33#geZkQ(@82xStql{6LfUC)M~hQ2S3v0Z z+P00MgNFt>L!w=MvG>d;`0N5Mv>&<<4oFLu&{*!zK>NbwGe`7h6PY<&w$BO57}ti( z*$VF`yBiY9cqP|N`dK;8zJrDRd&4kz~4!na)j+2x2i*=<8V)d_N=t6 zysHpvalU9(|C%_D`Bs{9jq5@#0&a~(&XOz0Fx6*Xx}7ZMt80b6;k#Oz>{T*oZeuvc zvEy2)exJlUj`#6W>waCJ@cZ(!Ze@%jPVun-Ltf|Nq#jaf4}o>#kJ~p}p>Hg{sh^U#arT&6{fC4{ZlN+XN0t6Yq4KnyR=ssEGp&fACo8 z`N!a5C|9;THpzRZ*=YH58f~$2XshZjPJD$4U(|p703{t`ONb2J;bGUmRGo~3NAZeU zq_q-z{h&g7QQn`55=iomN?zSf(eB!cT3?%FQo)o=o2#na0yc&^U8{{y%e|J2uAOU2 z%2l*ydrRyYACQg|fnh{qX=Mn^!B@2Rb@iKcPTq9#sk8e7$*u?p+~B=ozL;*?s~G!3 ziz-N>VQroHDdT6|o)hyQwwN?D=|4l+JguJNn9CR&b`XDN@G~7a)XRn+J_-L;>DaCc z@WZ-}Q?mLXSJxSDbQ}3QFYBkR4`_D-U5qIf_vB^*OW4JMJ7!a+OeN$H*z6(v!_@0J zT+~8?Jz!D4hP)JoybhvQ;B}`$nPcG+!95Z59Jm)FI-s+lB1zT z1tUB}$TzRzOx2GY$ad-dzZ5bK)2#=}WuT^)uu z$$Du3e=xjtejTm#m z4oko*{a^(hIPd{MD6XPlPp=@voXO+8?h&D4nh@hYX?Fjg118eE!3R%YVLmIY*dY&j z{3?IEaB{?4Teo}6I8|AMBSZF<=WWp;6eskx;4CS^q4|=C2cX62&RS#W7XEou2~N6% z`nmgDDEuH6yN~09a;|fNT|%yX#z+NTFj}Yle7G#0vr?&RnUWS)IQ|Q}O74g!lkDHj-8`Q{7bMKh9Cu*%X*jS$wmYZo~^pC>;0rF~fH9%+HmwuxtF@ti5BnSK{32a7X8K28E1KssFn9^!iHG}<~wZ)%y?ab;) z*7Hv~T|MM_l#&s;1)t^)X+85RA7(0>zrat$WycHSY|qO@qaF%%I*yor-tic}Y>`QF zwSz;`Vc9)SUD~@CT=~NCep7!$#o4J~BF2F$&8vIC5CK>|77iBx0%#J>G|W>E_PRL$ zi`smIIpWF#b&B!N7>^jGRCJ(59V8(7xZqbZ-{EBkzuHKy45A0$)kIlBHL_lpZ*Tcr zXWOTqJ6DQzA&)1kXrO%h_SC(f`?b}9a`gNWhmIFhCKhcp;ka4D#Qn#|yF;z|fRun% z!I;<(2^C=9=UNz<(U`s0u0I*~$RcV9UZHY>6s+^$ACCF?+Dx3pzQRtUNLYUh0r+P* zi69q3mn@1<5rx<+#@SgUD19t z+X?*C2K*G{o?;f@lH-c6w-_7xYXTHHrGA65Gf-lfDb`zK`CRB&===qpQu*K(4;1yF zGx6Ft+%z(A6Xyj$pqq2~c1AWd0IpQqBaT{+YM%=JL0R+(5}l07Ow^sz`1d1)^NG}u zIhs`(e4MTcvL56PH@sE{Q^QTsEexT1K8%+Kg`78vix>Z}dW9(*XcA@@MGiG!%^Vqjxe+ zybE6|aR`qydVF+i-SiGBF++@Gw5teZV1ry+QAwyT0b^{mM3pWhc1dC-cFGBp{BRAi zs2p`+c;RP?&(ub-od`HOx-%t+N?Mxe$w2JIDq#5h2$y}SWZciT_}Hy8lSZNzZHI}_PB1VgO6fyltow2t9FI4zizFwmU-||MCQw&~n=nGx z&&}{Kg(_1c3r-=gHAQF-h5Fb!O8?Z}X#`|L$VUSvy(LfY#981NCGI2J!pTOry&nmiUB%Z|0 z0?tUBhm8_uogDe!h0sVYkL$)_#U z>_=nJxK#?_ibZ9MFW1ZXKCHwDhCpI_RQ(MOj;Qu9F+oR_PlD8i{I-u%-}JE`*EU4s z8qv(Gv)AB-Lqlpg4&50`x*a&n(V#Ch85sF!#oe3bIj$e36m@9?a0yB{KPbH4-?C%| zp~k-CR`;C^@BN`z=`B$|MKw--#0!Krs*4V5xire zJ_t+~{IlKj<$!(*&MV8xYb8m`wXDju2+ALW-eSRkG3)r(M{fN?*ZK`Cb-wiswF;Eb zmH4F~7e&^pxOSrNT?E>n*_O(3T=a`|8}}aS`1Sdw<=Hg8aRlHL&td)n>g5VoI7X*` z_kJDBd$}ny3`EGOwLYp|u5V&Tmrvb6zS73w>`d2!U-BHUMnQ;CEf<{gs@5i5^s7)i zMK_Zy*2IvVrt!&A=s$N`SF>Rv^ZZ63IB@zh6jrrM z9#s$x2^EaQ$dcsh_CrvCXWu#7Bs*8 z$`FE+gD(opVz$UE=5MgnG{Q1yz9J)$P;f?|6i^Mmkgbq0F)Z)KeM_A_;?T>INz2$y zEyVo;FX4gWcjAu!6A;6RD{CTlr9--vzc7n}=(b|6jT04(Rp)pAf?`ZG(`N(MyA20e z=*8Q;NA#og2g62chm^E+va08!B7D}+HuK14ZL%?l%XT&-WjolThM1-~rvX~zF|*Xc zNmp0i@ITyRv?X#uQ~^91NGSZq5s0OnZKJhLU$%lO@h!K)@`0_$8dIW8OUPez*Fr)` zIn-WH#$UlHFVU8swr?th~8tg!^Q&-a+ENM2l6-G(X?p0ef8C7&2UqHbxuP*{bg>FSA{SUUYV8iC&C_fm2m8wv?sW?Fo`JO&@<&Hq$x0f_LxcjhBhX`hdG9ffzhN_ zdW{i)fufNEePWp5rN}KY88k$@_DL?E6*8Xf=1)tu3^q{Ns%Z>AP`k&~W(Yg%nd*;} zJxblxk1HGnT9%^$>vnjQKVb9W9V(-^4+@Uq?5O;`Ez4qc z73x~A^uSS+cp+KAH5H%I`0oRjPU$26FR>U>Uj`C^!J!8YQf-w%r`uI>WHdzxI-mx3 zu@YCJcZZjnBHpqr91KWtiicm^;n#oKpp22uq?rb7A93#lOIwFEKTWZ{&rF(9E>ca; zbmH5}XMM~-)`?_zTBFgX6(3P%?Ghzd|~HNW}?NKc)#1`o_U1D z|2l&R%%dhi#kOxgq^c|{lFVm3DE-FLnKi52X)T<85jthQI&HK~4f4dgy@2@5#pS*h zrfZS$$n1g37j2dNUD2rj9n*VRBQ<^DbKCb(j)v*)Jl*qNFS0%5KM=Ul)@U-ol6<}( z-+SjTkqUd~BF--Jt0aA#qd|2QyA-?IGS%eMd*I{Ah(|d@-N;v@r5C&E|s z02ay2j&*4Xf>HFmPpi2oJ(Bcun7bZ)MFaExjq7BymMm6_jtehiBl_uNX_K|8mYG!( z<0%&-OMXlm#xt%{VsQZfLGCBiyq3cRqlT?oo8Ct3&;7rg6^K~En`1QVpK=<-oNxNF zT7c(8+D^h9KCPC1m+(1~l8H0X$ne~jv7<-)sbQ7k(-9QNkle|(CgEt=pQ=r`*G3=0 z*Y%y@%d#&B(Zw(C=jOAjr0E(b72&ytb7<(Ve;(x5#qo>vn|haR_9YAs2-ZB%hL?^M zmtesm+wAW+9A|bH6A^?Eu39t>)`YKG!~zk%rNC2|sEnVejAxiP`PP?5Mr(vNilH^` z+p}vf<(9Oqj_P+|1xn2(sIVcZWp>H8&|admy$ag1OZ zYK14k6*&s>@1Ws&LxH*37^S*oWDZ0Ul9NJ6wgFV9d=%;TaUD);apQW*V;nhw3zxvm zB}10;%R*d+6Rd8}mKx`#m;2=6{bwDLnGgy)s@*SjOy+W?e4N^=#)^!|T{$b!!`Lh% zO}+A_$(8jNu{FmOynU`B#zEg0Zd6p4e5S9$;vuAI1MwhA#U{3={fr7dZ+u?Ie_0uA zCyeCVhOqTjKYVbQP&&?PyZ$~P%4YyvW~E9Yqhy^sle38XqDaNo!|uqH>@ueHdQG^ke=`5`&FKebQcDy)ZvMjX0fJG{u2bU`g-!w zJ|V=*`eFa&G#Z(ZKnI@#=@FweaCLO^`o-{A-eYfS{-X3~HG6%3(XqPx3@!lpJl;NE zbUz$ol?J!LB`2TmHbOTZL0wFzUNpPTf<}8-+H8Ed;n^h~Q^5^0vpv1K(U{}jaZs@D zR;nPq!b{@qJHMh~D04SH`$}y!{EJNKP`3fkFXiX@?{QS~#>?(|�fjfL9R<7;=2h zQl0|r#33*E!OtakhHb@05g~oaGmpHX;nIFSZi6%`#Uu(fPTxTvmX*a-~dX1m`H!qFRaci5?k;+Vmz*Sz_xM332;z0J9NSxE?6vv}UH=qdB*h&MaG z2k)yRynseL9WxCpYzR<*&uX&+*a{Ej%vZb`jf?IXbqcjh@H zf(=5DkrJO8XnDj)ZroeRTM2g;chTa>jVNB}UI8#ZQ;cpFx@8JllWWQ#T@(uD7??bb zRQbrH*fcWsc&%q`+L;#wfvUn93|y6tuF&BsJ}7ue?X2XChyYP2?46w8K&-S0YI1^3 z(+R0w(zS`x;5#7il>>!*U+<7tJB*q@kEPr-K@Obn9tXAG-HW^GOq`7|$-d?W@|iCk zhH1G#4@+M)v^Z@d%Jgl=TO(Fkcu7d}PEpjPjZ4&jMEamMJ`i8u5bZ{glD)GlJQ+!C zFB!e;OB|0B%K%i*j3)H*{+^n8U5-54b=nHm=7#S#83ogu{$aq?Iv@R`_l-2~7Gu@D zDGLD(DeVP9j3dMOpJQ`@=zN^ms+Hooe!U7c;swGG(M+TPdb{MxG$(g;W}Q|WQ9bg0 z{M)7P0t-ld&Dlk8YGrtlb!_?CHmX{zf?K-0cJ`t&vvol6u?&-b2prOCci+SWjchFo z6BI*wz|pK9v}Em_g&Z$3On@^=biS60Q$zaloj4=@1T_#-mMuV$ex1bM>U7nToFpi7 z=RkhqXBY};KPswNZkS%nX4N3kZhdgqx80lLww29BnrS*{+u@HapVyi;bkDBHb)oUW zS18}#j`9O(GHH6dmW^POlc*`WvXHp$S6h?JOue{R{gon~n$Zc_mE7lQl>^CZ6GrG8 zQC^Cw7sbWxO~v~QM;i0t)59g|6rzlyMqvRN)D~-V%Nd4ny zcn`ivwbrd!IQ^C~nEmeb&w0!VE139pP#C%`k3B$Rw9oNE=W}%i^HS9;#b|Pd9&&VH zk%)AVTessy_tFCuqmQGnWOj-v4-LGVEXOk>C`&Vo&M4FY7kyUpDU7D#0;1}HuiL{p zqF=GYCx;TT@ah=&4qlVPV4_oL5yQCYS{29EWk^Gf3Y9Uk!}(_kW`)Hlg$(l@Aqv(J zTuOlg0d-znHR&+0v1VcNgO{a)~zi~ZxWC`wQ%y;z}! zx%b0z%nzF+yq6loA*o3cFO8A8Xh}YVM`HR3{Lvg7`lemkm4cHOWAQx)vb}^g9E~l& z^sLI)wuga1x(X-a-nuy1wz)XNG^WX6fhYk{2 z6TFr%THgGhTBOD=y(@9{bRt>y3rGvrQp8#~myRGKcsV_covrnuS2tW!Tnd@yX2!LE zsxje;E*K_(Biz$QaA6sfCs_#9`5ZkBoBZ7}q>ekkE-1*sH<*SW{uLjLc~AB>1Gy7IcS8Lr*FHk$JTPD_{z7!=EIxGvf2{>2&A6tgQ@xr-RI!w zf=SG<+|pIHpP{(kB|MI;JsF+oELK$l^B)l>AwTH}6wx2$kdfv5c{Um~N_ZW!C3{qr zh3GTSUsM+l7PBu`?n;QRyi&4s46#C@)^DG3YAk0Je`uMg!JY6q9~8K|+nf9z@-26{ zcVR*^zBIht9H-q*yFbMrp z;}(L3`%{%?PfO$kP0v|Zrx*LnVhz)Z*Q%o4&?T3YJ4&!)GkR|+reJsQt!smg#L1Ir zs3NQ1yqVKP|1Tp@X}ooVXAL(e`a+2fM{l2LN|>UKOs%Ex5O6!V#bZ+m-z-CrKPSt0 zamYYlxYVss2BL zw(3n-EMwjMF#$}aziNsxu-mJIHl&3md%dmCa-Z6PtR%}wV$QF6+H9Mr$)AX7e9lYS z<=IJ1d+pkWAFs1k)+2@=VRiO@P!}f#&!dXK|4=pcu#QYHbg!D{(>mhj11e`N{L)}* znC10o?57J+4uO-_F}1*@!8F4rUXqF@1GFX`crH`K%BPTgLW3%IP+R8AtlGAh7IBBe zdMPW>7}1(lG33CDe0U|Lo?>Mo({sW2JmdEXfU%($ue3d&62%#iC6TcT)!IB_lhs2v zXBPo7v<^uJTMCWuF{>Go87Ivk=G$C zIK+6f?<_IR;nEs2SPcB;u+=YcKlU8VjpT_{sh=NFJ&F6&479O+E*kM4$SRv8YlBx*7D*gl}PjJie()04yO2VxD$lRK19 z__6MkN;T?8V%7Jx4giyUiWe%ZhEC|p&KNS3uO)L6u79%Q8M6S3iu;5Pfy#{|aPD{3_%2T&nNzrl{pGpV`hX9-;Ww6!jbjenu5#y}) zf}c-{Uljw|!Er3py+f6PHqq*-XClhAiXD=$ijSm(%7R#+dUBUUaLWwfp7lG9v*-7j=iS)Kx9t(v03Li0pEJkls|7me8#=J*J@ z(%&;G{hW6frTK<}Agws_oXE=MCQ3n-9A`M!?j*@;OI`q^NpfxLMW2l8tF)2Aj#irN zODAr6|J^(nT0A6`QnaL{k$O*a?t66#i8yUK#`n@A7v`M=a}Ju-zHuj!=h1+|B(c7J zH1id4-vSEy83bx`0U-Z}!95qSLG{8n8L=xs5s+5=7vO_JT>%P!;EKP% z6wui8Mk>02$?BGWKx#lUD(E%^K$Cjdj*9x9a|w6;RlrL{?SKdM#{eim`Az^BkgPj^ z03g}(j|k-F4q*Lf#s6yN^RE>n47^!c?!$nCdFxvHkB8p<{~bL3bMm;6w;2>X065Tp zTY3C52o&T2eo%q=H~6_oUs*gkn9YL5{? z*MAB7i+>1^f)_vqaDDeC?YYGO4S9j3vrlhQGH-x9pz`HS>iq{9l;{nXGD3r9y#dC6 zEV#d)_#k;7fHGhg`3*GrfPE{E@dgNe0WyF&?7sjHl!pb00*dkl8!#t&W43(3<`2l; zfTSNl2{1(Q2CDqPCh=(A0JcAPLy;NYfUiG56%fMw29%i~kwF*!V3U44Z;WgJc%Y2X z8^95S!~pdLfW@$)Zwyf&c=W3H8z>V4kG4z((12P30fYb&={Nc)5FiK8lz#(?K=2d9 zs=R@kzd%#{4WI>q)daQQ0HPKoDkvxjJX4R(8x#K#Y<%x8BX010Uma5x-%gFXpmzFKo;QV_&6H0Q!G|@qc^0{NMD^i2O$t?Z2D9{AWOdk|Mx!vWI~^5gq$x(J~Cc{Ex-| zZ43df=lEB6QzgBrcE&&={ZD-N#sS`e{)B-OMLP3s_3y(04F6dA-$F_V2-1I9I?et^ z74ttzEC2uH8H9tEhg|SxG$|Y$yLcsUpd$;s18@;wUn-QpF~$+#fTFE_0~3Yd?Es4@ zK(`U#6bh_;qnRSX5xCv(29o}Qz~(n_6A5;{Z2KEHtAj)XSww-2XM@xEZ!mX7fjz%A z{01na!9kZa`37R6!P8RCyn(A|aFDnxyaCM^a2&@hzk&BtkpCPjB7pdfH-y9~yfF%KVB^xKZ=f~~y!fBstp2+?ta$L^KVQEA z;luw9^T%Vze;;u^;Kcu{PkI6l#KkbMcVH9#o}}RP|4R!dfX%>w)Bi8XO8_vE|2>`m zx8e-~g8W}w*bE6sHHpT>`F9cAzjkp9Y#(Y3`X4=z-aU9)q(p!Slr#Dpa}EF?fE>UK z00Rqzo&*kYaJ7&$-~;|&U;@}7dLv_#z^;lReFLXS0CgyN3IIrz7`)7JY`{NBEdsSp z^Iud?GC&6Efc_su0b))8&o|BVHlGq101=e*m#N}3M8wM8qMue~d|Kia@Kur6BYY-v+ E9}lzlk^lez delta 25755 zcmV)FK)=6|$O?d}3b0aY4H%^DLVl-DPedL70Q{3*Y9Et%>KC(>YV`+ynC#(bM5P=J z{DH3x; zMSw8l8EOkekmLj4wT0+}>!OZ4rkIo#trE#onTM$WMAkkL4p^X4sHdh6Bq^oLFH^H> z@}gBN8O}wKMwB(odBo#?OU!#Sg3JIkW*JdgDsv1D3}{#YHRG&6Ws3}~bR{qd9Hl5` zpj{0_SDk7^#>}7{Ec2|`_z<1xyyU;q>?)-kL|UvlIC=ICjDw)Tz!|iq(gSpq4pG}} zGV~wn6s=ql{|?j7)M68j;Tn*p%$jD|!tYN@2D;c*&3!&?Z3 zYFq(QwzgXy+=ujnj;=ZzK(uo-VEeCdcYP8N-KTuD@{`aHlWY2##Iv4x!=|6iqKJ#|Y#iV=o z+qoDVP3UWUq{r-y_u&H`y|drE$)5Me&e?A}lf9ik{AXXmJe+j|llQvaXE3h2M_;fq zZaMh%`2CM>Pma4l7`(xy+kjcIT*TL%C;_#{o`YIYH!^;I%Lc3ano6#J0h_RhLEx;* z9JvZ5Fjt0t8OkhBLm3qEiNKty8A=Bgk{das#1vSFSWc(D;K`y_jWID~#T+;wDEood z<+D4)M6UGhc9qc{sWYdGj*;ULQgrEdf)K)PoFI|fkyx$Ju23qc1ap&#cAymcO)29E z11fgE^&kR&hhE((o+fCTh-)qcFl6nn-9?B4X%=6R>K7v;BOCp*a8T53|94KeQ$!LNMEH2^=xYQivw@z()SNotk z+}>ptVgOZYccfO5g>#{)h3nVZOdl+Mxg876=RVDUaNDCK6Wq5}SWzNvYP5r13!W5@ zJFYAKhSlbABz@J{IJnmHQ5d1)U^vZ3R&36$qy`kCS`JMqJ)OBDCg>Vea@4Y5DMV+m zn@O|3lBCnTmZfW#4QJS`8`gJrh=rK$R<7{lq5q!vYoV994?|ZA0r0 zDD`cB&a`2wF&1rs=jj-RP5NEg~hr_N2gVT)@Y_XThkTan4Q~z<~&M&szIBW@>S%fm@elOs>8uz0G)RwZQo=^ zP4m_}VB2%I=3$!LnoBni55GJUwJu$Ox2f#LDEdBgIRUu3e=xG!4zX?GPKK6p{%}$U zaWJuNVD)BbY}>870@6RI0K)TG9fN~Ozp+Rir!T{3ARY&-f57rQ0JXaXGck}7XU=hVOG z5ZZu*a8ikCxTV;Dekuo_@GvEqzDuAN*iq&XL>hzMmY4#-G(rxJT{ug)zV9}F+umhw z_!Y_>yAaRd;bkSC1)u;06ong( z6ts?0pNUfDT05!35Fx}E@n=4NRT)8uW>pl8Kd0+#&h0!8WpuEIxN#X@!c#Sc^4m$g zTv0U_=C(0)iXIbXe8M;pIt2tQ%GVnyZUGmtSN258!UEzd2@A$KUGg#qWagBs<8>Y1 zu-OfLWBGxM6M*0e#$!so6DOI~V^#7&#Y$>9+6%=*804z@4J8twkb7W%9xk|XkJ5RV z&s9EE(Yi`R(a%>>Q(s*w$YKL4`zm$ZQ#VF%0GFK7wNttqzU4*$Gkj*ZW6ZVmy@rE| zwgcEiVoHw6-mc>G;i1>`Fm=)3T3klCZ1k$;KyZm{;3HHa=U}h`!XU#uekOvq(;r{G zdH(*t-Rnh@Ua@A)ip2tdC?BH_E-3L?bpofWZm+A%iQQ#3Y{g+jJz#etySiw2sYjJO z+_jmwZnMh+aDi*J=f8SO+O5alp3nmA-{4g!7$RF048*{7%A`1y+$$0xmROLW~S zo9KqY)Ln43kW|8z^L2KK)faGL=s3*c`5ZVDy-`uQ*NL1~T)<3!wJ5nDjbp4fPO7Ew z&IV79Mmy){f1JbLv-9)42`HJu+l5ccNn@>9^V;A1p)*qs!;PEOm5! z?RPhnD~9iCOy%bi8IwD%CbcGz?S*WZ>kI5L011F&cglG+n`7wYiyl?pVTlEwn^KTi zfHSCmRMa}rb5SpA+K3GGc4Q8m?g&6!tD4EurYMEHu-0OKRIUk1roa~kbd?8Q?G-a< zrs-G)?N%fbm=knO5W~{KX_BD}19B_#Fu!4@Xc?R^>;SivGN=`MUZB3gO2SNt7>tsm z`jJ@Ld4VVZ$i{s{!;KEHh1C2r4^0?VDBvIn89;|PEf_c*e%BfST6K*)v7zp?7fpK} zu5A&L)V6njz7@`B3!G`c9TMxeL5eZlIv@P8_w;BRJf}d@0*fZyFM)jZ^||MF&nCbB z`Hv_6{;ju5w8P#20xOp)3=hjpJzaR+s23_%(HWA`LxwqjJw(tpnC?*JJ~~5o*^6ww&MKR> z^D@hMyiD1Qsw+{u_t|l}Ok%MDam9R4EEB$S3n9zZ%J9?cPwO{PHQbz{?W$ON`|iz2 zn3^?R$%JAD2Z_bWAmu(?B7taDN(lULGSi?N*t}3hE})U<4G6R{af2T?G8w9K49f&u>jserM=;c!Tc6dMbS{}Y!m9c`l-_~w*-Lof1xh+W_-1>hE;mR*M* zfe!(XZ#;H|Hpv2`?&A%F@2|m7=K2k_E1o0)`;m)yj>VA%dNvbT0&54&B6a0nJHDHL z_0Ef?5gw^>a$4$}{?0oz1`AV^R264>pr$}sc{;hHitgW%C+TM!Syf`d^6GbUaZ?*e z-DYqsKv_e02wGKj^i-9R#YP(5SU;GG|CWlWuEXFhpsVUhN6s`#v^C_-P@bS8N*7|0 zsCI_Gz+ydoG#oaz9t;oF2VRta(_A(f(D0uA`G9_PvH8)k$8_7Hp^mGPYLQ3V zmvErBf)P!!!(^O?L)Avt;RT=me0uusWU3PJIg-iVZELmGVb>8wQWT!RnlYWv&++6h zvCv-Nt8cN8anvy6ZEqt7gv`$xm$t2#7pg^d2T3WyYt*yQ8l0TGexVwC{Q2&G{oB*G zFW$bMLi^?6!)|>RM(tCeMF?7U3Mj{mn<++V!jh-P96b(09Lyr)IxmjjpHAPreRI4u z9yA*u=@3DhO`{c$E~XJMYP=xB_@%ij;5VziKmLyouihX3)KDRJAg$iXSbt+J2h~0t zU*oIoGRxH^_OXc-D^o)qV9RxXumwE9)f`OZ+)~7_7NA4qY>Wz_rwaXo?pR!WGcf_)8%Gk%{ybn*>t;;;4rYb2|oA1iaucwhN43X z&Mp1l4HRia!O?=63z-{<`_1y@0I7gB4Pw8Xa)X#Fu!vG+==*&Tm01R$7fHBOrD|!E z6d*TPb%fMFD~QJheqdmKy(d|0II^G3jjEKQTUC1i{@se^bRknQ2e>pdx6ho0wxZSH z(5rD+_LN^*d{*X3tczhX4AXLvZ8wk=7I(gc)NN%fQ-TQ0qBGxxjiydZ?N8ZNiuV#* zh1LvUN_xw!*@cExUTCderIf22tHx$G3|&qG0+hQdJQOON=Qj|4#B<~|0tE_X5ig5e zU5=aAl8}$oTO9#U0yh>3IgyYqX#vjc%HEn{qJ+N-CzNQcT}%ilrg| zDHZbjRBf%yvjW2t9~?S$Q1tR|jg7j2Q*NtR*g2YZ4&KJ3=CM5H6Y%NrD7GFm4xq#O z(g_p!?{ma+@{hjEOJuL6t8IcK?#=%G0@lLL5N3e?$vMBOA1LSyyj8cZMtYBSC; zW~8Y>JB3?~O4~BlK=zW9&^_7eY6ZxI>=IW&X)CK)G<7lIsNm{iNo8frMb#T5&_fVz zVVW1}lK3>s{ssiho3CiW%KC3dhA z0+jymo!`uVzWhkw?o)$A?9D!AXJ=<;=XEyLDI2xk}fGJ^-xxH@GHvG8V6+v&ol7^N3=YV-!&oW zp8dYdaycio)-km09T#*APjb0U)j(o#!JI#i2q7+i?Q2NbwzdLXlcsAU*q0`gGXv^J zy_Dx7MV$O@CDnDptg2y`R~0adQ9%=2rS)XBd41F7iA zR@t?GB9w}4y}(Eb)+32QgzF}^#U$lq1#1U?V*H0Bo$*-hoF_4gKX{dxTMC|%O>5}e?VJ~p!)N@BBcr7XIn|1|%?-Lh zZS_zGy;XfJsF!PIv_yPx!tudR&gRoI>vlrsG;X86vlg2OI_I`r*VhJobha_{dDEg# zIczL}vW0o>YG0=uyFM55k*h!Fw2BVm@UsSq zf1`g8w%D(L#H_)jh>s!1ynPq&DDZNlI~NJov<(M-={KDX7+&$?Z*#EGLujTIo1Jb- zn0uJFVTUUN6^r<8YC(>-m{F|$yOEK!d#TrdJNA0#XoH7T zKVLh~=TUDK^-_LL_j_fU`mTsUu%! zOO4F~O>&M0v*w{Q8atJL;hzcO-i+qa6p`wqHQjNY(Y2+EZdkKPo?XGHz`H>k44^_^ z`Z{oduc=ys87+|~aRBLmA!b>e4P{IJ(C>3<9k(o|vKN9n<`YiL^-=V95oWW};HoJBaS)<`y^gKJ-)8@4#OsJ-zLg}_;i_vRc`DglK$v-46lrqb zzu1i~FEA4t@cwa?WnUj>!~n;S_gPZ*gQ|aM+_X@?x%4rY2F9I#!|n@Wmo$nGvxHm5 z_5BtyxL7nZbYy#57y}{hGBHz zwF)-&QRWaXqkn+Qeo(81a=%{_;-oj4f79Vr^$~IEVYAn09?h{)<~pq$dB~iV&<*i! zGULGDLw7*wf(B%NEHnmH{rgyoHZ(f}@1>1NW80_c4cPqV&VK%>KC@k_UD>)MHF0c` zAuRmk!eD3TAGFx#zW#05)Py8=r3aT?Jc~VT2`Ad>b1g-~T6s?;AK;}O$o6s%Fcpl= z@xv3&ZA7dHmhkIrv4W~^u__pXYJ=vHJ%hB}El)et;}W}n2HgY#wr5Dhc&!~OtHuUT zSWFjf7)EY}rEyoCWR8yw)zinN;X+(mkCl0%Z5{2zp7Wlut4 z+cn@w?mFObfIl$pyCRF7gmpehgNlhZ_KAe5EiZIJ4f%M~Yo$~w_!V&BH!<~3Rcf1G znb?~82;!%IL+C)j@M;vHv->16yr@N3R#8Tq%85jv)-Dz3JNp#Mh5HbFJEW=GTdg9& zS|9v1?BdGwpoBF;g$z!E=ESkjczU2kSYMdNUD}Z>>Zf4a8^(y@Kynv!b1}Y$@K`Jt zn?$Q3m@pk>qTx!XfhbC)O)zbld!63QM@eUjQC-hG+Hm@n;hTn}n#)v3k{{;|qhZHn z9I>M84VN7zLoQ0wpbTiUy_tXNMvoQOWYwJQeXA7A*|dLP@mr z1X-$*ksJa*DP|%+70P(OpAlu_>A{DbopRx=9rIFE!XzT+7?@ehEi6YyWvY6I7KcdG ze_T`yk2nJuGFpUZ>d3D)x3mnJASYPF63n*S4wFF~qg>UPvbP;31D)*FJ5+Ik5>sK` z+@3-UJ-HDvS0ryOL|N|ep6)KENJHirwX35&$K-e*ifl?tW$GQC>Y*plqIU(;EEc$f z_2un!Z3(jQ*q>v~$Tg`x1$(3OHgv_oWUE)xp9 z(^jQ`2L%@kTS&5DkkC3-_?3qpb6;|KmBX!Qr3&9~grD$XPk0vY%YHst5UB{my6LcI zz{73k)EJoLGt!ICL}&00V30R}rWE9^nz1+*5$40DC8v%gYaOc^Ef#oEf3eFoX%=}R zUGWCSDAdC*>+!>9)j$FGqZhXpki-?1$t{dMp;06>6tYGX^rdVqu*u*CR~eJiyX?km zptgSV6n*)M&;6ILNFV5teexdI0~b47@yP;`1a)9f!t1^cO6M^oj~*8ICrd*L=?^vj zn6U!#2m}ATY%v++5liaxf8Fyl39fQrWqEd$gDT63WeWHH(*heUH~8=#omBlxyuYJY z)!za7^1k-OeeFxO#(1KwFuv?pj`1jfe?MCiHseETpayim(*fCbumcM3fB5Un_C!Of z-c`^SmbPiDK4@zW{b#|Ujf_7ikP}h1V&;GAE?A>#+f}-`F1mBSf5%CG=6_}j2*+sj zHeIdWu2$19oQJ`;;Kfa{w?)T|pbP~P8k0{g7YG@ox!SS38edFc`U3tsqez@@0=ujZ z!ery~oB8=g0RIJWeDK@1;2gV`^U>>I;R!3D)Wu^oT#QCBPXg$E-uTh>i$-Z!=}))R z+1VKsdsD;xvcTR=f1r}UzR&jIml3y+H(Z~BsxIwep`zg|6F0>s1DB2=yJH1?aKQ|O z@UOrCod^vxqTgy!W@}>QWCh3Sg*Ig$W3iS?$i`o2naV zR%`-8ymhCz*9QOqN*9-b`T-l05Sa{nomhKs+qM?}-=Bg=S5Rsdx$PY=%xIeh ziwAhfnxgS~FW?vgZBaH;Jv@?%V{H5G_Z*UX+v!$eYb5HN-+4b|k?jhpiR2?;@9tHR zSND%u8geZ;52q>5c&_JgKN=;n$Vj*@vaHC7Bc0_*F@4mMt#u(CMObQ)s*1uJ5x8o9 znyHk949r;~@;G|jF};nL*6y&(MIv|{DJ^5Bc`))vqjk!ZB9~J0`NM4Lb!7Sz!*+Id zX8z8%TynzTf4wh=DoVNLiWCWX5HT-^$l;ylp?;Xy6BW8=!t&T4?DzZXY`iIfCLnst z3AX|Tn7)$*fP#UF#3D&RV6I70NW$5FdP|C&hm|T$1~Bggs07k~ATc|r05l_ePSz}^ zny@$~nk%isjw#Xfx7qFO?B+xC`=@L2j!5cVOtxC@CgZVx0czfL^&EQ_AK#`d-@H%c zUorRLc>@0_p2uar;rU-Y6H0*r$_IWV7V-P=#f5JebCz-QH?b@)7gyPDqI z9@U`hzk&4d#d%9cxYb$eFt2Byr!^wv0DnARygL7J`SQ+CeMd)zZZ?fRT>dr%s**Y( z?#)joAu_JFg^gLv6QW9?*(&AUItBlhGIg1Om*l#X5c>S!NgifQueWfs;g6Qk1kXHU zh!7y`I6olfsPTpGTScCc`OVdT4Q9Hn6LKvcIJt$=VVNU1RuWJ`ko6IWPQ@zPF{!wt zMnhbtA(Tb(6i<`3NzaT?#{Utz99<;SQ0-EoJvyfT;{5w%i&8+r01d)~8_9Rkp09Rn z!@U-bsXdtny(3ALT)#W>AckWj5NhE|bg$s~F1%Mh?K8aUA1r#$czLgX142O>1*_;R ze_*MI3HWtFo-0b88&i91ZF}19Fdd_9q4dxRZ`wRLxD`DPWYnebb7iG@HAZkOG+~+l zQ5Kqe=*Dov0UcHMeg7L=T&Xeiv!^1=a_D!M6!k{7zlY1f63 zq#f!$w!wOXSSdSjX|m)bmLd5n+JEYVdr~tX`Gy>{!Li9z(&uXI@~W3G0cj45m#Q{` zRUbj6r;*cUQ1N(W#p)hgX4Swz3O4P%p6SFaU#d{fEokH z7+;^?!vxP++5xfdhK|uyUBo@bUDvmMa-NMU86Fm44HXz)xNw|yb~6F~t*gJT?LP~~ zQJahv)}SM%fNo%ahT=@tc2pC%ae#kXb;*R{y#>xIDXwEA#d)X9lu~BvLWl#`FpYOO z>UfN+j+BQ%P8mgpqpsssOKDARRmvcgb+rrv+E@Zxl{3MP@o z7A&s2dPi2HFfP%q4_HRrXCmwR$SfG1G`mdnutPdKSp749XiE+m+7yBi(=bL|;P#9e zs#M8t`+#0KDgn7=*paFg3xfsY3PKe%8?HCB%*jUf5CN4}tJDzLUR>#ke-_k0{R*@n zZ7*MrI+#%`);PNV#DbW#5f&7xjV^;uHq;l@LZ^JdF`u30h`Cxzu|op~d{@)ceC5vg z8NWt=ulId_;`MMY>9Sfu2&^Elmi|ctwq>@;nMnJ}z~{wAvTT+?R8MOK(E>)Aq!082 z$={8qp&vsVQ{d;Wy0@P|UD&=#uDm9UrpQd&GYf~8_>*2qezILi%aUVz(OagS3~VE? zLu2zt-V&>*NX#?jX166KuIIrj-4*V0z?= zS8h`9;nnzxse!MW;3Xo}Tzak81l8NN!2g2FWz6jeuDDkR@<$1KwmuvIR;E>Z?jRsv z_~BiD%Cc3=NHPIMwFf3|x!7zqSlgEMQLMihIV;#)Pe`a5f`eb2zizw?(QFYdXvSl~ z=7$}46(d|yTu*yJuKUKq>{ZJe+F{svWO~gBHmriktYFAYv)%U-T(UbT2D%2|sp?Pk zuV`WU`=6jS*O7T<$N0Alv+k#Ody+|>M2|3kgWPfoA4t&cQ?};tiDbFPFns7Z2CaC? zH_+1RbN>WN>#0GrANT+jJP5uIn6mx;e_0v=?GWqqAZx+5T>w?X-<6$-mT}FX39}=b z#>E;W9Q`3HM3+I10750J;a?YdA~sPDb!`f+^9z;NLI+F3v2_(%ZC15v_3D8&o@=3h zhX^QE3ksO6JZo4^JE#l$6(3pRQZh65S}R5U(Si*i6-r}^LxTnO7)jrv%C4YcPr3N` z);*ZtbI#u536Pklw`07cK}&tVH&39Ycv)|dI6&NbtCiOs_0~n`5;ZM;zsE<~zALad zy>Zbm+ZO5TZqM93*~&WZa{aP7vn>;5jr4~cm46#@AA4YBvR(BmuKLC-I8QE;_BT7v z2Eg2RA`nzdQUhM^98cpWLMlD4Xn%*$Iw8XsrTA(yfDaW)Fna`=9xH z?0sv!s_&1`q4y_Etd3ATxoQ19`aiR2qQD^zG`IOev{`}NBLn~dUkj5V_ZyeTf&vi> z2>=5`k?~PPk?~QJZp0lJFAn{(BwdW9Mv=H!hO8LYWb5E~0xg|vlcU5cf02+uZm#h; z2vV&w!eW(WDkrt*WuB_ZgV8)TO4kysGD4Osi7+6zP^;i3s`phBSisL!ru5|`Y}xFLoO1NX`>V@~=;rq;az-@$I~m^XeS`*EaN6#IvLh*%8Re1 zMd}sM{f{b#Q7dxIMG4Qy99Hx)zvEIQ1kpz1O-ad{Hl`y)gaT&{n=Q1eijdY!q@AF# zj>T#*&Mt~Fqcupo7PKm);t6P!u>S6R8ztPpmcUbE)}=&)f9>g2DzUWT%48D>PLCTc z(Zg38AX93=rBX%R3X~kI-EYbQhJVg1mM=)6?sMntJ zf~YJNd4eqwe^TbNNjua2tflg(DpSqjGO5+p5Kh-Bt|TsKr=^KxZ!06~b7gig-!2WN z(z!1e@*6v^tfUEB2+SaVx`h7a51-q^)J0|YX6 zo^v5zhG|5017$oHDU|LKdQMfz9onSgl`hR75j@I$ zzwu{n`lX(YdCBnA9NbJykFwr?^`D&Pb`M*q`i59TGj7nQ`P6-M%(kb5m*2~}y>0%R zfrOU?X!M>$tn;=-LOUr6jgG$dnHX+$;G z!kLZ^hckP*Nge|xC@wR^?^4=n4!dsu%pj)78Km|zZ2hhtf>SFq3;qRAO9KQH00008 z0Hj{^LX)t_ItYZX>rsTS>ru1v$b!DNsfz)d1P+U&+d`h~F@^RA002N2m#{4X8<%a6 z0S}jGp#c|vjTl)|+erG|zoLuTMABg70|?;4ab-6S!(<>+jxp2%qiRWQs~26{YGJ&o z{P+F3Th?tDJwPAdeYa^4M~owzhB$F3?a*wG6Y}9`yYq13`PANS8R>MEEDDh6L_rXR zC_BFlm(lcvGwkq)We{e{sh?~i^bUd#uwu-uh`HT=@;+rgFtK9H64LF+o1EH|v50j$ zMh8B}$4P>&HVf*K=yIx8*cu~=xVN__j#+>?1p)JG1ZODNJPTCQB__ZrPS)bnAD5r4 zo7o>|jF_fRMjq$!sMj+luwJj%52i865FY@ux5nJ@dis6;;OueVfW=>v9xTjXHA(Ms zYF&SSx|#y9RLjuRg*BgkpTqGFxf5Tif#%u>{%0(Kn_0-1aXK9i&xR*QJv&Epwbet+19 ziwY72V_GhCIG`4i%ey^Jxli_hIUYg$Eo$HPo$AZ)RJL+U}BK!UWs$#i;o+$Hl?#LZUbO|C=*R>-zL z25FdHvW*bVKz~UDJyU%@Ba?A_EWE)8Pgy8PbxJOWL{i>PN?yr8vx;d-7{m0)i%VAo zTxpmjbRgn&qeO}k>{~?DC`A$~LWyV)+5Zt`iI{@En>h6#`9v&~+4& zs_hx338~dpUF7#O_Nj}2+6cW%G%$grnd7Q-1BkICZmw9A#`>THaq(3+uEfmNZtvpo zYC4$y`@*}PU3l?){`>V+e{i=5yl=DVP5;(+udf&JZ*cw%KgC?DV9##{U#@PB`C|Uh z>skLezI~cu+&{jX-FerGFTY2Bw~N`r9mM?morf3G#bFIQj1&7)|Lc4)d$Ml^{QG=% z?f$QSRzQ_x{{>wTu5?6eV#jzz^1Ey=+LH+K*J`vf+}2ce3V^K~=SJ($kFaZH7kY_B zH%BjtSNK06m_Yz&Nt7~&poBT&2TeEkC&s<`2tCMz7WANL-7U}7s0br}-Vzy7Hbz9B z-o_%dPQ4JP46II-Nh}$cwI>ONfu4$T=u--c#FB zC#sngB43j*n$gA&)X2G283}6%tNlak7P<&(fI`9q6t7dv68ru~Ll%v?&=t#ksoRt| zYw}g=wSmPVGzbG&;iH{@5Ej%`(dc(UDYJ}f#%}=xjjM9OK^5%hV>wee+aRc6FM+5eTi91$;!(qVcYVx z#w>(66hZ|*N7RLXB?4MVk=Ck}tg4CL%#Zeh?`}dIP^Sm>%tW?S_5eLI_F}C`Xwp#d z^ZU!s<9Eq>%ZbvE`!t|@eDoft5bJ3;-jJk9#V9wIQbvLdA}ZvhRgQL1BJl36Q_{TD zb<8C8Da6QFGwuhE4RV$(!Zdp=Lb$F`hu_x-^D<##5!jMQp04}@!uM^elx6(JNYBgKRyk4svm1=0zOWO7|JCxBZ z^D`&hELLxSXDC!zM_6z+zxs2IOw+8nt1fxI7NmUafR`B$Vge}&rjTnc)+Hln6>x`` zxgP-t$~@pJ$fN?*^at3_6K)XoLAe5{sq78kl>F1)^~ATM^QDc>C#H(squJkgbMbV1 z3wUTW;#d6Uuw&4A#Ux_fQX{wg&BACW`kGV);4W`}i#w3PO}|fvVcyC~JR;Ojl8DL-YJZqKbEYbrflK`z9mpZHmp(SZGwO zgGB!phRRtL*VC`={^Y~p^u{qmsalTk7831=(NhNE-xZ@XH7 zHUxZs>s_&T?hW+G2+3a#$J)w|Z0!H$YR2TF49oMLH~6?$9eQ7TVYI&m%I|=>_3JN! z@@t?D+jtjf+_9SQyMRj%h~jHL66(*0op7axM4frdlcM~bC_X6jm0uwxqzGC|M0Odz z8uK-bB9coe#bGOSIXwWYdDtQq40Ba`m!q!+fEVwg{{y#OnE|i^mjsjo61P5~0hnO7 z`~(6|LJn4J0z(ljLBtI%006?jm#{4X8l5=%+ zH8yQ4BR{SsduFbr!2y9L2@3>ZJoK2cw^?VCU9!tIi~NTClkBp~Pe@gF184vZit;%3 z&bd4~BH5^}s;>U3y86W}V)?e?EhZ$1=i8%u_ncMWhcWpO`Cj_jqj6}ZUqYIGihS#W z#_2aFreW;+ZglT|-aPbIM7R9a%J+zPeCW;n>2(~MR_upua!k$8S{4dLH9d(PH%hBD z?-6(btH6wnWgG{FOn|9CNwHah+^Qu z3tVb?pvlVR1PdA))TJxX$(Y?3j?Ig+R!wvHiAN*L4Csr0lb1(ni8FVojqGhR7TWls zO+#uQQ&6FG@1EtFQAB?7lQ@~t@63o6jMglCYfTu3Mx*g2^e-Kok{MJW^Te}a$M+&K z_rsJGp=qrM=vh7E==Jl%SH`=yM`Vv^Xzgh7__1kOe&WTEzVQ8pOR--cAJg#CvFMS% za6C=aJ$UthTvQFSx>r|M`VE)I>g_MxJ?cFOXc##Wbf~-6eXwx%-W_K}3oP=3*nnDw zXeGMg4=LSZ_$jXI~V;X`tB`zO3XN>s~{$^Pa+xNOJ$P!oeUXVh9NmudhTBYjYoD^L%*D!oB}%imcwJ?rdNRzD7Ja%P!oazk5% z$7(5m@YN5XA>w-r7?`$HlU`dCOwv^NxDM)YXH$d={l&@2n<=Xde$W=7OJ@~Z#Eh_K z73v$df91Kp2@aVy<;n~_Fff=p@ywY^%iS{}_alwmmjXulS_XnsGTs(>q zK8Oq}0bhIp##0#x?^nJ@i}nEm0fhqAi$tth%z29O5UlsA;6di4>9}alHVift{D?)W zBtj_Pk90IBlXf^YULCxgwgCtMwPI@Tp}E!=_e=4e2EsJ}=Qa+Y&uf|1z*)B`47#*` zsj(qf`@O?^PGf5+dMo%Mh-Xh0rh5(6LO5k*cC;)PtxS{%0}0h5mMDM)F~SFqOPitg z2geJNSbwyS@Z4)WKREia0pBi7H-WEB_}FS_ZLIzD^~u4}QL8O=R!hb>6C_(kD9Fn7 zMd&9%v)lSYy`W)VOD%4rl2(#q!$1swj+7N}w&>E>I}udJ6aYi2^!*(Kc8e2(jEva?!#P>YPY{}}>6H@!B4`%TquB1p%ROGgY zOzYVJcHklWS3L}(_+_+Ul{?DX;p%t^QG!vZdoQBaiGNWqAAxbm863k$z^Rffc2@K_ zUIl9y@uc%sgCu}91}Ckre7@v=4;efqg3ppafkh#iWVzS7lV{r_@^D7Mo#;aXF`0T8 zyrAm1-M%l#Bw)OM`6*}Tws{cLb(lgn~Z zi;a#K?Mtv_+1GWLhpnQf6pc9n%rDH!IK}2bdZu$T=hez&nvvx=(iruBg#&3@(qq%C zk)=MxVTCgRzf0UW`fB4YzMQ!n*0tuo)A|Ei;`HY~o(n6at!4KZCaQp zd48-&ma>*@IO4i2oKIl(X6I=bba@)wN~-g2QKXc=&wL_n-PcW&VKkdN-~@`f4HTtL zRvibmbgBqJfqj3h2pXDy82^M2Myfp#U#jGvztCI66t{hgo2Kn)ZRkiyFEnRa|8JR! z{SI>1ni<8r3}B+IWRqM~4JK%-3(1TVJErUWQUO#p`N;vVo+WYaay<+Xyl!DO-rBsL z2#aega7x)F$}35S(`Mb8l3)#Ut*6uDCji|<1JVo<^hbbHxeR ztEnz#kM<`l>D-5`v$bDKR(x#{tkaBIP>D2sh8feXhC^8j%N5S_8GZZ-zMWk?I@4SG zB7uN{ZO^w@I@sDjV=3>adT#K-T4(yo`~XgIW1Z<9jUTse(HW-PGZl4wIG5s1w8p zv^8nE&IKip_b>OZ;kCv&ByG<2Kb>uTvwxd;N!q)t;Soej*ID7xKiNkOm}$1Y*+?P) z`N3u|-U8&_5NI5T$!)+*pSCsHi<9~M!NyI#+*?nxhQ(ccFMEMyM6e=%+kYhT3>y{3 z(c|^^YLQq% z1E6GTK)US3gf#l*8km}wIV6S^DjAK2=- z@4Eh#TJk?+8zQf!Kc3)!AZNUtvVD!yv;7C>+1^6)^ydd)iFDiG2-g;D3%7Js z2Ke@zhQ>UkR5A@WiZIZQWT1g$pnlmvcQnn{G?T()sj&vKvHF>@xaBrvDa^;5#{ei& zFJgOp^5h1aI{||%0*NhJ0t#2bpinqc6oQ4Tg?&}^zN-3wNx!1ARiSjCEZtF-4y96Q zEv0YssF4q`Xu7I@2BW^JaG)yOQ5gk#MWGe;oU*v5D3-M5D)STwmyA~ZWRzDQs~Rv? zHDIi2z*yCQ@le&OzDg3pxlsC92AJ)vlmKHwdxOsPpy2Hqle@paUzDpVWN7LR2G`x) zVHJ@5Vdr`{=u|JUzIN?QQ&cchztc4eG-f3wCyk+GDdUtz45xsreaAI@8$Jous zt@Cv1i`$HB>RUJ)V4O^kPmYmira^H{kM7Nc;B%!ElY*ZxoZO^3;=-YDpnFZg|K|7K)#-Pn3M|I5pR z{<}5Ekf`*zds(4`$sjl93AX$FAN2ie(fH=pXuR9HGm@&k)Y0Xgz7DRx{Fw~cl31RU3O z$d6BcY?0H~&z>DVIXpNb?+>3&U!QLTk(IqOnRP}x)_Bwz%y-P$a6BJCFPh_F-|X2I zo%PG%wbr%wMCRQzKS#V}DmaaJ=Ly5%es^Cob#6 zS*d_99P|d`-QkE*t3R^_z1?B2KOA<3fChlWu3D!85I!)q;!G>F*+!sHR=hJnG`M1rp~<>mQ+B_`dX!5G z9W!3K&~w}5CB^?ozGvgcIK&C^+Pzr?5SE_f%D4KMLf)Z_U&@7?yzTT59TNY}E;&dR zU~zJ`#2o6)k6H|p%J<$ns0Si|^p*}{AwwZ^>Bg%f0(OhAL%RJHuX z$Mbu9!u%(;-?O6e(&y*;aAzw@AS<4^v}w6f8`u8JM^7#4TvAMzaBIheftBwpMdCzk z&VeOSF=khX)54ilpbT%|_?+Ue+#Q*M%zsz!M>^jNZ>~}B_O@oms%@=-KCfu1(-Eio0P|RFwKw zu)Mu%#nyb$(M0X_NKL%*GJB=l)<9FJOjAHYc)eZOXN(`%mj&HSe979icz+AyRZt8E zMb!>H8xODZ{o~AG*gXwgTE)`0CokWy)Yi9rcfG=lG~;5^n4Kyw+?ued72X7KK8+F< zjEZ`l;FyHcsmJKSXn;3|y0{|*-EWdBKV;!1V}zQ?!=?)=MJ=+oN5(zX@eUH5_IA$6 zBY5vm(oY@!)*DU+J^pcb%zxhp{Ym<9+~x11&Sca-&sbBpD7CY()Lt%CD6qRLq;@Ci z$B~e}JDQBTwNgi;8mWVkVAGupcPHCv6NKpDa5C)Wr9!V^cQP1drNdOG-AOm6?en*8 zchb+w1k-M>Ud`P)H77m6aWoXn1{2VymeH_=(WpO3o6#GlT{#&HD}Rj~>`eN3X#7N<4zqCCZhuEfO~4|RQ28@{WuzAU6l!5BXdx17pb|u zthG|R`dPE2E*;j3>eq;xbW_zu`?{cd`f*K{*12mx??)NJ-OMh7yvO>Y5&f~;+(Fj6 z1-qxn?)N4Vhe5rD-G3SlcXADPB&p(EoMl*)-PXrp1Qe0(PHB+tlJ4#fX{4lU=uQ$+!)2V)a3pJjY$+|vvnI1Z%?pVICQV>lF zelYB_DJN)b85vD3HAtzzEeJL8!5MZmWt5Q+${iizn>D(j)J%#OcwcXU%Sn)udz%yP z)u18VGCw5xg2a|W$>N>@g=7F)r^R!Jr;NFtX={`prY2FtGt23bUP7%`E*lWuDA3b- zA}2lg$ITlnZ8!PX@<+d`7LUA?GKY3`a5gEfvQsYy+C_No$7hNGH_gR8@sJiyy zM7_K7LJ#dOk9G5XzMupGmKFH%>6)ptd>msO*=qgi%x{m*DxLf9x5WduJ%tQ~z)G4q zI-|;i)L~amQxsjlT2!b{6=O!fcBSrj>}r>tP<}|SE#4OX+377=UVkg4g`3SNzv!(g zLSCI6g*WBS`Ne8}wk|^{2iLRd&DlW}x62>bu)?fp_Xgo}n%InJ}1+P?FZ9guPEhxK=n*OJWX2h@s z!vo%DGSPNKuMoQ2?FSaClTaXdPiRHj%Q2TXs&r@N11YEh{jD?#8XuJGFRfo2>X1$< znv*XwFb{A%8!VI)H2TKav520!{>+-Xox=3onKEDlZX9tSvi7<`qe?lJmIo}{-fh(; zd$!2GB=rE7NeeI9PjZKMW4#X2+?B?T$U|e~YMzjva9Rp(Nq_8;9E&Iluu#r1?6g!n zdf~(v7+@1S(UQq9XK_FF(VyN}f1#&4%3HduQIKkBW3TpZ;9s2g zCwD#3IAsrxkxd$pFPD}G&wd|Keug8>vPL#4i7|Roi(;lk>h;$*FTdW% zKjSV`a#3P2CLSh4Mjz!D(=v1xWYjQv3y1M}oqjSFdhuJkk|cf*V`vggM|_DnLq;#& z@k#qU+pV%lZ<9d=>xIo%tTw1%swav{TETIb5SE{clkS&ZY|~3GdTsUbs0g2*Z8?S+ zp}R_c@!HDV%8UC%`|?A*{FHxQo}*I1OTrI7OZ3KLVLflvqc*^9aEG#@8@|;|xX0b? z?VBAEa}sPR+wz8FOv_e+D<6L3F^&XDcG3>f*W6SS!ms$nG?Zj0tow5@utw&W=~%%x zyS^+^b>-RW+8oR`< zVj<>)VWwWCoQK-+Td*sf{G?iGst>MsMm;27BFWMAd z>9JpLlAOp`pYJdawa)&T;m_9Ps$GSe?ykOmrFN#7-3c*`m6un&PHx}TLFRDuqT57U zd{>MuERnbghvaO0m_@|QgA`P~ z1lhXeLYg8udkekk`VKhFh%=d8Z$EtfeBn`#%q-X60o}b(@di`AbT0vkwV3f?t5pe6 z?hYb#hIbI6C>xj+cjOJXSNE2C7?e`Xl>Tb;3zBG&j(*iF&Qx-#cpRyHUZC?{4l{?4 zpBT*exhxHf^sB$mdg@>k?NR!7rzDEq1vIj3!x4O{+VQQJMmZznzV^g|%?_(Ur4|;g!5}la9fOuzF@BsjzO>f z{+l4@pMaoZlGgswC@E7<;6+dmPY>fxEKJiJ8b`G%^hjG5i`N2nTgM4)tO22_4w4vQ z-_QA6`Bp6oJ4~rgn+-9FOfGDU^Cw>}u7CuC8+n62h`Fy8e!0uJmvv@9d|Uk<{&Pm! zJvGS;yAu@|7#B@oS}-E_)O-iI`EeTyQ#4_@_l%wCgYee2unZ`=iKXTbgok~;)`R=G zIi1U}fU4j-F4w!Qkax^c@k9>1&k*9*WwVbTNig%&n3~O)%+`=LqIE3u{MmZMLh!gw zYm_C=Ybk#_THlHwdN|MI$Qbv(8(|Qzx_s}KtQ3P84Xz9SDq-<%!zuQwX3d^DS06LE z9AlvFy(nubjl=kKw~zP~u6jj@7sb(wa`5~^{qj+y0$TS(r@zb*_b&Z5bpGyz%+;OfbLDSfG(r-_k7 zv!M9&vJ9L=yreu%(CeN&zGYlH6O~OQt6O@Ot>CxqaL?7Jmbm-=Wc&5cQ0bi3u3$C= z@KC7fL_q2O-r-Xb=aNPJbBJ)#X?;Qz1(NT#As!k(?XqVQtIw?R1C_t+|TxqXuUJa%=a0G7K_jCjiKHM=p~3%edtJ%)v7q$EA>fLDR0Q?%; zX}>2^8BunZRWra2vUfy>r5-n{MK z8`%>E3)8hJ(a(MN(OTA^>L^KfN~o05o0ue(6#T>XsyT&tt4!@oi*?QB_KG)-_E*hA zjl8AQzT}rlkCJ_?Z|##6sc};Aa%0@HF#&CQ<0S+6y%v>he_VdmjqpzS+1NLN(e+mD z-(vTNzW?Sm3LkowILvXh?drpso7T>co?!It7#w2~u+2l66Sl>#3H*T;dGWN~TUQAThwfRxKRG-R$p^)#vS(&gXZvOU8% z@8=W~QJxvbvK$ZSN(s@V*w>Kkji9K(vw$Y|wvV4$-FON)C!|l^&>o?k#S>s8s)>Q+ zGj+aP&>O_#3-YOSoZ!;;48NG(GHU#KuCE(l+0$>WvC+RDb2EIr9WF#eHaEy@Mc%fn zJ%7f;q39o~jnCVcb*GC}q1`w?i4e-36j?hKU4YSrlhG3>LXl=VnMQoFR&MJSSj%A<%tTQm z>~kUmqqXoZ;kn4Ow_fGbr9FLE?USpoAKqEEe2$OX!=Uw$gHatrWbpL9xjsCI&ms0%^V~)UKhTsm_MmCSnMqN8fCDCEe|<_!nXG76v! zF^)0W24;MwT3n6J@?RW~D)uN=z)VQVEROwe6WG;3U`*e+6K$lU170YB;b#}!e%Xpu zBelU{Ij*`w`jSo)?mm?*ZjpsT(pra7Y7&Dfc`m~NLLUfRd5nGDD6X<5^jni|62EE5^4j6Rkl# zgx>z>F~J9TgQpj#*RDNv9`_IPT@R7=1J?FDw&SzHYNaX%p-1&_ zP9y#YLpmdgcXG{{k36wA?wQW-eF}qoaNpie(iHTGi6XY^#8CP+(1Q<}#>}`$wN2Ed z30W1=MF!~#BNNDwOM0%Pp%L>sGIw5?CK87Sk1cIIY3cS#nFV74v_)|e0Y7*dNf4iu z2bJN${Y+@f$bo~;>+3jD7ge`#b9C@B+VT-MYC;fnq_MJu3u8PSb$8fjs}(CvNa{=r3rC%v|ACPCgN6dQ9rNb zJ=D2Po{rbGe(@5_fOl9|-TljHU2*r#nChDsMowl9sC#!rricf^OJg287hj}O675jl zBCeX}7*{VZFxqajzNxj+Iw|UY)I?&bVDr%Lgc>()%a_X%^`D-J=&rPOpXe>0)k(Gf zPDTYQq2v{OAt8gZzi-=FVT{fjsW8~M&w`T?3u5OCs_Iz)NB&`Tn@n%B`gZKj!u*8H zu|z~$l^bi4G3jk9zuQI(SN2nsNd~h4&n%W_#^2FMeA4AewsKo1`5xkuU8%?g!8RrNNU&4{=lBbFUfZzjsx%mJXHDohciM4)YG^>yaC38lb8}XxEHbg@ z1W9(z=?7+Dq8z2Yjg?DfcY`dHf#v8|ZgzFXqowvu9gY@3TAGh9S?8PuMrz4ax0Ch> z1Dl6js~J69I?>+~@8J9({0&b$?BgvHMy@|2LFG8&iN_Y>v-6VEILHH|nXMsi)5CC` z-#q(dkZF3rf!%VK)L2tJ*gI6`aTb31@QF;%4lQ*H`~o-iEj8=SO&GCJlX`v2*r$qY z|2f1l?ZDU945g$77%_ek?L{Aq@JAcdq;9+;nJkcByH{T;im_puZiRpI>Ko0dznOj9 z|Agx=aC3inyWcjMlJmo~>4xEVc5qGA0`ITsa%6|5jykhgYTqVVnMS7me3=wkzd$L9 z3c4hOTX5nb&aZaMv(PJjhW=MQ4UE+tw%@B5Dmxo&PlLH7Sv}Tex5iETXTQpX7tCm2 z-tag2rd#@_v!FYrw{h(@c#sV`^hvEFWGnwz6M2n z+Y1Prr<7sDl6DjND&!YHo^;zGV0?oi@6cWe#^;YB?-fq7lmeOwsYv>;nb?Rvm&VGZ zOioI8aFg>D-Dv8{m>fD-@5*6?%P;vYxu+P#Uy@PM_{}j@*17t{m*p5V2RZGCAc2vG zhlfD2j)k*}55L)it!kE}+Qc^zO51u~NAM9B5~qz$!BxGsz;lv#gAj3o5}71ZiM>0gs0Q(N&9yM zrV7h9YQ@&kwliEbR|}l@i-I2lO4wU2FTM1HD9Ty=ppt_k z5;plHz1vRs^%j=#mkfy;{RVR$=U}|r$#_kp76 z^D7FPQWo5UVe}ZM{l*FkhKWV%87B(YB!7h?gYNYvyD`4e^1j)f4Ek>Vbz8 zL9w#}6Ihqas0 z`dTZ`>S;pccg7nx`AWWE3z>@w-~6qYve4}~8`ml+PcIq0O-Yi}aj$w^WM1*{&qNku zwCOpCJ0wg6w(M1=O!Bu27Pf{NpEz*KOI#vkg!#QwqBD*b(^bj-hoKdHUG%%9698x%}GHmki zi_(wH%IOh==$yasc6$zfJ5%YNrlu~gOl~Ma^+`+QplYzy|JzHX52Lw~;)*63 z@~zLm>HlfTOhoIua&ddTR|`c_F?)_eDFdxGa9-F(b?q11*T2|qey}>zOR=T_HCr&_ zDJ?Xu=%2(;>LU=Kxz`(BqgT)|_yZMT#gVAZ zi0)o;fIkn43%=yra=SC~T@m)V&$L!Hx~Wnpxc#mlU!;G)e8s*j2KRlEVC`hY;Iy&} zXweE?BBk`D2ELOxq7i@(%>SW@Ir#)>`AXsmC zxG7&He2Gl(%&`}<@f2TUI43(c8vWJq*=B(KR{SWzoE zXw(zC!fC34UwTGas`4vWO9@q1YA}-f;ViF;D|wRVwT45(YL;L%5#m>f!>lTl`7@f$ z4dF;3esHZ!i>ozhJs6dIzia!2V2=dK$B;dNE#YESVio>Rx+92aOw!G$2qD%p>=X5f zb|0-S5fxiZGFiIAMlSe=b%PkXs>ck9cD=ghW23v2cz>!Us5*}38${dB!wryR>9grp z86d1~xF$DF=oA;=R~O=-WN%YJLlandz$_SkJe<}FHi)_K>EPF$pJR5m@B)6n!6Jd8 znyz_V1=D*Se2(e4{*Wu^kgnR4nL~x7iqiHeP0wylx=+vD~>%}G+Q{r z0J8+ez?mpd;=2s|+%tH2v*D%BIfH3@PvWSNmOWovAMyW$b04kP_lSQGbB?jLx$wcK z8{QXvbh_J5>178uC*07#hI8adJSs00qioTnGa3Jk+r^W~-EW0rsoKeKa>2kW(T3k& zgEz6f5fgPd`6sO$F(9NatTNA!NCicspV4Zu)T+!_O}0Tk`cz-}U2+LBdDyP!02v=jxQi5Xh>@nGm#Y zLlxW!5^fFpm0ZOjIdNwk630tAt5MrGurCVninD3(xZvi(nBOy+?T4Bt-zn+I)=G;G zfwzMi-8Yp9EY^fBsTTXI;ySZZYs0F>%EEvC;hH?X^`l4-W?Yp4mj$gzIB?yObO%kp z!3g^4j%WyOWM?m<9pnnyVmD*8igED!@r=22Kd%6Dr?X06Lq=3`1I~Iu_}25uMt}_; z;qtL zOWdr0_79q$>(Vzl(Na7DWsV*MQfKAYoAmNkij|UJ^Vm>})lcUkbnTc%*ZO-dQVm5{ zW)#gzNZGX1Oroop81wz9{;3*c)|IlwixZaUPv1%u30B^lGdc2n_ov<4kZeWqIIeh!*5np1DAK?-?px$wN@yBJ|3< z!b1%K(`&Pjel!{%zM$;aORPY!VjJ@*9xoNgA7=`F34MHrZ1Kv$P*E>=;HoSo1robI z19V9g7JOV?J{;`4T0iV;#O}g&LX)|o+Hd8SeN)lMTdQmmLU8kRsxqx&EUhmtg>$cB z(kuUFBeyH;Izn;HYse9OA@&0t{>XC;WS6)z@Co4(SJL{G`24f3JXK7z`qJ#WO5zA%TCw%O4kLt zWoUa|txkX79OF^mgl1VNQ$1>#IxeXtDHx_!()@;4t+9UWa6iXB?O; zqO#=^t9MPMT~}bU?Rk%x?@XB98qEfO&NOXZ{Hx0?{KOhfRVvEwpu^4PV#BM|WMz9y z?TXfQW16+dz!?!&WXz_ zQS54lh-BG@>CDE`W91%(q4FODR*r&6ki!w^6oMyCtQ6!^i$4)3lls%8W6qWRaAEl# zFUcve3LUQ%yC0QcOcI9rNy&!e`{gAk)rE4MuizN3dvqEon#pS@Fx7X2D##cZu(+HLQ*#PYA!vbsMWSMuuwH@+ar-MgFNbY083aQ^!q*s($}k{Ety`Et z{O2VEJsc3;Jp2_bK(!!9Py~noG8GO4OpXKtwg?~ z(*IXMfaoy-vh!aVi5Vu3v%tTCg?}9ln1AAd$*eJelM_P!1tdrg(1Z;XE&7j=9t%sSAUic);$k0Ssb|0LR%9fVpn(U`kX1;18iS3^r`wks-hT4&U0s6qQ6EhffYL zXify8>2`(zX%aA^?*#*LAHZ&660i_I0H&;g0jEDF0{M1N1`@Iq29v9jL97)2F4KgA zBmdVi{SXbC3KVX>f_TIN7DQ733(#bkoR|q14oCrHpoD`AWRnh)1yez)pbyzFFfD~g z`@575vYZMc1bxbb$tY<+UP20C;9L!u4@d)CUMYqti)lbAL_WblFdcxEN*H`h2g!j- z>RgIflYuc@ps9p95!=0r&|Xgvq%Xz>}REgJ5O>2fA|} z@BuXw@L_KfrdVf!WI%_rFc|p@NQ-~L97MbV6XUXgLnFKa1ExdZfx%}328y;}ia|DD zUvLiwz1hGy`F#M}nIZ>pb^Zu4lLPD=o&!Wwd-@klL1veKzX>6#kMPf7KhVGTBV;od zxD>FiVGD5bfCZ%>NPiyi%kuaOGKhb{1oZyp-){nlz(+tNM1w)@M_}hZ3>Z9p1ZjYR zaQ*^5#6BN5H`s(Qn8^p$kdeTEvjA`qksK0K05St@(?KwcKtzzo0$|1(6AUa0frKD% zz+k8l#PrW){J*N5|9_Os`2S9&gfr|de)/(?:(?:sendungen|emissions)/)?(?P.*?)/(?P.*?)(\?.*)?' _VIDEOS_URL = r'(?:http://)?videos.arte.tv/(?Pfr|de)/.*-(?P.*?).html' + _LIVEWEB_URL = r'(?:http://)?liveweb.arte.tv/(?Pfr|de)/(?P.+?)/(?P.+)' _LIVE_URL = r'index-[0-9]+\.html$' IE_NAME = u'arte.tv' @classmethod def suitable(cls, url): - return any(re.match(regex, url) for regex in (cls._EMISSION_URL, cls._VIDEOS_URL)) + return any(re.match(regex, url) for regex in (cls._EMISSION_URL, cls._VIDEOS_URL, cls._LIVEWEB_URL)) # TODO implement Live Stream # from ..utils import compat_urllib_parse @@ -68,6 +69,12 @@ class ArteTvIE(InfoExtractor): lang = mobj.group('lang') return self._extract_video(url, id, lang) + mobj = re.match(self._LIVEWEB_URL, url) + if mobj is not None: + name = mobj.group('name') + lang = mobj.group('lang') + return self._extract_liveweb(url, name, lang) + if re.search(self._LIVE_URL, video_id) is not None: raise ExtractorError(u'Arte live streams are not yet supported, sorry') # self.extractLiveStream(url) @@ -85,7 +92,7 @@ class ArteTvIE(InfoExtractor): info_dict = {'id': player_info['VID'], 'title': player_info['VTI'], - 'description': player_info['VDE'], + 'description': player_info.get('VDE'), 'upload_date': unified_strdate(player_info['VDA'].split(' ')[0]), 'thumbnail': player_info['programImage'], 'ext': 'flv', @@ -104,6 +111,8 @@ class ArteTvIE(InfoExtractor): formats = filter(_match_lang, formats) # We order the formats by quality formats = sorted(formats, key=lambda f: int(f['height'])) + # Prefer videos without subtitles in the same language + formats = sorted(formats, key=lambda f: re.match(r'VO(F|A)-STM\1', f['versionCode']) is None) # Pick the best quality format_info = formats[-1] if format_info['mediaType'] == u'rtmp': @@ -144,3 +153,22 @@ class ArteTvIE(InfoExtractor): 'url': video_url, 'ext': 'flv', } + + def _extract_liveweb(self, url, name, lang): + """Extract form http://liveweb.arte.tv/""" + webpage = self._download_webpage(url, name) + video_id = self._search_regex(r'eventId=(\d+?)("|&)', webpage, u'event id') + config_xml = self._download_webpage('http://download.liveweb.arte.tv/o21/liveweb/events/event-%s.xml' % video_id, + video_id, u'Downloading information') + config_doc = xml.etree.ElementTree.fromstring(config_xml.encode('utf-8')) + event_doc = config_doc.find('event') + url_node = event_doc.find('video').find('urlHd') + if url_node is None: + url_node = video_doc.find('urlSd') + + return {'id': video_id, + 'title': event_doc.find('name%s' % lang.capitalize()).text, + 'url': url_node.text.replace('MP4', 'mp4'), + 'ext': 'flv', + 'thumbnail': self._og_search_thumbnail(webpage), + } diff --git a/youtube_dl/extractor/collegehumor.py b/youtube_dl/extractor/collegehumor.py index 5badde0..30b9c75 100644 --- a/youtube_dl/extractor/collegehumor.py +++ b/youtube_dl/extractor/collegehumor.py @@ -10,7 +10,7 @@ from ..utils import ( class CollegeHumorIE(InfoExtractor): - _VALID_URL = r'^(?:https?://)?(?:www\.)?collegehumor\.com/(video|embed|e)/(?P[0-9]+)/(?P.*)$' + _VALID_URL = r'^(?:https?://)?(?:www\.)?collegehumor\.com/(video|embed|e)/(?P[0-9]+)/?(?P.*)$' _TEST = { u'url': u'http://www.collegehumor.com/video/6902724/comic-con-cosplay-catastrophe', diff --git a/youtube_dl/extractor/muzu.py b/youtube_dl/extractor/muzu.py new file mode 100644 index 0000000..03e31ea --- /dev/null +++ b/youtube_dl/extractor/muzu.py @@ -0,0 +1,64 @@ +import re +import json + +from .common import InfoExtractor +from ..utils import ( + compat_urllib_parse, + determine_ext, +) + + +class MuzuTVIE(InfoExtractor): + _VALID_URL = r'https?://www.muzu.tv/(.+?)/(.+?)/(?P\d+)' + IE_NAME = u'muzu.tv' + + _TEST = { + u'url': u'http://www.muzu.tv/defected/marcashken-featuring-sos-cat-walk-original-mix-music-video/1981454/', + u'file': u'1981454.mp4', + u'md5': u'98f8b2c7bc50578d6a0364fff2bfb000', + u'info_dict': { + u'title': u'Cat Walk (Original Mix)', + u'description': u'md5:90e868994de201b2570e4e5854e19420', + u'uploader': u'MarcAshken featuring SOS', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + info_data = compat_urllib_parse.urlencode({'format': 'json', + 'url': url, + }) + video_info_page = self._download_webpage('http://www.muzu.tv/api/oembed/?%s' % info_data, + video_id, u'Downloading video info') + info = json.loads(video_info_page) + + player_info_page = self._download_webpage('http://player.muzu.tv/player/playerInit?ai=%s' % video_id, + video_id, u'Downloading player info') + video_info = json.loads(player_info_page)['videos'][0] + for quality in ['1080' , '720', '480', '360']: + if video_info.get('v%s' % quality): + break + + data = compat_urllib_parse.urlencode({'ai': video_id, + # Even if each time you watch a video the hash changes, + # it seems to work for different videos, and it will work + # even if you use any non empty string as a hash + 'viewhash': 'VBNff6djeV4HV5TRPW5kOHub2k', + 'device': 'web', + 'qv': quality, + }) + video_url_page = self._download_webpage('http://player.muzu.tv/player/requestVideo?%s' % data, + video_id, u'Downloading video url') + video_url_info = json.loads(video_url_page) + video_url = video_url_info['url'] + + return {'id': video_id, + 'title': info['title'], + 'url': video_url, + 'ext': determine_ext(video_url), + 'thumbnail': info['thumbnail_url'], + 'description': info['description'], + 'uploader': info['author_name'], + } diff --git a/youtube_dl/extractor/myvideo.py b/youtube_dl/extractor/myvideo.py index b2a7b1d..0404e6e 100644 --- a/youtube_dl/extractor/myvideo.py +++ b/youtube_dl/extractor/myvideo.py @@ -2,11 +2,13 @@ import binascii import base64 import hashlib import re +import json from .common import InfoExtractor from ..utils import ( compat_ord, compat_urllib_parse, + compat_urllib_request, ExtractorError, ) @@ -16,7 +18,7 @@ from ..utils import ( class MyVideoIE(InfoExtractor): """Information Extractor for myvideo.de.""" - _VALID_URL = r'(?:http://)?(?:www\.)?myvideo\.de/watch/([0-9]+)/([^?/]+).*' + _VALID_URL = r'(?:http://)?(?:www\.)?myvideo\.de/(?:[^/]+/)?watch/([0-9]+)/([^?/]+).*' IE_NAME = u'myvideo' _TEST = { u'url': u'http://www.myvideo.de/watch/8229274/bowling_fail_or_win', @@ -85,6 +87,20 @@ class MyVideoIE(InfoExtractor): 'ext': video_ext, }] + mobj = re.search(r'data-video-service="/service/data/video/%s/config' % video_id, webpage) + if mobj is not None: + request = compat_urllib_request.Request('http://www.myvideo.de/service/data/video/%s/config' % video_id, '') + response = self._download_webpage(request, video_id, + u'Downloading video info') + info = json.loads(base64.b64decode(response).decode('utf-8')) + return {'id': video_id, + 'title': info['title'], + 'url': info['streaming_url'].replace('rtmpe', 'rtmpt'), + 'play_path': info['filename'], + 'ext': 'flv', + 'thumbnail': info['thumbnail'][0]['url'], + } + # try encxml mobj = re.search('var flashvars={(.+?)}', webpage) if mobj is None: diff --git a/youtube_dl/extractor/ooyala.py b/youtube_dl/extractor/ooyala.py new file mode 100644 index 0000000..b734722 --- /dev/null +++ b/youtube_dl/extractor/ooyala.py @@ -0,0 +1,52 @@ +import re +import json + +from .common import InfoExtractor +from ..utils import unescapeHTML + +class OoyalaIE(InfoExtractor): + _VALID_URL = r'https?://.+?\.ooyala\.com/.*?embedCode=(?P.+?)(&|$)' + + _TEST = { + # From http://it.slashdot.org/story/13/04/25/178216/recovering-data-from-broken-hard-drives-and-ssds-video + u'url': u'http://player.ooyala.com/player.js?embedCode=pxczE2YjpfHfn1f3M-ykG_AmJRRn0PD8', + u'file': u'pxczE2YjpfHfn1f3M-ykG_AmJRRn0PD8.mp4', + u'md5': u'3f5cceb3a7bf461d6c29dc466cf8033c', + u'info_dict': { + u'title': u'Explaining Data Recovery from Hard Drives and SSDs', + u'description': u'How badly damaged does a drive have to be to defeat Russell and his crew? Apparently, smashed to bits.', + }, + } + + def _extract_result(self, info, more_info): + return {'id': info['embedCode'], + 'ext': 'mp4', + 'title': unescapeHTML(info['title']), + 'url': info['url'], + 'description': unescapeHTML(more_info['description']), + 'thumbnail': more_info['promo'], + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + embedCode = mobj.group('id') + player_url = 'http://player.ooyala.com/player.js?embedCode=%s' % embedCode + player = self._download_webpage(player_url, embedCode) + mobile_url = self._search_regex(r'mobile_player_url="(.+?)&device="', + player, u'mobile player url') + mobile_player = self._download_webpage(mobile_url, embedCode) + videos_info = self._search_regex(r'eval\("\((\[{.*?stream_redirect.*?}\])\)"\);', mobile_player, u'info').replace('\\"','"') + videos_more_info = self._search_regex(r'eval\("\(({.*?\\"promo\\".*?})\)"', mobile_player, u'more info').replace('\\"','"') + videos_info = json.loads(videos_info) + videos_more_info =json.loads(videos_more_info) + + if videos_more_info.get('lineup'): + videos = [self._extract_result(info, more_info) for (info, more_info) in zip(videos_info, videos_more_info['lineup'])] + return {'_type': 'playlist', + 'id': embedCode, + 'title': unescapeHTML(videos_more_info['title']), + 'entries': videos, + } + else: + return self._extract_result(videos_info[0], videos_more_info) + diff --git a/youtube_dl/extractor/videofyme.py b/youtube_dl/extractor/videofyme.py new file mode 100644 index 0000000..0410667 --- /dev/null +++ b/youtube_dl/extractor/videofyme.py @@ -0,0 +1,49 @@ +import re +import xml.etree.ElementTree + +from .common import InfoExtractor +from ..utils import ( + find_xpath_attr, + determine_ext, +) + +class VideofyMeIE(InfoExtractor): + _VALID_URL = r'https?://(www.videofy.me/.+?|p.videofy.me/v)/(?P\d+)(&|#|$)' + IE_NAME = u'videofy.me' + + _TEST = { + u'url': u'http://www.videofy.me/thisisvideofyme/1100701', + u'file': u'1100701.mp4', + u'md5': u'2046dd5758541d630bfa93e741e2fd79', + u'info_dict': { + u'title': u'This is VideofyMe', + u'description': None, + u'uploader': u'VideofyMe', + u'uploader_id': u'thisisvideofyme', + }, + + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + config_xml = self._download_webpage('http://sunshine.videofy.me/?videoId=%s' % video_id, + video_id) + config = xml.etree.ElementTree.fromstring(config_xml.encode('utf-8')) + video = config.find('video') + sources = video.find('sources') + url_node = find_xpath_attr(sources, 'source', 'id', 'HQ on') + if url_node is None: + url_node = find_xpath_attr(sources, 'source', 'id', 'HQ off') + video_url = url_node.find('url').text + + return {'id': video_id, + 'title': video.find('title').text, + 'url': video_url, + 'ext': determine_ext(video_url), + 'thumbnail': video.find('thumb').text, + 'description': video.find('description').text, + 'uploader': config.find('blog/name').text, + 'uploader_id': video.find('identifier').text, + 'view_count': re.search(r'\d+', video.find('views').text).group(), + } diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index bc89a14..b191021 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -338,13 +338,13 @@ class YoutubeIE(YoutubeBaseInfoExtractor): elif len(s) == 88: return s[48] + s[81:67:-1] + s[82] + s[66:62:-1] + s[85] + s[61:48:-1] + s[67] + s[47:12:-1] + s[3] + s[11:3:-1] + s[2] + s[12] elif len(s) == 87: - return s[4:23] + s[86] + s[24:85] + return s[83:53:-1] + s[3] + s[52:40:-1] + s[86] + s[39:10:-1] + s[0] + s[9:3:-1] + s[53] elif len(s) == 86: return s[83:85] + s[26] + s[79:46:-1] + s[85] + s[45:36:-1] + s[30] + s[35:30:-1] + s[46] + s[29:26:-1] + s[82] + s[25:1:-1] elif len(s) == 85: return s[2:8] + s[0] + s[9:21] + s[65] + s[22:65] + s[84] + s[66:82] + s[21] elif len(s) == 84: - return s[83:36:-1] + s[2] + s[35:26:-1] + s[3] + s[25:3:-1] + s[26] + return s[83:27:-1] + s[0] + s[26:5:-1] + s[2:0:-1] + s[27] elif len(s) == 83: return s[:15] + s[80] + s[16:80] + s[15] elif len(s) == 82: @@ -718,8 +718,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): s = url_data['s'][0] if age_gate: player_version = self._search_regex(r'ad3-(.+?)\.swf', - video_info['ad3_module'][0], 'flash player', - fatal=False) + video_info['ad3_module'][0] if 'ad3_module' in video_info else 'NOT FOUND', + 'flash player', fatal=False) player = 'flash player %s' % player_version else: player = u'html5 player %s' % self._search_regex(r'html5player-(.+?)\.js', video_webpage, diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index cf2ea65..59eeaf4 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -207,7 +207,7 @@ if sys.version_info >= (2,7): def find_xpath_attr(node, xpath, key, val): """ Find the xpath xpath[@key=val] """ assert re.match(r'^[a-zA-Z]+$', key) - assert re.match(r'^[a-zA-Z@]*$', val) + assert re.match(r'^[a-zA-Z@\s]*$', val) expr = xpath + u"[@%s='%s']" % (key, val) return node.find(expr) else: diff --git a/youtube_dl/version.py b/youtube_dl/version.py index 4fc85fa..82c2464 100644 --- a/youtube_dl/version.py +++ b/youtube_dl/version.py @@ -1,2 +1,2 @@ -__version__ = '2013.08.02' +__version__ = '2013.08.08' -- 2.41.1