1
1
mirror of https://github.com/ytdl-org/youtube-dl synced 2024-11-27 13:06:49 +01:00

release 2013.01.02

This commit is contained in:
Filippo Valsorda 2013-01-02 22:47:06 +01:00
parent a07549dc0f
commit 2f0d49e70a
25 changed files with 13849 additions and 15 deletions

View File

@ -36,6 +36,6 @@
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
<img alt="Creative Commons License" style="border-width:0"
src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a><br />
Copyright © 2006-2012 Ricardo Garcia Gonzalez</div>
Copyright © 2006-2013 Ricardo Garcia Gonzalez</div>
</body>
</html>

View File

@ -132,6 +132,6 @@ You can configure youtube-dl by placing default arguments (such as <code>--extra
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
<img alt="Creative Commons License" style="border-width:0"
src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a><br />
Copyright © 2006-2012 Ricardo Garcia Gonzalez</div>
Copyright © 2006-2013 Ricardo Garcia Gonzalez</div>
</body>
</html>

View File

@ -16,23 +16,40 @@
<p>Remember <em>youtube-dl</em> requires <a href="http://www.python.org/">Python</a> version 2.6, 2.7, or 3.3+ to work.</p>
<h2><a href="https://github.com/downloads/rg3/youtube-dl/youtube-dl">2012.12.11</a></h2>
<h2><a href="http://youtube-dl.org/downloads/2013.01.02/youtube-dl">2013.01.02</a> (<a href="http://youtube-dl.org/downloads/2013.01.02/youtube-dl.sig">sig</a>)</h2>
<p>To install it right away for all users, type:
<code style="display:block; margin-top: 0.4em; padding: 0.7em; background: #ccc; background: rgba(200, 200, 200, 0.4); white-space: pre;">sudo wget https://github.com/downloads/rg3/youtube-dl/youtube-dl -O /usr/local/bin/youtube-dl
<ul>
<li><strong>MD5</strong>: 386bfb99dd037e3032ae1911158b8049</li>
<li><strong>SHA1</strong>: dd44e44c3f62b065ad7fd0661905e4d82233e5ec</li>
<li><strong>SHA256</strong>: f5b502f8aaa77675c4884938b1e4871ebca2611813a0c0e74f60c0fbd6dcca6b</li>
</ul>
<p>
<a href="http://youtube-dl.org/downloads/2013.01.02/youtube-dl.exe">Windows exe</a> (<a href="http://youtube-dl.org/downloads/2013.01.02/youtube-dl.exe.sig">sig</a> - 75fa89d2ce297d102ff27675aa9d92545bbc91013f52ec52868c069f4f9f0422)<br>
<a href="http://youtube-dl.org/downloads/2013.01.02/youtube-dl-2013.01.02.tar.gz">Full source + docs + binary tarball</a> (<a href="http://youtube-dl.org/downloads/2013.01.02/youtube-dl-2013.01.02.tar.gz.sig">sig</a> - 6a66d022ac8e1c13da284036288a133ec8dba003b7bd3a5179d0c0daca8c8196)
</p>
<p>To install it right away for all UNIX users (Linux, OS X, etc.), type:
<code style="display:block; margin-top: 0.4em; padding: 0.7em; background: #ccc; background: rgba(200, 200, 200, 0.4); white-space: pre;">sudo wget http://youtube-dl.org/downloads/2013.01.02/youtube-dl -O /usr/local/bin/youtube-dl
sudo chmod a+x /usr/local/bin/youtube-dl</code>
</p>
<p>To check the signature, type:
<code style="display:block; margin-top: 0.4em; padding: 0.7em; background: #ccc; background: rgba(200, 200, 200, 0.4); white-space: pre;">sudo wget http://youtube-dl.org/downloads/2013.01.02/youtube-dl.sig -O youtube-dl.sig
gpg --verify youtube-dl.sig /usr/local/bin/youtube-dl
rm youtube-dl.sig</code>
</p>
<p>The following GPG keys will be used to sign the binaries and the git tags:</p>
<ul>
<li><strong>MD5</strong>: a73e1d6f59e34d1231cf5788b31fa177</li>
<li><strong>SHA1</strong>: aa45f8e32c637a2342674f32d1ca9e8f70bf695c</li>
<li><strong>SHA256</strong>: e2109ac82b05f910828a12b2de0d8e5d3b29b0ed9e2daeb68badb1fce8c1ec7a</li>
<li><strong>1024D/FAFB085C</strong> Philipp Hagemeister <code>Key fingerprint = 0600 E1DB 6FB5 3A5D 95D8 FC0D F5EA B582 FAFB 085C</code></li>
<li><strong>4096R/D977155C</strong> Filippo Valsorda <code>Key fingerprint = 9524 4D9F EE39 0B71 25A3 4708 3CD8 8EE0 D977 155C</code></li>
</ul>
<div class="note">
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
<img alt="Creative Commons License" style="border-width:0"
src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a><br />
Copyright © 2006-2012 Ricardo Garcia Gonzalez</div>
Copyright © 2006-2013 Ricardo Garcia Gonzalez</div>
</body>
</html>

View File

@ -50,6 +50,6 @@ rm youtube-dl.sig</code>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
<img alt="Creative Commons License" style="border-width:0"
src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a><br />
Copyright © 2006-2012 Ricardo Garcia Gonzalez</div>
Copyright © 2006-2013 Ricardo Garcia Gonzalez</div>
</body>
</html>

View File

@ -85,6 +85,6 @@ means you're using an outdated version of Python. Please update to Python 2.6 or
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
<img alt="Creative Commons License" style="border-width:0"
src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a><br />
Copyright © 2006-2012 Ricardo Garcia Gonzalez</div>
Copyright © 2006-2013 Ricardo Garcia Gonzalez</div>
</body>
</html>

View File

@ -31,6 +31,6 @@ You can also contact us on the irc channel <a href="irc://chat.freenode.net/#you
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">
<img alt="Creative Commons License" style="border-width:0"
src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a><br />
Copyright © 2006-2012 Ricardo Garcia Gonzalez</div>
Copyright © 2006-2013 Ricardo Garcia Gonzalez</div>
</body>
</html>

View File

@ -0,0 +1,376 @@
// Coverage.py HTML report browser code.
/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
/*global coverage: true, document, window, $ */
coverage = {};
// Find all the elements with shortkey_* class, and use them to assign a shotrtcut key.
coverage.assign_shortkeys = function () {
$("*[class*='shortkey_']").each(function (i, e) {
$.each($(e).attr("class").split(" "), function (i, c) {
if (/^shortkey_/.test(c)) {
$(document).bind('keydown', c.substr(9), function () {
$(e).click();
});
}
});
});
};
// Create the events for the help panel.
coverage.wire_up_help_panel = function () {
$("#keyboard_icon").click(function () {
// Show the help panel, and position it so the keyboard icon in the
// panel is in the same place as the keyboard icon in the header.
$(".help_panel").show();
var koff = $("#keyboard_icon").offset();
var poff = $("#panel_icon").position();
$(".help_panel").offset({
top: koff.top-poff.top,
left: koff.left-poff.left
});
});
$("#panel_icon").click(function () {
$(".help_panel").hide();
});
};
// Loaded on index.html
coverage.index_ready = function ($) {
// Look for a cookie containing previous sort settings:
var sort_list = [];
var cookie_name = "COVERAGE_INDEX_SORT";
var i;
// This almost makes it worth installing the jQuery cookie plugin:
if (document.cookie.indexOf(cookie_name) > -1) {
var cookies = document.cookie.split(";");
for (i = 0; i < cookies.length; i++) {
var parts = cookies[i].split("=");
if ($.trim(parts[0]) === cookie_name && parts[1]) {
sort_list = eval("[[" + parts[1] + "]]");
break;
}
}
}
// Create a new widget which exists only to save and restore
// the sort order:
$.tablesorter.addWidget({
id: "persistentSort",
// Format is called by the widget before displaying:
format: function (table) {
if (table.config.sortList.length === 0 && sort_list.length > 0) {
// This table hasn't been sorted before - we'll use
// our stored settings:
$(table).trigger('sorton', [sort_list]);
}
else {
// This is not the first load - something has
// already defined sorting so we'll just update
// our stored value to match:
sort_list = table.config.sortList;
}
}
});
// Configure our tablesorter to handle the variable number of
// columns produced depending on report options:
var headers = [];
var col_count = $("table.index > thead > tr > th").length;
headers[0] = { sorter: 'text' };
for (i = 1; i < col_count-1; i++) {
headers[i] = { sorter: 'digit' };
}
headers[col_count-1] = { sorter: 'percent' };
// Enable the table sorter:
$("table.index").tablesorter({
widgets: ['persistentSort'],
headers: headers
});
coverage.assign_shortkeys();
coverage.wire_up_help_panel();
// Watch for page unload events so we can save the final sort settings:
$(window).unload(function () {
document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/";
});
};
// -- pyfile stuff --
coverage.pyfile_ready = function ($) {
// If we're directed to a particular line number, highlight the line.
var frag = location.hash;
if (frag.length > 2 && frag[1] === 'n') {
$(frag).addClass('highlight');
coverage.set_sel(parseInt(frag.substr(2), 10));
}
else {
coverage.set_sel(0);
}
$(document)
.bind('keydown', 'j', coverage.to_next_chunk_nicely)
.bind('keydown', 'k', coverage.to_prev_chunk_nicely)
.bind('keydown', '0', coverage.to_top)
.bind('keydown', '1', coverage.to_first_chunk)
;
$(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");});
$(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");});
$(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");});
$(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");});
coverage.assign_shortkeys();
coverage.wire_up_help_panel();
};
coverage.toggle_lines = function (btn, cls) {
btn = $(btn);
var hide = "hide_"+cls;
if (btn.hasClass(hide)) {
$("#source ."+cls).removeClass(hide);
btn.removeClass(hide);
}
else {
$("#source ."+cls).addClass(hide);
btn.addClass(hide);
}
};
// Return the nth line div.
coverage.line_elt = function (n) {
return $("#t" + n);
};
// Return the nth line number div.
coverage.num_elt = function (n) {
return $("#n" + n);
};
// Return the container of all the code.
coverage.code_container = function () {
return $(".linenos");
};
// Set the selection. b and e are line numbers.
coverage.set_sel = function (b, e) {
// The first line selected.
coverage.sel_begin = b;
// The next line not selected.
coverage.sel_end = (e === undefined) ? b+1 : e;
};
coverage.to_top = function () {
coverage.set_sel(0, 1);
coverage.scroll_window(0);
};
coverage.to_first_chunk = function () {
coverage.set_sel(0, 1);
coverage.to_next_chunk();
};
coverage.is_transparent = function (color) {
// Different browsers return different colors for "none".
return color === "transparent" || color === "rgba(0, 0, 0, 0)";
};
coverage.to_next_chunk = function () {
var c = coverage;
// Find the start of the next colored chunk.
var probe = c.sel_end;
while (true) {
var probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
return;
}
var color = probe_line.css("background-color");
if (!c.is_transparent(color)) {
break;
}
probe++;
}
// There's a next chunk, `probe` points to it.
var begin = probe;
// Find the end of this chunk.
var next_color = color;
while (next_color === color) {
probe++;
probe_line = c.line_elt(probe);
next_color = probe_line.css("background-color");
}
c.set_sel(begin, probe);
c.show_selection();
};
coverage.to_prev_chunk = function () {
var c = coverage;
// Find the end of the prev colored chunk.
var probe = c.sel_begin-1;
var probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
return;
}
var color = probe_line.css("background-color");
while (probe > 0 && c.is_transparent(color)) {
probe--;
probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
return;
}
color = probe_line.css("background-color");
}
// There's a prev chunk, `probe` points to its last line.
var end = probe+1;
// Find the beginning of this chunk.
var prev_color = color;
while (prev_color === color) {
probe--;
probe_line = c.line_elt(probe);
prev_color = probe_line.css("background-color");
}
c.set_sel(probe+1, end);
c.show_selection();
};
// Return the line number of the line nearest pixel position pos
coverage.line_at_pos = function (pos) {
var l1 = coverage.line_elt(1),
l2 = coverage.line_elt(2),
result;
if (l1.length && l2.length) {
var l1_top = l1.offset().top,
line_height = l2.offset().top - l1_top,
nlines = (pos - l1_top) / line_height;
if (nlines < 1) {
result = 1;
}
else {
result = Math.ceil(nlines);
}
}
else {
result = 1;
}
return result;
};
// Returns 0, 1, or 2: how many of the two ends of the selection are on
// the screen right now?
coverage.selection_ends_on_screen = function () {
if (coverage.sel_begin === 0) {
return 0;
}
var top = coverage.line_elt(coverage.sel_begin);
var next = coverage.line_elt(coverage.sel_end-1);
return (
(top.isOnScreen() ? 1 : 0) +
(next.isOnScreen() ? 1 : 0)
);
};
coverage.to_next_chunk_nicely = function () {
coverage.finish_scrolling();
if (coverage.selection_ends_on_screen() === 0) {
// The selection is entirely off the screen: select the top line on
// the screen.
var win = $(window);
coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop()));
}
coverage.to_next_chunk();
};
coverage.to_prev_chunk_nicely = function () {
coverage.finish_scrolling();
if (coverage.selection_ends_on_screen() === 0) {
var win = $(window);
coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height()));
}
coverage.to_prev_chunk();
};
// Select line number lineno, or if it is in a colored chunk, select the
// entire chunk
coverage.select_line_or_chunk = function (lineno) {
var c = coverage;
var probe_line = c.line_elt(lineno);
if (probe_line.length === 0) {
return;
}
var the_color = probe_line.css("background-color");
if (!c.is_transparent(the_color)) {
// The line is in a highlighted chunk.
// Search backward for the first line.
var probe = lineno;
var color = the_color;
while (probe > 0 && color === the_color) {
probe--;
probe_line = c.line_elt(probe);
if (probe_line.length === 0) {
break;
}
color = probe_line.css("background-color");
}
var begin = probe + 1;
// Search forward for the last line.
probe = lineno;
color = the_color;
while (color === the_color) {
probe++;
probe_line = c.line_elt(probe);
color = probe_line.css("background-color");
}
coverage.set_sel(begin, probe);
}
else {
coverage.set_sel(lineno);
}
};
coverage.show_selection = function () {
var c = coverage;
// Highlight the lines in the chunk
c.code_container().find(".highlight").removeClass("highlight");
for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) {
c.num_elt(probe).addClass("highlight");
}
c.scroll_to_selection();
};
coverage.scroll_to_selection = function () {
// Scroll the page if the chunk isn't fully visible.
if (coverage.selection_ends_on_screen() < 2) {
// Need to move the page. The html,body trick makes it scroll in all
// browsers, got it from http://stackoverflow.com/questions/3042651
var top = coverage.line_elt(coverage.sel_begin);
var top_pos = parseInt(top.offset().top, 10);
coverage.scroll_window(top_pos - 30);
}
};
coverage.scroll_window = function (to_pos) {
$("html,body").animate({scrollTop: to_pos}, 200);
};
coverage.finish_scrolling = function () {
$("html,body").stop(true, true);
};

