Commit c9c3f16d5db8b4ec94b7ef167989aa6919b17b04

Authored by thubert
1 parent 787d9fce

ajout du code source de la page web

www/.index.html.swo 0 โ†’ 100755
No preview for this file type
www/.index.html.swp 0 โ†’ 100755
No preview for this file type
www/Design_web_final.css 0 โ†’ 100755
... ... @@ -0,0 +1,98 @@
  1 +body
  2 +{
  3 + background-image:radial-gradient(circle,white,black);
  4 + padding: 150px;
  5 + margin: 0px;
  6 +}
  7 +.element {
  8 + -webkit-transition-duration: 0.4s;
  9 + transition-duration: 0.4s;
  10 + color:black;
  11 + background-color: white;
  12 + border: solid blue;
  13 + border-radius: 10px;
  14 + margin-left: 20px;
  15 + margin-right: 20px;
  16 +
  17 +
  18 +}
  19 +.element:hover {
  20 +
  21 + background-color: white;
  22 + border: solid black;
  23 +
  24 +
  25 +}
  26 +
  27 +#vetb
  28 +{
  29 + display:flex;
  30 + justify-content: space-around;
  31 + align-items:center;
  32 + margin-top: 50px;
  33 +
  34 +
  35 +}
  36 +
  37 +#btous
  38 +{
  39 + display:flex;
  40 + justify-content: space-around;
  41 + align-items:center;
  42 + height:150px;
  43 + flex-direction: column;
  44 + border:solid black;
  45 + animation-duration: 0.5s;
  46 + animation-direction: alternate;
  47 + animation-iteration-count: infinite;
  48 + animation-name: bord_bouton;
  49 +
  50 +
  51 +}
  52 +
  53 +#bgdh
  54 +{
  55 + display:flex;
  56 +
  57 + justify-content: space-between;
  58 + align-items:center;
  59 + height:100px;
  60 +
  61 +
  62 +}
  63 +
  64 +.t
  65 +{
  66 + animation-duration: 0.5s ;
  67 + animation-direction: alternate;
  68 + animation-iteration-count: infinite;
  69 + animation-name: bord_video;
  70 +}
  71 +
  72 +p
  73 +{
  74 + color:white;
  75 +}
  76 +
  77 +
  78 +@keyframes bord_bouton
  79 +{
  80 + from{
  81 + border: 5px solid yellow;
  82 + }
  83 + to{
  84 +
  85 + border: 5px solid red;
  86 + }
  87 +
  88 +}
  89 +
  90 +@keyframes bord_video
  91 +{
  92 + from{
  93 + border:5px solid purple;
  94 + }
  95 + to{
  96 + border:5px solid pink;
  97 + }
  98 +}
0 99 \ No newline at end of file
... ...
www/fleche_bas2.jpg 0 โ†’ 100755

15.6 KB

www/fleche_droite2.jpg 0 โ†’ 100755

13.7 KB

www/fleche_gauche2.jpg 0 โ†’ 100755

15.6 KB

www/fleche_haut2.jpg 0 โ†’ 100755

14.4 KB

www/index.html 0 โ†’ 100755
... ... @@ -0,0 +1,90 @@
  1 +<html>
  2 + <head>
  3 + <link rel="stylesheet" href="Design_web_final.css" />
  4 + <title>
  5 + Projet SC IMA3 2017 : P4
  6 + </title>
  7 + <script src="jquery.js"></script>
  8 + <script type="text/javascript">
  9 + window.WebSocket=(window.WebSocket||window.MozWebSocket);
  10 +
  11 + var websocket=new WebSocket('ws://localhost:9000','myprotocol');
  12 +
  13 + websocket.onopen=function(){ $('h1').css('color','green'); };
  14 +
  15 + websocket.onerror=function(){ $('h1').css('color','red'); };
  16 +
  17 + websocket.onmessage=function(message){
  18 + console.log(message.data);
  19 + $('#messages').append($('<p>',{ text: message.data }));
  20 + };
  21 +
  22 + function sendhaut(){
  23 + websocket.send('h');
  24 + }
  25 + function senddroite(){
  26 + websocket.send('d');
  27 + }
  28 + function sendbas(){
  29 + websocket.send('b');
  30 + }
  31 + function sendgauche(){
  32 + websocket.send('g');
  33 + }
  34 + function sendup(){
  35 + websocket.send('u')
  36 + }
  37 + </script>
  38 + </head>
  39 + <body onkeydown="if(event.keycode==38)sendhaut()"
  40 + onkeyup="if(event.keycode==38)sendup()">
  41 + <center>
  42 + <h1>
  43 + Projet SC IMA3 | Groupe 4 : Camera IP
  44 + </h1>
  45 + </center>
  46 + <div id="vetb"> <!-- video + boutons -->
  47 + <div>
  48 + <center>
  49 + <img src="http://localhost:8081/?action=stream" /><!-- Pour afficher en streaming -->
  50 + </center>
  51 + </div>
  52 + <div id="btous"> <!-- boutons -->
  53 + <div id="bgdh"> <!-- boutons gauche droite haut -->
  54 + <div>
  55 + <button class="element" onmousedown="sendgauche()" onmouseup="sendup()" alt="" style="background:white;">
  56 + <img src="fleche_gauche2.jpg" style="width:50px;">
  57 + </button>
  58 + </div>
  59 + <div>
  60 + <button class="element" onmousedown="sendhaut()" onmouseup="sendup()" alt="" style="background:white;">
  61 + <img src="fleche_haut2.jpg" style="width:50px;">
  62 + </button>
  63 +
  64 + </div>
  65 + <div>
  66 + <button class="element" onmousedown="senddroite()" onmouseup="sendup()" alt="" style="background:white;">
  67 + <img src="fleche_droite2.jpg" style="width:50px;">
  68 + </button>
  69 + </div>
  70 + </div>
  71 + <div><!-- bouton bas -->
  72 +
  73 + <button class="element" onmousedown="sendbas()" onmouseup="sendup()" alt="" style="background:white;">
  74 + <img src="fleche_bas2.jpg" style="width:50px;">
  75 + </button>
  76 +
  77 + </div>
  78 +
  79 + </div>
  80 +
  81 + </div>
  82 + <p>
  83 + Carlier Henri<br>
  84 + Djeraba Taky<br>
  85 + Boens Quentin<br>
  86 + Hubert Thomas
  87 + </p>
  88 +
  89 +
  90 +</html>
... ...
www/index.html~ 0 โ†’ 100755
... ... @@ -0,0 +1,90 @@
  1 +<html>
  2 + <head>
  3 + <link rel="stylesheet" href="Design_web_final.css" />
  4 + <title>
  5 + Projet SC IMA3 2017 : P4
  6 + </title>
  7 + <script src="jquery.js"></script>
  8 + <script type="text/javascript">
  9 + window.WebSocket=(window.WebSocket||window.MozWebSocket);
  10 +
  11 + var websocket=new WebSocket('ws://localhost:9000','myprotocol');
  12 +
  13 + websocket.onopen=function(){ $('h1').css('color','green'); };
  14 +
  15 + websocket.onerror=function(){ $('h1').css('color','red'); };
  16 +
  17 + websocket.onmessage=function(message){
  18 + console.log(message.data);
  19 + $('#messages').append($('<p>',{ text: message.data }));
  20 + };
  21 +
  22 + function sendhaut(){
  23 + websocket.send('h');
  24 + }
  25 + function senddroite(){
  26 + websocket.send('d');
  27 + }
  28 + function sendbas(){
  29 + websocket.send('b');
  30 + }
  31 + function sendgauche(){
  32 + websocket.send('g');
  33 + }
  34 + function sendup(){
  35 + websocket.send('u')
  36 + }
  37 + </script>
  38 + </head>
  39 + <body onkeydown="if(event.keycode==38)sendhaut()"
  40 + onkeyup="if(event.keycode==38)sendup()">
  41 + <center>
  42 + <h1>
  43 + Projet SC IMA3 | Groupe 4 : Camera IP
  44 + </h1>
  45 + </center>
  46 + <div id="vetb"> <!-- video + boutons -->
  47 + <div>
  48 + <center>
  49 + <img src="http://192.168.2.20:8081/?action=stream" /><!-- Pour afficher en streaming -->
  50 + </center>
  51 + </div>
  52 + <div id="btous"> <!-- boutons -->
  53 + <div id="bgdh"> <!-- boutons gauche droite haut -->
  54 + <div>
  55 + <button class="element" onmousedown="sendgauche()" onmouseup="sendup()" alt="" style="background:white;">
  56 + <img src="fleche_gauche2.jpg" style="width:50px;">
  57 + </button>
  58 + </div>
  59 + <div>
  60 + <button class="element" onmousedown="sendhaut()" onmouseup="sendup()" alt="" style="background:white;">
  61 + <img src="fleche_haut2.jpg" style="width:50px;">
  62 + </button>
  63 +
  64 + </div>
  65 + <div>
  66 + <button class="element" onmousedown="senddroite()" onmouseup="sendup()" alt="" style="background:white;">
  67 + <img src="fleche_droite2.jpg" style="width:50px;">
  68 + </button>
  69 + </div>
  70 + </div>
  71 + <div><!-- bouton bas -->
  72 +
  73 + <button class="element" onmousedown="sendbas()" onmouseup="sendup()" alt="" style="background:white;">
  74 + <img src="fleche_bas2.jpg" style="width:50px;">
  75 + </button>
  76 +
  77 + </div>
  78 +
  79 + </div>
  80 +
  81 + </div>
  82 + <p>
  83 + Carlier Henri<br>
  84 + Djeraba Taky<br>
  85 + Boens Quentin<br>
  86 + Hubert Thomas
  87 + </p>
  88 +
  89 +
  90 +</html>
... ...
www/jquery.js 0 โ†’ 100755
Changes suppressed. Click to show
... ... @@ -0,0 +1,10244 @@
  1 +/*!
  2 + * jQuery JavaScript Library v3.2.0
  3 + * https://jquery.com/
  4 + *
  5 + * Includes Sizzle.js
  6 + * https://sizzlejs.com/
  7 + *
  8 + * Copyright JS Foundation and other contributors
  9 + * Released under the MIT license
  10 + * https://jquery.org/license
  11 + *
  12 + * Date: 2017-03-16T21:26Z
  13 + */
  14 +( function( global, factory ) {
  15 +
  16 + "use strict";
  17 +
  18 + if ( typeof module === "object" && typeof module.exports === "object" ) {
  19 +
  20 + // For CommonJS and CommonJS-like environments where a proper `window`
  21 + // is present, execute the factory and get jQuery.
  22 + // For environments that do not have a `window` with a `document`
  23 + // (such as Node.js), expose a factory as module.exports.
  24 + // This accentuates the need for the creation of a real `window`.
  25 + // e.g. var jQuery = require("jquery")(window);
  26 + // See ticket #14549 for more info.
  27 + module.exports = global.document ?
  28 + factory( global, true ) :
  29 + function( w ) {
  30 + if ( !w.document ) {
  31 + throw new Error( "jQuery requires a window with a document" );
  32 + }
  33 + return factory( w );
  34 + };
  35 + } else {
  36 + factory( global );
  37 + }
  38 +
  39 +// Pass this if window is not defined yet
  40 +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
  41 +
  42 +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
  43 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
  44 +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
  45 +// enough that all such attempts are guarded in a try block.
  46 +"use strict";
  47 +
  48 +var arr = [];
  49 +
  50 +var document = window.document;
  51 +
  52 +var getProto = Object.getPrototypeOf;
  53 +
  54 +var slice = arr.slice;
  55 +
  56 +var concat = arr.concat;
  57 +
  58 +var push = arr.push;
  59 +
  60 +var indexOf = arr.indexOf;
  61 +
  62 +var class2type = {};
  63 +
  64 +var toString = class2type.toString;
  65 +
  66 +var hasOwn = class2type.hasOwnProperty;
  67 +
  68 +var fnToString = hasOwn.toString;
  69 +
  70 +var ObjectFunctionString = fnToString.call( Object );
  71 +
  72 +var support = {};
  73 +
  74 +
  75 +
  76 + function DOMEval( code, doc ) {
  77 + doc = doc || document;
  78 +
  79 + var script = doc.createElement( "script" );
  80 +
  81 + script.text = code;
  82 + doc.head.appendChild( script ).parentNode.removeChild( script );
  83 + }
  84 +/* global Symbol */
  85 +// Defining this global in .eslintrc.json would create a danger of using the global
  86 +// unguarded in another place, it seems safer to define global only for this module
  87 +
  88 +
  89 +
  90 +var
  91 + version = "3.2.0",
  92 +
  93 + // Define a local copy of jQuery
  94 + jQuery = function( selector, context ) {
  95 +
  96 + // The jQuery object is actually just the init constructor 'enhanced'
  97 + // Need init if jQuery is called (just allow error to be thrown if not included)
  98 + return new jQuery.fn.init( selector, context );
  99 + },
  100 +
  101 + // Support: Android <=4.0 only
  102 + // Make sure we trim BOM and NBSP
  103 + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
  104 +
  105 + // Matches dashed string for camelizing
  106 + rmsPrefix = /^-ms-/,
  107 + rdashAlpha = /-([a-z])/g,
  108 +
  109 + // Used by jQuery.camelCase as callback to replace()
  110 + fcamelCase = function( all, letter ) {
  111 + return letter.toUpperCase();
  112 + };
  113 +
  114 +jQuery.fn = jQuery.prototype = {
  115 +
  116 + // The current version of jQuery being used
  117 + jquery: version,
  118 +
  119 + constructor: jQuery,
  120 +
  121 + // The default length of a jQuery object is 0
  122 + length: 0,
  123 +
  124 + toArray: function() {
  125 + return slice.call( this );
  126 + },
  127 +
  128 + // Get the Nth element in the matched element set OR
  129 + // Get the whole matched element set as a clean array
  130 + get: function( num ) {
  131 +
  132 + // Return all the elements in a clean array
  133 + if ( num == null ) {
  134 + return slice.call( this );
  135 + }
  136 +
  137 + // Return just the one element from the set
  138 + return num < 0 ? this[ num + this.length ] : this[ num ];
  139 + },
  140 +
  141 + // Take an array of elements and push it onto the stack
  142 + // (returning the new matched element set)
  143 + pushStack: function( elems ) {
  144 +
  145 + // Build a new jQuery matched element set
  146 + var ret = jQuery.merge( this.constructor(), elems );
  147 +
  148 + // Add the old object onto the stack (as a reference)
  149 + ret.prevObject = this;
  150 +
  151 + // Return the newly-formed element set
  152 + return ret;
  153 + },
  154 +
  155 + // Execute a callback for every element in the matched set.
  156 + each: function( callback ) {
  157 + return jQuery.each( this, callback );
  158 + },
  159 +
  160 + map: function( callback ) {
  161 + return this.pushStack( jQuery.map( this, function( elem, i ) {
  162 + return callback.call( elem, i, elem );
  163 + } ) );
  164 + },
  165 +
  166 + slice: function() {
  167 + return this.pushStack( slice.apply( this, arguments ) );
  168 + },
  169 +
  170 + first: function() {
  171 + return this.eq( 0 );
  172 + },
  173 +
  174 + last: function() {
  175 + return this.eq( -1 );
  176 + },
  177 +
  178 + eq: function( i ) {
  179 + var len = this.length,
  180 + j = +i + ( i < 0 ? len : 0 );
  181 + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
  182 + },
  183 +
  184 + end: function() {
  185 + return this.prevObject || this.constructor();
  186 + },
  187 +
  188 + // For internal use only.
  189 + // Behaves like an Array's method, not like a jQuery method.
  190 + push: push,
  191 + sort: arr.sort,
  192 + splice: arr.splice
  193 +};
  194 +
  195 +jQuery.extend = jQuery.fn.extend = function() {
  196 + var options, name, src, copy, copyIsArray, clone,
  197 + target = arguments[ 0 ] || {},
  198 + i = 1,
  199 + length = arguments.length,
  200 + deep = false;
  201 +
  202 + // Handle a deep copy situation
  203 + if ( typeof target === "boolean" ) {
  204 + deep = target;
  205 +
  206 + // Skip the boolean and the target
  207 + target = arguments[ i ] || {};
  208 + i++;
  209 + }
  210 +
  211 + // Handle case when target is a string or something (possible in deep copy)
  212 + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
  213 + target = {};
  214 + }
  215 +
  216 + // Extend jQuery itself if only one argument is passed
  217 + if ( i === length ) {
  218 + target = this;
  219 + i--;
  220 + }
  221 +
  222 + for ( ; i < length; i++ ) {
  223 +
  224 + // Only deal with non-null/undefined values
  225 + if ( ( options = arguments[ i ] ) != null ) {
  226 +
  227 + // Extend the base object
  228 + for ( name in options ) {
  229 + src = target[ name ];
  230 + copy = options[ name ];
  231 +
  232 + // Prevent never-ending loop
  233 + if ( target === copy ) {
  234 + continue;
  235 + }
  236 +
  237 + // Recurse if we're merging plain objects or arrays
  238 + if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
  239 + ( copyIsArray = Array.isArray( copy ) ) ) ) {
  240 +
  241 + if ( copyIsArray ) {
  242 + copyIsArray = false;
  243 + clone = src && Array.isArray( src ) ? src : [];
  244 +
  245 + } else {
  246 + clone = src && jQuery.isPlainObject( src ) ? src : {};
  247 + }
  248 +
  249 + // Never move original objects, clone them
  250 + target[ name ] = jQuery.extend( deep, clone, copy );
  251 +
  252 + // Don't bring in undefined values
  253 + } else if ( copy !== undefined ) {
  254 + target[ name ] = copy;
  255 + }
  256 + }
  257 + }
  258 + }
  259 +
  260 + // Return the modified object
  261 + return target;
  262 +};
  263 +
  264 +jQuery.extend( {
  265 +
  266 + // Unique for each copy of jQuery on the page
  267 + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
  268 +
  269 + // Assume jQuery is ready without the ready module
  270 + isReady: true,
  271 +
  272 + error: function( msg ) {
  273 + throw new Error( msg );
  274 + },
  275 +
  276 + noop: function() {},
  277 +
  278 + isFunction: function( obj ) {
  279 + return jQuery.type( obj ) === "function";
  280 + },
  281 +
  282 + isWindow: function( obj ) {
  283 + return obj != null && obj === obj.window;
  284 + },
  285 +
  286 + isNumeric: function( obj ) {
  287 +
  288 + // As of jQuery 3.0, isNumeric is limited to
  289 + // strings and numbers (primitives or objects)
  290 + // that can be coerced to finite numbers (gh-2662)
  291 + var type = jQuery.type( obj );
  292 + return ( type === "number" || type === "string" ) &&
  293 +
  294 + // parseFloat NaNs numeric-cast false positives ("")
  295 + // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
  296 + // subtraction forces infinities to NaN
  297 + !isNaN( obj - parseFloat( obj ) );
  298 + },
  299 +
  300 + isPlainObject: function( obj ) {
  301 + var proto, Ctor;
  302 +
  303 + // Detect obvious negatives
  304 + // Use toString instead of jQuery.type to catch host objects
  305 + if ( !obj || toString.call( obj ) !== "[object Object]" ) {
  306 + return false;
  307 + }
  308 +
  309 + proto = getProto( obj );
  310 +
  311 + // Objects with no prototype (e.g., `Object.create( null )`) are plain
  312 + if ( !proto ) {
  313 + return true;
  314 + }
  315 +
  316 + // Objects with prototype are plain iff they were constructed by a global Object function
  317 + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
  318 + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
  319 + },
  320 +
  321 + isEmptyObject: function( obj ) {
  322 +
  323 + /* eslint-disable no-unused-vars */
  324 + // See https://github.com/eslint/eslint/issues/6125
  325 + var name;
  326 +
  327 + for ( name in obj ) {
  328 + return false;
  329 + }
  330 + return true;
  331 + },
  332 +
  333 + type: function( obj ) {
  334 + if ( obj == null ) {
  335 + return obj + "";
  336 + }
  337 +
  338 + // Support: Android <=2.3 only (functionish RegExp)
  339 + return typeof obj === "object" || typeof obj === "function" ?
  340 + class2type[ toString.call( obj ) ] || "object" :
  341 + typeof obj;
  342 + },
  343 +
  344 + // Evaluates a script in a global context
  345 + globalEval: function( code ) {
  346 + DOMEval( code );
  347 + },
  348 +
  349 + // Convert dashed to camelCase; used by the css and data modules
  350 + // Support: IE <=9 - 11, Edge 12 - 13
  351 + // Microsoft forgot to hump their vendor prefix (#9572)
  352 + camelCase: function( string ) {
  353 + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
  354 + },
  355 +
  356 + each: function( obj, callback ) {
  357 + var length, i = 0;
  358 +
  359 + if ( isArrayLike( obj ) ) {
  360 + length = obj.length;
  361 + for ( ; i < length; i++ ) {
  362 + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
  363 + break;
  364 + }
  365 + }
  366 + } else {
  367 + for ( i in obj ) {
  368 + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
  369 + break;
  370 + }
  371 + }
  372 + }
  373 +
  374 + return obj;
  375 + },
  376 +
  377 + // Support: Android <=4.0 only
  378 + trim: function( text ) {
  379 + return text == null ?
  380 + "" :
  381 + ( text + "" ).replace( rtrim, "" );
  382 + },
  383 +
  384 + // results is for internal usage only
  385 + makeArray: function( arr, results ) {
  386 + var ret = results || [];
  387 +
  388 + if ( arr != null ) {
  389 + if ( isArrayLike( Object( arr ) ) ) {
  390 + jQuery.merge( ret,
  391 + typeof arr === "string" ?
  392 + [ arr ] : arr
  393 + );
  394 + } else {
  395 + push.call( ret, arr );
  396 + }
  397 + }
  398 +
  399 + return ret;
  400 + },
  401 +
  402 + inArray: function( elem, arr, i ) {
  403 + return arr == null ? -1 : indexOf.call( arr, elem, i );
  404 + },
  405 +
  406 + // Support: Android <=4.0 only, PhantomJS 1 only
  407 + // push.apply(_, arraylike) throws on ancient WebKit
  408 + merge: function( first, second ) {
  409 + var len = +second.length,
  410 + j = 0,
  411 + i = first.length;
  412 +
  413 + for ( ; j < len; j++ ) {
  414 + first[ i++ ] = second[ j ];
  415 + }
  416 +
  417 + first.length = i;
  418 +
  419 + return first;
  420 + },
  421 +
  422 + grep: function( elems, callback, invert ) {
  423 + var callbackInverse,
  424 + matches = [],
  425 + i = 0,
  426 + length = elems.length,
  427 + callbackExpect = !invert;
  428 +
  429 + // Go through the array, only saving the items
  430 + // that pass the validator function
  431 + for ( ; i < length; i++ ) {
  432 + callbackInverse = !callback( elems[ i ], i );
  433 + if ( callbackInverse !== callbackExpect ) {
  434 + matches.push( elems[ i ] );
  435 + }
  436 + }
  437 +
  438 + return matches;
  439 + },
  440 +
  441 + // arg is for internal usage only
  442 + map: function( elems, callback, arg ) {
  443 + var length, value,
  444 + i = 0,
  445 + ret = [];
  446 +
  447 + // Go through the array, translating each of the items to their new values
  448 + if ( isArrayLike( elems ) ) {
  449 + length = elems.length;
  450 + for ( ; i < length; i++ ) {
  451 + value = callback( elems[ i ], i, arg );
  452 +
  453 + if ( value != null ) {
  454 + ret.push( value );
  455 + }
  456 + }
  457 +
  458 + // Go through every key on the object,
  459 + } else {
  460 + for ( i in elems ) {
  461 + value = callback( elems[ i ], i, arg );
  462 +
  463 + if ( value != null ) {
  464 + ret.push( value );
  465 + }
  466 + }
  467 + }
  468 +
  469 + // Flatten any nested arrays
  470 + return concat.apply( [], ret );
  471 + },
  472 +
  473 + // A global GUID counter for objects
  474 + guid: 1,
  475 +
  476 + // Bind a function to a context, optionally partially applying any
  477 + // arguments.
  478 + proxy: function( fn, context ) {
  479 + var tmp, args, proxy;
  480 +
  481 + if ( typeof context === "string" ) {
  482 + tmp = fn[ context ];
  483 + context = fn;
  484 + fn = tmp;
  485 + }
  486 +
  487 + // Quick check to determine if target is callable, in the spec
  488 + // this throws a TypeError, but we will just return undefined.
  489 + if ( !jQuery.isFunction( fn ) ) {
  490 + return undefined;
  491 + }
  492 +
  493 + // Simulated bind
  494 + args = slice.call( arguments, 2 );
  495 + proxy = function() {
  496 + return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
  497 + };
  498 +
  499 + // Set the guid of unique handler to the same of original handler, so it can be removed
  500 + proxy.guid = fn.guid = fn.guid || jQuery.guid++;
  501 +
  502 + return proxy;
  503 + },
  504 +
  505 + now: Date.now,
  506 +
  507 + // jQuery.support is not used in Core but other projects attach their
  508 + // properties to it so it needs to exist.
  509 + support: support
  510 +} );
  511 +
  512 +if ( typeof Symbol === "function" ) {
  513 + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
  514 +}
  515 +
  516 +// Populate the class2type map
  517 +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
  518 +function( i, name ) {
  519 + class2type[ "[object " + name + "]" ] = name.toLowerCase();
  520 +} );
  521 +
  522 +function isArrayLike( obj ) {
  523 +
  524 + // Support: real iOS 8.2 only (not reproducible in simulator)
  525 + // `in` check used to prevent JIT error (gh-2145)
  526 + // hasOwn isn't used here due to false negatives
  527 + // regarding Nodelist length in IE
  528 + var length = !!obj && "length" in obj && obj.length,
  529 + type = jQuery.type( obj );
  530 +
  531 + if ( type === "function" || jQuery.isWindow( obj ) ) {
  532 + return false;
  533 + }
  534 +
  535 + return type === "array" || length === 0 ||
  536 + typeof length === "number" && length > 0 && ( length - 1 ) in obj;
  537 +}
  538 +var Sizzle =
  539 +/*!
  540 + * Sizzle CSS Selector Engine v2.3.3
  541 + * https://sizzlejs.com/
  542 + *
  543 + * Copyright jQuery Foundation and other contributors
  544 + * Released under the MIT license
  545 + * http://jquery.org/license
  546 + *
  547 + * Date: 2016-08-08
  548 + */
  549 +(function( window ) {
  550 +
  551 +var i,
  552 + support,
  553 + Expr,
  554 + getText,
  555 + isXML,
  556 + tokenize,
  557 + compile,
  558 + select,
  559 + outermostContext,
  560 + sortInput,
  561 + hasDuplicate,
  562 +
  563 + // Local document vars
  564 + setDocument,
  565 + document,
  566 + docElem,
  567 + documentIsHTML,
  568 + rbuggyQSA,
  569 + rbuggyMatches,
  570 + matches,
  571 + contains,
  572 +
  573 + // Instance-specific data
  574 + expando = "sizzle" + 1 * new Date(),
  575 + preferredDoc = window.document,
  576 + dirruns = 0,
  577 + done = 0,
  578 + classCache = createCache(),
  579 + tokenCache = createCache(),
  580 + compilerCache = createCache(),
  581 + sortOrder = function( a, b ) {
  582 + if ( a === b ) {
  583 + hasDuplicate = true;
  584 + }
  585 + return 0;
  586 + },
  587 +
  588 + // Instance methods
  589 + hasOwn = ({}).hasOwnProperty,
  590 + arr = [],
  591 + pop = arr.pop,
  592 + push_native = arr.push,
  593 + push = arr.push,
  594 + slice = arr.slice,
  595 + // Use a stripped-down indexOf as it's faster than native
  596 + // https://jsperf.com/thor-indexof-vs-for/5
  597 + indexOf = function( list, elem ) {
  598 + var i = 0,
  599 + len = list.length;
  600 + for ( ; i < len; i++ ) {
  601 + if ( list[i] === elem ) {
  602 + return i;
  603 + }
  604 + }
  605 + return -1;
  606 + },
  607 +
  608 + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
  609 +
  610 + // Regular expressions
  611 +
  612 + // http://www.w3.org/TR/css3-selectors/#whitespace
  613 + whitespace = "[\\x20\\t\\r\\n\\f]",
  614 +
  615 + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
  616 + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
  617 +
  618 + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
  619 + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
  620 + // Operator (capture 2)
  621 + "*([*^$|!~]?=)" + whitespace +
  622 + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
  623 + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
  624 + "*\\]",
  625 +
  626 + pseudos = ":(" + identifier + ")(?:\\((" +
  627 + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
  628 + // 1. quoted (capture 3; capture 4 or capture 5)
  629 + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
  630 + // 2. simple (capture 6)
  631 + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
  632 + // 3. anything else (capture 2)
  633 + ".*" +
  634 + ")\\)|)",
  635 +
  636 + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
  637 + rwhitespace = new RegExp( whitespace + "+", "g" ),
  638 + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
  639 +
  640 + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
  641 + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
  642 +
  643 + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
  644 +
  645 + rpseudo = new RegExp( pseudos ),
  646 + ridentifier = new RegExp( "^" + identifier + "$" ),
  647 +
  648 + matchExpr = {
  649 + "ID": new RegExp( "^#(" + identifier + ")" ),
  650 + "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
  651 + "TAG": new RegExp( "^(" + identifier + "|[*])" ),
  652 + "ATTR": new RegExp( "^" + attributes ),
  653 + "PSEUDO": new RegExp( "^" + pseudos ),
  654 + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
  655 + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
  656 + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
  657 + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
  658 + // For use in libraries implementing .is()
  659 + // We use this for POS matching in `select`
  660 + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
  661 + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
  662 + },
  663 +
  664 + rinputs = /^(?:input|select|textarea|button)$/i,
  665 + rheader = /^h\d$/i,
  666 +
  667 + rnative = /^[^{]+\{\s*\[native \w/,
  668 +
  669 + // Easily-parseable/retrievable ID or TAG or CLASS selectors
  670 + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
  671 +
  672 + rsibling = /[+~]/,
  673 +
  674 + // CSS escapes
  675 + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
  676 + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
  677 + funescape = function( _, escaped, escapedWhitespace ) {
  678 + var high = "0x" + escaped - 0x10000;
  679 + // NaN means non-codepoint
  680 + // Support: Firefox<24
  681 + // Workaround erroneous numeric interpretation of +"0x"
  682 + return high !== high || escapedWhitespace ?
  683 + escaped :
  684 + high < 0 ?
  685 + // BMP codepoint
  686 + String.fromCharCode( high + 0x10000 ) :
  687 + // Supplemental Plane codepoint (surrogate pair)
  688 + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
  689 + },
  690 +
  691 + // CSS string/identifier serialization
  692 + // https://drafts.csswg.org/cssom/#common-serializing-idioms
  693 + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
  694 + fcssescape = function( ch, asCodePoint ) {
  695 + if ( asCodePoint ) {
  696 +
  697 + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
  698 + if ( ch === "\0" ) {
  699 + return "\uFFFD";
  700 + }
  701 +
  702 + // Control characters and (dependent upon position) numbers get escaped as code points
  703 + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
  704 + }
  705 +
  706 + // Other potentially-special ASCII characters get backslash-escaped
  707 + return "\\" + ch;
  708 + },
  709 +
  710 + // Used for iframes
  711 + // See setDocument()
  712 + // Removing the function wrapper causes a "Permission Denied"
  713 + // error in IE
  714 + unloadHandler = function() {
  715 + setDocument();
  716 + },
  717 +
  718 + disabledAncestor = addCombinator(
  719 + function( elem ) {
  720 + return elem.disabled === true && ("form" in elem || "label" in elem);
  721 + },
  722 + { dir: "parentNode", next: "legend" }
  723 + );
  724 +
  725 +// Optimize for push.apply( _, NodeList )
  726 +try {
  727 + push.apply(
  728 + (arr = slice.call( preferredDoc.childNodes )),
  729 + preferredDoc.childNodes
  730 + );
  731 + // Support: Android<4.0
  732 + // Detect silently failing push.apply
  733 + arr[ preferredDoc.childNodes.length ].nodeType;
  734 +} catch ( e ) {
  735 + push = { apply: arr.length ?
  736 +
  737 + // Leverage slice if possible
  738 + function( target, els ) {
  739 + push_native.apply( target, slice.call(els) );
  740 + } :
  741 +
  742 + // Support: IE<9
  743 + // Otherwise append directly
  744 + function( target, els ) {
  745 + var j = target.length,
  746 + i = 0;
  747 + // Can't trust NodeList.length
  748 + while ( (target[j++] = els[i++]) ) {}
  749 + target.length = j - 1;
  750 + }
  751 + };
  752 +}
  753 +
  754 +function Sizzle( selector, context, results, seed ) {
  755 + var m, i, elem, nid, match, groups, newSelector,
  756 + newContext = context && context.ownerDocument,
  757 +
  758 + // nodeType defaults to 9, since context defaults to document
  759 + nodeType = context ? context.nodeType : 9;
  760 +
  761 + results = results || [];
  762 +
  763 + // Return early from calls with invalid selector or context
  764 + if ( typeof selector !== "string" || !selector ||
  765 + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
  766 +
  767 + return results;
  768 + }
  769 +
  770 + // Try to shortcut find operations (as opposed to filters) in HTML documents
  771 + if ( !seed ) {
  772 +
  773 + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
  774 + setDocument( context );
  775 + }
  776 + context = context || document;
  777 +
  778 + if ( documentIsHTML ) {
  779 +
  780 + // If the selector is sufficiently simple, try using a "get*By*" DOM method
  781 + // (excepting DocumentFragment context, where the methods don't exist)
  782 + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
  783 +
  784 + // ID selector
  785 + if ( (m = match[1]) ) {
  786 +
  787 + // Document context
  788 + if ( nodeType === 9 ) {
  789 + if ( (elem = context.getElementById( m )) ) {
  790 +
  791 + // Support: IE, Opera, Webkit
  792 + // TODO: identify versions
  793 + // getElementById can match elements by name instead of ID
  794 + if ( elem.id === m ) {
  795 + results.push( elem );
  796 + return results;
  797 + }
  798 + } else {
  799 + return results;
  800 + }
  801 +
  802 + // Element context
  803 + } else {
  804 +
  805 + // Support: IE, Opera, Webkit
  806 + // TODO: identify versions
  807 + // getElementById can match elements by name instead of ID
  808 + if ( newContext && (elem = newContext.getElementById( m )) &&
  809 + contains( context, elem ) &&
  810 + elem.id === m ) {
  811 +
  812 + results.push( elem );
  813 + return results;
  814 + }
  815 + }
  816 +
  817 + // Type selector
  818 + } else if ( match[2] ) {
  819 + push.apply( results, context.getElementsByTagName( selector ) );
  820 + return results;
  821 +
  822 + // Class selector
  823 + } else if ( (m = match[3]) && support.getElementsByClassName &&
  824 + context.getElementsByClassName ) {
  825 +
  826 + push.apply( results, context.getElementsByClassName( m ) );
  827 + return results;
  828 + }
  829 + }
  830 +
  831 + // Take advantage of querySelectorAll
  832 + if ( support.qsa &&
  833 + !compilerCache[ selector + " " ] &&
  834 + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
  835 +
  836 + if ( nodeType !== 1 ) {
  837 + newContext = context;
  838 + newSelector = selector;
  839 +
  840 + // qSA looks outside Element context, which is not what we want
  841 + // Thanks to Andrew Dupont for this workaround technique
  842 + // Support: IE <=8
  843 + // Exclude object elements
  844 + } else if ( context.nodeName.toLowerCase() !== "object" ) {
  845 +
  846 + // Capture the context ID, setting it first if necessary
  847 + if ( (nid = context.getAttribute( "id" )) ) {
  848 + nid = nid.replace( rcssescape, fcssescape );
  849 + } else {
  850 + context.setAttribute( "id", (nid = expando) );
  851 + }
  852 +
  853 + // Prefix every selector in the list
  854 + groups = tokenize( selector );
  855 + i = groups.length;
  856 + while ( i-- ) {
  857 + groups[i] = "#" + nid + " " + toSelector( groups[i] );
  858 + }
  859 + newSelector = groups.join( "," );
  860 +
  861 + // Expand context for sibling selectors
  862 + newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
  863 + context;
  864 + }
  865 +
  866 + if ( newSelector ) {
  867 + try {
  868 + push.apply( results,
  869 + newContext.querySelectorAll( newSelector )
  870 + );
  871 + return results;
  872 + } catch ( qsaError ) {
  873 + } finally {
  874 + if ( nid === expando ) {
  875 + context.removeAttribute( "id" );
  876 + }
  877 + }
  878 + }
  879 + }
  880 + }
  881 + }
  882 +
  883 + // All others
  884 + return select( selector.replace( rtrim, "$1" ), context, results, seed );
  885 +}
  886 +
  887 +/**
  888 + * Create key-value caches of limited size
  889 + * @returns {function(string, object)} Returns the Object data after storing it on itself with
  890 + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
  891 + * deleting the oldest entry
  892 + */
  893 +function createCache() {
  894 + var keys = [];
  895 +
  896 + function cache( key, value ) {
  897 + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
  898 + if ( keys.push( key + " " ) > Expr.cacheLength ) {
  899 + // Only keep the most recent entries
  900 + delete cache[ keys.shift() ];
  901 + }
  902 + return (cache[ key + " " ] = value);
  903 + }
  904 + return cache;
  905 +}
  906 +
  907 +/**
  908 + * Mark a function for special use by Sizzle
  909 + * @param {Function} fn The function to mark
  910 + */
  911 +function markFunction( fn ) {
  912 + fn[ expando ] = true;
  913 + return fn;
  914 +}
  915 +
  916 +/**
  917 + * Support testing using an element
  918 + * @param {Function} fn Passed the created element and returns a boolean result
  919 + */
  920 +function assert( fn ) {
  921 + var el = document.createElement("fieldset");
  922 +
  923 + try {
  924 + return !!fn( el );
  925 + } catch (e) {
  926 + return false;
  927 + } finally {
  928 + // Remove from its parent by default
  929 + if ( el.parentNode ) {
  930 + el.parentNode.removeChild( el );
  931 + }
  932 + // release memory in IE
  933 + el = null;
  934 + }
  935 +}
  936 +
  937 +/**
  938 + * Adds the same handler for all of the specified attrs
  939 + * @param {String} attrs Pipe-separated list of attributes
  940 + * @param {Function} handler The method that will be applied
  941 + */
  942 +function addHandle( attrs, handler ) {
  943 + var arr = attrs.split("|"),
  944 + i = arr.length;
  945 +
  946 + while ( i-- ) {
  947 + Expr.attrHandle[ arr[i] ] = handler;
  948 + }
  949 +}
  950 +
  951 +/**
  952 + * Checks document order of two siblings
  953 + * @param {Element} a
  954 + * @param {Element} b
  955 + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
  956 + */
  957 +function siblingCheck( a, b ) {
  958 + var cur = b && a,
  959 + diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
  960 + a.sourceIndex - b.sourceIndex;
  961 +
  962 + // Use IE sourceIndex if available on both nodes
  963 + if ( diff ) {
  964 + return diff;
  965 + }
  966 +
  967 + // Check if b follows a
  968 + if ( cur ) {
  969 + while ( (cur = cur.nextSibling) ) {
  970 + if ( cur === b ) {
  971 + return -1;
  972 + }
  973 + }
  974 + }
  975 +
  976 + return a ? 1 : -1;
  977 +}
  978 +
  979 +/**
  980 + * Returns a function to use in pseudos for input types
  981 + * @param {String} type
  982 + */
  983 +function createInputPseudo( type ) {
  984 + return function( elem ) {
  985 + var name = elem.nodeName.toLowerCase();
  986 + return name === "input" && elem.type === type;
  987 + };
  988 +}
  989 +
  990 +/**
  991 + * Returns a function to use in pseudos for buttons
  992 + * @param {String} type
  993 + */
  994 +function createButtonPseudo( type ) {
  995 + return function( elem ) {
  996 + var name = elem.nodeName.toLowerCase();
  997 + return (name === "input" || name === "button") && elem.type === type;
  998 + };
  999 +}
  1000 +
  1001 +/**
  1002 + * Returns a function to use in pseudos for :enabled/:disabled
  1003 + * @param {Boolean} disabled true for :disabled; false for :enabled
  1004 + */
  1005 +function createDisabledPseudo( disabled ) {
  1006 +
  1007 + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
  1008 + return function( elem ) {
  1009 +
  1010 + // Only certain elements can match :enabled or :disabled
  1011 + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
  1012 + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
  1013 + if ( "form" in elem ) {
  1014 +
  1015 + // Check for inherited disabledness on relevant non-disabled elements:
  1016 + // * listed form-associated elements in a disabled fieldset
  1017 + // https://html.spec.whatwg.org/multipage/forms.html#category-listed
  1018 + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
  1019 + // * option elements in a disabled optgroup
  1020 + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
  1021 + // All such elements have a "form" property.
  1022 + if ( elem.parentNode && elem.disabled === false ) {
  1023 +
  1024 + // Option elements defer to a parent optgroup if present
  1025 + if ( "label" in elem ) {
  1026 + if ( "label" in elem.parentNode ) {
  1027 + return elem.parentNode.disabled === disabled;
  1028 + } else {
  1029 + return elem.disabled === disabled;
  1030 + }
  1031 + }
  1032 +
  1033 + // Support: IE 6 - 11
  1034 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors
  1035 + return elem.isDisabled === disabled ||
  1036 +
  1037 + // Where there is no isDisabled, check manually
  1038 + /* jshint -W018 */
  1039 + elem.isDisabled !== !disabled &&
  1040 + disabledAncestor( elem ) === disabled;
  1041 + }
  1042 +
  1043 + return elem.disabled === disabled;
  1044 +
  1045 + // Try to winnow out elements that can't be disabled before trusting the disabled property.
  1046 + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
  1047 + // even exist on them, let alone have a boolean value.
  1048 + } else if ( "label" in elem ) {
  1049 + return elem.disabled === disabled;
  1050 + }
  1051 +
  1052 + // Remaining elements are neither :enabled nor :disabled
  1053 + return false;
  1054 + };
  1055 +}
  1056 +
  1057 +/**
  1058 + * Returns a function to use in pseudos for positionals
  1059 + * @param {Function} fn
  1060 + */
  1061 +function createPositionalPseudo( fn ) {
  1062 + return markFunction(function( argument ) {
  1063 + argument = +argument;
  1064 + return markFunction(function( seed, matches ) {
  1065 + var j,
  1066 + matchIndexes = fn( [], seed.length, argument ),
  1067 + i = matchIndexes.length;
  1068 +
  1069 + // Match elements found at the specified indexes
  1070 + while ( i-- ) {
  1071 + if ( seed[ (j = matchIndexes[i]) ] ) {
  1072 + seed[j] = !(matches[j] = seed[j]);
  1073 + }
  1074 + }
  1075 + });
  1076 + });
  1077 +}
  1078 +
  1079 +/**
  1080 + * Checks a node for validity as a Sizzle context
  1081 + * @param {Element|Object=} context
  1082 + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
  1083 + */
  1084 +function testContext( context ) {
  1085 + return context && typeof context.getElementsByTagName !== "undefined" && context;
  1086 +}
  1087 +
  1088 +// Expose support vars for convenience
  1089 +support = Sizzle.support = {};
  1090 +
  1091 +/**
  1092 + * Detects XML nodes
  1093 + * @param {Element|Object} elem An element or a document
  1094 + * @returns {Boolean} True iff elem is a non-HTML XML node
  1095 + */
  1096 +isXML = Sizzle.isXML = function( elem ) {
  1097 + // documentElement is verified for cases where it doesn't yet exist
  1098 + // (such as loading iframes in IE - #4833)
  1099 + var documentElement = elem && (elem.ownerDocument || elem).documentElement;
  1100 + return documentElement ? documentElement.nodeName !== "HTML" : false;
  1101 +};
  1102 +
  1103 +/**
  1104 + * Sets document-related variables once based on the current document
  1105 + * @param {Element|Object} [doc] An element or document object to use to set the document
  1106 + * @returns {Object} Returns the current document
  1107 + */
  1108 +setDocument = Sizzle.setDocument = function( node ) {
  1109 + var hasCompare, subWindow,
  1110 + doc = node ? node.ownerDocument || node : preferredDoc;
  1111 +
  1112 + // Return early if doc is invalid or already selected
  1113 + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
  1114 + return document;
  1115 + }
  1116 +
  1117 + // Update global variables
  1118 + document = doc;
  1119 + docElem = document.documentElement;
  1120 + documentIsHTML = !isXML( document );
  1121 +
  1122 + // Support: IE 9-11, Edge
  1123 + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
  1124 + if ( preferredDoc !== document &&
  1125 + (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
  1126 +
  1127 + // Support: IE 11, Edge
  1128 + if ( subWindow.addEventListener ) {
  1129 + subWindow.addEventListener( "unload", unloadHandler, false );
  1130 +
  1131 + // Support: IE 9 - 10 only
  1132 + } else if ( subWindow.attachEvent ) {
  1133 + subWindow.attachEvent( "onunload", unloadHandler );
  1134 + }
  1135 + }
  1136 +
  1137 + /* Attributes
  1138 + ---------------------------------------------------------------------- */
  1139 +
  1140 + // Support: IE<8
  1141 + // Verify that getAttribute really returns attributes and not properties
  1142 + // (excepting IE8 booleans)
  1143 + support.attributes = assert(function( el ) {
  1144 + el.className = "i";
  1145 + return !el.getAttribute("className");
  1146 + });
  1147 +
  1148 + /* getElement(s)By*
  1149 + ---------------------------------------------------------------------- */
  1150 +
  1151 + // Check if getElementsByTagName("*") returns only elements
  1152 + support.getElementsByTagName = assert(function( el ) {
  1153 + el.appendChild( document.createComment("") );
  1154 + return !el.getElementsByTagName("*").length;
  1155 + });
  1156 +
  1157 + // Support: IE<9
  1158 + support.getElementsByClassName = rnative.test( document.getElementsByClassName );
  1159 +
  1160 + // Support: IE<10
  1161 + // Check if getElementById returns elements by name
  1162 + // The broken getElementById methods don't pick up programmatically-set names,
  1163 + // so use a roundabout getElementsByName test
  1164 + support.getById = assert(function( el ) {
  1165 + docElem.appendChild( el ).id = expando;
  1166 + return !document.getElementsByName || !document.getElementsByName( expando ).length;
  1167 + });
  1168 +
  1169 + // ID filter and find
  1170 + if ( support.getById ) {
  1171 + Expr.filter["ID"] = function( id ) {
  1172 + var attrId = id.replace( runescape, funescape );
  1173 + return function( elem ) {
  1174 + return elem.getAttribute("id") === attrId;
  1175 + };
  1176 + };
  1177 + Expr.find["ID"] = function( id, context ) {
  1178 + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
  1179 + var elem = context.getElementById( id );
  1180 + return elem ? [ elem ] : [];
  1181 + }
  1182 + };
  1183 + } else {
  1184 + Expr.filter["ID"] = function( id ) {
  1185 + var attrId = id.replace( runescape, funescape );
  1186 + return function( elem ) {
  1187 + var node = typeof elem.getAttributeNode !== "undefined" &&
  1188 + elem.getAttributeNode("id");
  1189 + return node && node.value === attrId;
  1190 + };
  1191 + };
  1192 +
  1193 + // Support: IE 6 - 7 only
  1194 + // getElementById is not reliable as a find shortcut
  1195 + Expr.find["ID"] = function( id, context ) {
  1196 + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
  1197 + var node, i, elems,
  1198 + elem = context.getElementById( id );
  1199 +
  1200 + if ( elem ) {
  1201 +
  1202 + // Verify the id attribute
  1203 + node = elem.getAttributeNode("id");
  1204 + if ( node && node.value === id ) {
  1205 + return [ elem ];
  1206 + }
  1207 +
  1208 + // Fall back on getElementsByName
  1209 + elems = context.getElementsByName( id );
  1210 + i = 0;
  1211 + while ( (elem = elems[i++]) ) {
  1212 + node = elem.getAttributeNode("id");
  1213 + if ( node && node.value === id ) {
  1214 + return [ elem ];
  1215 + }
  1216 + }
  1217 + }
  1218 +
  1219 + return [];
  1220 + }
  1221 + };
  1222 + }
  1223 +
  1224 + // Tag
  1225 + Expr.find["TAG"] = support.getElementsByTagName ?
  1226 + function( tag, context ) {
  1227 + if ( typeof context.getElementsByTagName !== "undefined" ) {
  1228 + return context.getElementsByTagName( tag );
  1229 +
  1230 + // DocumentFragment nodes don't have gEBTN
  1231 + } else if ( support.qsa ) {
  1232 + return context.querySelectorAll( tag );
  1233 + }
  1234 + } :
  1235 +
  1236 + function( tag, context ) {
  1237 + var elem,
  1238 + tmp = [],
  1239 + i = 0,
  1240 + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
  1241 + results = context.getElementsByTagName( tag );
  1242 +
  1243 + // Filter out possible comments
  1244 + if ( tag === "*" ) {
  1245 + while ( (elem = results[i++]) ) {
  1246 + if ( elem.nodeType === 1 ) {
  1247 + tmp.push( elem );
  1248 + }
  1249 + }
  1250 +
  1251 + return tmp;
  1252 + }
  1253 + return results;
  1254 + };
  1255 +
  1256 + // Class
  1257 + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
  1258 + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
  1259 + return context.getElementsByClassName( className );
  1260 + }
  1261 + };
  1262 +
  1263 + /* QSA/matchesSelector
  1264 + ---------------------------------------------------------------------- */
  1265 +
  1266 + // QSA and matchesSelector support
  1267 +
  1268 + // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
  1269 + rbuggyMatches = [];
  1270 +
  1271 + // qSa(:focus) reports false when true (Chrome 21)
  1272 + // We allow this because of a bug in IE8/9 that throws an error
  1273 + // whenever `document.activeElement` is accessed on an iframe
  1274 + // So, we allow :focus to pass through QSA all the time to avoid the IE error
  1275 + // See https://bugs.jquery.com/ticket/13378
  1276 + rbuggyQSA = [];
  1277 +
  1278 + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
  1279 + // Build QSA regex
  1280 + // Regex strategy adopted from Diego Perini
  1281 + assert(function( el ) {
  1282 + // Select is set to empty string on purpose
  1283 + // This is to test IE's treatment of not explicitly
  1284 + // setting a boolean content attribute,
  1285 + // since its presence should be enough
  1286 + // https://bugs.jquery.com/ticket/12359
  1287 + docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
  1288 + "<select id='" + expando + "-\r\\' msallowcapture=''>" +
  1289 + "<option selected=''></option></select>";
  1290 +
  1291 + // Support: IE8, Opera 11-12.16
  1292 + // Nothing should be selected when empty strings follow ^= or $= or *=
  1293 + // The test attribute must be unknown in Opera but "safe" for WinRT
  1294 + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
  1295 + if ( el.querySelectorAll("[msallowcapture^='']").length ) {
  1296 + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
  1297 + }
  1298 +
  1299 + // Support: IE8
  1300 + // Boolean attributes and "value" are not treated correctly
  1301 + if ( !el.querySelectorAll("[selected]").length ) {
  1302 + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
  1303 + }
  1304 +
  1305 + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
  1306 + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
  1307 + rbuggyQSA.push("~=");
  1308 + }
  1309 +
  1310 + // Webkit/Opera - :checked should return selected option elements
  1311 + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  1312 + // IE8 throws error here and will not see later tests
  1313 + if ( !el.querySelectorAll(":checked").length ) {
  1314 + rbuggyQSA.push(":checked");
  1315 + }
  1316 +
  1317 + // Support: Safari 8+, iOS 8+
  1318 + // https://bugs.webkit.org/show_bug.cgi?id=136851
  1319 + // In-page `selector#id sibling-combinator selector` fails
  1320 + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
  1321 + rbuggyQSA.push(".#.+[+~]");
  1322 + }
  1323 + });
  1324 +
  1325 + assert(function( el ) {
  1326 + el.innerHTML = "<a href='' disabled='disabled'></a>" +
  1327 + "<select disabled='disabled'><option/></select>";
  1328 +
  1329 + // Support: Windows 8 Native Apps
  1330 + // The type and name attributes are restricted during .innerHTML assignment
  1331 + var input = document.createElement("input");
  1332 + input.setAttribute( "type", "hidden" );
  1333 + el.appendChild( input ).setAttribute( "name", "D" );
  1334 +
  1335 + // Support: IE8
  1336 + // Enforce case-sensitivity of name attribute
  1337 + if ( el.querySelectorAll("[name=d]").length ) {
  1338 + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
  1339 + }
  1340 +
  1341 + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
  1342 + // IE8 throws error here and will not see later tests
  1343 + if ( el.querySelectorAll(":enabled").length !== 2 ) {
  1344 + rbuggyQSA.push( ":enabled", ":disabled" );
  1345 + }
  1346 +
  1347 + // Support: IE9-11+
  1348 + // IE's :disabled selector does not pick up the children of disabled fieldsets
  1349 + docElem.appendChild( el ).disabled = true;
  1350 + if ( el.querySelectorAll(":disabled").length !== 2 ) {
  1351 + rbuggyQSA.push( ":enabled", ":disabled" );
  1352 + }
  1353 +
  1354 + // Opera 10-11 does not throw on post-comma invalid pseudos
  1355 + el.querySelectorAll("*,:x");
  1356 + rbuggyQSA.push(",.*:");
  1357 + });
  1358 + }
  1359 +
  1360 + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
  1361 + docElem.webkitMatchesSelector ||
  1362 + docElem.mozMatchesSelector ||
  1363 + docElem.oMatchesSelector ||
  1364 + docElem.msMatchesSelector) )) ) {
  1365 +
  1366 + assert(function( el ) {
  1367 + // Check to see if it's possible to do matchesSelector
  1368 + // on a disconnected node (IE 9)
  1369 + support.disconnectedMatch = matches.call( el, "*" );
  1370 +
  1371 + // This should fail with an exception
  1372 + // Gecko does not error, returns false instead
  1373 + matches.call( el, "[s!='']:x" );
  1374 + rbuggyMatches.push( "!=", pseudos );
  1375 + });
  1376 + }
  1377 +
  1378 + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
  1379 + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
  1380 +
  1381 + /* Contains
  1382 + ---------------------------------------------------------------------- */
  1383 + hasCompare = rnative.test( docElem.compareDocumentPosition );
  1384 +
  1385 + // Element contains another
  1386 + // Purposefully self-exclusive
  1387 + // As in, an element does not contain itself
  1388 + contains = hasCompare || rnative.test( docElem.contains ) ?
  1389 + function( a, b ) {
  1390 + var adown = a.nodeType === 9 ? a.documentElement : a,
  1391 + bup = b && b.parentNode;
  1392 + return a === bup || !!( bup && bup.nodeType === 1 && (
  1393 + adown.contains ?
  1394 + adown.contains( bup ) :
  1395 + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
  1396 + ));
  1397 + } :
  1398 + function( a, b ) {
  1399 + if ( b ) {
  1400 + while ( (b = b.parentNode) ) {
  1401 + if ( b === a ) {
  1402 + return true;
  1403 + }
  1404 + }
  1405 + }
  1406 + return false;
  1407 + };
  1408 +
  1409 + /* Sorting
  1410 + ---------------------------------------------------------------------- */
  1411 +
  1412 + // Document order sorting
  1413 + sortOrder = hasCompare ?
  1414 + function( a, b ) {
  1415 +
  1416 + // Flag for duplicate removal
  1417 + if ( a === b ) {
  1418 + hasDuplicate = true;
  1419 + return 0;
  1420 + }
  1421 +
  1422 + // Sort on method existence if only one input has compareDocumentPosition
  1423 + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
  1424 + if ( compare ) {
  1425 + return compare;
  1426 + }
  1427 +
  1428 + // Calculate position if both inputs belong to the same document
  1429 + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
  1430 + a.compareDocumentPosition( b ) :
  1431 +
  1432 + // Otherwise we know they are disconnected
  1433 + 1;
  1434 +
  1435 + // Disconnected nodes
  1436 + if ( compare & 1 ||
  1437 + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
  1438 +
  1439 + // Choose the first element that is related to our preferred document
  1440 + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
  1441 + return -1;
  1442 + }
  1443 + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
  1444 + return 1;
  1445 + }
  1446 +
  1447 + // Maintain original order
  1448 + return sortInput ?
  1449 + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
  1450 + 0;
  1451 + }
  1452 +
  1453 + return compare & 4 ? -1 : 1;
  1454 + } :
  1455 + function( a, b ) {
  1456 + // Exit early if the nodes are identical
  1457 + if ( a === b ) {
  1458 + hasDuplicate = true;
  1459 + return 0;
  1460 + }
  1461 +
  1462 + var cur,
  1463 + i = 0,
  1464 + aup = a.parentNode,
  1465 + bup = b.parentNode,
  1466 + ap = [ a ],
  1467 + bp = [ b ];
  1468 +
  1469 + // Parentless nodes are either documents or disconnected
  1470 + if ( !aup || !bup ) {
  1471 + return a === document ? -1 :
  1472 + b === document ? 1 :
  1473 + aup ? -1 :
  1474 + bup ? 1 :
  1475 + sortInput ?
  1476 + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
  1477 + 0;
  1478 +
  1479 + // If the nodes are siblings, we can do a quick check
  1480 + } else if ( aup === bup ) {
  1481 + return siblingCheck( a, b );
  1482 + }
  1483 +
  1484 + // Otherwise we need full lists of their ancestors for comparison
  1485 + cur = a;
  1486 + while ( (cur = cur.parentNode) ) {
  1487 + ap.unshift( cur );
  1488 + }
  1489 + cur = b;
  1490 + while ( (cur = cur.parentNode) ) {
  1491 + bp.unshift( cur );
  1492 + }
  1493 +
  1494 + // Walk down the tree looking for a discrepancy
  1495 + while ( ap[i] === bp[i] ) {
  1496 + i++;
  1497 + }
  1498 +
  1499 + return i ?
  1500 + // Do a sibling check if the nodes have a common ancestor
  1501 + siblingCheck( ap[i], bp[i] ) :
  1502 +
  1503 + // Otherwise nodes in our document sort first
  1504 + ap[i] === preferredDoc ? -1 :
  1505 + bp[i] === preferredDoc ? 1 :
  1506 + 0;
  1507 + };
  1508 +
  1509 + return document;
  1510 +};
  1511 +
  1512 +Sizzle.matches = function( expr, elements ) {
  1513 + return Sizzle( expr, null, null, elements );
  1514 +};
  1515 +
  1516 +Sizzle.matchesSelector = function( elem, expr ) {
  1517 + // Set document vars if needed
  1518 + if ( ( elem.ownerDocument || elem ) !== document ) {
  1519 + setDocument( elem );
  1520 + }
  1521 +
  1522 + // Make sure that attribute selectors are quoted
  1523 + expr = expr.replace( rattributeQuotes, "='$1']" );
  1524 +
  1525 + if ( support.matchesSelector && documentIsHTML &&
  1526 + !compilerCache[ expr + " " ] &&
  1527 + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
  1528 + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
  1529 +
  1530 + try {
  1531 + var ret = matches.call( elem, expr );
  1532 +
  1533 + // IE 9's matchesSelector returns false on disconnected nodes
  1534 + if ( ret || support.disconnectedMatch ||
  1535 + // As well, disconnected nodes are said to be in a document
  1536 + // fragment in IE 9
  1537 + elem.document && elem.document.nodeType !== 11 ) {
  1538 + return ret;
  1539 + }
  1540 + } catch (e) {}
  1541 + }
  1542 +
  1543 + return Sizzle( expr, document, null, [ elem ] ).length > 0;
  1544 +};
  1545 +
  1546 +Sizzle.contains = function( context, elem ) {
  1547 + // Set document vars if needed
  1548 + if ( ( context.ownerDocument || context ) !== document ) {
  1549 + setDocument( context );
  1550 + }
  1551 + return contains( context, elem );
  1552 +};
  1553 +
  1554 +Sizzle.attr = function( elem, name ) {
  1555 + // Set document vars if needed
  1556 + if ( ( elem.ownerDocument || elem ) !== document ) {
  1557 + setDocument( elem );
  1558 + }
  1559 +
  1560 + var fn = Expr.attrHandle[ name.toLowerCase() ],
  1561 + // Don't get fooled by Object.prototype properties (jQuery #13807)
  1562 + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
  1563 + fn( elem, name, !documentIsHTML ) :
  1564 + undefined;
  1565 +
  1566 + return val !== undefined ?
  1567 + val :
  1568 + support.attributes || !documentIsHTML ?
  1569 + elem.getAttribute( name ) :
  1570 + (val = elem.getAttributeNode(name)) && val.specified ?
  1571 + val.value :
  1572 + null;
  1573 +};
  1574 +
  1575 +Sizzle.escape = function( sel ) {
  1576 + return (sel + "").replace( rcssescape, fcssescape );
  1577 +};
  1578 +
  1579 +Sizzle.error = function( msg ) {
  1580 + throw new Error( "Syntax error, unrecognized expression: " + msg );
  1581 +};
  1582 +
  1583 +/**
  1584 + * Document sorting and removing duplicates
  1585 + * @param {ArrayLike} results
  1586 + */
  1587 +Sizzle.uniqueSort = function( results ) {
  1588 + var elem,
  1589 + duplicates = [],
  1590 + j = 0,
  1591 + i = 0;
  1592 +
  1593 + // Unless we *know* we can detect duplicates, assume their presence
  1594 + hasDuplicate = !support.detectDuplicates;
  1595 + sortInput = !support.sortStable && results.slice( 0 );
  1596 + results.sort( sortOrder );
  1597 +
  1598 + if ( hasDuplicate ) {
  1599 + while ( (elem = results[i++]) ) {
  1600 + if ( elem === results[ i ] ) {
  1601 + j = duplicates.push( i );
  1602 + }
  1603 + }
  1604 + while ( j-- ) {
  1605 + results.splice( duplicates[ j ], 1 );
  1606 + }
  1607 + }
  1608 +
  1609 + // Clear input after sorting to release objects
  1610 + // See https://github.com/jquery/sizzle/pull/225
  1611 + sortInput = null;
  1612 +
  1613 + return results;
  1614 +};
  1615 +
  1616 +/**
  1617 + * Utility function for retrieving the text value of an array of DOM nodes
  1618 + * @param {Array|Element} elem
  1619 + */
  1620 +getText = Sizzle.getText = function( elem ) {
  1621 + var node,
  1622 + ret = "",
  1623 + i = 0,
  1624 + nodeType = elem.nodeType;
  1625 +
  1626 + if ( !nodeType ) {
  1627 + // If no nodeType, this is expected to be an array
  1628 + while ( (node = elem[i++]) ) {
  1629 + // Do not traverse comment nodes
  1630 + ret += getText( node );
  1631 + }
  1632 + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
  1633 + // Use textContent for elements
  1634 + // innerText usage removed for consistency of new lines (jQuery #11153)
  1635 + if ( typeof elem.textContent === "string" ) {
  1636 + return elem.textContent;
  1637 + } else {
  1638 + // Traverse its children
  1639 + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  1640 + ret += getText( elem );
  1641 + }
  1642 + }
  1643 + } else if ( nodeType === 3 || nodeType === 4 ) {
  1644 + return elem.nodeValue;
  1645 + }
  1646 + // Do not include comment or processing instruction nodes
  1647 +
  1648 + return ret;
  1649 +};
  1650 +
  1651 +Expr = Sizzle.selectors = {
  1652 +
  1653 + // Can be adjusted by the user
  1654 + cacheLength: 50,
  1655 +
  1656 + createPseudo: markFunction,
  1657 +
  1658 + match: matchExpr,
  1659 +
  1660 + attrHandle: {},
  1661 +
  1662 + find: {},
  1663 +
  1664 + relative: {
  1665 + ">": { dir: "parentNode", first: true },
  1666 + " ": { dir: "parentNode" },
  1667 + "+": { dir: "previousSibling", first: true },
  1668 + "~": { dir: "previousSibling" }
  1669 + },
  1670 +
  1671 + preFilter: {
  1672 + "ATTR": function( match ) {
  1673 + match[1] = match[1].replace( runescape, funescape );
  1674 +
  1675 + // Move the given value to match[3] whether quoted or unquoted
  1676 + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
  1677 +
  1678 + if ( match[2] === "~=" ) {
  1679 + match[3] = " " + match[3] + " ";
  1680 + }
  1681 +
  1682 + return match.slice( 0, 4 );
  1683 + },
  1684 +
  1685 + "CHILD": function( match ) {
  1686 + /* matches from matchExpr["CHILD"]
  1687 + 1 type (only|nth|...)
  1688 + 2 what (child|of-type)
  1689 + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
  1690 + 4 xn-component of xn+y argument ([+-]?\d*n|)
  1691 + 5 sign of xn-component
  1692 + 6 x of xn-component
  1693 + 7 sign of y-component
  1694 + 8 y of y-component
  1695 + */
  1696 + match[1] = match[1].toLowerCase();
  1697 +
  1698 + if ( match[1].slice( 0, 3 ) === "nth" ) {
  1699 + // nth-* requires argument
  1700 + if ( !match[3] ) {
  1701 + Sizzle.error( match[0] );
  1702 + }
  1703 +
  1704 + // numeric x and y parameters for Expr.filter.CHILD
  1705 + // remember that false/true cast respectively to 0/1
  1706 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
  1707 + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
  1708 +
  1709 + // other types prohibit arguments
  1710 + } else if ( match[3] ) {
  1711 + Sizzle.error( match[0] );
  1712 + }
  1713 +
  1714 + return match;
  1715 + },
  1716 +
  1717 + "PSEUDO": function( match ) {
  1718 + var excess,
  1719 + unquoted = !match[6] && match[2];
  1720 +
  1721 + if ( matchExpr["CHILD"].test( match[0] ) ) {
  1722 + return null;
  1723 + }
  1724 +
  1725 + // Accept quoted arguments as-is
  1726 + if ( match[3] ) {
  1727 + match[2] = match[4] || match[5] || "";
  1728 +
  1729 + // Strip excess characters from unquoted arguments
  1730 + } else if ( unquoted && rpseudo.test( unquoted ) &&
  1731 + // Get excess from tokenize (recursively)
  1732 + (excess = tokenize( unquoted, true )) &&
  1733 + // advance to the next closing parenthesis
  1734 + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
  1735 +
  1736 + // excess is a negative index
  1737 + match[0] = match[0].slice( 0, excess );
  1738 + match[2] = unquoted.slice( 0, excess );
  1739 + }
  1740 +
  1741 + // Return only captures needed by the pseudo filter method (type and argument)
  1742 + return match.slice( 0, 3 );
  1743 + }
  1744 + },
  1745 +
  1746 + filter: {
  1747 +
  1748 + "TAG": function( nodeNameSelector ) {
  1749 + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
  1750 + return nodeNameSelector === "*" ?
  1751 + function() { return true; } :
  1752 + function( elem ) {
  1753 + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
  1754 + };
  1755 + },
  1756 +
  1757 + "CLASS": function( className ) {
  1758 + var pattern = classCache[ className + " " ];
  1759 +
  1760 + return pattern ||
  1761 + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
  1762 + classCache( className, function( elem ) {
  1763 + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
  1764 + });
  1765 + },
  1766 +
  1767 + "ATTR": function( name, operator, check ) {
  1768 + return function( elem ) {
  1769 + var result = Sizzle.attr( elem, name );
  1770 +
  1771 + if ( result == null ) {
  1772 + return operator === "!=";
  1773 + }
  1774 + if ( !operator ) {
  1775 + return true;
  1776 + }
  1777 +
  1778 + result += "";
  1779 +
  1780 + return operator === "=" ? result === check :
  1781 + operator === "!=" ? result !== check :
  1782 + operator === "^=" ? check && result.indexOf( check ) === 0 :
  1783 + operator === "*=" ? check && result.indexOf( check ) > -1 :
  1784 + operator === "$=" ? check && result.slice( -check.length ) === check :
  1785 + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
  1786 + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
  1787 + false;
  1788 + };
  1789 + },
  1790 +
  1791 + "CHILD": function( type, what, argument, first, last ) {
  1792 + var simple = type.slice( 0, 3 ) !== "nth",
  1793 + forward = type.slice( -4 ) !== "last",
  1794 + ofType = what === "of-type";
  1795 +
  1796 + return first === 1 && last === 0 ?
  1797 +
  1798 + // Shortcut for :nth-*(n)
  1799 + function( elem ) {
  1800 + return !!elem.parentNode;
  1801 + } :
  1802 +
  1803 + function( elem, context, xml ) {
  1804 + var cache, uniqueCache, outerCache, node, nodeIndex, start,
  1805 + dir = simple !== forward ? "nextSibling" : "previousSibling",
  1806 + parent = elem.parentNode,
  1807 + name = ofType && elem.nodeName.toLowerCase(),
  1808 + useCache = !xml && !ofType,
  1809 + diff = false;
  1810 +
  1811 + if ( parent ) {
  1812 +
  1813 + // :(first|last|only)-(child|of-type)
  1814 + if ( simple ) {
  1815 + while ( dir ) {
  1816 + node = elem;
  1817 + while ( (node = node[ dir ]) ) {
  1818 + if ( ofType ?
  1819 + node.nodeName.toLowerCase() === name :
  1820 + node.nodeType === 1 ) {
  1821 +
  1822 + return false;
  1823 + }
  1824 + }
  1825 + // Reverse direction for :only-* (if we haven't yet done so)
  1826 + start = dir = type === "only" && !start && "nextSibling";
  1827 + }
  1828 + return true;
  1829 + }
  1830 +
  1831 + start = [ forward ? parent.firstChild : parent.lastChild ];
  1832 +
  1833 + // non-xml :nth-child(...) stores cache data on `parent`
  1834 + if ( forward && useCache ) {
  1835 +
  1836 + // Seek `elem` from a previously-cached index
  1837 +
  1838 + // ...in a gzip-friendly way
  1839 + node = parent;
  1840 + outerCache = node[ expando ] || (node[ expando ] = {});
  1841 +
  1842 + // Support: IE <9 only
  1843 + // Defend against cloned attroperties (jQuery gh-1709)
  1844 + uniqueCache = outerCache[ node.uniqueID ] ||
  1845 + (outerCache[ node.uniqueID ] = {});
  1846 +
  1847 + cache = uniqueCache[ type ] || [];
  1848 + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
  1849 + diff = nodeIndex && cache[ 2 ];
  1850 + node = nodeIndex && parent.childNodes[ nodeIndex ];
  1851 +
  1852 + while ( (node = ++nodeIndex && node && node[ dir ] ||
  1853 +
  1854 + // Fallback to seeking `elem` from the start
  1855 + (diff = nodeIndex = 0) || start.pop()) ) {
  1856 +
  1857 + // When found, cache indexes on `parent` and break
  1858 + if ( node.nodeType === 1 && ++diff && node === elem ) {
  1859 + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
  1860 + break;
  1861 + }
  1862 + }
  1863 +
  1864 + } else {
  1865 + // Use previously-cached element index if available
  1866 + if ( useCache ) {
  1867 + // ...in a gzip-friendly way
  1868 + node = elem;
  1869 + outerCache = node[ expando ] || (node[ expando ] = {});
  1870 +
  1871 + // Support: IE <9 only
  1872 + // Defend against cloned attroperties (jQuery gh-1709)
  1873 + uniqueCache = outerCache[ node.uniqueID ] ||
  1874 + (outerCache[ node.uniqueID ] = {});
  1875 +
  1876 + cache = uniqueCache[ type ] || [];
  1877 + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
  1878 + diff = nodeIndex;
  1879 + }
  1880 +
  1881 + // xml :nth-child(...)
  1882 + // or :nth-last-child(...) or :nth(-last)?-of-type(...)
  1883 + if ( diff === false ) {
  1884 + // Use the same loop as above to seek `elem` from the start
  1885 + while ( (node = ++nodeIndex && node && node[ dir ] ||
  1886 + (diff = nodeIndex = 0) || start.pop()) ) {
  1887 +
  1888 + if ( ( ofType ?
  1889 + node.nodeName.toLowerCase() === name :
  1890 + node.nodeType === 1 ) &&
  1891 + ++diff ) {
  1892 +
  1893 + // Cache the index of each encountered element
  1894 + if ( useCache ) {
  1895 + outerCache = node[ expando ] || (node[ expando ] = {});
  1896 +
  1897 + // Support: IE <9 only
  1898 + // Defend against cloned attroperties (jQuery gh-1709)
  1899 + uniqueCache = outerCache[ node.uniqueID ] ||
  1900 + (outerCache[ node.uniqueID ] = {});
  1901 +
  1902 + uniqueCache[ type ] = [ dirruns, diff ];
  1903 + }
  1904 +
  1905 + if ( node === elem ) {
  1906 + break;
  1907 + }
  1908 + }
  1909 + }
  1910 + }
  1911 + }
  1912 +
  1913 + // Incorporate the offset, then check against cycle size
  1914 + diff -= last;
  1915 + return diff === first || ( diff % first === 0 && diff / first >= 0 );
  1916 + }
  1917 + };
  1918 + },
  1919 +
  1920 + "PSEUDO": function( pseudo, argument ) {
  1921 + // pseudo-class names are case-insensitive
  1922 + // http://www.w3.org/TR/selectors/#pseudo-classes
  1923 + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
  1924 + // Remember that setFilters inherits from pseudos
  1925 + var args,
  1926 + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
  1927 + Sizzle.error( "unsupported pseudo: " + pseudo );
  1928 +
  1929 + // The user may use createPseudo to indicate that
  1930 + // arguments are needed to create the filter function
  1931 + // just as Sizzle does
  1932 + if ( fn[ expando ] ) {
  1933 + return fn( argument );
  1934 + }
  1935 +
  1936 + // But maintain support for old signatures
  1937 + if ( fn.length > 1 ) {
  1938 + args = [ pseudo, pseudo, "", argument ];
  1939 + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
  1940 + markFunction(function( seed, matches ) {
  1941 + var idx,
  1942 + matched = fn( seed, argument ),
  1943 + i = matched.length;
  1944 + while ( i-- ) {
  1945 + idx = indexOf( seed, matched[i] );
  1946 + seed[ idx ] = !( matches[ idx ] = matched[i] );
  1947 + }
  1948 + }) :
  1949 + function( elem ) {
  1950 + return fn( elem, 0, args );
  1951 + };
  1952 + }
  1953 +
  1954 + return fn;
  1955 + }
  1956 + },
  1957 +
  1958 + pseudos: {
  1959 + // Potentially complex pseudos
  1960 + "not": markFunction(function( selector ) {
  1961 + // Trim the selector passed to compile
  1962 + // to avoid treating leading and trailing
  1963 + // spaces as combinators
  1964 + var input = [],
  1965 + results = [],
  1966 + matcher = compile( selector.replace( rtrim, "$1" ) );
  1967 +
  1968 + return matcher[ expando ] ?
  1969 + markFunction(function( seed, matches, context, xml ) {
  1970 + var elem,
  1971 + unmatched = matcher( seed, null, xml, [] ),
  1972 + i = seed.length;
  1973 +
  1974 + // Match elements unmatched by `matcher`
  1975 + while ( i-- ) {
  1976 + if ( (elem = unmatched[i]) ) {
  1977 + seed[i] = !(matches[i] = elem);
  1978 + }
  1979 + }
  1980 + }) :
  1981 + function( elem, context, xml ) {
  1982 + input[0] = elem;
  1983 + matcher( input, null, xml, results );
  1984 + // Don't keep the element (issue #299)
  1985 + input[0] = null;
  1986 + return !results.pop();
  1987 + };
  1988 + }),
  1989 +
  1990 + "has": markFunction(function( selector ) {
  1991 + return function( elem ) {
  1992 + return Sizzle( selector, elem ).length > 0;
  1993 + };
  1994 + }),
  1995 +
  1996 + "contains": markFunction(function( text ) {
  1997 + text = text.replace( runescape, funescape );
  1998 + return function( elem ) {
  1999 + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
  2000 + };
  2001 + }),
  2002 +
  2003 + // "Whether an element is represented by a :lang() selector
  2004 + // is based solely on the element's language value
  2005 + // being equal to the identifier C,
  2006 + // or beginning with the identifier C immediately followed by "-".
  2007 + // The matching of C against the element's language value is performed case-insensitively.
  2008 + // The identifier C does not have to be a valid language name."
  2009 + // http://www.w3.org/TR/selectors/#lang-pseudo
  2010 + "lang": markFunction( function( lang ) {
  2011 + // lang value must be a valid identifier
  2012 + if ( !ridentifier.test(lang || "") ) {
  2013 + Sizzle.error( "unsupported lang: " + lang );
  2014 + }
  2015 + lang = lang.replace( runescape, funescape ).toLowerCase();
  2016 + return function( elem ) {
  2017 + var elemLang;
  2018 + do {
  2019 + if ( (elemLang = documentIsHTML ?
  2020 + elem.lang :
  2021 + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
  2022 +
  2023 + elemLang = elemLang.toLowerCase();
  2024 + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
  2025 + }
  2026 + } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
  2027 + return false;
  2028 + };
  2029 + }),
  2030 +
  2031 + // Miscellaneous
  2032 + "target": function( elem ) {
  2033 + var hash = window.location && window.location.hash;
  2034 + return hash && hash.slice( 1 ) === elem.id;
  2035 + },
  2036 +
  2037 + "root": function( elem ) {
  2038 + return elem === docElem;
  2039 + },
  2040 +
  2041 + "focus": function( elem ) {
  2042 + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
  2043 + },
  2044 +
  2045 + // Boolean properties
  2046 + "enabled": createDisabledPseudo( false ),
  2047 + "disabled": createDisabledPseudo( true ),
  2048 +
  2049 + "checked": function( elem ) {
  2050 + // In CSS3, :checked should return both checked and selected elements
  2051 + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  2052 + var nodeName = elem.nodeName.toLowerCase();
  2053 + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
  2054 + },
  2055 +
  2056 + "selected": function( elem ) {
  2057 + // Accessing this property makes selected-by-default
  2058 + // options in Safari work properly
  2059 + if ( elem.parentNode ) {
  2060 + elem.parentNode.selectedIndex;
  2061 + }
  2062 +
  2063 + return elem.selected === true;
  2064 + },
  2065 +
  2066 + // Contents
  2067 + "empty": function( elem ) {
  2068 + // http://www.w3.org/TR/selectors/#empty-pseudo
  2069 + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
  2070 + // but not by others (comment: 8; processing instruction: 7; etc.)
  2071 + // nodeType < 6 works because attributes (2) do not appear as children
  2072 + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  2073 + if ( elem.nodeType < 6 ) {
  2074 + return false;
  2075 + }
  2076 + }
  2077 + return true;
  2078 + },
  2079 +
  2080 + "parent": function( elem ) {
  2081 + return !Expr.pseudos["empty"]( elem );
  2082 + },
  2083 +
  2084 + // Element/input types
  2085 + "header": function( elem ) {
  2086 + return rheader.test( elem.nodeName );
  2087 + },
  2088 +
  2089 + "input": function( elem ) {
  2090 + return rinputs.test( elem.nodeName );
  2091 + },
  2092 +
  2093 + "button": function( elem ) {
  2094 + var name = elem.nodeName.toLowerCase();
  2095 + return name === "input" && elem.type === "button" || name === "button";
  2096 + },
  2097 +
  2098 + "text": function( elem ) {
  2099 + var attr;
  2100 + return elem.nodeName.toLowerCase() === "input" &&
  2101 + elem.type === "text" &&
  2102 +
  2103 + // Support: IE<8
  2104 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
  2105 + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
  2106 + },
  2107 +
  2108 + // Position-in-collection
  2109 + "first": createPositionalPseudo(function() {
  2110 + return [ 0 ];
  2111 + }),
  2112 +
  2113 + "last": createPositionalPseudo(function( matchIndexes, length ) {
  2114 + return [ length - 1 ];
  2115 + }),
  2116 +
  2117 + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
  2118 + return [ argument < 0 ? argument + length : argument ];
  2119 + }),
  2120 +
  2121 + "even": createPositionalPseudo(function( matchIndexes, length ) {
  2122 + var i = 0;
  2123 + for ( ; i < length; i += 2 ) {
  2124 + matchIndexes.push( i );
  2125 + }
  2126 + return matchIndexes;
  2127 + }),
  2128 +
  2129 + "odd": createPositionalPseudo(function( matchIndexes, length ) {
  2130 + var i = 1;
  2131 + for ( ; i < length; i += 2 ) {
  2132 + matchIndexes.push( i );
  2133 + }
  2134 + return matchIndexes;
  2135 + }),
  2136 +
  2137 + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
  2138 + var i = argument < 0 ? argument + length : argument;
  2139 + for ( ; --i >= 0; ) {
  2140 + matchIndexes.push( i );
  2141 + }
  2142 + return matchIndexes;
  2143 + }),
  2144 +
  2145 + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
  2146 + var i = argument < 0 ? argument + length : argument;
  2147 + for ( ; ++i < length; ) {
  2148 + matchIndexes.push( i );
  2149 + }
  2150 + return matchIndexes;
  2151 + })
  2152 + }
  2153 +};
  2154 +
  2155 +Expr.pseudos["nth"] = Expr.pseudos["eq"];
  2156 +
  2157 +// Add button/input type pseudos
  2158 +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
  2159 + Expr.pseudos[ i ] = createInputPseudo( i );
  2160 +}
  2161 +for ( i in { submit: true, reset: true } ) {
  2162 + Expr.pseudos[ i ] = createButtonPseudo( i );
  2163 +}
  2164 +
  2165 +// Easy API for creating new setFilters
  2166 +function setFilters() {}
  2167 +setFilters.prototype = Expr.filters = Expr.pseudos;
  2168 +Expr.setFilters = new setFilters();
  2169 +
  2170 +tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
  2171 + var matched, match, tokens, type,
  2172 + soFar, groups, preFilters,
  2173 + cached = tokenCache[ selector + " " ];
  2174 +
  2175 + if ( cached ) {
  2176 + return parseOnly ? 0 : cached.slice( 0 );
  2177 + }
  2178 +
  2179 + soFar = selector;
  2180 + groups = [];
  2181 + preFilters = Expr.preFilter;
  2182 +
  2183 + while ( soFar ) {
  2184 +
  2185 + // Comma and first run
  2186 + if ( !matched || (match = rcomma.exec( soFar )) ) {
  2187 + if ( match ) {
  2188 + // Don't consume trailing commas as valid
  2189 + soFar = soFar.slice( match[0].length ) || soFar;
  2190 + }
  2191 + groups.push( (tokens = []) );
  2192 + }
  2193 +
  2194 + matched = false;
  2195 +
  2196 + // Combinators
  2197 + if ( (match = rcombinators.exec( soFar )) ) {
  2198 + matched = match.shift();
  2199 + tokens.push({
  2200 + value: matched,
  2201 + // Cast descendant combinators to space
  2202 + type: match[0].replace( rtrim, " " )
  2203 + });
  2204 + soFar = soFar.slice( matched.length );
  2205 + }
  2206 +
  2207 + // Filters
  2208 + for ( type in Expr.filter ) {
  2209 + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
  2210 + (match = preFilters[ type ]( match ))) ) {
  2211 + matched = match.shift();
  2212 + tokens.push({
  2213 + value: matched,
  2214 + type: type,
  2215 + matches: match
  2216 + });
  2217 + soFar = soFar.slice( matched.length );
  2218 + }
  2219 + }
  2220 +
  2221 + if ( !matched ) {
  2222 + break;
  2223 + }
  2224 + }
  2225 +
  2226 + // Return the length of the invalid excess
  2227 + // if we're just parsing
  2228 + // Otherwise, throw an error or return tokens
  2229 + return parseOnly ?
  2230 + soFar.length :
  2231 + soFar ?
  2232 + Sizzle.error( selector ) :
  2233 + // Cache the tokens
  2234 + tokenCache( selector, groups ).slice( 0 );
  2235 +};
  2236 +
  2237 +function toSelector( tokens ) {
  2238 + var i = 0,
  2239 + len = tokens.length,
  2240 + selector = "";
  2241 + for ( ; i < len; i++ ) {
  2242 + selector += tokens[i].value;
  2243 + }
  2244 + return selector;
  2245 +}
  2246 +
  2247 +function addCombinator( matcher, combinator, base ) {
  2248 + var dir = combinator.dir,
  2249 + skip = combinator.next,
  2250 + key = skip || dir,
  2251 + checkNonElements = base && key === "parentNode",
  2252 + doneName = done++;
  2253 +
  2254 + return combinator.first ?
  2255 + // Check against closest ancestor/preceding element
  2256 + function( elem, context, xml ) {
  2257 + while ( (elem = elem[ dir ]) ) {
  2258 + if ( elem.nodeType === 1 || checkNonElements ) {
  2259 + return matcher( elem, context, xml );
  2260 + }
  2261 + }
  2262 + return false;
  2263 + } :
  2264 +
  2265 + // Check against all ancestor/preceding elements
  2266 + function( elem, context, xml ) {
  2267 + var oldCache, uniqueCache, outerCache,
  2268 + newCache = [ dirruns, doneName ];
  2269 +
  2270 + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
  2271 + if ( xml ) {
  2272 + while ( (elem = elem[ dir ]) ) {
  2273 + if ( elem.nodeType === 1 || checkNonElements ) {
  2274 + if ( matcher( elem, context, xml ) ) {
  2275 + return true;
  2276 + }
  2277 + }
  2278 + }
  2279 + } else {
  2280 + while ( (elem = elem[ dir ]) ) {
  2281 + if ( elem.nodeType === 1 || checkNonElements ) {
  2282 + outerCache = elem[ expando ] || (elem[ expando ] = {});
  2283 +
  2284 + // Support: IE <9 only
  2285 + // Defend against cloned attroperties (jQuery gh-1709)
  2286 + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
  2287 +
  2288 + if ( skip && skip === elem.nodeName.toLowerCase() ) {
  2289 + elem = elem[ dir ] || elem;
  2290 + } else if ( (oldCache = uniqueCache[ key ]) &&
  2291 + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
  2292 +
  2293 + // Assign to newCache so results back-propagate to previous elements
  2294 + return (newCache[ 2 ] = oldCache[ 2 ]);
  2295 + } else {
  2296 + // Reuse newcache so results back-propagate to previous elements
  2297 + uniqueCache[ key ] = newCache;
  2298 +
  2299 + // A match means we're done; a fail means we have to keep checking
  2300 + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
  2301 + return true;
  2302 + }
  2303 + }
  2304 + }
  2305 + }
  2306 + }
  2307 + return false;
  2308 + };
  2309 +}
  2310 +
  2311 +function elementMatcher( matchers ) {
  2312 + return matchers.length > 1 ?
  2313 + function( elem, context, xml ) {
  2314 + var i = matchers.length;
  2315 + while ( i-- ) {
  2316 + if ( !matchers[i]( elem, context, xml ) ) {
  2317 + return false;
  2318 + }
  2319 + }
  2320 + return true;
  2321 + } :
  2322 + matchers[0];
  2323 +}
  2324 +
  2325 +function multipleContexts( selector, contexts, results ) {
  2326 + var i = 0,
  2327 + len = contexts.length;
  2328 + for ( ; i < len; i++ ) {
  2329 + Sizzle( selector, contexts[i], results );
  2330 + }
  2331 + return results;
  2332 +}
  2333 +
  2334 +function condense( unmatched, map, filter, context, xml ) {
  2335 + var elem,
  2336 + newUnmatched = [],
  2337 + i = 0,
  2338 + len = unmatched.length,
  2339 + mapped = map != null;
  2340 +
  2341 + for ( ; i < len; i++ ) {
  2342 + if ( (elem = unmatched[i]) ) {
  2343 + if ( !filter || filter( elem, context, xml ) ) {
  2344 + newUnmatched.push( elem );
  2345 + if ( mapped ) {
  2346 + map.push( i );
  2347 + }
  2348 + }
  2349 + }
  2350 + }
  2351 +
  2352 + return newUnmatched;
  2353 +}
  2354 +
  2355 +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
  2356 + if ( postFilter && !postFilter[ expando ] ) {
  2357 + postFilter = setMatcher( postFilter );
  2358 + }
  2359 + if ( postFinder && !postFinder[ expando ] ) {
  2360 + postFinder = setMatcher( postFinder, postSelector );
  2361 + }
  2362 + return markFunction(function( seed, results, context, xml ) {
  2363 + var temp, i, elem,
  2364 + preMap = [],
  2365 + postMap = [],
  2366 + preexisting = results.length,
  2367 +
  2368 + // Get initial elements from seed or context
  2369 + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
  2370 +
  2371 + // Prefilter to get matcher input, preserving a map for seed-results synchronization
  2372 + matcherIn = preFilter && ( seed || !selector ) ?
  2373 + condense( elems, preMap, preFilter, context, xml ) :
  2374 + elems,
  2375 +
  2376 + matcherOut = matcher ?
  2377 + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
  2378 + postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
  2379 +
  2380 + // ...intermediate processing is necessary
  2381 + [] :
  2382 +
  2383 + // ...otherwise use results directly
  2384 + results :
  2385 + matcherIn;
  2386 +
  2387 + // Find primary matches
  2388 + if ( matcher ) {
  2389 + matcher( matcherIn, matcherOut, context, xml );
  2390 + }
  2391 +
  2392 + // Apply postFilter
  2393 + if ( postFilter ) {
  2394 + temp = condense( matcherOut, postMap );
  2395 + postFilter( temp, [], context, xml );
  2396 +
  2397 + // Un-match failing elements by moving them back to matcherIn
  2398 + i = temp.length;
  2399 + while ( i-- ) {
  2400 + if ( (elem = temp[i]) ) {
  2401 + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
  2402 + }
  2403 + }
  2404 + }
  2405 +
  2406 + if ( seed ) {
  2407 + if ( postFinder || preFilter ) {
  2408 + if ( postFinder ) {
  2409 + // Get the final matcherOut by condensing this intermediate into postFinder contexts
  2410 + temp = [];
  2411 + i = matcherOut.length;
  2412 + while ( i-- ) {
  2413 + if ( (elem = matcherOut[i]) ) {
  2414 + // Restore matcherIn since elem is not yet a final match
  2415 + temp.push( (matcherIn[i] = elem) );
  2416 + }
  2417 + }
  2418 + postFinder( null, (matcherOut = []), temp, xml );
  2419 + }
  2420 +
  2421 + // Move matched elements from seed to results to keep them synchronized
  2422 + i = matcherOut.length;
  2423 + while ( i-- ) {
  2424 + if ( (elem = matcherOut[i]) &&
  2425 + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
  2426 +
  2427 + seed[temp] = !(results[temp] = elem);
  2428 + }
  2429 + }
  2430 + }
  2431 +
  2432 + // Add elements to results, through postFinder if defined
  2433 + } else {
  2434 + matcherOut = condense(
  2435 + matcherOut === results ?
  2436 + matcherOut.splice( preexisting, matcherOut.length ) :
  2437 + matcherOut
  2438 + );
  2439 + if ( postFinder ) {
  2440 + postFinder( null, results, matcherOut, xml );
  2441 + } else {
  2442 + push.apply( results, matcherOut );
  2443 + }
  2444 + }
  2445 + });
  2446 +}
  2447 +
  2448 +function matcherFromTokens( tokens ) {
  2449 + var checkContext, matcher, j,
  2450 + len = tokens.length,
  2451 + leadingRelative = Expr.relative[ tokens[0].type ],
  2452 + implicitRelative = leadingRelative || Expr.relative[" "],
  2453 + i = leadingRelative ? 1 : 0,
  2454 +
  2455 + // The foundational matcher ensures that elements are reachable from top-level context(s)
  2456 + matchContext = addCombinator( function( elem ) {
  2457 + return elem === checkContext;
  2458 + }, implicitRelative, true ),
  2459 + matchAnyContext = addCombinator( function( elem ) {
  2460 + return indexOf( checkContext, elem ) > -1;
  2461 + }, implicitRelative, true ),
  2462 + matchers = [ function( elem, context, xml ) {
  2463 + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
  2464 + (checkContext = context).nodeType ?
  2465 + matchContext( elem, context, xml ) :
  2466 + matchAnyContext( elem, context, xml ) );
  2467 + // Avoid hanging onto element (issue #299)
  2468 + checkContext = null;
  2469 + return ret;
  2470 + } ];
  2471 +
  2472 + for ( ; i < len; i++ ) {
  2473 + if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
  2474 + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
  2475 + } else {
  2476 + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
  2477 +
  2478 + // Return special upon seeing a positional matcher
  2479 + if ( matcher[ expando ] ) {
  2480 + // Find the next relative operator (if any) for proper handling
  2481 + j = ++i;
  2482 + for ( ; j < len; j++ ) {
  2483 + if ( Expr.relative[ tokens[j].type ] ) {
  2484 + break;
  2485 + }
  2486 + }
  2487 + return setMatcher(
  2488 + i > 1 && elementMatcher( matchers ),
  2489 + i > 1 && toSelector(
  2490 + // If the preceding token was a descendant combinator, insert an implicit any-element `*`
  2491 + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
  2492 + ).replace( rtrim, "$1" ),
  2493 + matcher,
  2494 + i < j && matcherFromTokens( tokens.slice( i, j ) ),
  2495 + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
  2496 + j < len && toSelector( tokens )
  2497 + );
  2498 + }
  2499 + matchers.push( matcher );
  2500 + }
  2501 + }
  2502 +
  2503 + return elementMatcher( matchers );
  2504 +}
  2505 +
  2506 +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  2507 + var bySet = setMatchers.length > 0,
  2508 + byElement = elementMatchers.length > 0,
  2509 + superMatcher = function( seed, context, xml, results, outermost ) {
  2510 + var elem, j, matcher,
  2511 + matchedCount = 0,
  2512 + i = "0",
  2513 + unmatched = seed && [],
  2514 + setMatched = [],
  2515 + contextBackup = outermostContext,
  2516 + // We must always have either seed elements or outermost context
  2517 + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
  2518 + // Use integer dirruns iff this is the outermost matcher
  2519 + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
  2520 + len = elems.length;
  2521 +
  2522 + if ( outermost ) {
  2523 + outermostContext = context === document || context || outermost;
  2524 + }
  2525 +
  2526 + // Add elements passing elementMatchers directly to results
  2527 + // Support: IE<9, Safari
  2528 + // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
  2529 + for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
  2530 + if ( byElement && elem ) {
  2531 + j = 0;
  2532 + if ( !context && elem.ownerDocument !== document ) {
  2533 + setDocument( elem );
  2534 + xml = !documentIsHTML;
  2535 + }
  2536 + while ( (matcher = elementMatchers[j++]) ) {
  2537 + if ( matcher( elem, context || document, xml) ) {
  2538 + results.push( elem );
  2539 + break;
  2540 + }
  2541 + }
  2542 + if ( outermost ) {
  2543 + dirruns = dirrunsUnique;
  2544 + }
  2545 + }
  2546 +
  2547 + // Track unmatched elements for set filters
  2548 + if ( bySet ) {
  2549 + // They will have gone through all possible matchers
  2550 + if ( (elem = !matcher && elem) ) {
  2551 + matchedCount--;
  2552 + }
  2553 +
  2554 + // Lengthen the array for every element, matched or not
  2555 + if ( seed ) {
  2556 + unmatched.push( elem );
  2557 + }
  2558 + }
  2559 + }
  2560 +
  2561 + // `i` is now the count of elements visited above, and adding it to `matchedCount`
  2562 + // makes the latter nonnegative.
  2563 + matchedCount += i;
  2564 +
  2565 + // Apply set filters to unmatched elements
  2566 + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
  2567 + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
  2568 + // no element matchers and no seed.
  2569 + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
  2570 + // case, which will result in a "00" `matchedCount` that differs from `i` but is also
  2571 + // numerically zero.
  2572 + if ( bySet && i !== matchedCount ) {
  2573 + j = 0;
  2574 + while ( (matcher = setMatchers[j++]) ) {
  2575 + matcher( unmatched, setMatched, context, xml );
  2576 + }
  2577 +
  2578 + if ( seed ) {
  2579 + // Reintegrate element matches to eliminate the need for sorting
  2580 + if ( matchedCount > 0 ) {
  2581 + while ( i-- ) {
  2582 + if ( !(unmatched[i] || setMatched[i]) ) {
  2583 + setMatched[i] = pop.call( results );
  2584 + }
  2585 + }
  2586 + }
  2587 +
  2588 + // Discard index placeholder values to get only actual matches
  2589 + setMatched = condense( setMatched );
  2590 + }
  2591 +
  2592 + // Add matches to results
  2593 + push.apply( results, setMatched );
  2594 +
  2595 + // Seedless set matches succeeding multiple successful matchers stipulate sorting
  2596 + if ( outermost && !seed && setMatched.length > 0 &&
  2597 + ( matchedCount + setMatchers.length ) > 1 ) {
  2598 +
  2599 + Sizzle.uniqueSort( results );
  2600 + }
  2601 + }
  2602 +
  2603 + // Override manipulation of globals by nested matchers
  2604 + if ( outermost ) {
  2605 + dirruns = dirrunsUnique;
  2606 + outermostContext = contextBackup;
  2607 + }
  2608 +
  2609 + return unmatched;
  2610 + };
  2611 +
  2612 + return bySet ?
  2613 + markFunction( superMatcher ) :
  2614 + superMatcher;
  2615 +}
  2616 +
  2617 +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
  2618 + var i,
  2619 + setMatchers = [],
  2620 + elementMatchers = [],
  2621 + cached = compilerCache[ selector + " " ];
  2622 +
  2623 + if ( !cached ) {
  2624 + // Generate a function of recursive functions that can be used to check each element
  2625 + if ( !match ) {
  2626 + match = tokenize( selector );
  2627 + }
  2628 + i = match.length;
  2629 + while ( i-- ) {
  2630 + cached = matcherFromTokens( match[i] );
  2631 + if ( cached[ expando ] ) {
  2632 + setMatchers.push( cached );
  2633 + } else {
  2634 + elementMatchers.push( cached );
  2635 + }
  2636 + }
  2637 +
  2638 + // Cache the compiled function
  2639 + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
  2640 +
  2641 + // Save selector and tokenization
  2642 + cached.selector = selector;
  2643 + }
  2644 + return cached;
  2645 +};
  2646 +
  2647 +/**
  2648 + * A low-level selection function that works with Sizzle's compiled
  2649 + * selector functions
  2650 + * @param {String|Function} selector A selector or a pre-compiled
  2651 + * selector function built with Sizzle.compile
  2652 + * @param {Element} context
  2653 + * @param {Array} [results]
  2654 + * @param {Array} [seed] A set of elements to match against
  2655 + */
  2656 +select = Sizzle.select = function( selector, context, results, seed ) {
  2657 + var i, tokens, token, type, find,
  2658 + compiled = typeof selector === "function" && selector,
  2659 + match = !seed && tokenize( (selector = compiled.selector || selector) );
  2660 +
  2661 + results = results || [];
  2662 +
  2663 + // Try to minimize operations if there is only one selector in the list and no seed
  2664 + // (the latter of which guarantees us context)
  2665 + if ( match.length === 1 ) {
  2666 +
  2667 + // Reduce context if the leading compound selector is an ID
  2668 + tokens = match[0] = match[0].slice( 0 );
  2669 + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
  2670 + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
  2671 +
  2672 + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
  2673 + if ( !context ) {
  2674 + return results;
  2675 +
  2676 + // Precompiled matchers will still verify ancestry, so step up a level
  2677 + } else if ( compiled ) {
  2678 + context = context.parentNode;
  2679 + }
  2680 +
  2681 + selector = selector.slice( tokens.shift().value.length );
  2682 + }
  2683 +
  2684 + // Fetch a seed set for right-to-left matching
  2685 + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
  2686 + while ( i-- ) {
  2687 + token = tokens[i];
  2688 +
  2689 + // Abort if we hit a combinator
  2690 + if ( Expr.relative[ (type = token.type) ] ) {
  2691 + break;
  2692 + }
  2693 + if ( (find = Expr.find[ type ]) ) {
  2694 + // Search, expanding context for leading sibling combinators
  2695 + if ( (seed = find(
  2696 + token.matches[0].replace( runescape, funescape ),
  2697 + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
  2698 + )) ) {
  2699 +
  2700 + // If seed is empty or no tokens remain, we can return early
  2701 + tokens.splice( i, 1 );
  2702 + selector = seed.length && toSelector( tokens );
  2703 + if ( !selector ) {
  2704 + push.apply( results, seed );
  2705 + return results;
  2706 + }
  2707 +
  2708 + break;
  2709 + }
  2710 + }
  2711 + }
  2712 + }
  2713 +
  2714 + // Compile and execute a filtering function if one is not provided
  2715 + // Provide `match` to avoid retokenization if we modified the selector above
  2716 + ( compiled || compile( selector, match ) )(
  2717 + seed,
  2718 + context,
  2719 + !documentIsHTML,
  2720 + results,
  2721 + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
  2722 + );
  2723 + return results;
  2724 +};
  2725 +
  2726 +// One-time assignments
  2727 +
  2728 +// Sort stability
  2729 +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
  2730 +
  2731 +// Support: Chrome 14-35+
  2732 +// Always assume duplicates if they aren't passed to the comparison function
  2733 +support.detectDuplicates = !!hasDuplicate;
  2734 +
  2735 +// Initialize against the default document
  2736 +setDocument();
  2737 +
  2738 +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
  2739 +// Detached nodes confoundingly follow *each other*
  2740 +support.sortDetached = assert(function( el ) {
  2741 + // Should return 1, but returns 4 (following)
  2742 + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
  2743 +});
  2744 +
  2745 +// Support: IE<8
  2746 +// Prevent attribute/property "interpolation"
  2747 +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
  2748 +if ( !assert(function( el ) {
  2749 + el.innerHTML = "<a href='#'></a>";
  2750 + return el.firstChild.getAttribute("href") === "#" ;
  2751 +}) ) {
  2752 + addHandle( "type|href|height|width", function( elem, name, isXML ) {
  2753 + if ( !isXML ) {
  2754 + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
  2755 + }
  2756 + });
  2757 +}
  2758 +
  2759 +// Support: IE<9
  2760 +// Use defaultValue in place of getAttribute("value")
  2761 +if ( !support.attributes || !assert(function( el ) {
  2762 + el.innerHTML = "<input/>";
  2763 + el.firstChild.setAttribute( "value", "" );
  2764 + return el.firstChild.getAttribute( "value" ) === "";
  2765 +}) ) {
  2766 + addHandle( "value", function( elem, name, isXML ) {
  2767 + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
  2768 + return elem.defaultValue;
  2769 + }
  2770 + });
  2771 +}
  2772 +
  2773 +// Support: IE<9
  2774 +// Use getAttributeNode to fetch booleans when getAttribute lies
  2775 +if ( !assert(function( el ) {
  2776 + return el.getAttribute("disabled") == null;
  2777 +}) ) {
  2778 + addHandle( booleans, function( elem, name, isXML ) {
  2779 + var val;
  2780 + if ( !isXML ) {
  2781 + return elem[ name ] === true ? name.toLowerCase() :
  2782 + (val = elem.getAttributeNode( name )) && val.specified ?
  2783 + val.value :
  2784 + null;
  2785 + }
  2786 + });
  2787 +}
  2788 +
  2789 +return Sizzle;
  2790 +
  2791 +})( window );
  2792 +
  2793 +
  2794 +
  2795 +jQuery.find = Sizzle;
  2796 +jQuery.expr = Sizzle.selectors;
  2797 +
  2798 +// Deprecated
  2799 +jQuery.expr[ ":" ] = jQuery.expr.pseudos;
  2800 +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
  2801 +jQuery.text = Sizzle.getText;
  2802 +jQuery.isXMLDoc = Sizzle.isXML;
  2803 +jQuery.contains = Sizzle.contains;
  2804 +jQuery.escapeSelector = Sizzle.escape;
  2805 +
  2806 +
  2807 +
  2808 +
  2809 +var dir = function( elem, dir, until ) {
  2810 + var matched = [],
  2811 + truncate = until !== undefined;
  2812 +
  2813 + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
  2814 + if ( elem.nodeType === 1 ) {
  2815 + if ( truncate && jQuery( elem ).is( until ) ) {
  2816 + break;
  2817 + }
  2818 + matched.push( elem );
  2819 + }
  2820 + }
  2821 + return matched;
  2822 +};
  2823 +
  2824 +
  2825 +var siblings = function( n, elem ) {
  2826 + var matched = [];
  2827 +
  2828 + for ( ; n; n = n.nextSibling ) {
  2829 + if ( n.nodeType === 1 && n !== elem ) {
  2830 + matched.push( n );
  2831 + }
  2832 + }
  2833 +
  2834 + return matched;
  2835 +};
  2836 +
  2837 +
  2838 +var rneedsContext = jQuery.expr.match.needsContext;
  2839 +
  2840 +
  2841 +
  2842 +function nodeName( elem, name ) {
  2843 +
  2844 + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
  2845 +
  2846 +};
  2847 +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
  2848 +
  2849 +
  2850 +
  2851 +var risSimple = /^.[^:#\[\.,]*$/;
  2852 +
  2853 +// Implement the identical functionality for filter and not
  2854 +function winnow( elements, qualifier, not ) {
  2855 + if ( jQuery.isFunction( qualifier ) ) {
  2856 + return jQuery.grep( elements, function( elem, i ) {
  2857 + return !!qualifier.call( elem, i, elem ) !== not;
  2858 + } );
  2859 + }
  2860 +
  2861 + // Single element
  2862 + if ( qualifier.nodeType ) {
  2863 + return jQuery.grep( elements, function( elem ) {
  2864 + return ( elem === qualifier ) !== not;
  2865 + } );
  2866 + }
  2867 +
  2868 + // Arraylike of elements (jQuery, arguments, Array)
  2869 + if ( typeof qualifier !== "string" ) {
  2870 + return jQuery.grep( elements, function( elem ) {
  2871 + return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
  2872 + } );
  2873 + }
  2874 +
  2875 + // Simple selector that can be filtered directly, removing non-Elements
  2876 + if ( risSimple.test( qualifier ) ) {
  2877 + return jQuery.filter( qualifier, elements, not );
  2878 + }
  2879 +
  2880 + // Complex selector, compare the two sets, removing non-Elements
  2881 + qualifier = jQuery.filter( qualifier, elements );
  2882 + return jQuery.grep( elements, function( elem ) {
  2883 + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
  2884 + } );
  2885 +}
  2886 +
  2887 +jQuery.filter = function( expr, elems, not ) {
  2888 + var elem = elems[ 0 ];
  2889 +
  2890 + if ( not ) {
  2891 + expr = ":not(" + expr + ")";
  2892 + }
  2893 +
  2894 + if ( elems.length === 1 && elem.nodeType === 1 ) {
  2895 + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
  2896 + }
  2897 +
  2898 + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
  2899 + return elem.nodeType === 1;
  2900 + } ) );
  2901 +};
  2902 +
  2903 +jQuery.fn.extend( {
  2904 + find: function( selector ) {
  2905 + var i, ret,
  2906 + len = this.length,
  2907 + self = this;
  2908 +
  2909 + if ( typeof selector !== "string" ) {
  2910 + return this.pushStack( jQuery( selector ).filter( function() {
  2911 + for ( i = 0; i < len; i++ ) {
  2912 + if ( jQuery.contains( self[ i ], this ) ) {
  2913 + return true;
  2914 + }
  2915 + }
  2916 + } ) );
  2917 + }
  2918 +
  2919 + ret = this.pushStack( [] );
  2920 +
  2921 + for ( i = 0; i < len; i++ ) {
  2922 + jQuery.find( selector, self[ i ], ret );
  2923 + }
  2924 +
  2925 + return len > 1 ? jQuery.uniqueSort( ret ) : ret;
  2926 + },
  2927 + filter: function( selector ) {
  2928 + return this.pushStack( winnow( this, selector || [], false ) );
  2929 + },
  2930 + not: function( selector ) {
  2931 + return this.pushStack( winnow( this, selector || [], true ) );
  2932 + },
  2933 + is: function( selector ) {
  2934 + return !!winnow(
  2935 + this,
  2936 +
  2937 + // If this is a positional/relative selector, check membership in the returned set
  2938 + // so $("p:first").is("p:last") won't return true for a doc with two "p".
  2939 + typeof selector === "string" && rneedsContext.test( selector ) ?
  2940 + jQuery( selector ) :
  2941 + selector || [],
  2942 + false
  2943 + ).length;
  2944 + }
  2945 +} );
  2946 +
  2947 +
  2948 +// Initialize a jQuery object
  2949 +
  2950 +
  2951 +// A central reference to the root jQuery(document)
  2952 +var rootjQuery,
  2953 +
  2954 + // A simple way to check for HTML strings
  2955 + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
  2956 + // Strict HTML recognition (#11290: must start with <)
  2957 + // Shortcut simple #id case for speed
  2958 + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
  2959 +
  2960 + init = jQuery.fn.init = function( selector, context, root ) {
  2961 + var match, elem;
  2962 +
  2963 + // HANDLE: $(""), $(null), $(undefined), $(false)
  2964 + if ( !selector ) {
  2965 + return this;
  2966 + }
  2967 +
  2968 + // Method init() accepts an alternate rootjQuery
  2969 + // so migrate can support jQuery.sub (gh-2101)
  2970 + root = root || rootjQuery;
  2971 +
  2972 + // Handle HTML strings
  2973 + if ( typeof selector === "string" ) {
  2974 + if ( selector[ 0 ] === "<" &&
  2975 + selector[ selector.length - 1 ] === ">" &&
  2976 + selector.length >= 3 ) {
  2977 +
  2978 + // Assume that strings that start and end with <> are HTML and skip the regex check
  2979 + match = [ null, selector, null ];
  2980 +
  2981 + } else {
  2982 + match = rquickExpr.exec( selector );
  2983 + }
  2984 +
  2985 + // Match html or make sure no context is specified for #id
  2986 + if ( match && ( match[ 1 ] || !context ) ) {
  2987 +
  2988 + // HANDLE: $(html) -> $(array)
  2989 + if ( match[ 1 ] ) {
  2990 + context = context instanceof jQuery ? context[ 0 ] : context;
  2991 +
  2992 + // Option to run scripts is true for back-compat
  2993 + // Intentionally let the error be thrown if parseHTML is not present
  2994 + jQuery.merge( this, jQuery.parseHTML(
  2995 + match[ 1 ],
  2996 + context && context.nodeType ? context.ownerDocument || context : document,
  2997 + true
  2998 + ) );
  2999 +
  3000 + // HANDLE: $(html, props)
  3001 + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
  3002 + for ( match in context ) {
  3003 +
  3004 + // Properties of context are called as methods if possible
  3005 + if ( jQuery.isFunction( this[ match ] ) ) {
  3006 + this[ match ]( context[ match ] );
  3007 +
  3008 + // ...and otherwise set as attributes
  3009 + } else {
  3010 + this.attr( match, context[ match ] );
  3011 + }
  3012 + }
  3013 + }
  3014 +
  3015 + return this;
  3016 +
  3017 + // HANDLE: $(#id)
  3018 + } else {
  3019 + elem = document.getElementById( match[ 2 ] );
  3020 +
  3021 + if ( elem ) {
  3022 +
  3023 + // Inject the element directly into the jQuery object
  3024 + this[ 0 ] = elem;
  3025 + this.length = 1;
  3026 + }
  3027 + return this;
  3028 + }
  3029 +
  3030 + // HANDLE: $(expr, $(...))
  3031 + } else if ( !context || context.jquery ) {
  3032 + return ( context || root ).find( selector );
  3033 +
  3034 + // HANDLE: $(expr, context)
  3035 + // (which is just equivalent to: $(context).find(expr)
  3036 + } else {
  3037 + return this.constructor( context ).find( selector );
  3038 + }
  3039 +
  3040 + // HANDLE: $(DOMElement)
  3041 + } else if ( selector.nodeType ) {
  3042 + this[ 0 ] = selector;
  3043 + this.length = 1;
  3044 + return this;
  3045 +
  3046 + // HANDLE: $(function)
  3047 + // Shortcut for document ready
  3048 + } else if ( jQuery.isFunction( selector ) ) {
  3049 + return root.ready !== undefined ?
  3050 + root.ready( selector ) :
  3051 +
  3052 + // Execute immediately if ready is not present
  3053 + selector( jQuery );
  3054 + }
  3055 +
  3056 + return jQuery.makeArray( selector, this );
  3057 + };
  3058 +
  3059 +// Give the init function the jQuery prototype for later instantiation
  3060 +init.prototype = jQuery.fn;
  3061 +
  3062 +// Initialize central reference
  3063 +rootjQuery = jQuery( document );
  3064 +
  3065 +
  3066 +var rparentsprev = /^(?:parents|prev(?:Until|All))/,
  3067 +
  3068 + // Methods guaranteed to produce a unique set when starting from a unique set
  3069 + guaranteedUnique = {
  3070 + children: true,
  3071 + contents: true,
  3072 + next: true,
  3073 + prev: true
  3074 + };
  3075 +
  3076 +jQuery.fn.extend( {
  3077 + has: function( target ) {
  3078 + var targets = jQuery( target, this ),
  3079 + l = targets.length;
  3080 +
  3081 + return this.filter( function() {
  3082 + var i = 0;
  3083 + for ( ; i < l; i++ ) {
  3084 + if ( jQuery.contains( this, targets[ i ] ) ) {
  3085 + return true;
  3086 + }
  3087 + }
  3088 + } );
  3089 + },
  3090 +
  3091 + closest: function( selectors, context ) {
  3092 + var cur,
  3093 + i = 0,
  3094 + l = this.length,
  3095 + matched = [],
  3096 + targets = typeof selectors !== "string" && jQuery( selectors );
  3097 +
  3098 + // Positional selectors never match, since there's no _selection_ context
  3099 + if ( !rneedsContext.test( selectors ) ) {
  3100 + for ( ; i < l; i++ ) {
  3101 + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
  3102 +
  3103 + // Always skip document fragments
  3104 + if ( cur.nodeType < 11 && ( targets ?
  3105 + targets.index( cur ) > -1 :
  3106 +
  3107 + // Don't pass non-elements to Sizzle
  3108 + cur.nodeType === 1 &&
  3109 + jQuery.find.matchesSelector( cur, selectors ) ) ) {
  3110 +
  3111 + matched.push( cur );
  3112 + break;
  3113 + }
  3114 + }
  3115 + }
  3116 + }
  3117 +
  3118 + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
  3119 + },
  3120 +
  3121 + // Determine the position of an element within the set
  3122 + index: function( elem ) {
  3123 +
  3124 + // No argument, return index in parent
  3125 + if ( !elem ) {
  3126 + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
  3127 + }
  3128 +
  3129 + // Index in selector
  3130 + if ( typeof elem === "string" ) {
  3131 + return indexOf.call( jQuery( elem ), this[ 0 ] );
  3132 + }
  3133 +
  3134 + // Locate the position of the desired element
  3135 + return indexOf.call( this,
  3136 +
  3137 + // If it receives a jQuery object, the first element is used
  3138 + elem.jquery ? elem[ 0 ] : elem
  3139 + );
  3140 + },
  3141 +
  3142 + add: function( selector, context ) {
  3143 + return this.pushStack(
  3144 + jQuery.uniqueSort(
  3145 + jQuery.merge( this.get(), jQuery( selector, context ) )
  3146 + )
  3147 + );
  3148 + },
  3149 +
  3150 + addBack: function( selector ) {
  3151 + return this.add( selector == null ?
  3152 + this.prevObject : this.prevObject.filter( selector )
  3153 + );
  3154 + }
  3155 +} );
  3156 +
  3157 +function sibling( cur, dir ) {
  3158 + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
  3159 + return cur;
  3160 +}
  3161 +
  3162 +jQuery.each( {
  3163 + parent: function( elem ) {
  3164 + var parent = elem.parentNode;
  3165 + return parent && parent.nodeType !== 11 ? parent : null;
  3166 + },
  3167 + parents: function( elem ) {
  3168 + return dir( elem, "parentNode" );
  3169 + },
  3170 + parentsUntil: function( elem, i, until ) {
  3171 + return dir( elem, "parentNode", until );
  3172 + },
  3173 + next: function( elem ) {
  3174 + return sibling( elem, "nextSibling" );
  3175 + },
  3176 + prev: function( elem ) {
  3177 + return sibling( elem, "previousSibling" );
  3178 + },
  3179 + nextAll: function( elem ) {
  3180 + return dir( elem, "nextSibling" );
  3181 + },
  3182 + prevAll: function( elem ) {
  3183 + return dir( elem, "previousSibling" );
  3184 + },
  3185 + nextUntil: function( elem, i, until ) {
  3186 + return dir( elem, "nextSibling", until );
  3187 + },
  3188 + prevUntil: function( elem, i, until ) {
  3189 + return dir( elem, "previousSibling", until );
  3190 + },
  3191 + siblings: function( elem ) {
  3192 + return siblings( ( elem.parentNode || {} ).firstChild, elem );
  3193 + },
  3194 + children: function( elem ) {
  3195 + return siblings( elem.firstChild );
  3196 + },
  3197 + contents: function( elem ) {
  3198 + if ( nodeName( elem, "iframe" ) ) {
  3199 + return elem.contentDocument;
  3200 + }
  3201 +
  3202 + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
  3203 + // Treat the template element as a regular one in browsers that
  3204 + // don't support it.
  3205 + if ( nodeName( elem, "template" ) ) {
  3206 + elem = elem.content || elem;
  3207 + }
  3208 +
  3209 + return jQuery.merge( [], elem.childNodes );
  3210 + }
  3211 +}, function( name, fn ) {
  3212 + jQuery.fn[ name ] = function( until, selector ) {
  3213 + var matched = jQuery.map( this, fn, until );
  3214 +
  3215 + if ( name.slice( -5 ) !== "Until" ) {
  3216 + selector = until;
  3217 + }
  3218 +
  3219 + if ( selector && typeof selector === "string" ) {
  3220 + matched = jQuery.filter( selector, matched );
  3221 + }
  3222 +
  3223 + if ( this.length > 1 ) {
  3224 +
  3225 + // Remove duplicates
  3226 + if ( !guaranteedUnique[ name ] ) {
  3227 + jQuery.uniqueSort( matched );
  3228 + }
  3229 +
  3230 + // Reverse order for parents* and prev-derivatives
  3231 + if ( rparentsprev.test( name ) ) {
  3232 + matched.reverse();
  3233 + }
  3234 + }
  3235 +
  3236 + return this.pushStack( matched );
  3237 + };
  3238 +} );
  3239 +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
  3240 +
  3241 +
  3242 +
  3243 +// Convert String-formatted options into Object-formatted ones
  3244 +function createOptions( options ) {
  3245 + var object = {};
  3246 + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
  3247 + object[ flag ] = true;
  3248 + } );
  3249 + return object;
  3250 +}
  3251 +
  3252 +/*
  3253 + * Create a callback list using the following parameters:
  3254 + *
  3255 + * options: an optional list of space-separated options that will change how
  3256 + * the callback list behaves or a more traditional option object
  3257 + *
  3258 + * By default a callback list will act like an event callback list and can be
  3259 + * "fired" multiple times.
  3260 + *
  3261 + * Possible options:
  3262 + *
  3263 + * once: will ensure the callback list can only be fired once (like a Deferred)
  3264 + *
  3265 + * memory: will keep track of previous values and will call any callback added
  3266 + * after the list has been fired right away with the latest "memorized"
  3267 + * values (like a Deferred)
  3268 + *
  3269 + * unique: will ensure a callback can only be added once (no duplicate in the list)
  3270 + *
  3271 + * stopOnFalse: interrupt callings when a callback returns false
  3272 + *
  3273 + */
  3274 +jQuery.Callbacks = function( options ) {
  3275 +
  3276 + // Convert options from String-formatted to Object-formatted if needed
  3277 + // (we check in cache first)
  3278 + options = typeof options === "string" ?
  3279 + createOptions( options ) :
  3280 + jQuery.extend( {}, options );
  3281 +
  3282 + var // Flag to know if list is currently firing
  3283 + firing,
  3284 +
  3285 + // Last fire value for non-forgettable lists
  3286 + memory,
  3287 +
  3288 + // Flag to know if list was already fired
  3289 + fired,
  3290 +
  3291 + // Flag to prevent firing
  3292 + locked,
  3293 +
  3294 + // Actual callback list
  3295 + list = [],
  3296 +
  3297 + // Queue of execution data for repeatable lists
  3298 + queue = [],
  3299 +
  3300 + // Index of currently firing callback (modified by add/remove as needed)
  3301 + firingIndex = -1,
  3302 +
  3303 + // Fire callbacks
  3304 + fire = function() {
  3305 +
  3306 + // Enforce single-firing
  3307 + locked = locked || options.once;
  3308 +
  3309 + // Execute callbacks for all pending executions,
  3310 + // respecting firingIndex overrides and runtime changes
  3311 + fired = firing = true;
  3312 + for ( ; queue.length; firingIndex = -1 ) {
  3313 + memory = queue.shift();
  3314 + while ( ++firingIndex < list.length ) {
  3315 +
  3316 + // Run callback and check for early termination
  3317 + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
  3318 + options.stopOnFalse ) {
  3319 +
  3320 + // Jump to end and forget the data so .add doesn't re-fire
  3321 + firingIndex = list.length;
  3322 + memory = false;
  3323 + }
  3324 + }
  3325 + }
  3326 +
  3327 + // Forget the data if we're done with it
  3328 + if ( !options.memory ) {
  3329 + memory = false;
  3330 + }
  3331 +
  3332 + firing = false;
  3333 +
  3334 + // Clean up if we're done firing for good
  3335 + if ( locked ) {
  3336 +
  3337 + // Keep an empty list if we have data for future add calls
  3338 + if ( memory ) {
  3339 + list = [];
  3340 +
  3341 + // Otherwise, this object is spent
  3342 + } else {
  3343 + list = "";
  3344 + }
  3345 + }
  3346 + },
  3347 +
  3348 + // Actual Callbacks object
  3349 + self = {
  3350 +
  3351 + // Add a callback or a collection of callbacks to the list
  3352 + add: function() {
  3353 + if ( list ) {
  3354 +
  3355 + // If we have memory from a past run, we should fire after adding
  3356 + if ( memory && !firing ) {
  3357 + firingIndex = list.length - 1;
  3358 + queue.push( memory );
  3359 + }
  3360 +
  3361 + ( function add( args ) {
  3362 + jQuery.each( args, function( _, arg ) {
  3363 + if ( jQuery.isFunction( arg ) ) {
  3364 + if ( !options.unique || !self.has( arg ) ) {
  3365 + list.push( arg );
  3366 + }
  3367 + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
  3368 +
  3369 + // Inspect recursively
  3370 + add( arg );
  3371 + }
  3372 + } );
  3373 + } )( arguments );
  3374 +
  3375 + if ( memory && !firing ) {
  3376 + fire();
  3377 + }
  3378 + }
  3379 + return this;
  3380 + },
  3381 +
  3382 + // Remove a callback from the list
  3383 + remove: function() {
  3384 + jQuery.each( arguments, function( _, arg ) {
  3385 + var index;
  3386 + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
  3387 + list.splice( index, 1 );
  3388 +
  3389 + // Handle firing indexes
  3390 + if ( index <= firingIndex ) {
  3391 + firingIndex--;
  3392 + }
  3393 + }
  3394 + } );
  3395 + return this;
  3396 + },
  3397 +
  3398 + // Check if a given callback is in the list.
  3399 + // If no argument is given, return whether or not list has callbacks attached.
  3400 + has: function( fn ) {
  3401 + return fn ?
  3402 + jQuery.inArray( fn, list ) > -1 :
  3403 + list.length > 0;
  3404 + },
  3405 +
  3406 + // Remove all callbacks from the list
  3407 + empty: function() {
  3408 + if ( list ) {
  3409 + list = [];
  3410 + }
  3411 + return this;
  3412 + },
  3413 +
  3414 + // Disable .fire and .add
  3415 + // Abort any current/pending executions
  3416 + // Clear all callbacks and values
  3417 + disable: function() {
  3418 + locked = queue = [];
  3419 + list = memory = "";
  3420 + return this;
  3421 + },
  3422 + disabled: function() {
  3423 + return !list;
  3424 + },
  3425 +
  3426 + // Disable .fire
  3427 + // Also disable .add unless we have memory (since it would have no effect)
  3428 + // Abort any pending executions
  3429 + lock: function() {
  3430 + locked = queue = [];
  3431 + if ( !memory && !firing ) {
  3432 + list = memory = "";
  3433 + }
  3434 + return this;
  3435 + },
  3436 + locked: function() {
  3437 + return !!locked;
  3438 + },
  3439 +
  3440 + // Call all callbacks with the given context and arguments
  3441 + fireWith: function( context, args ) {
  3442 + if ( !locked ) {
  3443 + args = args || [];
  3444 + args = [ context, args.slice ? args.slice() : args ];
  3445 + queue.push( args );
  3446 + if ( !firing ) {
  3447 + fire();
  3448 + }
  3449 + }
  3450 + return this;
  3451 + },
  3452 +
  3453 + // Call all the callbacks with the given arguments
  3454 + fire: function() {
  3455 + self.fireWith( this, arguments );
  3456 + return this;
  3457 + },
  3458 +
  3459 + // To know if the callbacks have already been called at least once
  3460 + fired: function() {
  3461 + return !!fired;
  3462 + }
  3463 + };
  3464 +
  3465 + return self;
  3466 +};
  3467 +
  3468 +
  3469 +function Identity( v ) {
  3470 + return v;
  3471 +}
  3472 +function Thrower( ex ) {
  3473 + throw ex;
  3474 +}
  3475 +
  3476 +function adoptValue( value, resolve, reject, noValue ) {
  3477 + var method;
  3478 +
  3479 + try {
  3480 +
  3481 + // Check for promise aspect first to privilege synchronous behavior
  3482 + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
  3483 + method.call( value ).done( resolve ).fail( reject );
  3484 +
  3485 + // Other thenables
  3486 + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
  3487 + method.call( value, resolve, reject );
  3488 +
  3489 + // Other non-thenables
  3490 + } else {
  3491 +
  3492 + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
  3493 + // * false: [ value ].slice( 0 ) => resolve( value )
  3494 + // * true: [ value ].slice( 1 ) => resolve()
  3495 + resolve.apply( undefined, [ value ].slice( noValue ) );
  3496 + }
  3497 +
  3498 + // For Promises/A+, convert exceptions into rejections
  3499 + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
  3500 + // Deferred#then to conditionally suppress rejection.
  3501 + } catch ( value ) {
  3502 +
  3503 + // Support: Android 4.0 only
  3504 + // Strict mode functions invoked without .call/.apply get global-object context
  3505 + reject.apply( undefined, [ value ] );
  3506 + }
  3507 +}
  3508 +
  3509 +jQuery.extend( {
  3510 +
  3511 + Deferred: function( func ) {
  3512 + var tuples = [
  3513 +
  3514 + // action, add listener, callbacks,
  3515 + // ... .then handlers, argument index, [final state]
  3516 + [ "notify", "progress", jQuery.Callbacks( "memory" ),
  3517 + jQuery.Callbacks( "memory" ), 2 ],
  3518 + [ "resolve", "done", jQuery.Callbacks( "once memory" ),
  3519 + jQuery.Callbacks( "once memory" ), 0, "resolved" ],
  3520 + [ "reject", "fail", jQuery.Callbacks( "once memory" ),
  3521 + jQuery.Callbacks( "once memory" ), 1, "rejected" ]
  3522 + ],
  3523 + state = "pending",
  3524 + promise = {
  3525 + state: function() {
  3526 + return state;
  3527 + },
  3528 + always: function() {
  3529 + deferred.done( arguments ).fail( arguments );
  3530 + return this;
  3531 + },
  3532 + "catch": function( fn ) {
  3533 + return promise.then( null, fn );
  3534 + },
  3535 +
  3536 + // Keep pipe for back-compat
  3537 + pipe: function( /* fnDone, fnFail, fnProgress */ ) {
  3538 + var fns = arguments;
  3539 +
  3540 + return jQuery.Deferred( function( newDefer ) {
  3541 + jQuery.each( tuples, function( i, tuple ) {
  3542 +
  3543 + // Map tuples (progress, done, fail) to arguments (done, fail, progress)
  3544 + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
  3545 +
  3546 + // deferred.progress(function() { bind to newDefer or newDefer.notify })
  3547 + // deferred.done(function() { bind to newDefer or newDefer.resolve })
  3548 + // deferred.fail(function() { bind to newDefer or newDefer.reject })
  3549 + deferred[ tuple[ 1 ] ]( function() {
  3550 + var returned = fn && fn.apply( this, arguments );
  3551 + if ( returned && jQuery.isFunction( returned.promise ) ) {
  3552 + returned.promise()
  3553 + .progress( newDefer.notify )
  3554 + .done( newDefer.resolve )
  3555 + .fail( newDefer.reject );
  3556 + } else {
  3557 + newDefer[ tuple[ 0 ] + "With" ](
  3558 + this,
  3559 + fn ? [ returned ] : arguments
  3560 + );
  3561 + }
  3562 + } );
  3563 + } );
  3564 + fns = null;
  3565 + } ).promise();
  3566 + },
  3567 + then: function( onFulfilled, onRejected, onProgress ) {
  3568 + var maxDepth = 0;
  3569 + function resolve( depth, deferred, handler, special ) {
  3570 + return function() {
  3571 + var that = this,
  3572 + args = arguments,
  3573 + mightThrow = function() {
  3574 + var returned, then;
  3575 +
  3576 + // Support: Promises/A+ section 2.3.3.3.3
  3577 + // https://promisesaplus.com/#point-59
  3578 + // Ignore double-resolution attempts
  3579 + if ( depth < maxDepth ) {
  3580 + return;
  3581 + }
  3582 +
  3583 + returned = handler.apply( that, args );
  3584 +
  3585 + // Support: Promises/A+ section 2.3.1
  3586 + // https://promisesaplus.com/#point-48
  3587 + if ( returned === deferred.promise() ) {
  3588 + throw new TypeError( "Thenable self-resolution" );
  3589 + }
  3590 +
  3591 + // Support: Promises/A+ sections 2.3.3.1, 3.5
  3592 + // https://promisesaplus.com/#point-54
  3593 + // https://promisesaplus.com/#point-75
  3594 + // Retrieve `then` only once
  3595 + then = returned &&
  3596 +
  3597 + // Support: Promises/A+ section 2.3.4
  3598 + // https://promisesaplus.com/#point-64
  3599 + // Only check objects and functions for thenability
  3600 + ( typeof returned === "object" ||
  3601 + typeof returned === "function" ) &&
  3602 + returned.then;
  3603 +
  3604 + // Handle a returned thenable
  3605 + if ( jQuery.isFunction( then ) ) {
  3606 +
  3607 + // Special processors (notify) just wait for resolution
  3608 + if ( special ) {
  3609 + then.call(
  3610 + returned,
  3611 + resolve( maxDepth, deferred, Identity, special ),
  3612 + resolve( maxDepth, deferred, Thrower, special )
  3613 + );
  3614 +
  3615 + // Normal processors (resolve) also hook into progress
  3616 + } else {
  3617 +
  3618 + // ...and disregard older resolution values
  3619 + maxDepth++;
  3620 +
  3621 + then.call(
  3622 + returned,
  3623 + resolve( maxDepth, deferred, Identity, special ),
  3624 + resolve( maxDepth, deferred, Thrower, special ),
  3625 + resolve( maxDepth, deferred, Identity,
  3626 + deferred.notifyWith )
  3627 + );
  3628 + }
  3629 +
  3630 + // Handle all other returned values
  3631 + } else {
  3632 +
  3633 + // Only substitute handlers pass on context
  3634 + // and multiple values (non-spec behavior)
  3635 + if ( handler !== Identity ) {
  3636 + that = undefined;
  3637 + args = [ returned ];
  3638 + }
  3639 +
  3640 + // Process the value(s)
  3641 + // Default process is resolve
  3642 + ( special || deferred.resolveWith )( that, args );
  3643 + }
  3644 + },
  3645 +
  3646 + // Only normal processors (resolve) catch and reject exceptions
  3647 + process = special ?
  3648 + mightThrow :
  3649 + function() {
  3650 + try {
  3651 + mightThrow();
  3652 + } catch ( e ) {
  3653 +
  3654 + if ( jQuery.Deferred.exceptionHook ) {
  3655 + jQuery.Deferred.exceptionHook( e,
  3656 + process.stackTrace );
  3657 + }
  3658 +
  3659 + // Support: Promises/A+ section 2.3.3.3.4.1
  3660 + // https://promisesaplus.com/#point-61
  3661 + // Ignore post-resolution exceptions
  3662 + if ( depth + 1 >= maxDepth ) {
  3663 +
  3664 + // Only substitute handlers pass on context
  3665 + // and multiple values (non-spec behavior)
  3666 + if ( handler !== Thrower ) {
  3667 + that = undefined;
  3668 + args = [ e ];
  3669 + }
  3670 +
  3671 + deferred.rejectWith( that, args );
  3672 + }
  3673 + }
  3674 + };
  3675 +
  3676 + // Support: Promises/A+ section 2.3.3.3.1
  3677 + // https://promisesaplus.com/#point-57
  3678 + // Re-resolve promises immediately to dodge false rejection from
  3679 + // subsequent errors
  3680 + if ( depth ) {
  3681 + process();
  3682 + } else {
  3683 +
  3684 + // Call an optional hook to record the stack, in case of exception
  3685 + // since it's otherwise lost when execution goes async
  3686 + if ( jQuery.Deferred.getStackHook ) {
  3687 + process.stackTrace = jQuery.Deferred.getStackHook();
  3688 + }
  3689 + window.setTimeout( process );
  3690 + }
  3691 + };
  3692 + }
  3693 +
  3694 + return jQuery.Deferred( function( newDefer ) {
  3695 +
  3696 + // progress_handlers.add( ... )
  3697 + tuples[ 0 ][ 3 ].add(
  3698 + resolve(
  3699 + 0,
  3700 + newDefer,
  3701 + jQuery.isFunction( onProgress ) ?
  3702 + onProgress :
  3703 + Identity,
  3704 + newDefer.notifyWith
  3705 + )
  3706 + );
  3707 +
  3708 + // fulfilled_handlers.add( ... )
  3709 + tuples[ 1 ][ 3 ].add(
  3710 + resolve(
  3711 + 0,
  3712 + newDefer,
  3713 + jQuery.isFunction( onFulfilled ) ?
  3714 + onFulfilled :
  3715 + Identity
  3716 + )
  3717 + );
  3718 +
  3719 + // rejected_handlers.add( ... )
  3720 + tuples[ 2 ][ 3 ].add(
  3721 + resolve(
  3722 + 0,
  3723 + newDefer,
  3724 + jQuery.isFunction( onRejected ) ?
  3725 + onRejected :
  3726 + Thrower
  3727 + )
  3728 + );
  3729 + } ).promise();
  3730 + },
  3731 +
  3732 + // Get a promise for this deferred
  3733 + // If obj is provided, the promise aspect is added to the object
  3734 + promise: function( obj ) {
  3735 + return obj != null ? jQuery.extend( obj, promise ) : promise;
  3736 + }
  3737 + },
  3738 + deferred = {};
  3739 +
  3740 + // Add list-specific methods
  3741 + jQuery.each( tuples, function( i, tuple ) {
  3742 + var list = tuple[ 2 ],
  3743 + stateString = tuple[ 5 ];
  3744 +
  3745 + // promise.progress = list.add
  3746 + // promise.done = list.add
  3747 + // promise.fail = list.add
  3748 + promise[ tuple[ 1 ] ] = list.add;
  3749 +
  3750 + // Handle state
  3751 + if ( stateString ) {
  3752 + list.add(
  3753 + function() {
  3754 +
  3755 + // state = "resolved" (i.e., fulfilled)
  3756 + // state = "rejected"
  3757 + state = stateString;
  3758 + },
  3759 +
  3760 + // rejected_callbacks.disable
  3761 + // fulfilled_callbacks.disable
  3762 + tuples[ 3 - i ][ 2 ].disable,
  3763 +
  3764 + // progress_callbacks.lock
  3765 + tuples[ 0 ][ 2 ].lock
  3766 + );
  3767 + }
  3768 +
  3769 + // progress_handlers.fire
  3770 + // fulfilled_handlers.fire
  3771 + // rejected_handlers.fire
  3772 + list.add( tuple[ 3 ].fire );
  3773 +
  3774 + // deferred.notify = function() { deferred.notifyWith(...) }
  3775 + // deferred.resolve = function() { deferred.resolveWith(...) }
  3776 + // deferred.reject = function() { deferred.rejectWith(...) }
  3777 + deferred[ tuple[ 0 ] ] = function() {
  3778 + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
  3779 + return this;
  3780 + };
  3781 +
  3782 + // deferred.notifyWith = list.fireWith
  3783 + // deferred.resolveWith = list.fireWith
  3784 + // deferred.rejectWith = list.fireWith
  3785 + deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
  3786 + } );
  3787 +
  3788 + // Make the deferred a promise
  3789 + promise.promise( deferred );
  3790 +
  3791 + // Call given func if any
  3792 + if ( func ) {
  3793 + func.call( deferred, deferred );
  3794 + }
  3795 +
  3796 + // All done!
  3797 + return deferred;
  3798 + },
  3799 +
  3800 + // Deferred helper
  3801 + when: function( singleValue ) {
  3802 + var
  3803 +
  3804 + // count of uncompleted subordinates
  3805 + remaining = arguments.length,
  3806 +
  3807 + // count of unprocessed arguments
  3808 + i = remaining,
  3809 +
  3810 + // subordinate fulfillment data
  3811 + resolveContexts = Array( i ),
  3812 + resolveValues = slice.call( arguments ),
  3813 +
  3814 + // the master Deferred
  3815 + master = jQuery.Deferred(),
  3816 +
  3817 + // subordinate callback factory
  3818 + updateFunc = function( i ) {
  3819 + return function( value ) {
  3820 + resolveContexts[ i ] = this;
  3821 + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
  3822 + if ( !( --remaining ) ) {
  3823 + master.resolveWith( resolveContexts, resolveValues );
  3824 + }
  3825 + };
  3826 + };
  3827 +
  3828 + // Single- and empty arguments are adopted like Promise.resolve
  3829 + if ( remaining <= 1 ) {
  3830 + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
  3831 + !remaining );
  3832 +
  3833 + // Use .then() to unwrap secondary thenables (cf. gh-3000)
  3834 + if ( master.state() === "pending" ||
  3835 + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
  3836 +
  3837 + return master.then();
  3838 + }
  3839 + }
  3840 +
  3841 + // Multiple arguments are aggregated like Promise.all array elements
  3842 + while ( i-- ) {
  3843 + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
  3844 + }
  3845 +
  3846 + return master.promise();
  3847 + }
  3848 +} );
  3849 +
  3850 +
  3851 +// These usually indicate a programmer mistake during development,
  3852 +// warn about them ASAP rather than swallowing them by default.
  3853 +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
  3854 +
  3855 +jQuery.Deferred.exceptionHook = function( error, stack ) {
  3856 +
  3857 + // Support: IE 8 - 9 only
  3858 + // Console exists when dev tools are open, which can happen at any time
  3859 + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
  3860 + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
  3861 + }
  3862 +};
  3863 +
  3864 +
  3865 +
  3866 +
  3867 +jQuery.readyException = function( error ) {
  3868 + window.setTimeout( function() {
  3869 + throw error;
  3870 + } );
  3871 +};
  3872 +
  3873 +
  3874 +
  3875 +
  3876 +// The deferred used on DOM ready
  3877 +var readyList = jQuery.Deferred();
  3878 +
  3879 +jQuery.fn.ready = function( fn ) {
  3880 +
  3881 + readyList
  3882 + .then( fn )
  3883 +
  3884 + // Wrap jQuery.readyException in a function so that the lookup
  3885 + // happens at the time of error handling instead of callback
  3886 + // registration.
  3887 + .catch( function( error ) {
  3888 + jQuery.readyException( error );
  3889 + } );
  3890 +
  3891 + return this;
  3892 +};
  3893 +
  3894 +jQuery.extend( {
  3895 +
  3896 + // Is the DOM ready to be used? Set to true once it occurs.
  3897 + isReady: false,
  3898 +
  3899 + // A counter to track how many items to wait for before
  3900 + // the ready event fires. See #6781
  3901 + readyWait: 1,
  3902 +
  3903 + // Handle when the DOM is ready
  3904 + ready: function( wait ) {
  3905 +
  3906 + // Abort if there are pending holds or we're already ready
  3907 + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
  3908 + return;
  3909 + }
  3910 +
  3911 + // Remember that the DOM is ready
  3912 + jQuery.isReady = true;
  3913 +
  3914 + // If a normal DOM Ready event fired, decrement, and wait if need be
  3915 + if ( wait !== true && --jQuery.readyWait > 0 ) {
  3916 + return;
  3917 + }
  3918 +
  3919 + // If there are functions bound, to execute
  3920 + readyList.resolveWith( document, [ jQuery ] );
  3921 + }
  3922 +} );
  3923 +
  3924 +jQuery.ready.then = readyList.then;
  3925 +
  3926 +// The ready event handler and self cleanup method
  3927 +function completed() {
  3928 + document.removeEventListener( "DOMContentLoaded", completed );
  3929 + window.removeEventListener( "load", completed );
  3930 + jQuery.ready();
  3931 +}
  3932 +
  3933 +// Catch cases where $(document).ready() is called
  3934 +// after the browser event has already occurred.
  3935 +// Support: IE <=9 - 10 only
  3936 +// Older IE sometimes signals "interactive" too soon
  3937 +if ( document.readyState === "complete" ||
  3938 + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
  3939 +
  3940 + // Handle it asynchronously to allow scripts the opportunity to delay ready
  3941 + window.setTimeout( jQuery.ready );
  3942 +
  3943 +} else {
  3944 +
  3945 + // Use the handy event callback
  3946 + document.addEventListener( "DOMContentLoaded", completed );
  3947 +
  3948 + // A fallback to window.onload, that will always work
  3949 + window.addEventListener( "load", completed );
  3950 +}
  3951 +
  3952 +
  3953 +
  3954 +
  3955 +// Multifunctional method to get and set values of a collection
  3956 +// The value/s can optionally be executed if it's a function
  3957 +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
  3958 + var i = 0,
  3959 + len = elems.length,
  3960 + bulk = key == null;
  3961 +
  3962 + // Sets many values
  3963 + if ( jQuery.type( key ) === "object" ) {
  3964 + chainable = true;
  3965 + for ( i in key ) {
  3966 + access( elems, fn, i, key[ i ], true, emptyGet, raw );
  3967 + }
  3968 +
  3969 + // Sets one value
  3970 + } else if ( value !== undefined ) {
  3971 + chainable = true;
  3972 +
  3973 + if ( !jQuery.isFunction( value ) ) {
  3974 + raw = true;
  3975 + }
  3976 +
  3977 + if ( bulk ) {
  3978 +
  3979 + // Bulk operations run against the entire set
  3980 + if ( raw ) {
  3981 + fn.call( elems, value );
  3982 + fn = null;
  3983 +
  3984 + // ...except when executing function values
  3985 + } else {
  3986 + bulk = fn;
  3987 + fn = function( elem, key, value ) {
  3988 + return bulk.call( jQuery( elem ), value );
  3989 + };
  3990 + }
  3991 + }
  3992 +
  3993 + if ( fn ) {
  3994 + for ( ; i < len; i++ ) {
  3995 + fn(
  3996 + elems[ i ], key, raw ?
  3997 + value :
  3998 + value.call( elems[ i ], i, fn( elems[ i ], key ) )
  3999 + );
  4000 + }
  4001 + }
  4002 + }
  4003 +
  4004 + if ( chainable ) {
  4005 + return elems;
  4006 + }
  4007 +
  4008 + // Gets
  4009 + if ( bulk ) {
  4010 + return fn.call( elems );
  4011 + }
  4012 +
  4013 + return len ? fn( elems[ 0 ], key ) : emptyGet;
  4014 +};
  4015 +var acceptData = function( owner ) {
  4016 +
  4017 + // Accepts only:
  4018 + // - Node
  4019 + // - Node.ELEMENT_NODE
  4020 + // - Node.DOCUMENT_NODE
  4021 + // - Object
  4022 + // - Any
  4023 + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
  4024 +};
  4025 +
  4026 +
  4027 +
  4028 +
  4029 +function Data() {
  4030 + this.expando = jQuery.expando + Data.uid++;
  4031 +}
  4032 +
  4033 +Data.uid = 1;
  4034 +
  4035 +Data.prototype = {
  4036 +
  4037 + cache: function( owner ) {
  4038 +
  4039 + // Check if the owner object already has a cache
  4040 + var value = owner[ this.expando ];
  4041 +
  4042 + // If not, create one
  4043 + if ( !value ) {
  4044 + value = {};
  4045 +
  4046 + // We can accept data for non-element nodes in modern browsers,
  4047 + // but we should not, see #8335.
  4048 + // Always return an empty object.
  4049 + if ( acceptData( owner ) ) {
  4050 +
  4051 + // If it is a node unlikely to be stringify-ed or looped over
  4052 + // use plain assignment
  4053 + if ( owner.nodeType ) {
  4054 + owner[ this.expando ] = value;
  4055 +
  4056 + // Otherwise secure it in a non-enumerable property
  4057 + // configurable must be true to allow the property to be
  4058 + // deleted when data is removed
  4059 + } else {
  4060 + Object.defineProperty( owner, this.expando, {
  4061 + value: value,
  4062 + configurable: true
  4063 + } );
  4064 + }
  4065 + }
  4066 + }
  4067 +
  4068 + return value;
  4069 + },
  4070 + set: function( owner, data, value ) {
  4071 + var prop,
  4072 + cache = this.cache( owner );
  4073 +
  4074 + // Handle: [ owner, key, value ] args
  4075 + // Always use camelCase key (gh-2257)
  4076 + if ( typeof data === "string" ) {
  4077 + cache[ jQuery.camelCase( data ) ] = value;
  4078 +
  4079 + // Handle: [ owner, { properties } ] args
  4080 + } else {
  4081 +
  4082 + // Copy the properties one-by-one to the cache object
  4083 + for ( prop in data ) {
  4084 + cache[ jQuery.camelCase( prop ) ] = data[ prop ];
  4085 + }
  4086 + }
  4087 + return cache;
  4088 + },
  4089 + get: function( owner, key ) {
  4090 + return key === undefined ?
  4091 + this.cache( owner ) :
  4092 +
  4093 + // Always use camelCase key (gh-2257)
  4094 + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
  4095 + },
  4096 + access: function( owner, key, value ) {
  4097 +
  4098 + // In cases where either:
  4099 + //
  4100 + // 1. No key was specified
  4101 + // 2. A string key was specified, but no value provided
  4102 + //
  4103 + // Take the "read" path and allow the get method to determine
  4104 + // which value to return, respectively either:
  4105 + //
  4106 + // 1. The entire cache object
  4107 + // 2. The data stored at the key
  4108 + //
  4109 + if ( key === undefined ||
  4110 + ( ( key && typeof key === "string" ) && value === undefined ) ) {
  4111 +
  4112 + return this.get( owner, key );
  4113 + }
  4114 +
  4115 + // When the key is not a string, or both a key and value
  4116 + // are specified, set or extend (existing objects) with either:
  4117 + //
  4118 + // 1. An object of properties
  4119 + // 2. A key and value
  4120 + //
  4121 + this.set( owner, key, value );
  4122 +
  4123 + // Since the "set" path can have two possible entry points
  4124 + // return the expected data based on which path was taken[*]
  4125 + return value !== undefined ? value : key;
  4126 + },
  4127 + remove: function( owner, key ) {
  4128 + var i,
  4129 + cache = owner[ this.expando ];
  4130 +
  4131 + if ( cache === undefined ) {
  4132 + return;
  4133 + }
  4134 +
  4135 + if ( key !== undefined ) {
  4136 +
  4137 + // Support array or space separated string of keys
  4138 + if ( Array.isArray( key ) ) {
  4139 +
  4140 + // If key is an array of keys...
  4141 + // We always set camelCase keys, so remove that.
  4142 + key = key.map( jQuery.camelCase );
  4143 + } else {
  4144 + key = jQuery.camelCase( key );
  4145 +
  4146 + // If a key with the spaces exists, use it.
  4147 + // Otherwise, create an array by matching non-whitespace
  4148 + key = key in cache ?
  4149 + [ key ] :
  4150 + ( key.match( rnothtmlwhite ) || [] );
  4151 + }
  4152 +
  4153 + i = key.length;
  4154 +
  4155 + while ( i-- ) {
  4156 + delete cache[ key[ i ] ];
  4157 + }
  4158 + }
  4159 +
  4160 + // Remove the expando if there's no more data
  4161 + if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
  4162 +
  4163 + // Support: Chrome <=35 - 45
  4164 + // Webkit & Blink performance suffers when deleting properties
  4165 + // from DOM nodes, so set to undefined instead
  4166 + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
  4167 + if ( owner.nodeType ) {
  4168 + owner[ this.expando ] = undefined;
  4169 + } else {
  4170 + delete owner[ this.expando ];
  4171 + }
  4172 + }
  4173 + },
  4174 + hasData: function( owner ) {
  4175 + var cache = owner[ this.expando ];
  4176 + return cache !== undefined && !jQuery.isEmptyObject( cache );
  4177 + }
  4178 +};
  4179 +var dataPriv = new Data();
  4180 +
  4181 +var dataUser = new Data();
  4182 +
  4183 +
  4184 +
  4185 +// Implementation Summary
  4186 +//
  4187 +// 1. Enforce API surface and semantic compatibility with 1.9.x branch
  4188 +// 2. Improve the module's maintainability by reducing the storage
  4189 +// paths to a single mechanism.
  4190 +// 3. Use the same single mechanism to support "private" and "user" data.
  4191 +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
  4192 +// 5. Avoid exposing implementation details on user objects (eg. expando properties)
  4193 +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
  4194 +
  4195 +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
  4196 + rmultiDash = /[A-Z]/g;
  4197 +
  4198 +function getData( data ) {
  4199 + if ( data === "true" ) {
  4200 + return true;
  4201 + }
  4202 +
  4203 + if ( data === "false" ) {
  4204 + return false;
  4205 + }
  4206 +
  4207 + if ( data === "null" ) {
  4208 + return null;
  4209 + }
  4210 +
  4211 + // Only convert to a number if it doesn't change the string
  4212 + if ( data === +data + "" ) {
  4213 + return +data;
  4214 + }
  4215 +
  4216 + if ( rbrace.test( data ) ) {
  4217 + return JSON.parse( data );
  4218 + }
  4219 +
  4220 + return data;
  4221 +}
  4222 +
  4223 +function dataAttr( elem, key, data ) {
  4224 + var name;
  4225 +
  4226 + // If nothing was found internally, try to fetch any
  4227 + // data from the HTML5 data-* attribute
  4228 + if ( data === undefined && elem.nodeType === 1 ) {
  4229 + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
  4230 + data = elem.getAttribute( name );
  4231 +
  4232 + if ( typeof data === "string" ) {
  4233 + try {
  4234 + data = getData( data );
  4235 + } catch ( e ) {}
  4236 +
  4237 + // Make sure we set the data so it isn't changed later
  4238 + dataUser.set( elem, key, data );
  4239 + } else {
  4240 + data = undefined;
  4241 + }
  4242 + }
  4243 + return data;
  4244 +}
  4245 +
  4246 +jQuery.extend( {
  4247 + hasData: function( elem ) {
  4248 + return dataUser.hasData( elem ) || dataPriv.hasData( elem );
  4249 + },
  4250 +
  4251 + data: function( elem, name, data ) {
  4252 + return dataUser.access( elem, name, data );
  4253 + },
  4254 +
  4255 + removeData: function( elem, name ) {
  4256 + dataUser.remove( elem, name );
  4257 + },
  4258 +
  4259 + // TODO: Now that all calls to _data and _removeData have been replaced
  4260 + // with direct calls to dataPriv methods, these can be deprecated.
  4261 + _data: function( elem, name, data ) {
  4262 + return dataPriv.access( elem, name, data );
  4263 + },
  4264 +
  4265 + _removeData: function( elem, name ) {
  4266 + dataPriv.remove( elem, name );
  4267 + }
  4268 +} );
  4269 +
  4270 +jQuery.fn.extend( {
  4271 + data: function( key, value ) {
  4272 + var i, name, data,
  4273 + elem = this[ 0 ],
  4274 + attrs = elem && elem.attributes;
  4275 +
  4276 + // Gets all values
  4277 + if ( key === undefined ) {
  4278 + if ( this.length ) {
  4279 + data = dataUser.get( elem );
  4280 +
  4281 + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
  4282 + i = attrs.length;
  4283 + while ( i-- ) {
  4284 +
  4285 + // Support: IE 11 only
  4286 + // The attrs elements can be null (#14894)
  4287 + if ( attrs[ i ] ) {
  4288 + name = attrs[ i ].name;
  4289 + if ( name.indexOf( "data-" ) === 0 ) {
  4290 + name = jQuery.camelCase( name.slice( 5 ) );
  4291 + dataAttr( elem, name, data[ name ] );
  4292 + }
  4293 + }
  4294 + }
  4295 + dataPriv.set( elem, "hasDataAttrs", true );
  4296 + }
  4297 + }
  4298 +
  4299 + return data;
  4300 + }
  4301 +
  4302 + // Sets multiple values
  4303 + if ( typeof key === "object" ) {
  4304 + return this.each( function() {
  4305 + dataUser.set( this, key );
  4306 + } );
  4307 + }
  4308 +
  4309 + return access( this, function( value ) {
  4310 + var data;
  4311 +
  4312 + // The calling jQuery object (element matches) is not empty
  4313 + // (and therefore has an element appears at this[ 0 ]) and the
  4314 + // `value` parameter was not undefined. An empty jQuery object
  4315 + // will result in `undefined` for elem = this[ 0 ] which will
  4316 + // throw an exception if an attempt to read a data cache is made.
  4317 + if ( elem && value === undefined ) {
  4318 +
  4319 + // Attempt to get data from the cache
  4320 + // The key will always be camelCased in Data
  4321 + data = dataUser.get( elem, key );
  4322 + if ( data !== undefined ) {
  4323 + return data;
  4324 + }
  4325 +
  4326 + // Attempt to "discover" the data in
  4327 + // HTML5 custom data-* attrs
  4328 + data = dataAttr( elem, key );
  4329 + if ( data !== undefined ) {
  4330 + return data;
  4331 + }
  4332 +
  4333 + // We tried really hard, but the data doesn't exist.
  4334 + return;
  4335 + }
  4336 +
  4337 + // Set the data...
  4338 + this.each( function() {
  4339 +
  4340 + // We always store the camelCased key
  4341 + dataUser.set( this, key, value );
  4342 + } );
  4343 + }, null, value, arguments.length > 1, null, true );
  4344 + },
  4345 +
  4346 + removeData: function( key ) {
  4347 + return this.each( function() {
  4348 + dataUser.remove( this, key );
  4349 + } );
  4350 + }
  4351 +} );
  4352 +
  4353 +
  4354 +jQuery.extend( {
  4355 + queue: function( elem, type, data ) {
  4356 + var queue;
  4357 +
  4358 + if ( elem ) {
  4359 + type = ( type || "fx" ) + "queue";
  4360 + queue = dataPriv.get( elem, type );
  4361 +
  4362 + // Speed up dequeue by getting out quickly if this is just a lookup
  4363 + if ( data ) {
  4364 + if ( !queue || Array.isArray( data ) ) {
  4365 + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
  4366 + } else {
  4367 + queue.push( data );
  4368 + }
  4369 + }
  4370 + return queue || [];
  4371 + }
  4372 + },
  4373 +
  4374 + dequeue: function( elem, type ) {
  4375 + type = type || "fx";
  4376 +
  4377 + var queue = jQuery.queue( elem, type ),
  4378 + startLength = queue.length,
  4379 + fn = queue.shift(),
  4380 + hooks = jQuery._queueHooks( elem, type ),
  4381 + next = function() {
  4382 + jQuery.dequeue( elem, type );
  4383 + };
  4384 +
  4385 + // If the fx queue is dequeued, always remove the progress sentinel
  4386 + if ( fn === "inprogress" ) {
  4387 + fn = queue.shift();
  4388 + startLength--;
  4389 + }
  4390 +
  4391 + if ( fn ) {
  4392 +
  4393 + // Add a progress sentinel to prevent the fx queue from being
  4394 + // automatically dequeued
  4395 + if ( type === "fx" ) {
  4396 + queue.unshift( "inprogress" );
  4397 + }
  4398 +
  4399 + // Clear up the last queue stop function
  4400 + delete hooks.stop;
  4401 + fn.call( elem, next, hooks );
  4402 + }
  4403 +
  4404 + if ( !startLength && hooks ) {
  4405 + hooks.empty.fire();
  4406 + }
  4407 + },
  4408 +
  4409 + // Not public - generate a queueHooks object, or return the current one
  4410 + _queueHooks: function( elem, type ) {
  4411 + var key = type + "queueHooks";
  4412 + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
  4413 + empty: jQuery.Callbacks( "once memory" ).add( function() {
  4414 + dataPriv.remove( elem, [ type + "queue", key ] );
  4415 + } )
  4416 + } );
  4417 + }
  4418 +} );
  4419 +
  4420 +jQuery.fn.extend( {
  4421 + queue: function( type, data ) {
  4422 + var setter = 2;
  4423 +
  4424 + if ( typeof type !== "string" ) {
  4425 + data = type;
  4426 + type = "fx";
  4427 + setter--;
  4428 + }
  4429 +
  4430 + if ( arguments.length < setter ) {
  4431 + return jQuery.queue( this[ 0 ], type );
  4432 + }
  4433 +
  4434 + return data === undefined ?
  4435 + this :
  4436 + this.each( function() {
  4437 + var queue = jQuery.queue( this, type, data );
  4438 +
  4439 + // Ensure a hooks for this queue
  4440 + jQuery._queueHooks( this, type );
  4441 +
  4442 + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
  4443 + jQuery.dequeue( this, type );
  4444 + }
  4445 + } );
  4446 + },
  4447 + dequeue: function( type ) {
  4448 + return this.each( function() {
  4449 + jQuery.dequeue( this, type );
  4450 + } );
  4451 + },
  4452 + clearQueue: function( type ) {
  4453 + return this.queue( type || "fx", [] );
  4454 + },
  4455 +
  4456 + // Get a promise resolved when queues of a certain type
  4457 + // are emptied (fx is the type by default)
  4458 + promise: function( type, obj ) {
  4459 + var tmp,
  4460 + count = 1,
  4461 + defer = jQuery.Deferred(),
  4462 + elements = this,
  4463 + i = this.length,
  4464 + resolve = function() {
  4465 + if ( !( --count ) ) {
  4466 + defer.resolveWith( elements, [ elements ] );
  4467 + }
  4468 + };
  4469 +
  4470 + if ( typeof type !== "string" ) {
  4471 + obj = type;
  4472 + type = undefined;
  4473 + }
  4474 + type = type || "fx";
  4475 +
  4476 + while ( i-- ) {
  4477 + tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
  4478 + if ( tmp && tmp.empty ) {
  4479 + count++;
  4480 + tmp.empty.add( resolve );
  4481 + }
  4482 + }
  4483 + resolve();
  4484 + return defer.promise( obj );
  4485 + }
  4486 +} );
  4487 +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
  4488 +
  4489 +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
  4490 +
  4491 +
  4492 +var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
  4493 +
  4494 +var isHiddenWithinTree = function( elem, el ) {
  4495 +
  4496 + // isHiddenWithinTree might be called from jQuery#filter function;
  4497 + // in that case, element will be second argument
  4498 + elem = el || elem;
  4499 +
  4500 + // Inline style trumps all
  4501 + return elem.style.display === "none" ||
  4502 + elem.style.display === "" &&
  4503 +
  4504 + // Otherwise, check computed style
  4505 + // Support: Firefox <=43 - 45
  4506 + // Disconnected elements can have computed display: none, so first confirm that elem is
  4507 + // in the document.
  4508 + jQuery.contains( elem.ownerDocument, elem ) &&
  4509 +
  4510 + jQuery.css( elem, "display" ) === "none";
  4511 + };
  4512 +
  4513 +var swap = function( elem, options, callback, args ) {
  4514 + var ret, name,
  4515 + old = {};
  4516 +
  4517 + // Remember the old values, and insert the new ones
  4518 + for ( name in options ) {
  4519 + old[ name ] = elem.style[ name ];
  4520 + elem.style[ name ] = options[ name ];
  4521 + }
  4522 +
  4523 + ret = callback.apply( elem, args || [] );
  4524 +
  4525 + // Revert the old values
  4526 + for ( name in options ) {
  4527 + elem.style[ name ] = old[ name ];
  4528 + }
  4529 +
  4530 + return ret;
  4531 +};
  4532 +
  4533 +
  4534 +
  4535 +
  4536 +function adjustCSS( elem, prop, valueParts, tween ) {
  4537 + var adjusted,
  4538 + scale = 1,
  4539 + maxIterations = 20,
  4540 + currentValue = tween ?
  4541 + function() {
  4542 + return tween.cur();
  4543 + } :
  4544 + function() {
  4545 + return jQuery.css( elem, prop, "" );
  4546 + },
  4547 + initial = currentValue(),
  4548 + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
  4549 +
  4550 + // Starting value computation is required for potential unit mismatches
  4551 + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
  4552 + rcssNum.exec( jQuery.css( elem, prop ) );
  4553 +
  4554 + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
  4555 +
  4556 + // Trust units reported by jQuery.css
  4557 + unit = unit || initialInUnit[ 3 ];
  4558 +
  4559 + // Make sure we update the tween properties later on
  4560 + valueParts = valueParts || [];
  4561 +
  4562 + // Iteratively approximate from a nonzero starting point
  4563 + initialInUnit = +initial || 1;
  4564 +
  4565 + do {
  4566 +
  4567 + // If previous iteration zeroed out, double until we get *something*.
  4568 + // Use string for doubling so we don't accidentally see scale as unchanged below
  4569 + scale = scale || ".5";
  4570 +
  4571 + // Adjust and apply
  4572 + initialInUnit = initialInUnit / scale;
  4573 + jQuery.style( elem, prop, initialInUnit + unit );
  4574 +
  4575 + // Update scale, tolerating zero or NaN from tween.cur()
  4576 + // Break the loop if scale is unchanged or perfect, or if we've just had enough.
  4577 + } while (
  4578 + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
  4579 + );
  4580 + }
  4581 +
  4582 + if ( valueParts ) {
  4583 + initialInUnit = +initialInUnit || +initial || 0;
  4584 +
  4585 + // Apply relative offset (+=/-=) if specified
  4586 + adjusted = valueParts[ 1 ] ?
  4587 + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
  4588 + +valueParts[ 2 ];
  4589 + if ( tween ) {
  4590 + tween.unit = unit;
  4591 + tween.start = initialInUnit;
  4592 + tween.end = adjusted;
  4593 + }
  4594 + }
  4595 + return adjusted;
  4596 +}
  4597 +
  4598 +
  4599 +var defaultDisplayMap = {};
  4600 +
  4601 +function getDefaultDisplay( elem ) {
  4602 + var temp,
  4603 + doc = elem.ownerDocument,
  4604 + nodeName = elem.nodeName,
  4605 + display = defaultDisplayMap[ nodeName ];
  4606 +
  4607 + if ( display ) {
  4608 + return display;
  4609 + }
  4610 +
  4611 + temp = doc.body.appendChild( doc.createElement( nodeName ) );
  4612 + display = jQuery.css( temp, "display" );
  4613 +
  4614 + temp.parentNode.removeChild( temp );
  4615 +
  4616 + if ( display === "none" ) {
  4617 + display = "block";
  4618 + }
  4619 + defaultDisplayMap[ nodeName ] = display;
  4620 +
  4621 + return display;
  4622 +}
  4623 +
  4624 +function showHide( elements, show ) {
  4625 + var display, elem,
  4626 + values = [],
  4627 + index = 0,
  4628 + length = elements.length;
  4629 +
  4630 + // Determine new display value for elements that need to change
  4631 + for ( ; index < length; index++ ) {
  4632 + elem = elements[ index ];
  4633 + if ( !elem.style ) {
  4634 + continue;
  4635 + }
  4636 +
  4637 + display = elem.style.display;
  4638 + if ( show ) {
  4639 +
  4640 + // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
  4641 + // check is required in this first loop unless we have a nonempty display value (either
  4642 + // inline or about-to-be-restored)
  4643 + if ( display === "none" ) {
  4644 + values[ index ] = dataPriv.get( elem, "display" ) || null;
  4645 + if ( !values[ index ] ) {
  4646 + elem.style.display = "";
  4647 + }
  4648 + }
  4649 + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
  4650 + values[ index ] = getDefaultDisplay( elem );
  4651 + }
  4652 + } else {
  4653 + if ( display !== "none" ) {
  4654 + values[ index ] = "none";
  4655 +
  4656 + // Remember what we're overwriting
  4657 + dataPriv.set( elem, "display", display );
  4658 + }
  4659 + }
  4660 + }
  4661 +
  4662 + // Set the display of the elements in a second loop to avoid constant reflow
  4663 + for ( index = 0; index < length; index++ ) {
  4664 + if ( values[ index ] != null ) {
  4665 + elements[ index ].style.display = values[ index ];
  4666 + }
  4667 + }
  4668 +
  4669 + return elements;
  4670 +}
  4671 +
  4672 +jQuery.fn.extend( {
  4673 + show: function() {
  4674 + return showHide( this, true );
  4675 + },
  4676 + hide: function() {
  4677 + return showHide( this );
  4678 + },
  4679 + toggle: function( state ) {
  4680 + if ( typeof state === "boolean" ) {
  4681 + return state ? this.show() : this.hide();
  4682 + }
  4683 +
  4684 + return this.each( function() {
  4685 + if ( isHiddenWithinTree( this ) ) {
  4686 + jQuery( this ).show();
  4687 + } else {
  4688 + jQuery( this ).hide();
  4689 + }
  4690 + } );
  4691 + }
  4692 +} );
  4693 +var rcheckableType = ( /^(?:checkbox|radio)$/i );
  4694 +
  4695 +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
  4696 +
  4697 +var rscriptType = ( /^$|\/(?:java|ecma)script/i );
  4698 +
  4699 +
  4700 +
  4701 +// We have to close these tags to support XHTML (#13200)
  4702 +var wrapMap = {
  4703 +
  4704 + // Support: IE <=9 only
  4705 + option: [ 1, "<select multiple='multiple'>", "</select>" ],
  4706 +
  4707 + // XHTML parsers do not magically insert elements in the
  4708 + // same way that tag soup parsers do. So we cannot shorten
  4709 + // this by omitting <tbody> or other required elements.
  4710 + thead: [ 1, "<table>", "</table>" ],
  4711 + col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
  4712 + tr: [ 2, "<table><tbody>", "</tbody></table>" ],
  4713 + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
  4714 +
  4715 + _default: [ 0, "", "" ]
  4716 +};
  4717 +
  4718 +// Support: IE <=9 only
  4719 +wrapMap.optgroup = wrapMap.option;
  4720 +
  4721 +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
  4722 +wrapMap.th = wrapMap.td;
  4723 +
  4724 +
  4725 +function getAll( context, tag ) {
  4726 +
  4727 + // Support: IE <=9 - 11 only
  4728 + // Use typeof to avoid zero-argument method invocation on host objects (#15151)
  4729 + var ret;
  4730 +
  4731 + if ( typeof context.getElementsByTagName !== "undefined" ) {
  4732 + ret = context.getElementsByTagName( tag || "*" );
  4733 +
  4734 + } else if ( typeof context.querySelectorAll !== "undefined" ) {
  4735 + ret = context.querySelectorAll( tag || "*" );
  4736 +
  4737 + } else {
  4738 + ret = [];
  4739 + }
  4740 +
  4741 + if ( tag === undefined || tag && nodeName( context, tag ) ) {
  4742 + return jQuery.merge( [ context ], ret );
  4743 + }
  4744 +
  4745 + return ret;
  4746 +}
  4747 +
  4748 +
  4749 +// Mark scripts as having already been evaluated
  4750 +function setGlobalEval( elems, refElements ) {
  4751 + var i = 0,
  4752 + l = elems.length;
  4753 +
  4754 + for ( ; i < l; i++ ) {
  4755 + dataPriv.set(
  4756 + elems[ i ],
  4757 + "globalEval",
  4758 + !refElements || dataPriv.get( refElements[ i ], "globalEval" )
  4759 + );
  4760 + }
  4761 +}
  4762 +
  4763 +
  4764 +var rhtml = /<|&#?\w+;/;
  4765 +
  4766 +function buildFragment( elems, context, scripts, selection, ignored ) {
  4767 + var elem, tmp, tag, wrap, contains, j,
  4768 + fragment = context.createDocumentFragment(),
  4769 + nodes = [],
  4770 + i = 0,
  4771 + l = elems.length;
  4772 +
  4773 + for ( ; i < l; i++ ) {
  4774 + elem = elems[ i ];
  4775 +
  4776 + if ( elem || elem === 0 ) {
  4777 +
  4778 + // Add nodes directly
  4779 + if ( jQuery.type( elem ) === "object" ) {
  4780 +
  4781 + // Support: Android <=4.0 only, PhantomJS 1 only
  4782 + // push.apply(_, arraylike) throws on ancient WebKit
  4783 + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
  4784 +
  4785 + // Convert non-html into a text node
  4786 + } else if ( !rhtml.test( elem ) ) {
  4787 + nodes.push( context.createTextNode( elem ) );
  4788 +
  4789 + // Convert html into DOM nodes
  4790 + } else {
  4791 + tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
  4792 +
  4793 + // Deserialize a standard representation
  4794 + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
  4795 + wrap = wrapMap[ tag ] || wrapMap._default;
  4796 + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
  4797 +
  4798 + // Descend through wrappers to the right content
  4799 + j = wrap[ 0 ];
  4800 + while ( j-- ) {
  4801 + tmp = tmp.lastChild;
  4802 + }
  4803 +
  4804 + // Support: Android <=4.0 only, PhantomJS 1 only
  4805 + // push.apply(_, arraylike) throws on ancient WebKit
  4806 + jQuery.merge( nodes, tmp.childNodes );
  4807 +
  4808 + // Remember the top-level container
  4809 + tmp = fragment.firstChild;
  4810 +
  4811 + // Ensure the created nodes are orphaned (#12392)
  4812 + tmp.textContent = "";
  4813 + }
  4814 + }
  4815 + }
  4816 +
  4817 + // Remove wrapper from fragment
  4818 + fragment.textContent = "";
  4819 +
  4820 + i = 0;
  4821 + while ( ( elem = nodes[ i++ ] ) ) {
  4822 +
  4823 + // Skip elements already in the context collection (trac-4087)
  4824 + if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
  4825 + if ( ignored ) {
  4826 + ignored.push( elem );
  4827 + }
  4828 + continue;
  4829 + }
  4830 +
  4831 + contains = jQuery.contains( elem.ownerDocument, elem );
  4832 +
  4833 + // Append to fragment
  4834 + tmp = getAll( fragment.appendChild( elem ), "script" );
  4835 +
  4836 + // Preserve script evaluation history
  4837 + if ( contains ) {
  4838 + setGlobalEval( tmp );
  4839 + }
  4840 +
  4841 + // Capture executables
  4842 + if ( scripts ) {
  4843 + j = 0;
  4844 + while ( ( elem = tmp[ j++ ] ) ) {
  4845 + if ( rscriptType.test( elem.type || "" ) ) {
  4846 + scripts.push( elem );
  4847 + }
  4848 + }
  4849 + }
  4850 + }
  4851 +
  4852 + return fragment;
  4853 +}
  4854 +
  4855 +
  4856 +( function() {
  4857 + var fragment = document.createDocumentFragment(),
  4858 + div = fragment.appendChild( document.createElement( "div" ) ),
  4859 + input = document.createElement( "input" );
  4860 +
  4861 + // Support: Android 4.0 - 4.3 only
  4862 + // Check state lost if the name is set (#11217)
  4863 + // Support: Windows Web Apps (WWA)
  4864 + // `name` and `type` must use .setAttribute for WWA (#14901)
  4865 + input.setAttribute( "type", "radio" );
  4866 + input.setAttribute( "checked", "checked" );
  4867 + input.setAttribute( "name", "t" );
  4868 +
  4869 + div.appendChild( input );
  4870 +
  4871 + // Support: Android <=4.1 only
  4872 + // Older WebKit doesn't clone checked state correctly in fragments
  4873 + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
  4874 +
  4875 + // Support: IE <=11 only
  4876 + // Make sure textarea (and checkbox) defaultValue is properly cloned
  4877 + div.innerHTML = "<textarea>x</textarea>";
  4878 + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
  4879 +} )();
  4880 +var documentElement = document.documentElement;
  4881 +
  4882 +
  4883 +
  4884 +var
  4885 + rkeyEvent = /^key/,
  4886 + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
  4887 + rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
  4888 +
  4889 +function returnTrue() {
  4890 + return true;
  4891 +}
  4892 +
  4893 +function returnFalse() {
  4894 + return false;
  4895 +}
  4896 +
  4897 +// Support: IE <=9 only
  4898 +// See #13393 for more info
  4899 +function safeActiveElement() {
  4900 + try {
  4901 + return document.activeElement;
  4902 + } catch ( err ) { }
  4903 +}
  4904 +
  4905 +function on( elem, types, selector, data, fn, one ) {
  4906 + var origFn, type;
  4907 +
  4908 + // Types can be a map of types/handlers
  4909 + if ( typeof types === "object" ) {
  4910 +
  4911 + // ( types-Object, selector, data )
  4912 + if ( typeof selector !== "string" ) {
  4913 +
  4914 + // ( types-Object, data )
  4915 + data = data || selector;
  4916 + selector = undefined;
  4917 + }
  4918 + for ( type in types ) {
  4919 + on( elem, type, selector, data, types[ type ], one );
  4920 + }
  4921 + return elem;
  4922 + }
  4923 +
  4924 + if ( data == null && fn == null ) {
  4925 +
  4926 + // ( types, fn )
  4927 + fn = selector;
  4928 + data = selector = undefined;
  4929 + } else if ( fn == null ) {
  4930 + if ( typeof selector === "string" ) {
  4931 +
  4932 + // ( types, selector, fn )
  4933 + fn = data;
  4934 + data = undefined;
  4935 + } else {
  4936 +
  4937 + // ( types, data, fn )
  4938 + fn = data;
  4939 + data = selector;
  4940 + selector = undefined;
  4941 + }
  4942 + }
  4943 + if ( fn === false ) {
  4944 + fn = returnFalse;
  4945 + } else if ( !fn ) {
  4946 + return elem;
  4947 + }
  4948 +
  4949 + if ( one === 1 ) {
  4950 + origFn = fn;
  4951 + fn = function( event ) {
  4952 +
  4953 + // Can use an empty set, since event contains the info
  4954 + jQuery().off( event );
  4955 + return origFn.apply( this, arguments );
  4956 + };
  4957 +
  4958 + // Use same guid so caller can remove using origFn
  4959 + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
  4960 + }
  4961 + return elem.each( function() {
  4962 + jQuery.event.add( this, types, fn, data, selector );
  4963 + } );
  4964 +}
  4965 +
  4966 +/*
  4967 + * Helper functions for managing events -- not part of the public interface.
  4968 + * Props to Dean Edwards' addEvent library for many of the ideas.
  4969 + */
  4970 +jQuery.event = {
  4971 +
  4972 + global: {},
  4973 +
  4974 + add: function( elem, types, handler, data, selector ) {
  4975 +
  4976 + var handleObjIn, eventHandle, tmp,
  4977 + events, t, handleObj,
  4978 + special, handlers, type, namespaces, origType,
  4979 + elemData = dataPriv.get( elem );
  4980 +
  4981 + // Don't attach events to noData or text/comment nodes (but allow plain objects)
  4982 + if ( !elemData ) {
  4983 + return;
  4984 + }
  4985 +
  4986 + // Caller can pass in an object of custom data in lieu of the handler
  4987 + if ( handler.handler ) {
  4988 + handleObjIn = handler;
  4989 + handler = handleObjIn.handler;
  4990 + selector = handleObjIn.selector;
  4991 + }
  4992 +
  4993 + // Ensure that invalid selectors throw exceptions at attach time
  4994 + // Evaluate against documentElement in case elem is a non-element node (e.g., document)
  4995 + if ( selector ) {
  4996 + jQuery.find.matchesSelector( documentElement, selector );
  4997 + }
  4998 +
  4999 + // Make sure that the handler has a unique ID, used to find/remove it later
  5000 + if ( !handler.guid ) {
  5001 + handler.guid = jQuery.guid++;
  5002 + }
  5003 +
  5004 + // Init the element's event structure and main handler, if this is the first
  5005 + if ( !( events = elemData.events ) ) {
  5006 + events = elemData.events = {};
  5007 + }
  5008 + if ( !( eventHandle = elemData.handle ) ) {
  5009 + eventHandle = elemData.handle = function( e ) {
  5010 +
  5011 + // Discard the second event of a jQuery.event.trigger() and
  5012 + // when an event is called after a page has unloaded
  5013 + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
  5014 + jQuery.event.dispatch.apply( elem, arguments ) : undefined;
  5015 + };
  5016 + }
  5017 +
  5018 + // Handle multiple events separated by a space
  5019 + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
  5020 + t = types.length;
  5021 + while ( t-- ) {
  5022 + tmp = rtypenamespace.exec( types[ t ] ) || [];
  5023 + type = origType = tmp[ 1 ];
  5024 + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
  5025 +
  5026 + // There *must* be a type, no attaching namespace-only handlers
  5027 + if ( !type ) {
  5028 + continue;
  5029 + }
  5030 +
  5031 + // If event changes its type, use the special event handlers for the changed type
  5032 + special = jQuery.event.special[ type ] || {};
  5033 +
  5034 + // If selector defined, determine special event api type, otherwise given type
  5035 + type = ( selector ? special.delegateType : special.bindType ) || type;
  5036 +
  5037 + // Update special based on newly reset type
  5038 + special = jQuery.event.special[ type ] || {};
  5039 +
  5040 + // handleObj is passed to all event handlers
  5041 + handleObj = jQuery.extend( {
  5042 + type: type,
  5043 + origType: origType,
  5044 + data: data,
  5045 + handler: handler,
  5046 + guid: handler.guid,
  5047 + selector: selector,
  5048 + needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
  5049 + namespace: namespaces.join( "." )
  5050 + }, handleObjIn );
  5051 +
  5052 + // Init the event handler queue if we're the first
  5053 + if ( !( handlers = events[ type ] ) ) {
  5054 + handlers = events[ type ] = [];
  5055 + handlers.delegateCount = 0;
  5056 +
  5057 + // Only use addEventListener if the special events handler returns false
  5058 + if ( !special.setup ||
  5059 + special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
  5060 +
  5061 + if ( elem.addEventListener ) {
  5062 + elem.addEventListener( type, eventHandle );
  5063 + }
  5064 + }
  5065 + }
  5066 +
  5067 + if ( special.add ) {
  5068 + special.add.call( elem, handleObj );
  5069 +
  5070 + if ( !handleObj.handler.guid ) {
  5071 + handleObj.handler.guid = handler.guid;
  5072 + }
  5073 + }
  5074 +
  5075 + // Add to the element's handler list, delegates in front
  5076 + if ( selector ) {
  5077 + handlers.splice( handlers.delegateCount++, 0, handleObj );
  5078 + } else {
  5079 + handlers.push( handleObj );
  5080 + }
  5081 +
  5082 + // Keep track of which events have ever been used, for event optimization
  5083 + jQuery.event.global[ type ] = true;
  5084 + }
  5085 +
  5086 + },
  5087 +
  5088 + // Detach an event or set of events from an element
  5089 + remove: function( elem, types, handler, selector, mappedTypes ) {
  5090 +
  5091 + var j, origCount, tmp,
  5092 + events, t, handleObj,
  5093 + special, handlers, type, namespaces, origType,
  5094 + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
  5095 +
  5096 + if ( !elemData || !( events = elemData.events ) ) {
  5097 + return;
  5098 + }
  5099 +
  5100 + // Once for each type.namespace in types; type may be omitted
  5101 + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
  5102 + t = types.length;
  5103 + while ( t-- ) {
  5104 + tmp = rtypenamespace.exec( types[ t ] ) || [];
  5105 + type = origType = tmp[ 1 ];
  5106 + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
  5107 +
  5108 + // Unbind all events (on this namespace, if provided) for the element
  5109 + if ( !type ) {
  5110 + for ( type in events ) {
  5111 + jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
  5112 + }
  5113 + continue;
  5114 + }
  5115 +
  5116 + special = jQuery.event.special[ type ] || {};
  5117 + type = ( selector ? special.delegateType : special.bindType ) || type;
  5118 + handlers = events[ type ] || [];
  5119 + tmp = tmp[ 2 ] &&
  5120 + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
  5121 +
  5122 + // Remove matching events
  5123 + origCount = j = handlers.length;
  5124 + while ( j-- ) {
  5125 + handleObj = handlers[ j ];
  5126 +
  5127 + if ( ( mappedTypes || origType === handleObj.origType ) &&
  5128 + ( !handler || handler.guid === handleObj.guid ) &&
  5129 + ( !tmp || tmp.test( handleObj.namespace ) ) &&
  5130 + ( !selector || selector === handleObj.selector ||
  5131 + selector === "**" && handleObj.selector ) ) {
  5132 + handlers.splice( j, 1 );
  5133 +
  5134 + if ( handleObj.selector ) {
  5135 + handlers.delegateCount--;
  5136 + }
  5137 + if ( special.remove ) {
  5138 + special.remove.call( elem, handleObj );
  5139 + }
  5140 + }
  5141 + }
  5142 +
  5143 + // Remove generic event handler if we removed something and no more handlers exist
  5144 + // (avoids potential for endless recursion during removal of special event handlers)
  5145 + if ( origCount && !handlers.length ) {
  5146 + if ( !special.teardown ||
  5147 + special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
  5148 +
  5149 + jQuery.removeEvent( elem, type, elemData.handle );
  5150 + }
  5151 +
  5152 + delete events[ type ];
  5153 + }
  5154 + }
  5155 +
  5156 + // Remove data and the expando if it's no longer used
  5157 + if ( jQuery.isEmptyObject( events ) ) {
  5158 + dataPriv.remove( elem, "handle events" );
  5159 + }
  5160 + },
  5161 +
  5162 + dispatch: function( nativeEvent ) {
  5163 +
  5164 + // Make a writable jQuery.Event from the native event object
  5165 + var event = jQuery.event.fix( nativeEvent );
  5166 +
  5167 + var i, j, ret, matched, handleObj, handlerQueue,
  5168 + args = new Array( arguments.length ),
  5169 + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
  5170 + special = jQuery.event.special[ event.type ] || {};
  5171 +
  5172 + // Use the fix-ed jQuery.Event rather than the (read-only) native event
  5173 + args[ 0 ] = event;
  5174 +
  5175 + for ( i = 1; i < arguments.length; i++ ) {
  5176 + args[ i ] = arguments[ i ];
  5177 + }
  5178 +
  5179 + event.delegateTarget = this;
  5180 +
  5181 + // Call the preDispatch hook for the mapped type, and let it bail if desired
  5182 + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
  5183 + return;
  5184 + }
  5185 +
  5186 + // Determine handlers
  5187 + handlerQueue = jQuery.event.handlers.call( this, event, handlers );
  5188 +
  5189 + // Run delegates first; they may want to stop propagation beneath us
  5190 + i = 0;
  5191 + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
  5192 + event.currentTarget = matched.elem;
  5193 +
  5194 + j = 0;
  5195 + while ( ( handleObj = matched.handlers[ j++ ] ) &&
  5196 + !event.isImmediatePropagationStopped() ) {
  5197 +
  5198 + // Triggered event must either 1) have no namespace, or 2) have namespace(s)
  5199 + // a subset or equal to those in the bound event (both can have no namespace).
  5200 + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
  5201 +
  5202 + event.handleObj = handleObj;
  5203 + event.data = handleObj.data;
  5204 +
  5205 + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
  5206 + handleObj.handler ).apply( matched.elem, args );
  5207 +
  5208 + if ( ret !== undefined ) {
  5209 + if ( ( event.result = ret ) === false ) {
  5210 + event.preventDefault();
  5211 + event.stopPropagation();
  5212 + }
  5213 + }
  5214 + }
  5215 + }
  5216 + }
  5217 +
  5218 + // Call the postDispatch hook for the mapped type
  5219 + if ( special.postDispatch ) {
  5220 + special.postDispatch.call( this, event );
  5221 + }
  5222 +
  5223 + return event.result;
  5224 + },
  5225 +
  5226 + handlers: function( event, handlers ) {
  5227 + var i, handleObj, sel, matchedHandlers, matchedSelectors,
  5228 + handlerQueue = [],
  5229 + delegateCount = handlers.delegateCount,
  5230 + cur = event.target;
  5231 +
  5232 + // Find delegate handlers
  5233 + if ( delegateCount &&
  5234 +
  5235 + // Support: IE <=9
  5236 + // Black-hole SVG <use> instance trees (trac-13180)
  5237 + cur.nodeType &&
  5238 +
  5239 + // Support: Firefox <=42
  5240 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
  5241 + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
  5242 + // Support: IE 11 only
  5243 + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
  5244 + !( event.type === "click" && event.button >= 1 ) ) {
  5245 +
  5246 + for ( ; cur !== this; cur = cur.parentNode || this ) {
  5247 +
  5248 + // Don't check non-elements (#13208)
  5249 + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
  5250 + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
  5251 + matchedHandlers = [];
  5252 + matchedSelectors = {};
  5253 + for ( i = 0; i < delegateCount; i++ ) {
  5254 + handleObj = handlers[ i ];
  5255 +
  5256 + // Don't conflict with Object.prototype properties (#13203)
  5257 + sel = handleObj.selector + " ";
  5258 +
  5259 + if ( matchedSelectors[ sel ] === undefined ) {
  5260 + matchedSelectors[ sel ] = handleObj.needsContext ?
  5261 + jQuery( sel, this ).index( cur ) > -1 :
  5262 + jQuery.find( sel, this, null, [ cur ] ).length;
  5263 + }
  5264 + if ( matchedSelectors[ sel ] ) {
  5265 + matchedHandlers.push( handleObj );
  5266 + }
  5267 + }
  5268 + if ( matchedHandlers.length ) {
  5269 + handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
  5270 + }
  5271 + }
  5272 + }
  5273 + }
  5274 +
  5275 + // Add the remaining (directly-bound) handlers
  5276 + cur = this;
  5277 + if ( delegateCount < handlers.length ) {
  5278 + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
  5279 + }
  5280 +
  5281 + return handlerQueue;
  5282 + },
  5283 +
  5284 + addProp: function( name, hook ) {
  5285 + Object.defineProperty( jQuery.Event.prototype, name, {
  5286 + enumerable: true,
  5287 + configurable: true,
  5288 +
  5289 + get: jQuery.isFunction( hook ) ?
  5290 + function() {
  5291 + if ( this.originalEvent ) {
  5292 + return hook( this.originalEvent );
  5293 + }
  5294 + } :
  5295 + function() {
  5296 + if ( this.originalEvent ) {
  5297 + return this.originalEvent[ name ];
  5298 + }
  5299 + },
  5300 +
  5301 + set: function( value ) {
  5302 + Object.defineProperty( this, name, {
  5303 + enumerable: true,
  5304 + configurable: true,
  5305 + writable: true,
  5306 + value: value
  5307 + } );
  5308 + }
  5309 + } );
  5310 + },
  5311 +
  5312 + fix: function( originalEvent ) {
  5313 + return originalEvent[ jQuery.expando ] ?
  5314 + originalEvent :
  5315 + new jQuery.Event( originalEvent );
  5316 + },
  5317 +
  5318 + special: {
  5319 + load: {
  5320 +
  5321 + // Prevent triggered image.load events from bubbling to window.load
  5322 + noBubble: true
  5323 + },
  5324 + focus: {
  5325 +
  5326 + // Fire native event if possible so blur/focus sequence is correct
  5327 + trigger: function() {
  5328 + if ( this !== safeActiveElement() && this.focus ) {
  5329 + this.focus();
  5330 + return false;
  5331 + }
  5332 + },
  5333 + delegateType: "focusin"
  5334 + },
  5335 + blur: {
  5336 + trigger: function() {
  5337 + if ( this === safeActiveElement() && this.blur ) {
  5338 + this.blur();
  5339 + return false;
  5340 + }
  5341 + },
  5342 + delegateType: "focusout"
  5343 + },
  5344 + click: {
  5345 +
  5346 + // For checkable types, fire native event so checked state will be right
  5347 + trigger: function() {
  5348 + if ( rcheckableType.test( this.type ) &&
  5349 + this.click && nodeName( this, "input" ) ) {
  5350 +
  5351 + this.click();
  5352 + return false;
  5353 + }
  5354 + },
  5355 +
  5356 + // For cross-browser consistency, don't fire native .click() on links
  5357 + _default: function( event ) {
  5358 + return nodeName( event.target, "a" );
  5359 + }
  5360 + },
  5361 +
  5362 + beforeunload: {
  5363 + postDispatch: function( event ) {
  5364 +
  5365 + // Support: Firefox 20+
  5366 + // Firefox doesn't alert if the returnValue field is not set.
  5367 + if ( event.result !== undefined && event.originalEvent ) {
  5368 + event.originalEvent.returnValue = event.result;
  5369 + }
  5370 + }
  5371 + }
  5372 + }
  5373 +};
  5374 +
  5375 +jQuery.removeEvent = function( elem, type, handle ) {
  5376 +
  5377 + // This "if" is needed for plain objects
  5378 + if ( elem.removeEventListener ) {
  5379 + elem.removeEventListener( type, handle );
  5380 + }
  5381 +};
  5382 +
  5383 +jQuery.Event = function( src, props ) {
  5384 +
  5385 + // Allow instantiation without the 'new' keyword
  5386 + if ( !( this instanceof jQuery.Event ) ) {
  5387 + return new jQuery.Event( src, props );
  5388 + }
  5389 +
  5390 + // Event object
  5391 + if ( src && src.type ) {
  5392 + this.originalEvent = src;
  5393 + this.type = src.type;
  5394 +
  5395 + // Events bubbling up the document may have been marked as prevented
  5396 + // by a handler lower down the tree; reflect the correct value.
  5397 + this.isDefaultPrevented = src.defaultPrevented ||
  5398 + src.defaultPrevented === undefined &&
  5399 +
  5400 + // Support: Android <=2.3 only
  5401 + src.returnValue === false ?
  5402 + returnTrue :
  5403 + returnFalse;
  5404 +
  5405 + // Create target properties
  5406 + // Support: Safari <=6 - 7 only
  5407 + // Target should not be a text node (#504, #13143)
  5408 + this.target = ( src.target && src.target.nodeType === 3 ) ?
  5409 + src.target.parentNode :
  5410 + src.target;
  5411 +
  5412 + this.currentTarget = src.currentTarget;
  5413 + this.relatedTarget = src.relatedTarget;
  5414 +
  5415 + // Event type
  5416 + } else {
  5417 + this.type = src;
  5418 + }
  5419 +
  5420 + // Put explicitly provided properties onto the event object
  5421 + if ( props ) {
  5422 + jQuery.extend( this, props );
  5423 + }
  5424 +
  5425 + // Create a timestamp if incoming event doesn't have one
  5426 + this.timeStamp = src && src.timeStamp || jQuery.now();
  5427 +
  5428 + // Mark it as fixed
  5429 + this[ jQuery.expando ] = true;
  5430 +};
  5431 +
  5432 +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
  5433 +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
  5434 +jQuery.Event.prototype = {
  5435 + constructor: jQuery.Event,
  5436 + isDefaultPrevented: returnFalse,
  5437 + isPropagationStopped: returnFalse,
  5438 + isImmediatePropagationStopped: returnFalse,
  5439 + isSimulated: false,
  5440 +
  5441 + preventDefault: function() {
  5442 + var e = this.originalEvent;
  5443 +
  5444 + this.isDefaultPrevented = returnTrue;
  5445 +
  5446 + if ( e && !this.isSimulated ) {
  5447 + e.preventDefault();
  5448 + }
  5449 + },
  5450 + stopPropagation: function() {
  5451 + var e = this.originalEvent;
  5452 +
  5453 + this.isPropagationStopped = returnTrue;
  5454 +
  5455 + if ( e && !this.isSimulated ) {
  5456 + e.stopPropagation();
  5457 + }
  5458 + },
  5459 + stopImmediatePropagation: function() {
  5460 + var e = this.originalEvent;
  5461 +
  5462 + this.isImmediatePropagationStopped = returnTrue;
  5463 +
  5464 + if ( e && !this.isSimulated ) {
  5465 + e.stopImmediatePropagation();
  5466 + }
  5467 +
  5468 + this.stopPropagation();
  5469 + }
  5470 +};
  5471 +
  5472 +// Includes all common event props including KeyEvent and MouseEvent specific props
  5473 +jQuery.each( {
  5474 + altKey: true,
  5475 + bubbles: true,
  5476 + cancelable: true,
  5477 + changedTouches: true,
  5478 + ctrlKey: true,
  5479 + detail: true,
  5480 + eventPhase: true,
  5481 + metaKey: true,
  5482 + pageX: true,
  5483 + pageY: true,
  5484 + shiftKey: true,
  5485 + view: true,
  5486 + "char": true,
  5487 + charCode: true,
  5488 + key: true,
  5489 + keyCode: true,
  5490 + button: true,
  5491 + buttons: true,
  5492 + clientX: true,
  5493 + clientY: true,
  5494 + offsetX: true,
  5495 + offsetY: true,
  5496 + pointerId: true,
  5497 + pointerType: true,
  5498 + screenX: true,
  5499 + screenY: true,
  5500 + targetTouches: true,
  5501 + toElement: true,
  5502 + touches: true,
  5503 +
  5504 + which: function( event ) {
  5505 + var button = event.button;
  5506 +
  5507 + // Add which for key events
  5508 + if ( event.which == null && rkeyEvent.test( event.type ) ) {
  5509 + return event.charCode != null ? event.charCode : event.keyCode;
  5510 + }
  5511 +
  5512 + // Add which for click: 1 === left; 2 === middle; 3 === right
  5513 + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
  5514 + if ( button & 1 ) {
  5515 + return 1;
  5516 + }
  5517 +
  5518 + if ( button & 2 ) {
  5519 + return 3;
  5520 + }
  5521 +
  5522 + if ( button & 4 ) {
  5523 + return 2;
  5524 + }
  5525 +
  5526 + return 0;
  5527 + }
  5528 +
  5529 + return event.which;
  5530 + }
  5531 +}, jQuery.event.addProp );
  5532 +
  5533 +// Create mouseenter/leave events using mouseover/out and event-time checks
  5534 +// so that event delegation works in jQuery.
  5535 +// Do the same for pointerenter/pointerleave and pointerover/pointerout
  5536 +//
  5537 +// Support: Safari 7 only
  5538 +// Safari sends mouseenter too often; see:
  5539 +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
  5540 +// for the description of the bug (it existed in older Chrome versions as well).
  5541 +jQuery.each( {
  5542 + mouseenter: "mouseover",
  5543 + mouseleave: "mouseout",
  5544 + pointerenter: "pointerover",
  5545 + pointerleave: "pointerout"
  5546 +}, function( orig, fix ) {
  5547 + jQuery.event.special[ orig ] = {
  5548 + delegateType: fix,
  5549 + bindType: fix,
  5550 +
  5551 + handle: function( event ) {
  5552 + var ret,
  5553 + target = this,
  5554 + related = event.relatedTarget,
  5555 + handleObj = event.handleObj;
  5556 +
  5557 + // For mouseenter/leave call the handler if related is outside the target.
  5558 + // NB: No relatedTarget if the mouse left/entered the browser window
  5559 + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
  5560 + event.type = handleObj.origType;
  5561 + ret = handleObj.handler.apply( this, arguments );
  5562 + event.type = fix;
  5563 + }
  5564 + return ret;
  5565 + }
  5566 + };
  5567 +} );
  5568 +
  5569 +jQuery.fn.extend( {
  5570 +
  5571 + on: function( types, selector, data, fn ) {
  5572 + return on( this, types, selector, data, fn );
  5573 + },
  5574 + one: function( types, selector, data, fn ) {
  5575 + return on( this, types, selector, data, fn, 1 );
  5576 + },
  5577 + off: function( types, selector, fn ) {
  5578 + var handleObj, type;
  5579 + if ( types && types.preventDefault && types.handleObj ) {
  5580 +
  5581 + // ( event ) dispatched jQuery.Event
  5582 + handleObj = types.handleObj;
  5583 + jQuery( types.delegateTarget ).off(
  5584 + handleObj.namespace ?
  5585 + handleObj.origType + "." + handleObj.namespace :
  5586 + handleObj.origType,
  5587 + handleObj.selector,
  5588 + handleObj.handler
  5589 + );
  5590 + return this;
  5591 + }
  5592 + if ( typeof types === "object" ) {
  5593 +
  5594 + // ( types-object [, selector] )
  5595 + for ( type in types ) {
  5596 + this.off( type, selector, types[ type ] );
  5597 + }
  5598 + return this;
  5599 + }
  5600 + if ( selector === false || typeof selector === "function" ) {
  5601 +
  5602 + // ( types [, fn] )
  5603 + fn = selector;
  5604 + selector = undefined;
  5605 + }
  5606 + if ( fn === false ) {
  5607 + fn = returnFalse;
  5608 + }
  5609 + return this.each( function() {
  5610 + jQuery.event.remove( this, types, fn, selector );
  5611 + } );
  5612 + }
  5613 +} );
  5614 +
  5615 +
  5616 +var
  5617 +
  5618 + /* eslint-disable max-len */
  5619 +
  5620 + // See https://github.com/eslint/eslint/issues/3229
  5621 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
  5622 +
  5623 + /* eslint-enable */
  5624 +
  5625 + // Support: IE <=10 - 11, Edge 12 - 13
  5626 + // In IE/Edge using regex groups here causes severe slowdowns.
  5627 + // See https://connect.microsoft.com/IE/feedback/details/1736512/
  5628 + rnoInnerhtml = /<script|<style|<link/i,
  5629 +
  5630 + // checked="checked" or checked
  5631 + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
  5632 + rscriptTypeMasked = /^true\/(.*)/,
  5633 + rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
  5634 +
  5635 +// Prefer a tbody over its parent table for containing new rows
  5636 +function manipulationTarget( elem, content ) {
  5637 + if ( nodeName( elem, "table" ) &&
  5638 + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
  5639 +
  5640 + return jQuery( ">tbody", elem )[ 0 ] || elem;
  5641 + }
  5642 +
  5643 + return elem;
  5644 +}
  5645 +
  5646 +// Replace/restore the type attribute of script elements for safe DOM manipulation
  5647 +function disableScript( elem ) {
  5648 + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
  5649 + return elem;
  5650 +}
  5651 +function restoreScript( elem ) {
  5652 + var match = rscriptTypeMasked.exec( elem.type );
  5653 +
  5654 + if ( match ) {
  5655 + elem.type = match[ 1 ];
  5656 + } else {
  5657 + elem.removeAttribute( "type" );
  5658 + }
  5659 +
  5660 + return elem;
  5661 +}
  5662 +
  5663 +function cloneCopyEvent( src, dest ) {
  5664 + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
  5665 +
  5666 + if ( dest.nodeType !== 1 ) {
  5667 + return;
  5668 + }
  5669 +
  5670 + // 1. Copy private data: events, handlers, etc.
  5671 + if ( dataPriv.hasData( src ) ) {
  5672 + pdataOld = dataPriv.access( src );
  5673 + pdataCur = dataPriv.set( dest, pdataOld );
  5674 + events = pdataOld.events;
  5675 +
  5676 + if ( events ) {
  5677 + delete pdataCur.handle;
  5678 + pdataCur.events = {};
  5679 +
  5680 + for ( type in events ) {
  5681 + for ( i = 0, l = events[ type ].length; i < l; i++ ) {
  5682 + jQuery.event.add( dest, type, events[ type ][ i ] );
  5683 + }
  5684 + }
  5685 + }
  5686 + }
  5687 +
  5688 + // 2. Copy user data
  5689 + if ( dataUser.hasData( src ) ) {
  5690 + udataOld = dataUser.access( src );
  5691 + udataCur = jQuery.extend( {}, udataOld );
  5692 +
  5693 + dataUser.set( dest, udataCur );
  5694 + }
  5695 +}
  5696 +
  5697 +// Fix IE bugs, see support tests
  5698 +function fixInput( src, dest ) {
  5699 + var nodeName = dest.nodeName.toLowerCase();
  5700 +
  5701 + // Fails to persist the checked state of a cloned checkbox or radio button.
  5702 + if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
  5703 + dest.checked = src.checked;
  5704 +
  5705 + // Fails to return the selected option to the default selected state when cloning options
  5706 + } else if ( nodeName === "input" || nodeName === "textarea" ) {
  5707 + dest.defaultValue = src.defaultValue;
  5708 + }
  5709 +}
  5710 +
  5711 +function domManip( collection, args, callback, ignored ) {
  5712 +
  5713 + // Flatten any nested arrays
  5714 + args = concat.apply( [], args );
  5715 +
  5716 + var fragment, first, scripts, hasScripts, node, doc,
  5717 + i = 0,
  5718 + l = collection.length,
  5719 + iNoClone = l - 1,
  5720 + value = args[ 0 ],
  5721 + isFunction = jQuery.isFunction( value );
  5722 +
  5723 + // We can't cloneNode fragments that contain checked, in WebKit
  5724 + if ( isFunction ||
  5725 + ( l > 1 && typeof value === "string" &&
  5726 + !support.checkClone && rchecked.test( value ) ) ) {
  5727 + return collection.each( function( index ) {
  5728 + var self = collection.eq( index );
  5729 + if ( isFunction ) {
  5730 + args[ 0 ] = value.call( this, index, self.html() );
  5731 + }
  5732 + domManip( self, args, callback, ignored );
  5733 + } );
  5734 + }
  5735 +
  5736 + if ( l ) {
  5737 + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
  5738 + first = fragment.firstChild;
  5739 +
  5740 + if ( fragment.childNodes.length === 1 ) {
  5741 + fragment = first;
  5742 + }
  5743 +
  5744 + // Require either new content or an interest in ignored elements to invoke the callback
  5745 + if ( first || ignored ) {
  5746 + scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
  5747 + hasScripts = scripts.length;
  5748 +
  5749 + // Use the original fragment for the last item
  5750 + // instead of the first because it can end up
  5751 + // being emptied incorrectly in certain situations (#8070).
  5752 + for ( ; i < l; i++ ) {
  5753 + node = fragment;
  5754 +
  5755 + if ( i !== iNoClone ) {
  5756 + node = jQuery.clone( node, true, true );
  5757 +
  5758 + // Keep references to cloned scripts for later restoration
  5759 + if ( hasScripts ) {
  5760 +
  5761 + // Support: Android <=4.0 only, PhantomJS 1 only
  5762 + // push.apply(_, arraylike) throws on ancient WebKit
  5763 + jQuery.merge( scripts, getAll( node, "script" ) );
  5764 + }
  5765 + }
  5766 +
  5767 + callback.call( collection[ i ], node, i );
  5768 + }
  5769 +
  5770 + if ( hasScripts ) {
  5771 + doc = scripts[ scripts.length - 1 ].ownerDocument;
  5772 +
  5773 + // Reenable scripts
  5774 + jQuery.map( scripts, restoreScript );
  5775 +
  5776 + // Evaluate executable scripts on first document insertion
  5777 + for ( i = 0; i < hasScripts; i++ ) {
  5778 + node = scripts[ i ];
  5779 + if ( rscriptType.test( node.type || "" ) &&
  5780 + !dataPriv.access( node, "globalEval" ) &&
  5781 + jQuery.contains( doc, node ) ) {
  5782 +
  5783 + if ( node.src ) {
  5784 +
  5785 + // Optional AJAX dependency, but won't run scripts if not present
  5786 + if ( jQuery._evalUrl ) {
  5787 + jQuery._evalUrl( node.src );
  5788 + }
  5789 + } else {
  5790 + DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
  5791 + }
  5792 + }
  5793 + }
  5794 + }
  5795 + }
  5796 + }
  5797 +
  5798 + return collection;
  5799 +}
  5800 +
  5801 +function remove( elem, selector, keepData ) {
  5802 + var node,
  5803 + nodes = selector ? jQuery.filter( selector, elem ) : elem,
  5804 + i = 0;
  5805 +
  5806 + for ( ; ( node = nodes[ i ] ) != null; i++ ) {
  5807 + if ( !keepData && node.nodeType === 1 ) {
  5808 + jQuery.cleanData( getAll( node ) );
  5809 + }
  5810 +
  5811 + if ( node.parentNode ) {
  5812 + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
  5813 + setGlobalEval( getAll( node, "script" ) );
  5814 + }
  5815 + node.parentNode.removeChild( node );
  5816 + }
  5817 + }
  5818 +
  5819 + return elem;
  5820 +}
  5821 +
  5822 +jQuery.extend( {
  5823 + htmlPrefilter: function( html ) {
  5824 + return html.replace( rxhtmlTag, "<$1></$2>" );
  5825 + },
  5826 +
  5827 + clone: function( elem, dataAndEvents, deepDataAndEvents ) {
  5828 + var i, l, srcElements, destElements,
  5829 + clone = elem.cloneNode( true ),
  5830 + inPage = jQuery.contains( elem.ownerDocument, elem );
  5831 +
  5832 + // Fix IE cloning issues
  5833 + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
  5834 + !jQuery.isXMLDoc( elem ) ) {
  5835 +
  5836 + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
  5837 + destElements = getAll( clone );
  5838 + srcElements = getAll( elem );
  5839 +
  5840 + for ( i = 0, l = srcElements.length; i < l; i++ ) {
  5841 + fixInput( srcElements[ i ], destElements[ i ] );
  5842 + }
  5843 + }
  5844 +
  5845 + // Copy the events from the original to the clone
  5846 + if ( dataAndEvents ) {
  5847 + if ( deepDataAndEvents ) {
  5848 + srcElements = srcElements || getAll( elem );
  5849 + destElements = destElements || getAll( clone );
  5850 +
  5851 + for ( i = 0, l = srcElements.length; i < l; i++ ) {
  5852 + cloneCopyEvent( srcElements[ i ], destElements[ i ] );
  5853 + }
  5854 + } else {
  5855 + cloneCopyEvent( elem, clone );
  5856 + }
  5857 + }
  5858 +
  5859 + // Preserve script evaluation history
  5860 + destElements = getAll( clone, "script" );
  5861 + if ( destElements.length > 0 ) {
  5862 + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
  5863 + }
  5864 +
  5865 + // Return the cloned set
  5866 + return clone;
  5867 + },
  5868 +
  5869 + cleanData: function( elems ) {
  5870 + var data, elem, type,
  5871 + special = jQuery.event.special,
  5872 + i = 0;
  5873 +
  5874 + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
  5875 + if ( acceptData( elem ) ) {
  5876 + if ( ( data = elem[ dataPriv.expando ] ) ) {
  5877 + if ( data.events ) {
  5878 + for ( type in data.events ) {
  5879 + if ( special[ type ] ) {
  5880 + jQuery.event.remove( elem, type );
  5881 +
  5882 + // This is a shortcut to avoid jQuery.event.remove's overhead
  5883 + } else {
  5884 + jQuery.removeEvent( elem, type, data.handle );
  5885 + }
  5886 + }
  5887 + }
  5888 +
  5889 + // Support: Chrome <=35 - 45+
  5890 + // Assign undefined instead of using delete, see Data#remove
  5891 + elem[ dataPriv.expando ] = undefined;
  5892 + }
  5893 + if ( elem[ dataUser.expando ] ) {
  5894 +
  5895 + // Support: Chrome <=35 - 45+
  5896 + // Assign undefined instead of using delete, see Data#remove
  5897 + elem[ dataUser.expando ] = undefined;
  5898 + }
  5899 + }
  5900 + }
  5901 + }
  5902 +} );
  5903 +
  5904 +jQuery.fn.extend( {
  5905 + detach: function( selector ) {
  5906 + return remove( this, selector, true );
  5907 + },
  5908 +
  5909 + remove: function( selector ) {
  5910 + return remove( this, selector );
  5911 + },
  5912 +
  5913 + text: function( value ) {
  5914 + return access( this, function( value ) {
  5915 + return value === undefined ?
  5916 + jQuery.text( this ) :
  5917 + this.empty().each( function() {
  5918 + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
  5919 + this.textContent = value;
  5920 + }
  5921 + } );
  5922 + }, null, value, arguments.length );
  5923 + },
  5924 +
  5925 + append: function() {
  5926 + return domManip( this, arguments, function( elem ) {
  5927 + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
  5928 + var target = manipulationTarget( this, elem );
  5929 + target.appendChild( elem );
  5930 + }
  5931 + } );
  5932 + },
  5933 +
  5934 + prepend: function() {
  5935 + return domManip( this, arguments, function( elem ) {
  5936 + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
  5937 + var target = manipulationTarget( this, elem );
  5938 + target.insertBefore( elem, target.firstChild );
  5939 + }
  5940 + } );
  5941 + },
  5942 +
  5943 + before: function() {
  5944 + return domManip( this, arguments, function( elem ) {
  5945 + if ( this.parentNode ) {
  5946 + this.parentNode.insertBefore( elem, this );
  5947 + }
  5948 + } );
  5949 + },
  5950 +
  5951 + after: function() {
  5952 + return domManip( this, arguments, function( elem ) {
  5953 + if ( this.parentNode ) {
  5954 + this.parentNode.insertBefore( elem, this.nextSibling );
  5955 + }
  5956 + } );
  5957 + },
  5958 +
  5959 + empty: function() {
  5960 + var elem,
  5961 + i = 0;
  5962 +
  5963 + for ( ; ( elem = this[ i ] ) != null; i++ ) {
  5964 + if ( elem.nodeType === 1 ) {
  5965 +
  5966 + // Prevent memory leaks
  5967 + jQuery.cleanData( getAll( elem, false ) );
  5968 +
  5969 + // Remove any remaining nodes
  5970 + elem.textContent = "";
  5971 + }
  5972 + }
  5973 +
  5974 + return this;
  5975 + },
  5976 +
  5977 + clone: function( dataAndEvents, deepDataAndEvents ) {
  5978 + dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
  5979 + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
  5980 +
  5981 + return this.map( function() {
  5982 + return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
  5983 + } );
  5984 + },
  5985 +
  5986 + html: function( value ) {
  5987 + return access( this, function( value ) {
  5988 + var elem = this[ 0 ] || {},
  5989 + i = 0,
  5990 + l = this.length;
  5991 +
  5992 + if ( value === undefined && elem.nodeType === 1 ) {
  5993 + return elem.innerHTML;
  5994 + }
  5995 +
  5996 + // See if we can take a shortcut and just use innerHTML
  5997 + if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
  5998 + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
  5999 +
  6000 + value = jQuery.htmlPrefilter( value );
  6001 +
  6002 + try {
  6003 + for ( ; i < l; i++ ) {
  6004 + elem = this[ i ] || {};
  6005 +
  6006 + // Remove element nodes and prevent memory leaks
  6007 + if ( elem.nodeType === 1 ) {
  6008 + jQuery.cleanData( getAll( elem, false ) );
  6009 + elem.innerHTML = value;
  6010 + }
  6011 + }
  6012 +
  6013 + elem = 0;
  6014 +
  6015 + // If using innerHTML throws an exception, use the fallback method
  6016 + } catch ( e ) {}
  6017 + }
  6018 +
  6019 + if ( elem ) {
  6020 + this.empty().append( value );
  6021 + }
  6022 + }, null, value, arguments.length );
  6023 + },
  6024 +
  6025 + replaceWith: function() {
  6026 + var ignored = [];
  6027 +
  6028 + // Make the changes, replacing each non-ignored context element with the new content
  6029 + return domManip( this, arguments, function( elem ) {
  6030 + var parent = this.parentNode;
  6031 +
  6032 + if ( jQuery.inArray( this, ignored ) < 0 ) {
  6033 + jQuery.cleanData( getAll( this ) );
  6034 + if ( parent ) {
  6035 + parent.replaceChild( elem, this );
  6036 + }
  6037 + }
  6038 +
  6039 + // Force callback invocation
  6040 + }, ignored );
  6041 + }
  6042 +} );
  6043 +
  6044 +jQuery.each( {
  6045 + appendTo: "append",
  6046 + prependTo: "prepend",
  6047 + insertBefore: "before",
  6048 + insertAfter: "after",
  6049 + replaceAll: "replaceWith"
  6050 +}, function( name, original ) {
  6051 + jQuery.fn[ name ] = function( selector ) {
  6052 + var elems,
  6053 + ret = [],
  6054 + insert = jQuery( selector ),
  6055 + last = insert.length - 1,
  6056 + i = 0;
  6057 +
  6058 + for ( ; i <= last; i++ ) {
  6059 + elems = i === last ? this : this.clone( true );
  6060 + jQuery( insert[ i ] )[ original ]( elems );
  6061 +
  6062 + // Support: Android <=4.0 only, PhantomJS 1 only
  6063 + // .get() because push.apply(_, arraylike) throws on ancient WebKit
  6064 + push.apply( ret, elems.get() );
  6065 + }
  6066 +
  6067 + return this.pushStack( ret );
  6068 + };
  6069 +} );
  6070 +var rmargin = ( /^margin/ );
  6071 +
  6072 +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
  6073 +
  6074 +var getStyles = function( elem ) {
  6075 +
  6076 + // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
  6077 + // IE throws on elements created in popups
  6078 + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
  6079 + var view = elem.ownerDocument.defaultView;
  6080 +
  6081 + if ( !view || !view.opener ) {
  6082 + view = window;
  6083 + }
  6084 +
  6085 + return view.getComputedStyle( elem );
  6086 + };
  6087 +
  6088 +
  6089 +
  6090 +( function() {
  6091 +
  6092 + // Executing both pixelPosition & boxSizingReliable tests require only one layout
  6093 + // so they're executed at the same time to save the second computation.
  6094 + function computeStyleTests() {
  6095 +
  6096 + // This is a singleton, we need to execute it only once
  6097 + if ( !div ) {
  6098 + return;
  6099 + }
  6100 +
  6101 + div.style.cssText =
  6102 + "box-sizing:border-box;" +
  6103 + "position:relative;display:block;" +
  6104 + "margin:auto;border:1px;padding:1px;" +
  6105 + "top:1%;width:50%";
  6106 + div.innerHTML = "";
  6107 + documentElement.appendChild( container );
  6108 +
  6109 + var divStyle = window.getComputedStyle( div );
  6110 + pixelPositionVal = divStyle.top !== "1%";
  6111 +
  6112 + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
  6113 + reliableMarginLeftVal = divStyle.marginLeft === "2px";
  6114 + boxSizingReliableVal = divStyle.width === "4px";
  6115 +
  6116 + // Support: Android 4.0 - 4.3 only
  6117 + // Some styles come back with percentage values, even though they shouldn't
  6118 + div.style.marginRight = "50%";
  6119 + pixelMarginRightVal = divStyle.marginRight === "4px";
  6120 +
  6121 + documentElement.removeChild( container );
  6122 +
  6123 + // Nullify the div so it wouldn't be stored in the memory and
  6124 + // it will also be a sign that checks already performed
  6125 + div = null;
  6126 + }
  6127 +
  6128 + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
  6129 + container = document.createElement( "div" ),
  6130 + div = document.createElement( "div" );
  6131 +
  6132 + // Finish early in limited (non-browser) environments
  6133 + if ( !div.style ) {
  6134 + return;
  6135 + }
  6136 +
  6137 + // Support: IE <=9 - 11 only
  6138 + // Style of cloned element affects source element cloned (#8908)
  6139 + div.style.backgroundClip = "content-box";
  6140 + div.cloneNode( true ).style.backgroundClip = "";
  6141 + support.clearCloneStyle = div.style.backgroundClip === "content-box";
  6142 +
  6143 + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
  6144 + "padding:0;margin-top:1px;position:absolute";
  6145 + container.appendChild( div );
  6146 +
  6147 + jQuery.extend( support, {
  6148 + pixelPosition: function() {
  6149 + computeStyleTests();
  6150 + return pixelPositionVal;
  6151 + },
  6152 + boxSizingReliable: function() {
  6153 + computeStyleTests();
  6154 + return boxSizingReliableVal;
  6155 + },
  6156 + pixelMarginRight: function() {
  6157 + computeStyleTests();
  6158 + return pixelMarginRightVal;
  6159 + },
  6160 + reliableMarginLeft: function() {
  6161 + computeStyleTests();
  6162 + return reliableMarginLeftVal;
  6163 + }
  6164 + } );
  6165 +} )();
  6166 +
  6167 +
  6168 +function curCSS( elem, name, computed ) {
  6169 + var width, minWidth, maxWidth, ret,
  6170 + style = elem.style;
  6171 +
  6172 + computed = computed || getStyles( elem );
  6173 +
  6174 + // getPropertyValue is needed for:
  6175 + // .css('filter') (IE 9 only, #12537)
  6176 + // .css('--customProperty) (#3144)
  6177 + if ( computed ) {
  6178 + ret = computed.getPropertyValue( name ) || computed[ name ];
  6179 +
  6180 + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
  6181 + ret = jQuery.style( elem, name );
  6182 + }
  6183 +
  6184 + // A tribute to the "awesome hack by Dean Edwards"
  6185 + // Android Browser returns percentage for some values,
  6186 + // but width seems to be reliably pixels.
  6187 + // This is against the CSSOM draft spec:
  6188 + // https://drafts.csswg.org/cssom/#resolved-values
  6189 + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
  6190 +
  6191 + // Remember the original values
  6192 + width = style.width;
  6193 + minWidth = style.minWidth;
  6194 + maxWidth = style.maxWidth;
  6195 +
  6196 + // Put in the new values to get a computed value out
  6197 + style.minWidth = style.maxWidth = style.width = ret;
  6198 + ret = computed.width;
  6199 +
  6200 + // Revert the changed values
  6201 + style.width = width;
  6202 + style.minWidth = minWidth;
  6203 + style.maxWidth = maxWidth;
  6204 + }
  6205 + }
  6206 +
  6207 + return ret !== undefined ?
  6208 +
  6209 + // Support: IE <=9 - 11 only
  6210 + // IE returns zIndex value as an integer.
  6211 + ret + "" :
  6212 + ret;
  6213 +}
  6214 +
  6215 +
  6216 +function addGetHookIf( conditionFn, hookFn ) {
  6217 +
  6218 + // Define the hook, we'll check on the first run if it's really needed.
  6219 + return {
  6220 + get: function() {
  6221 + if ( conditionFn() ) {
  6222 +
  6223 + // Hook not needed (or it's not possible to use it due
  6224 + // to missing dependency), remove it.
  6225 + delete this.get;
  6226 + return;
  6227 + }
  6228 +
  6229 + // Hook needed; redefine it so that the support test is not executed again.
  6230 + return ( this.get = hookFn ).apply( this, arguments );
  6231 + }
  6232 + };
  6233 +}
  6234 +
  6235 +
  6236 +var
  6237 +
  6238 + // Swappable if display is none or starts with table
  6239 + // except "table", "table-cell", or "table-caption"
  6240 + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
  6241 + rdisplayswap = /^(none|table(?!-c[ea]).+)/,
  6242 + rcustomProp = /^--/,
  6243 + cssShow = { position: "absolute", visibility: "hidden", display: "block" },
  6244 + cssNormalTransform = {
  6245 + letterSpacing: "0",
  6246 + fontWeight: "400"
  6247 + },
  6248 +
  6249 + cssPrefixes = [ "Webkit", "Moz", "ms" ],
  6250 + emptyStyle = document.createElement( "div" ).style;
  6251 +
  6252 +// Return a css property mapped to a potentially vendor prefixed property
  6253 +function vendorPropName( name ) {
  6254 +
  6255 + // Shortcut for names that are not vendor prefixed
  6256 + if ( name in emptyStyle ) {
  6257 + return name;
  6258 + }
  6259 +
  6260 + // Check for vendor prefixed names
  6261 + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
  6262 + i = cssPrefixes.length;
  6263 +
  6264 + while ( i-- ) {
  6265 + name = cssPrefixes[ i ] + capName;
  6266 + if ( name in emptyStyle ) {
  6267 + return name;
  6268 + }
  6269 + }
  6270 +}
  6271 +
  6272 +// Return a property mapped along what jQuery.cssProps suggests or to
  6273 +// a vendor prefixed property.
  6274 +function finalPropName( name ) {
  6275 + var ret = jQuery.cssProps[ name ];
  6276 + if ( !ret ) {
  6277 + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
  6278 + }
  6279 + return ret;
  6280 +}
  6281 +
  6282 +function setPositiveNumber( elem, value, subtract ) {
  6283 +
  6284 + // Any relative (+/-) values have already been
  6285 + // normalized at this point
  6286 + var matches = rcssNum.exec( value );
  6287 + return matches ?
  6288 +
  6289 + // Guard against undefined "subtract", e.g., when used as in cssHooks
  6290 + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
  6291 + value;
  6292 +}
  6293 +
  6294 +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  6295 + var i,
  6296 + val = 0;
  6297 +
  6298 + // If we already have the right measurement, avoid augmentation
  6299 + if ( extra === ( isBorderBox ? "border" : "content" ) ) {
  6300 + i = 4;
  6301 +
  6302 + // Otherwise initialize for horizontal or vertical properties
  6303 + } else {
  6304 + i = name === "width" ? 1 : 0;
  6305 + }
  6306 +
  6307 + for ( ; i < 4; i += 2 ) {
  6308 +
  6309 + // Both box models exclude margin, so add it if we want it
  6310 + if ( extra === "margin" ) {
  6311 + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
  6312 + }
  6313 +
  6314 + if ( isBorderBox ) {
  6315 +
  6316 + // border-box includes padding, so remove it if we want content
  6317 + if ( extra === "content" ) {
  6318 + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
  6319 + }
  6320 +
  6321 + // At this point, extra isn't border nor margin, so remove border
  6322 + if ( extra !== "margin" ) {
  6323 + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
  6324 + }
  6325 + } else {
  6326 +
  6327 + // At this point, extra isn't content, so add padding
  6328 + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
  6329 +
  6330 + // At this point, extra isn't content nor padding, so add border
  6331 + if ( extra !== "padding" ) {
  6332 + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
  6333 + }
  6334 + }
  6335 + }
  6336 +
  6337 + return val;
  6338 +}
  6339 +
  6340 +function getWidthOrHeight( elem, name, extra ) {
  6341 +
  6342 + // Start with computed style
  6343 + var valueIsBorderBox,
  6344 + styles = getStyles( elem ),
  6345 + val = curCSS( elem, name, styles ),
  6346 + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
  6347 +
  6348 + // Computed unit is not pixels. Stop here and return.
  6349 + if ( rnumnonpx.test( val ) ) {
  6350 + return val;
  6351 + }
  6352 +
  6353 + // Check for style in case a browser which returns unreliable values
  6354 + // for getComputedStyle silently falls back to the reliable elem.style
  6355 + valueIsBorderBox = isBorderBox &&
  6356 + ( support.boxSizingReliable() || val === elem.style[ name ] );
  6357 +
  6358 + // Normalize "", auto, and prepare for extra
  6359 + val = parseFloat( val ) || 0;
  6360 +
  6361 + // Use the active box-sizing model to add/subtract irrelevant styles
  6362 + return ( val +
  6363 + augmentWidthOrHeight(
  6364 + elem,
  6365 + name,
  6366 + extra || ( isBorderBox ? "border" : "content" ),
  6367 + valueIsBorderBox,
  6368 + styles
  6369 + )
  6370 + ) + "px";
  6371 +}
  6372 +
  6373 +jQuery.extend( {
  6374 +
  6375 + // Add in style property hooks for overriding the default
  6376 + // behavior of getting and setting a style property
  6377 + cssHooks: {
  6378 + opacity: {
  6379 + get: function( elem, computed ) {
  6380 + if ( computed ) {
  6381 +
  6382 + // We should always get a number back from opacity
  6383 + var ret = curCSS( elem, "opacity" );
  6384 + return ret === "" ? "1" : ret;
  6385 + }
  6386 + }
  6387 + }
  6388 + },
  6389 +
  6390 + // Don't automatically add "px" to these possibly-unitless properties
  6391 + cssNumber: {
  6392 + "animationIterationCount": true,
  6393 + "columnCount": true,
  6394 + "fillOpacity": true,
  6395 + "flexGrow": true,
  6396 + "flexShrink": true,
  6397 + "fontWeight": true,
  6398 + "lineHeight": true,
  6399 + "opacity": true,
  6400 + "order": true,
  6401 + "orphans": true,
  6402 + "widows": true,
  6403 + "zIndex": true,
  6404 + "zoom": true
  6405 + },
  6406 +
  6407 + // Add in properties whose names you wish to fix before
  6408 + // setting or getting the value
  6409 + cssProps: {
  6410 + "float": "cssFloat"
  6411 + },
  6412 +
  6413 + // Get and set the style property on a DOM Node
  6414 + style: function( elem, name, value, extra ) {
  6415 +
  6416 + // Don't set styles on text and comment nodes
  6417 + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
  6418 + return;
  6419 + }
  6420 +
  6421 + // Make sure that we're working with the right name
  6422 + var ret, type, hooks,
  6423 + origName = jQuery.camelCase( name ),
  6424 + isCustomProp = rcustomProp.test( name ),
  6425 + style = elem.style;
  6426 +
  6427 + // Make sure that we're working with the right name. We don't
  6428 + // want to query the value if it is a CSS custom property
  6429 + // since they are user-defined.
  6430 + if ( !isCustomProp ) {
  6431 + name = finalPropName( origName );
  6432 + }
  6433 +
  6434 + // Gets hook for the prefixed version, then unprefixed version
  6435 + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
  6436 +
  6437 + // Check if we're setting a value
  6438 + if ( value !== undefined ) {
  6439 + type = typeof value;
  6440 +
  6441 + // Convert "+=" or "-=" to relative numbers (#7345)
  6442 + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
  6443 + value = adjustCSS( elem, name, ret );
  6444 +
  6445 + // Fixes bug #9237
  6446 + type = "number";
  6447 + }
  6448 +
  6449 + // Make sure that null and NaN values aren't set (#7116)
  6450 + if ( value == null || value !== value ) {
  6451 + return;
  6452 + }
  6453 +
  6454 + // If a number was passed in, add the unit (except for certain CSS properties)
  6455 + if ( type === "number" ) {
  6456 + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
  6457 + }
  6458 +
  6459 + // background-* props affect original clone's values
  6460 + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
  6461 + style[ name ] = "inherit";
  6462 + }
  6463 +
  6464 + // If a hook was provided, use that value, otherwise just set the specified value
  6465 + if ( !hooks || !( "set" in hooks ) ||
  6466 + ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
  6467 +
  6468 + if ( isCustomProp ) {
  6469 + style.setProperty( name, value );
  6470 + } else {
  6471 + style[ name ] = value;
  6472 + }
  6473 + }
  6474 +
  6475 + } else {
  6476 +
  6477 + // If a hook was provided get the non-computed value from there
  6478 + if ( hooks && "get" in hooks &&
  6479 + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
  6480 +
  6481 + return ret;
  6482 + }
  6483 +
  6484 + // Otherwise just get the value from the style object
  6485 + return style[ name ];
  6486 + }
  6487 + },
  6488 +
  6489 + css: function( elem, name, extra, styles ) {
  6490 + var val, num, hooks,
  6491 + origName = jQuery.camelCase( name ),
  6492 + isCustomProp = rcustomProp.test( name );
  6493 +
  6494 + // Make sure that we're working with the right name. We don't
  6495 + // want to modify the value if it is a CSS custom property
  6496 + // since they are user-defined.
  6497 + if ( !isCustomProp ) {
  6498 + name = finalPropName( origName );
  6499 + }
  6500 +
  6501 + // Try prefixed name followed by the unprefixed name
  6502 + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
  6503 +
  6504 + // If a hook was provided get the computed value from there
  6505 + if ( hooks && "get" in hooks ) {
  6506 + val = hooks.get( elem, true, extra );
  6507 + }
  6508 +
  6509 + // Otherwise, if a way to get the computed value exists, use that
  6510 + if ( val === undefined ) {
  6511 + val = curCSS( elem, name, styles );
  6512 + }
  6513 +
  6514 + // Convert "normal" to computed value
  6515 + if ( val === "normal" && name in cssNormalTransform ) {
  6516 + val = cssNormalTransform[ name ];
  6517 + }
  6518 +
  6519 + // Make numeric if forced or a qualifier was provided and val looks numeric
  6520 + if ( extra === "" || extra ) {
  6521 + num = parseFloat( val );
  6522 + return extra === true || isFinite( num ) ? num || 0 : val;
  6523 + }
  6524 +
  6525 + return val;
  6526 + }
  6527 +} );
  6528 +
  6529 +jQuery.each( [ "height", "width" ], function( i, name ) {
  6530 + jQuery.cssHooks[ name ] = {
  6531 + get: function( elem, computed, extra ) {
  6532 + if ( computed ) {
  6533 +
  6534 + // Certain elements can have dimension info if we invisibly show them
  6535 + // but it must have a current display style that would benefit
  6536 + return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
  6537 +
  6538 + // Support: Safari 8+
  6539 + // Table columns in Safari have non-zero offsetWidth & zero
  6540 + // getBoundingClientRect().width unless display is changed.
  6541 + // Support: IE <=11 only
  6542 + // Running getBoundingClientRect on a disconnected node
  6543 + // in IE throws an error.
  6544 + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
  6545 + swap( elem, cssShow, function() {
  6546 + return getWidthOrHeight( elem, name, extra );
  6547 + } ) :
  6548 + getWidthOrHeight( elem, name, extra );
  6549 + }
  6550 + },
  6551 +
  6552 + set: function( elem, value, extra ) {
  6553 + var matches,
  6554 + styles = extra && getStyles( elem ),
  6555 + subtract = extra && augmentWidthOrHeight(
  6556 + elem,
  6557 + name,
  6558 + extra,
  6559 + jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
  6560 + styles
  6561 + );
  6562 +
  6563 + // Convert to pixels if value adjustment is needed
  6564 + if ( subtract && ( matches = rcssNum.exec( value ) ) &&
  6565 + ( matches[ 3 ] || "px" ) !== "px" ) {
  6566 +
  6567 + elem.style[ name ] = value;
  6568 + value = jQuery.css( elem, name );
  6569 + }
  6570 +
  6571 + return setPositiveNumber( elem, value, subtract );
  6572 + }
  6573 + };
  6574 +} );
  6575 +
  6576 +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
  6577 + function( elem, computed ) {
  6578 + if ( computed ) {
  6579 + return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
  6580 + elem.getBoundingClientRect().left -
  6581 + swap( elem, { marginLeft: 0 }, function() {
  6582 + return elem.getBoundingClientRect().left;
  6583 + } )
  6584 + ) + "px";
  6585 + }
  6586 + }
  6587 +);
  6588 +
  6589 +// These hooks are used by animate to expand properties
  6590 +jQuery.each( {
  6591 + margin: "",
  6592 + padding: "",
  6593 + border: "Width"
  6594 +}, function( prefix, suffix ) {
  6595 + jQuery.cssHooks[ prefix + suffix ] = {
  6596 + expand: function( value ) {
  6597 + var i = 0,
  6598 + expanded = {},
  6599 +
  6600 + // Assumes a single number if not a string
  6601 + parts = typeof value === "string" ? value.split( " " ) : [ value ];
  6602 +
  6603 + for ( ; i < 4; i++ ) {
  6604 + expanded[ prefix + cssExpand[ i ] + suffix ] =
  6605 + parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
  6606 + }
  6607 +
  6608 + return expanded;
  6609 + }
  6610 + };
  6611 +
  6612 + if ( !rmargin.test( prefix ) ) {
  6613 + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
  6614 + }
  6615 +} );
  6616 +
  6617 +jQuery.fn.extend( {
  6618 + css: function( name, value ) {
  6619 + return access( this, function( elem, name, value ) {
  6620 + var styles, len,
  6621 + map = {},
  6622 + i = 0;
  6623 +
  6624 + if ( Array.isArray( name ) ) {
  6625 + styles = getStyles( elem );
  6626 + len = name.length;
  6627 +
  6628 + for ( ; i < len; i++ ) {
  6629 + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
  6630 + }
  6631 +
  6632 + return map;
  6633 + }
  6634 +
  6635 + return value !== undefined ?
  6636 + jQuery.style( elem, name, value ) :
  6637 + jQuery.css( elem, name );
  6638 + }, name, value, arguments.length > 1 );
  6639 + }
  6640 +} );
  6641 +
  6642 +
  6643 +function Tween( elem, options, prop, end, easing ) {
  6644 + return new Tween.prototype.init( elem, options, prop, end, easing );
  6645 +}
  6646 +jQuery.Tween = Tween;
  6647 +
  6648 +Tween.prototype = {
  6649 + constructor: Tween,
  6650 + init: function( elem, options, prop, end, easing, unit ) {
  6651 + this.elem = elem;
  6652 + this.prop = prop;
  6653 + this.easing = easing || jQuery.easing._default;
  6654 + this.options = options;
  6655 + this.start = this.now = this.cur();
  6656 + this.end = end;
  6657 + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
  6658 + },
  6659 + cur: function() {
  6660 + var hooks = Tween.propHooks[ this.prop ];
  6661 +
  6662 + return hooks && hooks.get ?
  6663 + hooks.get( this ) :
  6664 + Tween.propHooks._default.get( this );
  6665 + },
  6666 + run: function( percent ) {
  6667 + var eased,
  6668 + hooks = Tween.propHooks[ this.prop ];
  6669 +
  6670 + if ( this.options.duration ) {
  6671 + this.pos = eased = jQuery.easing[ this.easing ](
  6672 + percent, this.options.duration * percent, 0, 1, this.options.duration
  6673 + );
  6674 + } else {
  6675 + this.pos = eased = percent;
  6676 + }
  6677 + this.now = ( this.end - this.start ) * eased + this.start;
  6678 +
  6679 + if ( this.options.step ) {
  6680 + this.options.step.call( this.elem, this.now, this );
  6681 + }
  6682 +
  6683 + if ( hooks && hooks.set ) {
  6684 + hooks.set( this );
  6685 + } else {
  6686 + Tween.propHooks._default.set( this );
  6687 + }
  6688 + return this;
  6689 + }
  6690 +};
  6691 +
  6692 +Tween.prototype.init.prototype = Tween.prototype;
  6693 +
  6694 +Tween.propHooks = {
  6695 + _default: {
  6696 + get: function( tween ) {
  6697 + var result;
  6698 +
  6699 + // Use a property on the element directly when it is not a DOM element,
  6700 + // or when there is no matching style property that exists.
  6701 + if ( tween.elem.nodeType !== 1 ||
  6702 + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
  6703 + return tween.elem[ tween.prop ];
  6704 + }
  6705 +
  6706 + // Passing an empty string as a 3rd parameter to .css will automatically
  6707 + // attempt a parseFloat and fallback to a string if the parse fails.
  6708 + // Simple values such as "10px" are parsed to Float;
  6709 + // complex values such as "rotate(1rad)" are returned as-is.
  6710 + result = jQuery.css( tween.elem, tween.prop, "" );
  6711 +
  6712 + // Empty strings, null, undefined and "auto" are converted to 0.
  6713 + return !result || result === "auto" ? 0 : result;
  6714 + },
  6715 + set: function( tween ) {
  6716 +
  6717 + // Use step hook for back compat.
  6718 + // Use cssHook if its there.
  6719 + // Use .style if available and use plain properties where available.
  6720 + if ( jQuery.fx.step[ tween.prop ] ) {
  6721 + jQuery.fx.step[ tween.prop ]( tween );
  6722 + } else if ( tween.elem.nodeType === 1 &&
  6723 + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
  6724 + jQuery.cssHooks[ tween.prop ] ) ) {
  6725 + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
  6726 + } else {
  6727 + tween.elem[ tween.prop ] = tween.now;
  6728 + }
  6729 + }
  6730 + }
  6731 +};
  6732 +
  6733 +// Support: IE <=9 only
  6734 +// Panic based approach to setting things on disconnected nodes
  6735 +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
  6736 + set: function( tween ) {
  6737 + if ( tween.elem.nodeType && tween.elem.parentNode ) {
  6738 + tween.elem[ tween.prop ] = tween.now;
  6739 + }
  6740 + }
  6741 +};
  6742 +
  6743 +jQuery.easing = {
  6744 + linear: function( p ) {
  6745 + return p;
  6746 + },
  6747 + swing: function( p ) {
  6748 + return 0.5 - Math.cos( p * Math.PI ) / 2;
  6749 + },
  6750 + _default: "swing"
  6751 +};
  6752 +
  6753 +jQuery.fx = Tween.prototype.init;
  6754 +
  6755 +// Back compat <1.8 extension point
  6756 +jQuery.fx.step = {};
  6757 +
  6758 +
  6759 +
  6760 +
  6761 +var
  6762 + fxNow, inProgress,
  6763 + rfxtypes = /^(?:toggle|show|hide)$/,
  6764 + rrun = /queueHooks$/;
  6765 +
  6766 +function schedule() {
  6767 + if ( inProgress ) {
  6768 + if ( document.hidden === false && window.requestAnimationFrame ) {
  6769 + window.requestAnimationFrame( schedule );
  6770 + } else {
  6771 + window.setTimeout( schedule, jQuery.fx.interval );
  6772 + }
  6773 +
  6774 + jQuery.fx.tick();
  6775 + }
  6776 +}
  6777 +
  6778 +// Animations created synchronously will run synchronously
  6779 +function createFxNow() {
  6780 + window.setTimeout( function() {
  6781 + fxNow = undefined;
  6782 + } );
  6783 + return ( fxNow = jQuery.now() );
  6784 +}
  6785 +
  6786 +// Generate parameters to create a standard animation
  6787 +function genFx( type, includeWidth ) {
  6788 + var which,
  6789 + i = 0,
  6790 + attrs = { height: type };
  6791 +
  6792 + // If we include width, step value is 1 to do all cssExpand values,
  6793 + // otherwise step value is 2 to skip over Left and Right
  6794 + includeWidth = includeWidth ? 1 : 0;
  6795 + for ( ; i < 4; i += 2 - includeWidth ) {
  6796 + which = cssExpand[ i ];
  6797 + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
  6798 + }
  6799 +
  6800 + if ( includeWidth ) {
  6801 + attrs.opacity = attrs.width = type;
  6802 + }
  6803 +
  6804 + return attrs;
  6805 +}
  6806 +
  6807 +function createTween( value, prop, animation ) {
  6808 + var tween,
  6809 + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
  6810 + index = 0,
  6811 + length = collection.length;
  6812 + for ( ; index < length; index++ ) {
  6813 + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
  6814 +
  6815 + // We're done with this property
  6816 + return tween;
  6817 + }
  6818 + }
  6819 +}
  6820 +
  6821 +function defaultPrefilter( elem, props, opts ) {
  6822 + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
  6823 + isBox = "width" in props || "height" in props,
  6824 + anim = this,
  6825 + orig = {},
  6826 + style = elem.style,
  6827 + hidden = elem.nodeType && isHiddenWithinTree( elem ),
  6828 + dataShow = dataPriv.get( elem, "fxshow" );
  6829 +
  6830 + // Queue-skipping animations hijack the fx hooks
  6831 + if ( !opts.queue ) {
  6832 + hooks = jQuery._queueHooks( elem, "fx" );
  6833 + if ( hooks.unqueued == null ) {
  6834 + hooks.unqueued = 0;
  6835 + oldfire = hooks.empty.fire;
  6836 + hooks.empty.fire = function() {
  6837 + if ( !hooks.unqueued ) {
  6838 + oldfire();
  6839 + }
  6840 + };
  6841 + }
  6842 + hooks.unqueued++;
  6843 +
  6844 + anim.always( function() {
  6845 +
  6846 + // Ensure the complete handler is called before this completes
  6847 + anim.always( function() {
  6848 + hooks.unqueued--;
  6849 + if ( !jQuery.queue( elem, "fx" ).length ) {
  6850 + hooks.empty.fire();
  6851 + }
  6852 + } );
  6853 + } );
  6854 + }
  6855 +
  6856 + // Detect show/hide animations
  6857 + for ( prop in props ) {
  6858 + value = props[ prop ];
  6859 + if ( rfxtypes.test( value ) ) {
  6860 + delete props[ prop ];
  6861 + toggle = toggle || value === "toggle";
  6862 + if ( value === ( hidden ? "hide" : "show" ) ) {
  6863 +
  6864 + // Pretend to be hidden if this is a "show" and
  6865 + // there is still data from a stopped show/hide
  6866 + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
  6867 + hidden = true;
  6868 +
  6869 + // Ignore all other no-op show/hide data
  6870 + } else {
  6871 + continue;
  6872 + }
  6873 + }
  6874 + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
  6875 + }
  6876 + }
  6877 +
  6878 + // Bail out if this is a no-op like .hide().hide()
  6879 + propTween = !jQuery.isEmptyObject( props );
  6880 + if ( !propTween && jQuery.isEmptyObject( orig ) ) {
  6881 + return;
  6882 + }
  6883 +
  6884 + // Restrict "overflow" and "display" styles during box animations
  6885 + if ( isBox && elem.nodeType === 1 ) {
  6886 +
  6887 + // Support: IE <=9 - 11, Edge 12 - 13
  6888 + // Record all 3 overflow attributes because IE does not infer the shorthand
  6889 + // from identically-valued overflowX and overflowY
  6890 + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
  6891 +
  6892 + // Identify a display type, preferring old show/hide data over the CSS cascade
  6893 + restoreDisplay = dataShow && dataShow.display;
  6894 + if ( restoreDisplay == null ) {
  6895 + restoreDisplay = dataPriv.get( elem, "display" );
  6896 + }
  6897 + display = jQuery.css( elem, "display" );
  6898 + if ( display === "none" ) {
  6899 + if ( restoreDisplay ) {
  6900 + display = restoreDisplay;
  6901 + } else {
  6902 +
  6903 + // Get nonempty value(s) by temporarily forcing visibility
  6904 + showHide( [ elem ], true );
  6905 + restoreDisplay = elem.style.display || restoreDisplay;
  6906 + display = jQuery.css( elem, "display" );
  6907 + showHide( [ elem ] );
  6908 + }
  6909 + }
  6910 +
  6911 + // Animate inline elements as inline-block
  6912 + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
  6913 + if ( jQuery.css( elem, "float" ) === "none" ) {
  6914 +
  6915 + // Restore the original display value at the end of pure show/hide animations
  6916 + if ( !propTween ) {
  6917 + anim.done( function() {
  6918 + style.display = restoreDisplay;
  6919 + } );
  6920 + if ( restoreDisplay == null ) {
  6921 + display = style.display;
  6922 + restoreDisplay = display === "none" ? "" : display;
  6923 + }
  6924 + }
  6925 + style.display = "inline-block";
  6926 + }
  6927 + }
  6928 + }
  6929 +
  6930 + if ( opts.overflow ) {
  6931 + style.overflow = "hidden";
  6932 + anim.always( function() {
  6933 + style.overflow = opts.overflow[ 0 ];
  6934 + style.overflowX = opts.overflow[ 1 ];
  6935 + style.overflowY = opts.overflow[ 2 ];
  6936 + } );
  6937 + }
  6938 +
  6939 + // Implement show/hide animations
  6940 + propTween = false;
  6941 + for ( prop in orig ) {
  6942 +
  6943 + // General show/hide setup for this element animation
  6944 + if ( !propTween ) {
  6945 + if ( dataShow ) {
  6946 + if ( "hidden" in dataShow ) {
  6947 + hidden = dataShow.hidden;
  6948 + }
  6949 + } else {
  6950 + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
  6951 + }
  6952 +
  6953 + // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
  6954 + if ( toggle ) {
  6955 + dataShow.hidden = !hidden;
  6956 + }
  6957 +
  6958 + // Show elements before animating them
  6959 + if ( hidden ) {
  6960 + showHide( [ elem ], true );
  6961 + }
  6962 +
  6963 + /* eslint-disable no-loop-func */
  6964 +
  6965 + anim.done( function() {
  6966 +
  6967 + /* eslint-enable no-loop-func */
  6968 +
  6969 + // The final step of a "hide" animation is actually hiding the element
  6970 + if ( !hidden ) {
  6971 + showHide( [ elem ] );
  6972 + }
  6973 + dataPriv.remove( elem, "fxshow" );
  6974 + for ( prop in orig ) {
  6975 + jQuery.style( elem, prop, orig[ prop ] );
  6976 + }
  6977 + } );
  6978 + }
  6979 +
  6980 + // Per-property setup
  6981 + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
  6982 + if ( !( prop in dataShow ) ) {
  6983 + dataShow[ prop ] = propTween.start;
  6984 + if ( hidden ) {
  6985 + propTween.end = propTween.start;
  6986 + propTween.start = 0;
  6987 + }
  6988 + }
  6989 + }
  6990 +}
  6991 +
  6992 +function propFilter( props, specialEasing ) {
  6993 + var index, name, easing, value, hooks;
  6994 +
  6995 + // camelCase, specialEasing and expand cssHook pass
  6996 + for ( index in props ) {
  6997 + name = jQuery.camelCase( index );
  6998 + easing = specialEasing[ name ];
  6999 + value = props[ index ];
  7000 + if ( Array.isArray( value ) ) {
  7001 + easing = value[ 1 ];
  7002 + value = props[ index ] = value[ 0 ];
  7003 + }
  7004 +
  7005 + if ( index !== name ) {
  7006 + props[ name ] = value;
  7007 + delete props[ index ];
  7008 + }
  7009 +
  7010 + hooks = jQuery.cssHooks[ name ];
  7011 + if ( hooks && "expand" in hooks ) {
  7012 + value = hooks.expand( value );
  7013 + delete props[ name ];
  7014 +
  7015 + // Not quite $.extend, this won't overwrite existing keys.
  7016 + // Reusing 'index' because we have the correct "name"
  7017 + for ( index in value ) {
  7018 + if ( !( index in props ) ) {
  7019 + props[ index ] = value[ index ];
  7020 + specialEasing[ index ] = easing;
  7021 + }
  7022 + }
  7023 + } else {
  7024 + specialEasing[ name ] = easing;
  7025 + }
  7026 + }
  7027 +}
  7028 +
  7029 +function Animation( elem, properties, options ) {
  7030 + var result,
  7031 + stopped,
  7032 + index = 0,
  7033 + length = Animation.prefilters.length,
  7034 + deferred = jQuery.Deferred().always( function() {
  7035 +
  7036 + // Don't match elem in the :animated selector
  7037 + delete tick.elem;
  7038 + } ),
  7039 + tick = function() {
  7040 + if ( stopped ) {
  7041 + return false;
  7042 + }
  7043 + var currentTime = fxNow || createFxNow(),
  7044 + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
  7045 +
  7046 + // Support: Android 2.3 only
  7047 + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
  7048 + temp = remaining / animation.duration || 0,
  7049 + percent = 1 - temp,
  7050 + index = 0,
  7051 + length = animation.tweens.length;
  7052 +
  7053 + for ( ; index < length; index++ ) {
  7054 + animation.tweens[ index ].run( percent );
  7055 + }
  7056 +
  7057 + deferred.notifyWith( elem, [ animation, percent, remaining ] );
  7058 +
  7059 + // If there's more to do, yield
  7060 + if ( percent < 1 && length ) {
  7061 + return remaining;
  7062 + }
  7063 +
  7064 + // If this was an empty animation, synthesize a final progress notification
  7065 + if ( !length ) {
  7066 + deferred.notifyWith( elem, [ animation, 1, 0 ] );
  7067 + }
  7068 +
  7069 + // Resolve the animation and report its conclusion
  7070 + deferred.resolveWith( elem, [ animation ] );
  7071 + return false;
  7072 + },
  7073 + animation = deferred.promise( {
  7074 + elem: elem,
  7075 + props: jQuery.extend( {}, properties ),
  7076 + opts: jQuery.extend( true, {
  7077 + specialEasing: {},
  7078 + easing: jQuery.easing._default
  7079 + }, options ),
  7080 + originalProperties: properties,
  7081 + originalOptions: options,
  7082 + startTime: fxNow || createFxNow(),
  7083 + duration: options.duration,
  7084 + tweens: [],
  7085 + createTween: function( prop, end ) {
  7086 + var tween = jQuery.Tween( elem, animation.opts, prop, end,
  7087 + animation.opts.specialEasing[ prop ] || animation.opts.easing );
  7088 + animation.tweens.push( tween );
  7089 + return tween;
  7090 + },
  7091 + stop: function( gotoEnd ) {
  7092 + var index = 0,
  7093 +
  7094 + // If we are going to the end, we want to run all the tweens
  7095 + // otherwise we skip this part
  7096 + length = gotoEnd ? animation.tweens.length : 0;
  7097 + if ( stopped ) {
  7098 + return this;
  7099 + }
  7100 + stopped = true;
  7101 + for ( ; index < length; index++ ) {
  7102 + animation.tweens[ index ].run( 1 );
  7103 + }
  7104 +
  7105 + // Resolve when we played the last frame; otherwise, reject
  7106 + if ( gotoEnd ) {
  7107 + deferred.notifyWith( elem, [ animation, 1, 0 ] );
  7108 + deferred.resolveWith( elem, [ animation, gotoEnd ] );
  7109 + } else {
  7110 + deferred.rejectWith( elem, [ animation, gotoEnd ] );
  7111 + }
  7112 + return this;
  7113 + }
  7114 + } ),
  7115 + props = animation.props;
  7116 +
  7117 + propFilter( props, animation.opts.specialEasing );
  7118 +
  7119 + for ( ; index < length; index++ ) {
  7120 + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
  7121 + if ( result ) {
  7122 + if ( jQuery.isFunction( result.stop ) ) {
  7123 + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
  7124 + jQuery.proxy( result.stop, result );
  7125 + }
  7126 + return result;
  7127 + }
  7128 + }
  7129 +
  7130 + jQuery.map( props, createTween, animation );
  7131 +
  7132 + if ( jQuery.isFunction( animation.opts.start ) ) {
  7133 + animation.opts.start.call( elem, animation );
  7134 + }
  7135 +
  7136 + // Attach callbacks from options
  7137 + animation
  7138 + .progress( animation.opts.progress )
  7139 + .done( animation.opts.done, animation.opts.complete )
  7140 + .fail( animation.opts.fail )
  7141 + .always( animation.opts.always );
  7142 +
  7143 + jQuery.fx.timer(
  7144 + jQuery.extend( tick, {
  7145 + elem: elem,
  7146 + anim: animation,
  7147 + queue: animation.opts.queue
  7148 + } )
  7149 + );
  7150 +
  7151 + return animation;
  7152 +}
  7153 +
  7154 +jQuery.Animation = jQuery.extend( Animation, {
  7155 +
  7156 + tweeners: {
  7157 + "*": [ function( prop, value ) {
  7158 + var tween = this.createTween( prop, value );
  7159 + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
  7160 + return tween;
  7161 + } ]
  7162 + },
  7163 +
  7164 + tweener: function( props, callback ) {
  7165 + if ( jQuery.isFunction( props ) ) {
  7166 + callback = props;
  7167 + props = [ "*" ];
  7168 + } else {
  7169 + props = props.match( rnothtmlwhite );
  7170 + }
  7171 +
  7172 + var prop,
  7173 + index = 0,
  7174 + length = props.length;
  7175 +
  7176 + for ( ; index < length; index++ ) {
  7177 + prop = props[ index ];
  7178 + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
  7179 + Animation.tweeners[ prop ].unshift( callback );
  7180 + }
  7181 + },
  7182 +
  7183 + prefilters: [ defaultPrefilter ],
  7184 +
  7185 + prefilter: function( callback, prepend ) {
  7186 + if ( prepend ) {
  7187 + Animation.prefilters.unshift( callback );
  7188 + } else {
  7189 + Animation.prefilters.push( callback );
  7190 + }
  7191 + }
  7192 +} );
  7193 +
  7194 +jQuery.speed = function( speed, easing, fn ) {
  7195 + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
  7196 + complete: fn || !fn && easing ||
  7197 + jQuery.isFunction( speed ) && speed,
  7198 + duration: speed,
  7199 + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
  7200 + };
  7201 +
  7202 + // Go to the end state if fx are off
  7203 + if ( jQuery.fx.off ) {
  7204 + opt.duration = 0;
  7205 +
  7206 + } else {
  7207 + if ( typeof opt.duration !== "number" ) {
  7208 + if ( opt.duration in jQuery.fx.speeds ) {
  7209 + opt.duration = jQuery.fx.speeds[ opt.duration ];
  7210 +
  7211 + } else {
  7212 + opt.duration = jQuery.fx.speeds._default;
  7213 + }
  7214 + }
  7215 + }
  7216 +
  7217 + // Normalize opt.queue - true/undefined/null -> "fx"
  7218 + if ( opt.queue == null || opt.queue === true ) {
  7219 + opt.queue = "fx";
  7220 + }
  7221 +
  7222 + // Queueing
  7223 + opt.old = opt.complete;
  7224 +
  7225 + opt.complete = function() {
  7226 + if ( jQuery.isFunction( opt.old ) ) {
  7227 + opt.old.call( this );
  7228 + }
  7229 +
  7230 + if ( opt.queue ) {
  7231 + jQuery.dequeue( this, opt.queue );
  7232 + }
  7233 + };
  7234 +
  7235 + return opt;
  7236 +};
  7237 +
  7238 +jQuery.fn.extend( {
  7239 + fadeTo: function( speed, to, easing, callback ) {
  7240 +
  7241 + // Show any hidden elements after setting opacity to 0
  7242 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
  7243 +
  7244 + // Animate to the value specified
  7245 + .end().animate( { opacity: to }, speed, easing, callback );
  7246 + },
  7247 + animate: function( prop, speed, easing, callback ) {
  7248 + var empty = jQuery.isEmptyObject( prop ),
  7249 + optall = jQuery.speed( speed, easing, callback ),
  7250 + doAnimation = function() {
  7251 +
  7252 + // Operate on a copy of prop so per-property easing won't be lost
  7253 + var anim = Animation( this, jQuery.extend( {}, prop ), optall );
  7254 +
  7255 + // Empty animations, or finishing resolves immediately
  7256 + if ( empty || dataPriv.get( this, "finish" ) ) {
  7257 + anim.stop( true );
  7258 + }
  7259 + };
  7260 + doAnimation.finish = doAnimation;
  7261 +
  7262 + return empty || optall.queue === false ?
  7263 + this.each( doAnimation ) :
  7264 + this.queue( optall.queue, doAnimation );
  7265 + },
  7266 + stop: function( type, clearQueue, gotoEnd ) {
  7267 + var stopQueue = function( hooks ) {
  7268 + var stop = hooks.stop;
  7269 + delete hooks.stop;
  7270 + stop( gotoEnd );
  7271 + };
  7272 +
  7273 + if ( typeof type !== "string" ) {
  7274 + gotoEnd = clearQueue;
  7275 + clearQueue = type;
  7276 + type = undefined;
  7277 + }
  7278 + if ( clearQueue && type !== false ) {
  7279 + this.queue( type || "fx", [] );
  7280 + }
  7281 +
  7282 + return this.each( function() {
  7283 + var dequeue = true,
  7284 + index = type != null && type + "queueHooks",
  7285 + timers = jQuery.timers,
  7286 + data = dataPriv.get( this );
  7287 +
  7288 + if ( index ) {
  7289 + if ( data[ index ] && data[ index ].stop ) {
  7290 + stopQueue( data[ index ] );
  7291 + }
  7292 + } else {
  7293 + for ( index in data ) {
  7294 + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
  7295 + stopQueue( data[ index ] );
  7296 + }
  7297 + }
  7298 + }
  7299 +
  7300 + for ( index = timers.length; index--; ) {
  7301 + if ( timers[ index ].elem === this &&
  7302 + ( type == null || timers[ index ].queue === type ) ) {
  7303 +
  7304 + timers[ index ].anim.stop( gotoEnd );
  7305 + dequeue = false;
  7306 + timers.splice( index, 1 );
  7307 + }
  7308 + }
  7309 +
  7310 + // Start the next in the queue if the last step wasn't forced.
  7311 + // Timers currently will call their complete callbacks, which
  7312 + // will dequeue but only if they were gotoEnd.
  7313 + if ( dequeue || !gotoEnd ) {
  7314 + jQuery.dequeue( this, type );
  7315 + }
  7316 + } );
  7317 + },
  7318 + finish: function( type ) {
  7319 + if ( type !== false ) {
  7320 + type = type || "fx";
  7321 + }
  7322 + return this.each( function() {
  7323 + var index,
  7324 + data = dataPriv.get( this ),
  7325 + queue = data[ type + "queue" ],
  7326 + hooks = data[ type + "queueHooks" ],
  7327 + timers = jQuery.timers,
  7328 + length = queue ? queue.length : 0;
  7329 +
  7330 + // Enable finishing flag on private data
  7331 + data.finish = true;
  7332 +
  7333 + // Empty the queue first
  7334 + jQuery.queue( this, type, [] );
  7335 +
  7336 + if ( hooks && hooks.stop ) {
  7337 + hooks.stop.call( this, true );
  7338 + }
  7339 +
  7340 + // Look for any active animations, and finish them
  7341 + for ( index = timers.length; index--; ) {
  7342 + if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
  7343 + timers[ index ].anim.stop( true );
  7344 + timers.splice( index, 1 );
  7345 + }
  7346 + }
  7347 +
  7348 + // Look for any animations in the old queue and finish them
  7349 + for ( index = 0; index < length; index++ ) {
  7350 + if ( queue[ index ] && queue[ index ].finish ) {
  7351 + queue[ index ].finish.call( this );
  7352 + }
  7353 + }
  7354 +
  7355 + // Turn off finishing flag
  7356 + delete data.finish;
  7357 + } );
  7358 + }
  7359 +} );
  7360 +
  7361 +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
  7362 + var cssFn = jQuery.fn[ name ];
  7363 + jQuery.fn[ name ] = function( speed, easing, callback ) {
  7364 + return speed == null || typeof speed === "boolean" ?
  7365 + cssFn.apply( this, arguments ) :
  7366 + this.animate( genFx( name, true ), speed, easing, callback );
  7367 + };
  7368 +} );
  7369 +
  7370 +// Generate shortcuts for custom animations
  7371 +jQuery.each( {
  7372 + slideDown: genFx( "show" ),
  7373 + slideUp: genFx( "hide" ),
  7374 + slideToggle: genFx( "toggle" ),
  7375 + fadeIn: { opacity: "show" },
  7376 + fadeOut: { opacity: "hide" },
  7377 + fadeToggle: { opacity: "toggle" }
  7378 +}, function( name, props ) {
  7379 + jQuery.fn[ name ] = function( speed, easing, callback ) {
  7380 + return this.animate( props, speed, easing, callback );
  7381 + };
  7382 +} );
  7383 +
  7384 +jQuery.timers = [];
  7385 +jQuery.fx.tick = function() {
  7386 + var timer,
  7387 + i = 0,
  7388 + timers = jQuery.timers;
  7389 +
  7390 + fxNow = jQuery.now();
  7391 +
  7392 + for ( ; i < timers.length; i++ ) {
  7393 + timer = timers[ i ];
  7394 +
  7395 + // Run the timer and safely remove it when done (allowing for external removal)
  7396 + if ( !timer() && timers[ i ] === timer ) {
  7397 + timers.splice( i--, 1 );
  7398 + }
  7399 + }
  7400 +
  7401 + if ( !timers.length ) {
  7402 + jQuery.fx.stop();
  7403 + }
  7404 + fxNow = undefined;
  7405 +};
  7406 +
  7407 +jQuery.fx.timer = function( timer ) {
  7408 + jQuery.timers.push( timer );
  7409 + jQuery.fx.start();
  7410 +};
  7411 +
  7412 +jQuery.fx.interval = 13;
  7413 +jQuery.fx.start = function() {
  7414 + if ( inProgress ) {
  7415 + return;
  7416 + }
  7417 +
  7418 + inProgress = true;
  7419 + schedule();
  7420 +};
  7421 +
  7422 +jQuery.fx.stop = function() {
  7423 + inProgress = null;
  7424 +};
  7425 +
  7426 +jQuery.fx.speeds = {
  7427 + slow: 600,
  7428 + fast: 200,
  7429 +
  7430 + // Default speed
  7431 + _default: 400
  7432 +};
  7433 +
  7434 +
  7435 +// Based off of the plugin by Clint Helfers, with permission.
  7436 +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
  7437 +jQuery.fn.delay = function( time, type ) {
  7438 + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
  7439 + type = type || "fx";
  7440 +
  7441 + return this.queue( type, function( next, hooks ) {
  7442 + var timeout = window.setTimeout( next, time );
  7443 + hooks.stop = function() {
  7444 + window.clearTimeout( timeout );
  7445 + };
  7446 + } );
  7447 +};
  7448 +
  7449 +
  7450 +( function() {
  7451 + var input = document.createElement( "input" ),
  7452 + select = document.createElement( "select" ),
  7453 + opt = select.appendChild( document.createElement( "option" ) );
  7454 +
  7455 + input.type = "checkbox";
  7456 +
  7457 + // Support: Android <=4.3 only
  7458 + // Default value for a checkbox should be "on"
  7459 + support.checkOn = input.value !== "";
  7460 +
  7461 + // Support: IE <=11 only
  7462 + // Must access selectedIndex to make default options select
  7463 + support.optSelected = opt.selected;
  7464 +
  7465 + // Support: IE <=11 only
  7466 + // An input loses its value after becoming a radio
  7467 + input = document.createElement( "input" );
  7468 + input.value = "t";
  7469 + input.type = "radio";
  7470 + support.radioValue = input.value === "t";
  7471 +} )();
  7472 +
  7473 +
  7474 +var boolHook,
  7475 + attrHandle = jQuery.expr.attrHandle;
  7476 +
  7477 +jQuery.fn.extend( {
  7478 + attr: function( name, value ) {
  7479 + return access( this, jQuery.attr, name, value, arguments.length > 1 );
  7480 + },
  7481 +
  7482 + removeAttr: function( name ) {
  7483 + return this.each( function() {
  7484 + jQuery.removeAttr( this, name );
  7485 + } );
  7486 + }
  7487 +} );
  7488 +
  7489 +jQuery.extend( {
  7490 + attr: function( elem, name, value ) {
  7491 + var ret, hooks,
  7492 + nType = elem.nodeType;
  7493 +
  7494 + // Don't get/set attributes on text, comment and attribute nodes
  7495 + if ( nType === 3 || nType === 8 || nType === 2 ) {
  7496 + return;
  7497 + }
  7498 +
  7499 + // Fallback to prop when attributes are not supported
  7500 + if ( typeof elem.getAttribute === "undefined" ) {
  7501 + return jQuery.prop( elem, name, value );
  7502 + }
  7503 +
  7504 + // Attribute hooks are determined by the lowercase version
  7505 + // Grab necessary hook if one is defined
  7506 + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
  7507 + hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
  7508 + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
  7509 + }
  7510 +
  7511 + if ( value !== undefined ) {
  7512 + if ( value === null ) {
  7513 + jQuery.removeAttr( elem, name );
  7514 + return;
  7515 + }
  7516 +
  7517 + if ( hooks && "set" in hooks &&
  7518 + ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
  7519 + return ret;
  7520 + }
  7521 +
  7522 + elem.setAttribute( name, value + "" );
  7523 + return value;
  7524 + }
  7525 +
  7526 + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
  7527 + return ret;
  7528 + }
  7529 +
  7530 + ret = jQuery.find.attr( elem, name );
  7531 +
  7532 + // Non-existent attributes return null, we normalize to undefined
  7533 + return ret == null ? undefined : ret;
  7534 + },
  7535 +
  7536 + attrHooks: {
  7537 + type: {
  7538 + set: function( elem, value ) {
  7539 + if ( !support.radioValue && value === "radio" &&
  7540 + nodeName( elem, "input" ) ) {
  7541 + var val = elem.value;
  7542 + elem.setAttribute( "type", value );
  7543 + if ( val ) {
  7544 + elem.value = val;
  7545 + }
  7546 + return value;
  7547 + }
  7548 + }
  7549 + }
  7550 + },
  7551 +
  7552 + removeAttr: function( elem, value ) {
  7553 + var name,
  7554 + i = 0,
  7555 +
  7556 + // Attribute names can contain non-HTML whitespace characters
  7557 + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
  7558 + attrNames = value && value.match( rnothtmlwhite );
  7559 +
  7560 + if ( attrNames && elem.nodeType === 1 ) {
  7561 + while ( ( name = attrNames[ i++ ] ) ) {
  7562 + elem.removeAttribute( name );
  7563 + }
  7564 + }
  7565 + }
  7566 +} );
  7567 +
  7568 +// Hooks for boolean attributes
  7569 +boolHook = {
  7570 + set: function( elem, value, name ) {
  7571 + if ( value === false ) {
  7572 +
  7573 + // Remove boolean attributes when set to false
  7574 + jQuery.removeAttr( elem, name );
  7575 + } else {
  7576 + elem.setAttribute( name, name );
  7577 + }
  7578 + return name;
  7579 + }
  7580 +};
  7581 +
  7582 +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
  7583 + var getter = attrHandle[ name ] || jQuery.find.attr;
  7584 +
  7585 + attrHandle[ name ] = function( elem, name, isXML ) {
  7586 + var ret, handle,
  7587 + lowercaseName = name.toLowerCase();
  7588 +
  7589 + if ( !isXML ) {
  7590 +
  7591 + // Avoid an infinite loop by temporarily removing this function from the getter
  7592 + handle = attrHandle[ lowercaseName ];
  7593 + attrHandle[ lowercaseName ] = ret;
  7594 + ret = getter( elem, name, isXML ) != null ?
  7595 + lowercaseName :
  7596 + null;
  7597 + attrHandle[ lowercaseName ] = handle;
  7598 + }
  7599 + return ret;
  7600 + };
  7601 +} );
  7602 +
  7603 +
  7604 +
  7605 +
  7606 +var rfocusable = /^(?:input|select|textarea|button)$/i,
  7607 + rclickable = /^(?:a|area)$/i;
  7608 +
  7609 +jQuery.fn.extend( {
  7610 + prop: function( name, value ) {
  7611 + return access( this, jQuery.prop, name, value, arguments.length > 1 );
  7612 + },
  7613 +
  7614 + removeProp: function( name ) {
  7615 + return this.each( function() {
  7616 + delete this[ jQuery.propFix[ name ] || name ];
  7617 + } );
  7618 + }
  7619 +} );
  7620 +
  7621 +jQuery.extend( {
  7622 + prop: function( elem, name, value ) {
  7623 + var ret, hooks,
  7624 + nType = elem.nodeType;
  7625 +
  7626 + // Don't get/set properties on text, comment and attribute nodes
  7627 + if ( nType === 3 || nType === 8 || nType === 2 ) {
  7628 + return;
  7629 + }
  7630 +
  7631 + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
  7632 +
  7633 + // Fix name and attach hooks
  7634 + name = jQuery.propFix[ name ] || name;
  7635 + hooks = jQuery.propHooks[ name ];
  7636 + }
  7637 +
  7638 + if ( value !== undefined ) {
  7639 + if ( hooks && "set" in hooks &&
  7640 + ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
  7641 + return ret;
  7642 + }
  7643 +
  7644 + return ( elem[ name ] = value );
  7645 + }
  7646 +
  7647 + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
  7648 + return ret;
  7649 + }
  7650 +
  7651 + return elem[ name ];
  7652 + },
  7653 +
  7654 + propHooks: {
  7655 + tabIndex: {
  7656 + get: function( elem ) {
  7657 +
  7658 + // Support: IE <=9 - 11 only
  7659 + // elem.tabIndex doesn't always return the
  7660 + // correct value when it hasn't been explicitly set
  7661 + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
  7662 + // Use proper attribute retrieval(#12072)
  7663 + var tabindex = jQuery.find.attr( elem, "tabindex" );
  7664 +
  7665 + if ( tabindex ) {
  7666 + return parseInt( tabindex, 10 );
  7667 + }
  7668 +
  7669 + if (
  7670 + rfocusable.test( elem.nodeName ) ||
  7671 + rclickable.test( elem.nodeName ) &&
  7672 + elem.href
  7673 + ) {
  7674 + return 0;
  7675 + }
  7676 +
  7677 + return -1;
  7678 + }
  7679 + }
  7680 + },
  7681 +
  7682 + propFix: {
  7683 + "for": "htmlFor",
  7684 + "class": "className"
  7685 + }
  7686 +} );
  7687 +
  7688 +// Support: IE <=11 only
  7689 +// Accessing the selectedIndex property
  7690 +// forces the browser to respect setting selected
  7691 +// on the option
  7692 +// The getter ensures a default option is selected
  7693 +// when in an optgroup
  7694 +// eslint rule "no-unused-expressions" is disabled for this code
  7695 +// since it considers such accessions noop
  7696 +if ( !support.optSelected ) {
  7697 + jQuery.propHooks.selected = {
  7698 + get: function( elem ) {
  7699 +
  7700 + /* eslint no-unused-expressions: "off" */
  7701 +
  7702 + var parent = elem.parentNode;
  7703 + if ( parent && parent.parentNode ) {
  7704 + parent.parentNode.selectedIndex;
  7705 + }
  7706 + return null;
  7707 + },
  7708 + set: function( elem ) {
  7709 +
  7710 + /* eslint no-unused-expressions: "off" */
  7711 +
  7712 + var parent = elem.parentNode;
  7713 + if ( parent ) {
  7714 + parent.selectedIndex;
  7715 +
  7716 + if ( parent.parentNode ) {
  7717 + parent.parentNode.selectedIndex;
  7718 + }
  7719 + }
  7720 + }
  7721 + };
  7722 +}
  7723 +
  7724 +jQuery.each( [
  7725 + "tabIndex",
  7726 + "readOnly",
  7727 + "maxLength",
  7728 + "cellSpacing",
  7729 + "cellPadding",
  7730 + "rowSpan",
  7731 + "colSpan",
  7732 + "useMap",
  7733 + "frameBorder",
  7734 + "contentEditable"
  7735 +], function() {
  7736 + jQuery.propFix[ this.toLowerCase() ] = this;
  7737 +} );
  7738 +
  7739 +
  7740 +
  7741 +
  7742 + // Strip and collapse whitespace according to HTML spec
  7743 + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
  7744 + function stripAndCollapse( value ) {
  7745 + var tokens = value.match( rnothtmlwhite ) || [];
  7746 + return tokens.join( " " );
  7747 + }
  7748 +
  7749 +
  7750 +function getClass( elem ) {
  7751 + return elem.getAttribute && elem.getAttribute( "class" ) || "";
  7752 +}
  7753 +
  7754 +jQuery.fn.extend( {
  7755 + addClass: function( value ) {
  7756 + var classes, elem, cur, curValue, clazz, j, finalValue,
  7757 + i = 0;
  7758 +
  7759 + if ( jQuery.isFunction( value ) ) {
  7760 + return this.each( function( j ) {
  7761 + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
  7762 + } );
  7763 + }
  7764 +
  7765 + if ( typeof value === "string" && value ) {
  7766 + classes = value.match( rnothtmlwhite ) || [];
  7767 +
  7768 + while ( ( elem = this[ i++ ] ) ) {
  7769 + curValue = getClass( elem );
  7770 + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
  7771 +
  7772 + if ( cur ) {
  7773 + j = 0;
  7774 + while ( ( clazz = classes[ j++ ] ) ) {
  7775 + if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
  7776 + cur += clazz + " ";
  7777 + }
  7778 + }
  7779 +
  7780 + // Only assign if different to avoid unneeded rendering.
  7781 + finalValue = stripAndCollapse( cur );
  7782 + if ( curValue !== finalValue ) {
  7783 + elem.setAttribute( "class", finalValue );
  7784 + }
  7785 + }
  7786 + }
  7787 + }
  7788 +
  7789 + return this;
  7790 + },
  7791 +
  7792 + removeClass: function( value ) {
  7793 + var classes, elem, cur, curValue, clazz, j, finalValue,
  7794 + i = 0;
  7795 +
  7796 + if ( jQuery.isFunction( value ) ) {
  7797 + return this.each( function( j ) {
  7798 + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
  7799 + } );
  7800 + }
  7801 +
  7802 + if ( !arguments.length ) {
  7803 + return this.attr( "class", "" );
  7804 + }
  7805 +
  7806 + if ( typeof value === "string" && value ) {
  7807 + classes = value.match( rnothtmlwhite ) || [];
  7808 +
  7809 + while ( ( elem = this[ i++ ] ) ) {
  7810 + curValue = getClass( elem );
  7811 +
  7812 + // This expression is here for better compressibility (see addClass)
  7813 + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
  7814 +
  7815 + if ( cur ) {
  7816 + j = 0;
  7817 + while ( ( clazz = classes[ j++ ] ) ) {
  7818 +
  7819 + // Remove *all* instances
  7820 + while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
  7821 + cur = cur.replace( " " + clazz + " ", " " );
  7822 + }
  7823 + }
  7824 +
  7825 + // Only assign if different to avoid unneeded rendering.
  7826 + finalValue = stripAndCollapse( cur );
  7827 + if ( curValue !== finalValue ) {
  7828 + elem.setAttribute( "class", finalValue );
  7829 + }
  7830 + }
  7831 + }
  7832 + }
  7833 +
  7834 + return this;
  7835 + },
  7836 +
  7837 + toggleClass: function( value, stateVal ) {
  7838 + var type = typeof value;
  7839 +
  7840 + if ( typeof stateVal === "boolean" && type === "string" ) {
  7841 + return stateVal ? this.addClass( value ) : this.removeClass( value );
  7842 + }
  7843 +
  7844 + if ( jQuery.isFunction( value ) ) {
  7845 + return this.each( function( i ) {
  7846 + jQuery( this ).toggleClass(
  7847 + value.call( this, i, getClass( this ), stateVal ),
  7848 + stateVal
  7849 + );
  7850 + } );
  7851 + }
  7852 +
  7853 + return this.each( function() {
  7854 + var className, i, self, classNames;
  7855 +
  7856 + if ( type === "string" ) {
  7857 +
  7858 + // Toggle individual class names
  7859 + i = 0;
  7860 + self = jQuery( this );
  7861 + classNames = value.match( rnothtmlwhite ) || [];
  7862 +
  7863 + while ( ( className = classNames[ i++ ] ) ) {
  7864 +
  7865 + // Check each className given, space separated list
  7866 + if ( self.hasClass( className ) ) {
  7867 + self.removeClass( className );
  7868 + } else {
  7869 + self.addClass( className );
  7870 + }
  7871 + }
  7872 +
  7873 + // Toggle whole class name
  7874 + } else if ( value === undefined || type === "boolean" ) {
  7875 + className = getClass( this );
  7876 + if ( className ) {
  7877 +
  7878 + // Store className if set
  7879 + dataPriv.set( this, "__className__", className );
  7880 + }
  7881 +
  7882 + // If the element has a class name or if we're passed `false`,
  7883 + // then remove the whole classname (if there was one, the above saved it).
  7884 + // Otherwise bring back whatever was previously saved (if anything),
  7885 + // falling back to the empty string if nothing was stored.
  7886 + if ( this.setAttribute ) {
  7887 + this.setAttribute( "class",
  7888 + className || value === false ?
  7889 + "" :
  7890 + dataPriv.get( this, "__className__" ) || ""
  7891 + );
  7892 + }
  7893 + }
  7894 + } );
  7895 + },
  7896 +
  7897 + hasClass: function( selector ) {
  7898 + var className, elem,
  7899 + i = 0;
  7900 +
  7901 + className = " " + selector + " ";
  7902 + while ( ( elem = this[ i++ ] ) ) {
  7903 + if ( elem.nodeType === 1 &&
  7904 + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
  7905 + return true;
  7906 + }
  7907 + }
  7908 +
  7909 + return false;
  7910 + }
  7911 +} );
  7912 +
  7913 +
  7914 +
  7915 +
  7916 +var rreturn = /\r/g;
  7917 +
  7918 +jQuery.fn.extend( {
  7919 + val: function( value ) {
  7920 + var hooks, ret, isFunction,
  7921 + elem = this[ 0 ];
  7922 +
  7923 + if ( !arguments.length ) {
  7924 + if ( elem ) {
  7925 + hooks = jQuery.valHooks[ elem.type ] ||
  7926 + jQuery.valHooks[ elem.nodeName.toLowerCase() ];
  7927 +
  7928 + if ( hooks &&
  7929 + "get" in hooks &&
  7930 + ( ret = hooks.get( elem, "value" ) ) !== undefined
  7931 + ) {
  7932 + return ret;
  7933 + }
  7934 +
  7935 + ret = elem.value;
  7936 +
  7937 + // Handle most common string cases
  7938 + if ( typeof ret === "string" ) {
  7939 + return ret.replace( rreturn, "" );
  7940 + }
  7941 +
  7942 + // Handle cases where value is null/undef or number
  7943 + return ret == null ? "" : ret;
  7944 + }
  7945 +
  7946 + return;
  7947 + }
  7948 +
  7949 + isFunction = jQuery.isFunction( value );
  7950 +
  7951 + return this.each( function( i ) {
  7952 + var val;
  7953 +
  7954 + if ( this.nodeType !== 1 ) {
  7955 + return;
  7956 + }
  7957 +
  7958 + if ( isFunction ) {
  7959 + val = value.call( this, i, jQuery( this ).val() );
  7960 + } else {
  7961 + val = value;
  7962 + }
  7963 +
  7964 + // Treat null/undefined as ""; convert numbers to string
  7965 + if ( val == null ) {
  7966 + val = "";
  7967 +
  7968 + } else if ( typeof val === "number" ) {
  7969 + val += "";
  7970 +
  7971 + } else if ( Array.isArray( val ) ) {
  7972 + val = jQuery.map( val, function( value ) {
  7973 + return value == null ? "" : value + "";
  7974 + } );
  7975 + }
  7976 +
  7977 + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
  7978 +
  7979 + // If set returns undefined, fall back to normal setting
  7980 + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
  7981 + this.value = val;
  7982 + }
  7983 + } );
  7984 + }
  7985 +} );
  7986 +
  7987 +jQuery.extend( {
  7988 + valHooks: {
  7989 + option: {
  7990 + get: function( elem ) {
  7991 +
  7992 + var val = jQuery.find.attr( elem, "value" );
  7993 + return val != null ?
  7994 + val :
  7995 +
  7996 + // Support: IE <=10 - 11 only
  7997 + // option.text throws exceptions (#14686, #14858)
  7998 + // Strip and collapse whitespace
  7999 + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
  8000 + stripAndCollapse( jQuery.text( elem ) );
  8001 + }
  8002 + },
  8003 + select: {
  8004 + get: function( elem ) {
  8005 + var value, option, i,
  8006 + options = elem.options,
  8007 + index = elem.selectedIndex,
  8008 + one = elem.type === "select-one",
  8009 + values = one ? null : [],
  8010 + max = one ? index + 1 : options.length;
  8011 +
  8012 + if ( index < 0 ) {
  8013 + i = max;
  8014 +
  8015 + } else {
  8016 + i = one ? index : 0;
  8017 + }
  8018 +
  8019 + // Loop through all the selected options
  8020 + for ( ; i < max; i++ ) {
  8021 + option = options[ i ];
  8022 +
  8023 + // Support: IE <=9 only
  8024 + // IE8-9 doesn't update selected after form reset (#2551)
  8025 + if ( ( option.selected || i === index ) &&
  8026 +
  8027 + // Don't return options that are disabled or in a disabled optgroup
  8028 + !option.disabled &&
  8029 + ( !option.parentNode.disabled ||
  8030 + !nodeName( option.parentNode, "optgroup" ) ) ) {
  8031 +
  8032 + // Get the specific value for the option
  8033 + value = jQuery( option ).val();
  8034 +
  8035 + // We don't need an array for one selects
  8036 + if ( one ) {
  8037 + return value;
  8038 + }
  8039 +
  8040 + // Multi-Selects return an array
  8041 + values.push( value );
  8042 + }
  8043 + }
  8044 +
  8045 + return values;
  8046 + },
  8047 +
  8048 + set: function( elem, value ) {
  8049 + var optionSet, option,
  8050 + options = elem.options,
  8051 + values = jQuery.makeArray( value ),
  8052 + i = options.length;
  8053 +
  8054 + while ( i-- ) {
  8055 + option = options[ i ];
  8056 +
  8057 + /* eslint-disable no-cond-assign */
  8058 +
  8059 + if ( option.selected =
  8060 + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
  8061 + ) {
  8062 + optionSet = true;
  8063 + }
  8064 +
  8065 + /* eslint-enable no-cond-assign */
  8066 + }
  8067 +
  8068 + // Force browsers to behave consistently when non-matching value is set
  8069 + if ( !optionSet ) {
  8070 + elem.selectedIndex = -1;
  8071 + }
  8072 + return values;
  8073 + }
  8074 + }
  8075 + }
  8076 +} );
  8077 +
  8078 +// Radios and checkboxes getter/setter
  8079 +jQuery.each( [ "radio", "checkbox" ], function() {
  8080 + jQuery.valHooks[ this ] = {
  8081 + set: function( elem, value ) {
  8082 + if ( Array.isArray( value ) ) {
  8083 + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
  8084 + }
  8085 + }
  8086 + };
  8087 + if ( !support.checkOn ) {
  8088 + jQuery.valHooks[ this ].get = function( elem ) {
  8089 + return elem.getAttribute( "value" ) === null ? "on" : elem.value;
  8090 + };
  8091 + }
  8092 +} );
  8093 +
  8094 +
  8095 +
  8096 +
  8097 +// Return jQuery for attributes-only inclusion
  8098 +
  8099 +
  8100 +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
  8101 +
  8102 +jQuery.extend( jQuery.event, {
  8103 +
  8104 + trigger: function( event, data, elem, onlyHandlers ) {
  8105 +
  8106 + var i, cur, tmp, bubbleType, ontype, handle, special,
  8107 + eventPath = [ elem || document ],
  8108 + type = hasOwn.call( event, "type" ) ? event.type : event,
  8109 + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
  8110 +
  8111 + cur = tmp = elem = elem || document;
  8112 +
  8113 + // Don't do events on text and comment nodes
  8114 + if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
  8115 + return;
  8116 + }
  8117 +
  8118 + // focus/blur morphs to focusin/out; ensure we're not firing them right now
  8119 + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
  8120 + return;
  8121 + }
  8122 +
  8123 + if ( type.indexOf( "." ) > -1 ) {
  8124 +
  8125 + // Namespaced trigger; create a regexp to match event type in handle()
  8126 + namespaces = type.split( "." );
  8127 + type = namespaces.shift();
  8128 + namespaces.sort();
  8129 + }
  8130 + ontype = type.indexOf( ":" ) < 0 && "on" + type;
  8131 +
  8132 + // Caller can pass in a jQuery.Event object, Object, or just an event type string
  8133 + event = event[ jQuery.expando ] ?
  8134 + event :
  8135 + new jQuery.Event( type, typeof event === "object" && event );
  8136 +
  8137 + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
  8138 + event.isTrigger = onlyHandlers ? 2 : 3;
  8139 + event.namespace = namespaces.join( "." );
  8140 + event.rnamespace = event.namespace ?
  8141 + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
  8142 + null;
  8143 +
  8144 + // Clean up the event in case it is being reused
  8145 + event.result = undefined;
  8146 + if ( !event.target ) {
  8147 + event.target = elem;
  8148 + }
  8149 +
  8150 + // Clone any incoming data and prepend the event, creating the handler arg list
  8151 + data = data == null ?
  8152 + [ event ] :
  8153 + jQuery.makeArray( data, [ event ] );
  8154 +
  8155 + // Allow special events to draw outside the lines
  8156 + special = jQuery.event.special[ type ] || {};
  8157 + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
  8158 + return;
  8159 + }
  8160 +
  8161 + // Determine event propagation path in advance, per W3C events spec (#9951)
  8162 + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
  8163 + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
  8164 +
  8165 + bubbleType = special.delegateType || type;
  8166 + if ( !rfocusMorph.test( bubbleType + type ) ) {
  8167 + cur = cur.parentNode;
  8168 + }
  8169 + for ( ; cur; cur = cur.parentNode ) {
  8170 + eventPath.push( cur );
  8171 + tmp = cur;
  8172 + }
  8173 +
  8174 + // Only add window if we got to document (e.g., not plain obj or detached DOM)
  8175 + if ( tmp === ( elem.ownerDocument || document ) ) {
  8176 + eventPath.push( tmp.defaultView || tmp.parentWindow || window );
  8177 + }
  8178 + }
  8179 +
  8180 + // Fire handlers on the event path
  8181 + i = 0;
  8182 + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
  8183 +
  8184 + event.type = i > 1 ?
  8185 + bubbleType :
  8186 + special.bindType || type;
  8187 +
  8188 + // jQuery handler
  8189 + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
  8190 + dataPriv.get( cur, "handle" );
  8191 + if ( handle ) {
  8192 + handle.apply( cur, data );
  8193 + }
  8194 +
  8195 + // Native handler
  8196 + handle = ontype && cur[ ontype ];
  8197 + if ( handle && handle.apply && acceptData( cur ) ) {
  8198 + event.result = handle.apply( cur, data );
  8199 + if ( event.result === false ) {
  8200 + event.preventDefault();
  8201 + }
  8202 + }
  8203 + }
  8204 + event.type = type;
  8205 +
  8206 + // If nobody prevented the default action, do it now
  8207 + if ( !onlyHandlers && !event.isDefaultPrevented() ) {
  8208 +
  8209 + if ( ( !special._default ||
  8210 + special._default.apply( eventPath.pop(), data ) === false ) &&
  8211 + acceptData( elem ) ) {
  8212 +
  8213 + // Call a native DOM method on the target with the same name as the event.
  8214 + // Don't do default actions on window, that's where global variables be (#6170)
  8215 + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
  8216 +
  8217 + // Don't re-trigger an onFOO event when we call its FOO() method
  8218 + tmp = elem[ ontype ];
  8219 +
  8220 + if ( tmp ) {
  8221 + elem[ ontype ] = null;
  8222 + }
  8223 +
  8224 + // Prevent re-triggering of the same event, since we already bubbled it above
  8225 + jQuery.event.triggered = type;
  8226 + elem[ type ]();
  8227 + jQuery.event.triggered = undefined;
  8228 +
  8229 + if ( tmp ) {
  8230 + elem[ ontype ] = tmp;
  8231 + }
  8232 + }
  8233 + }
  8234 + }
  8235 +
  8236 + return event.result;
  8237 + },
  8238 +
  8239 + // Piggyback on a donor event to simulate a different one
  8240 + // Used only for `focus(in | out)` events
  8241 + simulate: function( type, elem, event ) {
  8242 + var e = jQuery.extend(
  8243 + new jQuery.Event(),
  8244 + event,
  8245 + {
  8246 + type: type,
  8247 + isSimulated: true
  8248 + }
  8249 + );
  8250 +
  8251 + jQuery.event.trigger( e, null, elem );
  8252 + }
  8253 +
  8254 +} );
  8255 +
  8256 +jQuery.fn.extend( {
  8257 +
  8258 + trigger: function( type, data ) {
  8259 + return this.each( function() {
  8260 + jQuery.event.trigger( type, data, this );
  8261 + } );
  8262 + },
  8263 + triggerHandler: function( type, data ) {
  8264 + var elem = this[ 0 ];
  8265 + if ( elem ) {
  8266 + return jQuery.event.trigger( type, data, elem, true );
  8267 + }
  8268 + }
  8269 +} );
  8270 +
  8271 +
  8272 +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
  8273 + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
  8274 + "change select submit keydown keypress keyup contextmenu" ).split( " " ),
  8275 + function( i, name ) {
  8276 +
  8277 + // Handle event binding
  8278 + jQuery.fn[ name ] = function( data, fn ) {
  8279 + return arguments.length > 0 ?
  8280 + this.on( name, null, data, fn ) :
  8281 + this.trigger( name );
  8282 + };
  8283 +} );
  8284 +
  8285 +jQuery.fn.extend( {
  8286 + hover: function( fnOver, fnOut ) {
  8287 + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
  8288 + }
  8289 +} );
  8290 +
  8291 +
  8292 +
  8293 +
  8294 +support.focusin = "onfocusin" in window;
  8295 +
  8296 +
  8297 +// Support: Firefox <=44
  8298 +// Firefox doesn't have focus(in | out) events
  8299 +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
  8300 +//
  8301 +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
  8302 +// focus(in | out) events fire after focus & blur events,
  8303 +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
  8304 +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
  8305 +if ( !support.focusin ) {
  8306 + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
  8307 +
  8308 + // Attach a single capturing handler on the document while someone wants focusin/focusout
  8309 + var handler = function( event ) {
  8310 + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
  8311 + };
  8312 +
  8313 + jQuery.event.special[ fix ] = {
  8314 + setup: function() {
  8315 + var doc = this.ownerDocument || this,
  8316 + attaches = dataPriv.access( doc, fix );
  8317 +
  8318 + if ( !attaches ) {
  8319 + doc.addEventListener( orig, handler, true );
  8320 + }
  8321 + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
  8322 + },
  8323 + teardown: function() {
  8324 + var doc = this.ownerDocument || this,
  8325 + attaches = dataPriv.access( doc, fix ) - 1;
  8326 +
  8327 + if ( !attaches ) {
  8328 + doc.removeEventListener( orig, handler, true );
  8329 + dataPriv.remove( doc, fix );
  8330 +
  8331 + } else {
  8332 + dataPriv.access( doc, fix, attaches );
  8333 + }
  8334 + }
  8335 + };
  8336 + } );
  8337 +}
  8338 +var location = window.location;
  8339 +
  8340 +var nonce = jQuery.now();
  8341 +
  8342 +var rquery = ( /\?/ );
  8343 +
  8344 +
  8345 +
  8346 +// Cross-browser xml parsing
  8347 +jQuery.parseXML = function( data ) {
  8348 + var xml;
  8349 + if ( !data || typeof data !== "string" ) {
  8350 + return null;
  8351 + }
  8352 +
  8353 + // Support: IE 9 - 11 only
  8354 + // IE throws on parseFromString with invalid input.
  8355 + try {
  8356 + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
  8357 + } catch ( e ) {
  8358 + xml = undefined;
  8359 + }
  8360 +
  8361 + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
  8362 + jQuery.error( "Invalid XML: " + data );
  8363 + }
  8364 + return xml;
  8365 +};
  8366 +
  8367 +
  8368 +var
  8369 + rbracket = /\[\]$/,
  8370 + rCRLF = /\r?\n/g,
  8371 + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
  8372 + rsubmittable = /^(?:input|select|textarea|keygen)/i;
  8373 +
  8374 +function buildParams( prefix, obj, traditional, add ) {
  8375 + var name;
  8376 +
  8377 + if ( Array.isArray( obj ) ) {
  8378 +
  8379 + // Serialize array item.
  8380 + jQuery.each( obj, function( i, v ) {
  8381 + if ( traditional || rbracket.test( prefix ) ) {
  8382 +
  8383 + // Treat each array item as a scalar.
  8384 + add( prefix, v );
  8385 +
  8386 + } else {
  8387 +
  8388 + // Item is non-scalar (array or object), encode its numeric index.
  8389 + buildParams(
  8390 + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
  8391 + v,
  8392 + traditional,
  8393 + add
  8394 + );
  8395 + }
  8396 + } );
  8397 +
  8398 + } else if ( !traditional && jQuery.type( obj ) === "object" ) {
  8399 +
  8400 + // Serialize object item.
  8401 + for ( name in obj ) {
  8402 + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
  8403 + }
  8404 +
  8405 + } else {
  8406 +
  8407 + // Serialize scalar item.
  8408 + add( prefix, obj );
  8409 + }
  8410 +}
  8411 +
  8412 +// Serialize an array of form elements or a set of
  8413 +// key/values into a query string
  8414 +jQuery.param = function( a, traditional ) {
  8415 + var prefix,
  8416 + s = [],
  8417 + add = function( key, valueOrFunction ) {
  8418 +
  8419 + // If value is a function, invoke it and use its return value
  8420 + var value = jQuery.isFunction( valueOrFunction ) ?
  8421 + valueOrFunction() :
  8422 + valueOrFunction;
  8423 +
  8424 + s[ s.length ] = encodeURIComponent( key ) + "=" +
  8425 + encodeURIComponent( value == null ? "" : value );
  8426 + };
  8427 +
  8428 + // If an array was passed in, assume that it is an array of form elements.
  8429 + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
  8430 +
  8431 + // Serialize the form elements
  8432 + jQuery.each( a, function() {
  8433 + add( this.name, this.value );
  8434 + } );
  8435 +
  8436 + } else {
  8437 +
  8438 + // If traditional, encode the "old" way (the way 1.3.2 or older
  8439 + // did it), otherwise encode params recursively.
  8440 + for ( prefix in a ) {
  8441 + buildParams( prefix, a[ prefix ], traditional, add );
  8442 + }
  8443 + }
  8444 +
  8445 + // Return the resulting serialization
  8446 + return s.join( "&" );
  8447 +};
  8448 +
  8449 +jQuery.fn.extend( {
  8450 + serialize: function() {
  8451 + return jQuery.param( this.serializeArray() );
  8452 + },
  8453 + serializeArray: function() {
  8454 + return this.map( function() {
  8455 +
  8456 + // Can add propHook for "elements" to filter or add form elements
  8457 + var elements = jQuery.prop( this, "elements" );
  8458 + return elements ? jQuery.makeArray( elements ) : this;
  8459 + } )
  8460 + .filter( function() {
  8461 + var type = this.type;
  8462 +
  8463 + // Use .is( ":disabled" ) so that fieldset[disabled] works
  8464 + return this.name && !jQuery( this ).is( ":disabled" ) &&
  8465 + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
  8466 + ( this.checked || !rcheckableType.test( type ) );
  8467 + } )
  8468 + .map( function( i, elem ) {
  8469 + var val = jQuery( this ).val();
  8470 +
  8471 + if ( val == null ) {
  8472 + return null;
  8473 + }
  8474 +
  8475 + if ( Array.isArray( val ) ) {
  8476 + return jQuery.map( val, function( val ) {
  8477 + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  8478 + } );
  8479 + }
  8480 +
  8481 + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  8482 + } ).get();
  8483 + }
  8484 +} );
  8485 +
  8486 +
  8487 +var
  8488 + r20 = /%20/g,
  8489 + rhash = /#.*$/,
  8490 + rantiCache = /([?&])_=[^&]*/,
  8491 + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
  8492 +
  8493 + // #7653, #8125, #8152: local protocol detection
  8494 + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
  8495 + rnoContent = /^(?:GET|HEAD)$/,
  8496 + rprotocol = /^\/\//,
  8497 +
  8498 + /* Prefilters
  8499 + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  8500 + * 2) These are called:
  8501 + * - BEFORE asking for a transport
  8502 + * - AFTER param serialization (s.data is a string if s.processData is true)
  8503 + * 3) key is the dataType
  8504 + * 4) the catchall symbol "*" can be used
  8505 + * 5) execution will start with transport dataType and THEN continue down to "*" if needed
  8506 + */
  8507 + prefilters = {},
  8508 +
  8509 + /* Transports bindings
  8510 + * 1) key is the dataType
  8511 + * 2) the catchall symbol "*" can be used
  8512 + * 3) selection will start with transport dataType and THEN go to "*" if needed
  8513 + */
  8514 + transports = {},
  8515 +
  8516 + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
  8517 + allTypes = "*/".concat( "*" ),
  8518 +
  8519 + // Anchor tag for parsing the document origin
  8520 + originAnchor = document.createElement( "a" );
  8521 + originAnchor.href = location.href;
  8522 +
  8523 +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
  8524 +function addToPrefiltersOrTransports( structure ) {
  8525 +
  8526 + // dataTypeExpression is optional and defaults to "*"
  8527 + return function( dataTypeExpression, func ) {
  8528 +
  8529 + if ( typeof dataTypeExpression !== "string" ) {
  8530 + func = dataTypeExpression;
  8531 + dataTypeExpression = "*";
  8532 + }
  8533 +
  8534 + var dataType,
  8535 + i = 0,
  8536 + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
  8537 +
  8538 + if ( jQuery.isFunction( func ) ) {
  8539 +
  8540 + // For each dataType in the dataTypeExpression
  8541 + while ( ( dataType = dataTypes[ i++ ] ) ) {
  8542 +
  8543 + // Prepend if requested
  8544 + if ( dataType[ 0 ] === "+" ) {
  8545 + dataType = dataType.slice( 1 ) || "*";
  8546 + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
  8547 +
  8548 + // Otherwise append
  8549 + } else {
  8550 + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
  8551 + }
  8552 + }
  8553 + }
  8554 + };
  8555 +}
  8556 +
  8557 +// Base inspection function for prefilters and transports
  8558 +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
  8559 +
  8560 + var inspected = {},
  8561 + seekingTransport = ( structure === transports );
  8562 +
  8563 + function inspect( dataType ) {
  8564 + var selected;
  8565 + inspected[ dataType ] = true;
  8566 + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
  8567 + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
  8568 + if ( typeof dataTypeOrTransport === "string" &&
  8569 + !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
  8570 +
  8571 + options.dataTypes.unshift( dataTypeOrTransport );
  8572 + inspect( dataTypeOrTransport );
  8573 + return false;
  8574 + } else if ( seekingTransport ) {
  8575 + return !( selected = dataTypeOrTransport );
  8576 + }
  8577 + } );
  8578 + return selected;
  8579 + }
  8580 +
  8581 + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
  8582 +}
  8583 +
  8584 +// A special extend for ajax options
  8585 +// that takes "flat" options (not to be deep extended)
  8586 +// Fixes #9887
  8587 +function ajaxExtend( target, src ) {
  8588 + var key, deep,
  8589 + flatOptions = jQuery.ajaxSettings.flatOptions || {};
  8590 +
  8591 + for ( key in src ) {
  8592 + if ( src[ key ] !== undefined ) {
  8593 + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
  8594 + }
  8595 + }
  8596 + if ( deep ) {
  8597 + jQuery.extend( true, target, deep );
  8598 + }
  8599 +
  8600 + return target;
  8601 +}
  8602 +
  8603 +/* Handles responses to an ajax request:
  8604 + * - finds the right dataType (mediates between content-type and expected dataType)
  8605 + * - returns the corresponding response
  8606 + */
  8607 +function ajaxHandleResponses( s, jqXHR, responses ) {
  8608 +
  8609 + var ct, type, finalDataType, firstDataType,
  8610 + contents = s.contents,
  8611 + dataTypes = s.dataTypes;
  8612 +
  8613 + // Remove auto dataType and get content-type in the process
  8614 + while ( dataTypes[ 0 ] === "*" ) {
  8615 + dataTypes.shift();
  8616 + if ( ct === undefined ) {
  8617 + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
  8618 + }
  8619 + }
  8620 +
  8621 + // Check if we're dealing with a known content-type
  8622 + if ( ct ) {
  8623 + for ( type in contents ) {
  8624 + if ( contents[ type ] && contents[ type ].test( ct ) ) {
  8625 + dataTypes.unshift( type );
  8626 + break;
  8627 + }
  8628 + }
  8629 + }
  8630 +
  8631 + // Check to see if we have a response for the expected dataType
  8632 + if ( dataTypes[ 0 ] in responses ) {
  8633 + finalDataType = dataTypes[ 0 ];
  8634 + } else {
  8635 +
  8636 + // Try convertible dataTypes
  8637 + for ( type in responses ) {
  8638 + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
  8639 + finalDataType = type;
  8640 + break;
  8641 + }
  8642 + if ( !firstDataType ) {
  8643 + firstDataType = type;
  8644 + }
  8645 + }
  8646 +
  8647 + // Or just use first one
  8648 + finalDataType = finalDataType || firstDataType;
  8649 + }
  8650 +
  8651 + // If we found a dataType
  8652 + // We add the dataType to the list if needed
  8653 + // and return the corresponding response
  8654 + if ( finalDataType ) {
  8655 + if ( finalDataType !== dataTypes[ 0 ] ) {
  8656 + dataTypes.unshift( finalDataType );
  8657 + }
  8658 + return responses[ finalDataType ];
  8659 + }
  8660 +}
  8661 +
  8662 +/* Chain conversions given the request and the original response
  8663 + * Also sets the responseXXX fields on the jqXHR instance
  8664 + */
  8665 +function ajaxConvert( s, response, jqXHR, isSuccess ) {
  8666 + var conv2, current, conv, tmp, prev,
  8667 + converters = {},
  8668 +
  8669 + // Work with a copy of dataTypes in case we need to modify it for conversion
  8670 + dataTypes = s.dataTypes.slice();
  8671 +
  8672 + // Create converters map with lowercased keys
  8673 + if ( dataTypes[ 1 ] ) {
  8674 + for ( conv in s.converters ) {
  8675 + converters[ conv.toLowerCase() ] = s.converters[ conv ];
  8676 + }
  8677 + }
  8678 +
  8679 + current = dataTypes.shift();
  8680 +
  8681 + // Convert to each sequential dataType
  8682 + while ( current ) {
  8683 +
  8684 + if ( s.responseFields[ current ] ) {
  8685 + jqXHR[ s.responseFields[ current ] ] = response;
  8686 + }
  8687 +
  8688 + // Apply the dataFilter if provided
  8689 + if ( !prev && isSuccess && s.dataFilter ) {
  8690 + response = s.dataFilter( response, s.dataType );
  8691 + }
  8692 +
  8693 + prev = current;
  8694 + current = dataTypes.shift();
  8695 +
  8696 + if ( current ) {
  8697 +
  8698 + // There's only work to do if current dataType is non-auto
  8699 + if ( current === "*" ) {
  8700 +
  8701 + current = prev;
  8702 +
  8703 + // Convert response if prev dataType is non-auto and differs from current
  8704 + } else if ( prev !== "*" && prev !== current ) {
  8705 +
  8706 + // Seek a direct converter
  8707 + conv = converters[ prev + " " + current ] || converters[ "* " + current ];
  8708 +
  8709 + // If none found, seek a pair
  8710 + if ( !conv ) {
  8711 + for ( conv2 in converters ) {
  8712 +
  8713 + // If conv2 outputs current
  8714 + tmp = conv2.split( " " );
  8715 + if ( tmp[ 1 ] === current ) {
  8716 +
  8717 + // If prev can be converted to accepted input
  8718 + conv = converters[ prev + " " + tmp[ 0 ] ] ||
  8719 + converters[ "* " + tmp[ 0 ] ];
  8720 + if ( conv ) {
  8721 +
  8722 + // Condense equivalence converters
  8723 + if ( conv === true ) {
  8724 + conv = converters[ conv2 ];
  8725 +
  8726 + // Otherwise, insert the intermediate dataType
  8727 + } else if ( converters[ conv2 ] !== true ) {
  8728 + current = tmp[ 0 ];
  8729 + dataTypes.unshift( tmp[ 1 ] );
  8730 + }
  8731 + break;
  8732 + }
  8733 + }
  8734 + }
  8735 + }
  8736 +
  8737 + // Apply converter (if not an equivalence)
  8738 + if ( conv !== true ) {
  8739 +
  8740 + // Unless errors are allowed to bubble, catch and return them
  8741 + if ( conv && s.throws ) {
  8742 + response = conv( response );
  8743 + } else {
  8744 + try {
  8745 + response = conv( response );
  8746 + } catch ( e ) {
  8747 + return {
  8748 + state: "parsererror",
  8749 + error: conv ? e : "No conversion from " + prev + " to " + current
  8750 + };
  8751 + }
  8752 + }
  8753 + }
  8754 + }
  8755 + }
  8756 + }
  8757 +
  8758 + return { state: "success", data: response };
  8759 +}
  8760 +
  8761 +jQuery.extend( {
  8762 +
  8763 + // Counter for holding the number of active queries
  8764 + active: 0,
  8765 +
  8766 + // Last-Modified header cache for next request
  8767 + lastModified: {},
  8768 + etag: {},
  8769 +
  8770 + ajaxSettings: {
  8771 + url: location.href,
  8772 + type: "GET",
  8773 + isLocal: rlocalProtocol.test( location.protocol ),
  8774 + global: true,
  8775 + processData: true,
  8776 + async: true,
  8777 + contentType: "application/x-www-form-urlencoded; charset=UTF-8",
  8778 +
  8779 + /*
  8780 + timeout: 0,
  8781 + data: null,
  8782 + dataType: null,
  8783 + username: null,
  8784 + password: null,
  8785 + cache: null,
  8786 + throws: false,
  8787 + traditional: false,
  8788 + headers: {},
  8789 + */
  8790 +
  8791 + accepts: {
  8792 + "*": allTypes,
  8793 + text: "text/plain",
  8794 + html: "text/html",
  8795 + xml: "application/xml, text/xml",
  8796 + json: "application/json, text/javascript"
  8797 + },
  8798 +
  8799 + contents: {
  8800 + xml: /\bxml\b/,
  8801 + html: /\bhtml/,
  8802 + json: /\bjson\b/
  8803 + },
  8804 +
  8805 + responseFields: {
  8806 + xml: "responseXML",
  8807 + text: "responseText",
  8808 + json: "responseJSON"
  8809 + },
  8810 +
  8811 + // Data converters
  8812 + // Keys separate source (or catchall "*") and destination types with a single space
  8813 + converters: {
  8814 +
  8815 + // Convert anything to text
  8816 + "* text": String,
  8817 +
  8818 + // Text to html (true = no transformation)
  8819 + "text html": true,
  8820 +
  8821 + // Evaluate text as a json expression
  8822 + "text json": JSON.parse,
  8823 +
  8824 + // Parse text as xml
  8825 + "text xml": jQuery.parseXML
  8826 + },
  8827 +
  8828 + // For options that shouldn't be deep extended:
  8829 + // you can add your own custom options here if
  8830 + // and when you create one that shouldn't be
  8831 + // deep extended (see ajaxExtend)
  8832 + flatOptions: {
  8833 + url: true,
  8834 + context: true
  8835 + }
  8836 + },
  8837 +
  8838 + // Creates a full fledged settings object into target
  8839 + // with both ajaxSettings and settings fields.
  8840 + // If target is omitted, writes into ajaxSettings.
  8841 + ajaxSetup: function( target, settings ) {
  8842 + return settings ?
  8843 +
  8844 + // Building a settings object
  8845 + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
  8846 +
  8847 + // Extending ajaxSettings
  8848 + ajaxExtend( jQuery.ajaxSettings, target );
  8849 + },
  8850 +
  8851 + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
  8852 + ajaxTransport: addToPrefiltersOrTransports( transports ),
  8853 +
  8854 + // Main method
  8855 + ajax: function( url, options ) {
  8856 +
  8857 + // If url is an object, simulate pre-1.5 signature
  8858 + if ( typeof url === "object" ) {
  8859 + options = url;
  8860 + url = undefined;
  8861 + }
  8862 +
  8863 + // Force options to be an object
  8864 + options = options || {};
  8865 +
  8866 + var transport,
  8867 +
  8868 + // URL without anti-cache param
  8869 + cacheURL,
  8870 +
  8871 + // Response headers
  8872 + responseHeadersString,
  8873 + responseHeaders,
  8874 +
  8875 + // timeout handle
  8876 + timeoutTimer,
  8877 +
  8878 + // Url cleanup var
  8879 + urlAnchor,
  8880 +
  8881 + // Request state (becomes false upon send and true upon completion)
  8882 + completed,
  8883 +
  8884 + // To know if global events are to be dispatched
  8885 + fireGlobals,
  8886 +
  8887 + // Loop variable
  8888 + i,
  8889 +
  8890 + // uncached part of the url
  8891 + uncached,
  8892 +
  8893 + // Create the final options object
  8894 + s = jQuery.ajaxSetup( {}, options ),
  8895 +
  8896 + // Callbacks context
  8897 + callbackContext = s.context || s,
  8898 +
  8899 + // Context for global events is callbackContext if it is a DOM node or jQuery collection
  8900 + globalEventContext = s.context &&
  8901 + ( callbackContext.nodeType || callbackContext.jquery ) ?
  8902 + jQuery( callbackContext ) :
  8903 + jQuery.event,
  8904 +
  8905 + // Deferreds
  8906 + deferred = jQuery.Deferred(),
  8907 + completeDeferred = jQuery.Callbacks( "once memory" ),
  8908 +
  8909 + // Status-dependent callbacks
  8910 + statusCode = s.statusCode || {},
  8911 +
  8912 + // Headers (they are sent all at once)
  8913 + requestHeaders = {},
  8914 + requestHeadersNames = {},
  8915 +
  8916 + // Default abort message
  8917 + strAbort = "canceled",
  8918 +
  8919 + // Fake xhr
  8920 + jqXHR = {
  8921 + readyState: 0,
  8922 +
  8923 + // Builds headers hashtable if needed
  8924 + getResponseHeader: function( key ) {
  8925 + var match;
  8926 + if ( completed ) {
  8927 + if ( !responseHeaders ) {
  8928 + responseHeaders = {};
  8929 + while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
  8930 + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
  8931 + }
  8932 + }
  8933 + match = responseHeaders[ key.toLowerCase() ];
  8934 + }
  8935 + return match == null ? null : match;
  8936 + },
  8937 +
  8938 + // Raw string
  8939 + getAllResponseHeaders: function() {
  8940 + return completed ? responseHeadersString : null;
  8941 + },
  8942 +
  8943 + // Caches the header
  8944 + setRequestHeader: function( name, value ) {
  8945 + if ( completed == null ) {
  8946 + name = requestHeadersNames[ name.toLowerCase() ] =
  8947 + requestHeadersNames[ name.toLowerCase() ] || name;
  8948 + requestHeaders[ name ] = value;
  8949 + }
  8950 + return this;
  8951 + },
  8952 +
  8953 + // Overrides response content-type header
  8954 + overrideMimeType: function( type ) {
  8955 + if ( completed == null ) {
  8956 + s.mimeType = type;
  8957 + }
  8958 + return this;
  8959 + },
  8960 +
  8961 + // Status-dependent callbacks
  8962 + statusCode: function( map ) {
  8963 + var code;
  8964 + if ( map ) {
  8965 + if ( completed ) {
  8966 +
  8967 + // Execute the appropriate callbacks
  8968 + jqXHR.always( map[ jqXHR.status ] );
  8969 + } else {
  8970 +
  8971 + // Lazy-add the new callbacks in a way that preserves old ones
  8972 + for ( code in map ) {
  8973 + statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
  8974 + }
  8975 + }
  8976 + }
  8977 + return this;
  8978 + },
  8979 +
  8980 + // Cancel the request
  8981 + abort: function( statusText ) {
  8982 + var finalText = statusText || strAbort;
  8983 + if ( transport ) {
  8984 + transport.abort( finalText );
  8985 + }
  8986 + done( 0, finalText );
  8987 + return this;
  8988 + }
  8989 + };
  8990 +
  8991 + // Attach deferreds
  8992 + deferred.promise( jqXHR );
  8993 +
  8994 + // Add protocol if not provided (prefilters might expect it)
  8995 + // Handle falsy url in the settings object (#10093: consistency with old signature)
  8996 + // We also use the url parameter if available
  8997 + s.url = ( ( url || s.url || location.href ) + "" )
  8998 + .replace( rprotocol, location.protocol + "//" );
  8999 +
  9000 + // Alias method option to type as per ticket #12004
  9001 + s.type = options.method || options.type || s.method || s.type;
  9002 +
  9003 + // Extract dataTypes list
  9004 + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
  9005 +
  9006 + // A cross-domain request is in order when the origin doesn't match the current origin.
  9007 + if ( s.crossDomain == null ) {
  9008 + urlAnchor = document.createElement( "a" );
  9009 +
  9010 + // Support: IE <=8 - 11, Edge 12 - 13
  9011 + // IE throws exception on accessing the href property if url is malformed,
  9012 + // e.g. http://example.com:80x/
  9013 + try {
  9014 + urlAnchor.href = s.url;
  9015 +
  9016 + // Support: IE <=8 - 11 only
  9017 + // Anchor's host property isn't correctly set when s.url is relative
  9018 + urlAnchor.href = urlAnchor.href;
  9019 + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
  9020 + urlAnchor.protocol + "//" + urlAnchor.host;
  9021 + } catch ( e ) {
  9022 +
  9023 + // If there is an error parsing the URL, assume it is crossDomain,
  9024 + // it can be rejected by the transport if it is invalid
  9025 + s.crossDomain = true;
  9026 + }
  9027 + }
  9028 +
  9029 + // Convert data if not already a string
  9030 + if ( s.data && s.processData && typeof s.data !== "string" ) {
  9031 + s.data = jQuery.param( s.data, s.traditional );
  9032 + }
  9033 +
  9034 + // Apply prefilters
  9035 + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
  9036 +
  9037 + // If request was aborted inside a prefilter, stop there
  9038 + if ( completed ) {
  9039 + return jqXHR;
  9040 + }
  9041 +
  9042 + // We can fire global events as of now if asked to
  9043 + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
  9044 + fireGlobals = jQuery.event && s.global;
  9045 +
  9046 + // Watch for a new set of requests
  9047 + if ( fireGlobals && jQuery.active++ === 0 ) {
  9048 + jQuery.event.trigger( "ajaxStart" );
  9049 + }
  9050 +
  9051 + // Uppercase the type
  9052 + s.type = s.type.toUpperCase();
  9053 +
  9054 + // Determine if request has content
  9055 + s.hasContent = !rnoContent.test( s.type );
  9056 +
  9057 + // Save the URL in case we're toying with the If-Modified-Since
  9058 + // and/or If-None-Match header later on
  9059 + // Remove hash to simplify url manipulation
  9060 + cacheURL = s.url.replace( rhash, "" );
  9061 +
  9062 + // More options handling for requests with no content
  9063 + if ( !s.hasContent ) {
  9064 +
  9065 + // Remember the hash so we can put it back
  9066 + uncached = s.url.slice( cacheURL.length );
  9067 +
  9068 + // If data is available, append data to url
  9069 + if ( s.data ) {
  9070 + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
  9071 +
  9072 + // #9682: remove data so that it's not used in an eventual retry
  9073 + delete s.data;
  9074 + }
  9075 +
  9076 + // Add or update anti-cache param if needed
  9077 + if ( s.cache === false ) {
  9078 + cacheURL = cacheURL.replace( rantiCache, "$1" );
  9079 + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
  9080 + }
  9081 +
  9082 + // Put hash and anti-cache on the URL that will be requested (gh-1732)
  9083 + s.url = cacheURL + uncached;
  9084 +
  9085 + // Change '%20' to '+' if this is encoded form body content (gh-2658)
  9086 + } else if ( s.data && s.processData &&
  9087 + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
  9088 + s.data = s.data.replace( r20, "+" );
  9089 + }
  9090 +
  9091 + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  9092 + if ( s.ifModified ) {
  9093 + if ( jQuery.lastModified[ cacheURL ] ) {
  9094 + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
  9095 + }
  9096 + if ( jQuery.etag[ cacheURL ] ) {
  9097 + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
  9098 + }
  9099 + }
  9100 +
  9101 + // Set the correct header, if data is being sent
  9102 + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
  9103 + jqXHR.setRequestHeader( "Content-Type", s.contentType );
  9104 + }
  9105 +
  9106 + // Set the Accepts header for the server, depending on the dataType
  9107 + jqXHR.setRequestHeader(
  9108 + "Accept",
  9109 + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
  9110 + s.accepts[ s.dataTypes[ 0 ] ] +
  9111 + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
  9112 + s.accepts[ "*" ]
  9113 + );
  9114 +
  9115 + // Check for headers option
  9116 + for ( i in s.headers ) {
  9117 + jqXHR.setRequestHeader( i, s.headers[ i ] );
  9118 + }
  9119 +
  9120 + // Allow custom headers/mimetypes and early abort
  9121 + if ( s.beforeSend &&
  9122 + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
  9123 +
  9124 + // Abort if not done already and return
  9125 + return jqXHR.abort();
  9126 + }
  9127 +
  9128 + // Aborting is no longer a cancellation
  9129 + strAbort = "abort";
  9130 +
  9131 + // Install callbacks on deferreds
  9132 + completeDeferred.add( s.complete );
  9133 + jqXHR.done( s.success );
  9134 + jqXHR.fail( s.error );
  9135 +
  9136 + // Get transport
  9137 + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
  9138 +
  9139 + // If no transport, we auto-abort
  9140 + if ( !transport ) {
  9141 + done( -1, "No Transport" );
  9142 + } else {
  9143 + jqXHR.readyState = 1;
  9144 +
  9145 + // Send global event
  9146 + if ( fireGlobals ) {
  9147 + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
  9148 + }
  9149 +
  9150 + // If request was aborted inside ajaxSend, stop there
  9151 + if ( completed ) {
  9152 + return jqXHR;
  9153 + }
  9154 +
  9155 + // Timeout
  9156 + if ( s.async && s.timeout > 0 ) {
  9157 + timeoutTimer = window.setTimeout( function() {
  9158 + jqXHR.abort( "timeout" );
  9159 + }, s.timeout );
  9160 + }
  9161 +
  9162 + try {
  9163 + completed = false;
  9164 + transport.send( requestHeaders, done );
  9165 + } catch ( e ) {
  9166 +
  9167 + // Rethrow post-completion exceptions
  9168 + if ( completed ) {
  9169 + throw e;
  9170 + }
  9171 +
  9172 + // Propagate others as results
  9173 + done( -1, e );
  9174 + }
  9175 + }
  9176 +
  9177 + // Callback for when everything is done
  9178 + function done( status, nativeStatusText, responses, headers ) {
  9179 + var isSuccess, success, error, response, modified,
  9180 + statusText = nativeStatusText;
  9181 +
  9182 + // Ignore repeat invocations
  9183 + if ( completed ) {
  9184 + return;
  9185 + }
  9186 +
  9187 + completed = true;
  9188 +
  9189 + // Clear timeout if it exists
  9190 + if ( timeoutTimer ) {
  9191 + window.clearTimeout( timeoutTimer );
  9192 + }
  9193 +
  9194 + // Dereference transport for early garbage collection
  9195 + // (no matter how long the jqXHR object will be used)
  9196 + transport = undefined;
  9197 +
  9198 + // Cache response headers
  9199 + responseHeadersString = headers || "";
  9200 +
  9201 + // Set readyState
  9202 + jqXHR.readyState = status > 0 ? 4 : 0;
  9203 +
  9204 + // Determine if successful
  9205 + isSuccess = status >= 200 && status < 300 || status === 304;
  9206 +
  9207 + // Get response data
  9208 + if ( responses ) {
  9209 + response = ajaxHandleResponses( s, jqXHR, responses );
  9210 + }
  9211 +
  9212 + // Convert no matter what (that way responseXXX fields are always set)
  9213 + response = ajaxConvert( s, response, jqXHR, isSuccess );
  9214 +
  9215 + // If successful, handle type chaining
  9216 + if ( isSuccess ) {
  9217 +
  9218 + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  9219 + if ( s.ifModified ) {
  9220 + modified = jqXHR.getResponseHeader( "Last-Modified" );
  9221 + if ( modified ) {
  9222 + jQuery.lastModified[ cacheURL ] = modified;
  9223 + }
  9224 + modified = jqXHR.getResponseHeader( "etag" );
  9225 + if ( modified ) {
  9226 + jQuery.etag[ cacheURL ] = modified;
  9227 + }
  9228 + }
  9229 +
  9230 + // if no content
  9231 + if ( status === 204 || s.type === "HEAD" ) {
  9232 + statusText = "nocontent";
  9233 +
  9234 + // if not modified
  9235 + } else if ( status === 304 ) {
  9236 + statusText = "notmodified";
  9237 +
  9238 + // If we have data, let's convert it
  9239 + } else {
  9240 + statusText = response.state;
  9241 + success = response.data;
  9242 + error = response.error;
  9243 + isSuccess = !error;
  9244 + }
  9245 + } else {
  9246 +
  9247 + // Extract error from statusText and normalize for non-aborts
  9248 + error = statusText;
  9249 + if ( status || !statusText ) {
  9250 + statusText = "error";
  9251 + if ( status < 0 ) {
  9252 + status = 0;
  9253 + }
  9254 + }
  9255 + }
  9256 +
  9257 + // Set data for the fake xhr object
  9258 + jqXHR.status = status;
  9259 + jqXHR.statusText = ( nativeStatusText || statusText ) + "";
  9260 +
  9261 + // Success/Error
  9262 + if ( isSuccess ) {
  9263 + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
  9264 + } else {
  9265 + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
  9266 + }
  9267 +
  9268 + // Status-dependent callbacks
  9269 + jqXHR.statusCode( statusCode );
  9270 + statusCode = undefined;
  9271 +
  9272 + if ( fireGlobals ) {
  9273 + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
  9274 + [ jqXHR, s, isSuccess ? success : error ] );
  9275 + }
  9276 +
  9277 + // Complete
  9278 + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
  9279 +
  9280 + if ( fireGlobals ) {
  9281 + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
  9282 +
  9283 + // Handle the global AJAX counter
  9284 + if ( !( --jQuery.active ) ) {
  9285 + jQuery.event.trigger( "ajaxStop" );
  9286 + }
  9287 + }
  9288 + }
  9289 +
  9290 + return jqXHR;
  9291 + },
  9292 +
  9293 + getJSON: function( url, data, callback ) {
  9294 + return jQuery.get( url, data, callback, "json" );
  9295 + },
  9296 +
  9297 + getScript: function( url, callback ) {
  9298 + return jQuery.get( url, undefined, callback, "script" );
  9299 + }
  9300 +} );
  9301 +
  9302 +jQuery.each( [ "get", "post" ], function( i, method ) {
  9303 + jQuery[ method ] = function( url, data, callback, type ) {
  9304 +
  9305 + // Shift arguments if data argument was omitted
  9306 + if ( jQuery.isFunction( data ) ) {
  9307 + type = type || callback;
  9308 + callback = data;
  9309 + data = undefined;
  9310 + }
  9311 +
  9312 + // The url can be an options object (which then must have .url)
  9313 + return jQuery.ajax( jQuery.extend( {
  9314 + url: url,
  9315 + type: method,
  9316 + dataType: type,
  9317 + data: data,
  9318 + success: callback
  9319 + }, jQuery.isPlainObject( url ) && url ) );
  9320 + };
  9321 +} );
  9322 +
  9323 +
  9324 +jQuery._evalUrl = function( url ) {
  9325 + return jQuery.ajax( {
  9326 + url: url,
  9327 +
  9328 + // Make this explicit, since user can override this through ajaxSetup (#11264)
  9329 + type: "GET",
  9330 + dataType: "script",
  9331 + cache: true,
  9332 + async: false,
  9333 + global: false,
  9334 + "throws": true
  9335 + } );
  9336 +};
  9337 +
  9338 +
  9339 +jQuery.fn.extend( {
  9340 + wrapAll: function( html ) {
  9341 + var wrap;
  9342 +
  9343 + if ( this[ 0 ] ) {
  9344 + if ( jQuery.isFunction( html ) ) {
  9345 + html = html.call( this[ 0 ] );
  9346 + }
  9347 +
  9348 + // The elements to wrap the target around
  9349 + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
  9350 +
  9351 + if ( this[ 0 ].parentNode ) {
  9352 + wrap.insertBefore( this[ 0 ] );
  9353 + }
  9354 +
  9355 + wrap.map( function() {
  9356 + var elem = this;
  9357 +
  9358 + while ( elem.firstElementChild ) {
  9359 + elem = elem.firstElementChild;
  9360 + }
  9361 +
  9362 + return elem;
  9363 + } ).append( this );
  9364 + }
  9365 +
  9366 + return this;
  9367 + },
  9368 +
  9369 + wrapInner: function( html ) {
  9370 + if ( jQuery.isFunction( html ) ) {
  9371 + return this.each( function( i ) {
  9372 + jQuery( this ).wrapInner( html.call( this, i ) );
  9373 + } );
  9374 + }
  9375 +
  9376 + return this.each( function() {
  9377 + var self = jQuery( this ),
  9378 + contents = self.contents();
  9379 +
  9380 + if ( contents.length ) {
  9381 + contents.wrapAll( html );
  9382 +
  9383 + } else {
  9384 + self.append( html );
  9385 + }
  9386 + } );
  9387 + },
  9388 +
  9389 + wrap: function( html ) {
  9390 + var isFunction = jQuery.isFunction( html );
  9391 +
  9392 + return this.each( function( i ) {
  9393 + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
  9394 + } );
  9395 + },
  9396 +
  9397 + unwrap: function( selector ) {
  9398 + this.parent( selector ).not( "body" ).each( function() {
  9399 + jQuery( this ).replaceWith( this.childNodes );
  9400 + } );
  9401 + return this;
  9402 + }
  9403 +} );
  9404 +
  9405 +
  9406 +jQuery.expr.pseudos.hidden = function( elem ) {
  9407 + return !jQuery.expr.pseudos.visible( elem );
  9408 +};
  9409 +jQuery.expr.pseudos.visible = function( elem ) {
  9410 + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
  9411 +};
  9412 +
  9413 +
  9414 +
  9415 +
  9416 +jQuery.ajaxSettings.xhr = function() {
  9417 + try {
  9418 + return new window.XMLHttpRequest();
  9419 + } catch ( e ) {}
  9420 +};
  9421 +
  9422 +var xhrSuccessStatus = {
  9423 +
  9424 + // File protocol always yields status code 0, assume 200
  9425 + 0: 200,
  9426 +
  9427 + // Support: IE <=9 only
  9428 + // #1450: sometimes IE returns 1223 when it should be 204
  9429 + 1223: 204
  9430 + },
  9431 + xhrSupported = jQuery.ajaxSettings.xhr();
  9432 +
  9433 +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
  9434 +support.ajax = xhrSupported = !!xhrSupported;
  9435 +
  9436 +jQuery.ajaxTransport( function( options ) {
  9437 + var callback, errorCallback;
  9438 +
  9439 + // Cross domain only allowed if supported through XMLHttpRequest
  9440 + if ( support.cors || xhrSupported && !options.crossDomain ) {
  9441 + return {
  9442 + send: function( headers, complete ) {
  9443 + var i,
  9444 + xhr = options.xhr();
  9445 +
  9446 + xhr.open(
  9447 + options.type,
  9448 + options.url,
  9449 + options.async,
  9450 + options.username,
  9451 + options.password
  9452 + );
  9453 +
  9454 + // Apply custom fields if provided
  9455 + if ( options.xhrFields ) {
  9456 + for ( i in options.xhrFields ) {
  9457 + xhr[ i ] = options.xhrFields[ i ];
  9458 + }
  9459 + }
  9460 +
  9461 + // Override mime type if needed
  9462 + if ( options.mimeType && xhr.overrideMimeType ) {
  9463 + xhr.overrideMimeType( options.mimeType );
  9464 + }
  9465 +
  9466 + // X-Requested-With header
  9467 + // For cross-domain requests, seeing as conditions for a preflight are
  9468 + // akin to a jigsaw puzzle, we simply never set it to be sure.
  9469 + // (it can always be set on a per-request basis or even using ajaxSetup)
  9470 + // For same-domain requests, won't change header if already provided.
  9471 + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
  9472 + headers[ "X-Requested-With" ] = "XMLHttpRequest";
  9473 + }
  9474 +
  9475 + // Set headers
  9476 + for ( i in headers ) {
  9477 + xhr.setRequestHeader( i, headers[ i ] );
  9478 + }
  9479 +
  9480 + // Callback
  9481 + callback = function( type ) {
  9482 + return function() {
  9483 + if ( callback ) {
  9484 + callback = errorCallback = xhr.onload =
  9485 + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
  9486 +
  9487 + if ( type === "abort" ) {
  9488 + xhr.abort();
  9489 + } else if ( type === "error" ) {
  9490 +
  9491 + // Support: IE <=9 only
  9492 + // On a manual native abort, IE9 throws
  9493 + // errors on any property access that is not readyState
  9494 + if ( typeof xhr.status !== "number" ) {
  9495 + complete( 0, "error" );
  9496 + } else {
  9497 + complete(
  9498 +
  9499 + // File: protocol always yields status 0; see #8605, #14207
  9500 + xhr.status,
  9501 + xhr.statusText
  9502 + );
  9503 + }
  9504 + } else {
  9505 + complete(
  9506 + xhrSuccessStatus[ xhr.status ] || xhr.status,
  9507 + xhr.statusText,
  9508 +
  9509 + // Support: IE <=9 only
  9510 + // IE9 has no XHR2 but throws on binary (trac-11426)
  9511 + // For XHR2 non-text, let the caller handle it (gh-2498)
  9512 + ( xhr.responseType || "text" ) !== "text" ||
  9513 + typeof xhr.responseText !== "string" ?
  9514 + { binary: xhr.response } :
  9515 + { text: xhr.responseText },
  9516 + xhr.getAllResponseHeaders()
  9517 + );
  9518 + }
  9519 + }
  9520 + };
  9521 + };
  9522 +
  9523 + // Listen to events
  9524 + xhr.onload = callback();
  9525 + errorCallback = xhr.onerror = callback( "error" );
  9526 +
  9527 + // Support: IE 9 only
  9528 + // Use onreadystatechange to replace onabort
  9529 + // to handle uncaught aborts
  9530 + if ( xhr.onabort !== undefined ) {
  9531 + xhr.onabort = errorCallback;
  9532 + } else {
  9533 + xhr.onreadystatechange = function() {
  9534 +
  9535 + // Check readyState before timeout as it changes
  9536 + if ( xhr.readyState === 4 ) {
  9537 +
  9538 + // Allow onerror to be called first,
  9539 + // but that will not handle a native abort
  9540 + // Also, save errorCallback to a variable
  9541 + // as xhr.onerror cannot be accessed
  9542 + window.setTimeout( function() {
  9543 + if ( callback ) {
  9544 + errorCallback();
  9545 + }
  9546 + } );
  9547 + }
  9548 + };
  9549 + }
  9550 +
  9551 + // Create the abort callback
  9552 + callback = callback( "abort" );
  9553 +
  9554 + try {
  9555 +
  9556 + // Do send the request (this may raise an exception)
  9557 + xhr.send( options.hasContent && options.data || null );
  9558 + } catch ( e ) {
  9559 +
  9560 + // #14683: Only rethrow if this hasn't been notified as an error yet
  9561 + if ( callback ) {
  9562 + throw e;
  9563 + }
  9564 + }
  9565 + },
  9566 +
  9567 + abort: function() {
  9568 + if ( callback ) {
  9569 + callback();
  9570 + }
  9571 + }
  9572 + };
  9573 + }
  9574 +} );
  9575 +
  9576 +
  9577 +
  9578 +
  9579 +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
  9580 +jQuery.ajaxPrefilter( function( s ) {
  9581 + if ( s.crossDomain ) {
  9582 + s.contents.script = false;
  9583 + }
  9584 +} );
  9585 +
  9586 +// Install script dataType
  9587 +jQuery.ajaxSetup( {
  9588 + accepts: {
  9589 + script: "text/javascript, application/javascript, " +
  9590 + "application/ecmascript, application/x-ecmascript"
  9591 + },
  9592 + contents: {
  9593 + script: /\b(?:java|ecma)script\b/
  9594 + },
  9595 + converters: {
  9596 + "text script": function( text ) {
  9597 + jQuery.globalEval( text );
  9598 + return text;
  9599 + }
  9600 + }
  9601 +} );
  9602 +
  9603 +// Handle cache's special case and crossDomain
  9604 +jQuery.ajaxPrefilter( "script", function( s ) {
  9605 + if ( s.cache === undefined ) {
  9606 + s.cache = false;
  9607 + }
  9608 + if ( s.crossDomain ) {
  9609 + s.type = "GET";
  9610 + }
  9611 +} );
  9612 +
  9613 +// Bind script tag hack transport
  9614 +jQuery.ajaxTransport( "script", function( s ) {
  9615 +
  9616 + // This transport only deals with cross domain requests
  9617 + if ( s.crossDomain ) {
  9618 + var script, callback;
  9619 + return {
  9620 + send: function( _, complete ) {
  9621 + script = jQuery( "<script>" ).prop( {
  9622 + charset: s.scriptCharset,
  9623 + src: s.url
  9624 + } ).on(
  9625 + "load error",
  9626 + callback = function( evt ) {
  9627 + script.remove();
  9628 + callback = null;
  9629 + if ( evt ) {
  9630 + complete( evt.type === "error" ? 404 : 200, evt.type );
  9631 + }
  9632 + }
  9633 + );
  9634 +
  9635 + // Use native DOM manipulation to avoid our domManip AJAX trickery
  9636 + document.head.appendChild( script[ 0 ] );
  9637 + },
  9638 + abort: function() {
  9639 + if ( callback ) {
  9640 + callback();
  9641 + }
  9642 + }
  9643 + };
  9644 + }
  9645 +} );
  9646 +
  9647 +
  9648 +
  9649 +
  9650 +var oldCallbacks = [],
  9651 + rjsonp = /(=)\?(?=&|$)|\?\?/;
  9652 +
  9653 +// Default jsonp settings
  9654 +jQuery.ajaxSetup( {
  9655 + jsonp: "callback",
  9656 + jsonpCallback: function() {
  9657 + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
  9658 + this[ callback ] = true;
  9659 + return callback;
  9660 + }
  9661 +} );
  9662 +
  9663 +// Detect, normalize options and install callbacks for jsonp requests
  9664 +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
  9665 +
  9666 + var callbackName, overwritten, responseContainer,
  9667 + jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
  9668 + "url" :
  9669 + typeof s.data === "string" &&
  9670 + ( s.contentType || "" )
  9671 + .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
  9672 + rjsonp.test( s.data ) && "data"
  9673 + );
  9674 +
  9675 + // Handle iff the expected data type is "jsonp" or we have a parameter to set
  9676 + if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
  9677 +
  9678 + // Get callback name, remembering preexisting value associated with it
  9679 + callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
  9680 + s.jsonpCallback() :
  9681 + s.jsonpCallback;
  9682 +
  9683 + // Insert callback into url or form data
  9684 + if ( jsonProp ) {
  9685 + s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
  9686 + } else if ( s.jsonp !== false ) {
  9687 + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
  9688 + }
  9689 +
  9690 + // Use data converter to retrieve json after script execution
  9691 + s.converters[ "script json" ] = function() {
  9692 + if ( !responseContainer ) {
  9693 + jQuery.error( callbackName + " was not called" );
  9694 + }
  9695 + return responseContainer[ 0 ];
  9696 + };
  9697 +
  9698 + // Force json dataType
  9699 + s.dataTypes[ 0 ] = "json";
  9700 +
  9701 + // Install callback
  9702 + overwritten = window[ callbackName ];
  9703 + window[ callbackName ] = function() {
  9704 + responseContainer = arguments;
  9705 + };
  9706 +
  9707 + // Clean-up function (fires after converters)
  9708 + jqXHR.always( function() {
  9709 +
  9710 + // If previous value didn't exist - remove it
  9711 + if ( overwritten === undefined ) {
  9712 + jQuery( window ).removeProp( callbackName );
  9713 +
  9714 + // Otherwise restore preexisting value
  9715 + } else {
  9716 + window[ callbackName ] = overwritten;
  9717 + }
  9718 +
  9719 + // Save back as free
  9720 + if ( s[ callbackName ] ) {
  9721 +
  9722 + // Make sure that re-using the options doesn't screw things around
  9723 + s.jsonpCallback = originalSettings.jsonpCallback;
  9724 +
  9725 + // Save the callback name for future use
  9726 + oldCallbacks.push( callbackName );
  9727 + }
  9728 +
  9729 + // Call if it was a function and we have a response
  9730 + if ( responseContainer && jQuery.isFunction( overwritten ) ) {
  9731 + overwritten( responseContainer[ 0 ] );
  9732 + }
  9733 +
  9734 + responseContainer = overwritten = undefined;
  9735 + } );
  9736 +
  9737 + // Delegate to script
  9738 + return "script";
  9739 + }
  9740 +} );
  9741 +
  9742 +
  9743 +
  9744 +
  9745 +// Support: Safari 8 only
  9746 +// In Safari 8 documents created via document.implementation.createHTMLDocument
  9747 +// collapse sibling forms: the second one becomes a child of the first one.
  9748 +// Because of that, this security measure has to be disabled in Safari 8.
  9749 +// https://bugs.webkit.org/show_bug.cgi?id=137337
  9750 +support.createHTMLDocument = ( function() {
  9751 + var body = document.implementation.createHTMLDocument( "" ).body;
  9752 + body.innerHTML = "<form></form><form></form>";
  9753 + return body.childNodes.length === 2;
  9754 +} )();
  9755 +
  9756 +
  9757 +// Argument "data" should be string of html
  9758 +// context (optional): If specified, the fragment will be created in this context,
  9759 +// defaults to document
  9760 +// keepScripts (optional): If true, will include scripts passed in the html string
  9761 +jQuery.parseHTML = function( data, context, keepScripts ) {
  9762 + if ( typeof data !== "string" ) {
  9763 + return [];
  9764 + }
  9765 + if ( typeof context === "boolean" ) {
  9766 + keepScripts = context;
  9767 + context = false;
  9768 + }
  9769 +
  9770 + var base, parsed, scripts;
  9771 +
  9772 + if ( !context ) {
  9773 +
  9774 + // Stop scripts or inline event handlers from being executed immediately
  9775 + // by using document.implementation
  9776 + if ( support.createHTMLDocument ) {
  9777 + context = document.implementation.createHTMLDocument( "" );
  9778 +
  9779 + // Set the base href for the created document
  9780 + // so any parsed elements with URLs
  9781 + // are based on the document's URL (gh-2965)
  9782 + base = context.createElement( "base" );
  9783 + base.href = document.location.href;
  9784 + context.head.appendChild( base );
  9785 + } else {
  9786 + context = document;
  9787 + }
  9788 + }
  9789 +
  9790 + parsed = rsingleTag.exec( data );
  9791 + scripts = !keepScripts && [];
  9792 +
  9793 + // Single tag
  9794 + if ( parsed ) {
  9795 + return [ context.createElement( parsed[ 1 ] ) ];
  9796 + }
  9797 +
  9798 + parsed = buildFragment( [ data ], context, scripts );
  9799 +
  9800 + if ( scripts && scripts.length ) {
  9801 + jQuery( scripts ).remove();
  9802 + }
  9803 +
  9804 + return jQuery.merge( [], parsed.childNodes );
  9805 +};
  9806 +
  9807 +
  9808 +/**
  9809 + * Load a url into a page
  9810 + */
  9811 +jQuery.fn.load = function( url, params, callback ) {
  9812 + var selector, type, response,
  9813 + self = this,
  9814 + off = url.indexOf( " " );
  9815 +
  9816 + if ( off > -1 ) {
  9817 + selector = stripAndCollapse( url.slice( off ) );
  9818 + url = url.slice( 0, off );
  9819 + }
  9820 +
  9821 + // If it's a function
  9822 + if ( jQuery.isFunction( params ) ) {
  9823 +
  9824 + // We assume that it's the callback
  9825 + callback = params;
  9826 + params = undefined;
  9827 +
  9828 + // Otherwise, build a param string
  9829 + } else if ( params && typeof params === "object" ) {
  9830 + type = "POST";
  9831 + }
  9832 +
  9833 + // If we have elements to modify, make the request
  9834 + if ( self.length > 0 ) {
  9835 + jQuery.ajax( {
  9836 + url: url,
  9837 +
  9838 + // If "type" variable is undefined, then "GET" method will be used.
  9839 + // Make value of this field explicit since
  9840 + // user can override it through ajaxSetup method
  9841 + type: type || "GET",
  9842 + dataType: "html",
  9843 + data: params
  9844 + } ).done( function( responseText ) {
  9845 +
  9846 + // Save response for use in complete callback
  9847 + response = arguments;
  9848 +
  9849 + self.html( selector ?
  9850 +
  9851 + // If a selector was specified, locate the right elements in a dummy div
  9852 + // Exclude scripts to avoid IE 'Permission Denied' errors
  9853 + jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
  9854 +
  9855 + // Otherwise use the full result
  9856 + responseText );
  9857 +
  9858 + // If the request succeeds, this function gets "data", "status", "jqXHR"
  9859 + // but they are ignored because response was set above.
  9860 + // If it fails, this function gets "jqXHR", "status", "error"
  9861 + } ).always( callback && function( jqXHR, status ) {
  9862 + self.each( function() {
  9863 + callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
  9864 + } );
  9865 + } );
  9866 + }
  9867 +
  9868 + return this;
  9869 +};
  9870 +
  9871 +
  9872 +
  9873 +
  9874 +// Attach a bunch of functions for handling common AJAX events
  9875 +jQuery.each( [
  9876 + "ajaxStart",
  9877 + "ajaxStop",
  9878 + "ajaxComplete",
  9879 + "ajaxError",
  9880 + "ajaxSuccess",
  9881 + "ajaxSend"
  9882 +], function( i, type ) {
  9883 + jQuery.fn[ type ] = function( fn ) {
  9884 + return this.on( type, fn );
  9885 + };
  9886 +} );
  9887 +
  9888 +
  9889 +
  9890 +
  9891 +jQuery.expr.pseudos.animated = function( elem ) {
  9892 + return jQuery.grep( jQuery.timers, function( fn ) {
  9893 + return elem === fn.elem;
  9894 + } ).length;
  9895 +};
  9896 +
  9897 +
  9898 +
  9899 +
  9900 +jQuery.offset = {
  9901 + setOffset: function( elem, options, i ) {
  9902 + var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
  9903 + position = jQuery.css( elem, "position" ),
  9904 + curElem = jQuery( elem ),
  9905 + props = {};
  9906 +
  9907 + // Set position first, in-case top/left are set even on static elem
  9908 + if ( position === "static" ) {
  9909 + elem.style.position = "relative";
  9910 + }
  9911 +
  9912 + curOffset = curElem.offset();
  9913 + curCSSTop = jQuery.css( elem, "top" );
  9914 + curCSSLeft = jQuery.css( elem, "left" );
  9915 + calculatePosition = ( position === "absolute" || position === "fixed" ) &&
  9916 + ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
  9917 +
  9918 + // Need to be able to calculate position if either
  9919 + // top or left is auto and position is either absolute or fixed
  9920 + if ( calculatePosition ) {
  9921 + curPosition = curElem.position();
  9922 + curTop = curPosition.top;
  9923 + curLeft = curPosition.left;
  9924 +
  9925 + } else {
  9926 + curTop = parseFloat( curCSSTop ) || 0;
  9927 + curLeft = parseFloat( curCSSLeft ) || 0;
  9928 + }
  9929 +
  9930 + if ( jQuery.isFunction( options ) ) {
  9931 +
  9932 + // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
  9933 + options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
  9934 + }
  9935 +
  9936 + if ( options.top != null ) {
  9937 + props.top = ( options.top - curOffset.top ) + curTop;
  9938 + }
  9939 + if ( options.left != null ) {
  9940 + props.left = ( options.left - curOffset.left ) + curLeft;
  9941 + }
  9942 +
  9943 + if ( "using" in options ) {
  9944 + options.using.call( elem, props );
  9945 +
  9946 + } else {
  9947 + curElem.css( props );
  9948 + }
  9949 + }
  9950 +};
  9951 +
  9952 +jQuery.fn.extend( {
  9953 + offset: function( options ) {
  9954 +
  9955 + // Preserve chaining for setter
  9956 + if ( arguments.length ) {
  9957 + return options === undefined ?
  9958 + this :
  9959 + this.each( function( i ) {
  9960 + jQuery.offset.setOffset( this, options, i );
  9961 + } );
  9962 + }
  9963 +
  9964 + var doc, docElem, rect, win,
  9965 + elem = this[ 0 ];
  9966 +
  9967 + if ( !elem ) {
  9968 + return;
  9969 + }
  9970 +
  9971 + // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
  9972 + // Support: IE <=11 only
  9973 + // Running getBoundingClientRect on a
  9974 + // disconnected node in IE throws an error
  9975 + if ( !elem.getClientRects().length ) {
  9976 + return { top: 0, left: 0 };
  9977 + }
  9978 +
  9979 + rect = elem.getBoundingClientRect();
  9980 +
  9981 + doc = elem.ownerDocument;
  9982 + docElem = doc.documentElement;
  9983 + win = doc.defaultView;
  9984 +
  9985 + return {
  9986 + top: rect.top + win.pageYOffset - docElem.clientTop,
  9987 + left: rect.left + win.pageXOffset - docElem.clientLeft
  9988 + };
  9989 + },
  9990 +
  9991 + position: function() {
  9992 + if ( !this[ 0 ] ) {
  9993 + return;
  9994 + }
  9995 +
  9996 + var offsetParent, offset,
  9997 + elem = this[ 0 ],
  9998 + parentOffset = { top: 0, left: 0 };
  9999 +
  10000 + // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
  10001 + // because it is its only offset parent
  10002 + if ( jQuery.css( elem, "position" ) === "fixed" ) {
  10003 +
  10004 + // Assume getBoundingClientRect is there when computed position is fixed
  10005 + offset = elem.getBoundingClientRect();
  10006 +
  10007 + } else {
  10008 +
  10009 + // Get *real* offsetParent
  10010 + offsetParent = this.offsetParent();
  10011 +
  10012 + // Get correct offsets
  10013 + offset = this.offset();
  10014 + if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
  10015 + parentOffset = offsetParent.offset();
  10016 + }
  10017 +
  10018 + // Add offsetParent borders
  10019 + parentOffset = {
  10020 + top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
  10021 + left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
  10022 + };
  10023 + }
  10024 +
  10025 + // Subtract parent offsets and element margins
  10026 + return {
  10027 + top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
  10028 + left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
  10029 + };
  10030 + },
  10031 +
  10032 + // This method will return documentElement in the following cases:
  10033 + // 1) For the element inside the iframe without offsetParent, this method will return
  10034 + // documentElement of the parent window
  10035 + // 2) For the hidden or detached element
  10036 + // 3) For body or html element, i.e. in case of the html node - it will return itself
  10037 + //
  10038 + // but those exceptions were never presented as a real life use-cases
  10039 + // and might be considered as more preferable results.
  10040 + //
  10041 + // This logic, however, is not guaranteed and can change at any point in the future
  10042 + offsetParent: function() {
  10043 + return this.map( function() {
  10044 + var offsetParent = this.offsetParent;
  10045 +
  10046 + while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
  10047 + offsetParent = offsetParent.offsetParent;
  10048 + }
  10049 +
  10050 + return offsetParent || documentElement;
  10051 + } );
  10052 + }
  10053 +} );
  10054 +
  10055 +// Create scrollLeft and scrollTop methods
  10056 +jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
  10057 + var top = "pageYOffset" === prop;
  10058 +
  10059 + jQuery.fn[ method ] = function( val ) {
  10060 + return access( this, function( elem, method, val ) {
  10061 +
  10062 + // Coalesce documents and windows
  10063 + var win;
  10064 + if ( jQuery.isWindow( elem ) ) {
  10065 + win = elem;
  10066 + } else if ( elem.nodeType === 9 ) {
  10067 + win = elem.defaultView;
  10068 + }
  10069 +
  10070 + if ( val === undefined ) {
  10071 + return win ? win[ prop ] : elem[ method ];
  10072 + }
  10073 +
  10074 + if ( win ) {
  10075 + win.scrollTo(
  10076 + !top ? val : win.pageXOffset,
  10077 + top ? val : win.pageYOffset
  10078 + );
  10079 +
  10080 + } else {
  10081 + elem[ method ] = val;
  10082 + }
  10083 + }, method, val, arguments.length );
  10084 + };
  10085 +} );
  10086 +
  10087 +// Support: Safari <=7 - 9.1, Chrome <=37 - 49
  10088 +// Add the top/left cssHooks using jQuery.fn.position
  10089 +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
  10090 +// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
  10091 +// getComputedStyle returns percent when specified for top/left/bottom/right;
  10092 +// rather than make the css module depend on the offset module, just check for it here
  10093 +jQuery.each( [ "top", "left" ], function( i, prop ) {
  10094 + jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
  10095 + function( elem, computed ) {
  10096 + if ( computed ) {
  10097 + computed = curCSS( elem, prop );
  10098 +
  10099 + // If curCSS returns percentage, fallback to offset
  10100 + return rnumnonpx.test( computed ) ?
  10101 + jQuery( elem ).position()[ prop ] + "px" :
  10102 + computed;
  10103 + }
  10104 + }
  10105 + );
  10106 +} );
  10107 +
  10108 +
  10109 +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
  10110 +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
  10111 + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
  10112 + function( defaultExtra, funcName ) {
  10113 +
  10114 + // Margin is only for outerHeight, outerWidth
  10115 + jQuery.fn[ funcName ] = function( margin, value ) {
  10116 + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
  10117 + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
  10118 +
  10119 + return access( this, function( elem, type, value ) {
  10120 + var doc;
  10121 +
  10122 + if ( jQuery.isWindow( elem ) ) {
  10123 +
  10124 + // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
  10125 + return funcName.indexOf( "outer" ) === 0 ?
  10126 + elem[ "inner" + name ] :
  10127 + elem.document.documentElement[ "client" + name ];
  10128 + }
  10129 +
  10130 + // Get document width or height
  10131 + if ( elem.nodeType === 9 ) {
  10132 + doc = elem.documentElement;
  10133 +
  10134 + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
  10135 + // whichever is greatest
  10136 + return Math.max(
  10137 + elem.body[ "scroll" + name ], doc[ "scroll" + name ],
  10138 + elem.body[ "offset" + name ], doc[ "offset" + name ],
  10139 + doc[ "client" + name ]
  10140 + );
  10141 + }
  10142 +
  10143 + return value === undefined ?
  10144 +
  10145 + // Get width or height on the element, requesting but not forcing parseFloat
  10146 + jQuery.css( elem, type, extra ) :
  10147 +
  10148 + // Set width or height on the element
  10149 + jQuery.style( elem, type, value, extra );
  10150 + }, type, chainable ? margin : undefined, chainable );
  10151 + };
  10152 + } );
  10153 +} );
  10154 +
  10155 +
  10156 +jQuery.fn.extend( {
  10157 +
  10158 + bind: function( types, data, fn ) {
  10159 + return this.on( types, null, data, fn );
  10160 + },
  10161 + unbind: function( types, fn ) {
  10162 + return this.off( types, null, fn );
  10163 + },
  10164 +
  10165 + delegate: function( selector, types, data, fn ) {
  10166 + return this.on( types, selector, data, fn );
  10167 + },
  10168 + undelegate: function( selector, types, fn ) {
  10169 +
  10170 + // ( namespace ) or ( selector, types [, fn] )
  10171 + return arguments.length === 1 ?
  10172 + this.off( selector, "**" ) :
  10173 + this.off( types, selector || "**", fn );
  10174 + },
  10175 + holdReady: function( hold ) {
  10176 + if ( hold ) {
  10177 + jQuery.readyWait++;
  10178 + } else {
  10179 + jQuery.ready( true );
  10180 + }
  10181 + }
  10182 +} );
  10183 +
  10184 +jQuery.isArray = Array.isArray;
  10185 +jQuery.parseJSON = JSON.parse;
  10186 +jQuery.nodeName = nodeName;
  10187 +
  10188 +
  10189 +
  10190 +
  10191 +// Register as a named AMD module, since jQuery can be concatenated with other
  10192 +// files that may use define, but not via a proper concatenation script that
  10193 +// understands anonymous AMD modules. A named AMD is safest and most robust
  10194 +// way to register. Lowercase jquery is used because AMD module names are
  10195 +// derived from file names, and jQuery is normally delivered in a lowercase
  10196 +// file name. Do this after creating the global so that if an AMD module wants
  10197 +// to call noConflict to hide this version of jQuery, it will work.
  10198 +
  10199 +// Note that for maximum portability, libraries that are not jQuery should
  10200 +// declare themselves as anonymous modules, and avoid setting a global if an
  10201 +// AMD loader is present. jQuery is a special case. For more information, see
  10202 +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
  10203 +
  10204 +if ( typeof define === "function" && define.amd ) {
  10205 + define( "jquery", [], function() {
  10206 + return jQuery;
  10207 + } );
  10208 +}
  10209 +
  10210 +
  10211 +
  10212 +
  10213 +var
  10214 +
  10215 + // Map over jQuery in case of overwrite
  10216 + _jQuery = window.jQuery,
  10217 +
  10218 + // Map over the $ in case of overwrite
  10219 + _$ = window.$;
  10220 +
  10221 +jQuery.noConflict = function( deep ) {
  10222 + if ( window.$ === jQuery ) {
  10223 + window.$ = _$;
  10224 + }
  10225 +
  10226 + if ( deep && window.jQuery === jQuery ) {
  10227 + window.jQuery = _jQuery;
  10228 + }
  10229 +
  10230 + return jQuery;
  10231 +};
  10232 +
  10233 +// Expose jQuery and $ identifiers, even in AMD
  10234 +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
  10235 +// and CommonJS for browser emulators (#13566)
  10236 +if ( !noGlobal ) {
  10237 + window.jQuery = window.$ = jQuery;
  10238 +}
  10239 +
  10240 +
  10241 +
  10242 +
  10243 +return jQuery;
  10244 +} );
... ...