Advertisement
Rupture

"type.indexOf is not a function" demo, internal jQuery

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