144
test_coverage/index.html Normal file
View File

@ -0,0 +1,144 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>Coverage report</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.tablesorter.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.index_ready);
</script>
</head>
<body id='indexfile'>
<div id='header'>
<div class='content'>
<h1>Coverage report:
<span class='pc_cov'>44%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>n</span>
<span class='key'>s</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>c</span> &nbsp; change column sorting
</p>
</div>
</div>
<div id='index'>
<table class='index'>
<thead>
<tr class='tablehead' title='Click to sort'>
<th class='name left headerSortDown shortkey_n'>Module</th>
<th class='shortkey_s'>statements</th>
<th class='shortkey_m'>missing</th>
<th class='shortkey_x'>excluded</th>
<th class='right shortkey_c'>coverage</th>
</tr>
</thead>
<tfoot>
<tr class='total'>
<td class='name left'>Total</td>
<td>3632</td>
<td>2026</td>
<td>0</td>
<td class='right'>44%</td>
</tr>
</tfoot>
<tbody>
<tr class='file'>
<td class='name left'><a href='youtube_dl.html'>youtube_dl</a></td>
<td>274</td>
<td>251</td>
<td>0</td>
<td class='right'>8%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='youtube_dl_FileDownloader.html'>youtube_dl.FileDownloader</a></td>
<td>479</td>
<td>208</td>
<td>0</td>
<td class='right'>57%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='youtube_dl_InfoExtractors.html'>youtube_dl.InfoExtractors</a></td>
<td>2275</td>
<td>1273</td>
<td>0</td>
<td class='right'>44%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='youtube_dl_PostProcessor.html'>youtube_dl.PostProcessor</a></td>
<td>133</td>
<td>114</td>
<td>0</td>
<td class='right'>14%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='youtube_dl_update.html'>youtube_dl.update</a></td>
<td>130</td>
<td>122</td>
<td>0</td>
<td class='right'>6%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='youtube_dl_utils.html'>youtube_dl.utils</a></td>
<td>340</td>
<td>58</td>
<td>0</td>
<td class='right'>83%</td>
</tr>
<tr class='file'>
<td class='name left'><a href='youtube_dl_version.html'>youtube_dl.version</a></td>
<td>1</td>
<td>0</td>
<td>0</td>
<td class='right'>100%</td>
</tr>
</tbody>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='http://nedbatchelder.com/code/coverage/3.6b1'>coverage.py v3.6b1</a>
</p>
</div>
</div>
</body>
</html>

166
test_coverage/jquery-1.4.3.min.js vendored Normal file
View File

@ -0,0 +1,166 @@
/*!
* jQuery JavaScript Library v1.4.3
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Thu Oct 14 23:10:06 2010 -0400
*/
(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;n<H.length;n++){k=H[n];k.origType.replace(X,
"")===a.type?f.push(k.selector):H.splice(n--,1)}f=c(a.target).closest(f,a.currentTarget);s=0;for(v=f.length;s<v;s++){B=f[s];for(n=0;n<H.length;n++){k=H[n];if(B.selector===k.selector&&(!D||D.test(k.namespace))){l=B.elem;h=null;if(k.preType==="mouseenter"||k.preType==="mouseleave"){a.type=k.preType;h=c(a.relatedTarget).closest(k.selector)[0]}if(!h||h!==l)e.push({elem:l,handleObj:k,level:B.level})}}}s=0;for(v=e.length;s<v;s++){f=e[s];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;
a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b,
e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}
function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?
e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a,
1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,
q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i=
[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i);
else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ":
"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r,
y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r<y;r++)if((F=arguments[r])!=null)for(I in F){K=i[I];J=F[I];if(i!==J)if(z&&J&&(b.isPlainObject(J)||(fa=b.isArray(J)))){if(fa){fa=false;clone=K&&b.isArray(K)?K:[]}else clone=
K&&b.isPlainObject(K)?K:{};i[I]=b.extend(z,clone,J)}else if(J!==A)i[I]=J}return i};b.extend({noConflict:function(i){E.$=e;if(i)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(i){i===true&&b.readyWait--;if(!b.readyWait||i!==true&&!b.isReady){if(!u.body)return setTimeout(b.ready,1);b.isReady=true;if(!(i!==true&&--b.readyWait>0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready,
1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i==
null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i);
if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()===
r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F<I;){if(r.apply(i[F++],y)===false)break}else if(K)for(z in i){if(r.call(i[z],z,i[z])===false)break}else for(y=i[0];F<I&&r.call(y,F,y)!==false;y=i[++F]);return i},trim:R?function(i){return i==null?"":R.call(i)}:function(i){return i==null?"":i.toString().replace(l,"").replace(n,"")},makeArray:function(i,r){var y=r||[];if(i!=null){var z=b.type(i);i.length==
null||z==="string"||z==="function"||z==="regexp"||b.isWindow(i)?P.call(y,i):b.merge(y,i)}return y},inArray:function(i,r){if(r.indexOf)return r.indexOf(i);for(var y=0,z=r.length;y<z;y++)if(r[y]===i)return y;return-1},merge:function(i,r){var y=i.length,z=0;if(typeof r.length==="number")for(var F=r.length;z<F;z++)i[y++]=r[z];else for(;r[z]!==A;)i[y++]=r[z++];i.length=y;return i},grep:function(i,r,y){var z=[],F;y=!!y;for(var I=0,K=i.length;I<K;I++){F=!!r(i[I],I);y!==F&&z.push(i[I])}return z},map:function(i,
r,y){for(var z=[],F,I=0,K=i.length;I<K;I++){F=r(i[I],I,y);if(F!=null)z[z.length]=F}return z.concat.apply([],z)},guid:1,proxy:function(i,r,y){if(arguments.length===2)if(typeof r==="string"){y=i;i=y[r];r=A}else if(r&&!b.isFunction(r)){y=r;r=A}if(!r&&i)r=function(){return i.apply(y||this,arguments)};if(i)r.guid=i.guid=i.guid||r.guid||b.guid++;return r},access:function(i,r,y,z,F,I){var K=i.length;if(typeof r==="object"){for(var J in r)b.access(i,J,r[J],z,F,y);return i}if(y!==A){z=!I&&z&&b.isFunction(y);
for(J=0;J<K;J++)F(i[J],r,z?y.call(i[J],J,F(i[J],r)):y,I);return i}return K?F(i[0],r):A},now:function(){return(new Date).getTime()},uaMatch:function(i){i=i.toLowerCase();i=M.exec(i)||g.exec(i)||j.exec(i)||i.indexOf("compatible")<0&&o.exec(i)||[];return{browser:i[1]||"",version:i[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(i,r){L["[object "+r+"]"]=r.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=
m.version}if(b.browser.webkit)b.browser.safari=true;if(Q)b.inArray=function(i,r){return Q.call(r,i)};if(!/\s/.test("\u00a0")){l=/^[\s\xA0]+/;n=/[\s\xA0]+$/}f=b(u);if(u.addEventListener)t=function(){u.removeEventListener("DOMContentLoaded",t,false);b.ready()};else if(u.attachEvent)t=function(){if(u.readyState==="complete"){u.detachEvent("onreadystatechange",t);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=u.documentElement,b=u.createElement("script"),d=u.createElement("div"),
e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],k=u.createElement("select"),l=k.appendChild(u.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),
hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:l.selected,optDisabled:false,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};k.disabled=true;c.support.optDisabled=!l.disabled;b.type="text/javascript";try{b.appendChild(u.createTextNode("window."+e+"=1;"))}catch(n){}a.insertBefore(b,
a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function s(){c.support.noCloneEvent=false;d.detachEvent("onclick",s)});d.cloneNode(true).fireEvent("onclick")}d=u.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div");
s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight===
0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",
cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=
c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b=
c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e===
"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e||
[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,
a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1)if(f.className){for(var h=" "+f.className+" ",k=f.className,l=0,n=b.length;l<n;l++)if(h.indexOf(" "+b[l]+" ")<0)k+=" "+b[l];f.className=c.trim(k)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(n){var s=
c(this);s.removeClass(a.call(this,n,s.attr("class")))});if(a&&typeof a==="string"||a===A)for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(qa," "),k=0,l=b.length;k<l;k++)h=h.replace(" "+b[k]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,
f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,k=c(this),l=b,n=a.split(ga);f=n[h++];){l=e?l:!k.hasClass(f);k[l?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(qa," ").indexOf(a)>-1)return true;return false},
val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var k=f[h];if(k.selected&&(c.support.optDisabled?!k.disabled:k.getAttribute("disabled")===null)&&(!k.parentNode.disabled||!c.nodeName(k.parentNode,"optgroup"))){a=c(k).val();if(b)return a;d.push(a)}}return d}if(ra.test(b.type)&&
!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Pa,"")}return A}var l=c.isFunction(a);return this.each(function(n){var s=c(this),v=a;if(this.nodeType===1){if(l)v=a.call(this,n,s.val());if(v==null)v="";else if(typeof v==="number")v+="";else if(c.isArray(v))v=c.map(v,function(D){return D==null?"":D+""});if(c.isArray(v)&&ra.test(this.type))this.checked=c.inArray(s.val(),v)>=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected=
c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&&
h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l===
"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[];
if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||
typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h<B.length;h++){D=B[h];if(d.guid===D.guid){if(l||s.test(D.namespace)){e==null&&B.splice(h--,1);v.remove&&v.remove.call(a,D)}if(e!=null)break}}if(B.length===0||e!=null&&B.length===1){if(!v.teardown||
v.teardown.call(a,n)===false)c.removeEvent(a,f,w.handle);delete G[f]}}else for(h=0;h<B.length;h++){D=B[h];if(l||s.test(D.namespace)){c.event.remove(a,v,D.handler,h);B.splice(h--,1)}}}if(c.isEmptyObject(G)){if(b=w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,H);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=
f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===
false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e;
d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f<k;f++){var l=d[f];if(b||e.test(l.namespace)){a.handler=l.handler;a.data=
l.data;a.handleObj=l;l=l.handler.apply(this,h);if(l!==A){a.result=l;if(l===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||u;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=u.documentElement;d=u.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==A)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ga,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=u.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
var ta=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},ua=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?ua:ta,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?ua:ta)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=A;return ja("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=A;return ja("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
va=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired=
A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type===
"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]===
0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h<l;h++)c.event.add(this[h],d,k,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var wa={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var k,l=0,n,s,v=h||this.selector;h=h?this:c(this.context);if(typeof d===
"object"&&!d.preventDefault){for(k in d)h[b](k,e,d[k],v);return this}if(c.isFunction(e)){f=e;e=A}for(d=(d||"").split(" ");(k=d[l++])!=null;){n=X.exec(k);s="";if(n){s=n[0];k=k.replace(X,"")}if(k==="hover")d.push("mouseenter"+s,"mouseleave"+s);else{n=k;if(k==="focus"||k==="blur"){d.push(wa[k]+s);k+=s}else k=(wa[k]||k)+s;if(b==="live"){s=0;for(var B=h.length;s<B;s++)c.event.add(h[s],"live."+Y(k,v),{data:e,selector:v,handler:f,origType:k,origHandler:f,preType:n})}else h.unbind("live."+Y(k,v),f)}}return this}});
c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1&&!q){x.sizcache=o;x.sizset=p}if(x.nodeName.toLowerCase()===j){C=x;break}x=x[g]}m[p]=C}}}function b(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1){if(!q){x.sizcache=o;x.sizset=p}if(typeof j!=="string"){if(x===j){C=true;break}}else if(l.filter(j,
[x]).length>0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3];
break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr,
t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h=
k;g.sort(w);if(h)for(var j=1;j<g.length;j++)g[j]===g[j-1]&&g.splice(j--,1)}return g};l.matches=function(g,j){return l(g,null,null,j)};l.matchesSelector=function(g,j){return l(j,null,null,[g]).length>0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p<q;p++){var t=n.order[p],x;if(x=n.leftMatch[t].exec(g)){var C=x[1];x.splice(1,1);if(C.substr(C.length-1)!=="\\"){x[1]=(x[1]||"").replace(/\\/g,"");m=n.find[t](x,j,o);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=j.getElementsByTagName("*"));
return{set:m,expr:g}};l.filter=function(g,j,o,m){for(var p=g,q=[],t=j,x,C,P=j&&j[0]&&l.isXML(j[0]);g&&j.length;){for(var N in n.filter)if((x=n.leftMatch[N].exec(g))!=null&&x[2]){var R=n.filter[N],Q,L;L=x[1];C=false;x.splice(1,1);if(L.substr(L.length-1)!=="\\"){if(t===q)q=[];if(n.preFilter[N])if(x=n.preFilter[N](x,t,o,q,m,P)){if(x===true)continue}else C=Q=true;if(x)for(var i=0;(L=t[i])!=null;i++)if(L){Q=R(L,x,i,t);var r=m^!!Q;if(o&&Q!=null)if(r)C=true;else t[i]=false;else if(r){q.push(L);C=true}}if(Q!==
A){o||(t=q);g=g.replace(n.match[N],"");if(!C)return[];break}}}if(g===p)if(C==null)l.error(g);else break;p=g}return t};l.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=l.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,j){var o=typeof j==="string",m=o&&!/\W/.test(j);o=o&&!m;if(m)j=j.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=o||q&&q.nodeName.toLowerCase()===
j?q||false:q===j}o&&l.filter(j,g,true)},">":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p<q;p++){if(m=g[p]){o=m.parentNode;g[p]=o.nodeName.toLowerCase()===j?o:false}}else{for(;p<q;p++)if(m=g[p])g[p]=o?m.parentNode:m.parentNode===j;o&&l.filter(j,g,true)}},"":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=j=j.toLowerCase();p=a}p("parentNode",j,m,g,q,o)},"~":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=
j=j.toLowerCase();p=a}p("previousSibling",j,m,g,q,o)}},find:{ID:function(g,j,o){if(typeof j.getElementById!=="undefined"&&!o)return(g=j.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,j){if(typeof j.getElementsByName!=="undefined"){for(var o=[],m=j.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&o.push(m[p]);return o.length===0?null:o}},TAG:function(g,j){return j.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,j,o,m,p,q){g=" "+g[1].replace(/\\/g,
"")+" ";if(q)return g;q=0;for(var t;(t=j[q])!=null;q++)if(t)if(p^(t.className&&(" "+t.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o,
m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return j<o[3]-0},gt:function(g,j,o){return j>o[3]-0},nth:function(g,j,o){return o[3]-
0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o<m;o++)if(j[o]===g)return false;return true}else l.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,j){var o=j[1],m=g;switch(o){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(o===
"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":o=j[2];var p=j[3];if(o===1&&p===0)return true;var q=j[0],t=g.parentNode;if(t&&(t.sizcache!==q||!g.nodeIndex)){var x=0;for(m=t.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++x;t.sizcache=q}m=g.nodeIndex-p;return o===0?m===0:m%o===0&&m/o>=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]];
if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o,
g);else if(typeof g.length==="number")for(var p=g.length;m<p;m++)o.push(g[m]);else for(;g[m];m++)o.push(g[m]);return o}}var w,G;if(u.documentElement.compareDocumentPosition)w=function(g,j){if(g===j){h=true;return 0}if(!g.compareDocumentPosition||!j.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(j)&4?-1:1};else{w=function(g,j){var o=[],m=[],p=g.parentNode,q=j.parentNode,t=p;if(g===j){h=true;return 0}else if(p===q)return G(g,j);else if(p){if(!q)return 1}else return-1;
for(;t;){o.unshift(t);t=t.parentNode}for(t=q;t;){m.unshift(t);t=t.parentNode}p=o.length;q=m.length;for(t=0;t<p&&t<q;t++)if(o[t]!==m[t])return G(o[t],m[t]);return t===p?G(g,m[t],-1):G(o[t],j,1)};G=function(g,j,o){if(g===j)return o;for(g=g.nextSibling;g;){if(g===j)return-1;g=g.nextSibling}return 1}}l.getText=function(g){for(var j="",o,m=0;g[m];m++){o=g[m];if(o.nodeType===3||o.nodeType===4)j+=o.nodeValue;else if(o.nodeType!==8)j+=l.getText(o.childNodes)}return j};(function(){var g=u.createElement("div"),
j="script"+(new Date).getTime();g.innerHTML="<a name='"+j+"'/>";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g);
o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&&
function(){var g=l,j=u.createElement("div");j.innerHTML="<p class='TEST'></p>";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o];
j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g,
j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p<t;p++)l(g,q[p],o);return l.filter(m,o)};c.find=l;c.expr=l.selectors;c.expr[":"]=c.expr.filters;c.unique=l.uniqueSort;c.text=l.getText;c.isXMLDoc=l.isXML;c.contains=l.contains})();var Wa=/Until$/,Xa=/^(?:parents|prevUntil|prevAll)/,Ya=/,/,Ja=/^.[^:#\[\.,]*$/,Za=Array.prototype.slice,$a=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("",
"find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var k=0;k<d;k++)if(b[k]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(ka(this,a,false),"not",a)},filter:function(a){return this.pushStack(ka(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,
b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(k?k.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||
!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});
c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",
d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}});
c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g,
$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/<tbody/i,bb=/<|&#?\w+;/,Aa=/<(?:script|object|embed|option|style)/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,cb=/\=([^="'>\s]+\/)>/g,O={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],
area:[1,"<map>","</map>"],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,
d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},
unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=
c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));
c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($,
"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?
this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,
true)},domManip:function(a,b,d){var e,f,h=a[0],k=[],l;if(!c.support.checkClone&&arguments.length===3&&typeof h==="string"&&Ba.test(h))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(h))return this.each(function(s){var v=c(this);a[0]=h.call(this,s,b?v.html():A);v.domManip(a,b,d)});if(this[0]){e=h&&h.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);l=e.fragment;if(f=l.childNodes.length===1?l=l.firstChild:
l.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var n=this.length;f<n;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):this[f]:this[f],f>0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone||
!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=
d.length;f<h;f++){var k=(f>0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1></$2>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default,
s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]==="<table>"&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&&
c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]?
c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this;
return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]||
h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=
e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":
b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],
h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=
b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("<div>").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache=
false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src=
b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type",
b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+
"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a,
b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag");
if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr=
function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a=
0;for(b=this.length;a<b;a++){if(!c.data(this[a],"olddisplay")&&this[a].style.display==="none")this[a].style.display="";this[a].style.display===""&&c.css(this[a],"display")==="none"&&c.data(this[a],"olddisplay",oa(this[a].nodeName))}for(a=0;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",d)}for(a=
0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,d,e);if(c.isEmptyObject(a))return this.each(f.complete);
return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),k,l=this.nodeType===1,n=l&&c(this).is(":hidden"),s=this;for(k in a){var v=c.camelCase(k);if(k!==v){a[v]=a[k];delete a[k];k=v}if(a[k]==="hide"&&n||a[k]==="show"&&!n)return h.complete.call(this);if(l&&(k==="height"||k==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(oa(this.nodeName)===
"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[k])){(h.specialEasing=h.specialEasing||{})[k]=a[k][1];a[k]=a[k][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(B,D){var H=new c.fx(s,h,B);if(tb.test(D))H[D==="toggle"?n?"show":"hide":D](a);else{var w=ub.exec(D),G=H.cur(true)||0;if(w){var M=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(s,B,(M||1)+g);
G=(M||1)/H.cur(true)*G;c.style(s,B,G+g)}if(w[1])M=(w[1]==="-="?-1:1)*M+G;H.custom(G,M,g)}else H.custom(G,D,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)}
this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(aa);aa=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
b.elem}).length};var vb=/^t(?:able|d|h)$/i,Fa=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in u.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(k){c.offset.setOffset(this,a,k)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=ea(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,e=b.ownerDocument,f,h=e.documentElement,k=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;
for(var l=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==k&&b!==h;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;f=e?e.getComputedStyle(b,null):b.currentStyle;l-=b.scrollTop;n-=b.scrollLeft;if(b===d){l+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&vb.test(b.nodeName))){l+=parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&f.overflow!=="visible"){l+=
parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}f=f}if(f.position==="relative"||f.position==="static"){l+=k.offsetTop;n+=k.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){l+=Math.max(h.scrollTop,k.scrollTop);n+=Math.max(h.scrollLeft,k.scrollLeft)}return{top:l,left:n}};c.offset={initialize:function(){var a=u.body,b=u.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),k=c.css(a,"top"),l=c.css(a,"left"),n=e==="absolute"&&c.inArray("auto",[k,l])>-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a,
e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&&
c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+
b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window);

