From ca4d08063804fb264eb0ae9cc57894198f66e1fb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rog=C3=A9rio=20Brito?= Date: Thu, 26 Dec 2013 16:41:27 -0200 Subject: [PATCH] Imported Upstream version 2013.12.23 --- README.md | 65 +++++- README.txt | 134 ++++++++++-- test/test_YoutubeDL.py | 15 ++ test/test_all_urls.py | 9 +- test/test_playlists.py | 51 ++++- test/test_utils.py | 31 ++- test/test_write_info_json.py | 1 + test/test_youtube_lists.py | 8 + youtube-dl | Bin 283113 -> 313559 bytes youtube-dl.1 | 148 +++++++++++-- youtube-dl.bash-completion | 2 +- youtube_dl/FileDownloader.py | 89 +++++--- youtube_dl/YoutubeDL.py | 294 ++++++++++++++++++-------- youtube_dl/__init__.py | 96 +++++---- youtube_dl/aes.py | 144 +++++++++++-- youtube_dl/extractor/__init__.py | 27 ++- youtube_dl/extractor/academicearth.py | 31 +++ youtube_dl/extractor/addanime.py | 2 +- youtube_dl/extractor/aparat.py | 56 +++++ youtube_dl/extractor/appletrailers.py | 25 ++- youtube_dl/extractor/archiveorg.py | 2 +- youtube_dl/extractor/arte.py | 25 ++- youtube_dl/extractor/auengine.py | 2 +- youtube_dl/extractor/bambuser.py | 2 +- youtube_dl/extractor/blinkx.py | 90 ++++++++ youtube_dl/extractor/bliptv.py | 39 ++-- youtube_dl/extractor/bloomberg.py | 2 +- youtube_dl/extractor/brightcove.py | 24 ++- youtube_dl/extractor/cbs.py | 30 +++ youtube_dl/extractor/channel9.py | 267 +++++++++++++++++++++++ youtube_dl/extractor/clipsyndicate.py | 10 +- youtube_dl/extractor/comedycentral.py | 2 +- youtube_dl/extractor/common.py | 110 ++++++---- youtube_dl/extractor/crunchyroll.py | 171 +++++++++++++++ youtube_dl/extractor/cspan.py | 2 +- youtube_dl/extractor/dailymotion.py | 17 +- youtube_dl/extractor/daum.py | 2 +- youtube_dl/extractor/dreisat.py | 2 +- youtube_dl/extractor/eighttracks.py | 2 +- youtube_dl/extractor/exfm.py | 2 +- youtube_dl/extractor/facebook.py | 4 +- youtube_dl/extractor/faz.py | 2 +- youtube_dl/extractor/fktv.py | 4 +- youtube_dl/extractor/francetv.py | 106 ++++++++-- youtube_dl/extractor/gamekings.py | 2 +- youtube_dl/extractor/gametrailers.py | 3 +- youtube_dl/extractor/generic.py | 147 ++++++++++--- youtube_dl/extractor/hotnewhiphop.py | 2 +- youtube_dl/extractor/ign.py | 4 +- youtube_dl/extractor/imdb.py | 8 +- youtube_dl/extractor/instagram.py | 2 +- youtube_dl/extractor/ivi.py | 154 ++++++++++++++ youtube_dl/extractor/jukebox.py | 2 +- youtube_dl/extractor/liveleak.py | 2 +- youtube_dl/extractor/livestream.py | 2 +- youtube_dl/extractor/mdr.py | 63 ++++++ youtube_dl/extractor/metacafe.py | 48 +++-- youtube_dl/extractor/metacritic.py | 9 +- youtube_dl/extractor/mixcloud.py | 23 +- youtube_dl/extractor/mtv.py | 38 ++-- youtube_dl/extractor/muzu.py | 2 +- youtube_dl/extractor/myspass.py | 2 +- youtube_dl/extractor/naver.py | 2 +- youtube_dl/extractor/ndtv.py | 64 ++++++ youtube_dl/extractor/ninegag.py | 43 ++++ youtube_dl/extractor/ooyala.py | 5 + youtube_dl/extractor/orf.py | 2 +- youtube_dl/extractor/pbs.py | 2 +- youtube_dl/extractor/pornhd.py | 38 ++++ youtube_dl/extractor/pornhub.py | 2 +- youtube_dl/extractor/pyvideo.py | 51 +++++ youtube_dl/extractor/radiofrance.py | 55 +++++ youtube_dl/extractor/rtlnow.py | 7 +- youtube_dl/extractor/rutube.py | 2 +- youtube_dl/extractor/slashdot.py | 2 +- youtube_dl/extractor/smotri.py | 167 +++++++++++++-- youtube_dl/extractor/soundcloud.py | 60 ++++-- youtube_dl/extractor/space.py | 2 +- youtube_dl/extractor/stanfordoc.py | 22 +- youtube_dl/extractor/tf1.py | 2 +- youtube_dl/extractor/theplatform.py | 80 +++++++ youtube_dl/extractor/unistra.py | 2 +- youtube_dl/extractor/vbox7.py | 2 +- youtube_dl/extractor/veehd.py | 2 +- youtube_dl/extractor/vevo.py | 9 +- youtube_dl/extractor/vice.py | 2 +- youtube_dl/extractor/viddler.py | 5 +- youtube_dl/extractor/videofyme.py | 2 +- youtube_dl/extractor/videopremium.py | 1 + youtube_dl/extractor/vimeo.py | 77 ++++++- youtube_dl/extractor/wat.py | 2 +- youtube_dl/extractor/wimp.py | 23 +- youtube_dl/extractor/wistia.py | 55 +++++ youtube_dl/extractor/xhamster.py | 4 +- youtube_dl/extractor/xtube.py | 2 +- youtube_dl/extractor/yahoo.py | 2 +- youtube_dl/extractor/youjizz.py | 2 +- youtube_dl/extractor/youtube.py | 190 +++++++++-------- youtube_dl/extractor/zdf.py | 4 +- youtube_dl/utils.py | 85 +++++++- youtube_dl/version.py | 2 +- 101 files changed, 3102 insertions(+), 639 deletions(-) create mode 100644 youtube_dl/extractor/academicearth.py create mode 100644 youtube_dl/extractor/aparat.py create mode 100644 youtube_dl/extractor/blinkx.py create mode 100644 youtube_dl/extractor/cbs.py create mode 100644 youtube_dl/extractor/channel9.py create mode 100644 youtube_dl/extractor/crunchyroll.py create mode 100644 youtube_dl/extractor/ivi.py create mode 100644 youtube_dl/extractor/mdr.py create mode 100644 youtube_dl/extractor/ndtv.py create mode 100644 youtube_dl/extractor/ninegag.py create mode 100644 youtube_dl/extractor/pornhd.py create mode 100644 youtube_dl/extractor/pyvideo.py create mode 100644 youtube_dl/extractor/radiofrance.py create mode 100644 youtube_dl/extractor/theplatform.py create mode 100644 youtube_dl/extractor/wistia.py diff --git a/README.md b/README.md index 029c418..caed948 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ which means you can modify it, redistribute it or use it however you like. default $XDG_CACHE_HOME/youtube-dl or ~/.cache /youtube-dl . --no-cache-dir Disable filesystem caching + --bidi-workaround Work around terminals that lack bidirectional + text support. Requires fribidi executable in PATH ## Video Selection: --playlist-start NUMBER playlist video to start at (default is 1) @@ -54,6 +56,10 @@ which means you can modify it, redistribute it or use it however you like. --date DATE download only videos uploaded in this date --datebefore DATE download only videos uploaded before this date --dateafter DATE download only videos uploaded after this date + --min-views COUNT Do not download any videos with less than COUNT + views + --max-views COUNT Do not download any videos with more than COUNT + views --no-playlist download only the currently playing video --age-limit YEARS download only videos suitable for the given age --download-archive FILE Download only videos not listed in the archive @@ -98,6 +104,8 @@ which means you can modify it, redistribute it or use it however you like. --restrict-filenames Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames -a, --batch-file FILE file containing URLs to download ('-' for stdin) + --load-info FILE json file containing the video information + (created with the "--write-json" option -w, --no-overwrites do not overwrite files -c, --continue force resume of partially downloaded files. By default, youtube-dl will resume downloads if @@ -123,6 +131,7 @@ which means you can modify it, redistribute it or use it however you like. --get-id simulate, quiet but print id --get-thumbnail simulate, quiet but print thumbnail URL --get-description simulate, quiet but print video description + --get-duration simulate, quiet but print video length --get-filename simulate, quiet but print output filename --get-format simulate, quiet but print output format -j, --dump-json simulate, quiet but print JSON information @@ -274,14 +283,54 @@ This README file was originally written by Daniel Bolton ( +Bugs and suggestions should be reported at: . Unless you were prompted so or there is another pertinent reason (e.g. GitHub fails to accept the bug report), please do not send bug reports via personal email. -Please include: - -* Your exact command line, like `youtube-dl -t "http://www.youtube.com/watch?v=uHlDtZ6Oc3s&feature=channel_video_title"`. A common mistake is not to escape the `&`. Putting URLs in quotes should solve this problem. -* If possible re-run the command with `--verbose`, and include the full output, it is really helpful to us. -* The output of `youtube-dl --version` -* The output of `python --version` -* The name and version of your Operating System ("Ubuntu 11.04 x64" or "Windows 7 x64" is usually enough). +Please include the full output of the command when run with `--verbose`. The output (including the first lines) contain important debugging information. Issues without the full output are often not reproducible and therefore do not get solved in short order, if ever. For discussions, join us in the irc channel #youtube-dl on freenode. + +When you submit a request, please re-read it once to avoid a couple of mistakes (you can and should use this as a checklist): + +### Is the description of the issue itself sufficient? + +We often get issue reports that we cannot really decipher. While in most cases we eventually get the required information after asking back multiple times, this poses an unnecessary drain on our resources. Many contributors, including myself, are also not native speakers, so we may misread some parts. + +So please elaborate on what feature you are requesting, or what bug you want to be fixed. Make sure that it's obvious + +- What the problem is +- How it could be fixed +- How your proposed solution would look like + +If your report is shorter than two lines, it is almost certainly missing some of these, which makes it hard for us to respond to it. We're often too polite to close the issue outright, but the missing info makes misinterpretation likely. As a commiter myself, I often get frustrated by these issues, since the only possible way for me to move forward on them is to ask for clarification over and over. + +For bug reports, this means that your report should contain the *complete* output of youtube-dl when called with the -v flag. The error message you get for (most) bugs even says so, but you would not believe how many of our bug reports do not contain this information. + +Site support requests must contain an example URL. An example URL is a URL you might want to download, like http://www.youtube.com/watch?v=BaW_jenozKc . There should be an obvious video present. Except under very special circumstances, the main page of a video service (e.g. http://www.youtube.com/ ) is *not* an example URL. + +### Are you using the latest version? + +Before reporting any issue, type youtube-dl -U. This should report that you're up-to-date. Ábout 20% of the reports we receive are already fixed, but people are using outdated versions. This goes for feature requests as well. + +### Is the issue already documented? + +Make sure that someone has not already opened the issue you're trying to open. Search at the top of the window or at https://github.com/rg3/youtube-dl/search?type=Issues . If there is an issue, feel free to write something along the lines of "This affects me as well, with version 2015.01.01. Here is some more information on the issue: ...". While some issues may be old, a new post into them often spurs rapid activity. + +### Why are existing options not enough? + +Before requesting a new feature, please have a quick peek at [the list of supported options](https://github.com/rg3/youtube-dl/blob/master/README.md#synopsis). Many feature requests are for features that actually exist already! Please, absolutely do show off your work in the issue report and detail how the existing similar options do *not* solve your problem. + +### Is there enough context in your bug report? + +People want to solve problems, and often think they do us a favor by breaking down their larger problems (e.g. wanting to skip already downloaded files) to a specific request (e.g. requesting us to look whether the file exists before downloading the info page). However, what often happens is that they break down the problem into two steps: One simple, and one impossible (or extremely complicated one). + +We are then presented with a very complicated request when the original problem could be solved far easier, e.g. by recording the downloaded video IDs in a separate file. To avoid this, you must include the greater context where it is non-obvious. In particular, every feature request that does not consist of adding support for a new site should contain a use case scenario that explains in what situation the missing feature would be useful. + +### Does the issue involve one problem, and one problem only? + +Some of our users seem to think there is a limit of issues they can or should open. There is no limit of issues they can or should open. While it may seem appealing to be able to dump all your issues into one ticket, that means that someone who solves one of your issues cannot mark the issue as closed. Typically, reporting a bunch of issues leads to the ticket lingering since nobody wants to attack that behemoth, until someone mercifully splits the issue into multiple ones. + +In particular, every site support request issue should only pertain to services at one site (generally under a common domain, but always using the same backend technology). Do not request support for vimeo user videos, Whitehouse podcasts, and Google Plus pages in the same issue. Also, make sure that you don't post bug reports alongside feature requests. As a rule of thumb, a feature request does not include outputs of youtube-dl that are not immediately related to the feature at hand. Do not post reports of a network error alongside the request for a new video service. + +### Is anyone going to need the feature? + +Only post features that you (or an incapicated friend you can personally talk to) require. Do not post features because they seem like a good idea. If they are really useful, they will be requested by someone who requires them. diff --git a/README.txt b/README.txt index fc9f17e..3645b8c 100644 --- a/README.txt +++ b/README.txt @@ -45,6 +45,8 @@ OPTIONS default $XDG_CACHE_HOME/youtube-dl or ~/.cache /youtube-dl . --no-cache-dir Disable filesystem caching + --bidi-workaround Work around terminals that lack bidirectional + text support. Requires fribidi executable in PATH Video Selection: ---------------- @@ -63,6 +65,10 @@ Video Selection: --date DATE download only videos uploaded in this date --datebefore DATE download only videos uploaded before this date --dateafter DATE download only videos uploaded after this date + --min-views COUNT Do not download any videos with less than COUNT + views + --max-views COUNT Do not download any videos with more than COUNT + views --no-playlist download only the currently playing video --age-limit YEARS download only videos suitable for the given age --download-archive FILE Download only videos not listed in the archive @@ -111,6 +117,8 @@ Filesystem Options: --restrict-filenames Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames -a, --batch-file FILE file containing URLs to download ('-' for stdin) + --load-info FILE json file containing the video information + (created with the "--write-json" option -w, --no-overwrites do not overwrite files -c, --continue force resume of partially downloaded files. By default, youtube-dl will resume downloads if @@ -138,6 +146,7 @@ Verbosity / Simulation Options: --get-id simulate, quiet but print id --get-thumbnail simulate, quiet but print thumbnail URL --get-description simulate, quiet but print video description + --get-duration simulate, quiet but print video length --get-filename simulate, quiet but print output filename --get-format simulate, quiet but print output format -j, --dump-json simulate, quiet but print JSON information @@ -354,19 +363,118 @@ BUGS ==== Bugs and suggestions should be reported at: -https://github.com/rg3/youtube-dl/issues +https://github.com/rg3/youtube-dl/issues . Unless you were prompted so +or there is another pertinent reason (e.g. GitHub fails to accept the +bug report), please do not send bug reports via personal email. -Please include: - -- Your exact command line, like - youtube-dl -t "http://www.youtube.com/watch?v=uHlDtZ6Oc3s&feature=channel_video_title". - A common mistake is not to escape the &. Putting URLs in quotes - should solve this problem. -- If possible re-run the command with --verbose, and include the full - output, it is really helpful to us. -- The output of youtube-dl --version -- The output of python --version -- The name and version of your Operating System ("Ubuntu 11.04 x64" or - "Windows 7 x64" is usually enough). +Please include the full output of the command when run with --verbose. +The output (including the first lines) contain important debugging +information. Issues without the full output are often not reproducible +and therefore do not get solved in short order, if ever. For discussions, join us in the irc channel #youtube-dl on freenode. + +When you submit a request, please re-read it once to avoid a couple of +mistakes (you can and should use this as a checklist): + +Is the description of the issue itself sufficient? + +We often get issue reports that we cannot really decipher. While in most +cases we eventually get the required information after asking back +multiple times, this poses an unnecessary drain on our resources. Many +contributors, including myself, are also not native speakers, so we may +misread some parts. + +So please elaborate on what feature you are requesting, or what bug you +want to be fixed. Make sure that it's obvious + +- What the problem is +- How it could be fixed +- How your proposed solution would look like + +If your report is shorter than two lines, it is almost certainly missing +some of these, which makes it hard for us to respond to it. We're often +too polite to close the issue outright, but the missing info makes +misinterpretation likely. As a commiter myself, I often get frustrated +by these issues, since the only possible way for me to move forward on +them is to ask for clarification over and over. + +For bug reports, this means that your report should contain the complete +output of youtube-dl when called with the -v flag. The error message you +get for (most) bugs even says so, but you would not believe how many of +our bug reports do not contain this information. + +Site support requests must contain an example URL. An example URL is a +URL you might want to download, like +http://www.youtube.com/watch?v=BaW_jenozKc . There should be an obvious +video present. Except under very special circumstances, the main page of +a video service (e.g. http://www.youtube.com/ ) is not an example URL. + +Are you using the latest version? + +Before reporting any issue, type youtube-dl -U. This should report that +you're up-to-date. Ábout 20% of the reports we receive are already +fixed, but people are using outdated versions. This goes for feature +requests as well. + +Is the issue already documented? + +Make sure that someone has not already opened the issue you're trying to +open. Search at the top of the window or at +https://github.com/rg3/youtube-dl/search?type=Issues . If there is an +issue, feel free to write something along the lines of "This affects me +as well, with version 2015.01.01. Here is some more information on the +issue: ...". While some issues may be old, a new post into them often +spurs rapid activity. + +Why are existing options not enough? + +Before requesting a new feature, please have a quick peek at the list of +supported options. Many feature requests are for features that actually +exist already! Please, absolutely do show off your work in the issue +report and detail how the existing similar options do not solve your +problem. + +Is there enough context in your bug report? + +People want to solve problems, and often think they do us a favor by +breaking down their larger problems (e.g. wanting to skip already +downloaded files) to a specific request (e.g. requesting us to look +whether the file exists before downloading the info page). However, what +often happens is that they break down the problem into two steps: One +simple, and one impossible (or extremely complicated one). + +We are then presented with a very complicated request when the original +problem could be solved far easier, e.g. by recording the downloaded +video IDs in a separate file. To avoid this, you must include the +greater context where it is non-obvious. In particular, every feature +request that does not consist of adding support for a new site should +contain a use case scenario that explains in what situation the missing +feature would be useful. + +Does the issue involve one problem, and one problem only? + +Some of our users seem to think there is a limit of issues they can or +should open. There is no limit of issues they can or should open. While +it may seem appealing to be able to dump all your issues into one +ticket, that means that someone who solves one of your issues cannot +mark the issue as closed. Typically, reporting a bunch of issues leads +to the ticket lingering since nobody wants to attack that behemoth, +until someone mercifully splits the issue into multiple ones. + +In particular, every site support request issue should only pertain to +services at one site (generally under a common domain, but always using +the same backend technology). Do not request support for vimeo user +videos, Whitehouse podcasts, and Google Plus pages in the same issue. +Also, make sure that you don't post bug reports alongside feature +requests. As a rule of thumb, a feature request does not include outputs +of youtube-dl that are not immediately related to the feature at hand. +Do not post reports of a network error alongside the request for a new +video service. + +Is anyone going to need the feature? + +Only post features that you (or an incapicated friend you can personally +talk to) require. Do not post features because they seem like a good +idea. If they are really useful, they will be requested by someone who +requires them. diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py index 58cf9c3..3100c36 100644 --- a/test/test_YoutubeDL.py +++ b/test/test_YoutubeDL.py @@ -7,6 +7,7 @@ import unittest sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from test.helper import FakeYDL +from youtube_dl import YoutubeDL class YDL(FakeYDL): @@ -140,6 +141,20 @@ class TestFormatSelection(unittest.TestCase): self.assertEqual(test_dict['extractor'], 'Foo') self.assertEqual(test_dict['playlist'], 'funny videos') + def test_prepare_filename(self): + info = { + u'id': u'1234', + u'ext': u'mp4', + u'width': None, + } + def fname(templ): + ydl = YoutubeDL({'outtmpl': templ}) + return ydl.prepare_filename(info) + self.assertEqual(fname(u'%(id)s.%(ext)s'), u'1234.mp4') + self.assertEqual(fname(u'%(id)s-%(width)s.%(ext)s'), u'1234-NA.mp4') + # Replace missing fields with 'NA' + self.assertEqual(fname(u'%(uploader_date)s-%(id)s.%(ext)s'), u'NA-1234.mp4') + if __name__ == '__main__': unittest.main() diff --git a/test/test_all_urls.py b/test/test_all_urls.py index 6b9764c..bd77b7c 100644 --- a/test/test_all_urls.py +++ b/test/test_all_urls.py @@ -10,6 +10,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from test.helper import get_testcases from youtube_dl.extractor import ( + FacebookIE, gen_extractors, JustinTVIE, YoutubeIE, @@ -87,12 +88,15 @@ class TestAllURLsMatching(unittest.TestCase): assertExtractId('http://www.youtube.com/watch?v=BaW_jenozKcsharePLED17F32AD9753930', 'BaW_jenozKc') assertExtractId('BaW_jenozKc', 'BaW_jenozKc') + def test_facebook_matching(self): + self.assertTrue(FacebookIE.suitable(u'https://www.facebook.com/Shiniknoh#!/photo.php?v=10153317450565268')) + def test_no_duplicates(self): ies = gen_extractors() for tc in get_testcases(): url = tc['url'] for ie in ies: - if type(ie).__name__ in ['GenericIE', tc['name'] + 'IE']: + if type(ie).__name__ in ('GenericIE', tc['name'] + 'IE'): self.assertTrue(ie.suitable(url), '%s should match URL %r' % (type(ie).__name__, url)) else: self.assertFalse(ie.suitable(url), '%s should not match URL %r' % (type(ie).__name__, url)) @@ -110,6 +114,9 @@ class TestAllURLsMatching(unittest.TestCase): self.assertMatch('http://vimeo.com/channels/tributes', ['vimeo:channel']) self.assertMatch('http://vimeo.com/user7108434', ['vimeo:user']) + # https://github.com/rg3/youtube-dl/issues/1930 + def test_soundcloud_not_matching_sets(self): + self.assertMatch('http://soundcloud.com/floex/sets/gone-ep', ['soundcloud:set']) if __name__ == '__main__': unittest.main() diff --git a/test/test_playlists.py b/test/test_playlists.py index 00c9501..1b7b4e3 100644 --- a/test/test_playlists.py +++ b/test/test_playlists.py @@ -12,10 +12,13 @@ from test.helper import FakeYDL from youtube_dl.extractor import ( + AcademicEarthCourseIE, DailymotionPlaylistIE, DailymotionUserIE, VimeoChannelIE, VimeoUserIE, + VimeoAlbumIE, + VimeoGroupsIE, UstreamChannelIE, SoundcloudSetIE, SoundcloudUserIE, @@ -24,7 +27,8 @@ from youtube_dl.extractor import ( BambuserChannelIE, BandcampAlbumIE, SmotriCommunityIE, - SmotriUserIE + SmotriUserIE, + IviCompilationIE ) @@ -65,6 +69,22 @@ class TestPlaylists(unittest.TestCase): self.assertEqual(result['title'], u'Nki') self.assertTrue(len(result['entries']) > 65) + def test_vimeo_album(self): + dl = FakeYDL() + ie = VimeoAlbumIE(dl) + result = ie.extract('http://vimeo.com/album/2632481') + self.assertIsPlaylist(result) + self.assertEqual(result['title'], u'Staff Favorites: November 2013') + self.assertTrue(len(result['entries']) > 12) + + def test_vimeo_groups(self): + dl = FakeYDL() + ie = VimeoGroupsIE(dl) + result = ie.extract('http://vimeo.com/groups/rolexawards') + self.assertIsPlaylist(result) + self.assertEqual(result['title'], u'Rolex Awards for Enterprise') + self.assertTrue(len(result['entries']) > 72) + def test_ustream_channel(self): dl = FakeYDL() ie = UstreamChannelIE(dl) @@ -140,5 +160,34 @@ class TestPlaylists(unittest.TestCase): self.assertEqual(result['title'], u'Inspector') self.assertTrue(len(result['entries']) >= 9) + def test_AcademicEarthCourse(self): + dl = FakeYDL() + ie = AcademicEarthCourseIE(dl) + result = ie.extract(u'http://academicearth.org/courses/building-dynamic-websites/') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], u'building-dynamic-websites') + self.assertEqual(result['title'], u'Building Dynamic Websites') + self.assertEqual(result['description'], u"Today's websites are increasingly dynamic. Pages are no longer static HTML files but instead generated by scripts and database calls. User interfaces are more seamless, with technologies like Ajax replacing traditional page reloads. This course teaches students how to build dynamic websites with Ajax and with Linux, Apache, MySQL, and PHP (LAMP), one of today's most popular frameworks. Students learn how to set up domain names with DNS, how to structure pages with XHTML and CSS, how to program in JavaScript and PHP, how to configure Apache and MySQL, how to design and query databases with SQL, how to use Ajax with both XML and JSON, and how to build mashups. The course explores issues of security, scalability, and cross-browser support and also discusses enterprise-level deployments of websites, including third-party hosting, virtualization, colocation in data centers, firewalling, and load-balancing.") + self.assertEqual(len(result['entries']), 10) + + def test_ivi_compilation(self): + dl = FakeYDL() + ie = IviCompilationIE(dl) + result = ie.extract('http://www.ivi.ru/watch/dezhurnyi_angel') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], u'dezhurnyi_angel') + self.assertEqual(result['title'], u'Дежурный ангел (2010 - 2012)') + self.assertTrue(len(result['entries']) >= 36) + + def test_ivi_compilation_season(self): + dl = FakeYDL() + ie = IviCompilationIE(dl) + result = ie.extract('http://www.ivi.ru/watch/dezhurnyi_angel/season2') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], u'dezhurnyi_angel/season2') + self.assertEqual(result['title'], u'Дежурный ангел (2010 - 2012) 2 сезон') + self.assertTrue(len(result['entries']) >= 20) + + if __name__ == '__main__': unittest.main() diff --git a/test/test_utils.py b/test/test_utils.py index e9e590e..e5778cd 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -13,19 +13,21 @@ import xml.etree.ElementTree #from youtube_dl.utils import htmlentity_transform from youtube_dl.utils import ( - timeconvert, - sanitize_filename, - unescapeHTML, - orderedSet, DateRange, - unified_strdate, + encodeFilename, find_xpath_attr, get_meta_content, - xpath_with_ns, + orderedSet, + sanitize_filename, + shell_quote, smuggle_url, + str_to_int, + timeconvert, + unescapeHTML, + unified_strdate, unsmuggle_url, - shell_quote, - encodeFilename, + url_basename, + xpath_with_ns, ) if sys.version_info < (3, 0): @@ -176,6 +178,19 @@ class TestUtil(unittest.TestCase): args = ['ffmpeg', '-i', encodeFilename(u'ñ€ß\'.mp4')] self.assertEqual(shell_quote(args), u"""ffmpeg -i 'ñ€ß'"'"'.mp4'""") + def test_str_to_int(self): + self.assertEqual(str_to_int('123,456'), 123456) + self.assertEqual(str_to_int('123.456'), 123456) + + def test_url_basename(self): + self.assertEqual(url_basename(u'http://foo.de/'), u'') + self.assertEqual(url_basename(u'http://foo.de/bar/baz'), u'baz') + self.assertEqual(url_basename(u'http://foo.de/bar/baz?x=y'), u'baz') + self.assertEqual(url_basename(u'http://foo.de/bar/baz#x=y'), u'baz') + self.assertEqual(url_basename(u'http://foo.de/bar/baz/'), u'baz') + self.assertEqual( + url_basename(u'http://media.w3.org/2010/05/sintel/trailer.mp4'), + u'trailer.mp4') if __name__ == '__main__': unittest.main() diff --git a/test/test_write_info_json.py b/test/test_write_info_json.py index d717761..90426a5 100644 --- a/test/test_write_info_json.py +++ b/test/test_write_info_json.py @@ -33,6 +33,7 @@ TEST_ID = 'BaW_jenozKc' INFO_JSON_FILE = TEST_ID + '.info.json' DESCRIPTION_FILE = TEST_ID + '.mp4.description' EXPECTED_DESCRIPTION = u'''test chars: "'/\ä↭𝕐 +test URL: https://github.com/rg3/youtube-dl/issues/1892 This is a test video for youtube-dl. diff --git a/test/test_youtube_lists.py b/test/test_youtube_lists.py index 95f07d1..d9fe5af 100644 --- a/test/test_youtube_lists.py +++ b/test/test_youtube_lists.py @@ -15,6 +15,7 @@ from youtube_dl.extractor import ( YoutubeIE, YoutubeChannelIE, YoutubeShowIE, + YoutubeTopListIE, ) @@ -116,5 +117,12 @@ class TestYoutubeLists(unittest.TestCase): original_video = entries[0] self.assertEqual(original_video['id'], 'rjFaenf1T-Y') + def test_youtube_toplist(self): + dl = FakeYDL() + ie = YoutubeTopListIE(dl) + result = ie.extract('yttoplist:music:Top Tracks') + entries = result['entries'] + self.assertTrue(len(entries) >= 5) + if __name__ == '__main__': unittest.main() diff --git a/youtube-dl b/youtube-dl index 899ca28bd80ce245f7afd7cbadc2eae53755a5ff..2e3e8a9b6cf644d8b656750bfe3386298e6609d3 100755 GIT binary patch delta 190601 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

Hs2}v?*u2m4nH6aVw!ZoEi;ne z^JgShi(JQIO?`X0h^rPaI0t~0Yo6)i+#`l@Z0-brmui)m6`m&oZ!x4|TpOkTK1a9Z{brmp zeUfbX&3}U=I)cQ+`qV%)2qz zKl7Mpan?ryM-&lJ1 z5eT1%e<|63T-4$90^F|HXNy*Dz3A=R*IsZxbhOcNx8Vw!_YjKseK)d8vpvz-^}76F z_Zoxgc83CflM66y+eC0t1R%OP5d{GEmwco4JRMKrlzMxEA`n9u+(DXfL7hC?2_ctT z(Uahg$bzmc8Z^cx)g>X;L60_omWt@_9OWGb{lYx{=m8xa4XCQ0B{~O9K_{%~5XXU1 z-NkW-K5_=r2j_Fz3h!ZczOu}$n{c&9uz!B7?b##$dXcn46%y)FzV}RJ{bl#d_FQnb z9>JvUivBEaOF-4PO&mV+33}z)a^i=HdZ8ua2lT%Km8emikf3biz%eio5HJ`J5J?K* z127iAz|g?R*xKCC*ucTbjMmOwMHw0hw1Kr&5yqnCf7_=-De6RQ&?9-h)F534T(X|n zJx&cWsoIHLzh7Sb=-Cvs7^4a~+7%SGTn20QxS^Mo!X0GIgBzZY(H z@Wq8=@uduZ;e}i@VTP0}oH5)Qvc?ODJ!6qmw-eoHJl%-aV^TEEb$frcBd*xkvcKlbB2EyHQGg^+z#;I!GwQ`*9GwChxl~M1{KK(zpMCY8 z`Sj^#$J8hpKgwWWl&udG;uLn;d}VJpYeA^>2__cHlEaP9)NiSeEF@SSa10JV>zI?I zo3fDTtTDkeyI^a%#MzE`&Kklt!>+4M&|9_W+;BcJoZWkhD#l{3f}TN~FedpO(V~!9 zKYvoJNmbY#dxrtqkH4r~!F9#y3M)%8u}KT$q%BgnR{Kr~BefT?6Yg(0CR{#}vo zSXX}7YyMj{3~qr!{hP;M=Ko3t8}9$k;VD|kVDK>i%A}hmNAVvLS_k(5lUq(n(B~n|AGmr!_CY9Fb5JE_CoR4BH1C9U|VZuoy2x7HGqw}56kw$YLQmoiG8&l zZ~ZzseT?BX*TXBIo=;UQn_*)|8q_A6wW zTk8;V7#v(#GcL|Zhh`0}kl%!wvL0fqz>d-m8kC6sb*(RGR6n|%M0Nwu;6dfr! zXhw;PG@Z2!B>~g+=s;EFPYv#M*#u(FmvKbL&u-cG59y~Y?T-geQ13)ZzSVd2UT85O zGVBisJE~Df^Hc8!L$=JF4*dv)8{*}2^taZy z_<5WP25o=6g+aANN`-7qE>6}76F>w`QA|6A)8Sdo-vA{>Es!}$zF6IGm;kdgzKf!OKn1d4v-kD-%yxvqo-SPY(B&KKnI{G&XmDmLd_CYKJegp*}rc`6E-@ zZ;dnJv+Q{l$BoCDs`NH2cXLRfTQyjiFG8t#uxMNfUGg>1jZK2U|3?sNV?Hs)4+;c? zm2w9PiVHBXGjK3)`k!d?b-51ozjH!~l@`0= z8QB|?7MCGr2gnkO2y*6$qr}B;d>k;Ne8JL~mj-n{of@T&SRCzffXVGGq$rB-Z1P#USD8$|hvvar>)wq#qye#f5yM9NfOpWYDdYp|Ns$^;h}@*00q1y3Y2t z&Tl~oZbK%BrwtX^4g z@(e4Zt~!TW0*;6=p8o(@y^0&${t%V;T(#koxJ`Rjq7FV0I^9dKyr?NK%zPK14BU zk*B`Zb}brDx|?i8tIu74%CA4ci5kI-kr-tIud9%uM_eIqT{Bx=>5D9f9c3t&UdOv9 z2|$DdeJ~5Q4L-l-{buRx+koKB55B0Gop2x`gnpT5zAT0N#dhm%C1+?acV|8Gx?5Qz{vJ$R+lfPe%7I!FDVSuBMV z1q=o7udgm+mMZ=S|I58@N?pr#gB8u^rG`M$DG^1i-Ybl53VbL%1VN;wX${|`1B66@ zL2HXZ(SDxj$2+9ZNUFYzSm<{-L7khM&F6F!LPP^ICV2^7@lN+G^O;jWcU0U_iG3z% z>85*1;Mr2vXc*mmC*ZIarjJP19t#f)QQTPg|B&@g;hhHGvT$tMwmI>{wr$(SFSc#l zw(Vplw(U&JFaNX8KIb|6yXd?3>RtVGuT@oD)hqXg#-?VV{ zg1m>ehc5+i29g6N;8obrF(+zlD{=7Kwc8PWBMj<&!W8L`0V1DuFWtfpx zs8U}azStIDyMd1U^2MpFNB)fYZ|>=SRi&7-$F!Nu!1na*d;!3|`ckWQPp#L_r8m8+ ztOcHxqGVfcX@0fFEcrJcR*Ljpw5^mpYTS3Y9Z2;byyov6T-q7DKyFj#s;go)mgfG8 z%;Opbyy#>ZCj2C5{21{eLH=7G`+W~%fPjxZugf5G#wEI$eDigGfmF!Fx8J;~bFyIlp5HguMRgss1;cWX%!l z9RY7-8^;-!vHc|+&`B?<3}sbMd!JH(^j+$n!k*w}=OS?sm_7 zK`iUJETytN_Z6c2n6f=o1s~Q^=)mn*@w3CdNqZisn?B&{1I<8rFwg&ys<>yugZsX8 z2>9{Mg%>Bxg!{f{!9O&%Z?4bWm=B*9*y`xIDgIiJ{!62nqsmmg?s53#YT<@(Gfv%# zso{d8U^B6Yz-(!dsk%to*|2vs#|a{Ie1+}${Y#Xy8MvEEw zOX^Nz0~%1iX1&QYFJG0-?s%eN=(pHlm3jy1T`s9waquziS8Y46D~$Ovk*7 z$~!=JS45J(Sv%Z56AS|EX2mdG6m~hQ8^Ouqan*dk_txHh8;ysXw#j?oH_O8O?bFKJ z*$sp=XCvFu|Cj1x@7NIDoUT_e6ysNkh@=+h(+HsURNAGd5Q;RF2$<3G-g@|>E*vU> zwGJtnG*LOZ7)0?pDH=j|7_47OL@*Hio=T}7jJ^cDis9fgT}{q#p$tM#;^mf+5prSWg(#f+WODI( z`4g}T>l-jCVC#!{0pP_LL}u5-$a5Bx{G_P3yMhEBmKBx zYJueW%riy7yAgA7HVu~sN>IQge4r4$k&H;u#9#_xwMJLOZP)>Ji!Fe4ikA~okeqnU zHc(dDd=xJ&BQOnqfTgzfJP@UR2AGSyqYn`H)>q(8@9z$xo$-SxT8Stb(;B%N8;EB% zk%exqIu?;rY12w9t{rPAYM*qN0?Ss75^K*e4^pzsW;ta6C@6Qfvp*JiG8jy)2I`bd z0%@%?ap|Y3NS;vY*M%@(nnUU5K2r%>2>K4(QwLRGZ=JFZDJK)O^vWM-Q3m#P?*NHE zez|E&KZZ4LC_aV;5tmSy&YsK0&J>o}Z5jN?M6 zw&`y(hbhZEnTNC=@mWUoNpleKZ%0bx0X2-Z6@1RDlv~Sqk|>p?vks3 zzeDWlU6)4W8Y-}b53~#2kA|`IE1e6Fs0PVy^SH2Aed6P%Z`C{tu__QZ$8@uQk{ZFa?N-+y+*iKs+@9Ojhhg?cw$F>9WB|X+fs8)1;L&#GF(X>dwaddQ zdOVPYPh+eiw(O=n7npUoHdOAf|IHUJxe=Lxcc3;`8O=x8V&Qf90>}El*VKPTzrR3u zNtEC~K!0G<43>TF zzI#c@`^Fzb(bIvnNnSTMoZZPh6=`huniLy{F6?Kxb7ZPO3PsRE66dG&r(|S%HDpn% zT!O-Brb0A{0}*zUSf*SC$fMRUao;MW?xUO7eyNo$Hr6j(xNt}0kM?U&!hZGp0hV4L z$t*HX;d?G0$-YcK{6J0wEMj7kXD6(#oSeKHnjjE)O(z%QUlv}r9!)kVx~fmJONSZX?U;ZoaVaXLBEsd^j>i`Jcu3e^v6! z+3^=H*ZCbDT&iigguS?l%@3!l1FUQM^bulX5n>_l&em{q8Nt4)v3Hn;@ZN;h9aH)$ zU})+}Ooi%)-G*Yo6CDSjGKqHTD3xA8*Opa_=XxqxGana{$auIs@0^$n&WJn{a*TL(sdgn9>}i$#pDgQ0-7cv@{1J zxeE0{cZDAl%1%eI)TsSo0c=6>GM4>1Xq@{jka?)9WTxvOv?8nE_V3H>a;7jp=6PBM z^=guK7#0&9vQ^36kSB3ODd6NIq)&DE+ejqs5L+IogWZj**{gq6L)inhk!pGOikj+e z%4ITyN#g7j$|viQu=^$I>5<_h%%P5iHF#53FX)cgY)YB+lvC_@00M+Dlb4BB5HiQ@ z#7tKqKHf&WSf7zb{Bt%a1N1}nI&S)k8WyQJ^6EXwB)B#y;ya4iE2B7l1_(MB2s$2r z1~EV+MF|u%DrKMxQWvhR#VL;g${FM{YgNK;>*nPOrzhDI&mC$hGR&>6$|2*4-D7D} zqBHT`lXKUU!Vk_kA6NjySiqIc6x3OU_!ZX6>xG&)GX7R0Uo%h(k zf7=kyx7gn*l)v3Ghp2-zSZOx*4q>>NWK4*6d$+PVuBjJ408Km$8Y&7|bi5Sn*<|cK zF;9zW`sP=ARrgLQnHBdM5(_?s*AmE?^^8VLB2@PVm_sABM( zZ$>1xk`#v(maf;KwF%0vC(h_fLegsQt+&K9#S{mL$c=+phiGrVZNVAZy~U!X`#g)9 zxewRvj{UJI0ys4(-=ME)*~8W zUmZ;G73+-@(O0#wA85YNqhX8TS#pOOOj;oiJ%9?2t)NoZiDzsUjpUp(>;XE3@!i+* z8!pVvdRqIHtqehZr+w^cI<){zG+0mOcHB;JCzq3+qF6^!pP5NtM$ zISWR4N?8ZMvs#at_sC6A)^#s4+j#qk*I&g){d=Nk?gt+`cFSaIN=fD6fJ4#db;P^q zZIsL+SaBM1ow=!A3gM}i_BO9^TsH0bTG!mE-Q9ERx!F|%zhY3GInfJd+-0Y#y&1N( z$5drbBWOS3_Lgu@X2p#MVI(9Au9NTanufJ;Z&W3d&*=kh;$O7|Ll~`z7k1OOr1XLZ z0+OXqGjIpR1^j@mrvE*3Cz;hL{b&7;ZodWR%4y@*eP14kxjqa_0u|4MEQ&133MOq0 zw_MI>thaMxm~cYANEjgv@T6K&_gv3d&*~Kj5xAd31FO0$Zc_iXQD1$RhC^Ka;#?qA z4!k7s;Mcz#Dov9PA}#=JUae>9^<}VUD$>|oBAIkVE_RvWuTJ!ilPJ0sBst>3^faVp zgaCbT*2#Z#Hxms^QlQUndl4NM&;^iDY%ru4?K+16l<7Ed=|3hpCDW#DLhv)`4w};_ zsW9%HPDKLnpzZ=l4Lk!5ITl((y58pIaoKa4v*D26kcwD?&NKk1xyViPY!hNlG2khQ zWRPHkSdFLfbk@OSI%EsO1aqKC==jKXLDFfbL0*7dV=`BJB*}>604!syx_~kAK&8MN zHgq@o%|PQ}DDsYU1(1~<64F5X?(A$Vp?Cc-a=k+@UR-tNP5DE0+_H$}g+PrS)L%RPm;9vcZNcDEz)5Aia+c{xa zC4moHKiZG*vnk0AkA4k4%Z@nuraPUX8{7Memsg60}chbZL5x38`SO6fKk~L$*h70=+|!DUQj`=nuez z7JUFKPMNrB$l}yVrogW4kQ{=p%&g_uG5ti@I%cEPJLxwqdKp!^14bBhh(oI6f9m5> z)>+-zNj1 zO9!YCKEDtDM95197i+Ts#}Of#>*=9d(9ZzOuALe8s}&hE!ACCT9SjFe33eMT1W{-q z$fXO?g%QIk|0z zsuLoGpMOP6U4ane4*ujM!3DMs;`B3=1Q9udmhYP>AgLWZLC}nDWM)=c`m5MuH)H{F z$9AR^?&`?gfLepp;$Kan!cMZ-X1jqX>4Lf|Kj5{H9OmRZZ+HF3mP zIc7i}=EXj(v8_SNW(6W5b)@I$da4C&=sN_r6hp3qL1ev_0{&vu$|$)u?!+qsV|Iis zF|oS|phIv~qlxPn)P#VDD@}wuC_jhQ)Qnc#6Dh*8x;OW{${Y9$+SKYbkinYe#-YICtWoKXZAecA*&D?D%uSGA z^A67pVJv%e>a=xr>`blsmPv_rXwm-K87IH#1_@8NJE%s|HOYpk@`XzbS33bfHt}m= z)NAQ{{|GfIv?T){I?sUYrX+?6>P$zOWO^xf=h$H#>13zX6Am^o%mMoZWn z=3i4~A3^^y%@<=Vy6cA<;|2rR#KJFG$?_*Z1_@cEXVLG`u_5SbrU7RI)od~H_j48K zKu2*w3s^mdwjPXP>0n$P5^8aK}G%ye$CwO}oPaZJO@dK9>jT2_PHNr;=D; zQsK}1|zHF>u2h~GhO+~wkSA_uBrL!Qcc01l- zY}AGB_y>yXKn&t6^e0qZYOOKQ!4XZ!==sqeNwRV5B(YwN)xx zmGcq;b%)#oJ_ytooIGqcjb5vaALEA3-n!l3YvTr7kO>0-4ac=#<&SBzn#L z-fW|4x>S423;fyivfKuXu8NkW5DH6iQZv!I;GdIPo+-7BelJ@Q_jsZf8L6Bzu@(x&ngO4R`O;Gx_g^c?+H#| zXQeEGQ%gqYFXYtMk0rIbA4^V|(Y{*Oi;;$^N)Wp93m5?RyFgub2_|N=wwVj>6bd#l zxza#Jw9iD+KG!x|`1IU9{NWKYQM3`S?uZ@>JTD4@WVuH&!mZk1paLL>b+(I=FfRxV zBIYZJMuOMBGY| z=180Z1`ZIRNws4b#{Q~!hYkk&FLo%)=ApMFrYS1|;=^8mr?O~*X;k4LDO)d_;9RLp z{P3p`JS(K?@XfJ2VFb{W?C5%DQ;=vnjLmh#1Mo~cn`fjhyfPqP#H@vL!p=w0}tTXtu2jgddT+B z-e@-tQm?0$1T!QO`&y>Wg5U;f;kinJ!5mo)Kq*Y7G`ERuOhK4VT(1$pn3fA60)ADN zh-bK%Wh$BE$(RA5sp|wyYH7gkX{mzl3y3%H(uw7OO;kF~aR{-Zm2%xkx!AYw-nSq7 z9>8c25NE|Yfx7lv?ENyFGg7NkCeOCR9`q;n#De?%PQu6YB}cf~{WSu6yPmBtl9i;4>-co~9>Ah`&LSMGUbYZX!?qvSV3U)0b&6#zO#4Q9 z)ju#%hki)tTP^dsC{H&40U~)=|5?{m(9J;;?fmI=8i7Jh-Ct!KE~x)`5%v#^N2NI8h*ld)mGk0Hd?T#9IuB5NaNeTiTY)V?*LlZ z-5n0JY4&<0!|)II>iRp5XG`7`cV?ko!fb34?pHRtn|^l0e_>Fqy3RX_=<`qN3v2~` zsXC&_YDVMFBEWDc5*_QdTNT2JdM_(8lN3^fn{{(rPI>&?;cLNjRGNYhsGrQN{W9Z#9%3LK8P4!=N z_Yb{36_^*|2S`UI(d4dP_|yT{YT-9VjwASqvtiJL3Qg3WGaRHxv8Q)J4Mp60FgBid zVu!^*7}e}OKvYu{lHumXrH@)73b ztUMVgy4_74+jIyl4>}XZM*N{;*YX4pxmU{lKKs4$&K&`O1aihZfZS@o6)J(Qh*Z-!mrZk2@1e`o3_}+AwP^d7J z{{aF)^}_cTBy0-;>t0^h<9RX}K(?v2(DtFZ5m&&-&VsaKpnL*>O}!ndI=lQbZTwJjavvIxrGl(Z&7$WI8*DSo4V!ng+6Zl4HWj_ zf8=oJe)O2|&!Md?x2LQ1;_Mz{eTD@2zcmp}k7xeCfG1}? zEN;TCvXY9Y%lC=>=>h7N)=z|pI{%2m9ntqoIFVI~)pA?hD9Y3+LQy>j<5Km6fp%9( z@@}ENTcF}OP!lu}_ZpMjbxd{x(5d7a;DZtcB94f7y4yBj+@tjrnHkn6^=gT+!8!j5 z)nFctp{knGn1JrKG5uE3XPe7SfXn2aUKS$F0K7s_!Pvy~%1rZqg|0Zbyq{SKIq{eq zY{1$H_EX{QYg~hUZqBThbEm+rT&m+BBRgHi5CqsOWo- z3?_#74^0Y(c~CSixL_r0^uZ*h8SC^x;imI_Q}8yalOa9k*rs;{|7F`T&VcqI zFddyeo@*f-blDM?;

2;$#B;--00*zj}cGpqb?VC1gn=zd{21?}GjR#&0!E`-5Ld z{~_CUDU!9tQ&+?<^Vba!`N3u|qHH=v6X3z5a5Og+#3d(V6J`K63So#`qV9w=M98v! z&Q879cVu(L6e!%?TE429>(w0)6-_eba+HahLYG9+iFD+Tcd9t1QR4KPfP7X>(n}%d z0-WF_;+K4t*=BVK;`STKmoA`^_Z+>l1!yqk$ZpdJeX4kM*b4#ko5JKiEswsw*Lorb z>T-QyOV52@KWE>^?e~LY97OV%mf5AF5rg^sUaUCCssPv5J9UEIFO;vpRp2{5-S>Xl zA0bAIjud}fcpZ)j|J@~XAs9C+M{F|u-Xi&`_%O{4G?I7#*%`gf zU0Xk2&EQO0OMhxZ(Y@dM45soILC!%YlptFjDz$HwIODS#*j3lb0pFZGbRtSC8la$c z*&EWNg3xExhYv0HJcTRUy7*($s;oCpmYw`1@;giPWZ@NRw22CD2w=la@K!{XEhFX} zdcl_lGs%3UHx3$8*tL7!RKMtsC+P|o*V#y^CT^Z-4SaM)LI+aHg@I5koeLt7%OE-a zD>55-Agw`eCe&Td?8ga)LG0j$Ya(r|Q%k;h{R#h{1tbg_fG z4%V$8z8gw%^F;D%p~!=$e6$>ymXp?B;2SNVTJIrCb1A$ow9Me zNX>x^kmemyW9quU;hswV`B#L#19GY<3Nr(PUpepSPf!oaMO zE*0pU>OdG0vI#9Jfl6>QT6np9{i(H4CgsFOU8s)%r3|EF1fapayLwmK1)F;tND52P zo4SdlO(x@t$&{}U&8Rw5v%>&4-aKH&$&PT|2Kuc@(JE`yRT6Q(qzvkrz~CUaT$wF~ zQA$qY%6JRpO}osCo-kU>rBH}N^563Ai4C;c!Ex?K0H+iVcq_8fvYO#dtkD*l(8BvH z2BRP*i|vw@D42s>v?zqFv$xEviavEnPb57)1?lxp_tC z205W@y>b!8q&fD?7uSZ(Lr|^w4alxFrHr-stznuV#X9dURynmBX%#rdnyL2LVNQJL zNO$@#+A!jDdQ?8jYl5b7R5I$=Wp68>_fj+befjh02ynk4|M+p1sBPjkNZ_eNMmFLN zB)RNwOGNGgYck_1;}6bUF=l!+Shg`D-u&C~i$4^nO#71V(dSLUp1}L z0zPn&3`%TT(|ct7RA7CmcW(wHsm;Qt|6W`JuP_0k2hLzo&e*G|GS+pHCLdv9Z*{zK zNFJe`KcM3eQf?y=P)Ro#?0~DBUJvg6PL=WiYVB6p-wI4uvit)&7vG2x41@48ER@oD zcD7$v!&AZ3LNV&szccW<^GnRtg;MVp*}vb4n@`nN4D6cqDduaMR;?)^QUC2@Ci^P) z)Nluc1?t{YE+ff7Tjliz=xiWtHK*3=gkQqST{`W!uc+@eJx>(DJX@_@o;Zv)v_Sb%H&0n=NmqFS3VJH22}!A^3) z`c~_OU%DrqAmmCIxDkKJXkxpL`feo7M_RK>^~L&`CcLjZ4tf+09WzZ(6iG4;nJ*lg zz7i=5GtH|Ppc~1=TJwe-NfbH&)PaYWa%RJ6l4>NELibd4NNSJ+;~GEQFGm_#(x+VA zfAk3x0OtqZ{r%(X`{{L}b1tokp5MNXuUYS3=ir%zaDZ01Y=ucSen$wrExrkL1Y5T&u>S08#(y&TjU)4Da1%i;f5}Pt;cc+tGDm z09~IK0mgKXufXg+O|OH0b%#S+9$|RTD{zp!M(a+d{jm!Z5G18@YzBGwNqc)Q210=o z4lYa-V?(53JqBzK-JcV8U!f>rSY65QC@NXbR%^M3EJoe}9nahm?Q`>WWWwr_U=h5! zfW##|0IYtoq7c}63=kgY#l)G8_%4iHh(3{_P_ z+o4LRlrQIHTM4nUIPl%x00K1{S@_eW*F%Ly-I$J9^f0JB6E^(zd9cn!FkGbpqL_Ht z!9mc$XV9PZ#gsw(b^X61%bGVQGjH26KRa9jg9y_`lz|oA`iKtZ4XT?KS3O1p@JQEW zO!BD!dRhA8m>POM=*R^gv#KXhsRZjBi3@b(iIb2LpmLhw%yzSgl<0&hA!wHoIzuc} zeZ5kF!VR&$rS97riu zNRRDn+L*t-(3}j#;H%`rXTZg0e;{zKgSVf5wQ4MKt0mrnW0I{qwzg;lA&mSRYgcoy zMJL!0Y)LdVS3R*OcG;R74#`Sm2EO|DCqBa|%q?v?Et-3rEr8;(MT3PRN(PH1yxlr- z`S0oPN>0Z&`y>mnCG&l7noNBr%ZN{KMA^A!cQm-xHpnx~G%NGxu z*v3%8`|pO*3VCQ(y*WaQ@EhxT7Gi`qHLS{09#cO8AwjzAnSLK000Vbs%jng!#YY^b zP)Z;k!T2(~wk#>i5PA#!QtDKoChJTjBX2 zeTN?e4Tvva){;-wkcU2|STA{9ZYX;UAqug^Aq+~}+H$Ypx#&i9tAjP;P~vLnNoGsK z&c<)q&j_FtvxXTRQoYv5*6dn7U+!<<|J#Muz()vUANe?M{yb}h!24fkXxcRz80>#! zU!^D|O8;5^g9w_zwp8Abcl{%6{wPJe7*Vw$G z9mz=+iy3AJz)SGCqR|>{Vywv5!->KhoKPYd2N}FXZU>?*sOXYg7=8qqEp*ZN&Q&1J zcn`DjNv^QyHYb6488j6d*2ZK*_E1FJAOd?QHAc~>YEin@6lIP|f3O(b-tzO{ztrr} zn}aP+K9ucG+UTmvSW{Tdq$&36i^~(0P(~;<9AOCn*qZ>S%e{dyWmb8+-+i6eyq~@C zagh$bZ1Lt5svf?&ur$-w+^)m!4h5RrAk~<>PiQ1n=Lq!qH)s9;C{?uyXl$2#*kYjQ$2g;yC4{?ic7eU~Ne3fmjR8McNbOt?ngVUlq87h&VEP+?fkKE7>N#N5gO`i*98nVXZ~0BktfX7mC1=yO0%Mq{a~v*(w}u5wl3Oo<$G_5e6#_p)D`X`Gh%lqipgf~@7)F<~ zg{o-Yx#ZB-E5r_;J2Xc$v1v1HAd2ZomGc*^h*Of&m^5uH3!q7g-{dsHC0p9(0zS?n z-s#*rzMo%v0N-%fb}mbF)IpVs*>;MUO#Ze!L#jEN9a?jN;Y}!xsp(<^tK|R z#wDXBdRzuhpk6lMlWs~dBvwdBk2)qx+$MJFx9raL_E9Kv;nJ`9fnF}U0If@dw+l@iLx}Rw6%mgMZ zjk=WIbXkWUEwlZWq_~Vi$HGS$-fdgm7C!(zS;bx<(O9FY3sA*pwRQyXw_5GNsv-^# z`B$Cvdzt%SD2wxng~>AFYKmY2lUnMiil$g)YRgSnoXoHPiIjpfUucgmLQ`q6=YSUW zg|AA``=Q@37pv5u?IfD=6Ghof*27|DKyuG_o5yBORYts^C_v{mj-g|AZzt%+HFVK{ z)ZNF-^)6X&7p~@>tcw896%&JuofP>5{#;sB5E@&aR}iTjN!%XSJ;x&cX~3eknbwQC z(`CfvY}(5|xG2!%P#4i+cLT0OgP$N+Jy`YNjoaNa+x;UR_#Aw={bRY}8|Dlm$X;em zBM=Lkm-d3Z5$n~hqGT9>GiDZAX(}szu!8A_8o8|is19tCiw_``p^bCf7}^G}HTn}F zyrS%po(JY+>*{JOLn!nC|M(q4oLDPZ3PfHv$L--m-c+d2O*^q69jtOD68fQLUFEhB zn;6T&4hynKII|?CvvgSN6Zx1&wO0Cp!L-{d7=2O4__vFH7rHNIgdSui#vdS!ORAiE z;OT_jpbGN-8wEh*;IM~396|6?e;Xt&iw6h34;ERaTtrDA2gEl{FzC*z9ccMgrTX7p zP#43>>4psyFYXbh6b1bBJlF*a5E8z|8BKwq5cvrw7!hS>E)F4`5Vb*dYo@%V6sS6I zHLn?{mqR?BkjD0hm*RJ0c<0*lDg8TzocLv$#m-BT6k7mc(m&mUdXn~~+qLVAj&>J< ztv^J@++oquI28k^W8TR3;T4{ut{CM;bc4hOQF*Rgb2vX1A^toUoO+$9D=f-cP;W}% zO&38+^aU`o>aTy%y7DW%^29mPI6FGaaYPoRHAE51d#?N$*8|K7cHI8>6|k4P;+v8; zu&4-)bFu^IE=k~UGaQf=2~+~n^nV+sUkOxQWzv!^^Xo>!Ao$2zdE8A+_jJ5*!ouY51G_QgXFuPW9!C^$GG)!Ob0m2Fx^CFqRJF~Hqiv%vPF zL8oz&g6ou?Oxi2d&O$gLik~+H@lkMHr{Ek;*@`ni{(2q>iM}=Io+0*VR@#xYR#wbV zVW9ym3W8A-)Q~j@CjRE^MU1@}!i#NRRuio{5!_&4AM3Tfa`u5{DKOzapBOQJ3-Mrs zDh@g^(Tqo#=wnG_QY-@Dp=}VXgWv_jePv=d6B1yC`jsAe5JAC6j|FVtM2ZZGrJ>-# z&OMnJ71L|3I0>3qn_=){Vn$U9ZHbzj82<+#LDHj|yGif1sHCH*Cqg_jFo%PU-up=lza6a)|h_vzM3Ck z6=u~If5Kh>C(m9D)PZwwRU`-BUm!V1vQz!NmG9~>uhbU}Ar3Ftt68+%un0cv8i{+1 zRc866y5fl|I(MM6p-p(#692BD{3bk@0gCHeDi7SlDMd}Csd_mHKx$Krf(UMhG{$o& zf;-pg45jAK1#JtY%||*_r4A^BajF1hTPBRNQbq5@>IejwQXnZQ4nzkYT}5OlYXl6- zE&MV7PAA75CFMU#&^upt-2u^>HLgn{OAmXG5eYt2cwK)54Yvae!BoXdWi(j%+k@z; z#NZ+2&|;iRi+z`+pgQBDvB#TxQ(^k;vS*MKa}-A4uiy2~75H z{+ZoA=zH|^JJ#;}q(=`lFH2-|4H*T6s1}j8qlb)JzdP0dpVL@94?bDhHIWCdIKG*+ zYW%%C)trE1vNr%YfH@+$)!p67DzY4-Yx$3RsYqMTrNmsE?UQL1evSN^cNtqVmI;}J zqNX)PRGBlLST5|s-LS0L#7`<}z38F(DZ&%^A7aJC zdJrX(2FWwxQ0GK{m7s5u32!AZX8yzE1C51Wg~6DVzkeYT0)zuWfYTx7o72bxD1?g% z`)r%6ma}0B;*Z)S`93> z>yKRsX1@(0L3O#-Ja8oXNhSk3(W^3-P`LAeR3p0`EdqM0=_(qzH<6Irnfey3bM6TL zPnFUF(7{mK;vs-fK@gIol7(Hi%6oHRfq-g>|CeGmjSvG2@ju-?r$e)n1X}6;?Cx7M zE!{T6P`>JvAI9e(ERu)@a&V?1tH~3DCt^i;X6JFbA?C@DjSFz$=^c~Pf~N5d{HCd$ zlCn)Iy9D!r0~7K4_L5}jRF{@i^=)S$!-M4xz4m+{$!(Ug>})*;SPJ138#~_sT(N^o zkFLA8!HPoBqzRM31VT~41Ur z$<5S+e0Q2^$V-_kqA*z*U23d7+Ul8%oAnCSs20NRxREg>C&q$@t9!|}O=<8Iae#eo zt*xi-9Px@y7PA=BQFRlONPF@DzP94^TK3Ollwr$RE5^-H<*f!b*f&>fS);~0#=dhk z^NYqpjC^6keR^Jpk@J~%FQ2)+&*#(@LiV}Xan_m19zHG}4_*K#vSO{Iq6Ky1cF;Q^ z?s2zhomQlt#LeWyELe<}v0-vF*8OX~XypN-ld`*s*TbnJCwGpC$3z7HV!dD{8*~O{ z{4s$$Bf{1em*H}vm~&(hkiYQ^iPh0VT%%9HvxmCgIPvdc&S zLB4TpoJw0&6|M0&13YBYG17Z&m|+t`#QrgRsP2MTwD0CE4shu-EUrd7CI?n2gWc|E zeZVJ#ISpNc1rQ{>!WSlhp0>@^sona?drQ%M)&5bN{@)+C{3idhff+@+z_6`Ug_o4w zHCuNGGkX(+FbW5Y$3!jGIZB~AkPKwHF6-ie4bENf6y+vziFI2nsfSq8L!Y@66zh`C>Oh2?1_Y%dcg%J zg7HbU!x~qj?M3+!GCQC@E?l--$Nz$bBDjH*OGVTd z@Zh|+^frDT)PQ_bzO>E^d%=KA!|9na*~gY4yT;#SM$9`7?I)(I zN6p;;hKU}4y79ap;?eXyG&F$xZB2N2bHfk#n#!t@X7zRWtaSAK*xKM={wEjr*_3CN zHnwFi&M~%!{pI0c8bbgL78w7Ozk=i1*>hbF1?XiBOFdfwjxs+(2}e@dTg?H z_ggTN;ED&12@G(GUZB9<5Jxd69Y48hPMNFcZh!~~mFwfV$Tahwzu}p!mY&W%Yu0un zY`YfUwuH&(3+5Z81<@`p*iFQi^V$BKfeO)?YEsqNPp7tkXWoH*g3l5s2}<005EAp) zNH%L_))=}Mx?tN+UY?lXQ+VjP9THYrsX7@Fm98tlrh#iewf`oT@vP=@HZB0cXVCt8TN?#0cZpPY-z;nDVWE$e)rf zYoDqIlg`J+04SDLSUc;!MV0&A_FU-NFlhRgc_SlameQbf&=Tj<7$5NMhs*e z-&W~5mb7ifrgQA*edhU~hjb1&&B2>+dJ_570d7V;(I|_v;P#8UoqmCGa1Q zDhusUfckvM7T7Qx;a~Z*QbKKwA`p>ImiWZ!+^{`ZhFV$(W#2w-cP8?HWf9*uy^Y@T zJMp;ZN~MxJkDDG#-nFSp%k=m`dB=fb;T7Il+{~)F!Q7xVr-@ z&%w+NO6q~H$($eOWX&9JVaILI-^zmm)ILd~Sy;bFe+P`P40gCj0VhfBZmYt+ZZB+| zZ5KslGK8F6*M+s{i>_z_4k}tW?X8vaTwO%~Q4eGk42|}?saeEG8j;pIS&z-llE}m~ zjEp-`S%a0pFPe=I>A<1w1<@b3O(OKMYzr`RT*@~V`yFb9v|#mcdUt(~%*(8TQkV+U zNr8jusA_UaxIYhIB)EZHGX z9--(;BQ=mWiT8>C0lF)Rvn#A@CaqKKQmB?@4NH5~DZRVivs(os5kz6B+=VtNTLys( z&XY2Rw^kH-YEVp<**e03?ZaqCV=s)e`nkX*U(k);wpTY=eDeQrzC#4GQ77|o_USZF zdC1}3Kt;F@kLx2Uv=79}vUu450y#Y^Ol=qeG@rUjXRhoK zQ|zq~fq0;~A;AEL0EZ^&!-I2uZ33Fao7^Ru-!Qb%Okro8K9jnZ6gCo|%r#X>sP4fj zZqkv;Ft{|q0nIO1+m;~1OxUI@QU;?0BGPx1Z0UQkf#h8i4@&upzlI(HD z`n)BR9VSk(nDH$L=!q>y7?K8ItN&=zM?Sg!`RE@4+*E*q$tG68MI~FEu2qkx5Sm7E z(MGk=Sqm;4OAeOWi=oE#F{0$Yx^<|~44JV)+P%K2V_$&Hy-J1Mk#ejWo}&bUXhgh( zOG7lK6&D^+ryj;rU?Jxweu+lwUH~m)1iNohw`{J$vHW_K`(3A6uj9#}UG4lq^%LY~ zCyL}OFGbM%>h>>N;6qiuZ1u_Gv|XAYRy<`p=5p&wLgF zme$7!f(tM4dwl`0Xn+pMS1(<&mh!b5M~_V z8EY}|emHb)-a`VzsMUCQIyyUWQT#dkUVmMSOx8~Kn??P`L4|9q-(6=MnhH6qT=$|~ z3Km`Wtf}FGq&$Ke#6rtKM_7kSEOue#(gltO%f%&}XF%t5rWM&w*ZbLqp^lO}M@3{T z^5guX3Iy;Q0pc$VY3Z|29Xqx|U++D!u%KW$v|ywIhadq__l`*&h{nAl}Aj$Y8&V zmSJ;W=hz43RATF1^3G2~umbAh$$u{ky0cLz;!^qjDC^Q_Q<`>6H~+|HK<`(M>E;D@ zewK8>6wL_>B@4LMn&fi*LcDU74`_;>Nzk&YHShYW+(j~e53!7?s#aTMmm^gcltG=o z8?d|#TCbc}Rxe^kL*Y)wMlAC>NoUyT=xRHITPJMGBs3$JM_nsXxdIY9c`5}@qE);| zlK#8wNpFNV=^d>(C_|>YzO($xhQG^J^Bd^@468sf)bYZ?cCAQ9a6mvEbpMg9;Q=fR z?d(i#xc+R#xP8#4Yzt?ngTKziL%H|YGcJ2qszp@ zUuQ?jxk3j4q?+EHXb(hJSfcdv%kOjl+l*5rFb@IEo57;SpeB_R_)FIT?R%WG(~F0S z3!nf~SO{k*WMbqdn~s=+Nu3$O$}c}5#|E6sMg}irHU%asi?P}t`;@9*!ksxi+N~uQ zGYR?e@o-UK)0@$ef`<=lhKSA<8pJ5f_W@C4YhcH=fWH0-!7u;x|3kLUU|VpS)^3P~bH6@9!;$b;4l zGf_Y2YI;dIdSHvt_3!!eE*>H!E49LgeCxIYX_1gk6H3_Z|5 zQ+*oKm{{C*%t0%qWbXyB&~y6>4Gf8TZ;<@k*gMFSCI z=pHpO496c=zdTMDw4e1UEtKRas)pgBSM5!w)b(DW-}qx#J53Q+L>MgwDh|Y07o;(!o<*+D7#%^ zzoe&mU~S6SPY~B2YG`rhXN-6V77Hc$1v6qOlWX_MuoMApqY#J6Kkv47w#oZAm%}W$ zVEQ~b@!h13u4}n0j=j7%@DYPXEJs2e0IBE0hYfth@Ygza9gOA@nA_yLti;`6t2{Ks zQL-O*>ZQNwORAlYfGxr(#z%s{iP(K`?l67)w(0ZWzvZDRdURl=mt38(`fK^8E#uCI z4gYS|;ozXLNI{YOzp_LLyNZ1r5oF8t`ztlj8n~id)ID<`2Np;W(xY4FARt2++4V>u zp>B_Njuf&me_=uUF#nvk+onxwDO)g~YlgUPsb+#g?M#Qy0MI?<#WuU|42Qpc_6M4q zcRR-o59P2$!5cgkx&ef4{rY`3TJ+XgL(_nvd{r>)lUen&luG-1U|Z?(aSV5qD+YO! zHU0(Ygn6&U4`<>rpK zYkoGoh7fc8bhab@U8O*zXbs2a)!W^zbE3prccZ@sh=dQY4D?w5-hv&Fn8yHys>2uT z(N2;|ZjswZhl32b*W9GDy!5>#J_d!`a43ho1q#7)rrcA$>>1Ls-+K<6GqB9(yT1h& zb{J};4$}c3;J&3KdP99W`l;W~$9{>hgN0JUb@Dve7|0Us9#eR0iVO63Y(yn!flR>r z7^CcsR>>epDO?r_g^&(ctdAOhNq|SVx%rCz zh^U^q+=w7Ww{rj8t6jvWBMXL)ho`0sJjN5zHoc4%u1i5ED{kY6WH_oWeU+Wb?Z99D zDDN`mel7FN#Y?!dZCi^y^Se+*nU1zcCCv;17=7ruKA7_wRxs&MK&-QN^)xY2f(w8r zQeYjHWIv|O{eGF#P>&kWt*%PZfx%=Oz$GN+w6{g5=q#C~?o{y$b<(TB`MbWbeqZSO zvHAHb3AhW7UsLB?tF&a$huBh7LJ%=EjNzesaiuG?%Qds?MrV={`R3cbk)W$9*85ik zK1&P_@#hy~^Lpdpm&?=p)!EXRj!4_>Ns1gXYr< z8;dkW*p1@|TJ)kd221J8VTB2d18xC$iik6&?#3T>Nm80licek7$Mx6*fcIN7 zK7~hp2-rf?sO|=TOD~b}?`s>?u-60x5=a5f#@n(2W3OhmM6Hf;1JCRE3MUo0lOEz^ z+d-m@aFOya=qrXXjpt&lLs1p%8WLvS?Q&@5Zp3HFmbDJJ{ht196Ei`REs>a~;!8N3VeTD&s%q3_2fzucZu%-P z-H3laT($(u`FGeLBN?mKyqSbrjPBM|Q9C?JKFyqg%lp`t;e(rSH5^(NTm==-`HTa~ zD7=pTnyDjIHu3fG%{=_g_{@B$5_N2zMjWebd95TfM$jVeqUL@W(mRZv2#oLa>MxPL z55}XMV82!JKYKAsf2KD01(0?Ex8Ooc$gFlhQ*AG&N~gJ#pw^5C6Zvf~Y_eW*PHpy` zfyTOiKvVf_7lfaTRwL@+DV^_Wtb&#)^@en6HBBc1C7xrRK~bpc;b@IvDzB!KBZU$O zYChas#uZ2(#8imQ)LCde0{;smAoEaJdUwpD! zlQ8x!<w$miW8v{pM0SHaiO^sm;!gS~;oU$So(aYc-&e>Ib!cfjHu z%lAoc#(&alZd0hAcBa1-si4Dy;GB%ITRDC(@bBbeh3q7<#TTi={ z%QrRytMF?3f@+;K1*IrWX%3d++NPXI@INq;H!J%|2DzDd{PlIzj6pqrw^dP=*3p9b5Nh#($yztiK4O&bjF zrpWW0>pG4;Ry}pQ5o5YVA(RWQwg~x*l&Z8|H;WT63DGmcOG2}ax8L$#tdjRpV%VRy z^QR-2X@HI@a@IG3NVuYr)u?r_e>Y1)i_-?Y@}5&^1u>2ke7w&rOYBUE#I zQ8Dc)U-mORUc`07eJ=f3R(-YMVA& zO#h)LMy42b>tE@;h@_RtE*%jg$yhJ-vHc!T>!}vQ)J*c^O!@2U?(8R9pw?ik%j!Bi zy$}Oc9l9)ZKtxq)L_`f{8Vq{yTJKF=_o6c-0=w=-)=Htq?<)q(R859w{t5F>$3V2E zC0n@WUt`Y@u?uP#R}x7k6Cnf_6ev;OMJ37byNJP5+&`ZC>9b6%htlvMRQN87FF>2}q<+bG^DZVWm!rxn_(fBEWHCJ*3TE5vt(8H%uWo^K_Zd~NJLp9xWr-Evh(CE$GF8F zld%P8rc_(T7wqCNqP>}+NF+k1nQTxuO8=}Sj6F{GGC7X=USHK@^)*-*QG2YyW;1qp zCDy-+wuWXwIq02^QRY5R^b2@@Au$M3FqdGzoT5|9O+ho^aGY9TqP_!q`Pp-rDxzZ_ zrMp0%Z))3+Q7cb@|4%3&gBLLjRITVI7UrB#_NZVMqtN#W2B=f!< zY@=YgA1kavt}K(nNFdu3q4b0V-H&yoc4&7k`QX+qa=Y~AccOHtD{8qE;oLBq1C=o%TzMWFY!^=rv<0ar~(7 zO4~X8vPpGJuCzBwrnnANF@z&w7#UbRsIS+|uLC|;bT1EW7m{6l5Q4zAPXf?5bHAa4 zcV9UWmEe9Vr19t~v?~l80l-CBVaFy+2GF6)`wqESq;u?(-V{){>QKpDBs*7VnUUVh ze+8XeaTrc3>ZdD67Vp_{txqdT-gu$ODVz>QF2bOIKG*x7NDJ{xnXdYY&lL~OZ`x5H z9Tgd+M!SU6$* zo9n<=`rh_V@F3_uP@q%%7|6e`5dCRinwZ-P@~zkD>s=9};L|AWIg>GC7Kikyw#U~d zu>uyPSBar_*6CN^W`M9ZHK$IUeqDc`YLF)%$qC-{FhgjQ1Yjj-P9rlHaptJ=jBkim zI1hKz24-hYqZi(jB3CGsCdL%H!6?5Hk_4%tiNz(e$unTSx#ma_-7Ix41E30~)#?(o zXY&u5v)40tP$z51p)iStbXFXm!+)s@r^EW$wC#npb&H0p008@Di#~L{ooPp0s+|qt z+8VPWex2HZ6)arY;es6p;mAbpPJmxodpwGf%#|KAGAQugh#TX#1;QRjN#3Gh12X{v zW`bgvnWsZ!CY{-4E?UU@`nlIe(kE~3tfg;M9n8i^Ey;(($3bDuA!NK@hCCq+-LYp@ z@(uECKtuG$BA~ZHxNf&_fDaimJhS(tbV$BbPRf37$aQa#;l4j6PHd2an32Q z@AV|ps#SNo@Up~jRZk! z=5b1TiS#Wl;D0KfT|N=5Um{l&oDuV`)fY1IhN8rFd`l@0JmY#aD+eJ$BVH>b{mzq( zv;QO@pemru$uc7d<%Wy0 zmi!wnO`_SM^zozo0+WQsGs>{Vgv1oZ-rBdYg3}l&TN6o5NfrDlP)nkqm!md{=nr3U zC_YsM4}+(iQ1QatFb?C=6k0Fdm73$RPshjR#f9O|d&>n15i(_xpPY#eSH!3ROa15v z&PKLY0V1HTGe(6^cl{#1O|!O;&NF%IBPI|H7Tt_8^#}x`o4CbEH!*8CJa82{t$R0k zcl8XzOgO-dT}J~Xwp(s~V{mr1rv0Di1bp-8;$xVRDxmUyvjfC;neTLvm@T{xqe=aT z;XJ~)=k=30HH484A7S;}-%r2?UNC+5kv458$O6EbCx1UUH~a|K!~!Mm-}A%7H1#smxybo#$MrU~g`xuUX z^26RGjy`LYeaLMX_x$KkqRfg`dlJ=Xm-*qs3mQhsVfG8+uFa9XB)bcqnJPb6<F@AyzCv z^ttAwUz`{f_1ElxGJ*#`@NKJ~T7%)OaRA<8S^XR-i|=-oqK6L0-k%j}FID|R=9MSh zmGIAA+cUsLyFWQ4W|OJm>n#^?$^{Oc_6jJ5wG;Aa#VcE+MbBxPbc)W$^E6X?6U?FN znbZ&{R4y6=y(PK48lQ_1p*wyU89Ye~TVdEoJ%{JpuA+}$sTq*mx*iom6YxQN#sPab z`?JTRCb@OFnsR$&7m-B=vlP7SHw@pj&CSSe;Bc&pvz{Q8* ziRFbX$_oktU2uF`;t*!Ag+TlbzW~(Aq=~qe1q=0G$u=m6$Ii#;ka~)?^+i2dm_^@J zn=RIN(3sOEEBce6M3zVVY>m9vG0x1(ww?p4C2EgtxZRH}hi-vxsXy8K_Vw=-zP?KK zqu5>k=zA7!zIU`|GdBSByzD=YjjmrM_OrE;Cta^2$(+YN0RcfG?L8W2!vJ_MNUe!) z)VO)LxyBs+w50reubCci!Z43njYMWcmJzzpwjFF8E;J2PVewn>beU3EMLMt5uMBbi*f0h0L%Je7k{ON^8*@GG zN%GmSXCLnf`|w(3t!_qQF95AomG57rJscYU#BjNdRg{LDqzJ5-FXgp+dX4G%XR0e$ zhrn2?S{h1VGs}~3ZvuxVTb?+L0M{$e4AA{Wt@#dt-w@D-f&=fm7fdU=f{R}22A4lUVYr6}6=S`01~Gkvwg6SyTdO^^qOa0% zWleTJw!xUote}9ZIc9Ups!Gi&<1U!62h))-oBigV53lC}Dvixq2H;f&HZ9;4&(b41 zS5y0p5voQ9-w620Q1I8uKBe-Sx9e_en2xrMGKvIh0+<`EnTn0zhoWdZw0M$iqm60N zH+EoKfLvtWQE=VfJiv}!8{Ae3!}6)5Zr$%=MXl4I1`$E&M<%a~?2}*}eO5i6%NW<@ zl+6AL$G6JU4!ats&gJ*_`bC6AOBJVYK+NLJ^vQ3t%)?>2`k_XgO8nxYpw$cbN?|L= zEoHw!V5M$SAm5WI{F>YB%Xs$PBH;u}@nrMDpa#6B*dE80x${i(QkOO1tpW!K~` z^C;R}PvWsjPa;`u;8)>S56z-l45NLs}* z=ve+FNnVP#^Og|r7`LVOJ57Dlh!4Y|T*`qbfjqDp1|wS}&7lhlBjEjVinDyU)`*tJ z7Z)GDpXXmq>I8z8z;~*mjNsbFMpj8<$`x7m3A=_NJme>sH51mJRb!-Vq9we2j7GSP z?F*cPg%k#6PO58NnG5vpq06|%L7F9<#qFG8gawB%GDeD5jwU&MA3F40CL-2(HryFC z9Ym%gw-NPYg8ppS6<`2qovapRXv)|n$3`o(16cnT%dsei<}qHvh_*g@GF}{%VrBv2r$b51Avl{16kzAvM;jGKv7cZ zegQ~!xpkk&KTGS9*iCg9$-3pssU->ccX}!a1qSg93BhfDb#SMBHGeOARvLD9o zC`s&?RQ71!Z-9@0>7EI&2`F;%u2#@&I#n2RM1Q}!GtH#?_|7po3+VD3Qyt=(DTyIq zXMn?GzNvK)Ma`q2Gm-6=7bx0V&-=Y_2{j6L)RJ`SXlWrTaul^LloEI?o<3I=`Y+o@ z8)QpTrb4jJp@A}rFs&p7o37<21FhLHLb|lM7&_q?T0jCtw&2&tx60wln|+?;V@?lGl%Pi$0TN|FOGnkS>% zccKnl-oz~|xK7w9ZvnhdO-Y#Jh5g^QrRKQGs1Ymih)*l4GsG@86rhl;#;quDUtYC+ z0SgaadVmbVi1waHOFTYLl7TZYu_TmS_Rn)j<(qMNAPVmx%BMrPgVMpezzSv{|;^rj%!LGU~eE`tG_5B0;&eQ)flEsWPvOO>3SS+B|xcLqw8jT)qGsJNzCp+9hR z6uPvX);qXyu!FVb4{7L`my-du6}Yh$J$RMgGWyy4)RBe_joclH89=Jl3NC+a8z*F^@y06#_0an1HKk>DE&NhMq~>jFjOp`BClh1xkcw(d1ue3A zse-ktMn0O^BlcBKen9d$9pmCaFy%`gvjD8joyuA;QZ_e3sVB)DJMexxGk;Ws&T1iZ ze%r*>jHZBQ!hw@J=2h|`kdjBjA2Dv*p~id?K>kSLST@68_3iGxtFrdf;OQuObJ)H+ zixF`bC=Qeoxja#l|C`Eow+Gi3L93B&xEP+&LP!tc(1RvDc>7JQ(=brF=4lDJiUZiO ztfNwFXM>#A3TAEMA=YWYI08eDELhK#Dm+L^ntQaf@3sA2b;bdW50~22k|l-h+Mri4 zDvd~^hWNAdb%o=qN!HWi;H(kO(}s^736qMoZ(dOYF~y4tqh$BL^nFm?-PAb-?{I>B z*-whWt||>55@OV>hfLgvJ3#!%fB~r$<3jXrDr-<=M#PVbGLfe=iYb1gdEFNMR5_C6 zQc+a=)=9-eokg$MRG54tVw{qgk}IP!QUc3)i8&b*a8A8*VBtLBIiUMz(?3Nx**b|O z?N|YUVVE?8-<8rYKo$f+JL9W{qqUs z5*TT!x^x-rUG#UXq%HP^UI#7eiR&@xMKrh3O%C+>9SKOmRmRCr(1Wp#8)k+UTi!AA zvBif((*Y>#ZTdg+)JHZT+E4q}?~0U`f=wM@3USp*x^ihblZl!_{N6Ae3=gX<$l(h#U=Uq*PW~n{MvH+id*B7k zqHcCmWC^Bt-_g0-c-9JJ2Zz-Kna~HzoRB)rk<0k(duRxIf_-L&6+L3&_yz`$$C{`e zKZINp)N6LVPU}xLn@XjUd{>QFRB3{s^dNumcGofom=);F{pqa!s=tf zS<4kuFutN1_!ERH;iTATpmq|!!2*rLJ9T<_!VYW}Bs3#&g!#v`np={zWv{m5VJf-9 zV@l>ZDsoKfx9Lg^_JNI2mKnrmRU0Vm9teJq3;jwGW=jh}xV%qnqWI|;fjwvnLI#Ee zvW*{F=L%EonyrupH~`VTdfGE0`$KF~!_r*}?1PHXZkotPWojlk4CfmH55>eq{DYK{ zm~go+^v(QfLzy!hg@1>t=eS1cSr3fzxgZX^X=FL~eJw*oxSGyn+>09;FK57NE3@>R zLG=>&kN(RXF{|_SG8c<^8NT@+dSU6Ro2NUvR!lN4Ucpp-R={!}n3Wr!adz_^_iI8nZnP!Y6*OOf?_F)JPLES;3m*T2V zsR5*#4(9R?8^hrf(9HNTe1raa$V0CSv@v`xi+Y-V_Q_c*l1aQUCY~atO>d1g$1*#{ zh$<|O56rJ%2B{2VjF-cj`!sJbZRpcXL+{N+)6HqgHNfzIJ5^7J323N)Sz(7=>p-gb zR3SIR;IGfFUoZMW+A(iz`%_8p{FWTVT#W8Di>`~PeSJNCo^sI>pw*;h2^bI=hr{g% zysaWcoW5`N_QNyMUDcoF#uRuBlfL=N6vpkOEgW9Dwd}Cm#pD>f>?MWnCSh|r4`5kR zmA-ArqJXSjo|XsnD&joR&;bt?7r_o6A9yR1aWe#@VNvwav_=hIIZb8-TE1ZMOa9G~e)8|a~XfTgk*t(K$J^odSrTMNq>dPm)8YUw#36IN6u`34ORuDXQ>*VbQj|TbmQhjjrNHfp z<&4aXxFsi8`>q?4(!MhT7mLoHQyjhQMZI!Tjn-~&uG0zymQbi8U&fWt1#-E&@aab! zotPpe*A==^z6lv+3>sPW35$LG-^II#l0VJ7J_KRKmz2D$uSD>tr2C(k+7ifra0f(CIe+6SBS+x5D>8G8BbBWK`|SlHWqq|w7_008hcqU7|v zfUDPkSN{zU2)U#jMBfZ@+%@$5>YXO&)4RUC7V!7jzQ>9t=wFcpWH?X>|3saN_f$D*4#*LjShmoMZn@Gr3fFbBXl_uyN?5qcV8m6g zZ|qn`u>0FF>lBaTiItF0-3UhZcc?WdCpHgixhDGJu8+EA$z zb>@A3`axIy)u8D>mu;Kd-aqDjn@OQji5PbjK>}(?aZsC~-6$>%ZRH;`R%2=(uVLJU zI!3kdt+s!RnH#RE?ule(GkAFU{2_s4{9=MtR3q%P?<(Iy*`igrQEy>>0RV1fe|Ge9 zQN~R5?Wb&2UFOB~YiVidNZiAB+349CNra6Pd~MHx^_Nh$d9A#>)(Y$O{V#^X+WrIz zvCxO&UvO|$biLgaD=F5(?*(kwg|MLGBdw;q**DF@2Zbqy?MOJH{)&v6N@7ey<9-6+ z+w96NNw*Qo-Ud|bh$sQ2 znk?F=6=GMbGPYPLk)h(k5pwci#(=m{amLHGO^cV^5RK4C%`cs_{MOr%y^`ne^7DQ2 zAXL&py`)X7>5DOHpHPCme9jW*eYfjd z!{*BQsJaA}{LC3)iBb64G?}#tE3%!u1r-*qFZ6VVFw5y|kQ#W=*65)r+cHjqyE+4v zig)qJ0l8Xh%$pc|3$W%(hU{i|y}Z5k3JO3Q5$ebgv7237;cgSwl766o`zdjoBH<_p z(;&>MNb&I;RTw}Y)p3N%tj~Gm%;afi1z4LRZ#P$!9V(}Y-EKJV zq}*}XqkFioSIFH(rjx#^69D!pBqxA4E8Wg2h&ChjvW@Ss$&ZC4*tJ{toimpTTL1`u z<)!BFI2lYSr6q8o6($IcZa7}EF1D&2`)_?+R9A1`_W87}rCof2kdnsjHcB_=m2t~s zlq_a`R0wda0SavVC)^>TBI*$Z64IeG*ttsx=gAQ^8{2rEBxs-ErrvyHf%&(?7M6A-me~E zjLK1+^6*++hZpZ5<7B|0If|4Pv$7PJux zT@=c|_T`Q>hNacU(oM@Z1y6vQpHeo@@K67+Dlj@pPjgNuZpm6%(MYc@`&ccdqx56moo-nYxF%pAW zz&by;Ldsmq@X6vBE^Jy^CTl(jxSrR?Y0!@eU~dU}Cfexkz4$cZ?zk9}ZDDE4kBN51 z(LE)3?xmgFU(`XUuM8x1$Y5AVGthAXDey$;44iHS(96+Zr-#c7)RyUp%+}I|4#!z% zMFD?(twnnkjXfZW|2eIPI=+9JuppZXK>Km4e0#f>*PFhIruG5{p|AYIZHxPeQ%EB( zau&<0%vkvhY5H72ZMeflD80*(xraY;8Uu};qynoh)#*!8j&)z>bzeT5L~sm z3FLEMDS|&&XO~klo)<6?s73t_Mx&J*`jRLnqgh>68UYjYhbLFm>hqOxQOoLd>%VA!Y$mK;N8%cyLJdpyVwMAN}_^U`8Q#{xVYNk%(+BpAz^B zgaz+Z0X^~3p*zP_ZjjqCJA*zuU574gtK<{E(R+d{N2nArN~HEX57??by0|Fjc`|@6 zehvJz?5}RE1~FaWbWSymk{R?58pG)nX1MU9pZdwtTf1ac{E-H4*}twBK=3D3egX~r z@+L9p+cv#I>%e*ZARAXdAKsVg>-y5d&f}?J{7c^TP29`({R}6mm%!Sxh~4$2; z{mzY!UC}3WBFX*KoBB5oZV)Y6v)sY;c`o9uhtp=pMEsqb)rjD4q?k^;-_S3O633);NaQ4D6JVEFxBM;+3c3BEW1 zM~NT1soApZ3%J%prkQ`f7-9X_On~QpaK`EPCG2ed388U8zo1b$K#aaL06&tF`FdrS zM&UMY&9QhdOV%%zJWq)RAwch+*}3uT;O*}3@#R_hq2b>-=d6If4SfE7gqI&7FWc5( z)a}w5!@UK~h}u>)9ue%j`m?`p2VdvM;+O7;JGdhYBz^nHDaRy*SZ4<095djKx*v=? zU#htx0YC3Hh-aiE07BB-Am#$7}I6hg)UVHM=S^l;pd?}KhU_YhIT8hFglg;?zO1F+4 zHu_3wy_1JShxt`Lq}^*!x(ThK)%PDyqNmNx&B+3N@3+iE?@tjt;_trh#C{b~$81;h z35_^o*`kqPfPi)gfPhHDajD}=p0DiZ^04V39%t>=UGBH|1f=SN)iU{g7O#v}o zM8Sl>^E~Gva9%f6ad!Tlh0i%){cER@&P6kx4k0)m(`OiAv~h&ja8A(Q@AmK4BPE-p z+|pc}W)9`~`u%sGGlb&n>np76-;XaaHGX&7U|8ehuj=ft%l3nx_3X=bl(sSg;FaE` zYQX;9na>$d1(DJ77a96-_5X;dagZ!XMLTiC#A?DLXgKjQPM)B;b z#y3lWQaA58$B?$>-|A&yJ3%>y8%y_zw*YzmxiK%6JbZ$#2*~f{X8t$1E9DRx@DN@C zcW%1ce+@@m$KX?rBD5`JP$@!&GPMKAE_>PYF#1P2#JFFtyFbFG$RAW}pBh%-R=)xu zW&%_?PWAYbx?(7DMiY;~ZSdmxd@bTFC5sDrbKgh-E^cmChwE2XC$ScgBezKV)c`s@ zi42avqQknIL%X~JMW5Cp*o}~UdN;5bQ=le@{siv)D7v&bhwhJGAeDK3&h zvebong3VzGD89;o5VkSn4d)Ho5r9`li&goq^?}#DKbh7*l5AQc!g~2-F5iRT-3=UapCfB?X#JW9Kj zl_6sHi*qWNIj4S<@d&d7Zk)3uRPV-D=E88eKw~kqBvFbv_hg4cDlC)8@PUM^N0D@< zSSSpX>qW{-jZR4k<4cd_)j|HTFG}xBT^u^j2Oy_wudajhIFJq8PqLcxSonsHi2@^0 z1ba^B#!pT$1oM|7t_j9`901sc1+-w~yvB-*O%p}@Zyg&+Z7a;agzPGW?ivA>g|h)6 z$76?T#ahzh-$)vaJF)2t^J0>$sOKD33mAAj(fuOz3z+#u=ku@FS?PqW{MGKmXqeHAzpB0IloQ?;!_W<3aj_o*EZ``>H?rXXLJM5 ztW{?*yZfQ6hq7kf@v!5D94<#gBV!`@?)(f+{1kbdP$(KSrggw85hQX`zMb9O$Is}f z*f3jCg;Lcc$D3k5w*XrgfTtdTAZoEh6+C4n%-m9Nt+P#|O}S?ZP*LhY2fSKnRhWXk zOp)bN_XZq|Y0*=6GR@9xYaMo~s@NI`3b(;L=q`bA`aI;R^2CS`ATK1s zQZk>uYQya-5zJQIn4yE&i~@DU6Vq~?{(?opCYqT?$LK_|0YDv;h3pMX*{WLt)Nbe7 z51q;dn`W1$e$11}NVDjQZ# z(Vxn<&d5N}6vf;ue8(27TWW&q%2F03tid4Bhd3TY1S=DC(}?>A#RUyi*jc)ps`22e zLx@;lgFh#}O#rz&dSpu&Y=6PNf#G|&Ij^ibC(|3#efVJ10N){x%?%dCRK(O z4`Yp&_5q}LAYuF&fB|5<4NhN3v}?K>)uu|(%e^{JCVR@X(~Q$+!xBfpTw23=t9WDE5lJfBxVpjxe3%S%(a^G}m7uAj+|UnBY< zL!}?U_tH)ojtJcC9^(_w2SX4!UP-)-CyXuCQf_TI7ZygO_Xj+qg~rAQv3eJ};SyA| zi2z!=U*0qfadj)gM-kfwHqL2h4-gk)YdL(_uHA7n3cO@1-BS%zTo&&+uGMJOiZ_}A zH(lidYOqEDh((5%`ws^RyFQ37ND!YopC!uRxDO^t5;&5t%%9&&7{rsI6Kq}?0EMl` z&;ax*Jt>}lBKoh$8)m1N9)4e<%@7rJIRG|!rnR>WUig!fr3y&2*C)%zq>LIBf4G-;$?qbmn}?!O??(!OV|Zus;&srJJ8A47_@z||!f0Zh2cOF#EAjO#wleUybqCQf*q`ZT)vIH$3=ihzN zWToDoxDM%EcIS4EKl!!1mhQE0Dpq?!nQxL65NNm+W*ckZ z>*1)ZH5Ki(8u`(~sq#`@`FMXo|Ht0&A5@tvv$qyEC=if3RJwCMC@z|*tCO+Af4wsQ zZ_Psbi2*PX;Bx^TL%A$UU8ypVZFD3;I`L8uMHB^cOrO*KbC;XfIyq*D<8Ps|kLTRn z>kc;wZONjTa6Kk>>ZWp7ClQY{$SW@n6i*k8P!H8 zm@*lxr!9l{@*28{&wB7FOV#p_laDqQF2TGxgJ8OS_Z!Fs*x^P z90sO;5xStlQNhHu0hs{AYr0#(NlWbt*kFGpcz+xoe z(GC5+4c&k<@pE&^yf8?Pzdj?QzMsB_|A5w9ID|t~F&-YHj%y~JF;I~gAsEfFh*vQ%ecwR1(}}q_ z;psfwI#j%g0hKY0o?64bH>mYDo#`p$Ou{w{Ib0y)Nxea z0PA>{enqISSAu#@0yasJ?wn=oQG54cCPdw~!8RwDY4QdR_>Fn(kQSEOUQRHS+|t)) zA6*-B4;C853uiCOQeWO0k=wIF-0d8kl{O>$%EBWVwD8M*YV*K6r#L^fUZB!?N`LIn zc68D9utmwuBODk0bKTJ|N~T&3(;18_K(g{Yv@`eM`rjw}0FLZA0Y%6A0}lJ1pgDGR@ z+)oU)LD2EBu8*$D#^}Q)YeTG6(=-M*s>N_stJlx!_V!55M$1h;kZ131JGBY$7cg>1 zXS}Ed7_<5DKS?)D@?VlJUC|5}6_8C`r}Cfg{|W8aYM-la%Aowr8ZsZ-$*45M!XGh( z8B5>!#`_>q)zzjrtC?EIP@Xxlk;WvC{q*riIIL52-$ORA`OA6!bd~$ceQ9Gkqb0&u z_4%6`C-{};i1ESkw>2_Hi4eBt&c6-=ogXI~p&;Y|yh8B_B(j2kn<{ilYKgd|_E4$V zK6p%5rY~mULJ1U@g?Hjh=1Goui1m$y-dhAj-AnQBqB@|)zme^|cp00{lJdlHSL&D6 z`QS@1L`C|FwNomOfsRvZCviH*>DK|(Q%|u3%HL}N6NwE8xV1YP%ngy z5@fLnd`H0JQh1He|M)igXD(@5*qHulEe8wnlsi<#5>PT>ODs&;kg*obk&D4}RiHWI ziwh2|9<8PXbxn=WmYpxzhKxh1Cnbcvp^Je6>>Rg3MMy(@zMMTBt@U;Cfk%jkdrQ$j zIyp|h$Kc=C+iOSMna!R)0=%$zRWIx8@w+lJx?hmm17ZRkI6d>)!N~8&M!rr{!DHf= z$%%V<*2-@N?=Dvh`8QhNDxb`Z00KO?fun2V(yUKu-~Z-Oyj^|4$Ho_&tQNA#=rPPNlhf`5X$<42M>2b-8 z#mhnUiP`*f&ig3%!9L10ViF|8NHN}1X64wnl;V634}w$v>@g&JnVvLRooJ?$`-~Cg zDfGD-a%y{poXQ2db6`8vN~sC!&*p6aOzdr6Dj9FDy`|^hefoeugS~N=SADnk-CpgN z3Ar~n4A`1j)Iy6MmBT^3Rt0*FBdm;QnM*+Dv84ZtuXpUyG-|eV)3$Bfwr#7@w*91S z8EJpNu~0qc~z}je|P1CKdqiRhP&0?Yq-7vB@46?^HMeG5^or#`Nmt-%It- z9yHzI3N{3M*?lEgKa`_F!9G4$0pVpwe*o~kp?+4lK(LpkXW@k?rs1|FK2B_p$QR*< zlvdmPW-WQx$tuBP#ft5-C^Rds_TYV}Rx6oOCx3Q1>b&V-w$LiW19@H2J({wn1_gwC zwj?E*5Q%<(sU)O@)xW)Pz`nztA-Nq_Vr~W6`qY$O3GsRg%?wdDBlr5VGS;+Qa6fl4 zGB9j)9pr|MdBJkUXlxF4y4cQlV!1dQ^KZC2%ZLu#AK8aZLTZtKwu+N~O)9graF9p(hwVV|7p|6%3*j$`t#cynJqCV&Dgc zRU^n#AbyaPzx>6_fZ`Ag@Dl}%e}M&{Khe&@AMnE6nufL{GH)uv1S3|zOK&2$T3dWn z*JV2rd2IvaSAHei=s<`KmBdT6uJFL%h}B+(0H-_Pz{q-cI~gMI))2ThPis`YxjnD0 zZG&V&&de=JNZJ~C*;><$mb}J=a@fK{Ilp!Z%PicB{@R{dRGY}voTiAP%vHew46>9_){ z_jY}jAhmKfa}4rx@_Y%@QlcVz=-o%;ZcC9=Z-2wPG+QAt!{RR80li-s4E~fzAA3g& zM`nN8aQ6EF0H(2LU(yE3UbxPKWqJIZGV?r>SutBub^$Ej4O?>L8s?=k0zsuEE3$0W!UUd|dHfTvoYSy5Ig1&&=Z|cHlRR-GMJF-m`0Bzp}{Y7!UCy`lW)JbD*nxWsZ z7OW`k<}Cme!cB=%_hpN8;N#4bz{*K|nZz)RleueI%MxUvvY3i8WekwSH@4Myn3*#YDW!+eEntlF% zo-|O7fLBNeF)i`&6d+-%vZmqjX4#%mRW`uCz8EUXls6qMYu*&szCpC*oAW-)`<*zu ztO4HV+D*JM-?_>m{*VH7(gdp543oOL>VLfCZPDmu+Wuvy;J-7wr@@stVa0E7QA%Dd z(+VqhCsdf4=Dh7$ltR(=q)0Xwz*fRlbjB0q09A{u9b$Pg999Jb?_@;I)OKnzzS!1J zEcbKiX5{lLgpdKb3o$?2&Vn@S34~5_*QumT(81NTW1{v4ld%GOS?vgatYIoexI{tX zF-lw`Mp&@ZI8jqkNN}+r@Zs`iOPVG$I;%vn+WFESjYJ6$u1tV!cT4nKROwYS;RDQ7 z0AYMy&Z9Bu|4{qk`a1N|FFTwIDPy_gKrHPFiifPEWy@XVW#OgbzAk9C!T2@od_Gyb zvMQfwBI{r~Y^=dT6V`^I@Cy_=451ku^-w67SF%ev*-#unwvhN_4zwHXZp88n4qzxe z^?6|qz%h>-QVHfoC8aWKvr3t^ET$^A0J*`k)>o55^g%OSM_+pH#$)ggTXM3>&kL#J zw{t^Wt{YVhgQ!Mh=< zjb4X$G#whVMn}!smF?CO`whG^A$G?7Z{%=U%s=N2x5w@8XqfAI#$`vBg4E(RxQ*E9 zQ;qJ2(N{1epJ$_Nj!6XE$~&1QPyN>I^)l3s7ZMSXg|* zmH2I}KVA8m6+{4f?m&Gcl0bK`7yZJ|`pJI(U4E!?@~twGUL2jGNxj>Hy)GgRy)ZZ4 z17p*daw}(yn59py<0Rj4U4!TUM&M%!`>9XWDd7NLc|3{ntr*F3UNKx7N(WWpk z>4qMlxTvN^Zg&4mn*LAkoZjI8OaQPpvl?$Ggi!`3HP#3Ii-ur=Ru5+^&QL<1rsv*~ zq7Mdfx8?f-`1Kb7RGtdDrs>_1(Aurt2_td4m`_dQIcbr%3XwJ5!@eB&~3!XGzCaelk=@^Uz)3F+R0PGg>v*1(~W zW6H=&0B4Ozf*EmAI}if!@%0zI zF-U?9k$fBt^%MZBWU7}y6%kR11&4qTj}RsquE>g>l))xBkZfe)Uk&&Y(2)RTh9M)@ zvk_8U8>5bYhsv^}sLdCn^Pjmdco9V-ma^<-gVt z9^!HSS+-x2-v11}OgSO(j$TzduuhYc#aF*blb<9}MPr!v4GYi!Y#nbps?jTcrK47HJ||JSjecB)j!`M^AyRjE9vX%_Rzm( z7MQsDEPq+T0f(-ZkrRy2#X=p&(OVff9!80ng~D)+^L}40SuHA3gc>*}6e2`MswC0d z+nF?7^FZzY%!FCag~p-XT$cgX+ot$-?QVWLGVGl|+#&hIvEStJF34%Rjr57`qcs5aXrL*W!?I*)f(9qMR+FsqJGJb^+B;+pc$Z;MA(;SPHx~F(C*FHK|!*|)*d)Q z4v_s?!>Vl?kUysg~(0o4f^o=^uev>~1W+I@B$A>JRO_l{7OQBz4ipNXX@$ z3su6j>{~tTTqa01E8WkZ?2x_v+)jPczp^)TbTp}DQ|J5Tw+-^&nyO@j*Qb`dt99FL zu5HiWF(KS}akg5nEY2C*a$JD@U=aReQq}5dj*k7jR>y!#55)Y*)5jtJgM36(inerikBhAhL{1$lsXEmyq~$Uq10?rrw%{XBz#2vWemGrh(TgnDvf*< zSk1}S<9WI6wR40JS@4iV8*WSnTrxe4e2*?QN~*qEsFd01lPzvOB;_tUebOJ88K5VN z4VD zt$3|k)H#qV>!_DYu9L%6zs zEr9;fWc7Vw{WSdA4(BV_(KV9M1ITnJt)G&Sz`rmolLId5;&})h<+;&%7vS#crk~@FP$j5$M4F$OMy_X$pei-jSrel`%y&mqwH0*O*D=6X;1%5uX z-=K?lU}I|27LqV|0S1DAh>W2rJ^b4tZf)qB`ZGkYWD}_qDIo4Xj`7Gk02j$1wE5pt zw}Zk$A|$}TQpIvXYzeyYAx$~H&@uwwsdQZukszO)i%$0`d?XRl#R;Q}34el>P{RJ; zJiPlk$Fm79%S4%0KoNDiMgy~CCe>+E={r9UX$s2Q`wuVkON-&r_JgNjGiWC2NShLu zRt(jiyLT3=AJRmtgh^+k03MOA9t-Pl*n(qce`eBif`S59YVH87AwU&gNPs7bRxzaT z{Mr;TOeYw%>YT11vx>+))J4&UTK2SJ+*#6YHkO1G8gHnXSRJg>*aKoX#sJBc=;FP zU3=`H1R9fijie|J0HqjZ$eRZTeA+#B29-XM`~;63lE-LGsp+@fUPgzc;k;@nyY*Sd zg3jm~iYNB3gC@6n$)t3btz2)`Gj}SRb{#H3Q)v)o-rcnvl3KUt703^!KuHV-*gEDq zsyji;ve*#g0_#=GUeOp@{k>iU>H7UCyo#zkmIAv@TWlH>fLYNe$DxQG#Rm$fZib3K zmfB3Cc@4Nibn!3>x#ep6;bm~UJCxt}VSDQ{YZY5~AUNicH+u!BWzpB41%jsn%=~Ag zA(Fy86b#X(1(gO(d*ZWh!;1 zXA@_j!JLwD0Kp2!k`?iTwb;UZ#2^Q@F3Xf!t8}G}lQ;T7)TL|Be1Xhq*5!{Us$98e zTxJ&>f7S{{M@5V1E67d(8ugr6eZ@>c@nj+3*4Sha&{f6r>-p9k0BiqE(BiY-ElDe9qe~R); zahjXrZ!qP5|ClZ^Wf8!eo1L#0=`xJb1lH^nz;#TMl1;z$u< zaD4YIBK-d5K|HVYQ_We0hPz9~?v<2(GsxwWZa`AW;-9;oCj)K(G8O(`v=S;4-?%xK zzz(juO&Eh&AKr4_tx2}zK~KksZwmPS__=u39I>ag@)CvR+pUNqFK7jVdUZPrvuzAv6&G7aN}eSB_hdN5_}VSi5rm8KScoiCNnWAY)r@28zM-YX90hp3)XscsP$9zq zZmVRw46K)51(`~qq*{@=c5%2?5A?Q-&8Aq8#04`Ne(Rm!i0jlf_4Ds~0$XSqpJ6HA zrqH(hHWx{+{^Zad*XUOMo#L;r>jJ0ElKwVv(=^rDmM*9Wf$f(DxPRN(Z-3rryM9V% zD1pk7JHsyTH&mh2InW_YK%06ARl7QC>l)9_c9VdDp^8kI4~$AUr~R(U;5yPnsfYlZ zKTn?*`kc`_ks!<%ZhTx?U>Ve*Jlr>+eyGo?I-{3~V!@;p`m`^H)KwD6Op$^q-IC

`T@A<@EsNgpN7X_0~uv5E1An);iT5IeQL}W5zhM; z7gc6io0c7_HrLIEV%P@-g}p3^iD2qu9HW1o+m*EHi;RZ=I2+v1;JvLpe_1;Nw}hL& z>YmqTIsduU)8|l^FTya;$kb~}-Z{^|qrOn8ss$*EnAHdqN ze4t%97SAEZU+!_o{DOA5w_!8GV_YH)ui@ZFuBkI&`FCDsDM`%cZaa2q+vTm2;@k@e z6E=rbf9y{Okw#7K%`YE?K7^}|d7fo!W*mQ%4YXLOt6Uv0>7z&KF<)fhoa zq&)v;dM5+*-wMgh)BJxcr2jR%vq%Hp0GNG^+UGqZdO5D9(tvx9p7-SnPR#C#d{0hK z@6!urW|kCk_ieLe`Ku+8+P)9aHmMFk@`1@?!7=0{x^TA^6>kfP+m;J6VIkxSz=jq5 z1tsMmc&r`nZehLo%)91dvPa^U*=4?>E!I?Bd`jD+3Bl;J=MPXjNFF6iFtee^0|d&E zcVI@fH;i(un?-AtQxC#nb?m=$bb$X8h^C9R8cjUA`eaJ}z}Cst+%uJ?q6$_EHy-un zVfi(X4ZdZfhQ8Qw!j0M8H`MD3KOyu+t%!!%0P)>cw(z@qp$a#erTeuZT&mVh6yi0Q zQrudXD2bNn$B}SnRu(}*He|8L0W@&|whefP7Y?u2WwXCmbTx}+vtoVr14Tb~-<-Lw z8e}ip+=K!jC4(t$W4Bn`9MBI7fst@nf1f{8hJ{1SzTo1?iHkZ9phLc{P)nDYt!gIO){F4R|recn?Nejcy|_O($w%veO}>g?H$mOuPSXW zam_L+^p7Mhc->5HoOKwT*BX?H!rd5)sq5T4*2g+K89OgSOchXNkusiKT|f=$`NSy_ zfpr0ymoW6;p}{)!%s^3;fF>pF@BnuhX(_+@iGic54D&A0sf~PYx?K9oOB?5~Pgj{{ zD$|zBf6~>MwGjQKJfNAAx4Z~r(!W(_Vb?3CR?KI4O8-FpGP{8~oM0rD=afHNO<*r) zQ*VFANwGlSogP^`4OgQkuGP@Mnf7F)-T!|9v4no&rrNqQfuleXuqzTo8yC95#vy@# zF46xJWR08dm09WDJk1Lso_vm&b9diCI?=KCfBy=!qhj;2Ddua z=GV-f5|IFI*rbB`op8|X)E*%bF9TrF6lXcES0(=_-eKYeBS?tKbk>j=iaUoTsI+$z zP;TTpGcheP~*kX8%kjjY%t9eJPUCBw6)f? zh}LtA%3cY6eQ*1fKl%6btt#eR*pu(H(k>Ik&t+ngz{3T%W#rsaXb~C%OYwB9c~I{QS|<*<<&^ z*Zbl(F6!R* z|K2&Vyte%2zSIc7=s*5p5}HEZ3db_vAh2)u-FirdUld$-UiE!M-~$MrS2ui|KKAOb zpH_)^YoVcUL`G0+L1trLv&=m!7Ot$|M!#k~HX+oZ4_$~#hA&T!o~*^Du6MqdXU}n0 ziaxu)T#C?MR>lM#(?>9o-myC41bkU{zeo_H`Pi=5G7k)d)x-jl100OR(0r-Pt40Gw z5BS(rz0v7`5njt%lmUyigL0@0UcDjPn+E_1oRJI=4wI7~!TjIYV-{-LBllE1gU!AFYNCU8_1^$@&CsIa3I#*JZ zJjjn835@L160y3071BJtMrzV1awT8EJkY%sQC9%7nHXlwvma1`F10t5z;3}V&`hzU z>?SJ_!@kUndcxiHexQXNed?MlA=F^QDz4e0Q(Wql?~Arb8a|}jtCtnU19v#KK%l2H z_u5%bS#ZGJr2^Q?GcE&4S>ebsbeySC@a;y0#OfC`6(-C`P{5bTNG{k{egB$XK~lPy zADnPU6!Tgkbu*IMI3@VS!K-DvPpj9Z^s56Va2 z*7Lq1ou3#vUBGHu{Mp)PI5^h_TcuB|s)abO8u2StzXO1|b9y;TGsPH7X}qokm75xn zA7yji3+IR&%GFt3eA#X|Kvj-SRy{@ z2z3f|ume#4l`f^ZOid-9 zM@bT+s*Y2psmM~q8etX5oZF&vd2~>ENvNxEG7hL~^LBgg@Z8GjF>9&%-2UAel{KiG zaWgI9Y&DoZ*mx5*Tx#G~GrjXuW2qW?7dnr=@kX-OF%_JMiF_Y!-N(YI$Y~vG_y&m` zcM&PbGsi6_$&DN%8`Ww^sQn>p(Wh4`fujQvQ!`iR6jmKewRsojQda9IlGhV4!az@t zY5@5);Pm|{)dXkJpPbM(l!c~cb8ndeYmRx=rL$%vIeCbOdA)ex_VteUHPj{yEyjIp8bkSiIm3FylQmD*ElH0*@W9!}=k zcYR4M!N#2GQfM0vzj*a<4v63b9xaxh32Uy)i0Q?r87Yf+Q<{leCE?t?62o{ZvJmB9 zToI$u%6kr2$)!!wgYo=92~5j0!I;~;_8K#?GrKXoB+3d?E#|c z{%*?V<*6_q-luB6(D}75llibzZ)KLTQ9tkY(bh(ivD5adK4n&n4vW>*Q0e|kuUz4R zYxsz>Y*;s>_}{BGbo3>5o6sm02~VyMyxEY*Q@1(KtbCM$4{?B)y!s5N+8y3-kUzJN zY9BlNAEW=jWHA9Z5k1RKA4?4RUqF`hxDsGki2rf-@=JhE0cpF#5jo!Q#{(B%z^DEz zWp9<1B`#5B^&s$mC%%7#3~*BYH_P?FP9ea;g(}exLLm$ww841{J#ooE*uJx*3`l53 zQ)<86m<0S;1+sGFaU=)Q!efpNF4o(6)O;S%CEC&Euk>bhv9f>ZRtNU9wSaN||@# zX?~KqYaDK^%jE5LqK}I)VJPvZ_Du~c<#OQ=?DUDUrlH4?Y)dDP?Zyz3SpLew{GR4t z#$=%V0P!TtM1S5T>ngWxl6D_)4ENmC9+_IGz&;Bg?ka{lcWwFYzA6S z<)KHb=M(3y*rO(I&{<(iM>gI>h7l%e7@>=J3vYX$X7sRWVX5eXDd&fE;$Tc;94lK= ziKQVZmlp8L=K{r=tJP^YL6XO~Q^b97;R_yr!221_IoMo+jk>Ro+v$%rr56)5zGV9J z_gj>aEkkB}3+4CH@py9Ewqh)E%hqb+wIAh*?8M2U?`?E$>KOd~xs1<0D_eN~o%ob){>e)&F8Q@4Uba6M_V80!yk zz>ykiK|OpeuPbV@R+&u^9D``Gem_TVn_C94u!0f5YVkYMoEDKTo5$S<>g)Z|e*=6u z)d+1gm+q&goVG7Fm05SM+8)L6+eJ>L+A_)kR#4(@VvBS|wTdxbqwI`Jk`HR0r7Isx9uTTu45F-3oKL0AcXAVqYJ^?w z95c_P+H1pBtVRZw0u)P?xl}qf2uz%Q96U zR6CG~hCc{ci}PZv#iV9WhN^@KveKB^sQ?}I$;{S=P)29-9xr`Nac50kU*=EPuWzSo zD??N3jozrpp=qacwqY(W#~S5Uh*&Ms_sx2srHMq^8f8v<0QeoQ<4bkP9R$wdJW6Kl z54H=}v&XX=(hI79F##UWv53%;&C$N8xKMj^AaUec9Txfrmj`;H{N!2palAzMzl&_u zjU*PfKs7tslSxA=z&zzQuOz}<#SB_?JQ9;Pvt&%OBElkmkBOyHG69eBF?_68=yP$& z6H{n(Ej*g2{61^xRC#{%n)N-Cy$~+PQIF90LC^o`mMpMlk_VWy8noE!r-5IIN3FiI zwRTPSoWmz+RZg?e_tbRN-txdbD!~4+1Nl{IjQqYd_?iF(-AC#>a)4b{asj{*W;2f} z+TUm~C~>+fu5uM<$te=`fjK=G3gP*<3%2urc3rbk#?6^a*oUG>vT$rK6sx7M_?#a= zpE;CKfB=0~>HzFLZq`k(yWLq=S5zbuK25(BMvs9&l0FaORz{*C?7Eg8CGrN%8{RBw zdnT0a1gdx`F^8vY2AkV|GLC4>cRk4$v~gBPO?np!zw0hlja7hF!7n&nUbvOgm2fbM z&s%So>vx!Gv|itXs65cCF+HapsdLso(Yt>QVf}~F)W%c;oCJo@-xMmE%)A-=_@iz2 zasFG|o;UnxTfLhCmH(XoOWRIrpR4STqJK@Ry7H|`5zK5h+FD~_!cK(HQy8&^WYHL^ z+f|rx7Ohv3gSvP{`vrXDetUr$(3QD0nZg>c*qS|z&_8zgZXVAaH~%6+;YpMoSY`O9 zqKIQROB9!cMqZ4g-$b>sc9#U85^DS}Ua<2K*Te6kb+$eQ9CGr|oRS3#^w9R7L3S-x znS0s`vjW!Y>Y0O`9k+lvT(`92NkY>-Au}nxlks^?Pd2P`WVo%0Z!_isdE#iq^<{yt zt!i8GJ|eh(bNI_2+pbyp6Umhp2hd;D(l4YF^K4t{DcRY$tK)seuz)ETMwmDgMtv$y z(|=Np1qenmwNl7yB<5s?maE&+tx^$q)BDhF4$qkzD~SRje?YVSX2#l9+BJtCv(#UOev zWMq>`NPZaQv=+|l%gFFU|A0*d-vJL5?!s8T9Ieka+l77P z6VjGBLD?;d4P8u8*k*`9?>Zwp)XToUWCB>xW@`9^tAKTY2iVbgh+8vvq~BkFv#;g% zJt3t~>Vd3Dvb9q>J3k?H$$Zq^xb(M5URfX`+7loU!I7$%3e=`#C%HNXHEh&Q4i#iv z48!>re_h8s6cA$ABLi=y5`b@i5WL}yhn@(U!{gF03dg<^WROR$j1j#y=Ry2tax?R& zrlJtBp$&6dB`mU;6^)$3z-3=9GtVb&wv#1>p8ey`Hu4>aw$Yzc~5C9(~iR zW27}<_Mzj%Oe#57qc$fKHA0r(Ip#?Q_#a>8!+VW#)kBR4-Vu zI(f7t*vVwViIH5>;yiF~90jZ0`q@lPo;ps$Z{iU&?f039iGkQ(E`^H#;MF4lUy#Py zdc)Vn28O< z);}axt&_{SX#EHVOSuK>LmSPIY2bM(`C6Mc0mO9HG5RZ0Xs(arzxA6fnkF+YTM54< zZq&>^0h^N2ZG&D#d*6Z6%$z-@t3&!T*}MI1JOp7gsm)AMBntxt>4PT4JPVk~Og_`9 zmvbqwK08z1jF^oQF%X;~jGj04$FAZ|!v_=i6_9AwQN%Z@p|BcdsFORB55Q?{mM)!;T2}0aIHD_BhkD(6C z(&|T9s8k}juTeg8iP6=bYbM#X2Ayx7pwy*i{9+MSSC?Ic_p>Ct$j@6V`-AeUa)LCy zG|ar*yHJi1BCF*5$$!ae^0)28U1x)hKj4&*at8}Rj2!~ei4~3V0V9b~wC|Hs2!R2$ z)Yc??HfB}`Ken5ixU&p_&*CIT|MwZipX3Hn|MYr)M5_xu;YJ?hQin!8PdSmRX8MRxFOTMG|+!0&e zc+y)M?h3_-1_74pTgL}I3(tU_f{N<(O*)PmpMb0HP%Z|x*ZJYnhte$G#T;t)n%Q1A zJY#N**3w#Y?I|dg0S`Y%F-1-@13;r_&6GT;5o2MGxtKC!Qt9#Wz`eZXiQ`r+0Uh|{ z5k<(`_1E^CKd_AnZc>E>To^;E#D1Uv4m_LGS>^GWr)>sUc2&VwJcnN6!Ory2j7ZmL z=Ds5YWM(>&mV3sV$2t7?BH^;FQr)7l5IfDoI{3A@{%}@;zbup+Fqh3@17MLA#IkK8IC#LEz~6 zj|N>cM+Fx+;G+E%_@<7j+P+S6W|a?|+X}ITNj=t+A>+kV_+F2udI0I}Xy3WfwwJ;G zlo|lMf@tGluf;gBR|4BL2q69E_1)U_0^UgMVPIPkQa^ZoyvnK+7cPpWG;-m#H`nKj^UNwVL4JNUWA$cbM*X z>wI@O{W*E9s=>zQ)2#CaN68R~>Va%l{T_Ev^mtT;SaeUAJG4jk0$^%ix~P#F6JD|3h(MO)PB*w1de?m5&(ZDoNFbHlo3qzr2flA(Ae3VV6iYX zrmyCG5rT-nn@}7w$GhBNnC$!Zszi3F*V_X}Jg#bWP->)Pn}EW7AZ&AN1O5Pq|BnWy zXWlaQ{Q;D)rtjW^;H5*5fg$|=XbnHrb^B}~B)?-?iLn8cAw%A&p%!mtGD-Dfv8beG zzjD&%dQe+NOiD z_?^y^=6@1F)R|j*HvOikZXcfqUk7uSQ}11U2X!h(s=_6WU)MjX^6v^3#`=P$^4iMq z>yH}xhnW8N6(QlMD?)&mL@^Q)!; zxt&)2KMyEH+x7DT>4@ZB-ps(jjdcQ)kp}sq6EtvAp_j*Gyv~lsI*R{iZh3_UkZCJphHj-TCjvJ5o53`msxtE!#(!vl|RPHVh z=+tBGby~@VU-;FyTUYk2w}OYynCpXGC0BtE5Z^#Nqy9oS=AWQ#e7(RVUTw_rxy?}f2Akg#UiR}`>f+lv255ByODUV@CD;#z+)xpOV`d+mu4kbJ?VpOKwr7 z`$p*jNvD2>bd=SOcsg;w&i)Kx$Y8zR4x#)TnHY-%57wiT$iV(0(pU(^K0gv?(nyS|T|w79hffO~yBQnU`a2qf?RCB9 zq7Nw3p2`^Qq`39~1N1VsBRH+d_4dzJq13f77DO(wFEWdTBWc496|#;n5i&}x%_ShM zHfS^g5>&~ZbCPYrz3Jp+LL@eKN<0(GR~k7YtaaXl(c8y5Oi{t5BVGAnMB)3-Bv@jF z0dcA`F4+K>aU@xM!)V@1!v7p6rS|m3s6fB$y z^-}7w^U;-aYkOscvJnJ4Ch9s1W(Z*DGRy+2Yg&$1FLCJ)ycBUF8|!7+%Z^_v18LR^ zySckzet^6{LwQaDAJpL{E3MA ztli79;jz}jg?H-z<)Hps1HL4BOLSC;8wt)B*B%TTDzISqwT98Fu85I`k{17g8crEoOhzEq5$KTp6jw z+8~5&ulh=S@GAxzb5Rqz+c&GhDR27g{B?YpFiNxoQ?ZO;py5pTg4KR5;nUmimBVju z1)*tJPYeScno~$HPie~ctS{M|=Eek7MCDfLXj~BciDz7A0iNw-5pN`MddnPdgkaetgirQ?wKS z0twh|Q0yqgJm*d)j$KS3YFT07c+VcXx`oTuuf=T7Zro2)e${i7UDm~f4$FDgE>+4| z@G>OdKSDqjtm2XbB5`VPoOhwprPmPKoZ80YgtdN$kmn?A3#~|4 ztvp{WKl}d0@BahcL}#7|Ibs6*(V|taa=p+vj8J(d@g8!prmy}l%Iu|kzjLEVq#nwo z6%`^)y5nS`SDJ@_%QBl4F~ePspmEf^)N);ztqhqWh~u%w{Xu9mqlMJG35o>_;JGMs z|M>p%Z3ge^3_Qkn1sCmuE)i-y?Yz`)b3%f4t>db6`8Wc_=Ua2h>xd|P-Yr(egKgA# zh%hkY)TzwsT&LO|$W!P>2RI%Cqs1Ncw~VD?LkTmi28rLm>U$CDca|-B37@fr4jRXN8 zgCBLf;>$_@gkYLnA`!Il|FfvlH<}@YLqtSC413>!3nr{TeT+$bt|zdxvg!^w6)Q>l zaQ?{aWPzb=-manxsOWbMg<|2POlglh7V2*5i|ibX!y0d-qr?XRM_d5F?*c=oBahaB zIM)c$)2R`zhQ28wT;qdODW^j^v-}ksRX2aemLmb_&rG1TAuR5az;W{RRmwnwmrSA= zYr6}z9gE!x;C3?h*%S5-HmwKkp=9s4yIpJPLR;w8codM-D~oW#k||1HRt@ zD7DhVZkJ*hLgAy(p{Os`!Zx1Hqj43Bn}UWTkdjBm4v*g5pY|U43MXHEfp+)~?gver z=?544i$mAPnwr^q*f)reFEF8n`SGfp5LxF`=CsGO+&4Cq{W*YBo-h7R!cCHJh~BKEeCdMJmI1r0!}6usA0OK8tGYB$Jeux6&{pFEJp!V_#@6LDQxg z-blHnFdAF8g>L|0sv`gOw>1bXrhB5;Ud-7%2&Ff!m&Abd!0qAwxhJA|$qAPPC}I7& z?J6F7`^eqCufJY~bA{}DU_eVvolAx*E#+=}4RKFhN55JIS3lyv!W|xXI{zMDwRyBk ze_oAfxlF>v9OF#_ydtcmNE}> zzj3NP;Pw{P8sP(fZ3`(Ig`(dyu`%qT-XtJ06pi4-h#UjQ7;Tx5Cc1)y(W3*G27*ay ztz}~Aux11DMgs63t3$2ETC#>|#7$|m<}%^0a3=yGPafzp{ZMLNZQ~|&YUZq0g6qf^ z>Bks?n91yheUaWN^v@A?j2Z=`^Nsf2BW(`KVnTCHnc0GtJcr9u9XkehtFS@UgLVt1 zWCIcv)`P0OryYTIS&=~0M|8EOiRqBzqqve<@Y4a}EYu1=OipZd-71O?bSC^_lJ3@D z9RA&Z{eKl!drB(nzH~%US|cA6nsc2E6%m0*VStV(amen&(zl6l1)@-@0}NHiPl{x*rub=3j6k!G5@$$P%B|nyz|ThR8^SmWCS^p%2GM*@uzX&o z^A$k$4B<)h6PS?<61BhtoX_&BS^r3JsCt%U6}16MyGUEmXU_&a_*7=$aIj-9d6em& z_?EXN(9QhqZ0Ejq?+}zaNTjWvS1o5-9`h4`kO+1aA-CN&M9V_k8e*(rYei|AyK228 z37O0z>J`pde)}5X@J=jhegn%hf;#2I1gn$#!ut0J0A5fz6qwqol)=DP7yf`UkvugBYj&aW2SFEAKe#1;+vI$AVP z)-i|ZqMu;F%e1$-zBOye5xpA}CumK@M1kB68k#+1Svs^DLP^ULr46*EDP;$=>h*a4 zYC66Dcn2-|Nf?^q+%J6L4$`*^N2nO9=PbM+34oSDzlHQAF?>-Z0-+{)>D4C53g#+cUts3Kc@>EC z=?9Z=zn8SoPyTrYB>E?+s42S&%P9i@g;XXw;ik`zG}QRZLLn#h#&(Jb zYz6Af7T(2vvx?h-Bd-QCE6zcZ9VevlePN{+<`47Alo<-&v$pODYHr+ypP0i2_k=oC zgY!vA-Dcewtz;TeH)+nZf8pr7UerPDW_@4T9;qt-C>#>WGyc)H>OcGh{QL#E{wC`%Kb!KnZUSJIl6tF|yKTdOG+c`EG zd_2Qwh;W1xa(KchS2O`&4plBwmc3BNgie$`5?$bL2!OPI92gs+MH&p-Ou^dr*z6|>0o;HDxj`fAbM zLN`Lj+5K-2ZG?xjLNo+RE6Jtq*NE(JvBtkxWsv0U=2K+I+Q!fNH3$6Uh zubSojWw3FXdpC;5{xE@OO(VKRNQF0v?Nc@>aivZky6bF)ULlPlismqIB9*O{YfyrJ z6!ph3TVnbcV3i0kgG_B)@Y|MY(WBPTcUUP_6=++m>#5Y>Zr7;Vxw(J+ShCDJih2w( zl-VSLg4cSndebMilkQlL`jkZaHS+(^_04aYzTLao#$?-=Y}>Xu)su}U+jdR1ne z*)`d=YxjBIFZS{7WB;)Jg8RCzd#!VwP-3X)Bdsyh8@1u>f_(mFR02hFsH=TXyp|}+ zKXzOz(A~OV{|pHEC~>UZU`GuGyJWi2o91Jng{uev=>hZCpYm>vpa})r2Tq;3{g$Nl8JX7bg$ow7`vy`;lT>@|XI4W> zb-pzZVm7h*b0wu}dJff1rM-`nnKjbR%TKus4w%KgtE0E$=;l7EqFE2&kmC#0ZEb6B zU4Q?eFTo;S*VW?&So2dJF-Xo`SQLka#wN(kwB`UWU1xKUpGCWyA2J1X+#28wMrrZE zTC301D`#*zx<1rkT6ti5Hj_2W;cj5adu$qMG2%gAk5Y~ct{^byJs~{p>kBT}?(tSX z4#yvWu4}{Yit!B)1{DpX?0!2#Epra@{at0`<{Nycc*CT9+Cec6&yL33HBhFKxOXc} zlOn({(bCOO{5h#=-7ScES8G-eyM8YBB8BHlJVA=peZu8o7$8&{cTnZ!$VPNsv<^3>0J9RHigRvfa12HLm@_BSD=HpnFV^& zRq^%hi(I2}*&S^+OYYY7q6cPMZQ41--@mB3BdJ>Pdv-ET`%z;!a4|$bd26*s5Ie*Z&_=8RbwKfvkn~=_m26{xiejb8Wp30fWOZ@){Cp z4>$y~Sa=rRTEbgcp6>XK`?{MsUT&axtAW2W}?g(>Z(eGW6 zw^Ime=_MH`O&_vi{TXKMp==wgYT-FA@H@ltilkuqOTm$x#wLG^&<_LZWaTT%hGA7j_6L! zDD}45;foPqW?cm4iFkJQ2lu%XvPW!eZ}j0Scr?T?PgE1U3}eZkoG>HbOM^!aW;9B++H-u-~i|2Qf8=+aso>x zzgo7?@8i^0;mQlj!Fat{WBt)4o5v^&1DGp9YEfbV^jUw{4}&Gv3QD=42{db0K8h<6 z_?-wu5yi+e8X5wq6pduaVQEPlfyJjGRB2snvbQ-f<{)@FMeAFjGU_&69VDKJoxSw$ zMh|Ek*J$6oCkRf`**Le0gH;5=*TvUfbH@11y$2qM&yruf)j=Cji*w2-;L5V}ymB%@ zP3i`^J;<`KuOuUAI~O&vr%Ex<6neewSCCsE*GJg6`1e>W>z!*1W8EJ%bezFkmHggs ze|EZmwsS(w<(XA4{204T3ktrQg$B&zY2JA~yphSB=+EPOe9p}n)&jj8({naUcHY2SSoc8PpppKO`8VfNePVvGCScJ2 zMg9X?TmFv$-T%iSt659eer*Wti)po7VMX&Sl`OR()!$&u1|aT<0N0f!!bs6d6!k>^ z+oP}JsQUT%ClSLwG3jm#A2fpcV&ZK55U-Iq7EKt9%lLVYiZFzV$^Z>g%(Z|xTtp?C zUKGgG_Cbnv5>8D+J+H=`cS+Mm1tG`?BL(&?5YkZWv&h}aY3C`~xxwe%&2z&p{5Z#) zK1YG-m2ndt`SY3@1kF>7&wr018+OZgr*TTitvzS#*H5*2MgPmZ>znt&OzDm^R>BN; z)U<+hY8q>>;1@npzL?^Nt<(xLH7wvcD$G;3h68v~6U{Qb%Je1~`t_oIqK5zp z*KSCh!@3>VKT|eMI@`KF&jHVX<_=$*4QZBBG44YaMCosJ;#4KN*kTV<4g)=q7v%Kc z=;3&=^zTG2eWEwO3KLm>IgZ-l|(5Zo9TR0d52%vcep(vLYn z{9@!yEl!WBDTq4-hIEiDRR+B+(%}BCO{OFTY8SRkU$OY-)cPus%0NNm*O*p7C z%!7ps5tS|s$8*&+% z^&q?2gG>suPZg+256F&@$pc2FynCWh>NiP47>qzw?vGB+q+Z6!kOIXs1O7n_Ob*l8(Y-*?m-9b%{HHLYl?`CwrYI zO{5qDQ4f9zk4RR}lPG|vWgfE@bvU$*&lacJr?ql$ZLzz5pw?LsM*l7KXmDxQCchNk zJ|A5ZDJZ`f0NQ3go0?G&7uq#tQ7z?Db(F@5ant3hckqoHS(y`taDEoIgNxkSf?C(f z#A9IyzweqikMhJXPD}zH)=RdXhM&6H*hdV8MkXC?`uZEd^`=Qf&d^>c#L9O-OGb9_ zBEOEn_^ae`EA2G5ls(2W%krn}=-Q4LW9v|P!-?l(2&0m|%JG$*eeqbONO(3t94IE5 zY_MMfq9<|vq4&}zVx85Tm_w7L0d=5ZVR?!my6Dv8u&23B=8%rb=EOKsP9|St&sJ;p0D(aDl#fb53KKb5BhT!esD3r{^ z@F!2e%f^Bx>3H^jVI*suT@Qb&r5~_b9WLcT_q-QK8F{;D9!H_FWsNeuSFXo*eI`BB>8_g-E5;Y!~2Zz|NzoS>qI;h8#cVm75aW40?jkEasQg$>x z&*G5&cV_+dGr8eP*wM$FYN z+RkU?@;SIWk9K&)qX2!Ilu62Wpi6HVj31w{as%QmX~ zQ~$9E3sKXz-{HdWovN*q(B;mURiaKt#;o|UMS^x7?UwFKW4kxNxkdZ6xlN9>c-dTX z>yylHKMfmr=zLt?^*$SK2!s!T;Ht{*l*;8*AoU1+OSipGsNPZe~YUYbbkp$_5%uK~oQ)o3QubyznqL+%vV3@JNl>ivx zIGeV6*?hb_vI|gGjY>AI0Pd{sAA=WAtzZd3B5`jipqVJ*q@hN(`6^KZA7jpLTKcVT4C*q!gI&DTMDB}wrHwUX59@w!J3Bd#q; z)6}tmk$b!DZv!r^B4Z}SqR3{nc+DO}C3O5-^4e)tN7*YFsx(?QDBxaNy(qrhttPGC zfC)ubq*?{j9aT(DdB5XU3EM<^cgcDB3y4j7;RZbn4hlE6w_bi>wyaePx32{-+PQAM zPy*a{g^8eAiZ*$`Jl)4?-<745sQrsbl9vWj;wce}#trqczOxc`Vkh)Yg-0$e4htR` zwq15s^N|$t^g+DP^>T*Tze-R+@wt4 zi&fv&f@ZQY%tE#x0r@)Gc)Wqo%r_N-B+78ceIblN^zeyaao23FHn_0(S&t1p2Q^fg zbIYGTmki9fANBERZCX6P*iM!@Yof!7Tziv}tM;Tyz1~=|pc}WWy@*}&Z#ww?0>vU2 zq|tDF25y`m`n_Uj9o6K0%IVa88*B_ig?=*VGW10!Asw8K!dtdhe)9Sm?9%@TqQYby z*Bs%K^{#-|u4f*jVy~WLe&;A^(>;HdCMGpFh3^V%aRz{GrX&h}@*5beek}{k088o# ziFw2|2#ZvvZ$5%&XC7es`sA0Msrnxoom~c zRM#cV^->o7 z*gY9Hf4*Eq;4WDg?>~fMaEP>6Y6$GKel9Sq7Me%U2&jK)yo52CK_!)8+NhtU?@1nro@M4Bg z`V7A>N=2M2Zwl#5=3SX86U%wHoqyus_clL%w}91H*2+R9t3?tO;{kh#1!Hc^usIT#4S;SxM$O?xy!Yc$v;XnDi zF({Z*p86$ah+H~<&dt33=BE?1K#(Ryb@kyG;78aoK+Ym<0?#TSGSF*me(?T%?VlLh z<@wdR?)6(oe}LLeSq5YDAx}y}B(JUJS{gfyah|JSCXpQ%putlqzJnb^t%a(GC^!LgJxh;K*XR zl;&LJnv1IH0h`-(d9VhlG#9D?JLGee)sOfd!2B*)-QD~hj1LkiH6mHmy!}o(76t@F z7x%xWEjR1`_Ehu!3Y7V${^N(xthE-q_8X_`QMFD1Tw7mPAbJXW%BVi0K-H{qO^$<; za5!IlwOg^KD}y`9WhKgxlMeUD z=BQ~H6czsDW(S1U`(RG-yFdY4sh!?sCFYJbkEQq$KowYe9z*NktH6@zo2kqdI-RF& zIb(jr+5rFH)2{3_>@%)GqNTZzi@OV4PFPhgSkL{4 z&@S6nm$eaC05Yt?b1n?TlJ-Dt{f^ui{kc!B7;E(RhgRCdEU9g;$eGbvNp=+E+M~!x zNQc77WSg(i<7)7OyF+jQ#@7=S@-KUqiM?=+SM3JgSwOblU-(w=)#h{1 ziRhp@tdzk=CwgcU47K;gbY#UdsCt_{^pz@V?X=>h!eywBk3s*BJG#;bdy*Ulg?g(7C z;6&RF{xg$Y(Z;-xC=sG+X&{dE^K@WPgs(>GeSQZ6I(`d$cefM3(nuM;^DRnYl>Z;eeQ%)oz(^Uwf`xjNx#MzDSxF%)HAvErMrwqg{^$n< z;{LGUnKv`sp9?RSr$i*imC5gjX3pV1@7GAG1_qU+l0rutpl`!meF{0Tm-D>DEIB5! zd}gQd(Ui`}4IZCEI&m}$C^K(>yn2n4;rYHXFoz);@rvuM!E`$GH*6JNO_ z*&(#s*A|~f(7T9=W*}%*DAPvvL)}w|E`s;tit&V(p%Ld4XYM`n7|{pbL~>!O@*0^p5~nj>2L{SP5`bxsUbAG>9LdqEB~rSc zk}tmprNh1Ou*dm%Kdg|E#j%kPlFNRF;I7@9{{bb;ECz+ySqrLM2#al@M@l1f;O3iM zXYLDqv&TmN3c9uUozjXNcSrKWR0bOeSM1LRQj6UmI0ZgIjM7NJy_XIwbt--2CKXUu zmaWA`{tgpZPSH%V7MBZw$}a1U@){CmIZY5IAd^k>dM7|c3OOA~Dfl-To&<)FjnYE6 z6bhS=+xV~U4-OjQoten3%HPs$xRq|!4ZM^HgRCh}SWS+61NZaPJ6a~%Rw9}^J}IcC z3-XR!cwDvmP7u{179|Ei#hYKc_&;p-Av+1Vmvc~~4**>2gVro@)0J@aan15_6Z9Aa zC+a3psy!tMkkT9)Rz{F&>o+BI_#PChW+UBS3aaoQflS*}jR2_d4g zrH+M^jXr0MO`dCQ!tKS!$*WBg^zBkPa?L5Yq-b#9(+09aWw4b%S~%@~mxYiYB@jQW z_soUF^$*%!JQNz4f404AwGbrxHF#oY=u(v;7zr0x=-DWs^-vAxRb?E(u-}|Vddxqc zPvx>AUQT5PDvW3AtR+WoENt2}XYs)N@>LDsT~j}Pd#<7IzGY?=XUsyLg^zffs`Fv%#>hAa)jr^t#0%q48YDY6C>jBb`nYiOyn~{lEZLvBUwb&yL!A^&NZQD*9R*N|!3I&?6AwJ#E5xEd0k28dd2gSYmsMSQ@VVS#laMF#k$0okxGN3K z6iaB=N`Azs@D14ea5!C^kjc{Ymo>Jus!n3|5OTD|0a2>X4VG;#SIyutNvq$I)3Hl9 z3rxF{i!^9}r-LjC3(XF+fR>b^Hud{SjX8T7?VpYi7*2;AtZb;Q(^8NTIwaXO=E%pM z`pOcOj7LFnB22@_#%H|#Rlkw%9R27xxplZzTtU5ru)w($jA^sY>Br$8V`2WB{`nC- z?p4Kgak7=1uPPfIaEE3fv}Y9vH+sYoj6vXlE~io^d^W?v$T3TcSK@d4TE~HFo-8GgaC|UVYD{XEq{g+rtb$N^L2o|&6THP7608CI zUoEop4>oqXuQ7K6=HEV%La<=S|KqKu0SmSXoXo*gG$|9O+GG^Si%Bub6GNcD<~omt z1XsPeADeDx!8%VpZVH1u{o%wTP+OG_Do^HQ(>7%xW@6iB(dqtY=cf}bJ5TOhT?kRD zlAA3Z&Dk?bq2)l+zt?iL;#o^!un zK#2mWpAZskx2U`1;q`5ndUJQqgGte>4Wss-FKL(B3Yg?!R z1*D{Zz{qpOHj_Vz39H1akikGM}MAIqAP!Qp=`*(xs9g$RTTF#1-;A|o(8u&ih z+Lm}B^UX_$Tw+`cA|7leOiu0>-~O5Pyw_4ydt|0Dch%Ss8C&yTgVP@f_;ClW=l)tIpdicQYJGKilpbhvB&VRCy^E}G`V_P^X&Ocuj58X!^V`nKjNV45#u5Id?~Fj?(bWt zx%NfCgz4$f_@DqiyXjQ^8mCd@JGY!P4#cfo#Or!0sS7Y>psqL*dN7P$sixW*Jr1b> z6dMT?y|q!?KO(qui!(l^*7kRRe?G76U`vF046P3Aisd@}HZ#f})g9ZMa&S~><;ttZ zUS4=*BGqwR1^?jlh&R?Q@#3Og%v~K=t3OSZ#v<`3m1<4AhpoM~&Q2LKsENM~KR-$~ zf9L{JG?AQp^GkEXXd??8Y!amf3g@D3;elM4(USe!drlzUh#}#u1r)15Y)*w?20i>- zo8>JhF1SBKg}s?u@O-&dh1)RDGgf@*dipuyc4+GIccQpb;=W9}!)Nhk0r}-ceDx`H z@@kFJa?6BOjxZt}(5P5K0Bb0Y=fAFk%ly*`BdSA=Qo#p}X;Mmke`1XjWhB@RaxKyJ zV8?@&_+jcmxM1eB$!9r$$$}cLOL6gHJy;Om^VBqiaEz6a%YMACq`(2D*(zXu7$WnL7*uKnSWECgiF50b^G;a7Bxgb^u)-+N%J)|j6pv94Zp3VP zMjCY@;7tcssdkXSX)oa1kkYIj5rIk3JVtLRBVn@7M;oEqst0iZ_Yh(2D3F)S*xEL1 zuzx0KuoqTTti$uEEJ>Q*J(no_T$&N?cZ8J2L4paq?@6_Q&ND(5I{KZV)+HjjirD{7 zCQA0>2LJqhi&J!SEZw#J%F|GRN97ajur1F1V>47oUY)==V&x9rLi@WlH-EJ!6H}SO zoVVcBua|A0kwOK!s5+&F@-m?v!OT0m-1~ws+l#3~Of!Js{%?oEDXz1H0c1j}RF7)w z=9d}o|H6s?XqBQ9*lyY&K|mal(~K6rpa>)iFtq)oUt;9IquPDvJwqZxB13mT+P{7hu5#1-MNM6 zYCA5H(F}|qx0CHrE!RXue?fJ2QWgiBHm6n&Xe*>@qf6h9!hmyr4ll2Ywv$c-hvcTU zUs{!S_EI_OsNK7JOkcv#()YPigWmn;VcB?J`|ga=fi3LZzD*fj`HTfuN{wjc#JTT@ zlN40%incXuN!{^m8z;P8+&=7n+&vqad%>j>kq;x(bg{S)IQ+k!KnW13n3g@bJf*{u zOj)@yhIw!iBt@U9Q3YJqOW#Gc15FNQadjU}O;z)?GF=kD{h4>r0ff-OQle*cfmWj~ z{_r%Zi8PQVD zJlw=pxdLV9E?J^^T+BaH>*Xc{vnb7!CGJejtqUpy2|Ve#v%h?|qf=Fq#f|z5XVh|5 z3o209Pk@M7SZ3BzITo}Wt%xC#5R~>Q24!h7a?2|b+tT9wm|jdy9Ci=~ux)yvV17~; zV#H)!(oHCyeQEU>zj%W%$eii}g&0@th_6ErjZF5a1E_z8Io_dsc;x$ZK%$Cc73vR#`EZ5pir6LKDnaux3$=JV~i` zqJVI2I+%-;ff(yIOcjXA%*+?0l2baIXMM{-C;QIy^{fSKVJqg8X{|lNbtKGm~|9J~w zzhCUbQ;I3TrCs~c)=9*-E&&qvjV|$!-fn4;8uw0KSh-|dOu2LmZJegCBu0TvY#XPP z>aiahzqboS5v;HQm-3$Bj8er0VFPG!`~g!ze=t4SW9Cr^@nGiPnZtFri6}lfxK7{Y zoy{^9!Tq-*4*)ObZblJ&PnRUK9Y&zL3-cXLxI%T>V-z-f%i49k7gyOB8?~AuZ_2h& z1O5{BrH2)i^LMDS1=$x1u|q5$A3~_@%n?v00S~9**FVktqDM~`M}LqI)DM(sw=`f; z6Z9e+Vpga@_(Ihxw^f!F+YPpLM1Em87tWs^I(uWCwKYY?LWd+kJ?hK@9E|7W<3W4i zsk0HX?U$Cn{mp~}>}ywUU_G=s{ zeoM8)N)Sb8k}{7RWHHKYpx=lYLILMcMddBu`6YZ}T zU9Yi4X3dL3sNl+K*!l_NOX|foq`a?o`bSxkmL3;P$7G4XA!+k4m~W_hYw38VO&Q{j z7~-uvi;0g*ME3T}1VfV?Q5rJbHlthq1Z1e3?CgBZ95HJCQ+Wp>#K|h*0@X# zEi1NNb3Xm!#9LW~YQS(9g#du^z(C{F`{R7RQevjqbglj7eMzcxW z$2_Y)=MtCy9v?@EKU+OFY555*DyB9%c4RSmWK`H*r;zEWWcjtCoS-v1>``lg+9^^M z@?elciP8!yqLb}I;jGiU#k375uEZ$02#4z|PdOk3o)%)y=Ga-sj=54mrB5YjZ&5NS z=V9`(iZYFF)@V7kg)^zXiCg|ec~As*ncpxit{dZ6BA?_KVG>>WdpGrVcevZSX_)=_ z;o$aX%{|7oO@`T%uj2jkl{e578=lI=Z&{#EtM)}((Sg3-pP{LjMR#CRFghj}UCiX5 zD86|MD8rIjt)OK|WTHR+Lwf^G}7 zHt2TJ=hfz9cDyR?{n6lNTlPEIqllp6o^_VX(PO|gv1IRlaBvU;S0eryk8=kv8dz8z zrht+ohyA|mk1tN@a&bI?I&!TD%{20&jPL+%=gAL>{7nx=|;LfyNE6%9c zw7FhEep9*b@0L}B6o@CcRiiu*S&_&uDKXA0yxaxw9kkpy>0hmMOME{gx^E+-kJ$e(xK3R zRliT8sdi4_6emVHawOD!wJKx2^nV_fT%1@yEInm0gRHJp`euyy2SMG{2LVP~fF1H7#ew;^r zJ3cyJq51H5{zj0$%#1t?Pg3C6sLdaI_@$K7F7yJX6Xc9GPI{A`iO+R>tam)OW`5eg znOTLFTFxc4NLpS}ruEE7wSpE(pbE`V2;8PFn-f}X%EfgFczd(A4q#oDYR2W-HT3*M zjdXQ;92j{j4y>h|tE92j ztE>f1O%oZDqD2+(9!x7$zZZXuDXNgf2H{jk&$v=hRISg$y>6K=2ZyNzpn2GJ7MGdc zBrpnGB_Z$VtJ3$p5;luZ*jAZPXqj~RTlFJIej9F?*!CdgpcCiLXITh@>%jG!r&DGL zhdE=`1v!?9!m!>88R$hqO;lDnZqg~#XkP%*Fi!^u!YU@|F;Hg~Da}NLMs^iwo3|+) zf3NImiQ1)kIX`oW{M+$448;`Y#A}g&pgcI^{<5o3%S$SHa>47%YBh6FXYS4e$m7~j zNP8G{2#SzUFdYOPI4AF!7`1jvv_Co4W%zQSl*3_~ia!T%_EbYTtm34uHlDk+&k+Le zbte7)I!}o2w0YoAJ`wJq@se~|nvh_b;Cq^lhRCR|+u%ax;TWM&{K)%7pXIMfO`=e` zc{%;A+^(48yL8M=wv&vsAIrgkZ^tZoJ>G+3v&fo%M-2v(8^gcv-RzA-8#AMJLaqw& zPKRI-DpX36s54rOt?#d)T8+87m*NQ&uQ$Cl3d%>pkF>xQ@feK93s!|j-4n$zbI0fu zc<~nkBUg~#smJ1CF+N)=;=>0v2EK6)4P`#I0lH4JF*r!DCS^`u87sJ!`%f=Et zPMlXJK;fQm&V2v^_T*2gVmI_CQIH{4P;V{mCMdWb<2(rpIg2qUAP&mT1Bnbs-%>rT z$r;|WQLT+^ZWVKiZ0^VXGme#hOD_U415Hl-g(o^0GY%A~4TP)g)q_!lyRO$@Gv$8c zC%;t-fhC*EYbrZF${GP;n*wn9{GNCoI%NYu;;a+5jTAylPR#tFF!Zq2|NidRVy(?# z0lH2CdR^BUj)R3_rxhQ*(+dNn3XlgU9GdS{x`S*j##c4AS6rW&c0B31lcuC z`2O41*-&hY_q;kN&JRa?cM{esxh#g%2L~m=oqfV&i4)UzG$|-kl%`p zy2p**bLa3{2QJ)mVmpA@y1`0oZaS}aJMoJnD`tsSG_!^|Gok%#sPpXpEyk&q)ZhGq zv#$i=S$+*=Y&O7HdOJMODje1L|6cjB`?kRXAg}xiBI9D4nJBFvEk7(_XnYg;?o)0x z9SNl%Z1>ZBK(*6Jf>x13EWB4K8Op*$?+2^rN)-~`LW+yk!_RDB9S9@gPCanWb$d!_ zEbtq4^1dCd5(E04M(^W%B(b?%XUC608x$YqykK?xAi&n)pQ{$lAgGA&z6PYQiK z=JianfUdTJL8rg|i>+tUqVBu1gF{{|##aNgu==2jfsn8vU@jI<)E(gcElXLQ_RlRY z05EIa!}6ixkGvm1!*t3YYm|*pK0gBpc;@v~OLg?IR^s_T1IOAdanaZj#q?tdBoJ}P zBl#>U%j^Z_fA-8%BzgV$%Tl3BKx>m#9aD)Uc)n=suzoJ@yp@1IIt7uAk3UHU=Yi9~_qF1ul=G;9paVx5a1!+p z2pEKd8gC_ys=&43XD?yi-A3;A&&u0s9Zoz!^-tK?so*qMJpw5C?Z3+fb{MK@{PRUm z7~XzTHa+mbpZO_V+Dfk)H%pmP48JwN+b-y^g=O!AO3m}Z(+kt$ZHny(mPsSP39O7% zVNh~C`sfXkWck-?0Hgiw;O7vC_#%Qiz!=2e%pkNy_`M*E`XF<$@zx}*{DBL<{6K61 z&OH#ZU7E3uHCi+G7c}r#C+RbItlfw?BLWsg7M`1`Pwh*~>(&zU>SF|JX5g@aH`XTym@nNHcUJcu^Kos%Rwi_*9ngV7AR z+xmn?fSJ5rC2TDYFFK|9Ss%@g)c)j0}=b8P^px}G|lf^=213E|5E7Bemj7%B3^=@b*duO`q}1xNRE z?V)Na-4;U03lGu|?Py~{g@Eob1quOoBr(CMy~cf*)7$1aP22h+e)C90gv^~8ZCthh z!8)w#Wjz2c6l*P6U)4i(1yfI{0i;DtZ2JZH6^jyRPTmk{vEw5t+74Lr6^>WjznJ zidykPEkAz%U_Uk$YvZ-xXU49kZAe*OFRqC;{?jT2YK8Z1SVSlFcT z%(x%s% z3ByC&buP_I0Gm}M6T*C?71h)egs4C$e=2nQQC)5FrXIzJ~A!r#Sm@N~=Xb{;)End}IoEvNhM@;7fy!Q57fy1E&I^s(;k8?tI{f0-D2xOfZ) zju_!EBKrq-i=}D}W^Ykp`IcVXnk6zfCz;%TsGJ5)T&jV=XMMm>h5@G2>y8d1%Y)etVsA;i1?KkO?i3C}Ec{cXb32l1M2E)E2wn_RPZk zb^qDQAT0p}C{%+VFqH@b4M3GoNddwWaQ>#)1wSh8ijl|oeTYbY!tQv-_;_u7zSsah6M zjh%;@%J>Zw`aQw^Ho*%Or7{JnIPxL3U2{cce0cI*I>Dxz%Q)&zt4ecHNP+b%u80{B z-(9YA)39y`ewW&xnK(tfpuk_w8e!tbCzzK=^lc4-5nN)dk z)PbYIRtNkk^Ztge+=skuocMhkwJ0-}e6eFMrNlz!_48;eAtV74omdEqEWN_WI(q<# zp(u{|vd$3}8mFqPvF+Kk83ZZ#qLwf44_VY-=DfU-lBq1=kk2k;L$4zOq%2kErq0aq zh1)sbb>WeG<@MfQyAk!c2mJDQvEQ3PbEF7T--6@to+W?Ws`}Zzp;ptzF82qxm+H$B zd_IwZaia<&VM$xw!=hZYuQFxQOnh^p&Z z%pf;1x&ORQF5TZdafgdI>)LoW=}IT%&6&7P=yzva( zpH8Wp6aUrj_{dkd>?QiwkeHUh2!Yk|#R{~AK>Fu;>LLe&%6)}N;llrWRAgj=K>UXg z_+QsFiSHa6_yyOnLL_TQ0#vePNV6nN)HGb8Q*n)pxvv@yR4*dUloO@ZTIA(*&dl zFaph6++p-H66O;(dM?7D|5;0>4FnZwc`TYBuDI`Ih}<~wLz$1%OnSHyEl4_K{>idqqKm&?|Oby zrW-k~hki?zAmDn7sKu#kS_ji5&h0bUDH3Jnho0L@nKy+ zFvfrC<9>yTJ1DydT8aowt{SQH@+lKTFYDLQnX{AA4USxOFy-MYN|p2n%(tULiy4^X zZEi0Ba_dn@HDw8|Yc^o{5c&oSg@*YAv7Z@NnlRWFW(u|h#D1p*SE;3D4ukj=iMJn! zZ+d4=W{ZJe-YaEH%iPa&wYbD(T}+91M*AxaWl}$0QKcvFZ3qr=20quxvCdCEc8ext zY@+5tmdH+xF(;5XT^gUmP9u>YJ1d!k3TmvPr)jlX*+8e_);xKbB{LiC0V1tGw_K$s5~5>Y6ft@}*~#6W7ij=U@%@O)uD(%7-Nh4UtdddH}lZRPFcobG6dd4{E4G*MQEB zUtCJL?j3aX)(b9+NPN6fXXa+L-*r`?AKqjPTM%M%Dq7-}hoqpz-6D9Zx|RchuFI8# z#lH*4V*T=j5d%NeEhY!GfMrui|f{0dP57<#;H8i=)jo}xOCy9VBd&tZWee8DHMFCL0}jAruExs83h5x?(k1j z*u)zyQ<&DXwA9sS;EdHWkvN>c&M>iM+8cYmD7EQ)#nfUT3`P%*q}mWKnt!7a7QA>gzOeE&wFf1Bu(zaKh!%ciu3GxEjmEs+@XQ% zIW7fs6S1izW&-|->}T4^m|#_E)X|jS1=1_9>S&tUkwPiCj_Ccwmiw6I8|taKj*SN0 zYX7i-C{N;a=vN9iAA%KZJKPA2G!%Ym{w@rmR&F%pf{ha zQHnY$SNZkV99~P)2%Zx^dLn%~xiw=6sj+g?08GmDJ}B&5wvU4G!uS+(d}EnBWeBMV z>bKEk`q?+(M4T{k-(kUNS#qt&PQ5`KiM3fQXVfbUpax&;C`gB!NeS>RBW2DTV^1`^ z>~?OtIrQ^cGTb0?D^E3JgZob}3SimZI*X0I1~D?8yqxsfB2vcaM8+lpHVOYNpE9F9 zlgg0?71jNq99?{r)B&w#9Xi2PpUGPesuTQ)=Mt$af*z5lu|J6n|MwA6Bm^lj8sXOE z_ytI}AKsmU;tSE06B{tRk?is4Xs@o)lBRKM)&i_q6q?+v#8b!Y8@q76n+^Itjb?5p z<~6x7>8x-nAKY5{8wYvxu<(f{m_8{6bFIbidG}d{UTbz{h5O`r0B5h_Qj)SaI)ML( z!rC8{t&wL7V5Cl2WnNkUs`cicd6iS%hj;2oIJ%*NXNsgsiv>*5g-giamC5#KEtgwG zO_h^IrxRj?Pd5P$sLKT=&F@P==LrnckF7pm8$tWTtrlM}+F$h6kqd=)4d|xwn zyPJrbYm4M)mK2UIuQA><5|J?u>To+8{aQx^z2w=;In%!-lJ1UH7!*n#Oq`*E`H7$V zghCMYjrJ_t88*V-EF1xe64(@T{NC8pWbR;|*ZM!2PFN*LjL zI6Z5JaSj6r*d$E?m`UcQihuMi2i^O1+ATt^tOg0P; z9BBGIN5nUuC?M0?{gs0lM1g}kS{{~cjVCUq0w_cVk8RQ+)Ogo@reR030m0bYEWa^6 zQL~JX*|GKwaLt*%rcmHXnNHUw6kLV9li<7udavN;DD4Fnd zDeeo;59>QZ!R7TjEv%4+;*A;e>kfJK1coFkv%t1L0Mu?HHM`c;@ek%P+`1rt=F~t( z__km%DOxaG$J1jH5v23#gk};!o5b}6HZzkhZFRB%Ulj$?wSme6tt{x)Dyyw1hMsA^ zM^%;l{#9g&qjLIkJbF$={^GFbgG@P(v_owa+$9lqtIHY95^gQI`Ypm`o}w^+c65tn zPuqiBfQM5|b&_lkHh|yBum++6zYG=9KON>1Oh-Gw;rc}vR10eJ`Gol-%VoU&#=8D| zdz;`zj4z3VnjYMgK6>LSei9aKZCOvsv?<~R&pX`@LUJ=Rlww06uk&1=wOawO0+#o>Q@06)Ys6h8Mqk z5G%qwIheDYzm{NQMq))KoDS%G;t3!}TM!JICxB2Quk@!Zm$$bVVci_voq21-2 z7!UOFKC&SsIa&gb@98AZ@v`H>{YMOr(h5+s3^-XsRgyD zq|e~u;vm_oCwz>1{n#Ea9^H8ocK02O19&1qPjU(Rz)ZIL}x`l(b2=zD#y`+6jb4lnz-qImZMIRDxS z|51H-e?LV08T$S_clE}{^`P|(AoFe3hYZn8nmy!kFKruRLxlJ}TlCkcZS^YGRiT%3 z>W*HuC;OMO(vJvP+N~J-UgP)#3c!4$b1Rs6vene|xU!>En<3NZn*y5pY(IyB91>h) zM1iYJEVQC);?Zswi`GtJi-w)Jet!g${Ds4#hC-FOSyj@q~3@59)yYl{-q6nKCd zgjK_~XTj7=8A_?2Z%18qOLEC{W+3MQjEa&yD&51;Njxrmu$qH!4>w#^DnLg-BCu9R z@@LO{%@Gid(SQKR(5!~ZF;*ZyY}k2EJg?)5CwAWk*Kk_hY90f_-!d*J@zdeQM0g3g z{+1AEi`mb1^2*>6WyG<#JFs;q-5{$p(As;EI9BCckC-+5W58l;K0OpGkR%2&o>Gek zyIue_;m^$$QgCvhiFe`+Po5)WHH45CDBu;(W#DdH;kt%6#RA^Cnxn#bopgCcPWS)a z58@vJlU3d0&C&N}0}1xuxtVru-fsWtVE&`0f|dgz1t|JZd5F;{FRIGL`Aa6Ww2syf zJo0qeNa7s!?Nr-sqiCc5MNHqyu`ti|(z)Y8S4M@#VEo*oPSjMV5|gzx_|+gO>BS;1 z%>3e)!g68G64icODoay-2nlSNz^u?83aQsrnQHcetP-Vb zD$sZ~4)9c6V^zXGpz?73^m?EFxZ1F|4V2_r_9kFv1u?9bQsJqibu?r3lRlqhu)seFSB0?9MayIqT!c;`r^uj;&*|ugFp?e zBC#1$_>~^PO8zBg%8|;Q`YT=DIqT~8E#A?S1pL^Cj{eIGC?Cz(^Yg*OPAW+>1Rm2J0vEsGizitVP1M!XzsS#x?weKD5+ZgYuOCxQ zs7Q(mqN+xg)zYFriVXFzum(R*w*ur&{@!4r`Ng^5rLIdrGzfH&fu^Nhz?ZLPL#itJ zjgKfp{@oY>C+mgEzZDfBo@YQQE=|)1i2mWsb3>juA$z`~^&a{9ISur|IEWmfW~{th z+s_J_BJwb!yp4q9qj@vL8I{DjA(;JVm1iLx=(T~(fhG6qIMd3FaqpxWy1))h?GQXU z=e!u%2h0m@9He1ai*9n2Yu9`1IXvikRHLV$qr7ktfNRki zXtI|079*xBP-yNfk|jS|P%M6uaVjFb(ewULdp37!7!Qx=5wpQMhu%r|I}N5PSmT`E zc4(Lbyl)LR#zZX-XQ6M*GO`Gy2mEL@@`yP>A~7-L)Om1%XTgQYC42f;UXv-rUr$aID=0bc5V1-C453ue6a6phBgIo+ zJeJTYxIEHjli2==KT|}R?|0;IT?6>C>vIm(N<{NbqS=dM6x?gKCI*U93`a(B;?{fZX zvTZq3z>Etad>Ods8a=HqAXLq0Rj0rmdo=5s{6v9i%+lw6+jbeMh#9#S4QWgScGGnp zo7pqKQ=i8Yf$LkmC$En-ML_kkv!Sl27=#C}w*MALrvaG0b(W!+z?f;>Oki+roJt@` zApauo7Q5epp?&XGqGA5UBnQ}exi}iRxcs*o@js><^(%)W4y?}^gPY1l>eHV z%4%xXrDruc@?D!WH8lyK6q@WDjdIS*&0l_Xazujb4?_tkxZ6)&@7)5nhF-)ez!e`s z=~H*g%RWY0-fRsr>@xE0hNUrf8*f5hvw1F?_AP-6(yZ(I<3 zyo>4lDaxDc|MF7os7u{ZKY3~EYSQ2qBo79UgS3Tj8T(+H%h){a2iR66R<|6K6zpf4 z(-cjCX*?u%eI(zgAMKBOapi<1H{Gxo?a$gKJH2D`>nn|nF5YmZ%g$IN8!}m+N@17D zCp5iyF`uR19TYW%ovksR+WyE&yk6wXshgcySbOEmowe8B?HNqNfR7G*V7hi?@k*ur&27o!&r(sYKpOXnR3RA&+ zzwy=-PtShaU1|#rVK$`RRh&Tntvz^OT<|_x^|_TWhejd>9dEhZAtL9+17h3h2f1-( z-_aRWTX&6!i|uoNd3LdE9qIQfufl?ShjNCQP&hY`O0EilYrRQU7Do0ffsp$ty1LzT zd>E4dI+Gm$0yu`C11=pfMRV-JuJ6L9Dodx@{HS2fFUP1}BHw)<)<$d53|gj)VYP*f z#an|qgACcvQ<{NiizQdL(ZgvQD_};C-weY1@)C!$YprxCk5;8xK#r+2B!N3B{L$pA z=V%`GfKvvaT0&&oca9t_&nkMQ%pRTFnjC2r&T}}u4|olX1zX#ux(hcSCM628?R!=t z@d%Ph64jhB%6cSfBemGEt0(U+#@Sr+C7T^dzO@srX_Wpvp#E{2Z}b}}`-f~U z0Y!8f1mLLkxhj!IhI3}*Tz3i7^kePSq={87$X zl62L9yOp~OMW-%GL#*{&FN2>5riJ%f({>VZt*cxg7w`1SnEpvfNS@=qs_;2#t%s)j zVoq&4yq9{*)T|f76M@7B@jmyKqqz##U?ZmvUDyY{9ui}^me9>^c~rIu-g~8z7*h@O z(UuCCe){sSR#mQGxb?zu4QT!5L-+ANG~O=F9?Y_yYm-7%5CYqGh3&pJN=*=YX!w5& zk5-u07{$Mf3t^hkH!KMFznC1=sL45Oav=3w)e$X#wp^=!O5%`3cZwsu8M4_0k+~u2 zi~Nz+WmJh&rMBh_JR7w0W%^6teO-uv1IpcQsdr%b+X@);LyYzUa3Xo&@3<qfBewBoPK2&W=^yiylP0!Fu`W@*5lJFDaakyE_M2|dRXr<7 zX>+<7c&&UI-iNfrmfBROkyrnFcQ+%=Z{5C(zI-E9h{M3hg%f)8f)Ef7_+dUk8EaS@ zMVonax}IFtU$63st`H?e681+%-f&4abL@IktNUXfrB?2Dv!5sGusb1FD%L_chL zo#E{7lo2$Q5%)X$&q?Ho&u4xC?n{H-@jgH_M32YIr`1N71%fLUCa8WIz6l5x zAnJzWHvaa5^JOym{F+O^E8Kkf>_Z%nY7+2Cy#t7qPWh-JyxV!K25K_+691SKcss5W zGIIA!z|ZYu9Vm99lKcZMdRk0RPq(ex-sR|GykGmdxh#P4j&Y9=-2{#={YxAq1U*f24xawA&Cr zssw9p=F>}8VyxJyh)at#eL7|b&>Hd%wjQY(p_cXT(YMaz;!AG&QZR-?m(C>CW5t{r zawb{xo=kpaEYuMe9-(kRl-i zM;$Voj2{Gyf%L0s2zh8y%-O6@$e|_DoU$yt*Q+Y=$?5a;{)xKzsT~jrm?U?S9ax)* zN$Kc~>FmIEt1uPUwp+naj}B_Bt3zHl3$zBEX?HHQVlR!XTK(NhyCYq_CCm`MaP~+Sb;y1LM#rn_ntxw!E%Z4usA9Y4y)o^3nL<(BxbQwYzESeFY+>%lA*#O${5NgIB z8iu4dayA!&t`q=J+m0CsCjIkcd=oD`PZleus8j$W$jpbt?~+3>3?ry zQq(r=_c@UKo-~jkK*qaL4`jBuMks{lipAzG>=R1g6e*FZ5*yP~r~-@6+lN1W!i&je z+;0_udm~)9UBX<9ytJS~!7d(9ln%z?qxl%Qj33`qDTk-4P`K1X0l%%DQ;ajJ*#)&q zjGE!U*OO9=Gxa}DCLe~{HgMZaerVn!@$I%%&9<%X8a(CAbEC|-RH{-lVha7yXW+=1 zE)r-z5Un9}BOAy>)&?^RYf}ZAJpOY!bh**f{q}2Y7{%u+rn{*u9<-kLIUQJI$lM(n`<}|8eLyD)EGLt zp)glIiqcWrY#YWUiA7L*Z6+#$FM z?t!*Ir!<7pqDkWN@RUjZI$e)PB8RGnoq6(vKdnxMk)((Xt4^ct2A}5X z^#V;imw8U1X(^djueBQacgJOJbmF4cQWC(mzTEq`NMBUwVK zb8$rgTrj3|30B7UiZ)M5V&>BaGr zb0khay$84&>j$Bp<|oVZO{)yGSS}AEOOpfL02-@nc1*M;bBLwu2iIQexRPBRLl7Jd zU=S|STtS2Wavq~qyE=5*S!IE<38il+Hz0QnI^jLty3IwtsJu`KWTrT7hc{;&jboL4 zL`%HvQdxMY{bbHi1`#)S*`r72f0~|{m+I2g_W}ThAOiRTLNSoLdo3Zgon=!O(2z$Kbg-Otcs?h^|o8MM-XsCp3CwGfa z@&y1~-0(kd9zG%9XdyeE&`wE}*9E#efOK*+1&rJ(+X0L2G?+V4Yoaa8` zfvKU#d|nnVq1w*J6kk5O8!EC1^LKVCHyH`}r^CB!AMEy*qtm9hZX@KZM(@)HXg@MY z@?&GjjS{kKq#;qYY-{tDJpCKO1_EkBwFS9DL|9G^6{&7N92@u+NRER4d&aW2vNy9Z zviQ%8CET8`{Lla2kfd0Z9fx%$B>!21-NRv{;QLkms0k$H`H*I{rb-FG z#;go3lwhiAbKei{TXHte#S`iA3fySHLV;LxWx^)->@K(3?w(XO-!{(w^01%vK>MDJ zqjF;OwMT;USXG%hno|HeYtq#7Tl;t)-@?E=t!HDn3;}^}*!A7Ty6I~vmDfzOlJ0z? zuIM{&V~|yMOJ6U13&VMswY-1<<#-ryoJ`fm1NBW_NFeQtXP%4P3*A*-0$coPrZ$YFq+yr;%3TjCyQ|zJxr!kW$PBPyS^}{`*O%YS=9kx5aZC(!jtiM zT+edwdJk?Q(AMyn3lY{C!H~lf>z7vb_V3c9wi(!FeUo6@x0xFq1azrlKR1k-&`4kD z$)1z!5>sE$FUk2ZoLYE=Yh!hjZ3~v#FG?>&pFD>J76X`x_zQc!U+@Lwm-NrD|0T!y z$DY>rwpydO4bd0m0R-V6yEfQp34QMGHyZ&qO(`D)H;o&E7Ub@{9aIf4Un4Gi?a0Gql+#7Uk7Zl&TDAH7c(V^1Lu_wZ4@ zPty_Ptl|KSpYS>JWrSQG$T7OdA3FwJ?J8hhxI5cI*%oi+wRLlh5GByCLLHB2g4&7& z{KUt8;9Tk-!9swqasa?{Q{dUr+tYC&jSfwQ!i(ohsZeTmX)R0Yrhj2ONOHX>i814E z;?KvQg_UgwKO^NP@QztVEUtCTr;Qtp8|g+?l>Iw2T9O*euJ4|&>)z-(V-|ufuN&ID zpV_$-{JT1&o&@x=_w4CKewmo7bRQm)uPF_&7L2YqA>oG;X93{H!nIsoodp#JhpsF= zU7baF<^80{42NEX6}rG23j{fF zK!V2peFRSII$J>?qn9Pak~4|+!HM6kg4H9U){PRmCA}eN&K+M7N}4fYauL$-w~)~Y z7_`pnsz*t_Nh}*a7SUn=REN8EqoTjw*rHBE1hJ5TWdd+oC@P7OKB^};o33KnqLuvz z9@cYR)`kHNx*vrTy+>>7q@E)%o5Z$(%}u8}s>XV%n|l%A2)iM~7!z8nkfqMfv-Owu zY!|iXLcMipKBgCo%y&eUwLi8k&V1@q$w-GOnLerk3xcH$9i_3m0|f0IO5spw%S~m5 zPP#)i=Q|)c`sV&f`5?nYTNN9-sYX=5;7sgYSue2dRoUc&}qHDWC*`3y* zO`mLP2t^55n3-e<{F>E5A?{a+7`jFKar)3cznKg{S+ zgPOXKL(Nn!-2_cxPcwvdWSS^Ri4b}u&W~HP1tEY8$n;NwG8w>kn$;<`PSS6WN8iyK z%2~(C-e;9nk0;-!H+mEta@R={psrlgYid)3N54PtSG)M#xY&Iw@i4(cKu*=`yQ_bg zEgd~Ldm^Jg*~3_RURd|BCsI^&o>BJn;;nt%IQ;q6o#-hfr&Llc+FK#3*a9q+uN&Cu z+C~9nL0&QLeYa?SM_N4zmk3egI0H*L9Lo&^?ScAc=E}w*c2g<-V(-JI+vT_DMJpX$ zuzw%0ZHxNH>9|#p${g)DeJUu_s()+gc-7pmKxLgPcyL!8%)LPVS1I}j87VKq!u0({ zMwq|Z9k~B1K+VnA%)m5lh6@A^#lhM9KkxH@aFViM5M}^eU?Nopy%-Bw3Xja)jtBK* zqpef`eH7nQ?i*KHonkF)K_$4g@5`No5}9>TjYR5|#)h`?CH?We_-!Wb7xc>8P@Q}g z6-`Yo^0b?tO=xGbj@sX>nl`$pb$6(BPvR{CArde|P3)tl5$U1o{X6$2&h7^FjjeC0 zZ=xM=*Ek^ksUBNGi6O(~WNTEw-eC;csN2%6k#W_d&7o6yU4#hrX5!^$dn}fvRX)i>#rw?h^Ognp&%Q^?MTQuWP*4$S@ z1~2UpPlyKJ&(qrPi#@?bn>Eit8;<{1OYoEBciKrZ+KfdZP?4bwZ56IaJ=HbvW6ln) zx>LaUCi-hvQYN~VhhYDy?+IO;_Xdh}>v(=uPs{$)5w2v(o=#9fX7lj-n?|{Il+>8O zuxD>sXu4B0)H;?Z`@Qdi`ue8@Vw@qD!QLGKZrvb)ex1Ko9@j(*jTm?@1-fK#adun2 z-U5KPNH;K>d!Q!WiBIWw{_oQ%`t4xlZYZxZ+Sf(3PJ+YU@ZEH61VV1ejeEG+8*Bnr z5UoGO1p;w+!^|fWMO5wX0ebio`GcJP2$k@ehb>msK-22b%}05@LpI`VwVne#V!Q+c zmf}C7x8CCD*8H}EU^z8S*hFSExyRHy(o_IWW=y~x=p)fW1FkJ~Ykz*aVt|rcMn|L% zAzB_u_FIlHcOz-YP1E0Hzf;0tKW2ozm@6l7gg@u&YxWXMsd(xa2y{q1;YGd8F;Ty( zq!*G#JhVXn4IcYii6YDiJs}WgqkZ3>cVU6q!=RMt+hpvBM2(Zl@W7&Nk zpO(RS@3J>7P(D`zXLmRiX~48R60R(0sdD75iBHZ(nH^cZ^*k663aC2N5+Gwbd!)|l zV8!|c>mv0B-GJ3W$X;J;gEkMAbopIe$X%msoDa5VmZ0Th19^Y;I8 z9ie?!&agzDQ-sQQQz|-6urSpI6xwHXaC=p&eb1)^90^4!pN!N45E8Xt}Ejvr+GB zJFc$vsN}Ls8k0H0%`2fxgNUHBu$UeVu*aB7*(uG(aX@9(mlWwyU@#!eJ+Xz~Ty7V} zM-mh;U_ey&?@_2x%hT{^=9ZD(Z2Uc&u|5HyuNuQimnf_RbpI!Veose!)O9%etb(V`570&Yog zF*E5{7k8OSUxcL)1%$ulo{yy;Me?C!Kkl(CngJ{Qkgg7b6A{Lig(^_n>>Q?Gaq0fL zQ6)@YPD&0xeHLq-8B}+DdQy=#;lN9+;c3c~SbLB^_0#YY?{my~jPhV-ARn8t=c;%! z7uSQgBal_y3nB7evB&e7b2{S&Y-?`3J1^?~Od;T+(U7CFC$W{VAB8M~Z}vS#*vKCK z)MuSNT|rnoeZ=|@zZTAixy%WY_5sPz^BF9tYQ$-92@V^kVMpR0tjdn|!=)aYrHv_i zz-)_;1fhaLP^3-}L2%D5#`r!{NnrnOI{zesfCEhbQ|&qZYL#<+|A#C*M@7%!-!?Y+ zd`tPiimlQZn>jL@C8L+Zt1)~AMSzy$GB+Ui-mO(g7_iybHwl=7qnVI5``C+3+wJQ z-4kcLYJ#0E`o#CoH+KC`tgsvr+8UInc_z`=iN)7RRH%0+gNI5aPci21cyA(fb{@Tq zac6f{07D5=n6W%yKc}8t-Yilp#i$Z(#mC5zCSO10&(D1xaQ6YrC1jam6!{u?EOP4| z5!N4We=hFL{qO8sb?J_>=MS^(UoP0UU`EViDDSKoC51Vm)24(^IvB#?bzeXwxt|5D zg6GAAJ5fc)Wwj-Fw6f>>^zU358Bp@DgwTY~_QM(#a>IdnA!gor)=qVbsShmB|&7F`T9CAGRmVc-*$Ns_<&`>?> zQ>L*Ko4cJUxTq#_ZRG0W7*wa|Yo~?M#%g1K9QA(}(~g8i3xlKjYhWJEmJ`>7+F{sC z5V(BVwfgrz^ZvK2IbS+jZoG!y8)7Vi>LG0E)1ts=~(4u)WfWU z9(|%kta&+{QLCWJw=*)yy4+?{+?)v*As2d*7LnilV2GAxvOXO#Bn^)&6zH7cd&ArT z3Gc+m(u62#Jf@=~p5d?ze0cze1D8_%={z<;pR5S#(B2Z37g7TQgEjiTNSza}FW-0X zkFKYur#j0pvfdWPEyXigy-rHX0~Gm<3wNpMjW+6M7RU**sa2Weq-2SKw(X*8ug+qv zbb7|=VSYd^wyP84`-?Hxb3epDr2-TKH9&Xk9jMh{c$|+LV)1vV!4Lp`N>G}%6d`f9 z!ir&r;!1)rtjOh@%@&+wFSJ2hcK^H@Jo4iXggGN7xM`fsu*i@L&j4)b#>&y#`}5P7 zi_gU5vh62W@$B8Oc<|rtCt>qLt)DD;GO*R!c|ZI+JF$H~&lDzw@Ut;^_P|fV-d@C` zB@iwSU{mwiEjs+grDXt#)CXl7U=6<{0wpioRjCe8%t$&Uv}%`{4qf4zcrV3BFmPhx zDO#>eG(PG5eF=yxSuni1&p~u3m7xVHv>#u428gDKpX*5?kGL`PCSdea}1Be#9$ zmb(HUMHr;uj@OM6bOdl%bG00v!G-jzh+8$_JPl*xm+7hM$&rruN+iMeix9$c>X_$GQ%+k&+&GigR*I zL`ise-m}ukmGUSORMxGN}B+kv| zW@uCylrgRqKtWr9D{o<#+uGg~WA$&g>C(GU(Y@M*K@=F6r}}xXMyVst`^c^I*v`IpI)96+sEn z7@1?G4p(}0gp($+xpqa)@9s{l>MYi}L9<_{{_vbZB{x)Kj88&hmT*wn-Z{8rY+ZfL0RY;!ShT#cPPc+7egg3W^c~uT;gdcW` z2RsFo2lEC{X#uJB;)(S`@q&00Z{a9|f9d=-A6NHN-tG#2m6!(@9g9DLvx!6NocmU~ zaP@~Ithlar$nyB0VIo|P*li4d0J-p*GzQaJRBqtm&FhKs7jAw`of=lMExjn?d-XUp zthM><%3J~3C{sc7K@n=mBSi3AVKk(^=MxObe=Q9$9KGDFOwAnr^GvCo6)AuJX?Z!{ z{SXgU@3Dqv2k=TrJP>hgQodYG9E}?PqE(x>UL@iq|Y23t+s3_xH+G1K&{*$MQ> zZ+mq1O==>O1sH2Z@=2_t)GQ{oU)oA*0p|Xzt};gd2Q-9=P)4bh6)-m>VICp$;QikP zuEs1__%X`Q_s`eAB%k-Q?3%!(xbw!8qJW-yJJzI~w-0}t45ck4TlxuS9lv$)dnc(m z@8}uXjr#2j?@@OTFCP!u434i#mp3-=As9d69e$Ttcfq4DeM?GB@nA|vS8m66A?(#q^0E`GlKS&1ODdliIlPft4zlepF?EdVeYrFzaE zD_foy!6T~!%pzG1J~whk1y-V}c_siKUvNVtBU|S^n?K0qdRtIqYEYtF%a~Tq96hdqYi{Xb>G`!KXf2v6 zVmXd9rU)q6ry4?Bbt5immtA`X5@PlPPnYXr^19Sd4jkb!mPj>ZbUX;gC#q@|f?F>T znx1No?C#sGIme$5tyOR(r2y{zGF;{5K%C8k(M9L1bU5m6-X%O4?AvIASbT3>dMKdeRD(pixXL`+>UN$CoZXb>q88SKq^6Q0& zmVEc4Sf=1pFVYkzdskggtE*)#iMNpC5+oeT;AQYK%zx1Mf}qxx!&uUB zk42UGSi)lPWTPGh{%iU$Hcb>!n?{#Q{l0@I-=R&UX-+vH*Z?C_D+hCDBYP9G|J=l5 zj(TM&!~Y=!$x*ZW$4BV1)EbT%@A55BWe2Pk$oSM=q zk?`lm*=OL_@3SoDduHwZ@1hu<06^Ky4@=wJxHxbcZZd$0xmpIPF&ow_%%>xMwe#LA z+MeVdW2N}UYw+nD*9c%-9eL!>m zY)l&Ei_7aXhVJ%<_JwG2P#M|7oHcpeJL$r@Y1LxG(F`2aNkyd4OWb4QJ`UwU{{ck;Q{J^Rq`VMh9RM*CCy72 zK!uY>EX-LFN5nneg(;wFabxfa>_0ugCI_*9-7{P#qu92zX$Ls}+H<;VUy=MpiF!fx z?F3XVe}KM;v;XjCyPW)J3ra1>Xw2sh(wnG+1p5aP<;zhb?9n)y_)es5`!p%FYot>F ztGe@UKAZb3885($n0?={aw)scb%yQ*S+;O;IIul3EGV8oE!-MrAEHBtCQ;#tRv1Cmn>UBM+Q*tWE@MDlpBGr0x!l z0>3pF=r7zBF5ZJmaqX&o*2fQ|rayl^H;oE#N zKq^rXq?!^$gskypKOlgB=rI482JzAqszKmEUmWWGY1jeNnpWSJ80%Z{J?^-vtEX}>iXvRv=e%}Gff zDT;iC#E=&vxv@DOnzSAzu*_s?dk0)Vwv( zv#ejx&^SOC%wNK9)+>(NqI+=;H+E!c)G20$L0-h&$9a<`a>XaAX3ciOj=)f8AmSZs zAooDjVf%AE5th@SfRhr_!h!eX{dVhSE$ZlFW9I;5cTS{$*!}=Bp|)9en=mK0J6AV1 zr|`#~w#{!HDC7q^8N$}ED+JU_#Dhf>;L_ay*c|{+v;+m6c&S8h|Dv9KyEP=)=JsIN zk8UH6zva!)uEgls%L;pBB)SBv^2O6@we~G_^*5(u&qExYBkgu6y|Gi4$g%y`+do4= z;3#~Bdl*^&LS8SuEhOXqMTXdc(CBBiKjTe|zk!#%qc9G9`yfZ-#tkW%S-Z#T_wHwxhM%xuSlv7J++yChH}CCWkVM)uwc2@u%XBU zbd1SIjB6^XT=HypvQwlpA}}K9c03D~N!dN?YQcwCHZ!e!T)Bz-gK{%Ja9|vse3Jw@ zHUpA-lNGGMpFFLu^UbHuy2I7O@+7hAbNe-$rj+t%$?1Z>tjcX}q}cyW#v6nwbmk|3 zG68oC_BA2I`3=p7?4GLQk_e;=wm%X(5|VZ1RUdUYG$c*Hqhr1k6u=`m zfiyheH(@l>4#CCy%L+uB2-_Bx@V{#Ul99hAsFUIZaXl&xFcF@2df}Sn_peSCMG<7=H zRIN2yDd;`!^qx+k7Ue=Z-8lV~apqX5L;qzEhU?waQFA2DWPK(-n`y{>TA6*6yiCX+{6X897U#`|(ChK0){;qvQX-G_( zIdll7!PX*5?9Y4FOS=+VmaL~JQEAxYR0J(9%QKSLcf_!Iao?i>w&w2}GgB%-w6xUJ z1S9jF5iPp_)f_JjmBi*+iefgh1e7oEuu|+??46?#)(&w}`KK3h7WxCXoy%uQx=qhY z_9<`ij;#1slx^wZY}q0`x?$gwxD3rrkmFA!xLrnNs*V| zA&xSoXWh-HoKRg--#=ec$d})RI4fy3_vKwwAO9mt#z*%VL?M8al59d=v_#u?(1_f7 zE1i7VxjQrhhx8{DYo_BZ){_e0RpjX*ZytcxengV6gvtL{nW8 z2nk?r!Ln;P>QRC`M3MTftfo4WUmoHdn-vpAI0flrT;>`|_ZNv^gofmH1Z(aMd1R#? ztrFjH_7!g$_pvFcQf^et%_$ak&Q338eItr8sZ>^5ne;W$SP7L6?C`t{ zy;NoBJx0TPwPLIo7Lg~A8gdSnmZ~UC=Q043hJLGqoF_>+fDR^zh(1F3N)sHVq&NzX%S$*9caMc#`_wCVi4D_uxYHR9{CNQI z_TR+A>U{PMz`$N(XH$r2f_+khDrh(C>?zw~uKTC|r_ra&CwQ*_=GD>8+`Et8b9cLb zx0Y_vi^d!PY`*XM4Rl(7`1zy76E^88`Ycx@&qoa^NlD8^fRCS#S(I^XII3}DGN{zz3r|(K?^+`+Z4%YKUfiJ-c#o{QCpx2yjI2O zJi4FIvlDmuDO({gIgE0x2wiJgZkgyn%pUw0@_Tn$HXqTVH|N}Bx&S<%dW9FrHMo+f z4kBy9AHkVerts+^#;`e3cy@*R1jUj>vYI(zLvW8H?H~!nSz6?(2Xjvv8Uer$Vvb=) zv(#>Xd-Ad9sw*0C1WOgGnMfk4Zo6_GGF~sX|p>7 z-UV$#ITwBuGiOnnwOsGar3X;A9yhq%npRPB&dNLc1-qmDgvBvuqNJ=EUS`P0wPGo* zuUKq>hFk<3>nt8!ZDT^Yd6hl-hwYbq94Xkus>T-j(C?R42Vjfe=&r&rgDRRZm~n&a zkH#k7oM;$+wCuRFOm&pflZh}y_+CcY#2c3}G7G*cZbd1s$%=*6qI#XHd3{bsMkHOv zJpFdZUd`Mzca_KLY|G_2yAO&)baFUIs+-#=_jgtmc`hT2bH>kVRP9PPg{?TZwB5=H zDJdt{;F^u5tvvIS1ct*g{lGp4ZNZ8Q^!pX#Yuq-{HjsKS_NxrhE34Me zCvL*v>*hD4wT`E37r)sid@1-WXpu?Xiu)+Hdtw(JxGN|kHw7OBZmr-jv*@G z^)RYQVc?~Czwhg=Hn=C#p5LGbfAQ+Cx_BJ42{I&~xWIL=FFEyqKv#`xtxDP??Wy#0 z{zj6WsssFouZC}4g{ynPkM3C zdjQkiqa)d9`3tIeBPlgfVWjen}MR3MX6RAp-d8tGK06FrTxZtsQzEKfwPI>OH{`1Op2ywPqtqTq*aw#abW4GEx+qyb3uYeprCm}1rOo-?@;zL1?1SSU5NVZ(D z^vucTGJ0xFh}I!49PA0KSPka{QkxV|hQ$YcKNByrM50O0npwcNIdsPV<*Cs(VFY@7GV=I8T3 zpV6D~$@I~8x^WtQ>SOu7b-%UTcl-3TNLc$Rm%)p&^!uiK*!M^1&KcwC87?cZ+(wj< zg>WVYJoxV9gLu=tB^sy>-O1Y{S2O>Ud%JGZ>-ce^7FTwRH$w|64afBW%_^L!9}CAj zK+3L2qbRFI(kX`G{mt9A@{dnOuXKE6V=#gphrQ4;cdoxf#}AQtR4kJ}*(sGT;!VBX zt>*Brld(d6emV1>H29ja@RmEa_pkpSUGEf~S=6rE#K1b-Qyh7u_M(>QpwVz`1I zem&W3@)P%(mGJ zC*n*`zyI05v19vSRh0_LI%9>jnKmz;g_t(a*S4u@?w!{(vo$lxtgWrCUV5N?(=57c5OY?G<>O;{aVPw@Z}@VD{D{ZDUc*tV(LG1tg$ZyK zV=tsLtu}K3ve+`k=ZG{uqR~inlM*{ESixH&=}2$K3sg{B$%dgRUdyLCN_+9049G>p70m5%K+#umDc@2Q*($xFyU~6mt_#Uj~p7?9pwJ{sMRcq(c z0pYxA65blVpNeAzf?wUhLD{F)HzSWoNU{vNkm#^nb|`$ifFe?y=7jr`Zi z<@0O#WiGbP^j&aqN8bT!$JfQli8);fSZV!>;Q6_-P9ygsm2m`>5!g210HCWYXCDO{Gl1}q#=0~e1Sfiaf* z_(7NR$}pe>k9ravdACm8H3wkz^t}R3lDtfa9qr|`r~eC&L7eX*avWA8_H|e#CTWi$ zWv4^x0o(*!DKaKI22HyjI_c6X3c*$)e?ja9qTZ1wz);P?tVXtHtZBuPNF=@henK(f zc=*&ini7vqit`-anL#@N0qzMh?FLhgBfcwiu=GMK4^JY(^{;Q}2Y7vVwLY>T%mSlj> zg8y=^NrizN1!%yMxu?~KCb9bW{@?%;@b{iQ&0OmGBJhL=(t;yOe+Am3C~EA6%Q}#8 ze+KZ#N@MHpkNNG7a4~b({9K9sHagt%QnvkVx`Hm80WQv-I zu+U;*2*@-*X)LZj~fb|yaQV2F#PHHNsW{!&HK`f)+aelsf~&tNf1o#QLV zJS_i>j!yeX89e=Eume+nO=l39uJmKQDiRA_ZBIZ%}Q)Jvc$h4YZ%ZjCP(#F2RF#3S2c_AUB9QTl+v?GoV4&p~!4N?A5pxTAxI!}ax#R~2am{Fd zG1`;+Cm83^!A1rp*}5NFf!kOZXglG-FhiJ9e(jI9L;-(T%Sg~MX;aR_6L#KQ#=H=} zh5Uj%dr>-`O?;v#lOQDt91(C!4Sfhm?hNt#;!y-erD;i@4KSyZF69F#aS{?khSKKC zGoOdyM==1wa>rQRGSx;iZcX&-6qXDPzhhsen1K~2?%3eavXC14-F8lU3V&_~-XDY5 zo*bE00YxYJ)6I#u>EgsurV@A(xsW7Cye0#99iQyko$$FZ18L8v@e{*-vnfVC%Z?zL zl*eBzIHUBM3N5uiCIyH>%z`eIFR-zih70ka?g3CFa9MmR{!lBIFq=+pq>1oJi4*pw zB_fyf6$4*34}G&mgJi=er%J_26d!ICY>w;m4B>KFms(OFa7n{S1xFjhiLV!^ZE_Hmm20VKK0m>^9ev>te5&I+@;8UDSj2U zH$|IOgO8cjk;Y)>kDp+$3KHkp7VcsYCM|frgOXIUniqS$QxtDNpVGQMnn{$jC!M{r z(M;(MNx!NM1s|^sgeR@vB5tJ{qsQop`3v9`N@3AadZZ5QkMSzcahOoTk-(G8Qzw2o zAsjgCTSqcfyz_dUXrpQ*aJm`uXbs&D^t#a`D}W0+9LRe0rOhd%W0s7>93Ulzj&w#t zd#R9~A0Q|6MioR7v(|kva2~1OmKrZv8C%0)a(qf#@{VyzV6#gM8vf#(L)dl~;RlfO z=<~=^m6#k7XjMJbHKsBOBRQcLQ{n3IaTyap%$D;f&HcEd$mY>6Vylg&@;TMBOhNYj zTw@eKW5OD|eBN&sIX~NQc&d2#+dU^g#fNhIsDJ7 zo-L(Z?(x#vQds4Wqi!VBWU9m^8__8ER0-=@QVi#cXVSFNTBQsj(Xe72^rc``)RCgr zD%5c=DfARNk@(!H^w#WFoh%uk4rXbz|@n56e`_NAbYkx-lS5`O;IvE8c87 z0~F%o&4Pr7e6xu+P~$LNxW_q#ffr?G`so}ZMPZbX;07&r-xdn9P$itJCv$?Ptl-TqM=y+pb$}0_jH?H5d_9&~Fz_2!^ecXGQUjqb;i)zxMXMtCQqzU*eNGuV%; zX3`J(ri|#_{rf$SJ-LPgEv6%eDAO{#9x=BfFl@uh!W%>1H z5A>!GE3{0MFly*1$=|h=|4UU<@K<`pzeN8Bi}OkF{Vgi=*kadxK0pYi0M`0eijVc^ z*IBCT7jNN*IM-lmHOazN%%P~*S(D=@KB&LUw*_pO=qy7?dpB-GD_3mGih!gN(iD}%#)KOqF?7UJKm_hMU9wjSf8H)!2nWl9kc5l2sm zTRc(ru1*!_bM8aS6l9Rvck~_YD1+^$fA+XIx-l^rb$|geu6}eK2?@YHzi%PVT}D5V z%pRK`>N|z6pRnpjt_wYoU!W!9pQxqZqbD6tJ51Nx=YpDbgx3hY8HG-O5eCb30W_RQ z*nfkUo-of_Ldl)ex+eOc_D2@5uPdW2;kV>L^|=3{2x*oEM#A`Sn~*(TQ1?dhH~>rU z(Khuy2+RYld21mVwj2EvOVmlL>gQ*}oKr-vMp5rH6wEb~PV3MLSt`sjMZ(S+YOkOv zm9BK-?nL#A4;oBfyng9+RSdeTi5*u$kEIQ+bu;ig?9a~@qLo8@hqX}PWK2`nQAQ6+ zmK?7Yd3t>w@_hjU$^kFS(l!6(4LJ_ljlgH@Vbpm6vjl$8^Stan^GE4UDei*N*r z{oATM-qhk5n2Ph@X&9(zb+-l<^>h?DHLCOBP{{2As;(mTl+?7k(ZH$OTwviI>Ee}t zi;ncwtJ=OXr@i^=3k=Vu3u~h8t7~7;V7y&1h0aRkC$2^u0EOjzXUotHkgp@op=m8VQQ&nI(BpaCtxs ze5idf9|$*f8S9&YqSa>`qUAhxt1+uaKu77(5VA8g1Gl2t6SBXYTQTp?XhiZ#r*^qxh|AO#Qh4iV?jfNkUOe>~OCp zlje^5qukv>&Qbx)L}avQ4o4JLdg^8)Xln36`|Q?d+-KTl;Rq=?;iTMBAv#)GUS7^v z-evI`!?XiOH)fERMAq6x=@W+up(HDC+dm7qCQaMsW{%z`a(w%nhYwCLKh^&Ll3$X~ z=*!FXk36md8&XNSki6mGKIYdpspCLJ!YEIC@zA{sN(XT)S5==YzKDWg1mhdpi4s}~ z9m-AvzB#c%^r+DK`sOC9-XHD`7?d5BZK4K-ndPX6Toq<_0D#ayf*=-O6K+xf)l&lC zDS(4Xd%D+&0L3l`v2}n>O3;MoP4zP`BMGFp7Y>&BpS>mXj!{l#;)^ent}~BEWm~#M2aGas-0%w&UHCXVd5HQo~BC&V?ysi?7Ml z{z(J99iUC;?Zj#@TXVf%@UWI4=!Eg04+%LYf7!S&?#?~A2uh9F}X?>+BgVCqS`4-BsU0=bu z*qal`JS$YGE`H@OV7mV`(((O#gm_{&B1%n>u=9BFP<283>YCitUdJSZmZ1sUtu*&& z_?p$%=n1ZWox#s3baD|kkR=A_p46zG48D$w8iZ4NhdgPSGwTAqnq1gk)3yP(O7PNB6~xq zky@h7pWmE}*ygs~CT0ZC?_MOQAJZ@NI-_EU#}OtE_?tzAf1VZAud?n#Iz@>sIg-N& zP9S?Nq6$ChvEIsIjOu|B)wIFs(n`;v=*2rrhD~L0e`^KH8$$NR2En^MIM98n&MM={ zKymR9z{OJzby`T{j1vV_oZa7d)dv;4a-{dAGBq_9gwhHBEqnzW+E9PT5f46$P(6Nr zdvaAE3ofm~zvXy$yUou^qWKt2>VB?3yV1s?VR_?|+g`At=L7xg0ELdccx~%j#uiW< zGs)ZD1e40assF4|2>KI@{yZUrmg+_xI`d{W^{?;u4d6PjY~NmD*KzUcTKz6~%1ZzjyZwNk z6e2?0hp>R;B1lD44@iCYB9IU(+nyf;1`|u+G?Fi1a1Z}v68PC-(g;#XU8RMU#>TujYy2f zfaFx)B0n^G*`hQ)H6oE(n;ywtaHR!NLsO3PoPeD*0EcKTXoPK^WJd9ff`CDnNYL=4v9QZ@E5 z<}-ByL%>OQ%efx!l+ak|&JZ`jPEr+OVostQNT-5+H`}Z)O;h$`;p1C`5!FFGWcLfO zD?Cs3L1EDCOe>Sl@T+BIO> zTMx)s*H_~}UP%uge|LViw$zNxGPp~iHtGXxd&8(^2k@8=X}V&FdPE82xp`vyeAB{| zGO3P+^9A^lV>Ma>CCfdH#~I%V97H`xM-Zkxw0@(xUgl>BEGj!;cWZpilH#cfPhyfK zf!EK>FhC_c?ae@frf^B8C5{4sC`V3jwf}S~NtxXHRxWJZN-9i8kG`5{bCkK1_kdaKtk*iQX*QTN(6EQGq5! z2@{ou#jcPK`Ztb;KfjC~}ip7k<@c_QD^`BgySZZ7X4b;HPL>m$9H3 zx23PF;G@nS!GbYb6_TAr>4<>7Mac{JWVf2ghOz>1nOl=HpB-goO)MrB;q5r-#a&4U zq22wT$HBg0hDXx=e<^$?YbAw>r3{6qnh71PF+pUish4iQ zBhoE+EE?D8CQ@A1Hh3cd46rU1+SQj8Y74)>i-}KQ14*)ba_5!Vz2?<(*}G^G?fz7y zLXx|Ad}P#Hs<=9@50p@RpA&Xy|4Z1es4$j;tNTcI#3$ySJ6#A@74{-cFm_rr5W@X4 zld|96xFy+w7Ncc7=}lTxs}a}n%cVqtLD$QrF#&ZRu~?`P$R; zhcHJ(06Tc&u3S|OKyhdrnr$Sk0*nX-Yjl(wp|lORjeIx)_~illf_h9>L=k`x3lVgAASd2qxo@kch;j6h{Tr2{m#a3=pSU=&Ynn_? z`8c!GP6I1zrb2|aKTuMOjUx>ydIMf(L#qbVlR0IJ*1H?pDO_=aq|3o`_UZbo5BR)QIVzgvd_sswh~4Z-$C%*cBP3(Cp-ekU zm4&YnO}<#Q{P*B50jHkw3cI>O9p1sxCIiI51ysRWfJ2NHTUlxr@4szA^{IW2DA^tj zkj>FY82zuK_C7yYlMgjp_x-;sDmXXW8g?o&mAiNTkjvrNM0UQW`J_3(0^cII!c&PKAWA` zzDCF4up?l&aGbl}Lbp6-`ihNynR_!6T{__M`(7QMF_Wbm>il5}O>D)-m5Qnmrpx`JToUrV;Z5J_l6Zs?ZSuH+7G+W>-rgRzUM$=%H__MBix<5FjC zoYqYEJjHr&{Pvdx~0V7)|A3EoYm;i0?S)@lr|aP-AuTk;c+VPGkt(v*MaR+z0Vy@MBLv;cEwx$ZpM zH6!XFux6@O{;o)@yk>OK~w(a^x3i$18yYE!=T)K2d0NvmrJ#YlTZo@A@rgAEg z0p}4?8Dwo?2|mtiLLMsK2x-7H({x6(_Ah)wI2p zSIeJ#Sp7qLKu<8PTx3(u6m9BLQTJ3OOc2km^;nwQ1`EayB4^uSH?SP4jJ#y@Lyal0 zz&M1DSO(3&5gK_Yq_rSM3kx(kv$(QItE|qV)k2+qtNGD0vDh#p6si*mZaL1|Wg0ZL zvo?4ZG*UFg$*`a@LnpoYHz+3Y@xRXJk7d7QQDe0{3vNlKLvodd!kSKksbuBpZ%CI9 z=KG&L=H(xRNUi3ZVY01zIFCqhBb1js291|ua~*uHBP!wpm|uBkxXHi`Pu%o9^c|xT z-U7%Y>h^(^NSWIPxmq4obSOvH_s#CGCRm@trJJ@KZNNt$gwP1-KjPZ(xK62#pN1z5 z($7=@FFj5G4B)Jrr(}s#Z@6ug94aX^#$Vm}Y3X@HWx!(y+ zyvW2pg-TKN+;AGOlbB*V-{fqBL|>$dTSIOc`dKWi}+HqGX<2?b#=9j*g7l58&p%V*MH` zPI^c-Iaf-8BqrWh!p6O#P=a)4dCJ}Jl{bI|Urrb|6J8PToP+L9GJLc#aeKd3othyT zOcMN#tXQ-6xH!LlYU=%U2WLy(`vlR`p=`x*+OqjA6d<9w&<=q9L&f=Xjmp8%DFcNa zuu9;2w{a3eULF+uheN0vlevfJ<#DoM+|1lTupt7*?_>w;jPGeQSjtlU183rIFYeB@ zth=AXi7;+9xQhng3*=w<+hD-}!G9k?|CVp>VJiL^^=2;Z>pE`*E6{_Pa*?FrG>6b! zkn_vgD>8M>L0bTb_g0~G&`LCmN?sEw5M`st$|5%=l%Qzm5K7$4AV}sVWbaFJa`SD+vH>h{tV}eBYx+wjDaHEs;>s zXJX~*X{c;^o6T7-`dJ=@$(m0RQbNpJYh1eV;*%f;wL*Yu!u8FtdKxn>3I=-6yv~if z?A9d6B6Gl-+}3UiZ|0DLzF^j4LdW^sJT-xkTA-I3*m`Zk#L&j%9b#1Sk3zM;eAK|U z#5|++`h)?N%XSYbupnkI1Uz0k^kv9OuEp~zLvPm4(#rg;fB4Nw?$|aP%sHIYwi09X zWe|Spuc)c(udHmSD{qQZ@VOb&8QY7b3`DtF#sgvKU0|8xuWe*S5C7PKAz5elo98&_ zr3Id?-}A#BSx zSrH7fm`lF}7HOH)z$ya@3}$B&uzx)T;h99(WT<;WvXG;=p7Znr-}< z&QRAu9s{2*7vO6KcZXoG>!Tk2rCn`85f&YZ{;QXmTjR@m(mn!fpirt&RpXS^i8hTE zWH}s{Ma?XYw?W$y0)FJ9JjB8^7TaRt1{>h0m3zzQNzB0eolwwG(&WGBf`G*td}oI$ z$-bTPnytNzR+q+Gt5nMw+M8C27#OI6VqX=#U-HyA8sf0dKu*%H62r+Ox{(G^09-dB zGvT|;OOs0-!dU$2GMKfsa<<2!EYnBR;2UI(t?N7W4Z<|#tLC<`h#G)&x-rH+TsJ#O za=dC`&OLMAXOdR~;%8D<=l{Hv)wA@GZ~JsRQbSPN^8T-Q^&eQ4+90jZWWpmUfJx1%zu{?xw@lq z4epXAT6EA8Ew?CzVnQ8hASw>TQh)e1URdN~vG?3IbMw-rR5PrLIwbj##d4fuOddzC zjN15Z(^0frDv{$Gs5Svsh(5s&4}tlnU!bCc5a0#TJ@Xk0*Pix@#YR5E5L^Tj+e(Dt zJ;=C(WKN4q2~L%A=YLJH7j-q*1+^Hn`>1^z%y(4?d(+JOvjU+_ogW$>Kz#&Tw8<$& z#K>pqsttQjY#&IhvHP7R#d?1w4P~3@ASI{R>l;2m?q`~0=am37BkpX-^DpF=74p!@ z9Ylk&D9w$hngf1yY#_`kXS}!0*B^UpZF%L1mkOsu$@HFx-wiPZDUw8r(3LN!VM)+4 zJt)bQ^G9X~Zu}MzB+g=hjp-vCN9h%DF|X$sF_28Ou(u%8KHwvTWxGoXigd$)9UP?D z#VJZ7Ub8S{k-z|CUFiK-$rOnbU9D0WZzoda7h8g>r^xD7ZTfTz3M6C6q?qby=lQ(j z>vE;VVRJ~<-<{)HK6m=%>spL(4s_L_9_Xo|D@Pz;>k@J2jpjR&UdMO0zaH<4)-GS< zt0;!4T0r~PnUl35+r;cwdspc4tW%H+u@sF6RC>%5V4Wit_9fcz@&Mks-J!(sM<0<{3O0Nv)Pfz(?EjPEWby$&p0Zr zCpj82lhO31hgNE`6iH=}r;-`~O-)LBvQxHlGZ=+UIn@$bzebaRH-wk?^)W+-n1-3v z22x%P;}ZKj#hD{ho?;-7PD(zSsVsys3@CkeJem|XjTd&`RQfLT=H|u60dSy3@>F;7 z5dS@7aM5+~@{Lcwm{qo$li-SSq$=Gwu`5tc^INo`*A3E30h1zs_htuhy^8~ zyVqV78b_jmMQL$#J)weqo3<~tI*|T-Ao%_K=ih82UD@^dHzvlvsIv0qXX|rWoagDQ zA&5wWDZ#I9;xhdebr?mqB5168el?|Ii9Oy|FMQFR1-Z`N_%EjNc?K}zI2I@^oDekv z$bWyQzVce#tqW~bJ;W9O6Pq1vzsCUnpO0@Ifc{$4Th~|(9LZ(nzP@e4O!sQpbm^tr zR;W-fCv$bluqQZU3~D&vzeYCEavbhNlWhb2!q|#Qg7LOdzwu(8RQld1B~Z4$V@|)4 z9XKBnHQ-oKVrbPn`B`Y7{J^?_oGJE z!kbvDg#J7_3hr)P=*j5cHmchhXK~Z=pw&@&{PXP zcBRLYvAxWhRe_^*+%6#wI^aBL}fdPSmPxS96hf|yRI#nYWKMiy*qzoZu&bly;nq=<$lvWPm{LVtW)6XF}ndlIy`4HV*wsz z(V1uT^kWpj5d!B5e>6NcZR+MN8|~&9?Jk^V)^FfWJ#X}HyeMFGg3_RUz46-!Dy+90 zar`?n|EhLgE{4t7cvIo6Lp)dUBmskmT2lM+G!}3`g?0)ir!VUVPXl7|=}Fego5{yb zQS}vim4w8HyAh#$N7#gZ*P)7*UI;lmp%Ok%p<69S?j9}7!NMetbB#({{nOXW!`oJt z%-5zD6Lf(W(6rk!0_9Q;xkXO<&J!o5XXy8-Q}#viKRlaV{!ZF*f$h`N(xS?aDjEKs zOK}m%CB)H(ng_u)N^HxFopriy8xDYIu zfpoAxr}RNY)@=>Kc2=9Rh7>owW*$XOQ0Wo8pag)+Cpu3g=uvih>EK4u@SL<;n-6Q( z!Lll1uJ6rB`>s30J`c;#_B<%1_F!Rh`8+-9LW?n9!)m=O6X$O}CE1L#bund6n<&4x zs~R{&!OYIGgpXB0p8~(}x_4FY5tZ#wi^;w{o6eA>@vwFrZk6p$&|x<6Bp_g3+Rgzu zUKRjH{?z{ZT%<7`y~V>F8m~MS&!QBPJW0@)9&)JFYlb*TiCq;9MMZns#~Zx(YkG;5 zBc-}jMhbFyXaQaN@3~N39C^%1CpN-R&rYJa;FBRoZafi_J!7=6JN&~UeMW1`jN$PU zGD*K8JQnGsQH-Dgz1&K~krtWZ84zT0mLY&Wyz0brVpAoPxH+jer4ce7G*v24(+i&& z@N*q7s3}H)ju^kKS_K(!xU}xfju`*YcQ1!en*DYK;`ziL`!Y&mY42eFSKJ|7y+!8z zK|Mgkk1TOE7{iJkB10QARcBA69H`fBK61|=jyG>jtxvy{g>R6fBYMx6Yi>TdTii}& zS5%cxf{b!MBGuUrXj?#MFNZwx0}tsGpR>IwV0^W1vB zeky)mJ8!g5lLv$xes5mxwM5eoZBOrb?0zotom~VJqTvnp?6G|Jd^op69!!t0Xc;@~ zrrhNKu|9IHJ}YlI6Nw+bahk0rE0pzga4~BMJA2PvJ{^c`wG~WRc@qV3S6$3G`fWw zu(8N8jSZZzs`N4-?H=QtxMpv~Z7pur7+$>5fSUL^E@Qa;4!VVb`VY|~ddK)ii=*8y zP#f}6Kmq?Am>{>a&jjXrSgcOs%vC^+ypJvsPU?fijfN1HiqS*Qvc&IpmrIV)_0mV} z@PzVqM(BHqy)S$Ht6&y_`#fVbPOq;P;9LupXY}I#y}K%X9|czw1VMZZ_THUdb*ACN zl8i|?UR}Tovmq;XlcFp(uop^vF$7ABn#gjGy2#T{tZ#@o1iV+zUrOnL*MmJc3zhxy zZQ(;{SD6?2k0nxJk!^!Di$&@dQi(>r@@zXkD$ts#X4m&JJukP6$)ViaR-r2epz;~h zTq~;eFB~DP0Z;=PYu$%Q&~nc;_3!MAkvvvdM7qGdnW)900%%03=1v$Z=?;Y=ft$NU z5Y0)d!^_pJZ!zkyIYK2$o|vZvr4t02o}k;wzvj;4GEN-yQ91H@Y?0uC(OUgegdUTrc)@3DG5CS;e;0p%*l^QCz7v7L8Ge>;dwQZ6 zC^ck>T&wcWlRh8@ikhxS4hjVTNkXkyuu6$lyP_zOGgbzVi0!GSaz032QbEBTJIfgT z=Iu58ovk!3!yvHpHuD5q1(psY1(o5`Y2%3x)^Ug~&7!Z?ExtWrmirKGAe|)Zw5~-~ zV{G}`{5q+ z3)eCJIM>hTdo!y>cqI9jJq}LRqfbnoANNiVzaaVUiMVM8j5~))P?GUM%ZB8sCsSHC zoI6-YRKt7C(F?$l;R^t`5HI5^57G&6iXjYjwZ^j+m{nBVg+y+5)#2ifr2)P5#dD@f z&?BC9S2XYbS%i2wvW-${eWYXIj-Ks*D44i?JwV>>=9vq}@{%cEUJs+hi6wr6DVOc? zAhRnTla|1)x((~18*FF#3n?R~*3`%~+NHAI)Y#d%Vc-}AND%|PXi2IUqk{jQ5~v5E z71-sl{<*P925jJqZX8v3w74-y-xt`FP&#g#;1aRuT(H5sqDyuA_QVWo%p@EosUk5P zgiw*E&zq34vWXd`bn{0K3ES~n=OVaUnp)n%I^$;@6I==x5ngju>Fw%g03yE(ynggR zXNVHJ-JlJfLVkb}aL+{Z?isDbEV~_zGI(m848{i5T#5KjGKD)7#Hf96JD7v&nwai_ zMcHE?<6kx;j9_&)45j?&)qqxA;qdMetqHJiC!4m{v9u|M%)pm@l%9lqD4n9&&Nt7; ztu?O1EXkp#bJ17MI0r<&w!hy`aEpM>?)YyQ@-X6ax&ZItPsigyU#w6E#4O>{-;-uv?vnV)rUDKf>hlM zCHQ1c3)VjzJlmW++pSx(*B47rN95F59qI`WjH`s0unr_-73wRX)FZ#Wk;J9+2qEd# zqz`x6idU%(eF$?p{s{{P2dmHrhB;~6;@fLvw>gMh_wFy+*+6o1yKsVmzY%ZM|FIQfYKZ+jp=`%^1B~ba>$Kxn{ykW7+N+5ua|KrlSWkXM= zq)OMCI_u01Ws=LA~8tE>)Sq{}ES>q4(AfHlmb5Q%wgm1R+)-7~)b z`6(=easKloT{lOf#6F0P^cuJnb+-F)abYl1I(0NY#gVj}!;1ws7(y*(|LW)OblrTq zO-kC_)@JdYA4+UsB?bfiC+64(>DPxOL*#gbzB9@Ri&>VUE{`|LJS%&nyrv{Ht{eeC zs?bvuBmQvgB0Jipt(3T(yQ|w1)A#i$2@h3@+D)ENI%JQFU)#Dzxm=>RPruHAf5|EO z{fm8ZZvnFZ5)tsd!1%AT{2yE6t&OP&215sZ?z>Dbg@6JkU+0sfua7q)Ngm+~YDSCN zAVEj7RgCW&CrDA!K8bZQR^OV>`;iR*Id|&&b^meXvlLc`0pH2b-^~wPK7*fqE-2{W z4Ea++M4Hg^30jpv6GNHS;E3AbaQ>io=7n_NWl#3==C3@(!Nhl2xJw z5feX_Px2XuAw5Y?$nr$?nWvB4#K^Yt!TxJY%d4&U?8E(St$%kr+}}LCT#ZCs!VGD# zee#!yf#bE){s>V%3Slod)c_3uZNKXtRo*bE@jjK1g*qk*z|qRhakexlHz0~qJ9c3C zBl!dZBBw-r0DfC>x&nJA#U^SdUYplXxHetaX^@O_73Tpe^4={hyilAhTuSQkAc{6v zm_ISXBrZLtgbtNiL%W4bOgEdQn1<1GyiPc8X5x-Hvvt{F=wf<$LdphkvLc;cFebNb zX?V6K94>yPuu+l(?I^_?&IA6H&>%L*eCXL>%7xo@(r{Pc#OVeJPwGj7f)xP+cTodH zARe@!Z0aGuDcjBwGo$yB!R*RpG?hJpc}SO-GhnBvh)HyomD4jrjs-c&up2OL04@{a zZ#x2u6E@JuJQpp7(Le@pvSgLmZgt35K}qJQ_Tj>aUU9ZEOgPFq2*u(V#oswbM$~(f zdwNw5_+axuTpmNl=BbVd0cVb9KNRvSF|}-dK2;*nsp&^K`HhOEh9WkQi9IW!Cu>#{ zfnz$V{B5APg%wa!PGFnK2SmYgmD1e+wr}l!{XCvwx`h5V{lg}e;p7#jCtpyFXdp^(sfyfvJ8@}Z!fsYB@5 z(fv?(B=|>Ik3?gYv=nND&V7{JT!JMd=|@R86rsZ^N6I!qPyUdKM)F$CP~$(j1>@6F#iCu5mdG zC-#*5+IXFT4zJt}Siqk~k7L)lF}*c42{+K%U1#5Affj9xtl~X@rfG0qYn^x+6R^Qu z7L#*4QXT@}Jgqc}76Jjc0p07bkq7Y^p+UG%U-TARXUpc~@)|knf$9LL3yBA|BNXOj zg{lB+?0Z(!*REJ|#-g;|SCmISbz;M<_%;ObT`sA!!P|iO6yDHarGT208x`fk50WvF z_Os%bEmFBw$)n%9Dj3n&ow?7b&u&Rty|t?$)L#Nr{c$T7_`j!@`n&*6Ue`lYic*Ne zrzqv9eEc4N|N8I;!Pj)S>b6zkN*~z&_|mmaP6QTsJ?`SoxEgNXy5H&C(TL zAl2{u`w>BO;F*o09Q~KlwL?)d7wBL+K>dD=!;DDeBBJw$E81clk!h+NY;@kcnY(1B?2EHkG z6~LXfNXabE_xASH2GFnVTb7+XO9Wiq2doYB{Xcu#|8Nde5~4*Nf5siaQ0d63pi~h5 zefW@GI1G%NuB{4+0H_4B2G>GXCYyA#*KXo^wk;>je!Xc*PEqU(e6zcBHN6W->s41J0-X<#9n$NjLUOZ>R<{YSK=HvX>rFE-rIe-M7 z{LO4RgDpF{7wBn$MbtL#>&p8k?!UEDBvW$tN1Offi6dJMg|-Ht_U_wzeymF0ll?PynUMws2E0>U|qbj*1M@zz?XPJ4@j+8flD`sN)@y`3*l{HJwcr`ry zHE>G&$*MzAclY$kl!{SYlAqAaZPg(T+#i-g!^mIERE!A) z;Iq2exgLO(DTP`|8cs0=tMesey+NhX^v)-0(+JA~?m+K?!a%+YlGShXdVlB+&u5cR zNySNZbP8)q{UL*S|4xJ}sd?o|<QJ&cCH&>|Vc%G76bDO9Lj{k8=wZuOfm$k3J9 zOs>zAy?0eM}pp}Y7!lR9u@V&cQA_VJE}p{D7LxtgUb3uQI!MjEJjrUT9S-k7q-bZ z^`(pq=g;1K*YoKe@S9Pc5kus)(axoifd3kk{5R<4k4vaX??gc6&d+D3@ZT8L^lNoc zM2L%@sednfI;aLHI{-zZb#XA@U+)Fij%=`)_2S0Kmdj1Ys=3r?=r6>iatzi!@Rn-H zTd)pb1(duZ=P#Dn*Lx*s6eC3C7zsIQ|sdLk(6X;!jG~j&#vLgbLpt}VwA|Oa7Y;|6uYu=WJP(eZ7BG_nX5ILF} z0;kq}n=E^eg9JJrR;YO$2}hi=Jeit5Z|d}zjA-%BmL)DgI>;-0xF1{4G!Vo(xkO5p z8GVsN%`wUO5fB@KMjz>GO|G7nGJ?k;2Fwuc1q$OLjCMdBKylFE!{Y!{m-fb>PaK=T zNEPX4t!*xYBOwCTn_9D|FvyA6>9iyl0n-XTYUgde%kEtcd#eQnC+B(tKFf;Rgv6^3 zPs4K#S{Ke@5{T~#6&4G#1T~aTV~KC5z=_>aF2uPW0`SeZHu-cOszncD?CD;D35m^(_pU0jC7S=(I)V`ZCIVX9x(nohYM3vHiTjTLuw~=+Q~{n z40`YG;IXmllN(1zqYx-~1`@I4>zAkf7Xf=38rN_hhY}WL)GN!S=jX9{3uNdYKwUF2 z7fo*-3=pQfI=*HRL$%`dkP{yPTcxm9L;1Hj0iv%Rakb3o>#@80(*rFz(r14o#3b(6 zaCQ<)@<^#1$Fin~8a^?Qq_Zm4#iumz*X`O@HE9g$`U8Ge>m2H>fbB{;uCy*kgJ7)0 z%L*gvI-;`CY?@7(ol^fQxS_1{7iUGdbyHR8U5I@NOjwO!;csrZ-&4w&%?cj+7OrYL zL-+gc^YfIUr}^Q#j~j=+3II{1ZL`XvGQ47Qe;MK5|Dx+1gCh;YHtpE9ZF^$dwrx9^ zbZpzUor&#CY}=gJn-{zL)w}gobyxL|{&`pT{an|1oW~>4_#4^y6Z|`58-zBf3dny> zlm&o&UE6=odO=!4>`$^K-T)LFVD4r2f0|DJd*Ay%A9q4jmHtaqR#)HbCa;Q?e-N8hiJS~_Ajqgj1v9{*`lJFqY!EbOAZlC zAe};sIAXTqc&@{#DPAjzC?*4g*Po7DUnxJoUhy=^y>{jj0zKExJ?Hl9ktl9&9L#21 z!Z`iORvTou!MQC;d47d)Cp16L-_LLS1F;?~^7eK1BZAsSgdoVATSpgn9aHn!@VNY`+SK2?@tebzb(R&~R!hfA_?UpwL zpUd9OJ5m$vtHX3el~3rF0)lBIJku@VWjLM2a@N^y9ds739RhC9Ls7&QHlHG|LKPRX z-H>zxZeTiLxZdr20!PHG8`}qmHry-raGPZiBZ&qeMiivg&BBHDF_NVEUr>pxX-Lur za>=yNz5eug=t1*^aoFpBjjf?NdlfTtuNPad906?bTS&1N7aNUv0P03tRq%hc)oF@w z4DCmYy4nJQjLC#iU<85H;B)>K3s3KYe6C|}%(}S7TMQZsweP+@;#MlWh4D+2yGc(% z=}UwcBmm_wT&l2y5)vX?@E3%(Iq9|fNaQcdm#kbMnwBv}!c!q~IEu-YfO+@V&LC*~ zW(EHXv(%I6tRTsEMUN}wgMSFkDX-aZljO-GAGrKLuSEkn5?3#u`Die#-o(BQp)F<7TgBV zAa$XwXnY}1rE`yAwZFT%{FdqgbPHihdiin6HBU!5a%X@Qtf{HB3<>>dko6jD9y;#a z{y;~P{kU}>S@YGxhde$2iwm5!@x;{F!3h1Q(A}i&T_W9Gp=Ad)C~!FB&B|59FFipJ z`SLK>{)^ycm^WnIDZKA)%^Y%A&OI1#Cy9H?Vg38qx>m&zKIENFMz3}^xI|Q>K#D#P ztEjjsY32da%U|~E3&kiQZ!K>FwFl1RSXD`>3*i(!j+ataUCSCQ>pq0W=z}9HWOoiJ*5zbf?Z8lkOL9W-Ijet~Tr?qN1SeI`#7X$;KDj^lq zzv2GNu`KLY$nMl1O@%J?#;M(dEZ1Iv7Q;9-ASA$)oE$ zu4@y5u5w=HPE?>wI%ra_V@8mGuN^%1Ss(BX3U)v6$>Pwc`HP`j+pW<`H{#xXZYy%| z?W)?PgRRNN6k>2ibaHd)<=f^e8Ly_p?)GX=Gzb?J0z$&D04)oB0}57L{lC%H$3}wS z9ja^FT^rOH_H7Q7>-yi*x+Nhw1f0g2OjGyC{8<91ogJs;zpv``JWD@i7nr&E5TCH< zQx8=s+3Res&mPL_5rfD%^9wH|NQe2D2Cof6cc5S@i#SCUIhdM`6ZZ-uxA<^e+#r{3 z-3^-FR8-y(SWh2ziJiWH+mww#1;7#Je`dfy7cU4qKebQ0T>q8Q?XUoa2TaPhD!cx? z|A%67iD$!ogER5w3#OXaDiL1~U#q8@@j^aZYlcid_TYh6(;7cKn9P+*SuS3EGuL;@ zx6gO@V^tNH2zuN1?0U^by^N>Ozf!p18hmym7~KB!&d^CR(Q|ukXTQn~YxvLt8RE=k zXr7V)&_snGVqk0cx5!bf!~TzU2=LqjW4SS~Yzu|tRHqDjI}%#uhQFmAlZdRW|jWNT;F&W|4WF{VM+#n}dn z>xMwCT(vZ?XDMcaKw@;p7QpNr6;4&d;9v1+n{*aual^1JD`3z~>VL?Pq3_=p9?t|Z z#2i64*{IOV?F=FCbT(S#hBmS{&Jw$_|4_f;A|JCR^5W36_MtcM`VcEdc|Pg%1Fnu(Yl+iaU1l)FVjQXA?(Bk4F|t7{7X82EiW(9r>;!|88REb?_S~w0r0d zbsrJHibd>?l3wR*KJY*$rM(jPlmYpFRb}A)do-9l@J#%KJ4=!BXE3D)J3?C?Tj`@8O-`WIkFg$}p0>K;1&o8cG--5R0 zwx>B_;@;IegE>z4lRT+4Jz5CV^VPR&!Pa+nc+z8Z+W_^W2v5()pE-M9j^Zcpke~h2 zz#BD0&h>Q_qgzWxn#=W={FO&D~u>%iPWIXQk+a@P5L6r167bK2y9hsVUA zJQ!gqIDH9Sn)K$aPNs+?><{$aF! zsgnFbc34q7W{kR1Ze%{>pmUzRE>uP>$WZQxQ-9>HbE#OLqR+4Xs?Tnvrma#W#PzGH zwOSd8u`Gx(MIE)N=qdSvtU+VD1BnmHK|L}e+vYCXbBjc!O_N!vkpY;*|%%KNtrj`)m5P6^@>yV2f|sPtCMVp5B$5W zvu<(6@_T9fy8jgTZwV5jb*ym@*59tR+!L>&y=|!94LdtUzt5il)EhpcE?}@wW83*{ z@L-OLNl3Wi5xpX6;?1%Z*j0zX55R6?XcQ4f59e_ZN1vE(X`#SVAVHr&dtZhY-%e)V zA%P5IJ~*F=9~XJR?u-~cYX0YE~z`FVS`X$9y&*q2F{2; zTgk*ItmVthnCw(-AU?cGdMz)EOPo?8H(Jo0dh9p9ks{2W7DE$0Ba4Ui#5xWySgVYq zi{U*?48zaKj=;Gwz4e4gHPL&lNa)GXfkkW`q#kyzvd(b8fTEdDq&?x6X6W?7sKtW+PZ2y#zM)jZqUIebnE$KJb>aPK;`16>aTlCdstBn}$gC2(1ObSbjAC#xP zX{RxK=BAXzQ�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

AW>oIS=W1zF45j5 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 n*c^Uu!Ep3r5Czts$0T+MmJ!^N{HnQLSD^Tb9 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

=I~QbJfAz?;bfmyQW}PELnb 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

>(*5PqU1lrmek&>$dVnEx{uC?bI)0Q@P_ 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 LgChedBB=iZQht?z diff --git a/youtube-dl.1 b/youtube-dl.1 index a172bf8..c99538c 100644 --- a/youtube-dl.1 +++ b/youtube-dl.1 @@ -42,6 +42,8 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default\ $XDG_CACHE_HOME/youtube\-dl\ or\ ~/.cache \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /youtube\-dl\ . \-\-no\-cache\-dir\ \ \ \ \ \ \ \ \ \ \ \ \ Disable\ filesystem\ caching +\-\-bidi\-workaround\ \ \ \ \ \ \ \ \ \ Work\ around\ terminals\ that\ lack\ bidirectional +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ text\ support.\ Requires\ fribidi\ executable\ in\ PATH \f[] .fi .SS Video Selection: @@ -62,6 +64,10 @@ redistribute it or use it however you like. \-\-date\ DATE\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ download\ only\ videos\ uploaded\ in\ this\ date \-\-datebefore\ DATE\ \ \ \ \ \ \ \ \ \ download\ only\ videos\ uploaded\ before\ this\ date \-\-dateafter\ DATE\ \ \ \ \ \ \ \ \ \ \ download\ only\ videos\ uploaded\ after\ this\ date +\-\-min\-views\ COUNT\ \ \ \ \ \ \ \ \ \ Do\ not\ download\ any\ videos\ with\ less\ than\ COUNT +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ views +\-\-max\-views\ COUNT\ \ \ \ \ \ \ \ \ \ Do\ not\ download\ any\ videos\ with\ more\ than\ COUNT +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ views \-\-no\-playlist\ \ \ \ \ \ \ \ \ \ \ \ \ \ download\ only\ the\ currently\ playing\ video \-\-age\-limit\ YEARS\ \ \ \ \ \ \ \ \ \ download\ only\ videos\ suitable\ for\ the\ given\ age \-\-download\-archive\ FILE\ \ \ \ Download\ only\ videos\ not\ listed\ in\ the\ archive @@ -114,6 +120,8 @@ redistribute it or use it however you like. \-\-restrict\-filenames\ \ \ \ \ \ \ Restrict\ filenames\ to\ only\ ASCII\ characters,\ and \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ avoid\ "&"\ and\ spaces\ in\ filenames \-a,\ \-\-batch\-file\ FILE\ \ \ \ \ \ file\ containing\ URLs\ to\ download\ (\[aq]\-\[aq]\ for\ stdin) +\-\-load\-info\ FILE\ \ \ \ \ \ \ \ \ \ \ json\ file\ containing\ the\ video\ information +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (created\ with\ the\ "\-\-write\-json"\ option \-w,\ \-\-no\-overwrites\ \ \ \ \ \ \ \ do\ not\ overwrite\ files \-c,\ \-\-continue\ \ \ \ \ \ \ \ \ \ \ \ \ force\ resume\ of\ partially\ downloaded\ files.\ By \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default,\ youtube\-dl\ will\ resume\ downloads\ if @@ -143,6 +151,7 @@ redistribute it or use it however you like. \-\-get\-id\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ id \-\-get\-thumbnail\ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ thumbnail\ URL \-\-get\-description\ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ video\ description +\-\-get\-duration\ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ video\ length \-\-get\-filename\ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ filename \-\-get\-format\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ format \-j,\ \-\-dump\-json\ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ JSON\ information @@ -383,23 +392,132 @@ domain. .SH BUGS .PP Bugs and suggestions should be reported at: - + . +Unless you were prompted so or there is another pertinent reason (e.g. +GitHub fails to accept the bug report), please do not send bug reports +via personal email. .PP -Please include: -.IP \[bu] 2 -Your exact command line, like -\f[C]youtube\-dl\ \-t\ "http://www.youtube.com/watch?v=uHlDtZ6Oc3s&feature=channel_video_title"\f[]. -A common mistake is not to escape the \f[C]&\f[]. -Putting URLs in quotes should solve this problem. -.IP \[bu] 2 -If possible re\-run the command with \f[C]\-\-verbose\f[], and include -the full output, it is really helpful to us. +Please include the full output of the command when run with +\f[C]\-\-verbose\f[]. +The output (including the first lines) contain important debugging +information. +Issues without the full output are often not reproducible and therefore +do not get solved in short order, if ever. +.PP +For discussions, join us in the irc channel #youtube\-dl on freenode. +.PP +When you submit a request, please re\-read it once to avoid a couple of +mistakes (you can and should use this as a checklist): +.SS Is the description of the issue itself sufficient? +.PP +We often get issue reports that we cannot really decipher. +While in most cases we eventually get the required information after +asking back multiple times, this poses an unnecessary drain on our +resources. +Many contributors, including myself, are also not native speakers, so we +may misread some parts. +.PP +So please elaborate on what feature you are requesting, or what bug you +want to be fixed. +Make sure that it\[aq]s obvious .IP \[bu] 2 -The output of \f[C]youtube\-dl\ \-\-version\f[] +What the problem is .IP \[bu] 2 -The output of \f[C]python\ \-\-version\f[] +How it could be fixed .IP \[bu] 2 -The name and version of your Operating System ("Ubuntu 11.04 x64" or -"Windows 7 x64" is usually enough). +How your proposed solution would look like .PP -For discussions, join us in the irc channel #youtube\-dl on freenode. +If your report is shorter than two lines, it is almost certainly missing +some of these, which makes it hard for us to respond to it. +We\[aq]re often too polite to close the issue outright, but the missing +info makes misinterpretation likely. +As a commiter myself, I often get frustrated by these issues, since the +only possible way for me to move forward on them is to ask for +clarification over and over. +.PP +For bug reports, this means that your report should contain the +\f[I]complete\f[] output of youtube\-dl when called with the \-v flag. +The error message you get for (most) bugs even says so, but you would +not believe how many of our bug reports do not contain this information. +.PP +Site support requests must contain an example URL. +An example URL is a URL you might want to download, like +http://www.youtube.com/watch?v=BaW_jenozKc . +There should be an obvious video present. +Except under very special circumstances, the main page of a video +service (e.g. +http://www.youtube.com/ ) is \f[I]not\f[] an example URL. +.SS Are you using the latest version? +.PP +Before reporting any issue, type youtube\-dl \-U. +This should report that you\[aq]re up\-to\-date. +Ábout 20% of the reports we receive are already fixed, but people are +using outdated versions. +This goes for feature requests as well. +.SS Is the issue already documented? +.PP +Make sure that someone has not already opened the issue you\[aq]re +trying to open. +Search at the top of the window or at +https://github.com/rg3/youtube\-dl/search?type=Issues . +If there is an issue, feel free to write something along the lines of +"This affects me as well, with version 2015.01.01. +Here is some more information on the issue: ...". +While some issues may be old, a new post into them often spurs rapid +activity. +.SS Why are existing options not enough? +.PP +Before requesting a new feature, please have a quick peek at the list of +supported +options (https://github.com/rg3/youtube-dl/blob/master/README.md#synopsis). +Many feature requests are for features that actually exist already! +Please, absolutely do show off your work in the issue report and detail +how the existing similar options do \f[I]not\f[] solve your problem. +.SS Is there enough context in your bug report? +.PP +People want to solve problems, and often think they do us a favor by +breaking down their larger problems (e.g. +wanting to skip already downloaded files) to a specific request (e.g. +requesting us to look whether the file exists before downloading the +info page). +However, what often happens is that they break down the problem into two +steps: One simple, and one impossible (or extremely complicated one). +.PP +We are then presented with a very complicated request when the original +problem could be solved far easier, e.g. +by recording the downloaded video IDs in a separate file. +To avoid this, you must include the greater context where it is +non\-obvious. +In particular, every feature request that does not consist of adding +support for a new site should contain a use case scenario that explains +in what situation the missing feature would be useful. +.SS Does the issue involve one problem, and one problem only? +.PP +Some of our users seem to think there is a limit of issues they can or +should open. +There is no limit of issues they can or should open. +While it may seem appealing to be able to dump all your issues into one +ticket, that means that someone who solves one of your issues cannot +mark the issue as closed. +Typically, reporting a bunch of issues leads to the ticket lingering +since nobody wants to attack that behemoth, until someone mercifully +splits the issue into multiple ones. +.PP +In particular, every site support request issue should only pertain to +services at one site (generally under a common domain, but always using +the same backend technology). +Do not request support for vimeo user videos, Whitehouse podcasts, and +Google Plus pages in the same issue. +Also, make sure that you don\[aq]t post bug reports alongside feature +requests. +As a rule of thumb, a feature request does not include outputs of +youtube\-dl that are not immediately related to the feature at hand. +Do not post reports of a network error alongside the request for a new +video service. +.SS Is anyone going to need the feature? +.PP +Only post features that you (or an incapicated friend you can personally +talk to) require. +Do not post features because they seem like a good idea. +If they are really useful, they will be requested by someone who +requires them. diff --git a/youtube-dl.bash-completion b/youtube-dl.bash-completion index 9c30e7b..0cb7e92 100644 --- a/youtube-dl.bash-completion +++ b/youtube-dl.bash-completion @@ -4,7 +4,7 @@ __youtube_dl() COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="--help --version --update --ignore-errors --abort-on-error --dump-user-agent --user-agent --referer --list-extractors --extractor-descriptions --proxy --no-check-certificate --cache-dir --no-cache-dir --socket-timeout --playlist-start --playlist-end --match-title --reject-title --max-downloads --min-filesize --max-filesize --date --datebefore --dateafter --no-playlist --age-limit --download-archive --rate-limit --retries --buffer-size --no-resize-buffer --test --title --id --literal --auto-number --output --autonumber-size --restrict-filenames --batch-file --no-overwrites --continue --no-continue --cookies --no-part --no-mtime --write-description --write-info-json --write-annotations --write-thumbnail --quiet --simulate --skip-download --get-url --get-title --get-id --get-thumbnail --get-description --get-filename --get-format --dump-json --newline --no-progress --console-title --verbose --dump-intermediate-pages --write-pages --youtube-print-sig-code --format --all-formats --prefer-free-formats --max-quality --list-formats --write-sub --write-auto-sub --all-subs --list-subs --sub-format --sub-lang --username --password --netrc --video-password --extract-audio --audio-format --audio-quality --recode-video --keep-video --no-post-overwrites --embed-subs --add-metadata" + opts="--help --version --update --ignore-errors --abort-on-error --dump-user-agent --user-agent --referer --list-extractors --extractor-descriptions --proxy --no-check-certificate --cache-dir --no-cache-dir --socket-timeout --bidi-workaround --playlist-start --playlist-end --match-title --reject-title --max-downloads --min-filesize --max-filesize --date --datebefore --dateafter --min-views --max-views --no-playlist --age-limit --download-archive --rate-limit --retries --buffer-size --no-resize-buffer --test --title --id --literal --auto-number --output --autonumber-size --restrict-filenames --batch-file --load-info --no-overwrites --continue --no-continue --cookies --no-part --no-mtime --write-description --write-info-json --write-annotations --write-thumbnail --quiet --simulate --skip-download --get-url --get-title --get-id --get-thumbnail --get-description --get-duration --get-filename --get-format --dump-json --newline --no-progress --console-title --verbose --dump-intermediate-pages --write-pages --youtube-print-sig-code --format --all-formats --prefer-free-formats --max-quality --list-formats --write-sub --write-auto-sub --all-subs --list-subs --sub-format --sub-lang --username --password --netrc --video-password --extract-audio --audio-format --audio-quality --recode-video --keep-video --no-post-overwrites --embed-subs --add-metadata" keywords=":ytfavorites :ytrecommended :ytsubscriptions :ytwatchlater :ythistory" fileopts="-a|--batch-file|--download-archive|--cookies" diropts="--cache-dir" diff --git a/youtube_dl/FileDownloader.py b/youtube_dl/FileDownloader.py index 3ff9716..4712493 100644 --- a/youtube_dl/FileDownloader.py +++ b/youtube_dl/FileDownloader.py @@ -204,11 +204,27 @@ class FileDownloader(object): """Report destination filename.""" self.to_screen(u'[download] Destination: ' + filename) + def _report_progress_status(self, msg, is_last_line=False): + fullmsg = u'[download] ' + msg + if self.params.get('progress_with_newline', False): + self.to_screen(fullmsg) + else: + if os.name == 'nt': + prev_len = getattr(self, '_report_progress_prev_line_length', + 0) + if prev_len > len(fullmsg): + fullmsg += u' ' * (prev_len - len(fullmsg)) + self._report_progress_prev_line_length = len(fullmsg) + clear_line = u'\r' + else: + clear_line = (u'\r\x1b[K' if sys.stderr.isatty() else u'\r') + self.to_screen(clear_line + fullmsg, skip_eol=not is_last_line) + self.to_console_title(u'youtube-dl ' + msg) + def report_progress(self, percent, data_len_str, speed, eta): """Report download progress.""" if self.params.get('noprogress', False): return - clear_line = (u'\x1b[K' if sys.stderr.isatty() and os.name != 'nt' else u'') if eta is not None: eta_str = self.format_eta(eta) else: @@ -218,14 +234,29 @@ class FileDownloader(object): else: percent_str = 'Unknown %' speed_str = self.format_speed(speed) - if self.params.get('progress_with_newline', False): - self.to_screen(u'[download] %s of %s at %s ETA %s' % - (percent_str, data_len_str, speed_str, eta_str)) + + msg = (u'%s of %s at %s ETA %s' % + (percent_str, data_len_str, speed_str, eta_str)) + self._report_progress_status(msg) + + def report_progress_live_stream(self, downloaded_data_len, speed, elapsed): + if self.params.get('noprogress', False): + return + downloaded_str = format_bytes(downloaded_data_len) + speed_str = self.format_speed(speed) + elapsed_str = FileDownloader.format_seconds(elapsed) + msg = u'%s at %s (%s)' % (downloaded_str, speed_str, elapsed_str) + self._report_progress_status(msg) + + def report_finish(self, data_len_str, tot_time): + """Report download finished.""" + if self.params.get('noprogress', False): + self.to_screen(u'[download] Download completed') else: - self.to_screen(u'\r%s[download] %s of %s at %s ETA %s' % - (clear_line, percent_str, data_len_str, speed_str, eta_str), skip_eol=True) - self.to_console_title(u'youtube-dl - %s of %s at %s ETA %s' % - (percent_str.strip(), data_len_str.strip(), speed_str.strip(), eta_str.strip())) + self._report_progress_status( + (u'100%% of %s in %s' % + (data_len_str, self.format_seconds(tot_time))), + is_last_line=True) def report_resuming_byte(self, resume_len): """Report attempt to resume at given byte.""" @@ -246,16 +277,7 @@ class FileDownloader(object): """Report it was impossible to resume download.""" self.to_screen(u'[download] Unable to resume') - def report_finish(self, data_len_str, tot_time): - """Report download finished.""" - if self.params.get('noprogress', False): - self.to_screen(u'[download] Download completed') - else: - clear_line = (u'\x1b[K' if sys.stderr.isatty() and os.name != 'nt' else u'') - self.to_screen(u'\r%s[download] 100%% of %s in %s' % - (clear_line, data_len_str, self.format_seconds(tot_time))) - - def _download_with_rtmpdump(self, filename, url, player_url, page_url, play_path, tc_url, live): + def _download_with_rtmpdump(self, filename, url, player_url, page_url, play_path, tc_url, live, conn): def run_rtmpdump(args): start = time.time() resume_percent = None @@ -301,11 +323,27 @@ class FileDownloader(object): 'eta': eta, 'speed': speed, }) - elif self.params.get('verbose', False): - if not cursor_in_new_line: - self.to_screen(u'') - cursor_in_new_line = True - self.to_screen(u'[rtmpdump] '+line) + else: + # no percent for live streams + mobj = re.search(r'([0-9]+\.[0-9]{3}) kB / [0-9]+\.[0-9]{2} sec', line) + if mobj: + downloaded_data_len = int(float(mobj.group(1))*1024) + time_now = time.time() + speed = self.calc_speed(start, time_now, downloaded_data_len) + self.report_progress_live_stream(downloaded_data_len, speed, time_now - start) + cursor_in_new_line = False + self._hook_progress({ + 'downloaded_bytes': downloaded_data_len, + 'tmpfilename': tmpfilename, + 'filename': filename, + 'status': 'downloading', + 'speed': speed, + }) + elif self.params.get('verbose', False): + if not cursor_in_new_line: + self.to_screen(u'') + cursor_in_new_line = True + self.to_screen(u'[rtmpdump] '+line) proc.wait() if not cursor_in_new_line: self.to_screen(u'') @@ -338,6 +376,8 @@ class FileDownloader(object): basic_args += ['--stop', '1'] if live: basic_args += ['--live'] + if conn: + basic_args += ['--conn', conn] args = basic_args + [[], ['--resume', '--skip', '1']][self.params.get('continuedl', False)] if sys.platform == 'win32' and sys.version_info < (3, 0): @@ -479,7 +519,8 @@ class FileDownloader(object): info_dict.get('page_url', None), info_dict.get('play_path', None), info_dict.get('tc_url', None), - info_dict.get('rtmp_live', False)) + info_dict.get('rtmp_live', False), + info_dict.get('rtmp_conn', None)) # Attempt to download using mplayer if url.startswith('mms') or url.startswith('rtsp'): diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index b68b110..2a078ad 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -3,6 +3,7 @@ from __future__ import absolute_import +import collections import errno import io import json @@ -22,7 +23,6 @@ if os.name == 'nt': from .utils import ( compat_cookiejar, compat_http_client, - compat_print, compat_str, compat_urllib_error, compat_urllib_request, @@ -34,6 +34,8 @@ from .utils import ( encodeFilename, ExtractorError, format_bytes, + formatSeconds, + get_term_width, locked_file, make_HTTPS_handler, MaxDownloadsReached, @@ -45,6 +47,7 @@ from .utils import ( subtitles_filename, takewhile_inclusive, UnavailableVideoError, + url_basename, write_json_file, write_string, YoutubeDLHandler, @@ -93,6 +96,7 @@ class YoutubeDL(object): forcethumbnail: Force printing thumbnail URL. forcedescription: Force printing description. forcefilename: Force printing final filename. + forceduration: Force printing duration. forcejson: Force printing info_dict as JSON. simulate: Do not download the video files. format: Video format code. @@ -126,13 +130,24 @@ class YoutubeDL(object): noplaylist: Download single video instead of a playlist if in doubt. age_limit: An integer representing the user's age in years. Unsuitable videos for the given age are skipped. - download_archive: File name of a file where all downloads are recorded. + min_views: An integer representing the minimum view count the video + must have in order to not be skipped. + Videos without view count information are always + downloaded. None for no limit. + max_views: An integer representing the maximum view count. + Videos that are more popular than that are not + downloaded. + Videos without view count information are always + downloaded. None for no limit. + download_archive: File name of a file where all downloads are recorded. Videos already present in the file are not downloaded again. cookiefile: File name where cookies should be read from and dumped to. nocheckcertificate:Do not verify SSL certificates proxy: URL of the proxy server to use socket_timeout: Time to wait for unresponsive hosts, in seconds + bidi_workaround: Work around buggy terminals without bidirectional text + support, using fridibi The following parameters are not used by YoutubeDL itself, they are used by the FileDownloader: @@ -156,8 +171,30 @@ class YoutubeDL(object): self._download_retcode = 0 self._num_downloads = 0 self._screen_file = [sys.stdout, sys.stderr][params.get('logtostderr', False)] + self._err_file = sys.stderr self.params = {} if params is None else params + if params.get('bidi_workaround', False): + try: + import pty + master, slave = pty.openpty() + width = get_term_width() + if width is None: + width_args = [] + else: + width_args = ['-w', str(width)] + self._fribidi = subprocess.Popen( + ['fribidi', '-c', 'UTF-8'] + width_args, + stdin=subprocess.PIPE, + stdout=slave, + stderr=self._err_file) + self._fribidi_channel = os.fdopen(master, 'rb') + except OSError as ose: + if ose.errno == 2: + self.report_warning(u'Could not find fribidi executable, ignoring --bidi-workaround . Make sure that fribidi is an executable file in one of the directories in your $PATH.') + else: + raise + if (sys.version_info >= (3,) and sys.platform != 'win32' and sys.getfilesystemencoding() in ['ascii', 'ANSI_X3.4-1968'] and not params['restrictfilenames']): @@ -205,13 +242,31 @@ class YoutubeDL(object): self._pps.append(pp) pp.set_downloader(self) + def _bidi_workaround(self, message): + if not hasattr(self, '_fribidi_channel'): + return message + + assert type(message) == type(u'') + line_count = message.count(u'\n') + 1 + self._fribidi.stdin.write((message + u'\n').encode('utf-8')) + self._fribidi.stdin.flush() + res = u''.join(self._fribidi_channel.readline().decode('utf-8') + for _ in range(line_count)) + return res[:-len(u'\n')] + def to_screen(self, message, skip_eol=False): + """Print message to stdout if not in quiet mode.""" + return self.to_stdout(message, skip_eol, check_quiet=True) + + def to_stdout(self, message, skip_eol=False, check_quiet=False): """Print message to stdout if not in quiet mode.""" if self.params.get('logger'): self.params['logger'].debug(message) - elif not self.params.get('quiet', False): + elif not check_quiet or not self.params.get('quiet', False): + message = self._bidi_workaround(message) terminator = [u'\n', u''][skip_eol] output = message + terminator + write_string(output, self._screen_file) def to_stderr(self, message): @@ -220,10 +275,9 @@ class YoutubeDL(object): if self.params.get('logger'): self.params['logger'].error(message) else: + message = self._bidi_workaround(message) output = message + u'\n' - if 'b' in getattr(self._screen_file, 'mode', '') or sys.version_info[0] < 3: # Python 2 lies about the mode of sys.stdout/sys.stderr - output = output.encode(preferredencoding()) - sys.stderr.write(output) + write_string(output, self._err_file) def to_console_title(self, message): if not self.params.get('consoletitle', False): @@ -294,7 +348,7 @@ class YoutubeDL(object): Print the message to stderr, it will be prefixed with 'WARNING:' If stderr is a tty file the 'WARNING:' will be colored ''' - if sys.stderr.isatty() and os.name != 'nt': + if self._err_file.isatty() and os.name != 'nt': _msg_header = u'\033[0;33mWARNING:\033[0m' else: _msg_header = u'WARNING:' @@ -306,29 +360,13 @@ class YoutubeDL(object): Do the same as trouble, but prefixes the message with 'ERROR:', colored in red if stderr is a tty file. ''' - if sys.stderr.isatty() and os.name != 'nt': + if self._err_file.isatty() and os.name != 'nt': _msg_header = u'\033[0;31mERROR:\033[0m' else: _msg_header = u'ERROR:' error_message = u'%s %s' % (_msg_header, message) self.trouble(error_message, tb) - def report_writedescription(self, descfn): - """ Report that the description file is being written """ - self.to_screen(u'[info] Writing video description to: ' + descfn) - - def report_writesubtitles(self, sub_filename): - """ Report that the subtitles file is being written """ - self.to_screen(u'[info] Writing video subtitles to: ' + sub_filename) - - def report_writeinfojson(self, infofn): - """ Report that the metadata file has been written """ - self.to_screen(u'[info] Video description metadata as JSON to: ' + infofn) - - def report_writeannotations(self, annofn): - """ Report that the annotations file has been written. """ - self.to_screen(u'[info] Writing video annotations to: ' + annofn) - def report_file_already_downloaded(self, file_name): """Report file has already been fully downloaded.""" try: @@ -355,18 +393,17 @@ class YoutubeDL(object): template_dict['playlist_index'] = u'%05d' % template_dict['playlist_index'] sanitize = lambda k, v: sanitize_filename( - u'NA' if v is None else compat_str(v), + compat_str(v), restricted=self.params.get('restrictfilenames'), is_id=(k == u'id')) template_dict = dict((k, sanitize(k, v)) - for k, v in template_dict.items()) + for k, v in template_dict.items() + if v is not None) + template_dict = collections.defaultdict(lambda: u'NA', template_dict) tmpl = os.path.expanduser(self.params['outtmpl']) filename = tmpl % template_dict return filename - except KeyError as err: - self.report_error(u'Erroneous output template') - return None except ValueError as err: self.report_error(u'Error in output template: ' + str(err) + u' (encoding: ' + repr(preferredencoding()) + ')') return None @@ -374,13 +411,14 @@ class YoutubeDL(object): def _match_entry(self, info_dict): """ Returns None iff the file should be downloaded """ + video_title = info_dict.get('title', info_dict.get('id', u'video')) if 'title' in info_dict: # This can happen when we're just evaluating the playlist title = info_dict['title'] matchtitle = self.params.get('matchtitle', False) if matchtitle: if not re.search(matchtitle, title, re.IGNORECASE): - return u'[download] "' + title + '" title did not match pattern "' + matchtitle + '"' + return u'"' + title + '" title did not match pattern "' + matchtitle + '"' rejecttitle = self.params.get('rejecttitle', False) if rejecttitle: if re.search(rejecttitle, title, re.IGNORECASE): @@ -389,14 +427,21 @@ class YoutubeDL(object): if date is not None: dateRange = self.params.get('daterange', DateRange()) if date not in dateRange: - return u'[download] %s upload date is not in range %s' % (date_from_str(date).isoformat(), dateRange) + return u'%s upload date is not in range %s' % (date_from_str(date).isoformat(), dateRange) + view_count = info_dict.get('view_count', None) + if view_count is not None: + min_views = self.params.get('min_views') + if min_views is not None and view_count < min_views: + return u'Skipping %s, because it has not reached minimum view count (%d/%d)' % (video_title, view_count, min_views) + max_views = self.params.get('max_views') + if max_views is not None and view_count > max_views: + return u'Skipping %s, because it has exceeded the maximum view count (%d/%d)' % (video_title, view_count, max_views) age_limit = self.params.get('age_limit') if age_limit is not None: if age_limit < info_dict.get('age_limit', 0): return u'Skipping "' + title + '" because it is age restricted' if self.in_download_archive(info_dict): - return (u'%s has already been recorded in archive' - % info_dict.get('title', info_dict.get('id', u'video'))) + return u'%s has already been recorded in archive' % video_title return None @staticmethod @@ -405,7 +450,8 @@ class YoutubeDL(object): for key, value in extra_info.items(): info_dict.setdefault(key, value) - def extract_info(self, url, download=True, ie_key=None, extra_info={}): + def extract_info(self, url, download=True, ie_key=None, extra_info={}, + process=True): ''' Returns a list with a dictionary for each video we find. If 'download', also downloads the videos. @@ -439,9 +485,13 @@ class YoutubeDL(object): { 'extractor': ie.IE_NAME, 'webpage_url': url, + 'webpage_url_basename': url_basename(url), 'extractor_key': ie.ie_key(), }) - return self.process_ie_result(ie_result, download, extra_info) + if process: + return self.process_ie_result(ie_result, download, extra_info) + else: + return ie_result except ExtractorError as de: # An error we somewhat expected self.report_error(compat_str(de), de.format_traceback()) break @@ -474,8 +524,33 @@ class YoutubeDL(object): download, ie_key=ie_result.get('ie_key'), extra_info=extra_info) + elif result_type == 'url_transparent': + # Use the information from the embedding page + info = self.extract_info( + ie_result['url'], ie_key=ie_result.get('ie_key'), + extra_info=extra_info, download=False, process=False) + + def make_result(embedded_info): + new_result = ie_result.copy() + for f in ('_type', 'url', 'ext', 'player_url', 'formats', + 'entries', 'urlhandle', 'ie_key', 'duration', + 'subtitles', 'annotations', 'format', + 'thumbnail', 'thumbnails'): + if f in new_result: + del new_result[f] + if f in embedded_info: + new_result[f] = embedded_info[f] + return new_result + new_result = make_result(info) + + assert new_result.get('_type') != 'url_transparent' + if new_result.get('_type') == 'compat_list': + new_result['entries'] = [ + make_result(e) for e in new_result['entries']] + + return self.process_ie_result( + new_result, download=download, extra_info=extra_info) elif result_type == 'playlist': - # We process each entry in the playlist playlist = ie_result.get('title', None) or ie_result.get('id', None) self.to_screen(u'[download] Downloading playlist: %s' % playlist) @@ -484,16 +559,16 @@ class YoutubeDL(object): n_all_entries = len(ie_result['entries']) playliststart = self.params.get('playliststart', 1) - 1 - playlistend = self.params.get('playlistend', -1) - + playlistend = self.params.get('playlistend', None) + # For backwards compatibility, interpret -1 as whole list if playlistend == -1: - entries = ie_result['entries'][playliststart:] - else: - entries = ie_result['entries'][playliststart:playlistend] + playlistend = None + entries = ie_result['entries'][playliststart:playlistend] n_entries = len(entries) - self.to_screen(u"[%s] playlist '%s': Collected %d video ids (downloading %d of them)" % + self.to_screen( + u"[%s] playlist '%s': Collected %d video ids (downloading %d of them)" % (ie_result['extractor'], playlist, n_all_entries, n_entries)) for i, entry in enumerate(entries, 1): @@ -503,6 +578,7 @@ class YoutubeDL(object): 'playlist_index': i + playliststart, 'extractor': ie_result['extractor'], 'webpage_url': ie_result['webpage_url'], + 'webpage_url_basename': url_basename(ie_result['webpage_url']), 'extractor_key': ie_result['extractor_key'], } @@ -523,6 +599,7 @@ class YoutubeDL(object): { 'extractor': ie_result['extractor'], 'webpage_url': ie_result['webpage_url'], + 'webpage_url_basename': url_basename(ie_result['webpage_url']), 'extractor_key': ie_result['extractor_key'], }) return r @@ -666,22 +743,25 @@ class YoutubeDL(object): # Forced printings if self.params.get('forcetitle', False): - compat_print(info_dict['fulltitle']) + self.to_stdout(info_dict['fulltitle']) if self.params.get('forceid', False): - compat_print(info_dict['id']) + self.to_stdout(info_dict['id']) if self.params.get('forceurl', False): # For RTMP URLs, also include the playpath - compat_print(info_dict['url'] + info_dict.get('play_path', u'')) + self.to_stdout(info_dict['url'] + info_dict.get('play_path', u'')) if self.params.get('forcethumbnail', False) and info_dict.get('thumbnail') is not None: - compat_print(info_dict['thumbnail']) + self.to_stdout(info_dict['thumbnail']) if self.params.get('forcedescription', False) and info_dict.get('description') is not None: - compat_print(info_dict['description']) + self.to_stdout(info_dict['description']) if self.params.get('forcefilename', False) and filename is not None: - compat_print(filename) + self.to_stdout(filename) + if self.params.get('forceduration', False) and info_dict.get('duration') is not None: + self.to_stdout(formatSeconds(info_dict['duration'])) if self.params.get('forceformat', False): - compat_print(info_dict['format']) + self.to_stdout(info_dict['format']) if self.params.get('forcejson', False): - compat_print(json.dumps(info_dict)) + info_dict['_filename'] = filename + self.to_stdout(json.dumps(info_dict)) # Do nothing else if in simulate mode if self.params.get('simulate', False): @@ -699,28 +779,34 @@ class YoutubeDL(object): return if self.params.get('writedescription', False): - try: - descfn = filename + u'.description' - self.report_writedescription(descfn) - with io.open(encodeFilename(descfn), 'w', encoding='utf-8') as descfile: - descfile.write(info_dict['description']) - except (KeyError, TypeError): - self.report_warning(u'There\'s no description to write.') - except (OSError, IOError): - self.report_error(u'Cannot write description file ' + descfn) - return + descfn = filename + u'.description' + if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(descfn)): + self.to_screen(u'[info] Video description is already present') + else: + try: + self.to_screen(u'[info] Writing video description to: ' + descfn) + with io.open(encodeFilename(descfn), 'w', encoding='utf-8') as descfile: + descfile.write(info_dict['description']) + except (KeyError, TypeError): + self.report_warning(u'There\'s no description to write.') + except (OSError, IOError): + self.report_error(u'Cannot write description file ' + descfn) + return if self.params.get('writeannotations', False): - try: - annofn = filename + u'.annotations.xml' - self.report_writeannotations(annofn) - with io.open(encodeFilename(annofn), 'w', encoding='utf-8') as annofile: - annofile.write(info_dict['annotations']) - except (KeyError, TypeError): - self.report_warning(u'There are no annotations to write.') - except (OSError, IOError): - self.report_error(u'Cannot write annotations file: ' + annofn) - return + annofn = filename + u'.annotations.xml' + if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(annofn)): + self.to_screen(u'[info] Video annotations are already present') + else: + try: + self.to_screen(u'[info] Writing video annotations to: ' + annofn) + with io.open(encodeFilename(annofn), 'w', encoding='utf-8') as annofile: + annofile.write(info_dict['annotations']) + except (KeyError, TypeError): + self.report_warning(u'There are no annotations to write.') + except (OSError, IOError): + self.report_error(u'Cannot write annotations file: ' + annofn) + return subtitles_are_requested = any([self.params.get('writesubtitles', False), self.params.get('writeautomaticsub')]) @@ -736,38 +822,48 @@ class YoutubeDL(object): continue try: sub_filename = subtitles_filename(filename, sub_lang, sub_format) - self.report_writesubtitles(sub_filename) - with io.open(encodeFilename(sub_filename), 'w', encoding='utf-8') as subfile: - subfile.write(sub) + if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(sub_filename)): + self.to_screen(u'[info] Video subtitle %s.%s is already_present' % (sub_lang, sub_format)) + else: + self.to_screen(u'[info] Writing video subtitles to: ' + sub_filename) + with io.open(encodeFilename(sub_filename), 'w', encoding='utf-8') as subfile: + subfile.write(sub) except (OSError, IOError): self.report_error(u'Cannot write subtitles file ' + descfn) return if self.params.get('writeinfojson', False): infofn = os.path.splitext(filename)[0] + u'.info.json' - self.report_writeinfojson(infofn) - try: - json_info_dict = dict((k, v) for k, v in info_dict.items() if not k in ['urlhandle']) - write_json_file(json_info_dict, encodeFilename(infofn)) - except (OSError, IOError): - self.report_error(u'Cannot write metadata to JSON file ' + infofn) - return + if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(infofn)): + self.to_screen(u'[info] Video description metadata is already present') + else: + self.to_screen(u'[info] Writing video description metadata as JSON to: ' + infofn) + try: + json_info_dict = dict((k, v) for k, v in info_dict.items() if not k in ['urlhandle']) + write_json_file(json_info_dict, encodeFilename(infofn)) + except (OSError, IOError): + self.report_error(u'Cannot write metadata to JSON file ' + infofn) + return if self.params.get('writethumbnail', False): if info_dict.get('thumbnail') is not None: thumb_format = determine_ext(info_dict['thumbnail'], u'jpg') - thumb_filename = filename.rpartition('.')[0] + u'.' + thumb_format - self.to_screen(u'[%s] %s: Downloading thumbnail ...' % - (info_dict['extractor'], info_dict['id'])) - try: - uf = compat_urllib_request.urlopen(info_dict['thumbnail']) - with open(thumb_filename, 'wb') as thumbf: - shutil.copyfileobj(uf, thumbf) - self.to_screen(u'[%s] %s: Writing thumbnail to: %s' % - (info_dict['extractor'], info_dict['id'], thumb_filename)) - except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: - self.report_warning(u'Unable to download thumbnail "%s": %s' % - (info_dict['thumbnail'], compat_str(err))) + thumb_filename = os.path.splitext(filename)[0] + u'.' + thumb_format + if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(thumb_filename)): + self.to_screen(u'[%s] %s: Thumbnail is already present' % + (info_dict['extractor'], info_dict['id'])) + else: + self.to_screen(u'[%s] %s: Downloading thumbnail ...' % + (info_dict['extractor'], info_dict['id'])) + try: + uf = compat_urllib_request.urlopen(info_dict['thumbnail']) + with open(thumb_filename, 'wb') as thumbf: + shutil.copyfileobj(uf, thumbf) + self.to_screen(u'[%s] %s: Writing thumbnail to: %s' % + (info_dict['extractor'], info_dict['id'], thumb_filename)) + except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: + self.report_warning(u'Unable to download thumbnail "%s": %s' % + (info_dict['thumbnail'], compat_str(err))) if not self.params.get('skip_download', False): if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(filename)): @@ -812,6 +908,20 @@ class YoutubeDL(object): return self._download_retcode + def download_with_info_file(self, info_filename): + with io.open(info_filename, 'r', encoding='utf-8') as f: + info = json.load(f) + try: + self.process_ie_result(info, download=True) + except DownloadError: + webpage_url = info.get('webpage_url') + if webpage_url is not None: + self.report_warning(u'The info failed to download, trying with "%s"' % webpage_url) + return self.download([webpage_url]) + else: + raise + return self._download_retcode + def post_process(self, filename, ie_info): """Run all the postprocessors on the given file.""" info = dict(ie_info) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index d2446b6..6343730 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -37,6 +37,7 @@ __authors__ = ( 'Anton Larionov', 'Takuya Tsuchida', 'Sergey M.', + 'Michael Orlitzky', ) __license__ = 'Public Domain' @@ -48,7 +49,6 @@ import os import random import re import shlex -import subprocess import sys @@ -56,12 +56,13 @@ from .utils import ( compat_print, DateRange, decodeOption, - determine_ext, + get_term_width, DownloadError, get_cachedir, MaxDownloadsReached, preferredencoding, SameFileError, + setproctitle, std_headers, write_string, ) @@ -113,19 +114,6 @@ def parseOpts(overrideArguments=None): def _comma_separated_values_options_callback(option, opt_str, value, parser): setattr(parser.values, option.dest, value.split(',')) - def _find_term_columns(): - columns = os.environ.get('COLUMNS', None) - if columns: - return int(columns) - - try: - sp = subprocess.Popen(['stty', 'size'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out,err = sp.communicate() - return int(out.split()[1]) - except: - pass - return None - def _hide_login_info(opts): opts = list(opts) for private_opt in ['-p', '--password', '-u', '--username', '--video-password']: @@ -140,7 +128,7 @@ def parseOpts(overrideArguments=None): max_help_position = 80 # No need to wrap help messages if we're on a wide console - columns = _find_term_columns() + columns = get_term_width() if columns: max_width = columns fmt = optparse.IndentedHelpFormatter(width=max_width, max_help_position=max_help_position) @@ -204,12 +192,19 @@ def parseOpts(overrideArguments=None): general.add_option( '--socket-timeout', dest='socket_timeout', type=float, default=None, help=optparse.SUPPRESS_HELP) - - - selection.add_option('--playlist-start', - dest='playliststart', metavar='NUMBER', help='playlist video to start at (default is %default)', default=1) - selection.add_option('--playlist-end', - dest='playlistend', metavar='NUMBER', help='playlist video to end at (default is last)', default=-1) + general.add_option( + '--bidi-workaround', dest='bidi_workaround', action='store_true', + help=u'Work around terminals that lack bidirectional text support. Requires fribidi executable in PATH') + + + selection.add_option( + '--playlist-start', + dest='playliststart', metavar='NUMBER', default=1, type=int, + help='playlist video to start at (default is %default)') + selection.add_option( + '--playlist-end', + dest='playlistend', metavar='NUMBER', default=None, type=int, + help='playlist video to end at (default is last)') selection.add_option('--match-title', dest='matchtitle', metavar='REGEX',help='download only matching titles (regex or caseless sub-string)') selection.add_option('--reject-title', dest='rejecttitle', metavar='REGEX',help='skip download for matching titles (regex or caseless sub-string)') selection.add_option('--max-downloads', metavar='NUMBER', @@ -220,6 +215,14 @@ def parseOpts(overrideArguments=None): selection.add_option('--date', metavar='DATE', dest='date', help='download only videos uploaded in this date', default=None) selection.add_option('--datebefore', metavar='DATE', dest='datebefore', help='download only videos uploaded before this date', default=None) selection.add_option('--dateafter', metavar='DATE', dest='dateafter', help='download only videos uploaded after this date', default=None) + selection.add_option( + '--min-views', metavar='COUNT', dest='min_views', + default=None, type=int, + help="Do not download any videos with less than COUNT views",) + selection.add_option( + '--max-views', metavar='COUNT', dest='max_views', + default=None, type=int, + help="Do not download any videos with more than COUNT views",) selection.add_option('--no-playlist', action='store_true', dest='noplaylist', help='download only the currently playing video', default=False) selection.add_option('--age-limit', metavar='YEARS', dest='age_limit', help='download only videos suitable for the given age', @@ -300,6 +303,9 @@ def parseOpts(overrideArguments=None): verbosity.add_option('--get-description', action='store_true', dest='getdescription', help='simulate, quiet but print video description', default=False) + verbosity.add_option('--get-duration', + action='store_true', dest='getduration', + help='simulate, quiet but print video length', default=False) verbosity.add_option('--get-filename', action='store_true', dest='getfilename', help='simulate, quiet but print output filename', default=False) @@ -360,6 +366,9 @@ def parseOpts(overrideArguments=None): help='Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames', default=False) filesystem.add_option('-a', '--batch-file', dest='batchfile', metavar='FILE', help='file containing URLs to download (\'-\' for stdin)') + filesystem.add_option('--load-info', + dest='load_info_filename', metavar='FILE', + help='json file containing the video information (created with the "--write-json" option') filesystem.add_option('-w', '--no-overwrites', action='store_true', dest='nooverwrites', help='do not overwrite files', default=False) filesystem.add_option('-c', '--continue', @@ -467,12 +476,15 @@ def parseOpts(overrideArguments=None): return parser, opts, args + def _real_main(argv=None): # Compatibility fixes for Windows if sys.platform == 'win32': # https://github.com/rg3/youtube-dl/issues/820 codecs.register(lambda name: codecs.lookup('utf-8') if name == 'cp65001' else None) + setproctitle(u'youtube-dl') + parser, opts, args = parseOpts(argv) # Set user agent @@ -512,7 +524,6 @@ def _real_main(argv=None): for ie in sorted(extractors, key=lambda ie: ie.IE_NAME.lower()): compat_print(ie.IE_NAME + (' (CURRENTLY BROKEN)' if not ie._WORKING else '')) matchedUrls = [url for url in all_urls if ie.suitable(url)] - all_urls = [url for url in all_urls if url not in matchedUrls] for mu in matchedUrls: compat_print(u' ' + mu) sys.exit(0) @@ -567,18 +578,10 @@ def _real_main(argv=None): if numeric_buffersize is None: parser.error(u'invalid buffer size specified') opts.buffersize = numeric_buffersize - try: - opts.playliststart = int(opts.playliststart) - if opts.playliststart <= 0: - raise ValueError(u'Playlist start must be positive') - except (TypeError, ValueError): - parser.error(u'invalid playlist start number specified') - try: - opts.playlistend = int(opts.playlistend) - if opts.playlistend != -1 and (opts.playlistend <= 0 or opts.playlistend < opts.playliststart): - raise ValueError(u'Playlist end must be greater than playlist start') - except (TypeError, ValueError): - parser.error(u'invalid playlist end number specified') + if opts.playliststart <= 0: + raise ValueError(u'Playlist start must be positive') + if opts.playlistend not in (-1, None) and opts.playlistend < opts.playliststart: + raise ValueError(u'Playlist end must be greater than playlist start') if opts.extractaudio: if opts.audioformat not in ['best', 'aac', 'mp3', 'm4a', 'opus', 'vorbis', 'wav']: parser.error(u'invalid audio format specified') @@ -611,27 +614,30 @@ def _real_main(argv=None): or (opts.useid and u'%(id)s.%(ext)s') or (opts.autonumber and u'%(autonumber)s-%(id)s.%(ext)s') or u'%(title)s-%(id)s.%(ext)s') - if '%(ext)s' not in outtmpl and opts.extractaudio: + if not os.path.splitext(outtmpl)[1] and opts.extractaudio: parser.error(u'Cannot download a video and extract audio into the same' - u' file! Use "%%(ext)s" instead of %r' % - determine_ext(outtmpl, u'')) + u' file! Use "{0}.%(ext)s" instead of "{0}" as the output' + u' template'.format(outtmpl)) + + any_printing = opts.geturl or opts.gettitle or opts.getid or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat or opts.getduration or opts.dumpjson ydl_opts = { 'usenetrc': opts.usenetrc, 'username': opts.username, 'password': opts.password, 'videopassword': opts.videopassword, - 'quiet': (opts.quiet or opts.geturl or opts.gettitle or opts.getid or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat or opts.dumpjson), + 'quiet': (opts.quiet or any_printing), 'forceurl': opts.geturl, 'forcetitle': opts.gettitle, 'forceid': opts.getid, 'forcethumbnail': opts.getthumbnail, 'forcedescription': opts.getdescription, + 'forceduration': opts.getduration, 'forcefilename': opts.getfilename, 'forceformat': opts.getformat, 'forcejson': opts.dumpjson, 'simulate': opts.simulate, - 'skip_download': (opts.skip_download or opts.simulate or opts.geturl or opts.gettitle or opts.getid or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat or opts.dumpjson), + 'skip_download': (opts.skip_download or opts.simulate or any_printing), 'format': opts.format, 'format_limit': opts.format_limit, 'listformats': opts.listformats, @@ -675,6 +681,8 @@ def _real_main(argv=None): 'keepvideo': opts.keepvideo, 'min_filesize': opts.min_filesize, 'max_filesize': opts.max_filesize, + 'min_views': opts.min_views, + 'max_views': opts.max_views, 'daterange': date, 'cachedir': opts.cachedir, 'youtube_print_sig_code': opts.youtube_print_sig_code, @@ -684,6 +692,7 @@ def _real_main(argv=None): 'nocheckcertificate': opts.no_check_certificate, 'proxy': opts.proxy, 'socket_timeout': opts.socket_timeout, + 'bidi_workaround': opts.bidi_workaround, } with YoutubeDL(ydl_opts) as ydl: @@ -706,14 +715,17 @@ def _real_main(argv=None): update_self(ydl.to_screen, opts.verbose) # Maybe do nothing - if len(all_urls) < 1: + if (len(all_urls) < 1) and (opts.load_info_filename is None): if not opts.update_self: parser.error(u'you must provide at least one URL') else: sys.exit() try: - retcode = ydl.download(all_urls) + if opts.load_info_filename is not None: + retcode = ydl.download_with_info_file(opts.load_info_filename) + else: + retcode = ydl.download(all_urls) except MaxDownloadsReached: ydl.to_screen(u'--max-download limit reached, aborting.') retcode = 101 diff --git a/youtube_dl/aes.py b/youtube_dl/aes.py index 9a0c93f..e9c5e21 100644 --- a/youtube_dl/aes.py +++ b/youtube_dl/aes.py @@ -1,4 +1,4 @@ -__all__ = ['aes_encrypt', 'key_expansion', 'aes_ctr_decrypt', 'aes_decrypt_text'] +__all__ = ['aes_encrypt', 'key_expansion', 'aes_ctr_decrypt', 'aes_cbc_decrypt', 'aes_decrypt_text'] import base64 from math import ceil @@ -32,6 +32,31 @@ def aes_ctr_decrypt(data, key, counter): return decrypted_data +def aes_cbc_decrypt(data, key, iv): + """ + Decrypt with aes in CBC mode + + @param {int[]} data cipher + @param {int[]} key 16/24/32-Byte cipher key + @param {int[]} iv 16-Byte IV + @returns {int[]} decrypted data + """ + expanded_key = key_expansion(key) + block_count = int(ceil(float(len(data)) / BLOCK_SIZE_BYTES)) + + decrypted_data=[] + previous_cipher_block = iv + for i in range(block_count): + block = data[i*BLOCK_SIZE_BYTES : (i+1)*BLOCK_SIZE_BYTES] + block += [0]*(BLOCK_SIZE_BYTES - len(block)) + + decrypted_block = aes_decrypt(block, expanded_key) + decrypted_data += xor(decrypted_block, previous_cipher_block) + previous_cipher_block = block + decrypted_data = decrypted_data[:len(data)] + + return decrypted_data + def key_expansion(data): """ Generate key schedule @@ -75,7 +100,7 @@ def aes_encrypt(data, expanded_key): @returns {int[]} 16-Byte cipher """ rounds = len(expanded_key) // BLOCK_SIZE_BYTES - 1 - + data = xor(data, expanded_key[:BLOCK_SIZE_BYTES]) for i in range(1, rounds+1): data = sub_bytes(data) @@ -83,6 +108,26 @@ def aes_encrypt(data, expanded_key): if i != rounds: data = mix_columns(data) data = xor(data, expanded_key[i*BLOCK_SIZE_BYTES : (i+1)*BLOCK_SIZE_BYTES]) + + return data + +def aes_decrypt(data, expanded_key): + """ + Decrypt one block with aes + + @param {int[]} data 16-Byte cipher + @param {int[]} expanded_key 176/208/240-Byte expanded key + @returns {int[]} 16-Byte state + """ + rounds = len(expanded_key) // BLOCK_SIZE_BYTES - 1 + + for i in range(rounds, 0, -1): + data = xor(data, expanded_key[i*BLOCK_SIZE_BYTES : (i+1)*BLOCK_SIZE_BYTES]) + if i != rounds: + data = mix_columns_inv(data) + data = shift_rows_inv(data) + data = sub_bytes_inv(data) + data = xor(data, expanded_key[:BLOCK_SIZE_BYTES]) return data @@ -139,14 +184,69 @@ SBOX = (0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16) -MIX_COLUMN_MATRIX = ((2,3,1,1), - (1,2,3,1), - (1,1,2,3), - (3,1,1,2)) +SBOX_INV = (0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d) +MIX_COLUMN_MATRIX = ((0x2,0x3,0x1,0x1), + (0x1,0x2,0x3,0x1), + (0x1,0x1,0x2,0x3), + (0x3,0x1,0x1,0x2)) +MIX_COLUMN_MATRIX_INV = ((0xE,0xB,0xD,0x9), + (0x9,0xE,0xB,0xD), + (0xD,0x9,0xE,0xB), + (0xB,0xD,0x9,0xE)) +RIJNDAEL_EXP_TABLE = (0x01, 0x03, 0x05, 0x0F, 0x11, 0x33, 0x55, 0xFF, 0x1A, 0x2E, 0x72, 0x96, 0xA1, 0xF8, 0x13, 0x35, + 0x5F, 0xE1, 0x38, 0x48, 0xD8, 0x73, 0x95, 0xA4, 0xF7, 0x02, 0x06, 0x0A, 0x1E, 0x22, 0x66, 0xAA, + 0xE5, 0x34, 0x5C, 0xE4, 0x37, 0x59, 0xEB, 0x26, 0x6A, 0xBE, 0xD9, 0x70, 0x90, 0xAB, 0xE6, 0x31, + 0x53, 0xF5, 0x04, 0x0C, 0x14, 0x3C, 0x44, 0xCC, 0x4F, 0xD1, 0x68, 0xB8, 0xD3, 0x6E, 0xB2, 0xCD, + 0x4C, 0xD4, 0x67, 0xA9, 0xE0, 0x3B, 0x4D, 0xD7, 0x62, 0xA6, 0xF1, 0x08, 0x18, 0x28, 0x78, 0x88, + 0x83, 0x9E, 0xB9, 0xD0, 0x6B, 0xBD, 0xDC, 0x7F, 0x81, 0x98, 0xB3, 0xCE, 0x49, 0xDB, 0x76, 0x9A, + 0xB5, 0xC4, 0x57, 0xF9, 0x10, 0x30, 0x50, 0xF0, 0x0B, 0x1D, 0x27, 0x69, 0xBB, 0xD6, 0x61, 0xA3, + 0xFE, 0x19, 0x2B, 0x7D, 0x87, 0x92, 0xAD, 0xEC, 0x2F, 0x71, 0x93, 0xAE, 0xE9, 0x20, 0x60, 0xA0, + 0xFB, 0x16, 0x3A, 0x4E, 0xD2, 0x6D, 0xB7, 0xC2, 0x5D, 0xE7, 0x32, 0x56, 0xFA, 0x15, 0x3F, 0x41, + 0xC3, 0x5E, 0xE2, 0x3D, 0x47, 0xC9, 0x40, 0xC0, 0x5B, 0xED, 0x2C, 0x74, 0x9C, 0xBF, 0xDA, 0x75, + 0x9F, 0xBA, 0xD5, 0x64, 0xAC, 0xEF, 0x2A, 0x7E, 0x82, 0x9D, 0xBC, 0xDF, 0x7A, 0x8E, 0x89, 0x80, + 0x9B, 0xB6, 0xC1, 0x58, 0xE8, 0x23, 0x65, 0xAF, 0xEA, 0x25, 0x6F, 0xB1, 0xC8, 0x43, 0xC5, 0x54, + 0xFC, 0x1F, 0x21, 0x63, 0xA5, 0xF4, 0x07, 0x09, 0x1B, 0x2D, 0x77, 0x99, 0xB0, 0xCB, 0x46, 0xCA, + 0x45, 0xCF, 0x4A, 0xDE, 0x79, 0x8B, 0x86, 0x91, 0xA8, 0xE3, 0x3E, 0x42, 0xC6, 0x51, 0xF3, 0x0E, + 0x12, 0x36, 0x5A, 0xEE, 0x29, 0x7B, 0x8D, 0x8C, 0x8F, 0x8A, 0x85, 0x94, 0xA7, 0xF2, 0x0D, 0x17, + 0x39, 0x4B, 0xDD, 0x7C, 0x84, 0x97, 0xA2, 0xFD, 0x1C, 0x24, 0x6C, 0xB4, 0xC7, 0x52, 0xF6, 0x01) +RIJNDAEL_LOG_TABLE = (0x00, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1a, 0xc6, 0x4b, 0xc7, 0x1b, 0x68, 0x33, 0xee, 0xdf, 0x03, + 0x64, 0x04, 0xe0, 0x0e, 0x34, 0x8d, 0x81, 0xef, 0x4c, 0x71, 0x08, 0xc8, 0xf8, 0x69, 0x1c, 0xc1, + 0x7d, 0xc2, 0x1d, 0xb5, 0xf9, 0xb9, 0x27, 0x6a, 0x4d, 0xe4, 0xa6, 0x72, 0x9a, 0xc9, 0x09, 0x78, + 0x65, 0x2f, 0x8a, 0x05, 0x21, 0x0f, 0xe1, 0x24, 0x12, 0xf0, 0x82, 0x45, 0x35, 0x93, 0xda, 0x8e, + 0x96, 0x8f, 0xdb, 0xbd, 0x36, 0xd0, 0xce, 0x94, 0x13, 0x5c, 0xd2, 0xf1, 0x40, 0x46, 0x83, 0x38, + 0x66, 0xdd, 0xfd, 0x30, 0xbf, 0x06, 0x8b, 0x62, 0xb3, 0x25, 0xe2, 0x98, 0x22, 0x88, 0x91, 0x10, + 0x7e, 0x6e, 0x48, 0xc3, 0xa3, 0xb6, 0x1e, 0x42, 0x3a, 0x6b, 0x28, 0x54, 0xfa, 0x85, 0x3d, 0xba, + 0x2b, 0x79, 0x0a, 0x15, 0x9b, 0x9f, 0x5e, 0xca, 0x4e, 0xd4, 0xac, 0xe5, 0xf3, 0x73, 0xa7, 0x57, + 0xaf, 0x58, 0xa8, 0x50, 0xf4, 0xea, 0xd6, 0x74, 0x4f, 0xae, 0xe9, 0xd5, 0xe7, 0xe6, 0xad, 0xe8, + 0x2c, 0xd7, 0x75, 0x7a, 0xeb, 0x16, 0x0b, 0xf5, 0x59, 0xcb, 0x5f, 0xb0, 0x9c, 0xa9, 0x51, 0xa0, + 0x7f, 0x0c, 0xf6, 0x6f, 0x17, 0xc4, 0x49, 0xec, 0xd8, 0x43, 0x1f, 0x2d, 0xa4, 0x76, 0x7b, 0xb7, + 0xcc, 0xbb, 0x3e, 0x5a, 0xfb, 0x60, 0xb1, 0x86, 0x3b, 0x52, 0xa1, 0x6c, 0xaa, 0x55, 0x29, 0x9d, + 0x97, 0xb2, 0x87, 0x90, 0x61, 0xbe, 0xdc, 0xfc, 0xbc, 0x95, 0xcf, 0xcd, 0x37, 0x3f, 0x5b, 0xd1, + 0x53, 0x39, 0x84, 0x3c, 0x41, 0xa2, 0x6d, 0x47, 0x14, 0x2a, 0x9e, 0x5d, 0x56, 0xf2, 0xd3, 0xab, + 0x44, 0x11, 0x92, 0xd9, 0x23, 0x20, 0x2e, 0x89, 0xb4, 0x7c, 0xb8, 0x26, 0x77, 0x99, 0xe3, 0xa5, + 0x67, 0x4a, 0xed, 0xde, 0xc5, 0x31, 0xfe, 0x18, 0x0d, 0x63, 0x8c, 0x80, 0xc0, 0xf7, 0x70, 0x07) def sub_bytes(data): return [SBOX[x] for x in data] +def sub_bytes_inv(data): + return [SBOX_INV[x] for x in data] + def rotate(data): return data[1:] + [data[0]] @@ -160,30 +260,31 @@ def key_schedule_core(data, rcon_iteration): def xor(data1, data2): return [x^y for x, y in zip(data1, data2)] -def mix_column(data): +def rijndael_mul(a, b): + if(a==0 or b==0): + return 0 + return RIJNDAEL_EXP_TABLE[(RIJNDAEL_LOG_TABLE[a] + RIJNDAEL_LOG_TABLE[b]) % 0xFF] + +def mix_column(data, matrix): data_mixed = [] for row in range(4): mixed = 0 for column in range(4): - addend = data[column] - if MIX_COLUMN_MATRIX[row][column] in (2,3): - addend <<= 1 - if addend > 0xff: - addend &= 0xff - addend ^= 0x1b - if MIX_COLUMN_MATRIX[row][column] == 3: - addend ^= data[column] - mixed ^= addend & 0xff + # xor is (+) and (-) + mixed ^= rijndael_mul(data[column], matrix[row][column]) data_mixed.append(mixed) return data_mixed -def mix_columns(data): +def mix_columns(data, matrix=MIX_COLUMN_MATRIX): data_mixed = [] for i in range(4): column = data[i*4 : (i+1)*4] - data_mixed += mix_column(column) + data_mixed += mix_column(column, matrix) return data_mixed +def mix_columns_inv(data): + return mix_columns(data, MIX_COLUMN_MATRIX_INV) + def shift_rows(data): data_shifted = [] for column in range(4): @@ -191,6 +292,13 @@ def shift_rows(data): data_shifted.append( data[((column + row) & 0b11) * 4 + row] ) return data_shifted +def shift_rows_inv(data): + data_shifted = [] + for column in range(4): + for row in range(4): + data_shifted.append( data[((column - row) & 0b11) * 4 + row] ) + return data_shifted + def inc(data): data = data[:] # copy for i in range(len(data)-1,-1,-1): diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index bd99648..a39a1e2 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -1,6 +1,8 @@ -from .appletrailers import AppleTrailersIE +from .academicearth import AcademicEarthCourseIE from .addanime import AddAnimeIE from .anitube import AnitubeIE +from .aparat import AparatIE +from .appletrailers import AppleTrailersIE from .archiveorg import ArchiveOrgIE from .ard import ARDIE from .arte import ( @@ -8,10 +10,12 @@ from .arte import ( ArteTVPlus7IE, ArteTVCreativeIE, ArteTVFutureIE, + ArteTVDDCIE, ) from .auengine import AUEngineIE from .bambuser import BambuserIE, BambuserChannelIE from .bandcamp import BandcampIE, BandcampAlbumIE +from .blinkx import BlinkxIE from .bliptv import BlipTVIE, BlipTVUserIE from .bloomberg import BloombergIE from .breakcom import BreakIE @@ -19,6 +23,8 @@ from .brightcove import BrightcoveIE from .c56 import C56IE from .canalplus import CanalplusIE from .canalc2 import Canalc2IE +from .cbs import CBSIE +from .channel9 import Channel9IE from .cinemassacre import CinemassacreIE from .clipfish import ClipfishIE from .clipsyndicate import ClipsyndicateIE @@ -27,6 +33,7 @@ from .collegehumor import CollegeHumorIE from .comedycentral import ComedyCentralIE, ComedyCentralShowsIE from .condenast import CondeNastIE from .criterion import CriterionIE +from .crunchyroll import CrunchyrollIE from .cspan import CSpanIE from .d8 import D8IE from .dailymotion import ( @@ -56,7 +63,7 @@ from .flickr import FlickrIE from .francetv import ( PluzzIE, FranceTvInfoIE, - France2IE, + FranceTVIE, GenerationQuoiIE ) from .freesound import FreesoundIE @@ -77,6 +84,10 @@ from .ina import InaIE from .infoq import InfoQIE from .instagram import InstagramIE from .internetvideoarchive import InternetVideoArchiveIE +from .ivi import ( + IviIE, + IviCompilationIE +) from .jeuxvideo import JeuxVideoIE from .jukebox import JukeboxIE from .justintv import JustinTVIE @@ -86,6 +97,7 @@ from .kickstarter import KickStarterIE from .keek import KeekIE from .liveleak import LiveLeakIE from .livestream import LivestreamIE, LivestreamOriginalIE +from .mdr import MDRIE from .metacafe import MetacafeIE from .metacritic import MetacriticIE from .mit import TechTVMITIE, MITIE @@ -99,17 +111,22 @@ from .myvideo import MyVideoIE from .naver import NaverIE from .nba import NBAIE from .nbc import NBCNewsIE +from .ndtv import NDTVIE from .newgrounds import NewgroundsIE from .nhl import NHLIE, NHLVideocenterIE from .niconico import NiconicoIE +from .ninegag import NineGagIE from .nowvideo import NowVideoIE from .ooyala import OoyalaIE from .orf import ORFIE from .pbs import PBSIE from .photobucket import PhotobucketIE from .podomatic import PodomaticIE +from .pornhd import PornHdIE from .pornhub import PornHubIE from .pornotube import PornotubeIE +from .pyvideo import PyvideoIE +from .radiofrance import RadioFranceIE from .rbmaradio import RBMARadioIE from .redtube import RedTubeIE from .ringtv import RingTVIE @@ -125,6 +142,7 @@ from .smotri import ( SmotriIE, SmotriCommunityIE, SmotriUserIE, + SmotriBroadcastIE, ) from .sohu import SohuIE from .soundcloud import SoundcloudIE, SoundcloudSetIE, SoundcloudUserIE @@ -144,6 +162,7 @@ from .teamcoco import TeamcocoIE from .techtalks import TechTalksIE from .ted import TEDIE from .tf1 import TF1IE +from .theplatform import ThePlatformIE from .thisav import ThisAVIE from .toutv import TouTvIE from .traileraddict import TrailerAddictIE @@ -168,6 +187,8 @@ from .vimeo import ( VimeoIE, VimeoChannelIE, VimeoUserIE, + VimeoAlbumIE, + VimeoGroupsIE, ) from .vine import VineIE from .viki import VikiIE @@ -176,6 +197,7 @@ from .wat import WatIE from .websurg import WeBSurgIE from .weibo import WeiboIE from .wimp import WimpIE +from .wistia import WistiaIE from .worldstarhiphop import WorldStarHipHopIE from .xhamster import XHamsterIE from .xnxx import XNXXIE @@ -203,6 +225,7 @@ from .youtube import ( YoutubeWatchLaterIE, YoutubeFavouritesIE, YoutubeHistoryIE, + YoutubeTopListIE, ) from .zdf import ZDFIE diff --git a/youtube_dl/extractor/academicearth.py b/youtube_dl/extractor/academicearth.py new file mode 100644 index 0000000..ac05f82 --- /dev/null +++ b/youtube_dl/extractor/academicearth.py @@ -0,0 +1,31 @@ +import re + +from .common import InfoExtractor + + +class AcademicEarthCourseIE(InfoExtractor): + _VALID_URL = r'^https?://(?:www\.)?academicearth\.org/(?:courses|playlists)/(?P[^?#/]+)' + IE_NAME = u'AcademicEarth:Course' + + def _real_extract(self, url): + m = re.match(self._VALID_URL, url) + playlist_id = m.group('id') + + webpage = self._download_webpage(url, playlist_id) + title = self._html_search_regex( + r'

(.*?)

', webpage, u'title') + description = self._html_search_regex( + r'

(.*?)

', + webpage, u'description', fatal=False) + urls = re.findall( + r'

', + webpage) + entries = [self.url_result(u) for u in urls] + + return { + '_type': 'playlist', + 'id': playlist_id, + 'title': title, + 'description': description, + 'entries': entries, + } diff --git a/youtube_dl/extractor/addanime.py b/youtube_dl/extractor/addanime.py index b99d4b9..a3a1b99 100644 --- a/youtube_dl/extractor/addanime.py +++ b/youtube_dl/extractor/addanime.py @@ -13,7 +13,7 @@ from ..utils import ( class AddAnimeIE(InfoExtractor): - _VALID_URL = r'^http://(?:\w+\.)?add-anime\.net/watch_video.php\?(?:.*?)v=(?P[\w_]+)(?:.*)' + _VALID_URL = r'^http://(?:\w+\.)?add-anime\.net/watch_video\.php\?(?:.*?)v=(?P[\w_]+)(?:.*)' IE_NAME = u'AddAnime' _TEST = { u'url': u'http://www.add-anime.net/watch_video.php?v=24MR3YO5SAS9', diff --git a/youtube_dl/extractor/aparat.py b/youtube_dl/extractor/aparat.py new file mode 100644 index 0000000..7e93bc4 --- /dev/null +++ b/youtube_dl/extractor/aparat.py @@ -0,0 +1,56 @@ +#coding: utf-8 + +import re + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + HEADRequest, +) + + +class AparatIE(InfoExtractor): + _VALID_URL = r'^https?://(?:www\.)?aparat\.com/(?:v/|video/video/embed/videohash/)(?P[a-zA-Z0-9]+)' + + _TEST = { + u'url': u'http://www.aparat.com/v/wP8On', + u'file': u'wP8On.mp4', + u'md5': u'6714e0af7e0d875c5a39c4dc4ab46ad1', + u'info_dict': { + u"title": u"تیم گلکسی 11 - زومیت", + }, + #u'skip': u'Extremely unreliable', + } + + def _real_extract(self, url): + m = re.match(self._VALID_URL, url) + video_id = m.group('id') + + # Note: There is an easier-to-parse configuration at + # http://www.aparat.com/video/video/config/videohash/%video_id + # but the URL in there does not work + embed_url = (u'http://www.aparat.com/video/video/embed/videohash/' + + video_id + u'/vt/frame') + webpage = self._download_webpage(embed_url, video_id) + + video_urls = re.findall(r'fileList\[[0-9]+\]\s*=\s*"([^"]+)"', webpage) + for i, video_url in enumerate(video_urls): + req = HEADRequest(video_url) + res = self._request_webpage( + req, video_id, note=u'Testing video URL %d' % i, errnote=False) + if res: + break + else: + raise ExtractorError(u'No working video URLs found') + + title = self._search_regex(r'\s+title:\s*"([^"]+)"', webpage, u'title') + thumbnail = self._search_regex( + r'\s+image:\s*"([^"]+)"', webpage, u'thumbnail', fatal=False) + + return { + 'id': video_id, + 'title': title, + 'url': video_url, + 'ext': 'mp4', + 'thumbnail': thumbnail, + } diff --git a/youtube_dl/extractor/appletrailers.py b/youtube_dl/extractor/appletrailers.py index 4befff3..ef5644a 100644 --- a/youtube_dl/extractor/appletrailers.py +++ b/youtube_dl/extractor/appletrailers.py @@ -1,5 +1,4 @@ import re -import xml.etree.ElementTree import json from .common import InfoExtractor @@ -10,7 +9,7 @@ from ..utils import ( class AppleTrailersIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?trailers.apple.com/trailers/(?P[^/]+)/(?P[^/]+)' + _VALID_URL = r'https?://(?:www\.)?trailers\.apple\.com/trailers/(?P[^/]+)/(?P[^/]+)' _TEST = { u"url": u"http://trailers.apple.com/trailers/wb/manofsteel/", u"playlist": [ @@ -65,18 +64,18 @@ class AppleTrailersIE(InfoExtractor): uploader_id = mobj.group('company') playlist_url = compat_urlparse.urljoin(url, u'includes/playlists/itunes.inc') - playlist_snippet = self._download_webpage(playlist_url, movie) - playlist_cleaned = re.sub(r'(?s).*?', u'', playlist_snippet) - playlist_cleaned = re.sub(r'', r'', playlist_cleaned) - # The ' in the onClick attributes are not escaped, it couldn't be parsed - # with xml.etree.ElementTree.fromstring - # like: http://trailers.apple.com/trailers/wb/gravity/ - def _clean_json(m): - return u'iTunes.playURL(%s);' % m.group(1).replace('\'', ''') - playlist_cleaned = re.sub(self._JSON_RE, _clean_json, playlist_cleaned) - playlist_html = u'' + playlist_cleaned + u'' + def fix_html(s): + s = re.sub(r'(?s).*?', u'', s) + s = re.sub(r'', r'', s) + # The ' in the onClick attributes are not escaped, it couldn't be parsed + # like: http://trailers.apple.com/trailers/wb/gravity/ + def _clean_json(m): + return u'iTunes.playURL(%s);' % m.group(1).replace('\'', ''') + s = re.sub(self._JSON_RE, _clean_json, s) + s = u'' + s + u'' + return s + doc = self._download_xml(playlist_url, movie, transform_source=fix_html) - doc = xml.etree.ElementTree.fromstring(playlist_html) playlist = [] for li in doc.findall('./div/ul/li'): on_click = li.find('.//a').attrib['onClick'] diff --git a/youtube_dl/extractor/archiveorg.py b/youtube_dl/extractor/archiveorg.py index 3ae0aeb..8bb5464 100644 --- a/youtube_dl/extractor/archiveorg.py +++ b/youtube_dl/extractor/archiveorg.py @@ -11,7 +11,7 @@ from ..utils import ( class ArchiveOrgIE(InfoExtractor): IE_NAME = 'archive.org' IE_DESC = 'archive.org videos' - _VALID_URL = r'(?:https?://)?(?:www\.)?archive.org/details/(?P[^?/]+)(?:[?].*)?$' + _VALID_URL = r'(?:https?://)?(?:www\.)?archive\.org/details/(?P[^?/]+)(?:[?].*)?$' _TEST = { u"url": u"http://archive.org/details/XD300-23_68HighlightsAResearchCntAugHumanIntellect", u'file': u'XD300-23_68HighlightsAResearchCntAugHumanIntellect.ogv', diff --git a/youtube_dl/extractor/arte.py b/youtube_dl/extractor/arte.py index 8b62ee7..9254fbf 100644 --- a/youtube_dl/extractor/arte.py +++ b/youtube_dl/extractor/arte.py @@ -10,6 +10,7 @@ from ..utils import ( determine_ext, get_element_by_id, compat_str, + get_element_by_attribute, ) # There are different sources of video in arte.tv, the extraction process @@ -17,8 +18,8 @@ from ..utils import ( # add tests. class ArteTvIE(InfoExtractor): - _VIDEOS_URL = r'(?:http://)?videos.arte.tv/(?Pfr|de)/.*-(?P.*?).html' - _LIVEWEB_URL = r'(?:http://)?liveweb.arte.tv/(?Pfr|de)/(?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' @@ -142,7 +143,9 @@ class ArteTVPlus7IE(InfoExtractor): def _extract_from_webpage(self, webpage, video_id, lang): json_url = self._html_search_regex(r'arte_vp_url="(.*?)"', webpage, 'json url') + return self._extract_from_json_url(json_url, video_id, lang) + def _extract_from_json_url(self, json_url, video_id, lang): json_info = self._download_webpage(json_url, video_id, 'Downloading info json') self.report_extraction(video_id) info = json.loads(json_info) @@ -257,3 +260,21 @@ class ArteTVFutureIE(ArteTVPlus7IE): webpage = self._download_webpage(url, anchor_id) row = get_element_by_id(anchor_id, webpage) return self._extract_from_webpage(row, anchor_id, lang) + + +class ArteTVDDCIE(ArteTVPlus7IE): + IE_NAME = u'arte.tv:ddc' + _VALID_URL = r'http?://ddc\.arte\.tv/(?Pemission|folge)/(?P.+)' + + def _real_extract(self, url): + video_id, lang = self._extract_url_info(url) + if lang == 'folge': + lang = 'de' + elif lang == 'emission': + lang = 'fr' + webpage = self._download_webpage(url, video_id) + scriptElement = get_element_by_attribute('class', 'visu_video_block', webpage) + script_url = self._html_search_regex(r'src="(.*?)"', scriptElement, 'script url') + javascriptPlayerGenerator = self._download_webpage(script_url, video_id, 'Download javascript player generator') + json_url = self._search_regex(r"json_url=(.*)&rendering_place.*", javascriptPlayerGenerator, 'json url') + return self._extract_from_json_url(json_url, video_id, lang) diff --git a/youtube_dl/extractor/auengine.py b/youtube_dl/extractor/auengine.py index 95c0380..bcccc0b 100644 --- a/youtube_dl/extractor/auengine.py +++ b/youtube_dl/extractor/auengine.py @@ -16,7 +16,7 @@ class AUEngineIE(InfoExtractor): u"title": u"[Commie]The Legend of the Legendary Heroes - 03 - Replication Eye (Alpha Stigma)[F9410F5A]" } } - _VALID_URL = r'(?:http://)?(?:www\.)?auengine\.com/embed.php\?.*?file=([^&]+).*?' + _VALID_URL = r'(?:http://)?(?:www\.)?auengine\.com/embed\.php\?.*?file=([^&]+).*?' def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/bambuser.py b/youtube_dl/extractor/bambuser.py index b80508e..d48c0c3 100644 --- a/youtube_dl/extractor/bambuser.py +++ b/youtube_dl/extractor/bambuser.py @@ -54,7 +54,7 @@ class BambuserIE(InfoExtractor): class BambuserChannelIE(InfoExtractor): IE_NAME = u'bambuser:channel' - _VALID_URL = r'http://bambuser.com/channel/(?P.*?)(?:/|#|\?|$)' + _VALID_URL = r'https?://bambuser\.com/channel/(?P.*?)(?:/|#|\?|$)' # The maximum number we can get with each request _STEP = 50 diff --git a/youtube_dl/extractor/blinkx.py b/youtube_dl/extractor/blinkx.py new file mode 100644 index 0000000..144ce64 --- /dev/null +++ b/youtube_dl/extractor/blinkx.py @@ -0,0 +1,90 @@ +import datetime +import json +import re + +from .common import InfoExtractor +from ..utils import ( + remove_start, +) + + +class BlinkxIE(InfoExtractor): + _VALID_URL = r'^(?:https?://(?:www\.)blinkx\.com/#?ce/|blinkx:)(?P[^?]+)' + _IE_NAME = u'blinkx' + + _TEST = { + u'url': u'http://www.blinkx.com/ce/8aQUy7GVFYgFzpKhT0oqsilwOGFRVXk3R1ZGWWdGenBLaFQwb3FzaWx3OGFRVXk3R1ZGWWdGenB', + u'file': u'8aQUy7GV.mp4', + u'md5': u'2e9a07364af40163a908edbf10bb2492', + u'info_dict': { + u"title": u"Police Car Rolls Away", + u"uploader": u"stupidvideos.com", + u"upload_date": u"20131215", + u"description": u"A police car gently rolls away from a fight. Maybe it felt weird being around a confrontation and just had to get out of there!", + u"duration": 14.886, + u"thumbnails": [{ + "width": 100, + "height": 76, + "url": "http://cdn.blinkx.com/stream/b/41/StupidVideos/20131215/1873969261/1873969261_tn_0.jpg", + }], + }, + } + + def _real_extract(self, url): + m = re.match(self._VALID_URL, url) + video_id = m.group('id') + display_id = video_id[:8] + + api_url = (u'https://apib4.blinkx.com/api.php?action=play_video&' + + u'video=%s' % video_id) + data_json = self._download_webpage(api_url, display_id) + data = json.loads(data_json)['api']['results'][0] + dt = datetime.datetime.fromtimestamp(data['pubdate_epoch']) + upload_date = dt.strftime('%Y%m%d') + + duration = None + thumbnails = [] + formats = [] + for m in data['media']: + if m['type'] == 'jpg': + thumbnails.append({ + 'url': m['link'], + 'width': int(m['w']), + 'height': int(m['h']), + }) + elif m['type'] == 'original': + duration = m['d'] + elif m['type'] == 'youtube': + yt_id = m['link'] + self.to_screen(u'Youtube video detected: %s' % yt_id) + return self.url_result(yt_id, 'Youtube', video_id=yt_id) + elif m['type'] in ('flv', 'mp4'): + vcodec = remove_start(m['vcodec'], 'ff') + acodec = remove_start(m['acodec'], 'ff') + format_id = (u'%s-%sk-%s' % + (vcodec, + (int(m['vbr']) + int(m['abr'])) // 1000, + m['w'])) + formats.append({ + 'format_id': format_id, + 'url': m['link'], + 'vcodec': vcodec, + 'acodec': acodec, + 'abr': int(m['abr']) // 1000, + 'vbr': int(m['vbr']) // 1000, + 'width': int(m['w']), + 'height': int(m['h']), + }) + formats.sort(key=lambda f: (f['width'], f['vbr'], f['abr'])) + + return { + 'id': display_id, + 'fullid': video_id, + 'title': data['title'], + 'formats': formats, + 'uploader': data['channel_name'], + 'upload_date': upload_date, + 'description': data.get('description'), + 'thumbnails': thumbnails, + 'duration': duration, + } diff --git a/youtube_dl/extractor/bliptv.py b/youtube_dl/extractor/bliptv.py index 493504f..5e33a69 100644 --- a/youtube_dl/extractor/bliptv.py +++ b/youtube_dl/extractor/bliptv.py @@ -51,8 +51,7 @@ class BlipTVIE(InfoExtractor): url = 'http://blip.tv/play/g_%s' % api_mobj.group('video_id') urlp = compat_urllib_parse_urlparse(url) if urlp.path.startswith('/play/'): - request = compat_urllib_request.Request(url) - response = compat_urllib_request.urlopen(request) + response = self._request_webpage(url, None, False) redirecturl = response.geturl() rurlp = compat_urllib_parse_urlparse(redirecturl) file_id = compat_parse_qs(rurlp.fragment)['file'][0].rpartition('/')[2] @@ -69,25 +68,23 @@ class BlipTVIE(InfoExtractor): request.add_header('User-Agent', 'iTunes/10.6.1') self.report_extraction(mobj.group(1)) info = None - try: - urlh = compat_urllib_request.urlopen(request) - if urlh.headers.get('Content-Type', '').startswith('video/'): # Direct download - basename = url.split('/')[-1] - title,ext = os.path.splitext(basename) - title = title.decode('UTF-8') - ext = ext.replace('.', '') - self.report_direct_download(title) - info = { - 'id': title, - 'url': url, - 'uploader': None, - 'upload_date': None, - 'title': title, - 'ext': ext, - 'urlhandle': urlh - } - except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: - raise ExtractorError(u'ERROR: unable to download video info webpage: %s' % compat_str(err)) + urlh = self._request_webpage(request, None, False, + u'unable to download video info webpage') + if urlh.headers.get('Content-Type', '').startswith('video/'): # Direct download + basename = url.split('/')[-1] + title,ext = os.path.splitext(basename) + title = title.decode('UTF-8') + ext = ext.replace('.', '') + self.report_direct_download(title) + info = { + 'id': title, + 'url': url, + 'uploader': None, + 'upload_date': None, + 'title': title, + 'ext': ext, + 'urlhandle': urlh + } if info is None: # Regular URL try: json_code_bytes = urlh.read() diff --git a/youtube_dl/extractor/bloomberg.py b/youtube_dl/extractor/bloomberg.py index 3666a78..755d9c9 100644 --- a/youtube_dl/extractor/bloomberg.py +++ b/youtube_dl/extractor/bloomberg.py @@ -4,7 +4,7 @@ from .common import InfoExtractor class BloombergIE(InfoExtractor): - _VALID_URL = r'https?://www\.bloomberg\.com/video/(?P.+?).html' + _VALID_URL = r'https?://www\.bloomberg\.com/video/(?P.+?)\.html' _TEST = { u'url': u'http://www.bloomberg.com/video/shah-s-presentation-on-foreign-exchange-strategies-qurhIVlJSB6hzkVi229d8g.html', diff --git a/youtube_dl/extractor/brightcove.py b/youtube_dl/extractor/brightcove.py index 66fe0ac..f7f0041 100644 --- a/youtube_dl/extractor/brightcove.py +++ b/youtube_dl/extractor/brightcove.py @@ -26,7 +26,7 @@ class BrightcoveIE(InfoExtractor): # From http://www.8tv.cat/8aldia/videos/xavier-sala-i-martin-aquesta-tarda-a-8-al-dia/ u'url': u'http://c.brightcove.com/services/viewer/htmlFederated?playerID=1654948606001&flashID=myExperience&%40videoPlayer=2371591881001', u'file': u'2371591881001.mp4', - u'md5': u'8eccab865181d29ec2958f32a6a754f5', + u'md5': u'5423e113865d26e40624dce2e4b45d95', u'note': u'Test Brightcove downloads and detection in GenericIE', u'info_dict': { u'title': u'Xavier Sala i Martín: “Un banc que no presta és un banc zombi que no serveix per a res”', @@ -55,6 +55,18 @@ class BrightcoveIE(InfoExtractor): u'uploader': u'Mashable', }, }, + { + # test that the default referer works + # from http://national.ballet.ca/interact/video/Lost_in_Motion_II/ + u'url': u'http://link.brightcove.com/services/player/bcpid756015033001?bckey=AQ~~,AAAApYJi_Ck~,GxhXCegT1Dp39ilhXuxMJxasUhVNZiil&bctid=2878862109001', + u'info_dict': { + u'id': u'2878862109001', + u'ext': u'mp4', + u'title': u'Lost in Motion II', + u'description': u'md5:363109c02998fee92ec02211bd8000df', + u'uploader': u'National Ballet of Canada', + }, + }, ] @classmethod @@ -118,17 +130,21 @@ class BrightcoveIE(InfoExtractor): videoPlayer = query.get('@videoPlayer') if videoPlayer: - return self._get_video_info(videoPlayer[0], query_str, query) + return self._get_video_info(videoPlayer[0], query_str, query, + # We set the original url as the default 'Referer' header + referer=url) else: player_key = query['playerKey'] return self._get_playlist_info(player_key[0]) - def _get_video_info(self, video_id, query_str, query): + def _get_video_info(self, video_id, query_str, query, referer=None): request_url = self._FEDERATED_URL_TEMPLATE % query_str req = compat_urllib_request.Request(request_url) linkBase = query.get('linkBaseURL') if linkBase is not None: - req.add_header('Referer', linkBase[0]) + referer = linkBase[0] + if referer is not None: + req.add_header('Referer', referer) webpage = self._download_webpage(req, video_id) self.report_extraction(video_id) diff --git a/youtube_dl/extractor/cbs.py b/youtube_dl/extractor/cbs.py new file mode 100644 index 0000000..ac03158 --- /dev/null +++ b/youtube_dl/extractor/cbs.py @@ -0,0 +1,30 @@ +import re + +from .common import InfoExtractor + + +class CBSIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?cbs\.com/shows/[^/]+/video/(?P[^/]+)/.*' + + _TEST = { + u'url': u'http://www.cbs.com/shows/garth-brooks/video/_u7W953k6la293J7EPTd9oHkSPs6Xn6_/connect-chat-feat-garth-brooks/', + u'file': u'4JUVEwq3wUT7.flv', + u'info_dict': { + u'title': u'Connect Chat feat. Garth Brooks', + u'description': u'Connect with country music singer Garth Brooks, as he chats with fans on Wednesday November 27, 2013. Be sure to tune in to Garth Brooks: Live from Las Vegas, Friday November 29, at 9/8c on CBS!', + u'duration': 1495, + }, + u'params': { + # rtmp download + u'skip_download': True, + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + webpage = self._download_webpage(url, video_id) + real_id = self._search_regex( + r"video\.settings\.pid\s*=\s*'([^']+)';", + webpage, u'real video ID') + return self.url_result(u'theplatform:%s' % real_id) diff --git a/youtube_dl/extractor/channel9.py b/youtube_dl/extractor/channel9.py new file mode 100644 index 0000000..ae70ea2 --- /dev/null +++ b/youtube_dl/extractor/channel9.py @@ -0,0 +1,267 @@ +# encoding: utf-8 + +import re + +from .common import InfoExtractor +from ..utils import ExtractorError + +class Channel9IE(InfoExtractor): + ''' + Common extractor for channel9.msdn.com. + + The type of provided URL (video or playlist) is determined according to + meta Search.PageType from web page HTML rather than URL itself, as it is + not always possible to do. + ''' + IE_DESC = u'Channel 9' + IE_NAME = u'channel9' + _VALID_URL = r'^https?://(?:www\.)?channel9\.msdn\.com/(?P.+)/?' + + _TESTS = [ + { + u'url': u'http://channel9.msdn.com/Events/TechEd/Australia/2013/KOS002', + u'file': u'Events_TechEd_Australia_2013_KOS002.mp4', + u'md5': u'bbd75296ba47916b754e73c3a4bbdf10', + u'info_dict': { + u'title': u'Developer Kick-Off Session: Stuff We Love', + u'description': u'md5:c08d72240b7c87fcecafe2692f80e35f', + u'duration': 4576, + u'thumbnail': u'http://media.ch9.ms/ch9/9d51/03902f2d-fc97-4d3c-b195-0bfe15a19d51/KOS002_220.jpg', + u'session_code': u'KOS002', + u'session_day': u'Day 1', + u'session_room': u'Arena 1A', + u'session_speakers': [ u'Ed Blankenship', u'Andrew Coates', u'Brady Gaster', u'Patrick Klug', u'Mads Kristensen' ], + }, + }, + { + u'url': u'http://channel9.msdn.com/posts/Self-service-BI-with-Power-BI-nuclear-testing', + u'file': u'posts_Self-service-BI-with-Power-BI-nuclear-testing.mp4', + u'md5': u'b43ee4529d111bc37ba7ee4f34813e68', + u'info_dict': { + u'title': u'Self-service BI with Power BI - nuclear testing', + u'description': u'md5:d1e6ecaafa7fb52a2cacdf9599829f5b', + u'duration': 1540, + u'thumbnail': u'http://media.ch9.ms/ch9/87e1/0300391f-a455-4c72-bec3-4422f19287e1/selfservicenuk_512.jpg', + u'authors': [ u'Mike Wilmot' ], + }, + } + ] + + _RSS_URL = 'http://channel9.msdn.com/%s/RSS' + + # Sorted by quality + _known_formats = ['MP3', 'MP4', 'Mid Quality WMV', 'Mid Quality MP4', 'High Quality WMV', 'High Quality MP4'] + + def _restore_bytes(self, formatted_size): + if not formatted_size: + return 0 + m = re.match(r'^(?P\d+(?:\.\d+)?)\s+(?P[a-zA-Z]+)', formatted_size) + if not m: + return 0 + units = m.group('units') + try: + exponent = [u'B', u'KB', u'MB', u'GB', u'TB', u'PB', u'EB', u'ZB', u'YB'].index(units.upper()) + except ValueError: + return 0 + size = float(m.group('size')) + return int(size * (1024 ** exponent)) + + def _formats_from_html(self, html): + FORMAT_REGEX = r''' + (?x) + [^"]+)">(?P[^<]+)\s* + \((?P[^\)]+)\)\s* + (?:\s* +

File\s+size

\s*(?P.*?)\s* + )? # File size part may be missing + ''' + # Extract known formats + formats = [{'url': x.group('url'), + 'format_id': x.group('quality'), + 'format_note': x.group('note'), + 'format': '%s (%s)' % (x.group('quality'), x.group('note')), + 'filesize': self._restore_bytes(x.group('filesize')), # File size is approximate + } for x in list(re.finditer(FORMAT_REGEX, html)) if x.group('quality') in self._known_formats] + # Sort according to known formats list + formats.sort(key=lambda fmt: self._known_formats.index(fmt['format_id'])) + return formats + + def _extract_title(self, html): + title = self._html_search_meta(u'title', html, u'title') + if title is None: + title = self._og_search_title(html) + TITLE_SUFFIX = u' (Channel 9)' + if title is not None and title.endswith(TITLE_SUFFIX): + title = title[:-len(TITLE_SUFFIX)] + return title + + def _extract_description(self, html): + DESCRIPTION_REGEX = r'''(?sx) + \s* + \s* + (?P.+?)\s* + \s* + + ''' + m = re.search(DESCRIPTION_REGEX, html) + if m is not None: + return m.group('description') + return self._html_search_meta(u'description', html, u'description') + + def _extract_duration(self, html): + m = re.search(r'data-video_duration="(?P\d{2}):(?P\d{2}):(?P\d{2})"', html) + return ((int(m.group('hours')) * 60 * 60) + (int(m.group('minutes')) * 60) + int(m.group('seconds'))) if m else None + + def _extract_slides(self, html): + m = re.search(r'Slides', html) + return m.group('slidesurl') if m is not None else None + + def _extract_zip(self, html): + m = re.search(r'Zip', html) + return m.group('zipurl') if m is not None else None + + def _extract_avg_rating(self, html): + m = re.search(r'

Avg Rating: (?P[^<]+)

', html) + return float(m.group('avgrating')) if m is not None else 0 + + def _extract_rating_count(self, html): + m = re.search(r'
\((?P[^<]+)\)
', html) + return int(self._fix_count(m.group('ratingcount'))) if m is not None else 0 + + def _extract_view_count(self, html): + m = re.search(r'
  • \s*(?P[^<]+) Views\s*
  • ', html) + return int(self._fix_count(m.group('viewcount'))) if m is not None else 0 + + def _extract_comment_count(self, html): + m = re.search(r'
  • \s*\s*(?P[^<]+) Comments\s*\s*
  • ', html) + return int(self._fix_count(m.group('commentcount'))) if m is not None else 0 + + def _fix_count(self, count): + return int(str(count).replace(',', '')) if count is not None else None + + def _extract_authors(self, html): + m = re.search(r'(?s)
  • (.*?)
  • ', html) + if m is None: + return None + return re.findall(r'([^<]+)', m.group(1)) + + def _extract_session_code(self, html): + m = re.search(r'
  • \s*(?P.+?)\s*
  • ', html) + return m.group('code') if m is not None else None + + def _extract_session_day(self, html): + m = re.search(r'
  • \s*(?P[^<]+)\s*
  • ', html) + return m.group('day') if m is not None else None + + def _extract_session_room(self, html): + m = re.search(r'
  • \s*(?P.+?)\s*
  • ', html) + return m.group('room') if m is not None else None + + def _extract_session_speakers(self, html): + return re.findall(r'([^<]+)', html) + + def _extract_content(self, html, content_path): + # Look for downloadable content + formats = self._formats_from_html(html) + slides = self._extract_slides(html) + zip_ = self._extract_zip(html) + + # Nothing to download + if len(formats) == 0 and slides is None and zip_ is None: + self._downloader.report_warning(u'None of recording, slides or zip are available for %s' % content_path) + return + + # Extract meta + title = self._extract_title(html) + description = self._extract_description(html) + thumbnail = self._og_search_thumbnail(html) + duration = self._extract_duration(html) + avg_rating = self._extract_avg_rating(html) + rating_count = self._extract_rating_count(html) + view_count = self._extract_view_count(html) + comment_count = self._extract_comment_count(html) + + common = {'_type': 'video', + 'id': content_path, + 'description': description, + 'thumbnail': thumbnail, + 'duration': duration, + 'avg_rating': avg_rating, + 'rating_count': rating_count, + 'view_count': view_count, + 'comment_count': comment_count, + } + + result = [] + + if slides is not None: + d = common.copy() + d.update({ 'title': title + '-Slides', 'url': slides }) + result.append(d) + + if zip_ is not None: + d = common.copy() + d.update({ 'title': title + '-Zip', 'url': zip_ }) + result.append(d) + + if len(formats) > 0: + d = common.copy() + d.update({ 'title': title, 'formats': formats }) + result.append(d) + + return result + + def _extract_entry_item(self, html, content_path): + contents = self._extract_content(html, content_path) + if contents is None: + return contents + + authors = self._extract_authors(html) + + for content in contents: + content['authors'] = authors + + return contents + + def _extract_session(self, html, content_path): + contents = self._extract_content(html, content_path) + if contents is None: + return contents + + session_meta = {'session_code': self._extract_session_code(html), + 'session_day': self._extract_session_day(html), + 'session_room': self._extract_session_room(html), + 'session_speakers': self._extract_session_speakers(html), + } + + for content in contents: + content.update(session_meta) + + return contents + + def _extract_list(self, content_path): + rss = self._download_xml(self._RSS_URL % content_path, content_path, u'Downloading RSS') + entries = [self.url_result(session_url.text, 'Channel9') + for session_url in rss.findall('./channel/item/link')] + title_text = rss.find('./channel/title').text + return self.playlist_result(entries, content_path, title_text) + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + content_path = mobj.group('contentpath') + + webpage = self._download_webpage(url, content_path, u'Downloading web page') + + page_type_m = re.search(r'', webpage) + if page_type_m is None: + raise ExtractorError(u'Search.PageType not found, don\'t know how to process this page', expected=True) + + page_type = page_type_m.group('pagetype') + if page_type == 'List': # List page, may contain list of 'item'-like objects + return self._extract_list(content_path) + elif page_type == 'Entry.Item': # Any 'item'-like page, may contain downloadable content + return self._extract_entry_item(webpage, content_path) + elif page_type == 'Session': # Event session page, may contain downloadable content + return self._extract_session(webpage, content_path) + else: + raise ExtractorError(u'Unexpected Search.PageType %s' % page_type, expected=True) \ No newline at end of file diff --git a/youtube_dl/extractor/clipsyndicate.py b/youtube_dl/extractor/clipsyndicate.py index d4fc869..c60089a 100644 --- a/youtube_dl/extractor/clipsyndicate.py +++ b/youtube_dl/extractor/clipsyndicate.py @@ -1,9 +1,9 @@ import re -import xml.etree.ElementTree from .common import InfoExtractor from ..utils import ( find_xpath_attr, + fix_xml_all_ampersand, ) @@ -30,12 +30,10 @@ class ClipsyndicateIE(InfoExtractor): # it includes a required token flvars = self._search_regex(r'flvars: "(.*?)"', js_player, u'flvars') - playlist_page = self._download_webpage( + pdoc = self._download_xml( 'http://eplayer.clipsyndicate.com/osmf/playlist?%s' % flvars, - video_id, u'Downloading video info') - # Fix broken xml - playlist_page = re.sub('&', '&', playlist_page) - pdoc = xml.etree.ElementTree.fromstring(playlist_page.encode('utf-8')) + video_id, u'Downloading video info', + transform_source=fix_xml_all_ampersand) track_doc = pdoc.find('trackList/track') def find_param(name): diff --git a/youtube_dl/extractor/comedycentral.py b/youtube_dl/extractor/comedycentral.py index 53579aa..a54ce3e 100644 --- a/youtube_dl/extractor/comedycentral.py +++ b/youtube_dl/extractor/comedycentral.py @@ -12,7 +12,7 @@ from ..utils import ( class ComedyCentralIE(MTVServicesInfoExtractor): - _VALID_URL = r'http://www.comedycentral.com/(video-clips|episodes|cc-studios)/(?P.*)' + _VALID_URL = r'https?://(?:www.)?comedycentral.com/(video-clips|episodes|cc-studios)/(?P<title>.*)' _FEED_URL = u'http://comedycentral.com/feeds/mrss/' _TEST = { diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 1b04908..ba46a7b 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -18,6 +18,7 @@ from ..utils import ( sanitize_filename, unescapeHTML, ) +_NO_DEFAULT = object() class InfoExtractor(object): @@ -34,15 +35,39 @@ class InfoExtractor(object): The dictionaries must include the following fields: id: Video identifier. - url: Final video URL. title: Video title, unescaped. - ext: Video filename extension. - Instead of url and ext, formats can also specified. + Additionally, it must contain either a formats entry or url and ext: + + formats: A list of dictionaries for each format available, it must + be ordered from worst to best quality. Potential fields: + * url Mandatory. The URL of the video file + * ext Will be calculated from url if missing + * format A human-readable description of the format + ("mp4 container with h264/opus"). + Calculated from the format_id, width, height. + and format_note fields if missing. + * format_id A short description of the format + ("mp4_h264_opus" or "19") + * format_note Additional info about the format + ("3D" or "DASH video") + * width Width of the video, if known + * height Height of the video, if known + * abr Average audio bitrate in KBit/s + * acodec Name of the audio codec in use + * vbr Average video bitrate in KBit/s + * vcodec Name of the video codec in use + * filesize The number of bytes, if known in advance + * player_url SWF Player URL (used for rtmpdump). + url: Final video URL. + ext: Video filename extension. + format: The video format, defaults to ext (used for --get-format) + player_url: SWF Player URL (used for rtmpdump). + urlhandle: [internal] The urlHandle to be used to download the file, + like returned by urllib.request.urlopen The following fields are optional: - format: The video format, defaults to ext (used for --get-format) thumbnails: A list of dictionaries (with the entries "resolution" and "url") for the varying thumbnails thumbnail: Full URL to a video thumbnail image. @@ -51,32 +76,14 @@ class InfoExtractor(object): upload_date: Video upload date (YYYYMMDD). uploader_id: Nickname or id of the video uploader. location: Physical location of the video. - player_url: SWF Player URL (used for rtmpdump). subtitles: The subtitle file contents as a dictionary in the format {language: subtitles}. + duration: Length of the video in seconds, as an integer. view_count: How many users have watched the video on the platform. - urlhandle: [internal] The urlHandle to be used to download the file, - like returned by urllib.request.urlopen + like_count: Number of positive ratings of the video + dislike_count: Number of negative ratings of the video + comment_count: Number of comments on the video age_limit: Age restriction for the video, as an integer (years) - formats: A list of dictionaries for each format available, it must - be ordered from worst to best quality. Potential fields: - * url Mandatory. The URL of the video file - * ext Will be calculated from url if missing - * format A human-readable description of the format - ("mp4 container with h264/opus"). - Calculated from the format_id, width, height. - and format_note fields if missing. - * format_id A short description of the format - ("mp4_h264_opus" or "19") - * format_note Additional info about the format - ("3D" or "DASH video") - * width Width of the video, if known - * height Height of the video, if known - * abr Average audio bitrate in KBit/s - * acodec Name of the audio codec in use - * vbr Average video bitrate in KBit/s - * vcodec Name of the video codec in use - * filesize The number of bytes, if known in advance webpage_url: The url to the video webpage, if given to youtube-dl it should allow to get the same result again. (It will be set by YoutubeDL if it's missing) @@ -151,27 +158,40 @@ class InfoExtractor(object): def IE_NAME(self): return type(self).__name__[:-2] - def _request_webpage(self, url_or_request, video_id, note=None, errnote=None): + def _request_webpage(self, url_or_request, video_id, note=None, errnote=None, fatal=True): """ Returns the response handle """ if note is None: self.report_download_webpage(video_id) elif note is not False: - self.to_screen(u'%s: %s' % (video_id, note)) + if video_id is None: + self.to_screen(u'%s' % (note,)) + else: + self.to_screen(u'%s: %s' % (video_id, note)) try: return self._downloader.urlopen(url_or_request) except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: + if errnote is False: + return False if errnote is None: errnote = u'Unable to download webpage' - raise ExtractorError(u'%s: %s' % (errnote, compat_str(err)), sys.exc_info()[2], cause=err) + errmsg = u'%s: %s' % (errnote, compat_str(err)) + if fatal: + raise ExtractorError(errmsg, sys.exc_info()[2], cause=err) + else: + self._downloader.report_warning(errmsg) + return False - def _download_webpage_handle(self, url_or_request, video_id, note=None, errnote=None): + def _download_webpage_handle(self, url_or_request, video_id, note=None, errnote=None, fatal=True): """ Returns a tuple (page content as string, URL handle) """ # Strip hashes from the URL (#1038) if isinstance(url_or_request, (compat_str, str)): url_or_request = url_or_request.partition('#')[0] - urlh = self._request_webpage(url_or_request, video_id, note, errnote) + urlh = self._request_webpage(url_or_request, video_id, note, errnote, fatal) + if urlh is False: + assert not fatal + return False content_type = urlh.headers.get('Content-Type', '') webpage_bytes = urlh.read() m = re.match(r'[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+\s*;\s*charset=(.+)', content_type) @@ -206,14 +226,22 @@ class InfoExtractor(object): content = webpage_bytes.decode(encoding, 'replace') return (content, urlh) - def _download_webpage(self, url_or_request, video_id, note=None, errnote=None): + def _download_webpage(self, url_or_request, video_id, note=None, errnote=None, fatal=True): """ Returns the data of the page as a string """ - return self._download_webpage_handle(url_or_request, video_id, note, errnote)[0] + res = self._download_webpage_handle(url_or_request, video_id, note, errnote, fatal) + if res is False: + return res + else: + content, _ = res + return content def _download_xml(self, url_or_request, video_id, - note=u'Downloading XML', errnote=u'Unable to download XML'): + note=u'Downloading XML', errnote=u'Unable to download XML', + transform_source=None): """Return the xml as an xml.etree.ElementTree.Element""" xml_string = self._download_webpage(url_or_request, video_id, note, errnote) + if transform_source: + xml_string = transform_source(xml_string) return xml.etree.ElementTree.fromstring(xml_string.encode('utf-8')) def to_screen(self, msg): @@ -237,7 +265,8 @@ class InfoExtractor(object): self.to_screen(u'Logging in') #Methods for following #608 - def url_result(self, url, ie=None, video_id=None): + @staticmethod + def url_result(url, ie=None, video_id=None): """Returns a url that points to a page that should be processed""" #TODO: ie should be the class used for getting the info video_info = {'_type': 'url', @@ -246,7 +275,8 @@ class InfoExtractor(object): if video_id is not None: video_info['id'] = video_id return video_info - def playlist_result(self, entries, playlist_id=None, playlist_title=None): + @staticmethod + def playlist_result(entries, playlist_id=None, playlist_title=None): """Returns a playlist""" video_info = {'_type': 'playlist', 'entries': entries} @@ -256,7 +286,7 @@ class InfoExtractor(object): video_info['title'] = playlist_title return video_info - def _search_regex(self, pattern, string, name, default=None, fatal=True, flags=0): + def _search_regex(self, pattern, string, name, default=_NO_DEFAULT, fatal=True, flags=0): """ Perform a regex search on the given string, using a single or a list of patterns returning the first matching group. @@ -270,7 +300,7 @@ class InfoExtractor(object): mobj = re.search(p, string, flags) if mobj: break - if sys.stderr.isatty() and os.name != 'nt': + if os.name != 'nt' and sys.stderr.isatty(): _name = u'\033[0;34m%s\033[0m' % name else: _name = name @@ -278,7 +308,7 @@ class InfoExtractor(object): if mobj: # return the first matching group return next(g for g in mobj.groups() if g is not None) - elif default is not None: + elif default is not _NO_DEFAULT: return default elif fatal: raise RegexNotFoundError(u'Unable to extract %s' % _name) @@ -287,7 +317,7 @@ class InfoExtractor(object): u'please report this issue on http://yt-dl.org/bug' % _name) return None - def _html_search_regex(self, pattern, string, name, default=None, fatal=True, flags=0): + def _html_search_regex(self, pattern, string, name, default=_NO_DEFAULT, fatal=True, flags=0): """ Like _search_regex, but strips HTML tags and unescapes entities. """ diff --git a/youtube_dl/extractor/crunchyroll.py b/youtube_dl/extractor/crunchyroll.py new file mode 100644 index 0000000..2b66bdd --- /dev/null +++ b/youtube_dl/extractor/crunchyroll.py @@ -0,0 +1,171 @@ +# encoding: utf-8 +import re, base64, zlib +from hashlib import sha1 +from math import pow, sqrt, floor +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + compat_urllib_parse, + compat_urllib_request, + bytes_to_intlist, + intlist_to_bytes, + unified_strdate, + clean_html, +) +from ..aes import ( + aes_cbc_decrypt, + inc, +) + +class CrunchyrollIE(InfoExtractor): + _VALID_URL = r'(?:https?://)?(?:www\.)?(?P<url>crunchyroll\.com/[^/]*/[^/?&]*?(?P<video_id>[0-9]+))(?:[/?&]|$)' + _TESTS = [{ + u'url': u'http://www.crunchyroll.com/wanna-be-the-strongest-in-the-world/episode-1-an-idol-wrestler-is-born-645513', + u'file': u'645513.flv', + #u'md5': u'b1639fd6ddfaa43788c85f6d1dddd412', + u'info_dict': { + u'title': u'Wanna be the Strongest in the World Episode 1 – An Idol-Wrestler is Born!', + u'description': u'md5:2d17137920c64f2f49981a7797d275ef', + u'thumbnail': u'http://img1.ak.crunchyroll.com/i/spire1-tmb/20c6b5e10f1a47b10516877d3c039cae1380951166_full.jpg', + u'uploader': u'Yomiuri Telecasting Corporation (YTV)', + u'upload_date': u'20131013', + }, + u'params': { + # rtmp + u'skip_download': True, + }, + }] + + _FORMAT_IDS = { + u'360': (u'60', u'106'), + u'480': (u'61', u'106'), + u'720': (u'62', u'106'), + u'1080': (u'80', u'108'), + } + + def _decrypt_subtitles(self, data, iv, id): + data = bytes_to_intlist(data) + iv = bytes_to_intlist(iv) + id = int(id) + + def obfuscate_key_aux(count, modulo, start): + output = list(start) + for _ in range(count): + output.append(output[-1] + output[-2]) + # cut off start values + output = output[2:] + output = list(map(lambda x: x % modulo + 33, output)) + return output + + def obfuscate_key(key): + num1 = int(floor(pow(2, 25) * sqrt(6.9))) + num2 = (num1 ^ key) << 5 + num3 = key ^ num1 + num4 = num3 ^ (num3 >> 3) ^ num2 + prefix = intlist_to_bytes(obfuscate_key_aux(20, 97, (1, 2))) + shaHash = bytes_to_intlist(sha1(prefix + str(num4).encode(u'ascii')).digest()) + # Extend 160 Bit hash to 256 Bit + return shaHash + [0] * 12 + + key = obfuscate_key(id) + class Counter: + __value = iv + def next_value(self): + temp = self.__value + self.__value = inc(self.__value) + return temp + decrypted_data = intlist_to_bytes(aes_cbc_decrypt(data, key, iv)) + return zlib.decompress(decrypted_data) + + def _convert_subtitles_to_srt(self, subtitles): + i=1 + output = u'' + for start, end, text in re.findall(r'<event [^>]*?start="([^"]+)" [^>]*?end="([^"]+)" [^>]*?text="([^"]+)"[^>]*?>', subtitles): + start = start.replace(u'.', u',') + end = end.replace(u'.', u',') + text = clean_html(text) + text = text.replace(u'\\N', u'\n') + if not text: + continue + output += u'%d\n%s --> %s\n%s\n\n' % (i, start, end, text) + i+=1 + return output + + def _real_extract(self,url): + mobj = re.match(self._VALID_URL, url) + + webpage_url = u'http://www.' + mobj.group('url') + video_id = mobj.group(u'video_id') + webpage = self._download_webpage(webpage_url, video_id) + note_m = self._html_search_regex(r'<div class="showmedia-trailer-notice">(.+?)</div>', webpage, u'trailer-notice', default=u'') + if note_m: + raise ExtractorError(note_m) + + video_title = self._html_search_regex(r'<h1[^>]*>(.+?)</h1>', webpage, u'video_title', flags=re.DOTALL) + video_title = re.sub(r' {2,}', u' ', video_title) + video_description = self._html_search_regex(r'"description":"([^"]+)', webpage, u'video_description', default=u'') + if not video_description: + video_description = None + video_upload_date = self._html_search_regex(r'<div>Availability for free users:(.+?)</div>', webpage, u'video_upload_date', fatal=False, flags=re.DOTALL) + if video_upload_date: + video_upload_date = unified_strdate(video_upload_date) + video_uploader = self._html_search_regex(r'<div>\s*Publisher:(.+?)</div>', webpage, u'video_uploader', fatal=False, flags=re.DOTALL) + + playerdata_url = compat_urllib_parse.unquote(self._html_search_regex(r'"config_url":"([^"]+)', webpage, u'playerdata_url')) + playerdata_req = compat_urllib_request.Request(playerdata_url) + playerdata_req.data = compat_urllib_parse.urlencode({u'current_page': webpage_url}) + playerdata_req.add_header(u'Content-Type', u'application/x-www-form-urlencoded') + playerdata = self._download_webpage(playerdata_req, video_id, note=u'Downloading media info') + + stream_id = self._search_regex(r'<media_id>([^<]+)', playerdata, u'stream_id') + video_thumbnail = self._search_regex(r'<episode_image_url>([^<]+)', playerdata, u'thumbnail', fatal=False) + + formats = [] + for fmt in re.findall(r'\?p([0-9]{3,4})=1', webpage): + stream_quality, stream_format = self._FORMAT_IDS[fmt] + video_format = fmt+u'p' + streamdata_req = compat_urllib_request.Request(u'http://www.crunchyroll.com/xml/') + # urlencode doesn't work! + streamdata_req.data = u'req=RpcApiVideoEncode%5FGetStreamInfo&video%5Fencode%5Fquality='+stream_quality+u'&media%5Fid='+stream_id+u'&video%5Fformat='+stream_format + streamdata_req.add_header(u'Content-Type', u'application/x-www-form-urlencoded') + streamdata_req.add_header(u'Content-Length', str(len(streamdata_req.data))) + streamdata = self._download_webpage(streamdata_req, video_id, note=u'Downloading media info for '+video_format) + video_url = self._search_regex(r'<host>([^<]+)', streamdata, u'video_url') + video_play_path = self._search_regex(r'<file>([^<]+)', streamdata, u'video_play_path') + formats.append({ + u'url': video_url, + u'play_path': video_play_path, + u'ext': 'flv', + u'format': video_format, + u'format_id': video_format, + }) + + subtitles = {} + for sub_id, sub_name in re.findall(r'\?ssid=([0-9]+)" title="([^"]+)', webpage): + sub_page = self._download_webpage(u'http://www.crunchyroll.com/xml/?req=RpcApiSubtitle_GetXml&subtitle_script_id='+sub_id,\ + video_id, note=u'Downloading subtitles for '+sub_name) + id = self._search_regex(r'id=\'([0-9]+)', sub_page, u'subtitle_id', fatal=False) + iv = self._search_regex(r'<iv>([^<]+)', sub_page, u'subtitle_iv', fatal=False) + data = self._search_regex(r'<data>([^<]+)', sub_page, u'subtitle_data', fatal=False) + if not id or not iv or not data: + continue + id = int(id) + iv = base64.b64decode(iv) + data = base64.b64decode(data) + + subtitle = self._decrypt_subtitles(data, iv, id).decode(u'utf-8') + lang_code = self._search_regex(r'lang_code=\'([^\']+)', subtitle, u'subtitle_lang_code', fatal=False) + if not lang_code: + continue + subtitles[lang_code] = self._convert_subtitles_to_srt(subtitle) + + return { + u'id': video_id, + u'title': video_title, + u'description': video_description, + u'thumbnail': video_thumbnail, + u'uploader': video_uploader, + u'upload_date': video_upload_date, + u'subtitles': subtitles, + u'formats': formats, + } diff --git a/youtube_dl/extractor/cspan.py b/youtube_dl/extractor/cspan.py index 7bf03c5..d573068 100644 --- a/youtube_dl/extractor/cspan.py +++ b/youtube_dl/extractor/cspan.py @@ -6,7 +6,7 @@ from ..utils import ( ) class CSpanIE(InfoExtractor): - _VALID_URL = r'http://www.c-spanvideo.org/program/(.*)' + _VALID_URL = r'http://www\.c-spanvideo\.org/program/(.*)' _TEST = { u'url': u'http://www.c-spanvideo.org/program/HolderonV', u'file': u'315139.flv', diff --git a/youtube_dl/extractor/dailymotion.py b/youtube_dl/extractor/dailymotion.py index 71f5e03..6685c94 100644 --- a/youtube_dl/extractor/dailymotion.py +++ b/youtube_dl/extractor/dailymotion.py @@ -11,6 +11,7 @@ from ..utils import ( get_element_by_attribute, get_element_by_id, orderedSet, + str_to_int, ExtractorError, ) @@ -27,7 +28,7 @@ class DailymotionBaseInfoExtractor(InfoExtractor): class DailymotionIE(DailymotionBaseInfoExtractor, SubtitlesInfoExtractor): """Information Extractor for Dailymotion""" - _VALID_URL = r'(?i)(?:https?://)?(?:www\.)?dailymotion\.[a-z]{2,3}/(?:embed/)?video/([^/]+)' + _VALID_URL = r'(?i)(?:https?://)?(?:(www|touch)\.)?dailymotion\.[a-z]{2,3}/(?:(embed|#)/)?video/(?P<id>[^/?_]+)' IE_NAME = u'dailymotion' _FORMATS = [ @@ -80,7 +81,7 @@ class DailymotionIE(DailymotionBaseInfoExtractor, SubtitlesInfoExtractor): # Extract id and simplified title from URL mobj = re.match(self._VALID_URL, url) - video_id = mobj.group(1).split('_')[0].split('?')[0] + video_id = mobj.group('id') url = 'http://www.dailymotion.com/video/%s' % video_id @@ -100,10 +101,6 @@ class DailymotionIE(DailymotionBaseInfoExtractor, SubtitlesInfoExtractor): self.to_screen(u'Vevo video detected: %s' % vevo_id) return self.url_result(u'vevo:%s' % vevo_id, ie='Vevo') - video_uploader = self._search_regex([r'(?im)<span class="owner[^\"]+?">[^<]+?<a [^>]+?>([^<]+?)</a>', - # Looking for official user - r'<(?:span|a) .*?rel="author".*?>([^<]+?)</'], - webpage, 'video uploader', fatal=False) age_limit = self._rta_search(webpage) video_upload_date = None @@ -146,15 +143,21 @@ class DailymotionIE(DailymotionBaseInfoExtractor, SubtitlesInfoExtractor): self._list_available_subtitles(video_id, webpage) return + view_count = self._search_regex( + r'video_views_count[^>]+>\s+([\d\.,]+)', webpage, u'view count', fatal=False) + if view_count is not None: + view_count = str_to_int(view_count) + return { 'id': video_id, 'formats': formats, - 'uploader': video_uploader, + 'uploader': info['owner_screenname'], 'upload_date': video_upload_date, 'title': self._og_search_title(webpage), 'subtitles': video_subtitles, 'thumbnail': info['thumbnail_url'], 'age_limit': age_limit, + 'view_count': view_count, } def _get_available_subtitles(self, video_id, webpage): diff --git a/youtube_dl/extractor/daum.py b/youtube_dl/extractor/daum.py index d418ce4..4876ecb 100644 --- a/youtube_dl/extractor/daum.py +++ b/youtube_dl/extractor/daum.py @@ -9,7 +9,7 @@ from ..utils import ( class DaumIE(InfoExtractor): - _VALID_URL = r'https?://tvpot\.daum\.net/.*?clipid=(?P<id>\d+)' + _VALID_URL = r'https?://(?:m\.)?tvpot\.daum\.net/.*?clipid=(?P<id>\d+)' IE_NAME = u'daum.net' _TEST = { diff --git a/youtube_dl/extractor/dreisat.py b/youtube_dl/extractor/dreisat.py index 24ce794..cb7226f 100644 --- a/youtube_dl/extractor/dreisat.py +++ b/youtube_dl/extractor/dreisat.py @@ -11,7 +11,7 @@ from ..utils import ( class DreiSatIE(InfoExtractor): IE_NAME = '3sat' - _VALID_URL = r'(?:http://)?(?:www\.)?3sat.de/mediathek/index.php\?(?:(?:mode|display)=[^&]+&)*obj=(?P<id>[0-9]+)$' + _VALID_URL = r'(?:http://)?(?:www\.)?3sat\.de/mediathek/index\.php\?(?:(?:mode|display)=[^&]+&)*obj=(?P<id>[0-9]+)$' _TEST = { u"url": u"http://www.3sat.de/mediathek/index.php?obj=36983", u'file': u'36983.webm', diff --git a/youtube_dl/extractor/eighttracks.py b/youtube_dl/extractor/eighttracks.py index f21ef88..88f5526 100644 --- a/youtube_dl/extractor/eighttracks.py +++ b/youtube_dl/extractor/eighttracks.py @@ -10,7 +10,7 @@ from ..utils import ( class EightTracksIE(InfoExtractor): IE_NAME = '8tracks' - _VALID_URL = r'https?://8tracks.com/(?P<user>[^/]+)/(?P<id>[^/#]+)(?:#.*)?$' + _VALID_URL = r'https?://8tracks\.com/(?P<user>[^/]+)/(?P<id>[^/#]+)(?:#.*)?$' _TEST = { u"name": u"EightTracks", u"url": u"http://8tracks.com/ytdl/youtube-dl-test-tracks-a", diff --git a/youtube_dl/extractor/exfm.py b/youtube_dl/extractor/exfm.py index a51d79b..682901d 100644 --- a/youtube_dl/extractor/exfm.py +++ b/youtube_dl/extractor/exfm.py @@ -8,7 +8,7 @@ class ExfmIE(InfoExtractor): IE_NAME = u'exfm' IE_DESC = u'ex.fm' _VALID_URL = r'(?:http://)?(?:www\.)?ex\.fm/song/([^/]+)' - _SOUNDCLOUD_URL = r'(?:http://)?(?:www\.)?api\.soundcloud.com/tracks/([^/]+)/stream' + _SOUNDCLOUD_URL = r'(?:http://)?(?:www\.)?api\.soundcloud\.com/tracks/([^/]+)/stream' _TESTS = [ { u'url': u'http://ex.fm/song/eh359', diff --git a/youtube_dl/extractor/facebook.py b/youtube_dl/extractor/facebook.py index 3b21071..4556079 100644 --- a/youtube_dl/extractor/facebook.py +++ b/youtube_dl/extractor/facebook.py @@ -17,7 +17,7 @@ from ..utils import ( class FacebookIE(InfoExtractor): """Information Extractor for Facebook""" - _VALID_URL = r'^(?:https?://)?(?:\w+\.)?facebook\.com/(?:video/video|photo)\.php\?(?:.*?)v=(?P<ID>\d+)(?:.*)' + _VALID_URL = r'^(?:https?://)?(?:\w+\.)?facebook\.com/(?:[^#?]*#!/)?(?:video/video|photo)\.php\?(?:.*?)v=(?P<ID>\d+)(?:.*)' _LOGIN_URL = 'https://www.facebook.com/login.php?next=http%3A%2F%2Ffacebook.com%2Fhome.php&login_attempt=1' _CHECKPOINT_URL = 'https://www.facebook.com/checkpoint/?next=http%3A%2F%2Ffacebook.com%2Fhome.php&_fb_noscript=1' _NETRC_MACHINE = 'facebook' @@ -27,7 +27,7 @@ class FacebookIE(InfoExtractor): u'file': u'120708114770723.mp4', u'md5': u'48975a41ccc4b7a581abd68651c1a5a8', u'info_dict': { - u"duration": 279, + u"duration": 279, u"title": u"PEOPLE ARE AWESOME 2013" } } diff --git a/youtube_dl/extractor/faz.py b/youtube_dl/extractor/faz.py index d0dfde6..c6ab695 100644 --- a/youtube_dl/extractor/faz.py +++ b/youtube_dl/extractor/faz.py @@ -9,7 +9,7 @@ from ..utils import ( class FazIE(InfoExtractor): IE_NAME = u'faz.net' - _VALID_URL = r'https?://www\.faz\.net/multimedia/videos/.*?-(?P<id>\d+).html' + _VALID_URL = r'https?://www\.faz\.net/multimedia/videos/.*?-(?P<id>\d+)\.html' _TEST = { u'url': u'http://www.faz.net/multimedia/videos/stockholm-chemie-nobelpreis-fuer-drei-amerikanische-forscher-12610585.html', diff --git a/youtube_dl/extractor/fktv.py b/youtube_dl/extractor/fktv.py index dba1a8d..d7048c8 100644 --- a/youtube_dl/extractor/fktv.py +++ b/youtube_dl/extractor/fktv.py @@ -12,7 +12,7 @@ from ..utils import ( class FKTVIE(InfoExtractor): IE_NAME = u'fernsehkritik.tv' - _VALID_URL = r'(?:http://)?(?:www\.)?fernsehkritik.tv/folge-(?P<ep>[0-9]+)(?:/.*)?' + _VALID_URL = r'(?:http://)?(?:www\.)?fernsehkritik\.tv/folge-(?P<ep>[0-9]+)(?:/.*)?' _TEST = { u'url': u'http://fernsehkritik.tv/folge-1', @@ -52,7 +52,7 @@ class FKTVIE(InfoExtractor): class FKTVPosteckeIE(InfoExtractor): IE_NAME = u'fernsehkritik.tv:postecke' - _VALID_URL = r'(?:http://)?(?:www\.)?fernsehkritik.tv/inline-video/postecke.php\?(.*&)?ep=(?P<ep>[0-9]+)(&|$)' + _VALID_URL = r'(?:http://)?(?:www\.)?fernsehkritik\.tv/inline-video/postecke\.php\?(.*&)?ep=(?P<ep>[0-9]+)(&|$)' _TEST = { u'url': u'http://fernsehkritik.tv/inline-video/postecke.php?iframe=true&width=625&height=440&ep=120', u'file': u'0120.flv', diff --git a/youtube_dl/extractor/francetv.py b/youtube_dl/extractor/francetv.py index 6e19710..ad85bc1 100644 --- a/youtube_dl/extractor/francetv.py +++ b/youtube_dl/extractor/francetv.py @@ -21,7 +21,7 @@ class FranceTVBaseInfoExtractor(InfoExtractor): thumbnail_path = info.find('image').text return {'id': video_id, - 'ext': 'mp4', + 'ext': 'flv' if video_url.startswith('rtmp') else 'mp4', 'url': video_url, 'title': info.find('titre').text, 'thumbnail': compat_urlparse.urljoin('http://pluzz.francetv.fr', thumbnail_path), @@ -45,7 +45,7 @@ class PluzzIE(FranceTVBaseInfoExtractor): class FranceTvInfoIE(FranceTVBaseInfoExtractor): IE_NAME = u'francetvinfo.fr' - _VALID_URL = r'https?://www\.francetvinfo\.fr/replay.*/(?P<title>.+).html' + _VALID_URL = r'https?://www\.francetvinfo\.fr/replay.*/(?P<title>.+)\.html' _TEST = { u'url': u'http://www.francetvinfo.fr/replay-jt/france-3/soir-3/jt-grand-soir-3-lundi-26-aout-2013_393427.html', @@ -66,35 +66,101 @@ class FranceTvInfoIE(FranceTVBaseInfoExtractor): return self._extract_video(video_id) -class France2IE(FranceTVBaseInfoExtractor): - IE_NAME = u'france2.fr' - _VALID_URL = r'''(?x)https?://www\.france2\.fr/ +class FranceTVIE(FranceTVBaseInfoExtractor): + IE_NAME = u'francetv' + IE_DESC = u'France 2, 3, 4, 5 and Ô' + _VALID_URL = r'''(?x)https?://www\.france[2345o]\.fr/ (?: - emissions/.*?/videos/(?P<id>\d+) - | emission/(?P<key>[^/?]+) + emissions/.*?/(videos|emissions)/(?P<id>[^/?]+) + | (emissions?|jt)/(?P<key>[^/?]+) )''' - _TEST = { - u'url': u'http://www.france2.fr/emissions/13h15-le-samedi-le-dimanche/videos/75540104', - u'file': u'75540104.mp4', - u'info_dict': { - u'title': u'13h15, le samedi...', - u'description': u'md5:2e5b58ba7a2d3692b35c792be081a03d', + _TESTS = [ + # france2 + { + u'url': u'http://www.france2.fr/emissions/13h15-le-samedi-le-dimanche/videos/75540104', + u'file': u'75540104.mp4', + u'info_dict': { + u'title': u'13h15, le samedi...', + u'description': u'md5:2e5b58ba7a2d3692b35c792be081a03d', + }, + u'params': { + # m3u8 download + u'skip_download': True, + }, }, - u'params': { - u'skip_download': True, + # france3 + { + u'url': u'http://www.france3.fr/emissions/pieces-a-conviction/diffusions/13-11-2013_145575', + u'info_dict': { + u'id': u'000702326_CAPP_PicesconvictionExtrait313022013_120220131722_Au', + u'ext': u'flv', + u'title': u'Le scandale du prix des médicaments', + u'description': u'md5:1384089fbee2f04fc6c9de025ee2e9ce', + }, + u'params': { + # rtmp download + u'skip_download': True, + }, }, - } + # france4 + { + u'url': u'http://www.france4.fr/emissions/hero-corp/videos/rhozet_herocorp_bonus_1_20131106_1923_06112013172108_F4', + u'info_dict': { + u'id': u'rhozet_herocorp_bonus_1_20131106_1923_06112013172108_F4', + u'ext': u'flv', + u'title': u'Hero Corp Making of - Extrait 1', + u'description': u'md5:c87d54871b1790679aec1197e73d650a', + }, + u'params': { + # rtmp download + u'skip_download': True, + }, + }, + # france5 + { + u'url': u'http://www.france5.fr/emissions/c-a-dire/videos/92837968', + u'info_dict': { + u'id': u'92837968', + u'ext': u'mp4', + u'title': u'C à dire ?!', + u'description': u'md5:fb1db1cbad784dcce7c7a7bd177c8e2f', + }, + u'params': { + # m3u8 download + u'skip_download': True, + }, + }, + # franceo + { + u'url': u'http://www.franceo.fr/jt/info-afrique/04-12-2013', + u'info_dict': { + u'id': u'92327925', + u'ext': u'mp4', + u'title': u'Infô-Afrique', + u'description': u'md5:ebf346da789428841bee0fd2a935ea55', + }, + u'params': { + # m3u8 download + u'skip_download': True, + }, + u'skip': u'The id changes frequently', + }, + ] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) if mobj.group('key'): webpage = self._download_webpage(url, mobj.group('key')) - video_id = self._html_search_regex( - r'''(?x)<div\s+class="video-player">\s* + id_res = [ + (r'''(?x)<div\s+class="video-player">\s* <a\s+href="http://videos.francetv.fr/video/([0-9]+)"\s+ - class="francetv-video-player">''', - webpage, u'video ID') + class="francetv-video-player">'''), + (r'<a id="player_direct" href="http://info\.francetelevisions' + '\.fr/\?id-video=([^"/&]+)'), + (r'<a class="video" id="ftv_player_(.+?)"'), + ] + video_id = self._html_search_regex(id_res, webpage, u'video ID') else: video_id = mobj.group('id') return self._extract_video(video_id) diff --git a/youtube_dl/extractor/gamekings.py b/youtube_dl/extractor/gamekings.py index c91669b..a3a5251 100644 --- a/youtube_dl/extractor/gamekings.py +++ b/youtube_dl/extractor/gamekings.py @@ -4,7 +4,7 @@ from .common import InfoExtractor class GamekingsIE(InfoExtractor): - _VALID_URL = r'http?://www\.gamekings\.tv/videos/(?P<name>[0-9a-z\-]+)' + _VALID_URL = r'http://www\.gamekings\.tv/videos/(?P<name>[0-9a-z\-]+)' _TEST = { u"url": u"http://www.gamekings.tv/videos/phoenix-wright-ace-attorney-dual-destinies-review/", u'file': u'20130811.mp4', diff --git a/youtube_dl/extractor/gametrailers.py b/youtube_dl/extractor/gametrailers.py index 3a8bef2..d82a5d4 100644 --- a/youtube_dl/extractor/gametrailers.py +++ b/youtube_dl/extractor/gametrailers.py @@ -4,8 +4,7 @@ from .mtv import MTVServicesInfoExtractor class GametrailersIE(MTVServicesInfoExtractor): - _VALID_URL = r'http://www.gametrailers.com/(?P<type>videos|reviews|full-episodes)/(?P<id>.*?)/(?P<title>.*)' - + _VALID_URL = r'http://www\.gametrailers\.com/(?P<type>videos|reviews|full-episodes)/(?P<id>.*?)/(?P<title>.*)' _TEST = { u'url': u'http://www.gametrailers.com/videos/zbvr8i/mirror-s-edge-2-e3-2013--debut-trailer', u'file': u'70e9a5d7-cf25-4a10-9104-6f3e7342ae0d.mp4', diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index 10ae062..7a14c98 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -11,10 +11,14 @@ from ..utils import ( compat_urlparse, ExtractorError, + HEADRequest, smuggle_url, unescapeHTML, + unified_strdate, + url_basename, ) from .brightcove import BrightcoveIE +from .ooyala import OoyalaIE class GenericIE(InfoExtractor): @@ -71,6 +75,27 @@ class GenericIE(InfoExtractor): u'skip_download': True, }, }, + # Direct link to a video + { + u'url': u'http://media.w3.org/2010/05/sintel/trailer.mp4', + u'file': u'trailer.mp4', + u'md5': u'67d406c2bcb6af27fa886f31aa934bbe', + u'info_dict': { + u'id': u'trailer', + u'title': u'trailer', + u'upload_date': u'20100513', + } + }, + # ooyala video + { + u'url': u'http://www.rollingstone.com/music/videos/norwegian-dj-cashmere-cat-goes-spartan-on-with-me-premiere-20131219', + u'md5': u'5644c6ca5d5782c1d0d350dad9bd840c', + u'info_dict': { + u'id': u'BwY2RxaTrTkslxOfcan0UCf0YqyvWysJ', + u'ext': u'mp4', + u'title': u'2cc213299525360.mov', #that's what we get + }, + }, ] def report_download_webpage(self, video_id): @@ -83,23 +108,20 @@ class GenericIE(InfoExtractor): """Report information extraction.""" self._downloader.to_screen(u'[redirect] Following redirect to %s' % new_url) - def _test_redirect(self, url): + def _send_head(self, url): """Check if it is a redirect, like url shorteners, in case return the new url.""" - class HeadRequest(compat_urllib_request.Request): - def get_method(self): - return "HEAD" class HEADRedirectHandler(compat_urllib_request.HTTPRedirectHandler): """ Subclass the HTTPRedirectHandler to make it use our - HeadRequest also on the redirected URL + HEADRequest also on the redirected URL """ def redirect_request(self, req, fp, code, msg, headers, newurl): if code in (301, 302, 303, 307): newurl = newurl.replace(' ', '%20') newheaders = dict((k,v) for k,v in req.headers.items() if k.lower() not in ("content-length", "content-type")) - return HeadRequest(newurl, + return HEADRequest(newurl, headers=newheaders, origin_req_host=req.get_origin_req_host(), unverifiable=True) @@ -128,32 +150,49 @@ class GenericIE(InfoExtractor): compat_urllib_request.HTTPErrorProcessor, compat_urllib_request.HTTPSHandler]: opener.add_handler(handler()) - response = opener.open(HeadRequest(url)) + response = opener.open(HEADRequest(url)) if response is None: raise ExtractorError(u'Invalid URL protocol') - new_url = response.geturl() - - if url == new_url: - return False - - self.report_following_redirect(new_url) - return new_url + return response def _real_extract(self, url): parsed_url = compat_urlparse.urlparse(url) if not parsed_url.scheme: self._downloader.report_warning('The url doesn\'t specify the protocol, trying with http') return self.url_result('http://' + url) + video_id = os.path.splitext(url.split('/')[-1])[0] try: - new_url = self._test_redirect(url) - if new_url: - return [self.url_result(new_url)] + response = self._send_head(url) + + # Check for redirect + new_url = response.geturl() + if url != new_url: + self.report_following_redirect(new_url) + return self.url_result(new_url) + + # Check for direct link to a video + content_type = response.headers.get('Content-Type', '') + m = re.match(r'^(?P<type>audio|video|application(?=/ogg$))/(?P<format_id>.+)$', content_type) + if m: + upload_date = response.headers.get('Last-Modified') + if upload_date: + upload_date = unified_strdate(upload_date) + return { + 'id': video_id, + 'title': os.path.splitext(url_basename(url))[0], + 'formats': [{ + 'format_id': m.group('format_id'), + 'url': url, + 'vcodec': u'none' if m.group('type') == 'audio' else None + }], + 'upload_date': upload_date, + } + except compat_urllib_error.HTTPError: # This may be a stupid server that doesn't like HEAD, our UA, or so pass - video_id = url.split('/')[-1] try: webpage = self._download_webpage(url, video_id) except ValueError: @@ -169,8 +208,13 @@ class GenericIE(InfoExtractor): # Site Name | Video Title # Video Title - Tagline | Site Name # and so on and so forth; it's just not practical - video_title = self._html_search_regex(r'<title>(.*)', - webpage, u'video title', default=u'video', flags=re.DOTALL) + video_title = self._html_search_regex( + r'(?s)(.*?)', webpage, u'video title', + default=u'video') + + # video uploader is domain name + video_uploader = self._search_regex( + r'^(?:https?://)?([^/]*)/.*', url, u'video uploader') # Look for BrightCove: bc_url = BrightcoveIE._extract_brightcove_url(webpage) @@ -178,7 +222,7 @@ class GenericIE(InfoExtractor): self.to_screen(u'Brightcove video detected.') return self.url_result(bc_url, 'Brightcove') - # Look for embedded Vimeo player + # Look for embedded (iframe) Vimeo player mobj = re.search( r']+?src="(https?://player.vimeo.com/video/.+?)"', webpage) if mobj: @@ -186,9 +230,18 @@ class GenericIE(InfoExtractor): surl = smuggle_url(player_url, {'Referer': url}) return self.url_result(surl, 'Vimeo') + # Look for embedded (swf embed) Vimeo player + mobj = re.search( + r']+?src="(https?://(?:www\.)?vimeo.com/moogaloop.swf.+?)"', webpage) + if mobj: + return self.url_result(mobj.group(1), 'Vimeo') + # Look for embedded YouTube player - matches = re.findall( - r']+?src=(["\'])(?P(?:https?:)?//(?:www\.)?youtube.com/embed/.+?)\1', webpage) + matches = re.findall(r'''(?x) + (?:]+?src=|embedSWF\(\s*) + (["\'])(?P(?:https?:)?//(?:www\.)?youtube\.com/ + (?:embed|v)/.+?) + \1''', webpage) if matches: urlrs = [self.url_result(unescapeHTML(tuppl[1]), 'Youtube') for tuppl in matches] @@ -197,13 +250,38 @@ class GenericIE(InfoExtractor): # Look for embedded Dailymotion player matches = re.findall( - r']+?src=(["\'])(?P(?:https?:)?//(?:www\.)?dailymotion.com/embed/video/.+?)\1', webpage) + r']+?src=(["\'])(?P(?:https?:)?//(?:www\.)?dailymotion\.com/embed/video/.+?)\1', webpage) if matches: urlrs = [self.url_result(unescapeHTML(tuppl[1]), 'Dailymotion') for tuppl in matches] return self.playlist_result( urlrs, playlist_id=video_id, playlist_title=video_title) + # Look for embedded Wistia player + match = re.search( + r']+?src=(["\'])(?P(?:https?:)?//(?:fast\.)?wistia\.net/embed/iframe/.+?)\1', webpage) + if match: + return { + '_type': 'url_transparent', + 'url': unescapeHTML(match.group('url')), + 'ie_key': 'Wistia', + 'uploader': video_uploader, + 'title': video_title, + 'id': video_id, + } + + # Look for embedded blip.tv player + mobj = re.search(r']*https?://api.blip.tv/\w+/redirect/\w+/(\d+)', webpage) + if mobj: + return self.url_result('http://blip.tv/seo/-'+mobj.group(1), 'BlipTV') + mobj = re.search(r'<(?:iframe|embed|object)\s[^>]*https?://(?:\w+\.)?blip.tv/(?:play/|api\.swf#)([a-zA-Z0-9]+)', webpage) + if mobj: + player_url = 'http://blip.tv/play/%s.x?p=1' % mobj.group(1) + player_page = self._download_webpage(player_url, mobj.group(1)) + blip_video_id = self._search_regex(r'data-episode-id="(\d+)', player_page, u'blip_video_id', fatal=False) + if blip_video_id: + return self.url_result('http://blip.tv/seo/-'+blip_video_id, 'BlipTV') + # Look for Bandcamp pages with custom domain mobj = re.search(r']*?content="(.*?bandcamp\.com.*?)"', webpage) if mobj is not None: @@ -211,6 +289,22 @@ class GenericIE(InfoExtractor): # Don't set the extractor because it can be a track url or an album return self.url_result(burl) + # Look for embedded Vevo player + mobj = re.search( + r']+?src=(["\'])(?P(?:https?:)?//(?:cache\.)?vevo\.com/.+?)\1', webpage) + if mobj is not None: + return self.url_result(mobj.group('url')) + + # Look for Ooyala videos + mobj = re.search(r'player.ooyala.com/[^"?]+\?[^"]*?(?:embedCode|ec)=([^"&]+)', webpage) + if mobj is not None: + return OoyalaIE._build_url_result(mobj.group(1)) + + # Look for Aparat videos + mobj = re.search(r'