View File

@ -0,0 +1,99 @@
/*
* jQuery Hotkeys Plugin
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Based upon the plugin by Tzury Bar Yochay:
* http://github.com/tzuryby/hotkeys
*
* Original idea by:
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
*/
(function(jQuery){
jQuery.hotkeys = {
version: "0.8",
specialKeys: {
8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
},
shiftNums: {
"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
".": ">", "/": "?", "\\": "|"
}
};
function keyHandler( handleObj ) {
// Only care when a possible input has been specified
if ( typeof handleObj.data !== "string" ) {
return;
}
var origHandler = handleObj.handler,
keys = handleObj.data.toLowerCase().split(" ");
handleObj.handler = function( event ) {
// Don't fire in text-accepting inputs that we didn't directly bind to
if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
event.target.type === "text") ) {
return;
}
// Keypress represents characters, not special keys
var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
character = String.fromCharCode( event.which ).toLowerCase(),
key, modif = "", possible = {};
// check combinations (alt|ctrl|shift+anything)
if ( event.altKey && special !== "alt" ) {
modif += "alt+";
}
if ( event.ctrlKey && special !== "ctrl" ) {
modif += "ctrl+";
}
// TODO: Need to make sure this works consistently across platforms
if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
modif += "meta+";
}
if ( event.shiftKey && special !== "shift" ) {
modif += "shift+";
}
if ( special ) {
possible[ modif + special ] = true;
} else {
possible[ modif + character ] = true;
possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
if ( modif === "shift+" ) {
possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
}
}
for ( var i = 0, l = keys.length; i < l; i++ ) {
if ( possible[ keys[i] ] ) {
return origHandler.apply( this, arguments );
}
}
};
}
jQuery.each([ "keydown", "keyup", "keypress" ], function() {
jQuery.event.special[ this ] = { add: keyHandler };
});
})( jQuery );

View File

@ -0,0 +1,53 @@
/* Copyright (c) 2010
* @author Laurence Wheway
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* @version 1.2.0
*/
(function($) {
jQuery.extend({
isOnScreen: function(box, container) {
//ensure numbers come in as intgers (not strings) and remove 'px' is it's there
for(var i in box){box[i] = parseFloat(box[i])};
for(var i in container){container[i] = parseFloat(container[i])};
if(!container){
container = {
left: $(window).scrollLeft(),
top: $(window).scrollTop(),
width: $(window).width(),
height: $(window).height()
}
}
if( box.left+box.width-container.left > 0 &&
box.left < container.width+container.left &&
box.top+box.height-container.top > 0 &&
box.top < container.height+container.top
) return true;
return false;
}
})
jQuery.fn.isOnScreen = function (container) {
for(var i in container){container[i] = parseFloat(container[i])};
if(!container){
container = {
left: $(window).scrollLeft(),
top: $(window).scrollTop(),
width: $(window).width(),
height: $(window).height()
}
}
if( $(this).offset().left+$(this).width()-container.left > 0 &&
$(this).offset().left < container.width+container.left &&
$(this).offset().top+$(this).height()-container.top > 0 &&
$(this).offset().top < container.height+container.top
) return true;
return false;
}
})(jQuery);

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

271
test_coverage/status.dat Normal file
View File

@ -0,0 +1,271 @@
(dp1
S'files'
p2
(dp3
S'youtube_dl_PostProcessor'
p4
(dp5
S'index'
p6
(dp7
S'html_filename'
p8
S'youtube_dl_PostProcessor.html'
p9
sS'name'
p10
S'youtube_dl.PostProcessor'
p11
sS'nums'
p12
ccopy_reg
_reconstructor
p13
(ccoverage.results
Numbers
p14
c__builtin__
object
p15
NtRp16
(dp17
S'n_files'
p18
I1
sS'n_branches'
p19
I0
sS'n_statements'
p20
I133
sS'n_excluded'
p21
I0
sS'n_partial_branches'
p22
I0
sS'n_missing'
p23
I114
sS'n_missing_branches'
p24
I0
sbssS'hash'
p25
S'C\xc0\xe7,\xf52VnS\x9e%\xc6\xe8\xeaT\xd9'
p26
ssS'youtube_dl_InfoExtractors'
p27
(dp28
g6
(dp29
g8
S'youtube_dl_InfoExtractors.html'
p30
sg10
S'youtube_dl.InfoExtractors'
p31
sg12
g13
(g14
g15
NtRp32
(dp33
g18
I1
sg19
I0
sg20
I2275
sg21
I0
sg22
I0
sg23
I1273
sg24
I0
sbssg25
S'\xc7\xc4\x03@-U\x1f\x93k!\xe6\x12\xf6\xf2\xe6l'
p34
ssS'youtube_dl_version'
p35
(dp36
g6
(dp37
g8
S'youtube_dl_version.html'
p38
sg10
S'youtube_dl.version'
p39
sg12
g13
(g14
g15
NtRp40
(dp41
g18
I1
sg19
I0
sg20
I1
sg21
I0
sg22
I0
sg23
I0
sg24
I0
sbssg25
S'\xc2$\xeb8-M\x17\xbd\xadu4rB\xd3\xfc\x0f'
p42
ssS'youtube_dl_utils'
p43
(dp44
g6
(dp45
g8
S'youtube_dl_utils.html'
p46
sg10
S'youtube_dl.utils'
p47
sg12
g13
(g14
g15
NtRp48
(dp49
g18
I1
sg19
I0
sg20
I340
sg21
I0
sg22
I0
sg23
I58
sg24
I0
sbssg25
S'\x19\x02[U\xd7[yZ{\xb4q\xa4\x1bY0/'
p50
ssS'youtube_dl_update'
p51
(dp52
g6
(dp53
g8
S'youtube_dl_update.html'
p54
sg10
S'youtube_dl.update'
p55
sg12
g13
(g14
g15
NtRp56
(dp57
g18
I1
sg19
I0
sg20
I130
sg21
I0
sg22
I0
sg23
I122
sg24
I0
sbssg25
S'\x15\x94\xbeDlF*\x0c>\x07\xf2\x17n\x0cN\xbc'
p58
ssS'youtube_dl_FileDownloader'
p59
(dp60
g6
(dp61
g8
S'youtube_dl_FileDownloader.html'
p62
sg10
S'youtube_dl.FileDownloader'
p63
sg12
g13
(g14
g15
NtRp64
(dp65
g18
I1
sg19
I0
sg20
I479
sg21
I0
sg22
I0
sg23
I208
sg24
I0
sbssg25
S'9\x8c\x8c\xe2V\xb9e\xc6\xee\xb9\x85\xe0\xc2\x8c\x84Z'
p66
ssS'youtube_dl'
p67
(dp68
g6
(dp69
g8
S'youtube_dl.html'
p70
sg10
g67
sg12
g13
(g14
g15
NtRp71
(dp72
g18
I1
sg19
I0
sg20
I274
sg21
I0
sg22
I0
sg23
I251
sg24
I0
sbssg25
S'e\x9c/\x9c\xc3\x1f\xc0\xcbp\x0f\x8a\xf3\xbe\xfdp_'
p73
sssS'version'
p74
S'3.6b1'
p75
sS'settings'
p76
S'\xce^\xf2\xdb\x0fV\xcc\xfe\x1e\x9a\xd9\x81\xe5\xe3.\xa9'
p77
sS'format'
p78
I1
s.

300
test_coverage/style.css Normal file
View File

@ -0,0 +1,300 @@
/* CSS styles for Coverage. */
/* Page-wide styles */
html, body, h1, h2, h3, p, td, th {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
}
/* Set baseline grid to 16 pt. */
body {
font-family: georgia, serif;
font-size: 1em;
}
html>body {
font-size: 16px;
}
/* Set base font size to 12/16 */
p {
font-size: .75em; /* 12/16 */
line-height: 1.33333333em; /* 16/12 */
}
table {
border-collapse: collapse;
}
a.nav {
text-decoration: none;
color: inherit;
}
a.nav:hover {
text-decoration: underline;
color: inherit;
}
/* Page structure */
#header {
background: #f8f8f8;
width: 100%;
border-bottom: 1px solid #eee;
}
#source {
padding: 1em;
font-family: "courier new", monospace;
}
#indexfile #footer {
margin: 1em 3em;
}
#pyfile #footer {
margin: 1em 1em;
}
#footer .content {
padding: 0;
font-size: 85%;
font-family: verdana, sans-serif;
color: #666666;
font-style: italic;
}
#index {
margin: 1em 0 0 3em;
}
/* Header styles */
#header .content {
padding: 1em 3em;
}
h1 {
font-size: 1.25em;
}
h2.stats {
margin-top: .5em;
font-size: 1em;
}
.stats span {
border: 1px solid;
padding: .1em .25em;
margin: 0 .1em;
cursor: pointer;
border-color: #999 #ccc #ccc #999;
}
.stats span.hide_run, .stats span.hide_exc,
.stats span.hide_mis, .stats span.hide_par,
.stats span.par.hide_run.hide_par {
border-color: #ccc #999 #999 #ccc;
}
.stats span.par.hide_run {
border-color: #999 #ccc #ccc #999;
}
.stats span.run {
background: #ddffdd;
}
.stats span.exc {
background: #eeeeee;
}
.stats span.mis {
background: #ffdddd;
}
.stats span.hide_run {
background: #eeffee;
}
.stats span.hide_exc {
background: #f5f5f5;
}
.stats span.hide_mis {
background: #ffeeee;
}
.stats span.par {
background: #ffffaa;
}
.stats span.hide_par {
background: #ffffcc;
}
/* Help panel */
#keyboard_icon {
float: right;
cursor: pointer;
}
.help_panel {
position: absolute;
background: #ffc;
padding: .5em;
border: 1px solid #883;
display: none;
}
#indexfile .help_panel {
width: 20em; height: 4em;
}
#pyfile .help_panel {
width: 16em; height: 8em;
}
.help_panel .legend {
font-style: italic;
margin-bottom: 1em;
}
#panel_icon {
float: right;
cursor: pointer;
}
.keyhelp {
margin: .75em;
}
.keyhelp .key {
border: 1px solid black;
border-color: #888 #333 #333 #888;
padding: .1em .35em;
font-family: monospace;
font-weight: bold;
background: #eee;
}
/* Source file styles */
.linenos p {
text-align: right;
margin: 0;
padding: 0 .5em;
color: #999999;
font-family: verdana, sans-serif;
font-size: .625em; /* 10/16 */
line-height: 1.6em; /* 16/10 */
}
.linenos p.highlight {
background: #ffdd00;
}
.linenos p a {
text-decoration: none;
color: #999999;
}
.linenos p a:hover {
text-decoration: underline;
color: #999999;
}
td.text {
width: 100%;
}
.text p {
margin: 0;
padding: 0 0 0 .5em;
border-left: 2px solid #ffffff;
white-space: nowrap;
}
.text p.mis {
background: #ffdddd;
border-left: 2px solid #ff0000;
}
.text p.run, .text p.run.hide_par {
background: #ddffdd;
border-left: 2px solid #00ff00;
}
.text p.exc {
background: #eeeeee;
border-left: 2px solid #808080;
}
.text p.par, .text p.par.hide_run {
background: #ffffaa;
border-left: 2px solid #eeee99;
}
.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par,
.text p.hide_run.hide_par {
background: inherit;
}
.text span.annotate {
font-family: georgia;
font-style: italic;
color: #666;
float: right;
padding-right: .5em;
}
.text p.hide_par span.annotate {
display: none;
}
/* Syntax coloring */
.text .com {
color: green;
font-style: italic;
line-height: 1px;
}
.text .key {
font-weight: bold;
line-height: 1px;
}
.text .str {
color: #000080;
}
/* index styles */
#index td, #index th {
text-align: right;
width: 5em;
padding: .25em .5em;
border-bottom: 1px solid #eee;
}
#index th {
font-style: italic;
color: #333;
border-bottom: 1px solid #ccc;
cursor: pointer;
}
#index th:hover {
background: #eee;
border-bottom: 1px solid #999;
}
#index td.left, #index th.left {
padding-left: 0;
}
#index td.right, #index th.right {
padding-right: 0;
}
#index th.headerSortDown, #index th.headerSortUp {
border-bottom: 1px solid #000;
}
#index td.name, #index th.name {
text-align: left;
width: auto;
}
#index td.name a {
text-decoration: none;
color: #000;
}
#index td.name a:hover {
text-decoration: underline;
color: #000;
}
#index tr.total {
}
#index tr.total td {
font-weight: bold;
border-top: 1px solid #ccc;
border-bottom: none;
}
#index tr.file:hover {
background: #eeeeee;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,490 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for youtube_dl.PostProcessor: 14%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>youtube_dl.PostProcessor</b> :
<span class='pc_cov'>14%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
133 statements &nbsp;
<span class='run hide_run shortkey_r button_toggle_run'>19 run</span>
<span class='mis shortkey_m button_toggle_mis'>114 missing</span>
<span class='exc shortkey_x button_toggle_exc'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='pln'><a href='#n2'>2</a></p>
<p id='n3' class='pln'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='pln'><a href='#n10'>10</a></p>
<p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
<p id='n12' class='pln'><a href='#n12'>12</a></p>
<p id='n13' class='pln'><a href='#n13'>13</a></p>
<p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
<p id='n15' class='pln'><a href='#n15'>15</a></p>
<p id='n16' class='pln'><a href='#n16'>16</a></p>
<p id='n17' class='pln'><a href='#n17'>17</a></p>
<p id='n18' class='pln'><a href='#n18'>18</a></p>
<p id='n19' class='pln'><a href='#n19'>19</a></p>
<p id='n20' class='pln'><a href='#n20'>20</a></p>
<p id='n21' class='pln'><a href='#n21'>21</a></p>
<p id='n22' class='pln'><a href='#n22'>22</a></p>
<p id='n23' class='pln'><a href='#n23'>23</a></p>
<p id='n24' class='pln'><a href='#n24'>24</a></p>
<p id='n25' class='pln'><a href='#n25'>25</a></p>
<p id='n26' class='pln'><a href='#n26'>26</a></p>
<p id='n27' class='pln'><a href='#n27'>27</a></p>
<p id='n28' class='pln'><a href='#n28'>28</a></p>
<p id='n29' class='pln'><a href='#n29'>29</a></p>
<p id='n30' class='pln'><a href='#n30'>30</a></p>
<p id='n31' class='stm run hide_run'><a href='#n31'>31</a></p>
<p id='n32' class='pln'><a href='#n32'>32</a></p>
<p id='n33' class='stm run hide_run'><a href='#n33'>33</a></p>
<p id='n34' class='stm mis'><a href='#n34'>34</a></p>
<p id='n35' class='pln'><a href='#n35'>35</a></p>
<p id='n36' class='stm run hide_run'><a href='#n36'>36</a></p>
<p id='n37' class='pln'><a href='#n37'>37</a></p>
<p id='n38' class='stm mis'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='stm run hide_run'><a href='#n40'>40</a></p>
<p id='n41' class='pln'><a href='#n41'>41</a></p>
<p id='n42' class='pln'><a href='#n42'>42</a></p>
<p id='n43' class='pln'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='pln'><a href='#n46'>46</a></p>
<p id='n47' class='pln'><a href='#n47'>47</a></p>
<p id='n48' class='pln'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='pln'><a href='#n51'>51</a></p>
<p id='n52' class='pln'><a href='#n52'>52</a></p>
<p id='n53' class='pln'><a href='#n53'>53</a></p>
<p id='n54' class='pln'><a href='#n54'>54</a></p>
<p id='n55' class='pln'><a href='#n55'>55</a></p>
<p id='n56' class='pln'><a href='#n56'>56</a></p>
<p id='n57' class='pln'><a href='#n57'>57</a></p>
<p id='n58' class='stm mis'><a href='#n58'>58</a></p>
<p id='n59' class='pln'><a href='#n59'>59</a></p>
<p id='n60' class='stm run hide_run'><a href='#n60'>60</a></p>
<p id='n61' class='stm run hide_run'><a href='#n61'>61</a></p>
<p id='n62' class='stm mis'><a href='#n62'>62</a></p>
<p id='n63' class='pln'><a href='#n63'>63</a></p>
<p id='n64' class='stm run hide_run'><a href='#n64'>64</a></p>
<p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
<p id='n66' class='stm mis'><a href='#n66'>66</a></p>
<p id='n67' class='stm mis'><a href='#n67'>67</a></p>
<p id='n68' class='stm mis'><a href='#n68'>68</a></p>
<p id='n69' class='stm mis'><a href='#n69'>69</a></p>
<p id='n70' class='stm mis'><a href='#n70'>70</a></p>
<p id='n71' class='stm mis'><a href='#n71'>71</a></p>
<p id='n72' class='stm mis'><a href='#n72'>72</a></p>
<p id='n73' class='stm mis'><a href='#n73'>73</a></p>
<p id='n74' class='pln'><a href='#n74'>74</a></p>
<p id='n75' class='stm run hide_run'><a href='#n75'>75</a></p>
<p id='n76' class='pln'><a href='#n76'>76</a></p>
<p id='n77' class='stm mis'><a href='#n77'>77</a></p>
<p id='n78' class='stm mis'><a href='#n78'>78</a></p>
<p id='n79' class='stm mis'><a href='#n79'>79</a></p>
<p id='n80' class='stm mis'><a href='#n80'>80</a></p>
<p id='n81' class='stm mis'><a href='#n81'>81</a></p>
<p id='n82' class='stm mis'><a href='#n82'>82</a></p>
<p id='n83' class='stm mis'><a href='#n83'>83</a></p>
<p id='n84' class='stm mis'><a href='#n84'>84</a></p>
<p id='n85' class='pln'><a href='#n85'>85</a></p>
<p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
<p id='n87' class='stm mis'><a href='#n87'>87</a></p>
<p id='n88' class='stm mis'><a href='#n88'>88</a></p>
<p id='n89' class='stm mis'><a href='#n89'>89</a></p>
<p id='n90' class='stm mis'><a href='#n90'>90</a></p>
<p id='n91' class='stm mis'><a href='#n91'>91</a></p>
<p id='n92' class='stm mis'><a href='#n92'>92</a></p>
<p id='n93' class='stm mis'><a href='#n93'>93</a></p>
<p id='n94' class='stm mis'><a href='#n94'>94</a></p>
<p id='n95' class='stm mis'><a href='#n95'>95</a></p>
<p id='n96' class='stm mis'><a href='#n96'>96</a></p>
<p id='n97' class='stm mis'><a href='#n97'>97</a></p>
<p id='n98' class='stm mis'><a href='#n98'>98</a></p>
<p id='n99' class='stm mis'><a href='#n99'>99</a></p>
<p id='n100' class='stm mis'><a href='#n100'>100</a></p>
<p id='n101' class='stm mis'><a href='#n101'>101</a></p>
<p id='n102' class='stm mis'><a href='#n102'>102</a></p>
<p id='n103' class='pln'><a href='#n103'>103</a></p>
<p id='n104' class='stm run hide_run'><a href='#n104'>104</a></p>
<p id='n105' class='stm mis'><a href='#n105'>105</a></p>
<p id='n106' class='stm mis'><a href='#n106'>106</a></p>
<p id='n107' class='stm mis'><a href='#n107'>107</a></p>
<p id='n108' class='stm mis'><a href='#n108'>108</a></p>
<p id='n109' class='pln'><a href='#n109'>109</a></p>
<p id='n110' class='stm mis'><a href='#n110'>110</a></p>
<p id='n111' class='stm mis'><a href='#n111'>111</a></p>
<p id='n112' class='pln'><a href='#n112'>112</a></p>
<p id='n113' class='pln'><a href='#n113'>113</a></p>
<p id='n114' class='stm mis'><a href='#n114'>114</a></p>
<p id='n115' class='stm mis'><a href='#n115'>115</a></p>
<p id='n116' class='stm mis'><a href='#n116'>116</a></p>
<p id='n117' class='stm mis'><a href='#n117'>117</a></p>
<p id='n118' class='stm mis'><a href='#n118'>118</a></p>
<p id='n119' class='pln'><a href='#n119'>119</a></p>
<p id='n120' class='stm run hide_run'><a href='#n120'>120</a></p>
<p id='n121' class='stm mis'><a href='#n121'>121</a></p>
<p id='n122' class='pln'><a href='#n122'>122</a></p>
<p id='n123' class='stm mis'><a href='#n123'>123</a></p>
<p id='n124' class='stm mis'><a href='#n124'>124</a></p>
<p id='n125' class='stm mis'><a href='#n125'>125</a></p>
<p id='n126' class='stm mis'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='stm mis'><a href='#n128'>128</a></p>
<p id='n129' class='stm mis'><a href='#n129'>129</a></p>
<p id='n130' class='stm mis'><a href='#n130'>130</a></p>
<p id='n131' class='pln'><a href='#n131'>131</a></p>
<p id='n132' class='stm mis'><a href='#n132'>132</a></p>
<p id='n133' class='stm mis'><a href='#n133'>133</a></p>
<p id='n134' class='stm mis'><a href='#n134'>134</a></p>
<p id='n135' class='stm mis'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='stm mis'><a href='#n137'>137</a></p>
<p id='n138' class='stm mis'><a href='#n138'>138</a></p>
<p id='n139' class='stm mis'><a href='#n139'>139</a></p>
<p id='n140' class='stm mis'><a href='#n140'>140</a></p>
<p id='n141' class='stm mis'><a href='#n141'>141</a></p>
<p id='n142' class='stm mis'><a href='#n142'>142</a></p>
<p id='n143' class='pln'><a href='#n143'>143</a></p>
<p id='n144' class='pln'><a href='#n144'>144</a></p>
<p id='n145' class='stm mis'><a href='#n145'>145</a></p>
<p id='n146' class='stm mis'><a href='#n146'>146</a></p>
<p id='n147' class='stm mis'><a href='#n147'>147</a></p>
<p id='n148' class='stm mis'><a href='#n148'>148</a></p>
<p id='n149' class='stm mis'><a href='#n149'>149</a></p>
<p id='n150' class='stm mis'><a href='#n150'>150</a></p>
<p id='n151' class='pln'><a href='#n151'>151</a></p>
<p id='n152' class='stm mis'><a href='#n152'>152</a></p>
<p id='n153' class='pln'><a href='#n153'>153</a></p>
<p id='n154' class='pln'><a href='#n154'>154</a></p>
<p id='n155' class='stm mis'><a href='#n155'>155</a></p>
<p id='n156' class='stm mis'><a href='#n156'>156</a></p>
<p id='n157' class='stm mis'><a href='#n157'>157</a></p>
<p id='n158' class='stm mis'><a href='#n158'>158</a></p>
<p id='n159' class='stm mis'><a href='#n159'>159</a></p>
<p id='n160' class='stm mis'><a href='#n160'>160</a></p>
<p id='n161' class='pln'><a href='#n161'>161</a></p>
<p id='n162' class='stm mis'><a href='#n162'>162</a></p>
<p id='n163' class='stm mis'><a href='#n163'>163</a></p>
<p id='n164' class='stm mis'><a href='#n164'>164</a></p>
<p id='n165' class='stm mis'><a href='#n165'>165</a></p>
<p id='n166' class='stm mis'><a href='#n166'>166</a></p>
<p id='n167' class='stm mis'><a href='#n167'>167</a></p>
<p id='n168' class='stm mis'><a href='#n168'>168</a></p>
<p id='n169' class='stm mis'><a href='#n169'>169</a></p>
<p id='n170' class='stm mis'><a href='#n170'>170</a></p>
<p id='n171' class='stm mis'><a href='#n171'>171</a></p>
<p id='n172' class='pln'><a href='#n172'>172</a></p>
<p id='n173' class='stm mis'><a href='#n173'>173</a></p>
<p id='n174' class='stm mis'><a href='#n174'>174</a></p>
<p id='n175' class='stm mis'><a href='#n175'>175</a></p>
<p id='n176' class='stm mis'><a href='#n176'>176</a></p>
<p id='n177' class='stm mis'><a href='#n177'>177</a></p>
<p id='n178' class='pln'><a href='#n178'>178</a></p>
<p id='n179' class='stm mis'><a href='#n179'>179</a></p>
<p id='n180' class='stm mis'><a href='#n180'>180</a></p>
<p id='n181' class='stm mis'><a href='#n181'>181</a></p>
<p id='n182' class='stm mis'><a href='#n182'>182</a></p>
<p id='n183' class='stm mis'><a href='#n183'>183</a></p>
<p id='n184' class='stm mis'><a href='#n184'>184</a></p>
<p id='n185' class='pln'><a href='#n185'>185</a></p>
<p id='n186' class='stm mis'><a href='#n186'>186</a></p>
<p id='n187' class='stm mis'><a href='#n187'>187</a></p>
<p id='n188' class='pln'><a href='#n188'>188</a></p>
<p id='n189' class='pln'><a href='#n189'>189</a></p>
<p id='n190' class='stm mis'><a href='#n190'>190</a></p>
<p id='n191' class='stm mis'><a href='#n191'>191</a></p>
<p id='n192' class='stm mis'><a href='#n192'>192</a></p>
<p id='n193' class='stm mis'><a href='#n193'>193</a></p>
<p id='n194' class='stm mis'><a href='#n194'>194</a></p>
<p id='n195' class='pln'><a href='#n195'>195</a></p>
<p id='n196' class='stm mis'><a href='#n196'>196</a></p>
<p id='n197' class='stm mis'><a href='#n197'>197</a></p>
<p id='n198' class='stm mis'><a href='#n198'>198</a></p>
<p id='n199' class='stm mis'><a href='#n199'>199</a></p>
<p id='n200' class='stm mis'><a href='#n200'>200</a></p>
<p id='n201' class='stm mis'><a href='#n201'>201</a></p>
<p id='n202' class='pln'><a href='#n202'>202</a></p>
<p id='n203' class='stm mis'><a href='#n203'>203</a></p>
<p id='n204' class='stm mis'><a href='#n204'>204</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='com'>#!/usr/bin/env python</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='pln'><span class='com'># -*- coding: utf-8 -*-</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>os</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>subprocess</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>sys</span><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>time</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>utils</span> <span class='key'>import</span> <span class='op'>*</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t13' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>PostProcessor</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Post Processor class.</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t17' class='pln'><span class='str'>&nbsp; &nbsp; PostProcessor objects can be added to downloaders with their</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='pln'><span class='str'>&nbsp; &nbsp; add_post_processor() method. When the downloader has finished a</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='pln'><span class='str'>&nbsp; &nbsp; successful download, it will take its internal chain of PostProcessors</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='pln'><span class='str'>&nbsp; &nbsp; and start calling the run() method on each one of them, first with</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='pln'><span class='str'>&nbsp; &nbsp; an initial argument and then with the returned value of the previous</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='pln'><span class='str'>&nbsp; &nbsp; PostProcessor.</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t24' class='pln'><span class='str'>&nbsp; &nbsp; The chain will be stopped if one of them ever returns None or the end</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='pln'><span class='str'>&nbsp; &nbsp; of the chain is reached.</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t27' class='pln'><span class='str'>&nbsp; &nbsp; PostProcessor objects follow a &quot;mutual registration&quot; process similar</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='pln'><span class='str'>&nbsp; &nbsp; to InfoExtractor objects.</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_downloader</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span> <span class='op'>=</span> <span class='nam'>downloader</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t36' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>set_downloader</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t37' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Sets the downloader for this PP.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span> <span class='op'>=</span> <span class='nam'>downloader</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>run</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>information</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Run the PostProcessor.</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t43' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; The &quot;information&quot; argument is a dictionary like the ones</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; composed by InfoExtractors. The only difference is that this</span><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; one has an extra field called &quot;filepath&quot; that points to the</span><span class='strut'>&nbsp;</span></p>
<p id='t46' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; downloaded file.</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t48' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; When this method returns None, the postprocessing chain is</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; stopped. However, this method may return an information</span><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; dictionary that will be passed to the next postprocessing</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; object in the chain. It can be the one it received after</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; changing some fields.</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t54' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; In addition, this method may raise a PostProcessingError</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; exception that will be taken into account by the downloader</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; it was called from.</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>information</span> <span class='com'># by default, do nothing</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t60' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>AudioConversionError</span><span class='op'>(</span><span class='nam'>BaseException</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t61' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>message</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>message</span> <span class='op'>=</span> <span class='nam'>message</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>FFmpegExtractAudioPP</span><span class='op'>(</span><span class='nam'>PostProcessor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>preferredcodec</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>preferredquality</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>keepvideo</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>,</span> <span class='nam'>nopostoverwrites</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>PostProcessor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>preferredcodec</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>preferredcodec</span> <span class='op'>=</span> <span class='str'>&#39;best&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>=</span> <span class='nam'>preferredcodec</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span> <span class='op'>=</span> <span class='nam'>preferredquality</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_keepvideo</span> <span class='op'>=</span> <span class='nam'>keepvideo</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_nopostoverwrites</span> <span class='op'>=</span> <span class='nam'>nopostoverwrites</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>detect_executables</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>staticmethod</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>detect_executables</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>executable</span><span class='op'>(</span><span class='nam'>exe</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>Popen</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>exe</span><span class='op'>,</span> <span class='str'>&#39;-version&#39;</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>PIPE</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>PIPE</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>communicate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>OSError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>exe</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>programs</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;avprobe&#39;</span><span class='op'>,</span> <span class='str'>&#39;avconv&#39;</span><span class='op'>,</span> <span class='str'>&#39;ffmpeg&#39;</span><span class='op'>,</span> <span class='str'>&#39;ffprobe&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>dict</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>program</span><span class='op'>,</span> <span class='nam'>executable</span><span class='op'>(</span><span class='nam'>program</span><span class='op'>)</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>program</span> <span class='key'>in</span> <span class='nam'>programs</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t85' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_audio_codec</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>path</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;ffprobe&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avprobe&#39;</span><span class='op'>]</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t89' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cmd</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avprobe&#39;</span><span class='op'>]</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;ffprobe&#39;</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>&#39;-show_streams&#39;</span><span class='op'>,</span> <span class='str'>&#39;--&#39;</span><span class='op'>,</span> <span class='nam'>encodeFilename</span><span class='op'>(</span><span class='nam'>path</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>handle</span> <span class='op'>=</span> <span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>Popen</span><span class='op'>(</span><span class='nam'>cmd</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>compat_subprocess_get_DEVNULL</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>PIPE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>output</span> <span class='op'>=</span> <span class='nam'>handle</span><span class='op'>.</span><span class='nam'>communicate</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>handle</span><span class='op'>.</span><span class='nam'>wait</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>!=</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>OSError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>audio_codec</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t97' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>line</span> <span class='key'>in</span> <span class='nam'>output</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;ascii&#39;</span><span class='op'>,</span> <span class='str'>&#39;ignore&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;\n&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>&#39;codec_name=&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>audio_codec</span> <span class='op'>=</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;=&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>line</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>&#39;codec_type=audio&#39;</span> <span class='key'>and</span> <span class='nam'>audio_codec</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>audio_codec</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>run_ffmpeg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>path</span><span class='op'>,</span> <span class='nam'>out_path</span><span class='op'>,</span> <span class='nam'>codec</span><span class='op'>,</span> <span class='nam'>more_opts</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;ffmpeg&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t106' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>AudioConversionError</span><span class='op'>(</span><span class='str'>&#39;ffmpeg or avconv not found. Please install one.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>codec</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>acodec_opts</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>acodec_opts</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;-acodec&#39;</span><span class='op'>,</span> <span class='nam'>codec</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t111' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cmd</span> <span class='op'>=</span> <span class='op'>(</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;ffmpeg&#39;</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>&#39;-y&#39;</span><span class='op'>,</span> <span class='str'>&#39;-i&#39;</span><span class='op'>,</span> <span class='nam'>encodeFilename</span><span class='op'>(</span><span class='nam'>path</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>&#39;-vn&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='op'>+</span> <span class='nam'>acodec_opts</span> <span class='op'>+</span> <span class='nam'>more_opts</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='op'>[</span><span class='str'>&#39;--&#39;</span><span class='op'>,</span> <span class='nam'>encodeFilename</span><span class='op'>(</span><span class='nam'>out_path</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>p</span> <span class='op'>=</span> <span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>Popen</span><span class='op'>(</span><span class='nam'>cmd</span><span class='op'>,</span> <span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>PIPE</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>subprocess</span><span class='op'>.</span><span class='nam'>PIPE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>stdout</span><span class='op'>,</span><span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>communicate</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>p</span><span class='op'>.</span><span class='nam'>returncode</span> <span class='op'>!=</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>msg</span> <span class='op'>=</span> <span class='nam'>stderr</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;\n&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>AudioConversionError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t119' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>run</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>information</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>path</span> <span class='op'>=</span> <span class='nam'>information</span><span class='op'>[</span><span class='str'>&#39;filepath&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t123' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>filecodec</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_audio_codec</span><span class='op'>(</span><span class='nam'>path</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>filecodec</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to obtain file audio codec with ffprobe&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t128' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='str'>&#39;best&#39;</span> <span class='key'>or</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='nam'>filecodec</span> <span class='key'>or</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='str'>&#39;m4a&#39;</span> <span class='key'>and</span> <span class='nam'>filecodec</span> <span class='op'>==</span> <span class='str'>&#39;aac&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t130' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='str'>&#39;m4a&#39;</span> <span class='key'>and</span> <span class='nam'>filecodec</span> <span class='op'>==</span> <span class='str'>&#39;aac&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Lossless, but in another container</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>acodec</span> <span class='op'>=</span> <span class='str'>&#39;copy&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>extension</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;-bsf:a&#39;</span> <span class='key'>or</span> <span class='str'>&#39;-absf&#39;</span><span class='op'>,</span> <span class='str'>&#39;aac_adtstoasc&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>filecodec</span> <span class='key'>in</span> <span class='op'>[</span><span class='str'>&#39;aac&#39;</span><span class='op'>,</span> <span class='str'>&#39;mp3&#39;</span><span class='op'>,</span> <span class='str'>&#39;vorbis&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Lossless if possible</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>acodec</span> <span class='op'>=</span> <span class='str'>&#39;copy&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>extension</span> <span class='op'>=</span> <span class='nam'>filecodec</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>filecodec</span> <span class='op'>==</span> <span class='str'>&#39;aac&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;-f&#39;</span><span class='op'>,</span> <span class='str'>&#39;adts&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>filecodec</span> <span class='op'>==</span> <span class='str'>&#39;vorbis&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>extension</span> <span class='op'>=</span> <span class='str'>&#39;ogg&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># MP3 otherwise.</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>acodec</span> <span class='op'>=</span> <span class='str'>&#39;libmp3lame&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>extension</span> <span class='op'>=</span> <span class='str'>&#39;mp3&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t147' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span><span class='op'>)</span> <span class='op'>&lt;</span> <span class='num'>10</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>+=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;-q:a&#39;</span> <span class='key'>or</span> <span class='str'>&#39;-aq&#39;</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t152' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>+=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;-b:a&#39;</span> <span class='key'>or</span> <span class='str'>&#39;-ab&#39;</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span> <span class='op'>+</span> <span class='str'>&#39;k&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># We convert the audio (lossy)</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>acodec</span> <span class='op'>=</span> <span class='op'>{</span><span class='str'>&#39;mp3&#39;</span><span class='op'>:</span> <span class='str'>&#39;libmp3lame&#39;</span><span class='op'>,</span> <span class='str'>&#39;aac&#39;</span><span class='op'>:</span> <span class='str'>&#39;aac&#39;</span><span class='op'>,</span> <span class='str'>&#39;m4a&#39;</span><span class='op'>:</span> <span class='str'>&#39;aac&#39;</span><span class='op'>,</span> <span class='str'>&#39;vorbis&#39;</span><span class='op'>:</span> <span class='str'>&#39;libvorbis&#39;</span><span class='op'>,</span> <span class='str'>&#39;wav&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>}</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>extension</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span><span class='op'>)</span> <span class='op'>&lt;</span> <span class='num'>10</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t160' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>+=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;-q:a&#39;</span> <span class='key'>or</span> <span class='str'>&#39;-aq&#39;</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t161' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t162' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>+=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;-b:a&#39;</span> <span class='key'>or</span> <span class='str'>&#39;-ab&#39;</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredquality</span> <span class='op'>+</span> <span class='str'>&#39;k&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t163' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='str'>&#39;aac&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t164' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>+=</span> <span class='op'>[</span><span class='str'>&#39;-f&#39;</span><span class='op'>,</span> <span class='str'>&#39;adts&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t165' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='str'>&#39;m4a&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t166' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>+=</span> <span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;-bsf:a&#39;</span> <span class='key'>or</span> <span class='str'>&#39;-absf&#39;</span><span class='op'>,</span> <span class='str'>&#39;aac_adtstoasc&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t167' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='str'>&#39;vorbis&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t168' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>extension</span> <span class='op'>=</span> <span class='str'>&#39;ogg&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t169' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_preferredcodec</span> <span class='op'>==</span> <span class='str'>&#39;wav&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t170' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>extension</span> <span class='op'>=</span> <span class='str'>&#39;wav&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t171' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>more_opts</span> <span class='op'>+=</span> <span class='op'>[</span><span class='str'>&#39;-f&#39;</span><span class='op'>,</span> <span class='str'>&#39;wav&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t172' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t173' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>sep</span><span class='op'>,</span> <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>path</span><span class='op'>.</span><span class='nam'>rpartition</span><span class='op'>(</span><span class='str'>u&#39;.&#39;</span><span class='op'>)</span> <span class='com'># not os.path.splitext, since the latter does not work on unicode in all setups</span><span class='strut'>&nbsp;</span></p>
<p id='t174' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>new_path</span> <span class='op'>=</span> <span class='nam'>prefix</span> <span class='op'>+</span> <span class='nam'>sep</span> <span class='op'>+</span> <span class='nam'>extension</span><span class='strut'>&nbsp;</span></p>
<p id='t175' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t176' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_nopostoverwrites</span> <span class='key'>and</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>exists</span><span class='op'>(</span><span class='nam'>encodeFilename</span><span class='op'>(</span><span class='nam'>new_path</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t177' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] Post-process file %s exists, skipping&#39;</span> <span class='op'>%</span> <span class='nam'>new_path</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t178' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t179' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[&#39;</span> <span class='op'>+</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;avconv&#39;</span> <span class='key'>or</span> <span class='str'>&#39;ffmpeg&#39;</span><span class='op'>)</span> <span class='op'>+</span> <span class='str'>&#39;] Destination: &#39;</span> <span class='op'>+</span> <span class='nam'>new_path</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t180' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>run_ffmpeg</span><span class='op'>(</span><span class='nam'>path</span><span class='op'>,</span> <span class='nam'>new_path</span><span class='op'>,</span> <span class='nam'>acodec</span><span class='op'>,</span> <span class='nam'>more_opts</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t181' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t182' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>etype</span><span class='op'>,</span><span class='nam'>e</span><span class='op'>,</span><span class='nam'>tb</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>exc_info</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t183' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>e</span><span class='op'>,</span> <span class='nam'>AudioConversionError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t184' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;ERROR: audio conversion failed: &#39;</span> <span class='op'>+</span> <span class='nam'>e</span><span class='op'>.</span><span class='nam'>message</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t185' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t186' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;ERROR: error running &#39;</span> <span class='op'>+</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_exes</span><span class='op'>[</span><span class='str'>&#39;avconv&#39;</span><span class='op'>]</span> <span class='key'>and</span> <span class='str'>&#39;avconv&#39;</span> <span class='key'>or</span> <span class='str'>&#39;ffmpeg&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t187' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t188' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t189' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Try to update the date time for extracted audio file.</span><span class='strut'>&nbsp;</span></p>
<p id='t190' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>information</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;filetime&#39;</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t191' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t192' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>os</span><span class='op'>.</span><span class='nam'>utime</span><span class='op'>(</span><span class='nam'>encodeFilename</span><span class='op'>(</span><span class='nam'>new_path</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>time</span><span class='op'>.</span><span class='nam'>time</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>information</span><span class='op'>[</span><span class='str'>&#39;filetime&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t193' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t194' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: Cannot update utime of audio file&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t195' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t196' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_keepvideo</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t197' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t198' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>os</span><span class='op'>.</span><span class='nam'>remove</span><span class='op'>(</span><span class='nam'>encodeFilename</span><span class='op'>(</span><span class='nam'>path</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t199' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>OSError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t200' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: Unable to remove downloaded video file&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t201' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
<p id='t202' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t203' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>information</span><span class='op'>[</span><span class='str'>&#39;filepath&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>new_path</span><span class='strut'>&nbsp;</span></p>
<p id='t204' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>information</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage/3.6b1'>coverage.py v3.6b1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,402 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for youtube_dl.update: 6%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>youtube_dl.update</b> :
<span class='pc_cov'>6%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
130 statements &nbsp;
<span class='run hide_run shortkey_r button_toggle_run'>8 run</span>
<span class='mis shortkey_m button_toggle_mis'>122 missing</span>
<span class='exc shortkey_x button_toggle_exc'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='stm run hide_run'><a href='#n1'>1</a></p>
<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
<p id='n3' class='stm run hide_run'><a href='#n3'>3</a></p>
<p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
<p id='n5' class='pln'><a href='#n5'>5</a></p>
<p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
<p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
<p id='n8' class='pln'><a href='#n8'>8</a></p>
<p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
<p id='n10' class='stm mis'><a href='#n10'>10</a></p>
<p id='n11' class='stm mis'><a href='#n11'>11</a></p>
<p id='n12' class='stm mis'><a href='#n12'>12</a></p>
<p id='n13' class='stm mis'><a href='#n13'>13</a></p>
<p id='n14' class='stm mis'><a href='#n14'>14</a></p>
<p id='n15' class='stm mis'><a href='#n15'>15</a></p>
<p id='n16' class='stm mis'><a href='#n16'>16</a></p>
<p id='n17' class='stm mis'><a href='#n17'>17</a></p>
<p id='n18' class='stm mis'><a href='#n18'>18</a></p>
<p id='n19' class='stm mis'><a href='#n19'>19</a></p>
<p id='n20' class='stm mis'><a href='#n20'>20</a></p>
<p id='n21' class='stm mis'><a href='#n21'>21</a></p>
<p id='n22' class='stm mis'><a href='#n22'>22</a></p>
<p id='n23' class='stm mis'><a href='#n23'>23</a></p>
<p id='n24' class='stm mis'><a href='#n24'>24</a></p>
<p id='n25' class='stm mis'><a href='#n25'>25</a></p>
<p id='n26' class='stm mis'><a href='#n26'>26</a></p>
<p id='n27' class='stm mis'><a href='#n27'>27</a></p>
<p id='n28' class='stm mis'><a href='#n28'>28</a></p>
<p id='n29' class='stm mis'><a href='#n29'>29</a></p>
<p id='n30' class='stm mis'><a href='#n30'>30</a></p>
<p id='n31' class='stm mis'><a href='#n31'>31</a></p>
<p id='n32' class='stm mis'><a href='#n32'>32</a></p>
<p id='n33' class='stm mis'><a href='#n33'>33</a></p>
<p id='n34' class='stm mis'><a href='#n34'>34</a></p>
<p id='n35' class='stm mis'><a href='#n35'>35</a></p>
<p id='n36' class='pln'><a href='#n36'>36</a></p>
<p id='n37' class='stm run hide_run'><a href='#n37'>37</a></p>
<p id='n38' class='pln'><a href='#n38'>38</a></p>
<p id='n39' class='pln'><a href='#n39'>39</a></p>
<p id='n40' class='stm mis'><a href='#n40'>40</a></p>
<p id='n41' class='stm mis'><a href='#n41'>41</a></p>
<p id='n42' class='stm mis'><a href='#n42'>42</a></p>
<p id='n43' class='stm mis'><a href='#n43'>43</a></p>
<p id='n44' class='pln'><a href='#n44'>44</a></p>
<p id='n45' class='pln'><a href='#n45'>45</a></p>
<p id='n46' class='stm mis'><a href='#n46'>46</a></p>
<p id='n47' class='stm mis'><a href='#n47'>47</a></p>
<p id='n48' class='stm mis'><a href='#n48'>48</a></p>
<p id='n49' class='pln'><a href='#n49'>49</a></p>
<p id='n50' class='pln'><a href='#n50'>50</a></p>
<p id='n51' class='stm mis'><a href='#n51'>51</a></p>
<p id='n52' class='stm mis'><a href='#n52'>52</a></p>
<p id='n53' class='stm mis'><a href='#n53'>53</a></p>
<p id='n54' class='stm mis'><a href='#n54'>54</a></p>
<p id='n55' class='stm mis'><a href='#n55'>55</a></p>
<p id='n56' class='stm mis'><a href='#n56'>56</a></p>
<p id='n57' class='stm mis'><a href='#n57'>57</a></p>
<p id='n58' class='stm mis'><a href='#n58'>58</a></p>
<p id='n59' class='stm mis'><a href='#n59'>59</a></p>
<p id='n60' class='pln'><a href='#n60'>60</a></p>
<p id='n61' class='pln'><a href='#n61'>61</a></p>
<p id='n62' class='stm mis'><a href='#n62'>62</a></p>
<p id='n63' class='stm mis'><a href='#n63'>63</a></p>
<p id='n64' class='stm mis'><a href='#n64'>64</a></p>
<p id='n65' class='stm mis'><a href='#n65'>65</a></p>
<p id='n66' class='stm mis'><a href='#n66'>66</a></p>
<p id='n67' class='stm mis'><a href='#n67'>67</a></p>
<p id='n68' class='stm mis'><a href='#n68'>68</a></p>
<p id='n69' class='stm mis'><a href='#n69'>69</a></p>
<p id='n70' class='stm mis'><a href='#n70'>70</a></p>
<p id='n71' class='stm mis'><a href='#n71'>71</a></p>
<p id='n72' class='stm mis'><a href='#n72'>72</a></p>
<p id='n73' class='stm mis'><a href='#n73'>73</a></p>
<p id='n74' class='stm mis'><a href='#n74'>74</a></p>
<p id='n75' class='stm mis'><a href='#n75'>75</a></p>
<p id='n76' class='stm mis'><a href='#n76'>76</a></p>
<p id='n77' class='pln'><a href='#n77'>77</a></p>
<p id='n78' class='stm mis'><a href='#n78'>78</a></p>
<p id='n79' class='stm mis'><a href='#n79'>79</a></p>
<p id='n80' class='stm mis'><a href='#n80'>80</a></p>
<p id='n81' class='stm mis'><a href='#n81'>81</a></p>
<p id='n82' class='stm mis'><a href='#n82'>82</a></p>
<p id='n83' class='stm mis'><a href='#n83'>83</a></p>
<p id='n84' class='pln'><a href='#n84'>84</a></p>
<p id='n85' class='stm mis'><a href='#n85'>85</a></p>
<p id='n86' class='stm mis'><a href='#n86'>86</a></p>
<p id='n87' class='stm mis'><a href='#n87'>87</a></p>
<p id='n88' class='pln'><a href='#n88'>88</a></p>
<p id='n89' class='pln'><a href='#n89'>89</a></p>
<p id='n90' class='stm mis'><a href='#n90'>90</a></p>
<p id='n91' class='stm mis'><a href='#n91'>91</a></p>
<p id='n92' class='stm mis'><a href='#n92'>92</a></p>
<p id='n93' class='stm mis'><a href='#n93'>93</a></p>
<p id='n94' class='stm mis'><a href='#n94'>94</a></p>
<p id='n95' class='stm mis'><a href='#n95'>95</a></p>
<p id='n96' class='pln'><a href='#n96'>96</a></p>
<p id='n97' class='stm mis'><a href='#n97'>97</a></p>
<p id='n98' class='stm mis'><a href='#n98'>98</a></p>
<p id='n99' class='stm mis'><a href='#n99'>99</a></p>
<p id='n100' class='stm mis'><a href='#n100'>100</a></p>
<p id='n101' class='stm mis'><a href='#n101'>101</a></p>
<p id='n102' class='stm mis'><a href='#n102'>102</a></p>
<p id='n103' class='stm mis'><a href='#n103'>103</a></p>
<p id='n104' class='stm mis'><a href='#n104'>104</a></p>
<p id='n105' class='pln'><a href='#n105'>105</a></p>
<p id='n106' class='stm mis'><a href='#n106'>106</a></p>
<p id='n107' class='stm mis'><a href='#n107'>107</a></p>
<p id='n108' class='stm mis'><a href='#n108'>108</a></p>
<p id='n109' class='stm mis'><a href='#n109'>109</a></p>
<p id='n110' class='pln'><a href='#n110'>110</a></p>
<p id='n111' class='stm mis'><a href='#n111'>111</a></p>
<p id='n112' class='stm mis'><a href='#n112'>112</a></p>
<p id='n113' class='stm mis'><a href='#n113'>113</a></p>
<p id='n114' class='stm mis'><a href='#n114'>114</a></p>
<p id='n115' class='stm mis'><a href='#n115'>115</a></p>
<p id='n116' class='stm mis'><a href='#n116'>116</a></p>
<p id='n117' class='stm mis'><a href='#n117'>117</a></p>
<p id='n118' class='pln'><a href='#n118'>118</a></p>
<p id='n119' class='stm mis'><a href='#n119'>119</a></p>
<p id='n120' class='stm mis'><a href='#n120'>120</a></p>
<p id='n121' class='stm mis'><a href='#n121'>121</a></p>
<p id='n122' class='stm mis'><a href='#n122'>122</a></p>
<p id='n123' class='pln'><a href='#n123'>123</a></p>
<p id='n124' class='pln'><a href='#n124'>124</a></p>
<p id='n125' class='pln'><a href='#n125'>125</a></p>
<p id='n126' class='pln'><a href='#n126'>126</a></p>
<p id='n127' class='pln'><a href='#n127'>127</a></p>
<p id='n128' class='stm mis'><a href='#n128'>128</a></p>
<p id='n129' class='pln'><a href='#n129'>129</a></p>
<p id='n130' class='stm mis'><a href='#n130'>130</a></p>
<p id='n131' class='stm mis'><a href='#n131'>131</a></p>
<p id='n132' class='stm mis'><a href='#n132'>132</a></p>
<p id='n133' class='stm mis'><a href='#n133'>133</a></p>
<p id='n134' class='stm mis'><a href='#n134'>134</a></p>
<p id='n135' class='pln'><a href='#n135'>135</a></p>
<p id='n136' class='pln'><a href='#n136'>136</a></p>
<p id='n137' class='stm mis'><a href='#n137'>137</a></p>
<p id='n138' class='stm mis'><a href='#n138'>138</a></p>
<p id='n139' class='stm mis'><a href='#n139'>139</a></p>
<p id='n140' class='stm mis'><a href='#n140'>140</a></p>
<p id='n141' class='stm mis'><a href='#n141'>141</a></p>
<p id='n142' class='stm mis'><a href='#n142'>142</a></p>
<p id='n143' class='stm mis'><a href='#n143'>143</a></p>
<p id='n144' class='stm mis'><a href='#n144'>144</a></p>
<p id='n145' class='stm mis'><a href='#n145'>145</a></p>
<p id='n146' class='pln'><a href='#n146'>146</a></p>
<p id='n147' class='stm mis'><a href='#n147'>147</a></p>
<p id='n148' class='stm mis'><a href='#n148'>148</a></p>
<p id='n149' class='stm mis'><a href='#n149'>149</a></p>
<p id='n150' class='stm mis'><a href='#n150'>150</a></p>
<p id='n151' class='pln'><a href='#n151'>151</a></p>
<p id='n152' class='stm mis'><a href='#n152'>152</a></p>
<p id='n153' class='stm mis'><a href='#n153'>153</a></p>
<p id='n154' class='stm mis'><a href='#n154'>154</a></p>
<p id='n155' class='stm mis'><a href='#n155'>155</a></p>
<p id='n156' class='stm mis'><a href='#n156'>156</a></p>
<p id='n157' class='stm mis'><a href='#n157'>157</a></p>
<p id='n158' class='stm mis'><a href='#n158'>158</a></p>
<p id='n159' class='pln'><a href='#n159'>159</a></p>
<p id='n160' class='stm mis'><a href='#n160'>160</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>json</span><span class='strut'>&nbsp;</span></p>
<p id='t2' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>traceback</span><span class='strut'>&nbsp;</span></p>
<p id='t3' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>hashlib</span><span class='strut'>&nbsp;</span></p>
<p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>zipimport</span> <span class='key'>import</span> <span class='nam'>zipimporter</span><span class='strut'>&nbsp;</span></p>
<p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t6' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>utils</span> <span class='key'>import</span> <span class='op'>*</span><span class='strut'>&nbsp;</span></p>
<p id='t7' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>version</span> <span class='key'>import</span> <span class='nam'>__version__</span><span class='strut'>&nbsp;</span></p>
<p id='t8' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t9' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>rsa_verify</span><span class='op'>(</span><span class='nam'>message</span><span class='op'>,</span> <span class='nam'>signature</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t10' class='stm mis'>&nbsp; &nbsp; <span class='key'>from</span> <span class='nam'>struct</span> <span class='key'>import</span> <span class='nam'>pack</span><span class='strut'>&nbsp;</span></p>
<p id='t11' class='stm mis'>&nbsp; &nbsp; <span class='key'>from</span> <span class='nam'>hashlib</span> <span class='key'>import</span> <span class='nam'>sha256</span><span class='strut'>&nbsp;</span></p>
<p id='t12' class='stm mis'>&nbsp; &nbsp; <span class='key'>from</span> <span class='nam'>sys</span> <span class='key'>import</span> <span class='nam'>version_info</span><span class='strut'>&nbsp;</span></p>
<p id='t13' class='stm mis'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>b</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t14' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>version_info</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>==</span> <span class='num'>2</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>x</span><span class='strut'>&nbsp;</span></p>
<p id='t15' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>x</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>&#39;latin1&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t16' class='stm mis'>&nbsp; &nbsp; <span class='key'>assert</span><span class='op'>(</span><span class='nam'>type</span><span class='op'>(</span><span class='nam'>message</span><span class='op'>)</span> <span class='op'>==</span> <span class='nam'>type</span><span class='op'>(</span><span class='nam'>b</span><span class='op'>(</span><span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t17' class='stm mis'>&nbsp; &nbsp; <span class='nam'>block_size</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'>&nbsp;</span></p>
<p id='t18' class='stm mis'>&nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>=</span> <span class='nam'>key</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t19' class='stm mis'>&nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>n</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t20' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>block_size</span> <span class='op'>+=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
<p id='t21' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>&gt;&gt;=</span> <span class='num'>8</span><span class='strut'>&nbsp;</span></p>
<p id='t22' class='stm mis'>&nbsp; &nbsp; <span class='nam'>signature</span> <span class='op'>=</span> <span class='nam'>pow</span><span class='op'>(</span><span class='nam'>int</span><span class='op'>(</span><span class='nam'>signature</span><span class='op'>,</span> <span class='num'>16</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t23' class='stm mis'>&nbsp; &nbsp; <span class='nam'>raw_bytes</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t24' class='stm mis'>&nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>signature</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t25' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>raw_bytes</span><span class='op'>.</span><span class='nam'>insert</span><span class='op'>(</span><span class='num'>0</span><span class='op'>,</span> <span class='nam'>pack</span><span class='op'>(</span><span class='str'>&quot;B&quot;</span><span class='op'>,</span> <span class='nam'>signature</span> <span class='op'>&amp;</span> <span class='num'>0xFF</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t26' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>signature</span> <span class='op'>&gt;&gt;=</span> <span class='num'>8</span><span class='strut'>&nbsp;</span></p>
<p id='t27' class='stm mis'>&nbsp; &nbsp; <span class='nam'>signature</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>block_size</span> <span class='op'>-</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>raw_bytes</span><span class='op'>)</span><span class='op'>)</span> <span class='op'>*</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>&#39;\x00&#39;</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>raw_bytes</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t28' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>signature</span><span class='op'>[</span><span class='num'>0</span><span class='op'>:</span><span class='num'>2</span><span class='op'>]</span> <span class='op'>!=</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>&#39;\x00\x01&#39;</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t29' class='stm mis'>&nbsp; &nbsp; <span class='nam'>signature</span> <span class='op'>=</span> <span class='nam'>signature</span><span class='op'>[</span><span class='num'>2</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t30' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>b</span><span class='op'>(</span><span class='str'>&#39;\x00&#39;</span><span class='op'>)</span> <span class='key'>in</span> <span class='nam'>signature</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t31' class='stm mis'>&nbsp; &nbsp; <span class='nam'>signature</span> <span class='op'>=</span> <span class='nam'>signature</span><span class='op'>[</span><span class='nam'>signature</span><span class='op'>.</span><span class='nam'>index</span><span class='op'>(</span><span class='nam'>b</span><span class='op'>(</span><span class='str'>&#39;\x00&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>+</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t32' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>signature</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='nam'>b</span><span class='op'>(</span><span class='str'>&#39;\x30\x31\x30\x0D\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t33' class='stm mis'>&nbsp; &nbsp; <span class='nam'>signature</span> <span class='op'>=</span> <span class='nam'>signature</span><span class='op'>[</span><span class='num'>19</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t34' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>signature</span> <span class='op'>!=</span> <span class='nam'>sha256</span><span class='op'>(</span><span class='nam'>message</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>digest</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
<p id='t35' class='stm mis'>&nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
<p id='t36' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t37' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>update_self</span><span class='op'>(</span><span class='nam'>to_screen</span><span class='op'>,</span> <span class='nam'>verbose</span><span class='op'>,</span> <span class='nam'>filename</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t38' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Update the program file with the latest version from the repository&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t39' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t40' class='stm mis'>&nbsp; &nbsp; <span class='nam'>UPDATE_URL</span> <span class='op'>=</span> <span class='str'>&quot;http://rg3.github.com/youtube-dl/update/&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t41' class='stm mis'>&nbsp; &nbsp; <span class='nam'>VERSION_URL</span> <span class='op'>=</span> <span class='nam'>UPDATE_URL</span> <span class='op'>+</span> <span class='str'>&#39;LATEST_VERSION&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t42' class='stm mis'>&nbsp; &nbsp; <span class='nam'>JSON_URL</span> <span class='op'>=</span> <span class='nam'>UPDATE_URL</span> <span class='op'>+</span> <span class='str'>&#39;versions.json&#39;</span><span class='strut'>&nbsp;</span></p>
<p id='t43' class='stm mis'>&nbsp; &nbsp; <span class='nam'>UPDATES_RSA_KEY</span> <span class='op'>=</span> <span class='op'>(</span><span class='num'>0x9d60ee4d8f805312fdb15a62f87b95bd66177b91df176765d13514a0f1754bcd2057295c5b6f1d35daa6742c3ffc9a82d3e118861c207995a8031e151d863c9927e304576bc80692bc8e094896fcf11b66f3e29e04e3a71e9a11558558acea1840aec37fc396fb6b65dc81a1c4144e03bd1c011de62e3f1357b327d08426fe93</span><span class='op'>,</span> <span class='num'>65537</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t44' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t45' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t46' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>globals</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;__loader__&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>zipimporter</span><span class='op'>)</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>sys</span><span class='op'>,</span> <span class='str'>&quot;frozen&quot;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t47' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;It looks like you installed youtube-dl with pip, setup.py or a tarball. Please use that to update.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t48' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t49' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t50' class='pln'>&nbsp; &nbsp; <span class='com'># Check if there is a new version</span><span class='strut'>&nbsp;</span></p>
<p id='t51' class='stm mis'>&nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t52' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newversion</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>VERSION_URL</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t53' class='stm mis'>&nbsp; &nbsp; <span class='key'>except</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t54' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>verbose</span><span class='op'>:</span> <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>format_exc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t55' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: can\&#39;t find the current version. Please try again later.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t56' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t57' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>newversion</span> <span class='op'>==</span> <span class='nam'>__version__</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t58' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;youtube-dl is up-to-date (&#39;</span> <span class='op'>+</span> <span class='nam'>__version__</span> <span class='op'>+</span> <span class='str'>&#39;)&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t59' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t60' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t61' class='pln'>&nbsp; &nbsp; <span class='com'># Download and check versions info</span><span class='strut'>&nbsp;</span></p>
<p id='t62' class='stm mis'>&nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t63' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>versions_info</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>JSON_URL</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t64' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>versions_info</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>versions_info</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t65' class='stm mis'>&nbsp; &nbsp; <span class='key'>except</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t66' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>verbose</span><span class='op'>:</span> <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>format_exc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t67' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: can\&#39;t obtain versions info. Please try again later.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t68' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t69' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='str'>&#39;signature&#39;</span> <span class='key'>in</span> <span class='nam'>versions_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t70' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: the versions file is not signed or corrupted. Aborting.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t71' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t72' class='stm mis'>&nbsp; &nbsp; <span class='nam'>signature</span> <span class='op'>=</span> <span class='nam'>versions_info</span><span class='op'>[</span><span class='str'>&#39;signature&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t73' class='stm mis'>&nbsp; &nbsp; <span class='key'>del</span> <span class='nam'>versions_info</span><span class='op'>[</span><span class='str'>&#39;signature&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t74' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>rsa_verify</span><span class='op'>(</span><span class='nam'>json</span><span class='op'>.</span><span class='nam'>dumps</span><span class='op'>(</span><span class='nam'>versions_info</span><span class='op'>,</span> <span class='nam'>sort_keys</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>signature</span><span class='op'>,</span> <span class='nam'>UPDATES_RSA_KEY</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t75' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: the versions file signature is invalid. Aborting.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t76' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t77' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t78' class='stm mis'>&nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;Updating to version &#39;</span> <span class='op'>+</span> <span class='nam'>versions_info</span><span class='op'>[</span><span class='str'>&#39;latest&#39;</span><span class='op'>]</span> <span class='op'>+</span> <span class='str'>&#39;...&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t79' class='stm mis'>&nbsp; &nbsp; <span class='nam'>version</span> <span class='op'>=</span> <span class='nam'>versions_info</span><span class='op'>[</span><span class='str'>&#39;versions&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>versions_info</span><span class='op'>[</span><span class='str'>&#39;latest&#39;</span><span class='op'>]</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
<p id='t80' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>version</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;notes&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t81' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;PLEASE NOTE:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t82' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>note</span> <span class='key'>in</span> <span class='nam'>version</span><span class='op'>[</span><span class='str'>&#39;notes&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t83' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>note</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t84' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t85' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>filename</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t86' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: no write permissions on %s&#39;</span> <span class='op'>%</span> <span class='nam'>filename</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t87' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t88' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t89' class='pln'>&nbsp; &nbsp; <span class='com'># Py2EXE</span><span class='strut'>&nbsp;</span></p>
<p id='t90' class='stm mis'>&nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>hasattr</span><span class='op'>(</span><span class='nam'>sys</span><span class='op'>,</span> <span class='str'>&quot;frozen&quot;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t91' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>exe</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>abspath</span><span class='op'>(</span><span class='nam'>filename</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t92' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>directory</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>exe</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t93' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>directory</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t94' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: no write permissions on %s&#39;</span> <span class='op'>%</span> <span class='nam'>directory</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t95' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t96' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t97' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t98' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlh</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>version</span><span class='op'>[</span><span class='str'>&#39;exe&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t99' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newcontent</span> <span class='op'>=</span> <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t100' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t101' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>OSError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t102' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>verbose</span><span class='op'>:</span> <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>format_exc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t103' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download latest version&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t104' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t105' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t106' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newcontent_hash</span> <span class='op'>=</span> <span class='nam'>hashlib</span><span class='op'>.</span><span class='nam'>sha256</span><span class='op'>(</span><span class='nam'>newcontent</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t107' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>newcontent_hash</span> <span class='op'>!=</span> <span class='nam'>version</span><span class='op'>[</span><span class='str'>&#39;exe&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t108' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: the downloaded file hash does not match. Aborting.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t109' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t110' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t111' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t112' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>with</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>exe</span> <span class='op'>+</span> <span class='str'>&#39;.new&#39;</span><span class='op'>,</span> <span class='str'>&#39;wb&#39;</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>outf</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t113' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>outf</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>newcontent</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t114' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>OSError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t115' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>verbose</span><span class='op'>:</span> <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>format_exc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t116' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to write the new version&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t117' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t118' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t119' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t120' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>bat</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>directory</span><span class='op'>,</span> <span class='str'>&#39;youtube-dl-updater.bat&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t121' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>b</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>bat</span><span class='op'>,</span> <span class='str'>&#39;w&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t122' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>b</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t123' class='pln'><span class='str'>echo Updating youtube-dl...</span><span class='strut'>&nbsp;</span></p>
<p id='t124' class='pln'><span class='str'>ping 127.0.0.1 -n 5 -w 1000 &gt; NUL</span><span class='strut'>&nbsp;</span></p>
<p id='t125' class='pln'><span class='str'>move /Y &quot;%s.new&quot; &quot;%s&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t126' class='pln'><span class='str'>del &quot;%s&quot;</span><span class='strut'>&nbsp;</span></p>
<p id='t127' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \n&quot;&quot;&quot;</span> <span class='op'>%</span><span class='op'>(</span><span class='nam'>exe</span><span class='op'>,</span> <span class='nam'>exe</span><span class='op'>,</span> <span class='nam'>bat</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t128' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>b</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t129' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t130' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>os</span><span class='op'>.</span><span class='nam'>startfile</span><span class='op'>(</span><span class='nam'>bat</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t131' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>OSError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t132' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>verbose</span><span class='op'>:</span> <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>format_exc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t133' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to overwrite current version&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t134' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t135' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t136' class='pln'>&nbsp; &nbsp; <span class='com'># Zip unix package</span><span class='strut'>&nbsp;</span></p>
<p id='t137' class='stm mis'>&nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>globals</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;__loader__&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>zipimporter</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t138' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t139' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlh</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>version</span><span class='op'>[</span><span class='str'>&#39;bin&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t140' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newcontent</span> <span class='op'>=</span> <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t141' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t142' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>OSError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t143' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>verbose</span><span class='op'>:</span> <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>format_exc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t144' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download latest version&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t145' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t146' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t147' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newcontent_hash</span> <span class='op'>=</span> <span class='nam'>hashlib</span><span class='op'>.</span><span class='nam'>sha256</span><span class='op'>(</span><span class='nam'>newcontent</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t148' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>newcontent_hash</span> <span class='op'>!=</span> <span class='nam'>version</span><span class='op'>[</span><span class='str'>&#39;bin&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t149' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: the downloaded file hash does not match. Aborting.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t150' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t151' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t152' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t153' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>with</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>filename</span><span class='op'>,</span> <span class='str'>&#39;wb&#39;</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>outf</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t154' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>outf</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>newcontent</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t155' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>OSError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
<p id='t156' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>verbose</span><span class='op'>:</span> <span class='nam'>to_screen</span><span class='op'>(</span><span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>format_exc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t157' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to overwrite current version&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
<p id='t158' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
<p id='t159' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t160' class='stm mis'>&nbsp; &nbsp; <span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;Updated youtube-dl. Restart youtube-dl to use the new version.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage/3.6b1'>coverage.py v3.6b1</a>
</p>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,86 @@
<!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
<title>Coverage for youtube_dl.version: 100%</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script type='text/javascript' src='jquery-1.4.3.min.js'></script>
<script type='text/javascript' src='jquery.hotkeys.js'></script>
<script type='text/javascript' src='jquery.isonscreen.js'></script>
<script type='text/javascript' src='coverage_html.js'></script>
<script type='text/javascript' charset='utf-8'>
jQuery(document).ready(coverage.pyfile_ready);
</script>
</head>
<body id='pyfile'>
<div id='header'>
<div class='content'>
<h1>Coverage for <b>youtube_dl.version</b> :
<span class='pc_cov'>100%</span>
</h1>
<img id='keyboard_icon' src='keybd_closed.png'>
<h2 class='stats'>
1 statements &nbsp;
<span class='run hide_run shortkey_r button_toggle_run'>1 run</span>
<span class='mis shortkey_m button_toggle_mis'>0 missing</span>
<span class='exc shortkey_x button_toggle_exc'>0 excluded</span>
</h2>
</div>
</div>
<div class='help_panel'>
<img id='panel_icon' src='keybd_open.png'>
<p class='legend'>Hot-keys on this page</p>
<div>
<p class='keyhelp'>
<span class='key'>r</span>
<span class='key'>m</span>
<span class='key'>x</span>
<span class='key'>p</span> &nbsp; toggle line displays
</p>
<p class='keyhelp'>
<span class='key'>j</span>
<span class='key'>k</span> &nbsp; next/prev highlighted chunk
</p>
<p class='keyhelp'>
<span class='key'>0</span> &nbsp; (zero) top of page
</p>
<p class='keyhelp'>
<span class='key'>1</span> &nbsp; (one) first highlighted chunk
</p>
</div>
</div>
<div id='source'>
<table cellspacing='0' cellpadding='0'>
<tr>
<td class='linenos' valign='top'>
<p id='n1' class='pln'><a href='#n1'>1</a></p>
<p id='n2' class='stm run hide_run'><a href='#n2'>2</a></p>
</td>
<td class='text' valign='top'>
<p id='t1' class='pln'><span class='strut'>&nbsp;</span></p>
<p id='t2' class='stm run hide_run'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>&#39;2012.12.11&#39;</span><span class='strut'>&nbsp;</span></p>
</td>
</tr>
</table>
</div>
<div id='footer'>
<div class='content'>
<p>
<a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage/3.6b1'>coverage.py v3.6b1</a>
</p>
</div>
</div>
</body>
</html>

View File

@ -1 +1 @@
2012.12.11
2013.01.02

View File

@ -1,6 +1,6 @@
{
"latest": "2012.12.11",
"signature": "181a8ff9c3f3ced3dc3b72af69e0fa21e5d8adcfee3beb6fd2ad6d66a7131bc4d6f6e322a88506182755918fef59b0e24169cbe36ae017ebcbc5dd60388087eaf01517820804400f1c3640113ed2fbe3915b27d38b7e6330437fe689d158183bbf660ab2a8a017b8a2048442ff2ba62f590c45af83e06525c0e03c084355584d",
"latest": "2013.01.02",
"signature": "1579240235883d0b2ac02616e38bb4281697a15b832a6f5c65e4381c4d05a617d300665e39367881f72f7903418ea536e10bd4c66d8ed35ac190aa987e75d0332a11d496277882ddbbeced0f0247f5c0c84d014e7bd3cacad694715310f8c159e1fe7373eb5835a7b60c8ac7efb7915f979cdd3ca56fa92937e69b7b79f09611",
"versions": {
"2012.12.11": {
"bin": [
@ -15,6 +15,20 @@
"http://youtube-dl.org/downloads/2012.12.11/youtube-dl-2012.12.11.tar.gz",
"b6d259c60fefba76701ea0ea7b34c99169fc2644ce1d89ad10213a70d11ffb0f"
]
},
"2013.01.02": {
"bin": [
"http://youtube-dl.org/downloads/2013.01.02/youtube-dl",
"f5b502f8aaa77675c4884938b1e4871ebca2611813a0c0e74f60c0fbd6dcca6b"
],
"exe": [
"http://youtube-dl.org/downloads/2013.01.02/youtube-dl.exe",
"75fa89d2ce297d102ff27675aa9d92545bbc91013f52ec52868c069f4f9f0422"
],
"tar": [
"http://youtube-dl.org/downloads/2013.01.02/youtube-dl-2013.01.02.tar.gz",
"6a66d022ac8e1c13da284036288a133ec8dba003b7bd3a5179d0c0daca8c8196"
]
}
}
}