]> source.dussan.org Git - sonarqube.git/commitdiff
update jquery to 2.x
authorStas Vilchik <vilchiks@gmail.com>
Thu, 11 Jun 2015 07:43:59 +0000 (09:43 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Thu, 11 Jun 2015 10:58:02 +0000 (12:58 +0200)
server/sonar-web/src/main/js/libs/third-party/jquery.js

index 197ac3bfcfe3b456c6fb991268097ce8a895ddcd..eed17778c688271208406367c0c1681d81feca6f 100644 (file)
@@ -1,13 +1,27 @@
+/*!
+ * jQuery JavaScript Library v2.1.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-04-28T16:01Z
+ */
+
 (function( global, factory ) {
 
        if ( typeof module === "object" && typeof module.exports === "object" ) {
-               // For CommonJS and CommonJS-like environments where a proper window is present,
-               // execute the factory and get jQuery
-               // For environments that do not inherently posses a window with a document
-               // (such as Node.js), expose a jQuery-making factory as module.exports
-               // This accentuates the need for the creation of a real window
+               // For CommonJS and CommonJS-like environments where a proper `window`
+               // is present, execute the factory and get jQuery.
+               // For environments that do not have a `window` with a `document`
+               // (such as Node.js), expose a factory as module.exports.
+               // This accentuates the need for the creation of a real `window`.
                // e.g. var jQuery = require("jquery")(window);
-               // See ticket #14549 for more info
+               // See ticket #14549 for more info.
                module.exports = global.document ?
                        factory( global, true ) :
                        function( w ) {
 // Pass this if window is not defined yet
 }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
 
-// Can't do this because several apps including ASP.NET trace
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
 // the stack via arguments.caller.callee and Firefox dies if
 // you try to trace through "use strict" call chains. (#13335)
-// Support: Firefox 18+
 //
 
-var deletedIds = [];
+var arr = [];
 
-var slice = deletedIds.slice;
+var slice = arr.slice;
 
-var concat = deletedIds.concat;
+var concat = arr.concat;
 
-var push = deletedIds.push;
+var push = arr.push;
 
-var indexOf = deletedIds.indexOf;
+var indexOf = arr.indexOf;
 
 var class2type = {};
 
@@ -45,14 +59,15 @@ var toString = class2type.toString;
 
 var hasOwn = class2type.hasOwnProperty;
 
-var trim = "".trim;
-
 var support = {};
 
 
 
 var
-       version = "1.11.0",
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+
+       version = "2.1.4",
 
        // Define a local copy of jQuery
        jQuery = function( selector, context ) {
@@ -61,7 +76,8 @@ var
                return new jQuery.fn.init( selector, context );
        },
 
-       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+       // Support: Android<4.1
+       // Make sure we trim BOM and NBSP
        rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
 
        // Matches dashed string for camelizing
@@ -94,10 +110,10 @@ jQuery.fn = jQuery.prototype = {
        get: function( num ) {
                return num != null ?
 
-                       // Return a 'clean' array
+                       // Return just the one element from the set
                        ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
 
-                       // Return just the object
+                       // Return all the elements in a clean array
                        slice.call( this );
        },
 
@@ -154,12 +170,12 @@ jQuery.fn = jQuery.prototype = {
        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
        push: push,
-       sort: deletedIds.sort,
-       splice: deletedIds.splice
+       sort: arr.sort,
+       splice: arr.splice
 };
 
 jQuery.extend = jQuery.fn.extend = function() {
-       var src, copyIsArray, copy, name, options, clone,
+       var options, name, src, copy, copyIsArray, clone,
                target = arguments[0] || {},
                i = 1,
                length = arguments.length,
@@ -169,7 +185,7 @@ jQuery.extend = jQuery.fn.extend = function() {
        if ( typeof target === "boolean" ) {
                deep = target;
 
-               // skip the boolean and the target
+               // Skip the boolean and the target
                target = arguments[ i ] || {};
                i++;
        }
@@ -179,7 +195,7 @@ jQuery.extend = jQuery.fn.extend = function() {
                target = {};
        }
 
-       // extend jQuery itself if only one argument is passed
+       // Extend jQuery itself if only one argument is passed
        if ( i === length ) {
                target = this;
                i--;
@@ -236,98 +252,86 @@ jQuery.extend({
 
        noop: function() {},
 
-       // See test/unit/core.js for details concerning isFunction.
-       // Since version 1.3, DOM methods and functions like alert
-       // aren't supported. They return false on IE (#2968).
        isFunction: function( obj ) {
                return jQuery.type(obj) === "function";
        },
 
-       isArray: Array.isArray || function( obj ) {
-               return jQuery.type(obj) === "array";
-       },
+       isArray: Array.isArray,
 
        isWindow: function( obj ) {
-               /* jshint eqeqeq: false */
-               return obj != null && obj == obj.window;
+               return obj != null && obj === obj.window;
        },
 
        isNumeric: function( obj ) {
                // parseFloat NaNs numeric-cast false positives (null|true|false|"")
                // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
                // subtraction forces infinities to NaN
-               return obj - parseFloat( obj ) >= 0;
-       },
-
-       isEmptyObject: function( obj ) {
-               var name;
-               for ( name in obj ) {
-                       return false;
-               }
-               return true;
+               // adding 1 corrects loss of precision from parseFloat (#15100)
+               return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
        },
 
        isPlainObject: function( obj ) {
-               var key;
-
-               // Must be an Object.
-               // Because of IE, we also have to check the presence of the constructor property.
-               // Make sure that DOM nodes and window objects don't pass through, as well
-               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+               // Not plain objects:
+               // - Any object or value whose internal [[Class]] property is not "[object Object]"
+               // - DOM nodes
+               // - window
+               if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
                        return false;
                }
 
-               try {
-                       // Not own constructor property must be Object
-                       if ( obj.constructor &&
-                               !hasOwn.call(obj, "constructor") &&
-                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-                               return false;
-                       }
-               } catch ( e ) {
-                       // IE8,9 Will throw exceptions on certain host objects #9897
+               if ( obj.constructor &&
+                               !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
                        return false;
                }
 
-               // Support: IE<9
-               // Handle iteration over inherited properties before own properties.
-               if ( support.ownLast ) {
-                       for ( key in obj ) {
-                               return hasOwn.call( obj, key );
-                       }
-               }
-
-               // Own properties are enumerated firstly, so to speed up,
-               // if last one is own, then all properties are own.
-               for ( key in obj ) {}
+               // If the function hasn't returned already, we're confident that
+               // |obj| is a plain object, created by {} or constructed with new Object
+               return true;
+       },
 
-               return key === undefined || hasOwn.call( obj, key );
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
        },
 
        type: function( obj ) {
                if ( obj == null ) {
                        return obj + "";
                }
+               // Support: Android<4.0, iOS<6 (functionish RegExp)
                return typeof obj === "object" || typeof obj === "function" ?
                        class2type[ toString.call(obj) ] || "object" :
                        typeof obj;
        },
 
        // Evaluates a script in a global context
-       // Workarounds based on findings by Jim Driscoll
-       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-       globalEval: function( data ) {
-               if ( data && jQuery.trim( data ) ) {
-                       // We use execScript on Internet Explorer
-                       // We use an anonymous function so that context is window
-                       // rather than jQuery in Firefox
-                       ( window.execScript || function( data ) {
-                               window[ "eval" ].call( window, data );
-                       } )( data );
+       globalEval: function( code ) {
+               var script,
+                       indirect = eval;
+
+               code = jQuery.trim( code );
+
+               if ( code ) {
+                       // If the code includes a valid, prologue position
+                       // strict mode pragma, execute code by injecting a
+                       // script tag into the document.
+                       if ( code.indexOf("use strict") === 1 ) {
+                               script = document.createElement("script");
+                               script.text = code;
+                               document.head.appendChild( script ).parentNode.removeChild( script );
+                       } else {
+                       // Otherwise, avoid the DOM node creation, insertion
+                       // and removal by using an indirect global eval
+                               indirect( code );
+                       }
                }
        },
 
        // Convert dashed to camelCase; used by the css and data modules
+       // Support: IE9-11+
        // Microsoft forgot to hump their vendor prefix (#9572)
        camelCase: function( string ) {
                return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
@@ -387,20 +391,12 @@ jQuery.extend({
                return obj;
        },
 
-       // Use native String.trim function wherever possible
-       trim: trim && !trim.call("\uFEFF\xA0") ?
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               trim.call( text );
-               } :
-
-               // Otherwise use our own trimming functionality
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               ( text + "" ).replace( rtrim, "" );
-               },
+       // Support: Android<4.1
+       trim: function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "" );
+       },
 
        // results is for internal usage only
        makeArray: function( arr, results ) {
@@ -421,25 +417,7 @@ jQuery.extend({
        },
 
        inArray: function( elem, arr, i ) {
-               var len;
-
-               if ( arr ) {
-                       if ( indexOf ) {
-                               return indexOf.call( arr, elem, i );
-                       }
-
-                       len = arr.length;
-                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-                       for ( ; i < len; i++ ) {
-                               // Skip accessing in sparse arrays
-                               if ( i in arr && arr[ i ] === elem ) {
-                                       return i;
-                               }
-                       }
-               }
-
-               return -1;
+               return arr == null ? -1 : indexOf.call( arr, elem, i );
        },
 
        merge: function( first, second ) {
@@ -447,16 +425,8 @@ jQuery.extend({
                        j = 0,
                        i = first.length;
 
-               while ( j < len ) {
-                       first[ i++ ] = second[ j++ ];
-               }
-
-               // Support: IE<9
-               // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
-               if ( len !== len ) {
-                       while ( second[j] !== undefined ) {
-                               first[ i++ ] = second[ j++ ];
-                       }
+               for ( ; j < len; j++ ) {
+                       first[ i++ ] = second[ j ];
                }
 
                first.length = i;
@@ -522,7 +492,7 @@ jQuery.extend({
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
-               var args, proxy, tmp;
+               var tmp, args, proxy;
 
                if ( typeof context === "string" ) {
                        tmp = fn[ context ];
@@ -548,9 +518,7 @@ jQuery.extend({
                return proxy;
        },
 
-       now: function() {
-               return +( new Date() );
-       },
+       now: Date.now,
 
        // jQuery.support is not used in Core but other projects attach their
        // properties to it so it needs to exist.
@@ -563,7 +531,12 @@ jQuery.each("Boolean Number String Function Array Date RegExp Object Error".spli
 });
 
 function isArraylike( obj ) {
-       var length = obj.length,
+
+       // Support: iOS 8.2 (not reproducible in simulator)
+       // `in` check used to prevent JIT error (gh-2145)
+       // hasOwn isn't used here due to false negatives
+       // regarding Nodelist length in IE
+       var length = "length" in obj && obj.length,
                type = jQuery.type( obj );
 
        if ( type === "function" || jQuery.isWindow( obj ) ) {
@@ -579,14 +552,14 @@ function isArraylike( obj ) {
 }
 var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v1.10.16
+ * Sizzle CSS Selector Engine v2.2.0-pre
  * http://sizzlejs.com/
  *
- * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-01-13
+ * Date: 2014-12-16
  */
 (function( window ) {
 
@@ -595,7 +568,9 @@ var i,
        Expr,
        getText,
        isXML,
+       tokenize,
        compile,
+       select,
        outermostContext,
        sortInput,
        hasDuplicate,
@@ -611,7 +586,7 @@ var i,
        contains,
 
        // Instance-specific data
-       expando = "sizzle" + -(new Date()),
+       expando = "sizzle" + 1 * new Date(),
        preferredDoc = window.document,
        dirruns = 0,
        done = 0,
@@ -626,7 +601,6 @@ var i,
        },
 
        // General-purpose constants
-       strundefined = typeof undefined,
        MAX_NEGATIVE = 1 << 31,
 
        // Instance methods
@@ -636,12 +610,13 @@ var i,
        push_native = arr.push,
        push = arr.push,
        slice = arr.slice,
-       // Use a stripped-down indexOf if we can't use a native one
-       indexOf = arr.indexOf || function( elem ) {
+       // Use a stripped-down indexOf as it's faster than native
+       // http://jsperf.com/thor-indexof-vs-for/5
+       indexOf = function( list, elem ) {
                var i = 0,
-                       len = this.length;
+                       len = list.length;
                for ( ; i < len; i++ ) {
-                       if ( this[i] === elem ) {
+                       if ( list[i] === elem ) {
                                return i;
                        }
                }
@@ -662,19 +637,26 @@ var i,
        // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
        identifier = characterEncoding.replace( "w", "w#" ),
 
-       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
-       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
-               "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
-       // Prefer arguments quoted,
-       //   then not containing pseudos/brackets,
-       //   then attribute selectors/non-parenthetical expressions,
-       //   then anything else
-       // These preferences are here to reduce the number of selectors
-       //   needing tokenize in the PSEUDO preFilter
-       pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+       // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+               // Operator (capture 2)
+               "*([*^$|!~]?=)" + whitespace +
+               // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+               "*\\]",
+
+       pseudos = ":(" + characterEncoding + ")(?:\\((" +
+               // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+               // 1. quoted (capture 3; capture 4 or capture 5)
+               "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+               // 2. simple (capture 6)
+               "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+               // 3. anything else (capture 2)
+               ".*" +
+               ")\\)|)",
 
        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rwhitespace = new RegExp( whitespace + "+", "g" ),
        rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
 
        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
@@ -717,7 +699,7 @@ var i,
        funescape = function( _, escaped, escapedWhitespace ) {
                var high = "0x" + escaped - 0x10000;
                // NaN means non-codepoint
-               // Support: Firefox
+               // Support: Firefox<24
                // Workaround erroneous numeric interpretation of +"0x"
                return high !== high || escapedWhitespace ?
                        escaped :
@@ -726,6 +708,14 @@ var i,
                                String.fromCharCode( high + 0x10000 ) :
                                // Supplemental Plane codepoint (surrogate pair)
                                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       },
+
+       // Used for iframes
+       // See setDocument()
+       // Removing the function wrapper causes a "Permission Denied"
+       // error in IE
+       unloadHandler = function() {
+               setDocument();
        };
 
 // Optimize for push.apply( _, NodeList )
@@ -768,19 +758,18 @@ function Sizzle( selector, context, results, seed ) {
 
        context = context || document;
        results = results || [];
+       nodeType = context.nodeType;
 
-       if ( !selector || typeof selector !== "string" ) {
-               return results;
-       }
+       if ( typeof selector !== "string" || !selector ||
+               nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
 
-       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
-               return [];
+               return results;
        }
 
-       if ( documentIsHTML && !seed ) {
+       if ( !seed && documentIsHTML ) {
 
-               // Shortcuts
-               if ( (match = rquickExpr.exec( selector )) ) {
+               // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+               if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
                        // Speed-up: Sizzle("#ID")
                        if ( (m = match[1]) ) {
                                if ( nodeType === 9 ) {
@@ -812,7 +801,7 @@ function Sizzle( selector, context, results, seed ) {
                                return results;
 
                        // Speed-up: Sizzle(".CLASS")
-                       } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+                       } else if ( (m = match[3]) && support.getElementsByClassName ) {
                                push.apply( results, context.getElementsByClassName( m ) );
                                return results;
                        }
@@ -822,7 +811,7 @@ function Sizzle( selector, context, results, seed ) {
                if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
                        nid = old = expando;
                        newContext = context;
-                       newSelector = nodeType === 9 && selector;
+                       newSelector = nodeType !== 1 && selector;
 
                        // qSA works strangely on Element-rooted queries
                        // We can work around this by specifying an extra ID on the root
@@ -1009,7 +998,7 @@ function createPositionalPseudo( fn ) {
  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
  */
 function testContext( context ) {
-       return context && typeof context.getElementsByTagName !== strundefined && context;
+       return context && typeof context.getElementsByTagName !== "undefined" && context;
 }
 
 // Expose support vars for convenience
@@ -1033,9 +1022,8 @@ isXML = Sizzle.isXML = function( elem ) {
  * @returns {Object} Returns the current document
  */
 setDocument = Sizzle.setDocument = function( node ) {
-       var hasCompare,
-               doc = node ? node.ownerDocument || node : preferredDoc,
-               parent = doc.defaultView;
+       var hasCompare, parent,
+               doc = node ? node.ownerDocument || node : preferredDoc;
 
        // If no document and documentElement is available, return
        if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
@@ -1045,9 +1033,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        // Set our document
        document = doc;
        docElem = doc.documentElement;
-
-       // Support tests
-       documentIsHTML = !isXML( doc );
+       parent = doc.defaultView;
 
        // Support: IE>8
        // If iframe document is assigned to "document" variable and if iframe has been reloaded,
@@ -1056,21 +1042,22 @@ setDocument = Sizzle.setDocument = function( node ) {
        if ( parent && parent !== parent.top ) {
                // IE11 does not have attachEvent, so all must suffer
                if ( parent.addEventListener ) {
-                       parent.addEventListener( "unload", function() {
-                               setDocument();
-                       }, false );
+                       parent.addEventListener( "unload", unloadHandler, false );
                } else if ( parent.attachEvent ) {
-                       parent.attachEvent( "onunload", function() {
-                               setDocument();
-                       });
+                       parent.attachEvent( "onunload", unloadHandler );
                }
        }
 
+       /* Support tests
+       ---------------------------------------------------------------------- */
+       documentIsHTML = !isXML( doc );
+
        /* Attributes
        ---------------------------------------------------------------------- */
 
        // Support: IE<8
-       // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+       // Verify that getAttribute really returns attributes and not properties
+       // (excepting IE8 booleans)
        support.attributes = assert(function( div ) {
                div.className = "i";
                return !div.getAttribute("className");
@@ -1085,17 +1072,8 @@ setDocument = Sizzle.setDocument = function( node ) {
                return !div.getElementsByTagName("*").length;
        });
 
-       // Check if getElementsByClassName can be trusted
-       support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
-               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
-
-               // Support: Safari<4
-               // Catch class over-caching
-               div.firstChild.className = "i";
-               // Support: Opera<10
-               // Catch gEBCN failure to find non-leading classes
-               return div.getElementsByClassName("i").length === 2;
-       });
+       // Support: IE<9
+       support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
 
        // Support: IE<10
        // Check if getElementById returns elements by name
@@ -1109,11 +1087,11 @@ setDocument = Sizzle.setDocument = function( node ) {
        // ID find and filter
        if ( support.getById ) {
                Expr.find["ID"] = function( id, context ) {
-                       if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+                       if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
                                var m = context.getElementById( id );
                                // Check parentNode to catch when Blackberry 4.6 returns
                                // nodes that are no longer in the document #6963
-                               return m && m.parentNode ? [m] : [];
+                               return m && m.parentNode ? [ m ] : [];
                        }
                };
                Expr.filter["ID"] = function( id ) {
@@ -1130,7 +1108,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                Expr.filter["ID"] =  function( id ) {
                        var attrId = id.replace( runescape, funescape );
                        return function( elem ) {
-                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                               var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
                                return node && node.value === attrId;
                        };
                };
@@ -1139,14 +1117,20 @@ setDocument = Sizzle.setDocument = function( node ) {
        // Tag
        Expr.find["TAG"] = support.getElementsByTagName ?
                function( tag, context ) {
-                       if ( typeof context.getElementsByTagName !== strundefined ) {
+                       if ( typeof context.getElementsByTagName !== "undefined" ) {
                                return context.getElementsByTagName( tag );
+
+                       // DocumentFragment nodes don't have gEBTN
+                       } else if ( support.qsa ) {
+                               return context.querySelectorAll( tag );
                        }
                } :
+
                function( tag, context ) {
                        var elem,
                                tmp = [],
                                i = 0,
+                               // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
                                results = context.getElementsByTagName( tag );
 
                        // Filter out possible comments
@@ -1164,7 +1148,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 
        // Class
        Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-               if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+               if ( documentIsHTML ) {
                        return context.getElementsByClassName( className );
                }
        };
@@ -1193,11 +1177,15 @@ setDocument = Sizzle.setDocument = function( node ) {
                        // setting a boolean content attribute,
                        // since its presence should be enough
                        // http://bugs.jquery.com/ticket/12359
-                       div.innerHTML = "<select t=''><option selected=''></option></select>";
+                       docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+                               "<select id='" + expando + "-\f]' msallowcapture=''>" +
+                               "<option selected=''></option></select>";
 
-                       // Support: IE8, Opera 10-12
+                       // Support: IE8, Opera 11-12.16
                        // Nothing should be selected when empty strings follow ^= or $= or *=
-                       if ( div.querySelectorAll("[t^='']").length ) {
+                       // The test attribute must be unknown in Opera but "safe" for WinRT
+                       // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+                       if ( div.querySelectorAll("[msallowcapture^='']").length ) {
                                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
                        }
 
@@ -1207,12 +1195,24 @@ setDocument = Sizzle.setDocument = function( node ) {
                                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
                        }
 
+                       // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+                       if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+                               rbuggyQSA.push("~=");
+                       }
+
                        // Webkit/Opera - :checked should return selected option elements
                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
                        // IE8 throws error here and will not see later tests
                        if ( !div.querySelectorAll(":checked").length ) {
                                rbuggyQSA.push(":checked");
                        }
+
+                       // Support: Safari 8+, iOS 8+
+                       // https://bugs.webkit.org/show_bug.cgi?id=136851
+                       // In-page `selector#id sibing-combinator selector` fails
+                       if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+                               rbuggyQSA.push(".#.+[+~]");
+                       }
                });
 
                assert(function( div ) {
@@ -1240,7 +1240,8 @@ setDocument = Sizzle.setDocument = function( node ) {
                });
        }
 
-       if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+       if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+               docElem.webkitMatchesSelector ||
                docElem.mozMatchesSelector ||
                docElem.oMatchesSelector ||
                docElem.msMatchesSelector) )) ) {
@@ -1328,7 +1329,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 
                        // Maintain original order
                        return sortInput ?
-                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
                                0;
                }
 
@@ -1355,7 +1356,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                                aup ? -1 :
                                bup ? 1 :
                                sortInput ?
-                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
                                0;
 
                // If the nodes are siblings, we can do a quick check
@@ -1418,10 +1419,10 @@ Sizzle.matchesSelector = function( elem, expr ) {
                                        elem.document && elem.document.nodeType !== 11 ) {
                                return ret;
                        }
-               } catch(e) {}
+               } catch (e) {}
        }
 
-       return Sizzle( expr, document, null, [elem] ).length > 0;
+       return Sizzle( expr, document, null, [ elem ] ).length > 0;
 };
 
 Sizzle.contains = function( context, elem ) {
@@ -1550,7 +1551,7 @@ Expr = Sizzle.selectors = {
                        match[1] = match[1].replace( runescape, funescape );
 
                        // Move the given value to match[3] whether quoted or unquoted
-                       match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+                       match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
 
                        if ( match[2] === "~=" ) {
                                match[3] = " " + match[3] + " ";
@@ -1593,15 +1594,15 @@ Expr = Sizzle.selectors = {
 
                "PSEUDO": function( match ) {
                        var excess,
-                               unquoted = !match[5] && match[2];
+                               unquoted = !match[6] && match[2];
 
                        if ( matchExpr["CHILD"].test( match[0] ) ) {
                                return null;
                        }
 
                        // Accept quoted arguments as-is
-                       if ( match[3] && match[4] !== undefined ) {
-                               match[2] = match[4];
+                       if ( match[3] ) {
+                               match[2] = match[4] || match[5] || "";
 
                        // Strip excess characters from unquoted arguments
                        } else if ( unquoted && rpseudo.test( unquoted ) &&
@@ -1637,7 +1638,7 @@ Expr = Sizzle.selectors = {
                        return pattern ||
                                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
                                classCache( className, function( elem ) {
-                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
                                });
                },
 
@@ -1659,7 +1660,7 @@ Expr = Sizzle.selectors = {
                                        operator === "^=" ? check && result.indexOf( check ) === 0 :
                                        operator === "*=" ? check && result.indexOf( check ) > -1 :
                                        operator === "$=" ? check && result.slice( -check.length ) === check :
-                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
                                        operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
                                        false;
                        };
@@ -1779,7 +1780,7 @@ Expr = Sizzle.selectors = {
                                                        matched = fn( seed, argument ),
                                                        i = matched.length;
                                                while ( i-- ) {
-                                                       idx = indexOf.call( seed, matched[i] );
+                                                       idx = indexOf( seed, matched[i] );
                                                        seed[ idx ] = !( matches[ idx ] = matched[i] );
                                                }
                                        }) :
@@ -1818,6 +1819,8 @@ Expr = Sizzle.selectors = {
                                function( elem, context, xml ) {
                                        input[0] = elem;
                                        matcher( input, null, xml, results );
+                                       // Don't keep the element (issue #299)
+                                       input[0] = null;
                                        return !results.pop();
                                };
                }),
@@ -1829,6 +1832,7 @@ Expr = Sizzle.selectors = {
                }),
 
                "contains": markFunction(function( text ) {
+                       text = text.replace( runescape, funescape );
                        return function( elem ) {
                                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
                        };
@@ -2006,7 +2010,7 @@ function setFilters() {}
 setFilters.prototype = Expr.filters = Expr.pseudos;
 Expr.setFilters = new setFilters();
 
-function tokenize( selector, parseOnly ) {
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
        var matched, match, tokens, type,
                soFar, groups, preFilters,
                cached = tokenCache[ selector + " " ];
@@ -2071,7 +2075,7 @@ function tokenize( selector, parseOnly ) {
                        Sizzle.error( selector ) :
                        // Cache the tokens
                        tokenCache( selector, groups ).slice( 0 );
-}
+};
 
 function toSelector( tokens ) {
        var i = 0,
@@ -2150,6 +2154,15 @@ function elementMatcher( matchers ) {
                matchers[0];
 }
 
+function multipleContexts( selector, contexts, results ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results );
+       }
+       return results;
+}
+
 function condense( unmatched, map, filter, context, xml ) {
        var elem,
                newUnmatched = [],
@@ -2241,7 +2254,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
                                i = matcherOut.length;
                                while ( i-- ) {
                                        if ( (elem = matcherOut[i]) &&
-                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+                                               (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
 
                                                seed[temp] = !(results[temp] = elem);
                                        }
@@ -2276,13 +2289,16 @@ function matcherFromTokens( tokens ) {
                        return elem === checkContext;
                }, implicitRelative, true ),
                matchAnyContext = addCombinator( function( elem ) {
-                       return indexOf.call( checkContext, elem ) > -1;
+                       return indexOf( checkContext, elem ) > -1;
                }, implicitRelative, true ),
                matchers = [ function( elem, context, xml ) {
-                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                       var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
                                (checkContext = context).nodeType ?
                                        matchContext( elem, context, xml ) :
                                        matchAnyContext( elem, context, xml ) );
+                       // Avoid hanging onto element (issue #299)
+                       checkContext = null;
+                       return ret;
                } ];
 
        for ( ; i < len; i++ ) {
@@ -2418,7 +2434,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
                superMatcher;
 }
 
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
        var i,
                setMatchers = [],
                elementMatchers = [],
@@ -2426,12 +2442,12 @@ compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
 
        if ( !cached ) {
                // Generate a function of recursive functions that can be used to check each element
-               if ( !group ) {
-                       group = tokenize( selector );
+               if ( !match ) {
+                       match = tokenize( selector );
                }
-               i = group.length;
+               i = match.length;
                while ( i-- ) {
-                       cached = matcherFromTokens( group[i] );
+                       cached = matcherFromTokens( match[i] );
                        if ( cached[ expando ] ) {
                                setMatchers.push( cached );
                        } else {
@@ -2441,74 +2457,83 @@ compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
 
                // Cache the compiled function
                cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+               // Save selector and tokenization
+               cached.selector = selector;
        }
        return cached;
 };
 
-function multipleContexts( selector, contexts, results ) {
-       var i = 0,
-               len = contexts.length;
-       for ( ; i < len; i++ ) {
-               Sizzle( selector, contexts[i], results );
-       }
-       return results;
-}
-
-function select( selector, context, results, seed ) {
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
        var i, tokens, token, type, find,
-               match = tokenize( selector );
+               compiled = typeof selector === "function" && selector,
+               match = !seed && tokenize( (selector = compiled.selector || selector) );
 
-       if ( !seed ) {
-               // Try to minimize operations if there is only one group
-               if ( match.length === 1 ) {
+       results = results || [];
 
-                       // Take a shortcut and set the context if the root selector is an ID
-                       tokens = match[0] = match[0].slice( 0 );
-                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-                                       support.getById && context.nodeType === 9 && documentIsHTML &&
-                                       Expr.relative[ tokens[1].type ] ) {
+       // Try to minimize operations if there is no seed and only one group
+       if ( match.length === 1 ) {
 
-                               context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-                               if ( !context ) {
-                                       return results;
-                               }
-                               selector = selector.slice( tokens.shift().value.length );
+               // Take a shortcut and set the context if the root selector is an ID
+               tokens = match[0] = match[0].slice( 0 );
+               if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                               support.getById && context.nodeType === 9 && documentIsHTML &&
+                               Expr.relative[ tokens[1].type ] ) {
+
+                       context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                       if ( !context ) {
+                               return results;
+
+                       // Precompiled matchers will still verify ancestry, so step up a level
+                       } else if ( compiled ) {
+                               context = context.parentNode;
                        }
 
-                       // Fetch a seed set for right-to-left matching
-                       i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-                       while ( i-- ) {
-                               token = tokens[i];
+                       selector = selector.slice( tokens.shift().value.length );
+               }
 
-                               // Abort if we hit a combinator
-                               if ( Expr.relative[ (type = token.type) ] ) {
-                                       break;
-                               }
-                               if ( (find = Expr.find[ type ]) ) {
-                                       // Search, expanding context for leading sibling combinators
-                                       if ( (seed = find(
-                                               token.matches[0].replace( runescape, funescape ),
-                                               rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-                                       )) ) {
-
-                                               // If seed is empty or no tokens remain, we can return early
-                                               tokens.splice( i, 1 );
-                                               selector = seed.length && toSelector( tokens );
-                                               if ( !selector ) {
-                                                       push.apply( results, seed );
-                                                       return results;
-                                               }
+               // Fetch a seed set for right-to-left matching
+               i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+               while ( i-- ) {
+                       token = tokens[i];
 
-                                               break;
+                       // Abort if we hit a combinator
+                       if ( Expr.relative[ (type = token.type) ] ) {
+                               break;
+                       }
+                       if ( (find = Expr.find[ type ]) ) {
+                               // Search, expanding context for leading sibling combinators
+                               if ( (seed = find(
+                                       token.matches[0].replace( runescape, funescape ),
+                                       rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+                               )) ) {
+
+                                       // If seed is empty or no tokens remain, we can return early
+                                       tokens.splice( i, 1 );
+                                       selector = seed.length && toSelector( tokens );
+                                       if ( !selector ) {
+                                               push.apply( results, seed );
+                                               return results;
                                        }
+
+                                       break;
                                }
                        }
                }
        }
 
-       // Compile and execute a filtering function
+       // Compile and execute a filtering function if one is not provided
        // Provide `match` to avoid retokenization if we modified the selector above
-       compile( selector, match )(
+       ( compiled || compile( selector, match ) )(
                seed,
                context,
                !documentIsHTML,
@@ -2516,14 +2541,14 @@ function select( selector, context, results, seed ) {
                rsibling.test( selector ) && testContext( context.parentNode ) || context
        );
        return results;
-}
+};
 
 // One-time assignments
 
 // Sort stability
 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
 
-// Support: Chrome<14
+// Support: Chrome 14-35+
 // Always assume duplicates if they aren't passed to the comparison function
 support.detectDuplicates = !!hasDuplicate;
 
@@ -2631,7 +2656,7 @@ function winnow( elements, qualifier, not ) {
        }
 
        return jQuery.grep( elements, function( elem ) {
-               return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+               return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
        });
 }
 
@@ -2652,9 +2677,9 @@ jQuery.filter = function( expr, elems, not ) {
 jQuery.fn.extend({
        find: function( selector ) {
                var i,
+                       len = this.length,
                        ret = [],
-                       self = this,
-                       len = self.length;
+                       self = this;
 
                if ( typeof selector !== "string" ) {
                        return this.pushStack( jQuery( selector ).filter(function() {
@@ -2702,9 +2727,6 @@ jQuery.fn.extend({
 // A central reference to the root jQuery(document)
 var rootjQuery,
 
-       // Use the correct document accordingly with window argument (sandbox)
-       document = window.document,
-
        // A simple way to check for HTML strings
        // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        // Strict HTML recognition (#11290: must start with <)
@@ -2720,7 +2742,7 @@ var rootjQuery,
 
                // Handle HTML strings
                if ( typeof selector === "string" ) {
-                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                       if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
                                // Assume that strings that start and end with <> are HTML and skip the regex check
                                match = [ null, selector, null ];
 
@@ -2735,7 +2757,7 @@ var rootjQuery,
                                if ( match[1] ) {
                                        context = context instanceof jQuery ? context[0] : context;
 
-                                       // scripts is true for back-compat
+                                       // Option to run scripts is true for back-compat
                                        // Intentionally let the error be thrown if parseHTML is not present
                                        jQuery.merge( this, jQuery.parseHTML(
                                                match[1],
@@ -2763,16 +2785,10 @@ var rootjQuery,
                                } else {
                                        elem = document.getElementById( match[2] );
 
-                                       // Check parentNode to catch when Blackberry 4.6 returns
-                                       // nodes that are no longer in the document #6963
+                                       // Support: Blackberry 4.6
+                                       // gEBID returns nodes no longer in the document (#6963)
                                        if ( elem && elem.parentNode ) {
-                                               // Handle the case where IE and Opera return items
-                                               // by name instead of ID
-                                               if ( elem.id !== match[2] ) {
-                                                       return rootjQuery.find( selector );
-                                               }
-
-                                               // Otherwise, we inject the element directly into the jQuery object
+                                               // Inject the element directly into the jQuery object
                                                this.length = 1;
                                                this[0] = elem;
                                        }
@@ -2823,7 +2839,7 @@ rootjQuery = jQuery( document );
 
 
 var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-       // methods guaranteed to produce a unique set when starting from a unique set
+       // Methods guaranteed to produce a unique set when starting from a unique set
        guaranteedUnique = {
                children: true,
                contents: true,
@@ -2834,38 +2850,40 @@ var rparentsprev = /^(?:parents|prev(?:Until|All))/,
 jQuery.extend({
        dir: function( elem, dir, until ) {
                var matched = [],
-                       cur = elem[ dir ];
+                       truncate = until !== undefined;
 
-               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-                       if ( cur.nodeType === 1 ) {
-                               matched.push( cur );
+               while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+                       if ( elem.nodeType === 1 ) {
+                               if ( truncate && jQuery( elem ).is( until ) ) {
+                                       break;
+                               }
+                               matched.push( elem );
                        }
-                       cur = cur[dir];
                }
                return matched;
        },
 
        sibling: function( n, elem ) {
-               var r = [];
+               var matched = [];
 
                for ( ; n; n = n.nextSibling ) {
                        if ( n.nodeType === 1 && n !== elem ) {
-                               r.push( n );
+                               matched.push( n );
                        }
                }
 
-               return r;
+               return matched;
        }
 });
 
 jQuery.fn.extend({
        has: function( target ) {
-               var i,
-                       targets = jQuery( target, this ),
-                       len = targets.length;
+               var targets = jQuery( target, this ),
+                       l = targets.length;
 
                return this.filter(function() {
-                       for ( i = 0; i < len; i++ ) {
+                       var i = 0;
+                       for ( ; i < l; i++ ) {
                                if ( jQuery.contains( this, targets[i] ) ) {
                                        return true;
                                }
@@ -2901,24 +2919,25 @@ jQuery.fn.extend({
                return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
        },
 
-       // Determine the position of an element within
-       // the matched set of elements
+       // Determine the position of an element within the set
        index: function( elem ) {
 
                // No argument, return index in parent
                if ( !elem ) {
-                       return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+                       return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
                }
 
-               // index in selector
+               // Index in selector
                if ( typeof elem === "string" ) {
-                       return jQuery.inArray( this[0], jQuery( elem ) );
+                       return indexOf.call( jQuery( elem ), this[ 0 ] );
                }
 
                // Locate the position of the desired element
-               return jQuery.inArray(
+               return indexOf.call( this,
+
                        // If it receives a jQuery object, the first element is used
-                       elem.jquery ? elem[0] : elem, this );
+                       elem.jquery ? elem[ 0 ] : elem
+               );
        },
 
        add: function( selector, context ) {
@@ -2937,10 +2956,7 @@ jQuery.fn.extend({
 });
 
 function sibling( cur, dir ) {
-       do {
-               cur = cur[ dir ];
-       } while ( cur && cur.nodeType !== 1 );
-
+       while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
        return cur;
 }
 
@@ -2980,35 +2996,33 @@ jQuery.each({
                return jQuery.sibling( elem.firstChild );
        },
        contents: function( elem ) {
-               return jQuery.nodeName( elem, "iframe" ) ?
-                       elem.contentDocument || elem.contentWindow.document :
-                       jQuery.merge( [], elem.childNodes );
+               return elem.contentDocument || jQuery.merge( [], elem.childNodes );
        }
 }, function( name, fn ) {
        jQuery.fn[ name ] = function( until, selector ) {
-               var ret = jQuery.map( this, fn, until );
+               var matched = jQuery.map( this, fn, until );
 
                if ( name.slice( -5 ) !== "Until" ) {
                        selector = until;
                }
 
                if ( selector && typeof selector === "string" ) {
-                       ret = jQuery.filter( selector, ret );
+                       matched = jQuery.filter( selector, matched );
                }
 
                if ( this.length > 1 ) {
                        // Remove duplicates
                        if ( !guaranteedUnique[ name ] ) {
-                               ret = jQuery.unique( ret );
+                               jQuery.unique( matched );
                        }
 
                        // Reverse order for parents* and prev-derivatives
                        if ( rparentsprev.test( name ) ) {
-                               ret = ret.reverse();
+                               matched.reverse();
                        }
                }
 
-               return this.pushStack( ret );
+               return this.pushStack( matched );
        };
 });
 var rnotwhite = (/\S+/g);
@@ -3057,18 +3071,18 @@ jQuery.Callbacks = function( options ) {
                ( optionsCache[ options ] || createOptions( options ) ) :
                jQuery.extend( {}, options );
 
-       var // Flag to know if list is currently firing
-               firing,
-               // Last fire value (for non-forgettable lists)
+       var // Last fire value (for non-forgettable lists)
                memory,
                // Flag to know if list was already fired
                fired,
+               // Flag to know if list is currently firing
+               firing,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
                // End of the loop when firing
                firingLength,
                // Index of currently firing callback (modified by remove if needed)
                firingIndex,
-               // First callback to fire (used internally by add and fireWith)
-               firingStart,
                // Actual callback list
                list = [],
                // Stack of fire calls for repeatable lists
@@ -3321,8 +3335,7 @@ jQuery.extend({
                                        values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
                                        if ( values === progressValues ) {
                                                deferred.notifyWith( contexts, values );
-
-                                       } else if ( !(--remaining) ) {
+                                       } else if ( !( --remaining ) ) {
                                                deferred.resolveWith( contexts, values );
                                        }
                                };
@@ -3330,7 +3343,7 @@ jQuery.extend({
 
                        progressValues, progressContexts, resolveContexts;
 
-               // add listeners to Deferred subordinates; treat others as resolved
+               // Add listeners to Deferred subordinates; treat others as resolved
                if ( length > 1 ) {
                        progressValues = new Array( length );
                        progressContexts = new Array( length );
@@ -3347,7 +3360,7 @@ jQuery.extend({
                        }
                }
 
-               // if we're not waiting on anything, resolve the master
+               // If we're not waiting on anything, resolve the master
                if ( !remaining ) {
                        deferred.resolveWith( resolveContexts, resolveValues );
                }
@@ -3392,11 +3405,6 @@ jQuery.extend({
                        return;
                }
 
-               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-               if ( !document.body ) {
-                       return setTimeout( jQuery.ready );
-               }
-
                // Remember that the DOM is ready
                jQuery.isReady = true;
 
@@ -3409,35 +3417,20 @@ jQuery.extend({
                readyList.resolveWith( document, [ jQuery ] );
 
                // Trigger any bound ready events
-               if ( jQuery.fn.trigger ) {
-                       jQuery( document ).trigger("ready").off("ready");
+               if ( jQuery.fn.triggerHandler ) {
+                       jQuery( document ).triggerHandler( "ready" );
+                       jQuery( document ).off( "ready" );
                }
        }
 });
 
-/**
- * Clean-up method for dom ready events
- */
-function detach() {
-       if ( document.addEventListener ) {
-               document.removeEventListener( "DOMContentLoaded", completed, false );
-               window.removeEventListener( "load", completed, false );
-
-       } else {
-               document.detachEvent( "onreadystatechange", completed );
-               window.detachEvent( "onload", completed );
-       }
-}
-
 /**
  * The ready event handler and self cleanup method
  */
 function completed() {
-       // readyState === "complete" is good enough for us to call the dom ready in oldIE
-       if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
-               detach();
-               jQuery.ready();
-       }
+       document.removeEventListener( "DOMContentLoaded", completed, false );
+       window.removeEventListener( "load", completed, false );
+       jQuery.ready();
 }
 
 jQuery.ready.promise = function( obj ) {
@@ -3446,447 +3439,369 @@ jQuery.ready.promise = function( obj ) {
                readyList = jQuery.Deferred();
 
                // Catch cases where $(document).ready() is called after the browser event has already occurred.
-               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // We once tried to use readyState "interactive" here, but it caused issues like the one
                // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
                if ( document.readyState === "complete" ) {
                        // Handle it asynchronously to allow scripts the opportunity to delay ready
                        setTimeout( jQuery.ready );
 
-               // Standards-based browsers support DOMContentLoaded
-               } else if ( document.addEventListener ) {
+               } else {
+
                        // Use the handy event callback
                        document.addEventListener( "DOMContentLoaded", completed, false );
 
                        // A fallback to window.onload, that will always work
                        window.addEventListener( "load", completed, false );
-
-               // If IE event model is used
-               } else {
-                       // Ensure firing before onload, maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", completed );
-
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", completed );
-
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var top = false;
-
-                       try {
-                               top = window.frameElement == null && document.documentElement;
-                       } catch(e) {}
-
-                       if ( top && top.doScroll ) {
-                               (function doScrollCheck() {
-                                       if ( !jQuery.isReady ) {
-
-                                               try {
-                                                       // Use the trick by Diego Perini
-                                                       // http://javascript.nwbox.com/IEContentLoaded/
-                                                       top.doScroll("left");
-                                               } catch(e) {
-                                                       return setTimeout( doScrollCheck, 50 );
-                                               }
-
-                                               // detach all dom ready events
-                                               detach();
-
-                                               // and execute any waiting functions
-                                               jQuery.ready();
-                                       }
-                               })();
-                       }
                }
        }
        return readyList.promise( obj );
 };
 
-
-var strundefined = typeof undefined;
-
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
 
 
-// Support: IE<9
-// Iteration over object's inherited properties before its own
-var i;
-for ( i in jQuery( support ) ) {
-       break;
-}
-support.ownLast = i !== "0";
 
-// Note: most support tests are defined in their respective modules.
-// false until the test is run
-support.inlineBlockNeedsLayout = false;
 
-jQuery(function() {
-       // We need to execute this one support test ASAP because we need to know
-       // if body.style.zoom needs to be set.
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+       var i = 0,
+               len = elems.length,
+               bulk = key == null;
 
-       var container, div,
-               body = document.getElementsByTagName("body")[0];
+       // Sets many values
+       if ( jQuery.type( key ) === "object" ) {
+               chainable = true;
+               for ( i in key ) {
+                       jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+               }
 
-       if ( !body ) {
-               // Return for frameset docs that don't have a body
-               return;
-       }
+       // Sets one value
+       } else if ( value !== undefined ) {
+               chainable = true;
 
-       // Setup
-       container = document.createElement( "div" );
-       container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+               if ( !jQuery.isFunction( value ) ) {
+                       raw = true;
+               }
 
-       div = document.createElement( "div" );
-       body.appendChild( container ).appendChild( div );
+               if ( bulk ) {
+                       // Bulk operations run against the entire set
+                       if ( raw ) {
+                               fn.call( elems, value );
+                               fn = null;
 
-       if ( typeof div.style.zoom !== strundefined ) {
-               // Support: IE<8
-               // Check if natively block-level elements act like inline-block
-               // elements when setting their display to 'inline' and giving
-               // them layout
-               div.style.cssText = "border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1";
+                       // ...except when executing function values
+                       } else {
+                               bulk = fn;
+                               fn = function( elem, key, value ) {
+                                       return bulk.call( jQuery( elem ), value );
+                               };
+                       }
+               }
 
-               if ( (support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 )) ) {
-                       // Prevent IE 6 from affecting layout for positioned elements #11048
-                       // Prevent IE from shrinking the body in IE 7 mode #12869
-                       // Support: IE<8
-                       body.style.zoom = 1;
+               if ( fn ) {
+                       for ( ; i < len; i++ ) {
+                               fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+                       }
                }
        }
 
-       body.removeChild( container );
-
-       // Null elements to avoid leaks in IE
-       container = div = null;
-});
+       return chainable ?
+               elems :
 
+               // Gets
+               bulk ?
+                       fn.call( elems ) :
+                       len ? fn( elems[0], key ) : emptyGet;
+};
 
 
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+       // Accepts only:
+       //  - Node
+       //    - Node.ELEMENT_NODE
+       //    - Node.DOCUMENT_NODE
+       //  - Object
+       //    - Any
+       /* jshint -W018 */
+       return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
 
-(function() {
-       var div = document.createElement( "div" );
 
-       // Execute the test only if not already executed in another module.
-       if (support.deleteExpando == null) {
-               // Support: IE<9
-               support.deleteExpando = true;
-               try {
-                       delete div.test;
-               } catch( e ) {
-                       support.deleteExpando = false;
+function Data() {
+       // Support: Android<4,
+       // Old WebKit does not have Object.preventExtensions/freeze method,
+       // return new empty object instead with no [[set]] accessor
+       Object.defineProperty( this.cache = {}, 0, {
+               get: function() {
+                       return {};
                }
-       }
-
-       // Null elements to avoid leaks in IE.
-       div = null;
-})();
+       });
 
+       this.expando = jQuery.expando + Data.uid++;
+}
 
-/**
- * Determines whether an object can have data
- */
-jQuery.acceptData = function( elem ) {
-       var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
-               nodeType = +elem.nodeType || 1;
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
 
-       // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
-       return nodeType !== 1 && nodeType !== 9 ?
-               false :
+Data.prototype = {
+       key: function( owner ) {
+               // We can accept data for non-element nodes in modern browsers,
+               // but we should not, see #8335.
+               // Always return the key for a frozen object.
+               if ( !Data.accepts( owner ) ) {
+                       return 0;
+               }
 
-               // Nodes accept data unless otherwise specified; rejection can be conditional
-               !noData || noData !== true && elem.getAttribute("classid") === noData;
-};
+               var descriptor = {},
+                       // Check if the owner object already has a cache key
+                       unlock = owner[ this.expando ];
 
+               // If not, create one
+               if ( !unlock ) {
+                       unlock = Data.uid++;
 
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-       rmultiDash = /([A-Z])/g;
+                       // Secure it in a non-enumerable, non-writable property
+                       try {
+                               descriptor[ this.expando ] = { value: unlock };
+                               Object.defineProperties( owner, descriptor );
 
-function dataAttr( elem, key, data ) {
-       // If nothing was found internally, try to fetch any
-       // data from the HTML5 data-* attribute
-       if ( data === undefined && elem.nodeType === 1 ) {
-
-               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-               data = elem.getAttribute( name );
-
-               if ( typeof data === "string" ) {
-                       try {
-                               data = data === "true" ? true :
-                                       data === "false" ? false :
-                                       data === "null" ? null :
-                                       // Only convert to a number if it doesn't change the string
-                                       +data + "" === data ? +data :
-                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                       data;
-                       } catch( e ) {}
-
-                       // Make sure we set the data so it isn't changed later
-                       jQuery.data( elem, key, data );
-
-               } else {
-                       data = undefined;
+                       // Support: Android<4
+                       // Fallback to a less secure definition
+                       } catch ( e ) {
+                               descriptor[ this.expando ] = unlock;
+                               jQuery.extend( owner, descriptor );
+                       }
                }
-       }
-
-       return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-       var name;
-       for ( name in obj ) {
 
-               // if the public data object is empty, the private is still empty
-               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                       continue;
+               // Ensure the cache object
+               if ( !this.cache[ unlock ] ) {
+                       this.cache[ unlock ] = {};
                }
-               if ( name !== "toJSON" ) {
-                       return false;
-               }
-       }
-
-       return true;
-}
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
-       if ( !jQuery.acceptData( elem ) ) {
-               return;
-       }
-
-       var ret, thisCache,
-               internalKey = jQuery.expando,
-
-               // We have to handle DOM nodes and JS objects differently because IE6-7
-               // can't GC object references properly across the DOM-JS boundary
-               isNode = elem.nodeType,
-
-               // Only DOM nodes need the global jQuery cache; JS object data is
-               // attached directly to the object so GC can occur automatically
-               cache = isNode ? jQuery.cache : elem,
 
-               // Only defining an ID for JS objects if its cache already exists allows
-               // the code to shortcut on the same path as a DOM node with no cache
-               id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+               return unlock;
+       },
+       set: function( owner, data, value ) {
+               var prop,
+                       // There may be an unlock assigned to this node,
+                       // if there is no entry for this "owner", create one inline
+                       // and set the unlock as though an owner entry had always existed
+                       unlock = this.key( owner ),
+                       cache = this.cache[ unlock ];
 
-       // Avoid doing any more work than we need to when trying to get data on an
-       // object that has no data at all
-       if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
-               return;
-       }
+               // Handle: [ owner, key, value ] args
+               if ( typeof data === "string" ) {
+                       cache[ data ] = value;
 
-       if ( !id ) {
-               // Only DOM nodes need a new unique ID for each element since their data
-               // ends up in the global cache
-               if ( isNode ) {
-                       id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
+               // Handle: [ owner, { properties } ] args
                } else {
-                       id = internalKey;
-               }
-       }
+                       // Fresh assignments by object are shallow copied
+                       if ( jQuery.isEmptyObject( cache ) ) {
+                               jQuery.extend( this.cache[ unlock ], data );
+                       // Otherwise, copy the properties one-by-one to the cache object
+                       } else {
+                               for ( prop in data ) {
+                                       cache[ prop ] = data[ prop ];
+                               }
+                       }
+               }
+               return cache;
+       },
+       get: function( owner, key ) {
+               // Either a valid cache is found, or will be created.
+               // New caches will be created and the unlock returned,
+               // allowing direct access to the newly created
+               // empty data object. A valid owner object must be provided.
+               var cache = this.cache[ this.key( owner ) ];
+
+               return key === undefined ?
+                       cache : cache[ key ];
+       },
+       access: function( owner, key, value ) {
+               var stored;
+               // In cases where either:
+               //
+               //   1. No key was specified
+               //   2. A string key was specified, but no value provided
+               //
+               // Take the "read" path and allow the get method to determine
+               // which value to return, respectively either:
+               //
+               //   1. The entire cache object
+               //   2. The data stored at the key
+               //
+               if ( key === undefined ||
+                               ((key && typeof key === "string") && value === undefined) ) {
+
+                       stored = this.get( owner, key );
+
+                       return stored !== undefined ?
+                               stored : this.get( owner, jQuery.camelCase(key) );
+               }
+
+               // [*]When the key is not a string, or both a key and value
+               // are specified, set or extend (existing objects) with either:
+               //
+               //   1. An object of properties
+               //   2. A key and value
+               //
+               this.set( owner, key, value );
+
+               // Since the "set" path can have two possible entry points
+               // return the expected data based on which path was taken[*]
+               return value !== undefined ? value : key;
+       },
+       remove: function( owner, key ) {
+               var i, name, camel,
+                       unlock = this.key( owner ),
+                       cache = this.cache[ unlock ];
 
-       if ( !cache[ id ] ) {
-               // Avoid exposing jQuery metadata on plain JS objects when the object
-               // is serialized using JSON.stringify
-               cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
-       }
+               if ( key === undefined ) {
+                       this.cache[ unlock ] = {};
 
-       // An object can be passed to jQuery.data instead of a key/value pair; this gets
-       // shallow copied over onto the existing cache
-       if ( typeof name === "object" || typeof name === "function" ) {
-               if ( pvt ) {
-                       cache[ id ] = jQuery.extend( cache[ id ], name );
                } else {
-                       cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-               }
-       }
-
-       thisCache = cache[ id ];
-
-       // jQuery data() is stored in a separate object inside the object's internal data
-       // cache in order to avoid key collisions between internal data and user-defined
-       // data.
-       if ( !pvt ) {
-               if ( !thisCache.data ) {
-                       thisCache.data = {};
-               }
-
-               thisCache = thisCache.data;
-       }
-
-       if ( data !== undefined ) {
-               thisCache[ jQuery.camelCase( name ) ] = data;
-       }
-
-       // Check for both converted-to-camel and non-converted data property names
-       // If a data property was specified
-       if ( typeof name === "string" ) {
-
-               // First Try to find as-is property data
-               ret = thisCache[ name ];
-
-               // Test for null|undefined property data
-               if ( ret == null ) {
-
-                       // Try to find the camelCased property
-                       ret = thisCache[ jQuery.camelCase( name ) ];
-               }
-       } else {
-               ret = thisCache;
-       }
-
-       return ret;
-}
-
-function internalRemoveData( elem, name, pvt ) {
-       if ( !jQuery.acceptData( elem ) ) {
-               return;
-       }
-
-       var thisCache, i,
-               isNode = elem.nodeType,
-
-               // See jQuery.data for more information
-               cache = isNode ? jQuery.cache : elem,
-               id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-       // If there is already no cache entry for this object, there is no
-       // purpose in continuing
-       if ( !cache[ id ] ) {
-               return;
-       }
-
-       if ( name ) {
-
-               thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-               if ( thisCache ) {
-
-                       // Support array or space separated string names for data keys
-                       if ( !jQuery.isArray( name ) ) {
-
-                               // try the string as a key before any manipulation
-                               if ( name in thisCache ) {
-                                       name = [ name ];
-                               } else {
-
-                                       // split the camel cased version by spaces unless a key with the spaces exists
-                                       name = jQuery.camelCase( name );
-                                       if ( name in thisCache ) {
-                                               name = [ name ];
-                                       } else {
-                                               name = name.split(" ");
-                                       }
-                               }
-                       } else {
+                       // Support array or space separated string of keys
+                       if ( jQuery.isArray( key ) ) {
                                // If "name" is an array of keys...
                                // When data is initially created, via ("key", "val") signature,
                                // keys will be converted to camelCase.
                                // Since there is no way to tell _how_ a key was added, remove
                                // both plain key and camelCase key. #12786
                                // This will only penalize the array argument path.
-                               name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+                               name = key.concat( key.map( jQuery.camelCase ) );
+                       } else {
+                               camel = jQuery.camelCase( key );
+                               // Try the string as a key before any manipulation
+                               if ( key in cache ) {
+                                       name = [ key, camel ];
+                               } else {
+                                       // If a key with the spaces exists, use it.
+                                       // Otherwise, create an array by matching non-whitespace
+                                       name = camel;
+                                       name = name in cache ?
+                                               [ name ] : ( name.match( rnotwhite ) || [] );
+                               }
                        }
 
                        i = name.length;
                        while ( i-- ) {
-                               delete thisCache[ name[i] ];
-                       }
-
-                       // If there is no data left in the cache, we want to continue
-                       // and let the cache object itself get destroyed
-                       if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
-                               return;
+                               delete cache[ name[ i ] ];
                        }
                }
+       },
+       hasData: function( owner ) {
+               return !jQuery.isEmptyObject(
+                       this.cache[ owner[ this.expando ] ] || {}
+               );
+       },
+       discard: function( owner ) {
+               if ( owner[ this.expando ] ) {
+                       delete this.cache[ owner[ this.expando ] ];
+               }
        }
+};
+var data_priv = new Data();
 
-       // See jQuery.data for more information
-       if ( !pvt ) {
-               delete cache[ id ].data;
+var data_user = new Data();
 
-               // Don't destroy the parent cache unless the internal data object
-               // had been the only thing left in it
-               if ( !isEmptyDataObject( cache[ id ] ) ) {
-                       return;
-               }
-       }
 
-       // Destroy the cache
-       if ( isNode ) {
-               jQuery.cleanData( [ elem ], true );
 
-       // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-       /* jshint eqeqeq: false */
-       } else if ( support.deleteExpando || cache != cache.window ) {
-               /* jshint eqeqeq: true */
-               delete cache[ id ];
+//     Implementation Summary
+//
+//     1. Enforce API surface and semantic compatibility with 1.9.x branch
+//     2. Improve the module's maintainability by reducing the storage
+//             paths to a single mechanism.
+//     3. Use the same single mechanism to support "private" and "user" data.
+//     4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//     5. Avoid exposing implementation details on user objects (eg. expando properties)
+//     6. Provide a clear path for implementation upgrade to WeakMap in 2014
 
-       // When all else fails, null
-       } else {
-               cache[ id ] = null;
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+       var name;
+
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+               name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                                       data === "false" ? false :
+                                       data === "null" ? null :
+                                       // Only convert to a number if it doesn't change the string
+                                       +data + "" === data ? +data :
+                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       data_user.set( elem, key, data );
+               } else {
+                       data = undefined;
+               }
        }
+       return data;
 }
 
 jQuery.extend({
-       cache: {},
-
-       // The following elements (space-suffixed to avoid Object.prototype collisions)
-       // throw uncatchable exceptions if you attempt to set expando properties
-       noData: {
-               "applet ": true,
-               "embed ": true,
-               // ...but Flash objects (which have this classid) *can* handle expandos
-               "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
-       },
-
        hasData: function( elem ) {
-               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-               return !!elem && !isEmptyDataObject( elem );
+               return data_user.hasData( elem ) || data_priv.hasData( elem );
        },
 
        data: function( elem, name, data ) {
-               return internalData( elem, name, data );
+               return data_user.access( elem, name, data );
        },
 
        removeData: function( elem, name ) {
-               return internalRemoveData( elem, name );
+               data_user.remove( elem, name );
        },
 
-       // For internal use only.
+       // TODO: Now that all calls to _data and _removeData have been replaced
+       // with direct calls to data_priv methods, these can be deprecated.
        _data: function( elem, name, data ) {
-               return internalData( elem, name, data, true );
+               return data_priv.access( elem, name, data );
        },
 
        _removeData: function( elem, name ) {
-               return internalRemoveData( elem, name, true );
+               data_priv.remove( elem, name );
        }
 });
 
 jQuery.fn.extend({
        data: function( key, value ) {
                var i, name, data,
-                       elem = this[0],
+                       elem = this[ 0 ],
                        attrs = elem && elem.attributes;
 
-               // Special expections of .data basically thwart jQuery.access,
-               // so implement the relevant behavior ourselves
-
                // Gets all values
                if ( key === undefined ) {
                        if ( this.length ) {
-                               data = jQuery.data( elem );
+                               data = data_user.get( elem );
 
-                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                               if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
                                        i = attrs.length;
                                        while ( i-- ) {
-                                               name = attrs[i].name;
-
-                                               if ( name.indexOf("data-") === 0 ) {
-                                                       name = jQuery.camelCase( name.slice(5) );
 
-                                                       dataAttr( elem, name, data[ name ] );
+                                               // Support: IE11+
+                                               // The attrs elements can be null (#14894)
+                                               if ( attrs[ i ] ) {
+                                                       name = attrs[ i ].name;
+                                                       if ( name.indexOf( "data-" ) === 0 ) {
+                                                               name = jQuery.camelCase( name.slice(5) );
+                                                               dataAttr( elem, name, data[ name ] );
+                                                       }
                                                }
                                        }
-                                       jQuery._data( elem, "parsedAttrs", true );
+                                       data_priv.set( elem, "hasDataAttrs", true );
                                }
                        }
 
@@ -3896,25 +3811,69 @@ jQuery.fn.extend({
                // Sets multiple values
                if ( typeof key === "object" ) {
                        return this.each(function() {
-                               jQuery.data( this, key );
+                               data_user.set( this, key );
                        });
                }
 
-               return arguments.length > 1 ?
+               return access( this, function( value ) {
+                       var data,
+                               camelKey = jQuery.camelCase( key );
+
+                       // The calling jQuery object (element matches) is not empty
+                       // (and therefore has an element appears at this[ 0 ]) and the
+                       // `value` parameter was not undefined. An empty jQuery object
+                       // will result in `undefined` for elem = this[ 0 ] which will
+                       // throw an exception if an attempt to read a data cache is made.
+                       if ( elem && value === undefined ) {
+                               // Attempt to get data from the cache
+                               // with the key as-is
+                               data = data_user.get( elem, key );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // Attempt to get data from the cache
+                               // with the key camelized
+                               data = data_user.get( elem, camelKey );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // Attempt to "discover" the data in
+                               // HTML5 custom data-* attrs
+                               data = dataAttr( elem, camelKey, undefined );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // We tried really hard, but the data doesn't exist.
+                               return;
+                       }
 
-                       // Sets one value
+                       // Set the data...
                        this.each(function() {
-                               jQuery.data( this, key, value );
-                       }) :
+                               // First, attempt to store a copy or reference of any
+                               // data that might've been store with a camelCased key.
+                               var data = data_user.get( this, camelKey );
+
+                               // For HTML5 data-* attribute interop, we have to
+                               // store property names with dashes in a camelCase form.
+                               // This might not apply to all properties...*
+                               data_user.set( this, camelKey, value );
 
-                       // Gets one value
-                       // Try to fetch any internally stored data first
-                       elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
+                               // *... In the case of properties that might _actually_
+                               // have dashes, we need to also store a copy of that
+                               // unchanged property.
+                               if ( key.indexOf("-") !== -1 && data !== undefined ) {
+                                       data_user.set( this, key, value );
+                               }
+                       });
+               }, null, value, arguments.length > 1, null, true );
        },
 
        removeData: function( key ) {
                return this.each(function() {
-                       jQuery.removeData( this, key );
+                       data_user.remove( this, key );
                });
        }
 });
@@ -3926,12 +3885,12 @@ jQuery.extend({
 
                if ( elem ) {
                        type = ( type || "fx" ) + "queue";
-                       queue = jQuery._data( elem, type );
+                       queue = data_priv.get( elem, type );
 
                        // Speed up dequeue by getting out quickly if this is just a lookup
                        if ( data ) {
-                               if ( !queue || jQuery.isArray(data) ) {
-                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               if ( !queue || jQuery.isArray( data ) ) {
+                                       queue = data_priv.access( elem, type, jQuery.makeArray(data) );
                                } else {
                                        queue.push( data );
                                }
@@ -3965,7 +3924,7 @@ jQuery.extend({
                                queue.unshift( "inprogress" );
                        }
 
-                       // clear up the last queue stop function
+                       // Clear up the last queue stop function
                        delete hooks.stop;
                        fn.call( elem, next, hooks );
                }
@@ -3975,13 +3934,12 @@ jQuery.extend({
                }
        },
 
-       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       // Not public - generate a queueHooks object, or return the current one
        _queueHooks: function( elem, type ) {
                var key = type + "queueHooks";
-               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+               return data_priv.get( elem, key ) || data_priv.access( elem, key, {
                        empty: jQuery.Callbacks("once memory").add(function() {
-                               jQuery._removeData( elem, type + "queue" );
-                               jQuery._removeData( elem, key );
+                               data_priv.remove( elem, [ type + "queue", key ] );
                        })
                });
        }
@@ -4006,7 +3964,7 @@ jQuery.fn.extend({
                        this.each(function() {
                                var queue = jQuery.queue( this, type, data );
 
-                               // ensure a hooks for this queue
+                               // Ensure a hooks for this queue
                                jQuery._queueHooks( this, type );
 
                                if ( type === "fx" && queue[0] !== "inprogress" ) {
@@ -4043,7 +4001,7 @@ jQuery.fn.extend({
                type = type || "fx";
 
                while ( i-- ) {
-                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       tmp = data_priv.get( elements[ i ], type + "queueHooks" );
                        if ( tmp && tmp.empty ) {
                                count++;
                                tmp.empty.add( resolve );
@@ -4064,160 +4022,44 @@ var isHidden = function( elem, el ) {
                return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
        };
 
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-       var i = 0,
-               length = elems.length,
-               bulk = key == null;
-
-       // Sets many values
-       if ( jQuery.type( key ) === "object" ) {
-               chainable = true;
-               for ( i in key ) {
-                       jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
-               }
-
-       // Sets one value
-       } else if ( value !== undefined ) {
-               chainable = true;
-
-               if ( !jQuery.isFunction( value ) ) {
-                       raw = true;
-               }
-
-               if ( bulk ) {
-                       // Bulk operations run against the entire set
-                       if ( raw ) {
-                               fn.call( elems, value );
-                               fn = null;
-
-                       // ...except when executing function values
-                       } else {
-                               bulk = fn;
-                               fn = function( elem, key, value ) {
-                                       return bulk.call( jQuery( elem ), value );
-                               };
-                       }
-               }
-
-               if ( fn ) {
-                       for ( ; i < length; i++ ) {
-                               fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
-                       }
-               }
-       }
-
-       return chainable ?
-               elems :
-
-               // Gets
-               bulk ?
-                       fn.call( elems ) :
-                       length ? fn( elems[0], key ) : emptyGet;
-};
 var rcheckableType = (/^(?:checkbox|radio)$/i);
 
 
 
 (function() {
        var fragment = document.createDocumentFragment(),
-               div = document.createElement("div"),
-               input = document.createElement("input");
+               div = fragment.appendChild( document.createElement( "div" ) ),
+               input = document.createElement( "input" );
 
-       // Setup
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a>";
-
-       // IE strips leading whitespace when .innerHTML is used
-       support.leadingWhitespace = div.firstChild.nodeType === 3;
-
-       // Make sure that tbody elements aren't automatically inserted
-       // IE will insert them into empty tables
-       support.tbody = !div.getElementsByTagName( "tbody" ).length;
-
-       // Make sure that link elements get serialized correctly by innerHTML
-       // This requires a wrapper element in IE
-       support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
+       // Support: Safari<=5.1
+       // Check state lost if the name is set (#11217)
+       // Support: Windows Web Apps (WWA)
+       // `name` and `type` must use .setAttribute for WWA (#14901)
+       input.setAttribute( "type", "radio" );
+       input.setAttribute( "checked", "checked" );
+       input.setAttribute( "name", "t" );
 
-       // Makes sure cloning an html5 element does not cause problems
-       // Where outerHTML is undefined, this still works
-       support.html5Clone =
-               document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
+       div.appendChild( input );
 
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       input.type = "checkbox";
-       input.checked = true;
-       fragment.appendChild( input );
-       support.appendChecked = input.checked;
+       // Support: Safari<=5.1, Android<4.2
+       // Older WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
+       // Support: IE<=11+
        // Make sure textarea (and checkbox) defaultValue is properly cloned
-       // Support: IE6-IE11+
        div.innerHTML = "<textarea>x</textarea>";
        support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-
-       // #11217 - WebKit loses check when the name is after the checked attribute
-       fragment.appendChild( div );
-       div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
-
-       // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
-       // old WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-       // Support: IE<9
-       // Opera does not clone events (and typeof div.attachEvent === undefined).
-       // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
-       support.noCloneEvent = true;
-       if ( div.attachEvent ) {
-               div.attachEvent( "onclick", function() {
-                       support.noCloneEvent = false;
-               });
-
-               div.cloneNode( true ).click();
-       }
-
-       // Execute the test only if not already executed in another module.
-       if (support.deleteExpando == null) {
-               // Support: IE<9
-               support.deleteExpando = true;
-               try {
-                       delete div.test;
-               } catch( e ) {
-                       support.deleteExpando = false;
-               }
-       }
-
-       // Null elements to avoid leaks in IE.
-       fragment = div = input = null;
 })();
+var strundefined = typeof undefined;
 
 
-(function() {
-       var i, eventName,
-               div = document.createElement( "div" );
-
-       // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)
-       for ( i in { submit: true, change: true, focusin: true }) {
-               eventName = "on" + i;
-
-               if ( !(support[ i + "Bubbles" ] = eventName in window) ) {
-                       // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
-                       div.setAttribute( eventName, "t" );
-                       support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false;
-               }
-       }
 
-       // Null elements to avoid leaks in IE.
-       div = null;
-})();
+support.focusinBubbles = "onfocusin" in window;
 
 
-var rformElems = /^(?:input|select|textarea)$/i,
+var
        rkeyEvent = /^key/,
-       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
        rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
        rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
 
@@ -4244,10 +4086,11 @@ jQuery.event = {
        global: {},
 
        add: function( elem, types, handler, data, selector ) {
-               var tmp, events, t, handleObjIn,
-                       special, eventHandle, handleObj,
-                       handlers, type, namespaces, origType,
-                       elemData = jQuery._data( elem );
+
+               var handleObjIn, eventHandle, tmp,
+                       events, t, handleObj,
+                       special, handlers, type, namespaces, origType,
+                       elemData = data_priv.get( elem );
 
                // Don't attach events to noData or text/comment nodes (but allow plain objects)
                if ( !elemData ) {
@@ -4274,12 +4117,9 @@ jQuery.event = {
                        eventHandle = elemData.handle = function( e ) {
                                // Discard the second event of a jQuery.event.trigger() and
                                // when an event is called after a page has unloaded
-                               return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?
-                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-                                       undefined;
+                               return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+                                       jQuery.event.dispatch.apply( elem, arguments ) : undefined;
                        };
-                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-                       eventHandle.elem = elem;
                }
 
                // Handle multiple events separated by a space
@@ -4321,14 +4161,10 @@ jQuery.event = {
                                handlers = events[ type ] = [];
                                handlers.delegateCount = 0;
 
-                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               // Only use addEventListener if the special events handler returns false
                                if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-                                       // Bind the global event handler to the element
                                        if ( elem.addEventListener ) {
                                                elem.addEventListener( type, eventHandle, false );
-
-                                       } else if ( elem.attachEvent ) {
-                                               elem.attachEvent( "on" + type, eventHandle );
                                        }
                                }
                        }
@@ -4352,17 +4188,15 @@ jQuery.event = {
                        jQuery.event.global[ type ] = true;
                }
 
-               // Nullify elem to prevent memory leaks in IE
-               elem = null;
        },
 
        // Detach an event or set of events from an element
        remove: function( elem, types, handler, selector, mappedTypes ) {
-               var j, handleObj, tmp,
-                       origCount, t, events,
-                       special, handlers, type,
-                       namespaces, origType,
-                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+               var j, origCount, tmp,
+                       events, t, handleObj,
+                       special, handlers, type, namespaces, origType,
+                       elemData = data_priv.hasData( elem ) && data_priv.get( elem );
 
                if ( !elemData || !(events = elemData.events) ) {
                        return;
@@ -4423,16 +4257,13 @@ jQuery.event = {
                // Remove the expando if it's no longer used
                if ( jQuery.isEmptyObject( events ) ) {
                        delete elemData.handle;
-
-                       // removeData also checks for emptiness and clears the expando if empty
-                       // so use it instead of delete
-                       jQuery._removeData( elem, "events" );
+                       data_priv.remove( elem, "events" );
                }
        },
 
        trigger: function( event, data, elem, onlyHandlers ) {
-               var handle, ontype, cur,
-                       bubbleType, special, tmp, i,
+
+               var i, cur, tmp, bubbleType, ontype, handle, special,
                        eventPath = [ elem || document ],
                        type = hasOwn.call( event, "type" ) ? event.type : event,
                        namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
@@ -4514,7 +4345,7 @@ jQuery.event = {
                                special.bindType || type;
 
                        // jQuery handler
-                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
                        if ( handle ) {
                                handle.apply( cur, data );
                        }
@@ -4537,9 +4368,8 @@ jQuery.event = {
                                jQuery.acceptData( elem ) ) {
 
                                // Call a native DOM method on the target with the same name name as the event.
-                               // Can't use an .isFunction() check here because IE6/7 fails that test.
                                // Don't do default actions on window, that's where global variables be (#6170)
-                               if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+                               if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
 
                                        // Don't re-trigger an onFOO event when we call its FOO() method
                                        tmp = elem[ ontype ];
@@ -4550,12 +4380,7 @@ jQuery.event = {
 
                                        // Prevent re-triggering of the same event, since we already bubbled it above
                                        jQuery.event.triggered = type;
-                                       try {
-                                               elem[ type ]();
-                                       } catch ( e ) {
-                                               // IE<9 dies on focus/blur to hidden element (#1486,#12518)
-                                               // only reproducible on winXP IE8 native, not IE9 in IE8 mode
-                                       }
+                                       elem[ type ]();
                                        jQuery.event.triggered = undefined;
 
                                        if ( tmp ) {
@@ -4573,10 +4398,10 @@ jQuery.event = {
                // Make a writable jQuery.Event from the native event object
                event = jQuery.event.fix( event );
 
-               var i, ret, handleObj, matched, j,
+               var i, j, ret, matched, handleObj,
                        handlerQueue = [],
                        args = slice.call( arguments ),
-                       handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+                       handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
                        special = jQuery.event.special[ event.type ] || {};
 
                // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -4599,8 +4424,8 @@ jQuery.event = {
                        j = 0;
                        while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
 
-                               // Triggered event must either 1) have no namespace, or
-                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+                               // a subset or equal to those in the bound event (both can have no namespace).
                                if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
 
                                        event.handleObj = handleObj;
@@ -4628,7 +4453,7 @@ jQuery.event = {
        },
 
        handlers: function( event, handlers ) {
-               var sel, handleObj, matches, i,
+               var i, matches, sel, handleObj,
                        handlerQueue = [],
                        delegateCount = handlers.delegateCount,
                        cur = event.target;
@@ -4638,13 +4463,10 @@ jQuery.event = {
                // Avoid non-left-click bubbling in Firefox (#3861)
                if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
 
-                       /* jshint eqeqeq: false */
-                       for ( ; cur != this; cur = cur.parentNode || this ) {
-                               /* jshint eqeqeq: true */
+                       for ( ; cur !== this; cur = cur.parentNode || this ) {
 
-                               // Don't check non-elements (#13208)
                                // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-                               if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+                               if ( cur.disabled !== true || event.type !== "click" ) {
                                        matches = [];
                                        for ( i = 0; i < delegateCount; i++ ) {
                                                handleObj = handlers[ i ];
@@ -4676,56 +4498,10 @@ jQuery.event = {
                return handlerQueue;
        },
 
-       fix: function( event ) {
-               if ( event[ jQuery.expando ] ) {
-                       return event;
-               }
+       // Includes some event props shared by KeyEvent and MouseEvent
+       props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
 
-               // Create a writable copy of the event object and normalize some properties
-               var i, prop, copy,
-                       type = event.type,
-                       originalEvent = event,
-                       fixHook = this.fixHooks[ type ];
-
-               if ( !fixHook ) {
-                       this.fixHooks[ type ] = fixHook =
-                               rmouseEvent.test( type ) ? this.mouseHooks :
-                               rkeyEvent.test( type ) ? this.keyHooks :
-                               {};
-               }
-               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-               event = new jQuery.Event( originalEvent );
-
-               i = copy.length;
-               while ( i-- ) {
-                       prop = copy[ i ];
-                       event[ prop ] = originalEvent[ prop ];
-               }
-
-               // Support: IE<9
-               // Fix target property (#1925)
-               if ( !event.target ) {
-                       event.target = originalEvent.srcElement || document;
-               }
-
-               // Support: Chrome 23+, Safari?
-               // Target should not be a text node (#504, #13143)
-               if ( event.target.nodeType === 3 ) {
-                       event.target = event.target.parentNode;
-               }
-
-               // Support: IE<9
-               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
-               event.metaKey = !!event.metaKey;
-
-               return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
-       },
-
-       // Includes some event props shared by KeyEvent and MouseEvent
-       props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-       fixHooks: {},
+       fixHooks: {},
 
        keyHooks: {
                props: "char charCode key keyCode".split(" "),
@@ -4741,11 +4517,10 @@ jQuery.event = {
        },
 
        mouseHooks: {
-               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
                filter: function( event, original ) {
-                       var body, eventDoc, doc,
-                               button = original.button,
-                               fromElement = original.fromElement;
+                       var eventDoc, doc, body,
+                               button = original.button;
 
                        // Calculate pageX/Y if missing and clientX/Y available
                        if ( event.pageX == null && original.clientX != null ) {
@@ -4757,11 +4532,6 @@ jQuery.event = {
                                event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
                        }
 
-                       // Add relatedTarget, if necessary
-                       if ( !event.relatedTarget && fromElement ) {
-                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                       }
-
                        // Add which for click: 1 === left; 2 === middle; 3 === right
                        // Note: button is not normalized, so don't use it
                        if ( !event.which && button !== undefined ) {
@@ -4772,6 +4542,48 @@ jQuery.event = {
                }
        },
 
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
+
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop, copy,
+                       type = event.type,
+                       originalEvent = event,
+                       fixHook = this.fixHooks[ type ];
+
+               if ( !fixHook ) {
+                       this.fixHooks[ type ] = fixHook =
+                               rmouseEvent.test( type ) ? this.mouseHooks :
+                               rkeyEvent.test( type ) ? this.keyHooks :
+                               {};
+               }
+               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+               event = new jQuery.Event( originalEvent );
+
+               i = copy.length;
+               while ( i-- ) {
+                       prop = copy[ i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Support: Cordova 2.5 (WebKit) (#13255)
+               // All events should have a target; Cordova deviceready doesn't
+               if ( !event.target ) {
+                       event.target = document;
+               }
+
+               // Support: Safari 6.0+, Chrome<28
+               // Target should not be a text node (#504, #13143)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+       },
+
        special: {
                load: {
                        // Prevent triggered image.load events from bubbling to window.load
@@ -4781,14 +4593,8 @@ jQuery.event = {
                        // Fire native event if possible so blur/focus sequence is correct
                        trigger: function() {
                                if ( this !== safeActiveElement() && this.focus ) {
-                                       try {
-                                               this.focus();
-                                               return false;
-                                       } catch ( e ) {
-                                               // Support: IE<9
-                                               // If we error on focus to hidden element (#1486, #12518),
-                                               // let .trigger() run the handlers
-                                       }
+                                       this.focus();
+                                       return false;
                                }
                        },
                        delegateType: "focusin"
@@ -4805,7 +4611,7 @@ jQuery.event = {
                click: {
                        // For checkbox, fire native event so checked state will be right
                        trigger: function() {
-                               if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+                               if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
                                        this.click();
                                        return false;
                                }
@@ -4820,8 +4626,9 @@ jQuery.event = {
                beforeunload: {
                        postDispatch: function( event ) {
 
-                               // Even when returnValue equals to undefined Firefox will still show alert
-                               if ( event.result !== undefined ) {
+                               // Support: Firefox 20+
+                               // Firefox doesn't alert if the returnValue field is not set.
+                               if ( event.result !== undefined && event.originalEvent ) {
                                        event.originalEvent.returnValue = event.result;
                                }
                        }
@@ -4852,26 +4659,11 @@ jQuery.event = {
        }
 };
 
-jQuery.removeEvent = document.removeEventListener ?
-       function( elem, type, handle ) {
-               if ( elem.removeEventListener ) {
-                       elem.removeEventListener( type, handle, false );
-               }
-       } :
-       function( elem, type, handle ) {
-               var name = "on" + type;
-
-               if ( elem.detachEvent ) {
-
-                       // #8545, #7054, preventing memory leaks for custom events in IE6-8
-                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
-                       if ( typeof elem[ name ] === strundefined ) {
-                               elem[ name ] = null;
-                       }
-
-                       elem.detachEvent( name, handle );
-               }
-       };
+jQuery.removeEvent = function( elem, type, handle ) {
+       if ( elem.removeEventListener ) {
+               elem.removeEventListener( type, handle, false );
+       }
+};
 
 jQuery.Event = function( src, props ) {
        // Allow instantiation without the 'new' keyword
@@ -4887,11 +4679,9 @@ jQuery.Event = function( src, props ) {
                // Events bubbling up the document may have been marked as prevented
                // by a handler lower down the tree; reflect the correct value.
                this.isDefaultPrevented = src.defaultPrevented ||
-                               src.defaultPrevented === undefined && (
-                               // Support: IE < 9
-                               src.returnValue === false ||
-                               // Support: Android < 4.0
-                               src.getPreventDefault && src.getPreventDefault() ) ?
+                               src.defaultPrevented === undefined &&
+                               // Support: Android<4.0
+                               src.returnValue === false ?
                        returnTrue :
                        returnFalse;
 
@@ -4923,46 +4713,40 @@ jQuery.Event.prototype = {
                var e = this.originalEvent;
 
                this.isDefaultPrevented = returnTrue;
-               if ( !e ) {
-                       return;
-               }
 
-               // If preventDefault exists, run it on the original event
-               if ( e.preventDefault ) {
+               if ( e && e.preventDefault ) {
                        e.preventDefault();
-
-               // Support: IE
-               // Otherwise set the returnValue property of the original event to false
-               } else {
-                       e.returnValue = false;
                }
        },
        stopPropagation: function() {
                var e = this.originalEvent;
 
                this.isPropagationStopped = returnTrue;
-               if ( !e ) {
-                       return;
-               }
-               // If stopPropagation exists, run it on the original event
-               if ( e.stopPropagation ) {
+
+               if ( e && e.stopPropagation ) {
                        e.stopPropagation();
                }
-
-               // Support: IE
-               // Set the cancelBubble property of the original event to true
-               e.cancelBubble = true;
        },
        stopImmediatePropagation: function() {
+               var e = this.originalEvent;
+
                this.isImmediatePropagationStopped = returnTrue;
+
+               if ( e && e.stopImmediatePropagation ) {
+                       e.stopImmediatePropagation();
+               }
+
                this.stopPropagation();
        }
 };
 
 // Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
 jQuery.each({
        mouseenter: "mouseover",
-       mouseleave: "mouseout"
+       mouseleave: "mouseout",
+       pointerenter: "pointerover",
+       pointerleave: "pointerout"
 }, function( orig, fix ) {
        jQuery.event.special[ orig ] = {
                delegateType: fix,
@@ -4986,112 +4770,7 @@ jQuery.each({
        };
 });
 
-// IE submit delegation
-if ( !support.submitBubbles ) {
-
-       jQuery.event.special.submit = {
-               setup: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
-                       }
-
-                       // Lazy-add a submit handler when a descendant form may potentially be submitted
-                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-                               // Node name check avoids a VML-related crash in IE (#9807)
-                               var elem = e.target,
-                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                               if ( form && !jQuery._data( form, "submitBubbles" ) ) {
-                                       jQuery.event.add( form, "submit._submit", function( event ) {
-                                               event._submit_bubble = true;
-                                       });
-                                       jQuery._data( form, "submitBubbles", true );
-                               }
-                       });
-                       // return undefined since we don't need an event listener
-               },
-
-               postDispatch: function( event ) {
-                       // If form was submitted by the user, bubble the event up the tree
-                       if ( event._submit_bubble ) {
-                               delete event._submit_bubble;
-                               if ( this.parentNode && !event.isTrigger ) {
-                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
-                               }
-                       }
-               },
-
-               teardown: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
-                       }
-
-                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                       jQuery.event.remove( this, "._submit" );
-               }
-       };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !support.changeBubbles ) {
-
-       jQuery.event.special.change = {
-
-               setup: function() {
-
-                       if ( rformElems.test( this.nodeName ) ) {
-                               // IE doesn't fire change on a check/radio until blur; trigger it on click
-                               // after a propertychange. Eat the blur-change in special.change.handle.
-                               // This still fires onchange a second time for check/radio after blur.
-                               if ( this.type === "checkbox" || this.type === "radio" ) {
-                                       jQuery.event.add( this, "propertychange._change", function( event ) {
-                                               if ( event.originalEvent.propertyName === "checked" ) {
-                                                       this._just_changed = true;
-                                               }
-                                       });
-                                       jQuery.event.add( this, "click._change", function( event ) {
-                                               if ( this._just_changed && !event.isTrigger ) {
-                                                       this._just_changed = false;
-                                               }
-                                               // Allow triggered, simulated change events (#11500)
-                                               jQuery.event.simulate( "change", this, event, true );
-                                       });
-                               }
-                               return false;
-                       }
-                       // Delegated event; lazy-add a change handler on descendant inputs
-                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
-                               var elem = e.target;
-
-                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
-                                       jQuery.event.add( elem, "change._change", function( event ) {
-                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
-                                               }
-                                       });
-                                       jQuery._data( elem, "changeBubbles", true );
-                               }
-                       });
-               },
-
-               handle: function( event ) {
-                       var elem = event.target;
-
-                       // Swallow native change events from checkbox/radio, we already triggered them above
-                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-                               return event.handleObj.handler.apply( this, arguments );
-                       }
-               },
-
-               teardown: function() {
-                       jQuery.event.remove( this, "._change" );
-
-                       return !rformElems.test( this.nodeName );
-               }
-       };
-}
-
+// Support: Firefox, Chrome, Safari
 // Create "bubbling" focus and blur events
 if ( !support.focusinBubbles ) {
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
@@ -5104,22 +4783,23 @@ if ( !support.focusinBubbles ) {
                jQuery.event.special[ fix ] = {
                        setup: function() {
                                var doc = this.ownerDocument || this,
-                                       attaches = jQuery._data( doc, fix );
+                                       attaches = data_priv.access( doc, fix );
 
                                if ( !attaches ) {
                                        doc.addEventListener( orig, handler, true );
                                }
-                               jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
+                               data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
                        },
                        teardown: function() {
                                var doc = this.ownerDocument || this,
-                                       attaches = jQuery._data( doc, fix ) - 1;
+                                       attaches = data_priv.access( doc, fix ) - 1;
 
                                if ( !attaches ) {
                                        doc.removeEventListener( orig, handler, true );
-                                       jQuery._removeData( doc, fix );
+                                       data_priv.remove( doc, fix );
+
                                } else {
-                                       jQuery._data( doc, fix, attaches );
+                                       data_priv.access( doc, fix, attaches );
                                }
                        }
                };
@@ -5129,7 +4809,7 @@ if ( !support.focusinBubbles ) {
 jQuery.fn.extend({
 
        on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-               var type, origFn;
+               var origFn, type;
 
                // Types can be a map of types/handlers
                if ( typeof types === "object" ) {
@@ -5230,28 +4910,9 @@ jQuery.fn.extend({
 });
 
 
-function createSafeFragment( document ) {
-       var list = nodeNames.split( "|" ),
-               safeFrag = document.createDocumentFragment();
-
-       if ( safeFrag.createElement ) {
-               while ( list.length ) {
-                       safeFrag.createElement(
-                               list.pop()
-                       );
-               }
-       }
-       return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-       rleadingWhitespace = /^\s+/,
+var
        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
        rtagName = /<([\w:]+)/,
-       rtbody = /<tbody/i,
        rhtml = /<|&#?\w+;/,
        rnoInnerhtml = /<(?:script|style|link)/i,
        // checked="checked" or checked
@@ -5262,56 +4923,25 @@ var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figca
 
        // We have to close these tags to support XHTML (#13200)
        wrapMap = {
+
+               // Support: IE9
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
-               legend: [ 1, "<fieldset>", "</fieldset>" ],
-               area: [ 1, "<map>", "</map>" ],
-               param: [ 1, "<object>", "</object>" ],
+
                thead: [ 1, "<table>", "</table>" ],
+               col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
                tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
                td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
 
-               // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-               // unless wrapped in a div with non-breaking characters in front of it.
-               _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
-       },
-       safeFragment = createSafeFragment( document ),
-       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+               _default: [ 0, "", "" ]
+       };
 
+// Support: IE9
 wrapMap.optgroup = wrapMap.option;
+
 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 wrapMap.th = wrapMap.td;
 
-function getAll( context, tag ) {
-       var elems, elem,
-               i = 0,
-               found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) :
-                       typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) :
-                       undefined;
-
-       if ( !found ) {
-               for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
-                       if ( !tag || jQuery.nodeName( elem, tag ) ) {
-                               found.push( elem );
-                       } else {
-                               jQuery.merge( found, getAll( elem, tag ) );
-                       }
-               }
-       }
-
-       return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-               jQuery.merge( [ context ], found ) :
-               found;
-}
-
-// Used in buildFragment, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-       if ( rcheckableType.test( elem.type ) ) {
-               elem.defaultChecked = elem.checked;
-       }
-}
-
-// Support: IE<8
+// Support: 1.x compatibility
 // Manipulating tables requires a tbody
 function manipulationTarget( elem, content ) {
        return jQuery.nodeName( elem, "table" ) &&
@@ -5324,118 +4954,86 @@ function manipulationTarget( elem, content ) {
 
 // Replace/restore the type attribute of script elements for safe DOM manipulation
 function disableScript( elem ) {
-       elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+       elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
        return elem;
 }
 function restoreScript( elem ) {
        var match = rscriptTypeMasked.exec( elem.type );
+
        if ( match ) {
-               elem.type = match[1];
+               elem.type = match[ 1 ];
        } else {
                elem.removeAttribute("type");
        }
+
        return elem;
 }
 
 // Mark scripts as having already been evaluated
 function setGlobalEval( elems, refElements ) {
-       var elem,
-               i = 0;
-       for ( ; (elem = elems[i]) != null; i++ ) {
-               jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+       var i = 0,
+               l = elems.length;
+
+       for ( ; i < l; i++ ) {
+               data_priv.set(
+                       elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+               );
        }
 }
 
 function cloneCopyEvent( src, dest ) {
+       var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
 
-       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+       if ( dest.nodeType !== 1 ) {
                return;
        }
 
-       var type, i, l,
-               oldData = jQuery._data( src ),
-               curData = jQuery._data( dest, oldData ),
-               events = oldData.events;
+       // 1. Copy private data: events, handlers, etc.
+       if ( data_priv.hasData( src ) ) {
+               pdataOld = data_priv.access( src );
+               pdataCur = data_priv.set( dest, pdataOld );
+               events = pdataOld.events;
 
-       if ( events ) {
-               delete curData.handle;
-               curData.events = {};
+               if ( events ) {
+                       delete pdataCur.handle;
+                       pdataCur.events = {};
 
-               for ( type in events ) {
-                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                               jQuery.event.add( dest, type, events[ type ][ i ] );
+                       for ( type in events ) {
+                               for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                                       jQuery.event.add( dest, type, events[ type ][ i ] );
+                               }
                        }
                }
        }
 
-       // make the cloned public data object a copy from the original
-       if ( curData.data ) {
-               curData.data = jQuery.extend( {}, curData.data );
-       }
-}
-
-function fixCloneNodeIssues( src, dest ) {
-       var nodeName, e, data;
-
-       // We do not need to do anything for non-Elements
-       if ( dest.nodeType !== 1 ) {
-               return;
-       }
-
-       nodeName = dest.nodeName.toLowerCase();
-
-       // IE6-8 copies events bound via attachEvent when using cloneNode.
-       if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
-               data = jQuery._data( dest );
-
-               for ( e in data.events ) {
-                       jQuery.removeEvent( dest, e, data.handle );
-               }
+       // 2. Copy user data
+       if ( data_user.hasData( src ) ) {
+               udataOld = data_user.access( src );
+               udataCur = jQuery.extend( {}, udataOld );
 
-               // Event data gets referenced instead of copied if the expando gets copied too
-               dest.removeAttribute( jQuery.expando );
+               data_user.set( dest, udataCur );
        }
+}
 
-       // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
-       if ( nodeName === "script" && dest.text !== src.text ) {
-               disableScript( dest ).text = src.text;
-               restoreScript( dest );
-
-       // IE6-10 improperly clones children of object elements using classid.
-       // IE10 throws NoModificationAllowedError if parent is null, #12132.
-       } else if ( nodeName === "object" ) {
-               if ( dest.parentNode ) {
-                       dest.outerHTML = src.outerHTML;
-               }
-
-               // This path appears unavoidable for IE9. When cloning an object
-               // element in IE9, the outerHTML strategy above is not sufficient.
-               // If the src has innerHTML and the destination does not,
-               // copy the src.innerHTML into the dest.innerHTML. #10324
-               if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
-                       dest.innerHTML = src.innerHTML;
-               }
-
-       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-               // IE6-8 fails to persist the checked state of a cloned checkbox
-               // or radio button. Worse, IE6-7 fail to give the cloned element
-               // a checked appearance if the defaultChecked value isn't also set
+function getAll( context, tag ) {
+       var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+                       context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+                       [];
 
-               dest.defaultChecked = dest.checked = src.checked;
+       return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+               jQuery.merge( [ context ], ret ) :
+               ret;
+}
 
-               // IE6-7 get confused and end up setting the value of a cloned
-               // checkbox/radio button to an empty string instead of "on"
-               if ( dest.value !== src.value ) {
-                       dest.value = src.value;
-               }
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+       var nodeName = dest.nodeName.toLowerCase();
 
-       // IE6-8 fails to return the selected option to the default selected
-       // state when cloning options
-       } else if ( nodeName === "option" ) {
-               dest.defaultSelected = dest.selected = src.defaultSelected;
+       // Fails to persist the checked state of a cloned checkbox or radio button.
+       if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+               dest.checked = src.checked;
 
-       // IE6-8 fails to set the defaultValue to the correct value when
-       // cloning other types of input fields
+       // Fails to return the selected option to the default selected state when cloning options
        } else if ( nodeName === "input" || nodeName === "textarea" ) {
                dest.defaultValue = src.defaultValue;
        }
@@ -5443,31 +5041,20 @@ function fixCloneNodeIssues( src, dest ) {
 
 jQuery.extend({
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var destElements, node, clone, i, srcElements,
+               var i, l, srcElements, destElements,
+                       clone = elem.cloneNode( true ),
                        inPage = jQuery.contains( elem.ownerDocument, elem );
 
-               if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-                       clone = elem.cloneNode( true );
-
-               // IE<=8 does not properly clone detached, unknown element nodes
-               } else {
-                       fragmentDiv.innerHTML = elem.outerHTML;
-                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-               }
-
-               if ( (!support.noCloneEvent || !support.noCloneChecked) &&
-                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+               // Fix IE cloning issues
+               if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+                               !jQuery.isXMLDoc( elem ) ) {
 
                        // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
                        destElements = getAll( clone );
                        srcElements = getAll( elem );
 
-                       // Fix all IE cloning issues
-                       for ( i = 0; (node = srcElements[i]) != null; ++i ) {
-                               // Ensure that the destination node is not null; Fixes #9587
-                               if ( destElements[i] ) {
-                                       fixCloneNodeIssues( node, destElements[i] );
-                               }
+                       for ( i = 0, l = srcElements.length; i < l; i++ ) {
+                               fixInput( srcElements[ i ], destElements[ i ] );
                        }
                }
 
@@ -5477,8 +5064,8 @@ jQuery.extend({
                                srcElements = srcElements || getAll( elem );
                                destElements = destElements || getAll( clone );
 
-                               for ( i = 0; (node = srcElements[i]) != null; i++ ) {
-                                       cloneCopyEvent( node, destElements[i] );
+                               for ( i = 0, l = srcElements.length; i < l; i++ ) {
+                                       cloneCopyEvent( srcElements[ i ], destElements[ i ] );
                                }
                        } else {
                                cloneCopyEvent( elem, clone );
@@ -5491,22 +5078,16 @@ jQuery.extend({
                        setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
                }
 
-               destElements = srcElements = node = null;
-
                // Return the cloned set
                return clone;
        },
 
        buildFragment: function( elems, context, scripts, selection ) {
-               var j, elem, contains,
-                       tmp, tag, tbody, wrap,
-                       l = elems.length,
-
-                       // Ensure a safe fragment
-                       safe = createSafeFragment( context ),
-
+               var elem, tmp, tag, wrap, contains, j,
+                       fragment = context.createDocumentFragment(),
                        nodes = [],
-                       i = 0;
+                       i = 0,
+                       l = elems.length;
 
                for ( ; i < l; i++ ) {
                        elem = elems[ i ];
@@ -5515,6 +5096,8 @@ jQuery.extend({
 
                                // Add nodes directly
                                if ( jQuery.type( elem ) === "object" ) {
+                                       // Support: QtWebKit, PhantomJS
+                                       // push.apply(_, arraylike) throws on ancient WebKit
                                        jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
 
                                // Convert non-html into a text node
@@ -5523,71 +5106,34 @@ jQuery.extend({
 
                                // Convert html into DOM nodes
                                } else {
-                                       tmp = tmp || safe.appendChild( context.createElement("div") );
+                                       tmp = tmp || fragment.appendChild( context.createElement("div") );
 
                                        // Deserialize a standard representation
-                                       tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase();
+                                       tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
                                        wrap = wrapMap[ tag ] || wrapMap._default;
-
-                                       tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+                                       tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
 
                                        // Descend through wrappers to the right content
-                                       j = wrap[0];
+                                       j = wrap[ 0 ];
                                        while ( j-- ) {
                                                tmp = tmp.lastChild;
                                        }
 
-                                       // Manually add leading whitespace removed by IE
-                                       if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-                                               nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
-                                       }
-
-                                       // Remove IE's autoinserted <tbody> from table fragments
-                                       if ( !support.tbody ) {
-
-                                               // String was a <table>, *may* have spurious <tbody>
-                                               elem = tag === "table" && !rtbody.test( elem ) ?
-                                                       tmp.firstChild :
-
-                                                       // String was a bare <thead> or <tfoot>
-                                                       wrap[1] === "<table>" && !rtbody.test( elem ) ?
-                                                               tmp :
-                                                               0;
-
-                                               j = elem && elem.childNodes.length;
-                                               while ( j-- ) {
-                                                       if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
-                                                               elem.removeChild( tbody );
-                                                       }
-                                               }
-                                       }
-
+                                       // Support: QtWebKit, PhantomJS
+                                       // push.apply(_, arraylike) throws on ancient WebKit
                                        jQuery.merge( nodes, tmp.childNodes );
 
-                                       // Fix #12392 for WebKit and IE > 9
-                                       tmp.textContent = "";
-
-                                       // Fix #12392 for oldIE
-                                       while ( tmp.firstChild ) {
-                                               tmp.removeChild( tmp.firstChild );
-                                       }
+                                       // Remember the top-level container
+                                       tmp = fragment.firstChild;
 
-                                       // Remember the top-level container for proper cleanup
-                                       tmp = safe.lastChild;
+                                       // Ensure the created nodes are orphaned (#12392)
+                                       tmp.textContent = "";
                                }
                        }
                }
 
-               // Fix #11356: Clear elements from fragment
-               if ( tmp ) {
-                       safe.removeChild( tmp );
-               }
-
-               // Reset defaultChecked for any radios and checkboxes
-               // about to be appended to the DOM in IE 6/7 (#8060)
-               if ( !support.appendChecked ) {
-                       jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
-               }
+               // Remove wrapper from fragment
+               fragment.textContent = "";
 
                i = 0;
                while ( (elem = nodes[ i++ ]) ) {
@@ -5601,7 +5147,7 @@ jQuery.extend({
                        contains = jQuery.contains( elem.ownerDocument, elem );
 
                        // Append to fragment
-                       tmp = getAll( safe.appendChild( elem ), "script" );
+                       tmp = getAll( fragment.appendChild( elem ), "script" );
 
                        // Preserve script evaluation history
                        if ( contains ) {
@@ -5619,26 +5165,19 @@ jQuery.extend({
                        }
                }
 
-               tmp = null;
-
-               return safe;
+               return fragment;
        },
 
-       cleanData: function( elems, /* internal */ acceptData ) {
-               var elem, type, id, data,
-                       i = 0,
-                       internalKey = jQuery.expando,
-                       cache = jQuery.cache,
-                       deleteExpando = support.deleteExpando,
-                       special = jQuery.event.special;
-
-               for ( ; (elem = elems[i]) != null; i++ ) {
-                       if ( acceptData || jQuery.acceptData( elem ) ) {
+       cleanData: function( elems ) {
+               var data, elem, type, key,
+                       special = jQuery.event.special,
+                       i = 0;
 
-                               id = elem[ internalKey ];
-                               data = id && cache[ id ];
+               for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+                       if ( jQuery.acceptData( elem ) ) {
+                               key = elem[ data_priv.expando ];
 
-                               if ( data ) {
+                               if ( key && (data = data_priv.cache[ key ]) ) {
                                        if ( data.events ) {
                                                for ( type in data.events ) {
                                                        if ( special[ type ] ) {
@@ -5650,29 +5189,14 @@ jQuery.extend({
                                                        }
                                                }
                                        }
-
-                                       // Remove cache only if it was not already removed by jQuery.event.remove
-                                       if ( cache[ id ] ) {
-
-                                               delete cache[ id ];
-
-                                               // IE does not allow us to delete expando properties from nodes,
-                                               // nor does it have a removeAttribute function on Document nodes;
-                                               // we must handle all of these cases
-                                               if ( deleteExpando ) {
-                                                       delete elem[ internalKey ];
-
-                                               } else if ( typeof elem.removeAttribute !== strundefined ) {
-                                                       elem.removeAttribute( internalKey );
-
-                                               } else {
-                                                       elem[ internalKey ] = null;
-                                               }
-
-                                               deletedIds.push( id );
+                                       if ( data_priv.cache[ key ] ) {
+                                               // Discard any remaining `private` data
+                                               delete data_priv.cache[ key ];
                                        }
                                }
                        }
+                       // Discard any remaining `user` data
+                       delete data_user.cache[ elem[ data_user.expando ] ];
                }
        }
 });
@@ -5682,7 +5206,11 @@ jQuery.fn.extend({
                return access( this, function( value ) {
                        return value === undefined ?
                                jQuery.text( this ) :
-                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+                               this.empty().each(function() {
+                                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                                               this.textContent = value;
+                                       }
+                               });
                }, null, value, arguments.length );
        },
 
@@ -5726,7 +5254,6 @@ jQuery.fn.extend({
                        i = 0;
 
                for ( ; (elem = elems[i]) != null; i++ ) {
-
                        if ( !keepData && elem.nodeType === 1 ) {
                                jQuery.cleanData( getAll( elem ) );
                        }
@@ -5747,20 +5274,13 @@ jQuery.fn.extend({
                        i = 0;
 
                for ( ; (elem = this[i]) != null; i++ ) {
-                       // Remove element nodes and prevent memory leaks
                        if ( elem.nodeType === 1 ) {
-                               jQuery.cleanData( getAll( elem, false ) );
-                       }
 
-                       // Remove any remaining nodes
-                       while ( elem.firstChild ) {
-                               elem.removeChild( elem.firstChild );
-                       }
+                               // Prevent memory leaks
+                               jQuery.cleanData( getAll( elem, false ) );
 
-                       // If this is a select, ensure that it displays empty (#12336)
-                       // Support: IE<9
-                       if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
-                               elem.options.length = 0;
+                               // Remove any remaining nodes
+                               elem.textContent = "";
                        }
                }
 
@@ -5782,24 +5302,21 @@ jQuery.fn.extend({
                                i = 0,
                                l = this.length;
 
-                       if ( value === undefined ) {
-                               return elem.nodeType === 1 ?
-                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                       undefined;
+                       if ( value === undefined && elem.nodeType === 1 ) {
+                               return elem.innerHTML;
                        }
 
                        // See if we can take a shortcut and just use innerHTML
                        if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                               ( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-                               ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-                               !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) {
+                               !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
 
                                value = value.replace( rxhtmlTag, "<$1></$2>" );
 
                                try {
-                                       for (; i < l; i++ ) {
+                                       for ( ; i < l; i++ ) {
+                                               elem = this[ i ] || {};
+
                                                // Remove element nodes and prevent memory leaks
-                                               elem = this[i] || {};
                                                if ( elem.nodeType === 1 ) {
                                                        jQuery.cleanData( getAll( elem, false ) );
                                                        elem.innerHTML = value;
@@ -5809,7 +5326,7 @@ jQuery.fn.extend({
                                        elem = 0;
 
                                // If using innerHTML throws an exception, use the fallback method
-                               } catch(e) {}
+                               } catch( e ) {}
                        }
 
                        if ( elem ) {
@@ -5845,13 +5362,12 @@ jQuery.fn.extend({
                // Flatten any nested arrays
                args = concat.apply( [], args );
 
-               var first, node, hasScripts,
-                       scripts, doc, fragment,
+               var fragment, first, scripts, hasScripts, node, doc,
                        i = 0,
                        l = this.length,
                        set = this,
                        iNoClone = l - 1,
-                       value = args[0],
+                       value = args[ 0 ],
                        isFunction = jQuery.isFunction( value );
 
                // We can't cloneNode fragments that contain checked, in WebKit
@@ -5861,7 +5377,7 @@ jQuery.fn.extend({
                        return this.each(function( index ) {
                                var self = set.eq( index );
                                if ( isFunction ) {
-                                       args[0] = value.call( this, index, self.html() );
+                                       args[ 0 ] = value.call( this, index, self.html() );
                                }
                                self.domManip( args, callback );
                        });
@@ -5889,11 +5405,13 @@ jQuery.fn.extend({
 
                                                // Keep references to cloned scripts for later restoration
                                                if ( hasScripts ) {
+                                                       // Support: QtWebKit
+                                                       // jQuery.merge because push.apply(_, arraylike) throws
                                                        jQuery.merge( scripts, getAll( node, "script" ) );
                                                }
                                        }
 
-                                       callback.call( this[i], node, i );
+                                       callback.call( this[ i ], node, i );
                                }
 
                                if ( hasScripts ) {
@@ -5906,7 +5424,7 @@ jQuery.fn.extend({
                                        for ( i = 0; i < hasScripts; i++ ) {
                                                node = scripts[ i ];
                                                if ( rscriptType.test( node.type || "" ) &&
-                                                       !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+                                                       !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
 
                                                        if ( node.src ) {
                                                                // Optional AJAX dependency, but won't run scripts if not present
@@ -5914,14 +5432,11 @@ jQuery.fn.extend({
                                                                        jQuery._evalUrl( node.src );
                                                                }
                                                        } else {
-                                                               jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                                               jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
                                                        }
                                                }
                                        }
                                }
-
-                               // Fix #11809: Avoid leaking memory
-                               fragment = first = null;
                        }
                }
 
@@ -5938,16 +5453,17 @@ jQuery.each({
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
                var elems,
-                       i = 0,
                        ret = [],
                        insert = jQuery( selector ),
-                       last = insert.length - 1;
+                       last = insert.length - 1,
+                       i = 0;
 
                for ( ; i <= last; i++ ) {
-                       elems = i === last ? this : this.clone(true);
-                       jQuery( insert[i] )[ original ]( elems );
+                       elems = i === last ? this : this.clone( true );
+                       jQuery( insert[ i ] )[ original ]( elems );
 
-                       // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+                       // Support: QtWebKit
+                       // .get() because push.apply(_, arraylike) throws
                        push.apply( ret, elems.get() );
                }
 
@@ -5966,14 +5482,15 @@ var iframe,
  */
 // Called only from within defaultDisplay
 function actualDisplay( name, doc ) {
-       var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+       var style,
+               elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
 
                // getDefaultComputedStyle might be reliably used only on attached element
-               display = window.getDefaultComputedStyle ?
+               display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
 
-                       // Use of this method is a temporary fix (more like optmization) until something better comes along,
+                       // Use of this method is a temporary fix (more like optimization) until something better comes along,
                        // since it was removed from specification and supported only in FF
-                       window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" );
+                       style.display : jQuery.css( elem[ 0 ], "display" );
 
        // We don't have any data stored on the element,
        // so use "detach" method as fast way to get rid of the element
@@ -6000,7 +5517,7 @@ function defaultDisplay( nodeName ) {
                        iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
 
                        // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
-                       doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
+                       doc = iframe[ 0 ].contentDocument;
 
                        // Support: IE
                        doc.write();
@@ -6016,211 +5533,83 @@ function defaultDisplay( nodeName ) {
 
        return display;
 }
-
-
-(function() {
-       var a, shrinkWrapBlocksVal,
-               div = document.createElement( "div" ),
-               divReset =
-                       "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;" +
-                       "display:block;padding:0;margin:0;border:0";
-
-       // Setup
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-       a = div.getElementsByTagName( "a" )[ 0 ];
-
-       a.style.cssText = "float:left;opacity:.5";
-
-       // Make sure that element opacity exists
-       // (IE uses filter instead)
-       // Use a regex to work around a WebKit issue. See #5145
-       support.opacity = /^0.5/.test( a.style.opacity );
-
-       // Verify style float existence
-       // (IE uses styleFloat instead of cssFloat)
-       support.cssFloat = !!a.style.cssFloat;
-
-       div.style.backgroundClip = "content-box";
-       div.cloneNode( true ).style.backgroundClip = "";
-       support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-       // Null elements to avoid leaks in IE.
-       a = div = null;
-
-       support.shrinkWrapBlocks = function() {
-               var body, container, div, containerStyles;
-
-               if ( shrinkWrapBlocksVal == null ) {
-                       body = document.getElementsByTagName( "body" )[ 0 ];
-                       if ( !body ) {
-                               // Test fired too early or in an unsupported environment, exit.
-                               return;
-                       }
-
-                       containerStyles = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px";
-                       container = document.createElement( "div" );
-                       div = document.createElement( "div" );
-
-                       body.appendChild( container ).appendChild( div );
-
-                       // Will be changed later if needed.
-                       shrinkWrapBlocksVal = false;
-
-                       if ( typeof div.style.zoom !== strundefined ) {
-                               // Support: IE6
-                               // Check if elements with layout shrink-wrap their children
-                               div.style.cssText = divReset + ";width:1px;padding:1px;zoom:1";
-                               div.innerHTML = "<div></div>";
-                               div.firstChild.style.width = "5px";
-                               shrinkWrapBlocksVal = div.offsetWidth !== 3;
-                       }
-
-                       body.removeChild( container );
-
-                       // Null elements to avoid leaks in IE.
-                       body = container = div = null;
-               }
-
-               return shrinkWrapBlocksVal;
-       };
-
-})();
 var rmargin = (/^margin/);
 
 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
 
+var getStyles = function( elem ) {
+               // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+               // IE throws on elements created in popups
+               // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+               if ( elem.ownerDocument.defaultView.opener ) {
+                       return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+               }
 
-
-var getStyles, curCSS,
-       rposition = /^(top|right|bottom|left)$/;
-
-if ( window.getComputedStyle ) {
-       getStyles = function( elem ) {
-               return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+               return window.getComputedStyle( elem, null );
        };
 
-       curCSS = function( elem, name, computed ) {
-               var width, minWidth, maxWidth, ret,
-                       style = elem.style;
-
-               computed = computed || getStyles( elem );
-
-               // getPropertyValue is only needed for .css('filter') in IE9, see #12537
-               ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
-
-               if ( computed ) {
-
-                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-                               ret = jQuery.style( elem, name );
-                       }
-
-                       // A tribute to the "awesome hack by Dean Edwards"
-                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-                               // Remember the original values
-                               width = style.width;
-                               minWidth = style.minWidth;
-                               maxWidth = style.maxWidth;
 
-                               // Put in the new values to get a computed value out
-                               style.minWidth = style.maxWidth = style.width = ret;
-                               ret = computed.width;
 
-                               // Revert the changed values
-                               style.width = width;
-                               style.minWidth = minWidth;
-                               style.maxWidth = maxWidth;
-                       }
-               }
+function curCSS( elem, name, computed ) {
+       var width, minWidth, maxWidth, ret,
+               style = elem.style;
 
-               // Support: IE
-               // IE returns zIndex value as an integer.
-               return ret === undefined ?
-                       ret :
-                       ret + "";
-       };
-} else if ( document.documentElement.currentStyle ) {
-       getStyles = function( elem ) {
-               return elem.currentStyle;
-       };
+       computed = computed || getStyles( elem );
 
-       curCSS = function( elem, name, computed ) {
-               var left, rs, rsLeft, ret,
-                       style = elem.style;
+       // Support: IE9
+       // getPropertyValue is only needed for .css('filter') (#12537)
+       if ( computed ) {
+               ret = computed.getPropertyValue( name ) || computed[ name ];
+       }
 
-               computed = computed || getStyles( elem );
-               ret = computed ? computed[ name ] : undefined;
+       if ( computed ) {
 
-               // Avoid setting ret to empty string here
-               // so we don't default to auto
-               if ( ret == null && style && style[ name ] ) {
-                       ret = style[ name ];
+               if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                       ret = jQuery.style( elem, name );
                }
 
-               // From the awesome hack by Dean Edwards
-               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-               // If we're not dealing with a regular pixel number
-               // but a number that has a weird ending, we need to convert it to pixels
-               // but not position css attributes, as those are proportional to the parent element instead
-               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+               // Support: iOS < 6
+               // A tribute to the "awesome hack by Dean Edwards"
+               // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+               // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+               if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
 
                        // Remember the original values
-                       left = style.left;
-                       rs = elem.runtimeStyle;
-                       rsLeft = rs && rs.left;
+                       width = style.width;
+                       minWidth = style.minWidth;
+                       maxWidth = style.maxWidth;
 
                        // Put in the new values to get a computed value out
-                       if ( rsLeft ) {
-                               rs.left = elem.currentStyle.left;
-                       }
-                       style.left = name === "fontSize" ? "1em" : ret;
-                       ret = style.pixelLeft + "px";
+                       style.minWidth = style.maxWidth = style.width = ret;
+                       ret = computed.width;
 
                        // Revert the changed values
-                       style.left = left;
-                       if ( rsLeft ) {
-                               rs.left = rsLeft;
-                       }
+                       style.width = width;
+                       style.minWidth = minWidth;
+                       style.maxWidth = maxWidth;
                }
+       }
 
+       return ret !== undefined ?
                // Support: IE
                // IE returns zIndex value as an integer.
-               return ret === undefined ?
-                       ret :
-                       ret + "" || "auto";
-       };
+               ret + "" :
+               ret;
 }
 
 
-
-
 function addGetHookIf( conditionFn, hookFn ) {
        // Define the hook, we'll check on the first run if it's really needed.
        return {
                get: function() {
-                       var condition = conditionFn();
-
-                       if ( condition == null ) {
-                               // The test was not ready at this point; screw the hook this time
-                               // but check again when needed next time.
-                               return;
-                       }
-
-                       if ( condition ) {
-                               // Hook not needed (or it's not possible to use it due to missing dependency),
-                               // remove it.
-                               // Since there are no other hooks for marginRight, remove the whole object.
+                       if ( conditionFn() ) {
+                               // Hook not needed (or it's not possible to use it due
+                               // to missing dependency), remove it.
                                delete this.get;
                                return;
                        }
 
                        // Hook needed; redefine it so that the support test is not executed again.
-
                        return (this.get = hookFn).apply( this, arguments );
                }
        };
@@ -6228,188 +5617,91 @@ function addGetHookIf( conditionFn, hookFn ) {
 
 
 (function() {
-       var a, reliableHiddenOffsetsVal, boxSizingVal, boxSizingReliableVal,
-               pixelPositionVal, reliableMarginRightVal,
-               div = document.createElement( "div" ),
-               containerStyles = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px",
-               divReset =
-                       "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;" +
-                       "display:block;padding:0;margin:0;border:0";
-
-       // Setup
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-       a = div.getElementsByTagName( "a" )[ 0 ];
-
-       a.style.cssText = "float:left;opacity:.5";
-
-       // Make sure that element opacity exists
-       // (IE uses filter instead)
-       // Use a regex to work around a WebKit issue. See #5145
-       support.opacity = /^0.5/.test( a.style.opacity );
+       var pixelPositionVal, boxSizingReliableVal,
+               docElem = document.documentElement,
+               container = document.createElement( "div" ),
+               div = document.createElement( "div" );
 
-       // Verify style float existence
-       // (IE uses styleFloat instead of cssFloat)
-       support.cssFloat = !!a.style.cssFloat;
+       if ( !div.style ) {
+               return;
+       }
 
+       // Support: IE9-11+
+       // Style of cloned element affects source element cloned (#8908)
        div.style.backgroundClip = "content-box";
        div.cloneNode( true ).style.backgroundClip = "";
        support.clearCloneStyle = div.style.backgroundClip === "content-box";
 
-       // Null elements to avoid leaks in IE.
-       a = div = null;
-
-       jQuery.extend(support, {
-               reliableHiddenOffsets: function() {
-                       if ( reliableHiddenOffsetsVal != null ) {
-                               return reliableHiddenOffsetsVal;
-                       }
-
-                       var container, tds, isSupported,
-                               div = document.createElement( "div" ),
-                               body = document.getElementsByTagName( "body" )[ 0 ];
-
-                       if ( !body ) {
-                               // Return for frameset docs that don't have a body
-                               return;
-                       }
-
-                       // Setup
-                       div.setAttribute( "className", "t" );
-                       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
-                       container = document.createElement( "div" );
-                       container.style.cssText = containerStyles;
-
-                       body.appendChild( container ).appendChild( div );
-
-                       // Support: IE8
-                       // Check if table cells still have offsetWidth/Height when they are set
-                       // to display:none and there are still other visible table cells in a
-                       // table row; if so, offsetWidth/Height are not reliable for use when
-                       // determining if an element has been hidden directly using
-                       // display:none (it is still safe to use offsets if a parent element is
-                       // hidden; don safety goggles and see bug #4512 for more information).
-                       div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-                       tds = div.getElementsByTagName( "td" );
-                       tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-                       isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-                       tds[ 0 ].style.display = "";
-                       tds[ 1 ].style.display = "none";
-
-                       // Support: IE8
-                       // Check if empty table cells still have offsetWidth/Height
-                       reliableHiddenOffsetsVal = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-                       body.removeChild( container );
-
-                       // Null elements to avoid leaks in IE.
-                       div = body = null;
-
-                       return reliableHiddenOffsetsVal;
-               },
-
-               boxSizing: function() {
-                       if ( boxSizingVal == null ) {
-                               computeStyleTests();
-                       }
-                       return boxSizingVal;
-               },
+       container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+               "position:absolute";
+       container.appendChild( div );
 
-               boxSizingReliable: function() {
-                       if ( boxSizingReliableVal == null ) {
-                               computeStyleTests();
-                       }
-                       return boxSizingReliableVal;
-               },
-
-               pixelPosition: function() {
-                       if ( pixelPositionVal == null ) {
-                               computeStyleTests();
-                       }
-                       return pixelPositionVal;
-               },
-
-               reliableMarginRight: function() {
-                       var body, container, div, marginDiv;
-
-                       // Use window.getComputedStyle because jsdom on node.js will break without it.
-                       if ( reliableMarginRightVal == null && window.getComputedStyle ) {
-                               body = document.getElementsByTagName( "body" )[ 0 ];
-                               if ( !body ) {
-                                       // Test fired too early or in an unsupported environment, exit.
-                                       return;
+       // Executing both pixelPosition & boxSizingReliable tests require only one layout
+       // so they're executed at the same time to save the second computation.
+       function computePixelPositionAndBoxSizingReliable() {
+               div.style.cssText =
+                       // Support: Firefox<29, Android 2.3
+                       // Vendor-prefix box-sizing
+                       "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+                       "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+                       "border:1px;padding:1px;width:4px;position:absolute";
+               div.innerHTML = "";
+               docElem.appendChild( container );
+
+               var divStyle = window.getComputedStyle( div, null );
+               pixelPositionVal = divStyle.top !== "1%";
+               boxSizingReliableVal = divStyle.width === "4px";
+
+               docElem.removeChild( container );
+       }
+
+       // Support: node.js jsdom
+       // Don't assume that getComputedStyle is a property of the global object
+       if ( window.getComputedStyle ) {
+               jQuery.extend( support, {
+                       pixelPosition: function() {
+
+                               // This test is executed only once but we still do memoizing
+                               // since we can use the boxSizingReliable pre-computing.
+                               // No need to check if the test was already performed, though.
+                               computePixelPositionAndBoxSizingReliable();
+                               return pixelPositionVal;
+                       },
+                       boxSizingReliable: function() {
+                               if ( boxSizingReliableVal == null ) {
+                                       computePixelPositionAndBoxSizingReliable();
                                }
+                               return boxSizingReliableVal;
+                       },
+                       reliableMarginRight: function() {
 
-                               container = document.createElement( "div" );
-                               div = document.createElement( "div" );
-                               container.style.cssText = containerStyles;
-
-                               body.appendChild( container ).appendChild( div );
-
+                               // Support: Android 2.3
                                // Check if div with explicit width and no margin-right incorrectly
                                // gets computed margin-right based on width of container. (#3333)
-                               // Fails in WebKit before Feb 2011 nightlies
                                // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                               marginDiv = div.appendChild( document.createElement( "div" ) );
-                               marginDiv.style.cssText = div.style.cssText = divReset;
+                               // This support function is only executed once so no memoizing is needed.
+                               var ret,
+                                       marginDiv = div.appendChild( document.createElement( "div" ) );
+
+                               // Reset CSS: box-sizing; display; margin; border; padding
+                               marginDiv.style.cssText = div.style.cssText =
+                                       // Support: Firefox<29, Android 2.3
+                                       // Vendor-prefix box-sizing
+                                       "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+                                       "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
                                marginDiv.style.marginRight = marginDiv.style.width = "0";
                                div.style.width = "1px";
+                               docElem.appendChild( container );
 
-                               reliableMarginRightVal =
-                                       !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-
-                               body.removeChild( container );
-                       }
-
-                       return reliableMarginRightVal;
-               }
-       });
-
-       function computeStyleTests() {
-               var container, div,
-                       body = document.getElementsByTagName( "body" )[ 0 ];
-
-               if ( !body ) {
-                       // Test fired too early or in an unsupported environment, exit.
-                       return;
-               }
-
-               container = document.createElement( "div" );
-               div = document.createElement( "div" );
-               container.style.cssText = containerStyles;
+                               ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
 
-               body.appendChild( container ).appendChild( div );
+                               docElem.removeChild( container );
+                               div.removeChild( marginDiv );
 
-               div.style.cssText =
-                       "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" +
-                               "position:absolute;display:block;padding:1px;border:1px;width:4px;" +
-                               "margin-top:1%;top:1%";
-
-               // Workaround failing boxSizing test due to offsetWidth returning wrong value
-               // with some non-1 values of body zoom, ticket #13543
-               jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
-                       boxSizingVal = div.offsetWidth === 4;
+                               return ret;
+                       }
                });
-
-               // Will be changed later if needed.
-               boxSizingReliableVal = true;
-               pixelPositionVal = false;
-               reliableMarginRightVal = true;
-
-               // Use window.getComputedStyle because jsdom on node.js will break without it.
-               if ( window.getComputedStyle ) {
-                       pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-                       boxSizingReliableVal =
-                               ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-               }
-
-               body.removeChild( container );
-
-               // Null elements to avoid leaks in IE.
-               div = body = null;
        }
-
 })();
 
 
@@ -6436,34 +5728,30 @@ jQuery.swap = function( elem, options, callback, args ) {
 
 
 var
-               ralpha = /alpha\([^)]*\)/i,
-       ropacity = /opacity\s*=\s*([^)]*)/,
-
-       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        rdisplayswap = /^(none|table(?!-c[ea]).+)/,
        rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
        rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
 
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        cssNormalTransform = {
-               letterSpacing: 0,
-               fontWeight: 400
+               letterSpacing: "0",
+               fontWeight: "400"
        },
 
        cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
 
-
-// return a css property mapped to a potentially vendor prefixed property
+// Return a css property mapped to a potentially vendor prefixed property
 function vendorPropName( style, name ) {
 
-       // shortcut for names that are not vendor prefixed
+       // Shortcut for names that are not vendor prefixed
        if ( name in style ) {
                return name;
        }
 
-       // check for vendor prefixed names
-       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+       // Check for vendor prefixed names
+       var capName = name[0].toUpperCase() + name.slice(1),
                origName = name,
                i = cssPrefixes.length;
 
@@ -6477,60 +5765,6 @@ function vendorPropName( style, name ) {
        return origName;
 }
 
-function showHide( elements, show ) {
-       var display, elem, hidden,
-               values = [],
-               index = 0,
-               length = elements.length;
-
-       for ( ; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-
-               values[ index ] = jQuery._data( elem, "olddisplay" );
-               display = elem.style.display;
-               if ( show ) {
-                       // Reset the inline display of this element to learn if it is
-                       // being hidden by cascaded rules or not
-                       if ( !values[ index ] && display === "none" ) {
-                               elem.style.display = "";
-                       }
-
-                       // Set elements which have been overridden with display: none
-                       // in a stylesheet to whatever the default browser style is
-                       // for such an element
-                       if ( elem.style.display === "" && isHidden( elem ) ) {
-                               values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
-                       }
-               } else {
-
-                       if ( !values[ index ] ) {
-                               hidden = isHidden( elem );
-
-                               if ( display && display !== "none" || !hidden ) {
-                                       jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
-                               }
-                       }
-               }
-       }
-
-       // Set the display of most of the elements in a second loop
-       // to avoid the constant reflow
-       for ( index = 0; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-                       elem.style.display = show ? values[ index ] || "" : "none";
-               }
-       }
-
-       return elements;
-}
-
 function setPositiveNumber( elem, value, subtract ) {
        var matches = rnumsplit.exec( value );
        return matches ?
@@ -6549,7 +5783,7 @@ function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
                val = 0;
 
        for ( ; i < 4; i += 2 ) {
-               // both box models exclude margin, so add it if we want it
+               // Both box models exclude margin, so add it if we want it
                if ( extra === "margin" ) {
                        val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
                }
@@ -6560,15 +5794,15 @@ function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
                                val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
                        }
 
-                       // at this point, extra isn't border nor margin, so remove border
+                       // At this point, extra isn't border nor margin, so remove border
                        if ( extra !== "margin" ) {
                                val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
                        }
                } else {
-                       // at this point, extra isn't content, so add padding
+                       // At this point, extra isn't content, so add padding
                        val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 
-                       // at this point, extra isn't content nor padding, so add border
+                       // At this point, extra isn't content nor padding, so add border
                        if ( extra !== "padding" ) {
                                val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
                        }
@@ -6584,9 +5818,9 @@ function getWidthOrHeight( elem, name, extra ) {
        var valueIsBorderBox = true,
                val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
                styles = getStyles( elem ),
-               isBorderBox = support.boxSizing() && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+               isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
 
-       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // Some non-html elements return undefined for offsetWidth, so check for null/undefined
        // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        if ( val <= 0 || val == null ) {
@@ -6601,15 +5835,16 @@ function getWidthOrHeight( elem, name, extra ) {
                        return val;
                }
 
-               // we need the check for style in case a browser which returns unreliable values
+               // Check for style in case a browser which returns unreliable values
                // for getComputedStyle silently falls back to the reliable elem.style
-               valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );
+               valueIsBorderBox = isBorderBox &&
+                       ( support.boxSizingReliable() || val === elem.style[ name ] );
 
                // Normalize "", auto, and prepare for extra
                val = parseFloat( val ) || 0;
        }
 
-       // use the active box-sizing model to add/subtract irrelevant styles
+       // Use the active box-sizing model to add/subtract irrelevant styles
        return ( val +
                augmentWidthOrHeight(
                        elem,
@@ -6621,13 +5856,66 @@ function getWidthOrHeight( elem, name, extra ) {
        ) + "px";
 }
 
+function showHide( elements, show ) {
+       var display, elem, hidden,
+               values = [],
+               index = 0,
+               length = elements.length;
+
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+
+               values[ index ] = data_priv.get( elem, "olddisplay" );
+               display = elem.style.display;
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && display === "none" ) {
+                               elem.style.display = "";
+                       }
+
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       hidden = isHidden( elem );
+
+                       if ( display !== "none" || !hidden ) {
+                               data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+                       }
+               }
+       }
+
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
+
+       return elements;
+}
+
 jQuery.extend({
+
        // Add in style property hooks for overriding the default
        // behavior of getting and setting a style property
        cssHooks: {
                opacity: {
                        get: function( elem, computed ) {
                                if ( computed ) {
+
                                        // We should always get a number back from opacity
                                        var ret = curCSS( elem, "opacity" );
                                        return ret === "" ? "1" : ret;
@@ -6640,6 +5928,8 @@ jQuery.extend({
        cssNumber: {
                "columnCount": true,
                "fillOpacity": true,
+               "flexGrow": true,
+               "flexShrink": true,
                "fontWeight": true,
                "lineHeight": true,
                "opacity": true,
@@ -6653,12 +5943,12 @@ jQuery.extend({
        // Add in properties whose names you wish to fix before
        // setting or getting the value
        cssProps: {
-               // normalize float css property
-               "float": support.cssFloat ? "cssFloat" : "styleFloat"
+               "float": "cssFloat"
        },
 
        // Get and set the style property on a DOM Node
        style: function( elem, name, value, extra ) {
+
                // Don't set styles on text and comment nodes
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
                        return;
@@ -6671,48 +5961,39 @@ jQuery.extend({
 
                name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
+               // Gets hook for the prefixed version, then unprefixed version
                hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
                // Check if we're setting a value
                if ( value !== undefined ) {
                        type = typeof value;
 
-                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       // Convert "+=" or "-=" to relative numbers (#7345)
                        if ( type === "string" && (ret = rrelNum.exec( value )) ) {
                                value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
                                // Fixes bug #9237
                                type = "number";
                        }
 
-                       // Make sure that null and NaN values aren't set. See: #7116
+                       // Make sure that null and NaN values aren't set (#7116)
                        if ( value == null || value !== value ) {
                                return;
                        }
 
-                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       // If a number, add 'px' to the (except for certain CSS properties)
                        if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
                                value += "px";
                        }
 
-                       // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
-                       // but it would mean to define eight (for every problematic property) identical functions
-                       if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+                       // Support: IE9-11+
+                       // background-* props affect original clone's values
+                       if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
                                style[ name ] = "inherit";
                        }
 
                        // If a hook was provided, use that value, otherwise just set the specified value
                        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-
-                               // Support: IE
-                               // Swallow errors from 'invalid' CSS values (#5509)
-                               try {
-                                       // Support: Chrome, Safari
-                                       // Setting style to blank string required to delete "style: x !important;"
-                                       style[ name ] = "";
-                                       style[ name ] = value;
-                               } catch(e) {}
+                               style[ name ] = value;
                        }
 
                } else {
@@ -6727,14 +6008,13 @@ jQuery.extend({
        },
 
        css: function( elem, name, extra, styles ) {
-               var num, val, hooks,
+               var val, num, hooks,
                        origName = jQuery.camelCase( name );
 
                // Make sure that we're working with the right name
                name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
+               // Try prefixed name followed by the unprefixed name
                hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
                // If a hook was provided get the computed value from there
@@ -6747,12 +6027,12 @@ jQuery.extend({
                        val = curCSS( elem, name, styles );
                }
 
-               //convert "normal" to computed value
+               // Convert "normal" to computed value
                if ( val === "normal" && name in cssNormalTransform ) {
                        val = cssNormalTransform[ name ];
                }
 
-               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               // Make numeric if forced or a qualifier was provided and val looks numeric
                if ( extra === "" || extra ) {
                        num = parseFloat( val );
                        return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
@@ -6765,9 +6045,10 @@ jQuery.each([ "height", "width" ], function( i, name ) {
        jQuery.cssHooks[ name ] = {
                get: function( elem, computed, extra ) {
                        if ( computed ) {
-                               // certain elements can have dimension info if we invisibly show them
-                               // however, it must have a current display style that would benefit from this
-                               return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+
+                               // Certain elements can have dimension info if we invisibly show them
+                               // but it must have a current display style that would benefit
+                               return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
                                        jQuery.swap( elem, cssShow, function() {
                                                return getWidthOrHeight( elem, name, extra );
                                        }) :
@@ -6782,7 +6063,7 @@ jQuery.each([ "height", "width" ], function( i, name ) {
                                        elem,
                                        name,
                                        extra,
-                                       support.boxSizing() && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                                       jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
                                        styles
                                ) : 0
                        );
@@ -6790,55 +6071,10 @@ jQuery.each([ "height", "width" ], function( i, name ) {
        };
 });
 
-if ( !support.opacity ) {
-       jQuery.cssHooks.opacity = {
-               get: function( elem, computed ) {
-                       // IE uses filters for opacity
-                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-                               computed ? "1" : "";
-               },
-
-               set: function( elem, value ) {
-                       var style = elem.style,
-                               currentStyle = elem.currentStyle,
-                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-                               filter = currentStyle && currentStyle.filter || style.filter || "";
-
-                       // IE has trouble with opacity if it does not have layout
-                       // Force it by setting the zoom level
-                       style.zoom = 1;
-
-                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                       // if value === "", then remove inline opacity #12685
-                       if ( ( value >= 1 || value === "" ) &&
-                                       jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-                                       style.removeAttribute ) {
-
-                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
-                               // style.removeAttribute is IE Only, but so apparently is this code path...
-                               style.removeAttribute( "filter" );
-
-                               // if there is no filter style applied in a css rule or unset inline opacity, we are done
-                               if ( value === "" || currentStyle && !currentStyle.filter ) {
-                                       return;
-                               }
-                       }
-
-                       // otherwise, set new filter values
-                       style.filter = ralpha.test( filter ) ?
-                               filter.replace( ralpha, opacity ) :
-                               filter + " " + opacity;
-               }
-       };
-}
-
+// Support: Android 2.3
 jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
        function( elem, computed ) {
                if ( computed ) {
-                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                       // Work around by temporarily setting element display to inline-block
                        return jQuery.swap( elem, { "display": "inline-block" },
                                curCSS, [ elem, "marginRight" ] );
                }
@@ -6856,7 +6092,7 @@ jQuery.each({
                        var i = 0,
                                expanded = {},
 
-                               // assumes a single number if not a string
+                               // Assumes a single number if not a string
                                parts = typeof value === "string" ? value.split(" ") : [ value ];
 
                        for ( ; i < 4; i++ ) {
@@ -6979,17 +6215,18 @@ Tween.propHooks = {
                                return tween.elem[ tween.prop ];
                        }
 
-                       // passing an empty string as a 3rd parameter to .css will automatically
-                       // attempt a parseFloat and fallback to a string if the parse fails
-                       // so, simple values such as "10px" are parsed to Float.
-                       // complex values such as "rotate(1rad)" are returned as is.
+                       // Passing an empty string as a 3rd parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails.
+                       // Simple values such as "10px" are parsed to Float;
+                       // complex values such as "rotate(1rad)" are returned as-is.
                        result = jQuery.css( tween.elem, tween.prop, "" );
                        // Empty strings, null, undefined and "auto" are converted to 0.
                        return !result || result === "auto" ? 0 : result;
                },
                set: function( tween ) {
-                       // use step hook for back compat - use cssHook if its there - use .style if its
-                       // available and use plain properties where available
+                       // Use step hook for back compat.
+                       // Use cssHook if its there.
+                       // Use .style if available and use plain properties where available.
                        if ( jQuery.fx.step[ tween.prop ] ) {
                                jQuery.fx.step[ tween.prop ]( tween );
                        } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
@@ -7001,9 +6238,8 @@ Tween.propHooks = {
        }
 };
 
-// Support: IE <=9
+// Support: IE9
 // Panic based approach to setting things on disconnected nodes
-
 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
        set: function( tween ) {
                if ( tween.elem.nodeType && tween.elem.parentNode ) {
@@ -7059,16 +6295,16 @@ var
                                start = +target || 1;
 
                                do {
-                                       // If previous iteration zeroed out, double until we get *something*
-                                       // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                       // If previous iteration zeroed out, double until we get *something*.
+                                       // Use string for doubling so we don't accidentally see scale as unchanged below
                                        scale = scale || ".5";
 
                                        // Adjust and apply
                                        start = start / scale;
                                        jQuery.style( tween.elem, prop, start + unit );
 
-                               // Update scale, tolerating zero or NaN from tween.cur()
-                               // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                               // Update scale, tolerating zero or NaN from tween.cur(),
+                               // break the loop if scale is unchanged or perfect, or if we've just had enough
                                } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
                        }
 
@@ -7097,11 +6333,11 @@ function createFxNow() {
 // Generate parameters to create a standard animation
 function genFx( type, includeWidth ) {
        var which,
-               attrs = { height: type },
-               i = 0;
+               i = 0,
+               attrs = { height: type };
 
-       // if we include width, step value is 1 to do all cssExpand values,
-       // if we don't include width, step value is 2 to skip over Left and Right
+       // If we include width, step value is 1 to do all cssExpand values,
+       // otherwise step value is 2 to skip over Left and Right
        includeWidth = includeWidth ? 1 : 0;
        for ( ; i < 4 ; i += 2 - includeWidth ) {
                which = cssExpand[ i ];
@@ -7123,7 +6359,7 @@ function createTween( value, prop, animation ) {
        for ( ; index < length; index++ ) {
                if ( (tween = collection[ index ].call( animation, prop, value )) ) {
 
-                       // we're done with this property
+                       // We're done with this property
                        return tween;
                }
        }
@@ -7131,14 +6367,14 @@ function createTween( value, prop, animation ) {
 
 function defaultPrefilter( elem, props, opts ) {
        /* jshint validthis: true */
-       var prop, value, toggle, tween, hooks, oldfire, display, dDisplay,
+       var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
                anim = this,
                orig = {},
                style = elem.style,
                hidden = elem.nodeType && isHidden( elem ),
-               dataShow = jQuery._data( elem, "fxshow" );
+               dataShow = data_priv.get( elem, "fxshow" );
 
-       // handle queue: false promises
+       // Handle queue: false promises
        if ( !opts.queue ) {
                hooks = jQuery._queueHooks( elem, "fx" );
                if ( hooks.unqueued == null ) {
@@ -7153,8 +6389,7 @@ function defaultPrefilter( elem, props, opts ) {
                hooks.unqueued++;
 
                anim.always(function() {
-                       // doing this makes sure that the complete handler will be called
-                       // before this completes
+                       // Ensure the complete handler is called before this completes
                        anim.always(function() {
                                hooks.unqueued--;
                                if ( !jQuery.queue( elem, "fx" ).length ) {
@@ -7164,10 +6399,10 @@ function defaultPrefilter( elem, props, opts ) {
                });
        }
 
-       // height/width overflow pass
+       // Height/width overflow pass
        if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
                // Make sure that nothing sneaks out
-               // Record all 3 overflow attributes because IE does not
+               // Record all 3 overflow attributes because IE9-10 do not
                // change the overflow attribute when overflowX and
                // overflowY are set to the same value
                opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
@@ -7175,32 +6410,23 @@ function defaultPrefilter( elem, props, opts ) {
                // Set display property to inline-block for height/width
                // animations on inline elements that are having width/height animated
                display = jQuery.css( elem, "display" );
-               dDisplay = defaultDisplay( elem.nodeName );
-               if ( display === "none" ) {
-                       display = dDisplay;
-               }
-               if ( display === "inline" &&
-                               jQuery.css( elem, "float" ) === "none" ) {
 
-                       // inline-level elements accept inline-block;
-                       // block-level elements need to be inline with layout
-                       if ( !support.inlineBlockNeedsLayout || dDisplay === "inline" ) {
-                               style.display = "inline-block";
-                       } else {
-                               style.zoom = 1;
-                       }
+               // Test default display if display is currently "none"
+               checkDisplay = display === "none" ?
+                       data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+               if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+                       style.display = "inline-block";
                }
        }
 
        if ( opts.overflow ) {
                style.overflow = "hidden";
-               if ( !support.shrinkWrapBlocks() ) {
-                       anim.always(function() {
-                               style.overflow = opts.overflow[ 0 ];
-                               style.overflowX = opts.overflow[ 1 ];
-                               style.overflowY = opts.overflow[ 2 ];
-                       });
-               }
+               anim.always(function() {
+                       style.overflow = opts.overflow[ 0 ];
+                       style.overflowX = opts.overflow[ 1 ];
+                       style.overflowY = opts.overflow[ 2 ];
+               });
        }
 
        // show/hide pass
@@ -7219,6 +6445,10 @@ function defaultPrefilter( elem, props, opts ) {
                                }
                        }
                        orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+               // Any non-fx value stops us from restoring the original display value
+               } else {
+                       display = undefined;
                }
        }
 
@@ -7228,10 +6458,10 @@ function defaultPrefilter( elem, props, opts ) {
                                hidden = dataShow.hidden;
                        }
                } else {
-                       dataShow = jQuery._data( elem, "fxshow", {} );
+                       dataShow = data_priv.access( elem, "fxshow", {} );
                }
 
-               // store state if its toggle - enables .stop().toggle() to "reverse"
+               // Store state if its toggle - enables .stop().toggle() to "reverse"
                if ( toggle ) {
                        dataShow.hidden = !hidden;
                }
@@ -7244,7 +6474,8 @@ function defaultPrefilter( elem, props, opts ) {
                }
                anim.done(function() {
                        var prop;
-                       jQuery._removeData( elem, "fxshow" );
+
+                       data_priv.remove( elem, "fxshow" );
                        for ( prop in orig ) {
                                jQuery.style( elem, prop, orig[ prop ] );
                        }
@@ -7260,6 +6491,10 @@ function defaultPrefilter( elem, props, opts ) {
                                }
                        }
                }
+
+       // If this is a noop like .hide().hide(), restore an overwritten display value
+       } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+               style.display = display;
        }
 }
 
@@ -7286,8 +6521,8 @@ function propFilter( props, specialEasing ) {
                        value = hooks.expand( value );
                        delete props[ name ];
 
-                       // not quite $.extend, this wont overwrite keys already present.
-                       // also - reusing 'index' from above because we have the correct "name"
+                       // Not quite $.extend, this won't overwrite existing keys.
+                       // Reusing 'index' because we have the correct "name"
                        for ( index in value ) {
                                if ( !( index in props ) ) {
                                        props[ index ] = value[ index ];
@@ -7306,7 +6541,7 @@ function Animation( elem, properties, options ) {
                index = 0,
                length = animationPrefilters.length,
                deferred = jQuery.Deferred().always( function() {
-                       // don't match elem in the :animated selector
+                       // Don't match elem in the :animated selector
                        delete tick.elem;
                }),
                tick = function() {
@@ -7315,7 +6550,8 @@ function Animation( elem, properties, options ) {
                        }
                        var currentTime = fxNow || createFxNow(),
                                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+                               // Support: Android 2.3
+                               // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
                                temp = remaining / animation.duration || 0,
                                percent = 1 - temp,
                                index = 0,
@@ -7351,7 +6587,7 @@ function Animation( elem, properties, options ) {
                        },
                        stop: function( gotoEnd ) {
                                var index = 0,
-                                       // if we are going to the end, we want to run all the tweens
+                                       // If we are going to the end, we want to run all the tweens
                                        // otherwise we skip this part
                                        length = gotoEnd ? animation.tweens.length : 0;
                                if ( stopped ) {
@@ -7362,8 +6598,7 @@ function Animation( elem, properties, options ) {
                                        animation.tweens[ index ].run( 1 );
                                }
 
-                               // resolve when we played the last frame
-                               // otherwise, reject
+                               // Resolve when we played the last frame; otherwise, reject
                                if ( gotoEnd ) {
                                        deferred.resolveWith( elem, [ animation, gotoEnd ] );
                                } else {
@@ -7405,6 +6640,7 @@ function Animation( elem, properties, options ) {
 }
 
 jQuery.Animation = jQuery.extend( Animation, {
+
        tweener: function( props, callback ) {
                if ( jQuery.isFunction( props ) ) {
                        callback = props;
@@ -7444,7 +6680,7 @@ jQuery.speed = function( speed, easing, fn ) {
        opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
                opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
 
-       // normalize opt.queue - true/undefined/null -> "fx"
+       // Normalize opt.queue - true/undefined/null -> "fx"
        if ( opt.queue == null || opt.queue === true ) {
                opt.queue = "fx";
        }
@@ -7468,10 +6704,10 @@ jQuery.speed = function( speed, easing, fn ) {
 jQuery.fn.extend({
        fadeTo: function( speed, to, easing, callback ) {
 
-               // show any hidden elements after setting opacity to 0
+               // Show any hidden elements after setting opacity to 0
                return this.filter( isHidden ).css( "opacity", 0 ).show()
 
-                       // animate to the value specified
+                       // Animate to the value specified
                        .end().animate({ opacity: to }, speed, easing, callback );
        },
        animate: function( prop, speed, easing, callback ) {
@@ -7482,7 +6718,7 @@ jQuery.fn.extend({
                                var anim = Animation( this, jQuery.extend( {}, prop ), optall );
 
                                // Empty animations, or finishing resolves immediately
-                               if ( empty || jQuery._data( this, "finish" ) ) {
+                               if ( empty || data_priv.get( this, "finish" ) ) {
                                        anim.stop( true );
                                }
                        };
@@ -7512,7 +6748,7 @@ jQuery.fn.extend({
                        var dequeue = true,
                                index = type != null && type + "queueHooks",
                                timers = jQuery.timers,
-                               data = jQuery._data( this );
+                               data = data_priv.get( this );
 
                        if ( index ) {
                                if ( data[ index ] && data[ index ].stop ) {
@@ -7534,9 +6770,9 @@ jQuery.fn.extend({
                                }
                        }
 
-                       // start the next in the queue if the last step wasn't forced
-                       // timers currently will call their complete callbacks, which will dequeue
-                       // but only if they were gotoEnd
+                       // Start the next in the queue if the last step wasn't forced.
+                       // Timers currently will call their complete callbacks, which
+                       // will dequeue but only if they were gotoEnd.
                        if ( dequeue || !gotoEnd ) {
                                jQuery.dequeue( this, type );
                        }
@@ -7548,23 +6784,23 @@ jQuery.fn.extend({
                }
                return this.each(function() {
                        var index,
-                               data = jQuery._data( this ),
+                               data = data_priv.get( this ),
                                queue = data[ type + "queue" ],
                                hooks = data[ type + "queueHooks" ],
                                timers = jQuery.timers,
                                length = queue ? queue.length : 0;
 
-                       // enable finishing flag on private data
+                       // Enable finishing flag on private data
                        data.finish = true;
 
-                       // empty the queue first
+                       // Empty the queue first
                        jQuery.queue( this, type, [] );
 
                        if ( hooks && hooks.stop ) {
                                hooks.stop.call( this, true );
                        }
 
-                       // look for any active animations, and finish them
+                       // Look for any active animations, and finish them
                        for ( index = timers.length; index--; ) {
                                if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
                                        timers[ index ].anim.stop( true );
@@ -7572,14 +6808,14 @@ jQuery.fn.extend({
                                }
                        }
 
-                       // look for any animations in the old queue and finish them
+                       // Look for any animations in the old queue and finish them
                        for ( index = 0; index < length; index++ ) {
                                if ( queue[ index ] && queue[ index ].finish ) {
                                        queue[ index ].finish.call( this );
                                }
                        }
 
-                       // turn off finishing flag
+                       // Turn off finishing flag
                        delete data.finish;
                });
        }
@@ -7611,8 +6847,8 @@ jQuery.each({
 jQuery.timers = [];
 jQuery.fx.tick = function() {
        var timer,
-               timers = jQuery.timers,
-               i = 0;
+               i = 0,
+               timers = jQuery.timers;
 
        fxNow = jQuery.now();
 
@@ -7676,240 +6912,36 @@ jQuery.fn.delay = function( time, type ) {
 
 
 (function() {
-       var a, input, select, opt,
-               div = document.createElement("div" );
+       var input = document.createElement( "input" ),
+               select = document.createElement( "select" ),
+               opt = select.appendChild( document.createElement( "option" ) );
 
-       // Setup
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-       a = div.getElementsByTagName("a")[ 0 ];
+       input.type = "checkbox";
 
-       // First batch of tests.
-       select = document.createElement("select");
-       opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName("input")[ 0 ];
+       // Support: iOS<=5.1, Android<=4.2+
+       // Default value for a checkbox should be "on"
+       support.checkOn = input.value !== "";
 
-       a.style.cssText = "top:1px";
-
-       // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-       support.getSetAttribute = div.className !== "t";
-
-       // Get the style information from getAttribute
-       // (IE uses .cssText instead)
-       support.style = /top/.test( a.getAttribute("style") );
-
-       // Make sure that URLs aren't manipulated
-       // (IE normalizes it by default)
-       support.hrefNormalized = a.getAttribute("href") === "/a";
-
-       // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
-       support.checkOn = !!input.value;
-
-       // Make sure that a selected-by-default option has a working selected property.
-       // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+       // Support: IE<=11+
+       // Must access selectedIndex to make default options select
        support.optSelected = opt.selected;
 
-       // Tests for enctype support on a form (#6743)
-       support.enctype = !!document.createElement("form").enctype;
-
-       // Make sure that the options inside disabled selects aren't marked as disabled
-       // (WebKit marks them as disabled)
+       // Support: Android<=2.3
+       // Options inside disabled selects are incorrectly marked as disabled
        select.disabled = true;
        support.optDisabled = !opt.disabled;
 
-       // Support: IE8 only
-       // Check if we can trust getAttribute("value")
+       // Support: IE<=11+
+       // An input loses its value after becoming a radio
        input = document.createElement( "input" );
-       input.setAttribute( "value", "" );
-       support.input = input.getAttribute( "value" ) === "";
-
-       // Check if an input maintains its value after becoming a radio
        input.value = "t";
-       input.setAttribute( "type", "radio" );
+       input.type = "radio";
        support.radioValue = input.value === "t";
-
-       // Null elements to avoid leaks in IE.
-       a = input = select = opt = div = null;
 })();
 
 
-var rreturn = /\r/g;
-
-jQuery.fn.extend({
-       val: function( value ) {
-               var hooks, ret, isFunction,
-                       elem = this[0];
-
-               if ( !arguments.length ) {
-                       if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-                                       return ret;
-                               }
-
-                               ret = elem.value;
-
-                               return typeof ret === "string" ?
-                                       // handle most common string cases
-                                       ret.replace(rreturn, "") :
-                                       // handle cases where value is null/undef or number
-                                       ret == null ? "" : ret;
-                       }
-
-                       return;
-               }
-
-               isFunction = jQuery.isFunction( value );
-
-               return this.each(function( i ) {
-                       var val;
-
-                       if ( this.nodeType !== 1 ) {
-                               return;
-                       }
-
-                       if ( isFunction ) {
-                               val = value.call( this, i, jQuery( this ).val() );
-                       } else {
-                               val = value;
-                       }
-
-                       // Treat null/undefined as ""; convert numbers to string
-                       if ( val == null ) {
-                               val = "";
-                       } else if ( typeof val === "number" ) {
-                               val += "";
-                       } else if ( jQuery.isArray( val ) ) {
-                               val = jQuery.map( val, function( value ) {
-                                       return value == null ? "" : value + "";
-                               });
-                       }
-
-                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-                       // If set returns undefined, fall back to normal setting
-                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-                               this.value = val;
-                       }
-               });
-       }
-});
-
-jQuery.extend({
-       valHooks: {
-               option: {
-                       get: function( elem ) {
-                               var val = jQuery.find.attr( elem, "value" );
-                               return val != null ?
-                                       val :
-                                       jQuery.text( elem );
-                       }
-               },
-               select: {
-                       get: function( elem ) {
-                               var value, option,
-                                       options = elem.options,
-                                       index = elem.selectedIndex,
-                                       one = elem.type === "select-one" || index < 0,
-                                       values = one ? null : [],
-                                       max = one ? index + 1 : options.length,
-                                       i = index < 0 ?
-                                               max :
-                                               one ? index : 0;
-
-                               // Loop through all the selected options
-                               for ( ; i < max; i++ ) {
-                                       option = options[ i ];
-
-                                       // oldIE doesn't update selected after form reset (#2551)
-                                       if ( ( option.selected || i === index ) &&
-                                                       // Don't return options that are disabled or in a disabled optgroup
-                                                       ( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
-                                               // Get the specific value for the option
-                                               value = jQuery( option ).val();
-
-                                               // We don't need an array for one selects
-                                               if ( one ) {
-                                                       return value;
-                                               }
-
-                                               // Multi-Selects return an array
-                                               values.push( value );
-                                       }
-                               }
-
-                               return values;
-                       },
-
-                       set: function( elem, value ) {
-                               var optionSet, option,
-                                       options = elem.options,
-                                       values = jQuery.makeArray( value ),
-                                       i = options.length;
-
-                               while ( i-- ) {
-                                       option = options[ i ];
-
-                                       if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {
-
-                                               // Support: IE6
-                                               // When new option element is added to select box we need to
-                                               // force reflow of newly added node in order to workaround delay
-                                               // of initialization properties
-                                               try {
-                                                       option.selected = optionSet = true;
-
-                                               } catch ( _ ) {
-
-                                                       // Will be executed only in IE6
-                                                       option.scrollHeight;
-                                               }
-
-                                       } else {
-                                               option.selected = false;
-                                       }
-                               }
-
-                               // Force browsers to behave consistently when non-matching value is set
-                               if ( !optionSet ) {
-                                       elem.selectedIndex = -1;
-                               }
-
-                               return options;
-                       }
-               }
-       }
-});
-
-// Radios and checkboxes getter/setter
-jQuery.each([ "radio", "checkbox" ], function() {
-       jQuery.valHooks[ this ] = {
-               set: function( elem, value ) {
-                       if ( jQuery.isArray( value ) ) {
-                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-                       }
-               }
-       };
-       if ( !support.checkOn ) {
-               jQuery.valHooks[ this ].get = function( elem ) {
-                       // Support: Webkit
-                       // "" is returned instead of "on" if a value isn't specified
-                       return elem.getAttribute("value") === null ? "on" : elem.value;
-               };
-       }
-});
-
-
-
-
 var nodeHook, boolHook,
-       attrHandle = jQuery.expr.attrHandle,
-       ruseDefault = /^(?:checked|selected)$/i,
-       getSetAttribute = support.getSetAttribute,
-       getSetInput = support.input;
+       attrHandle = jQuery.expr.attrHandle;
 
 jQuery.fn.extend({
        attr: function( name, value ) {
@@ -7984,21 +7016,10 @@ jQuery.extend({
                                // Boolean attributes get special treatment (#10870)
                                if ( jQuery.expr.match.bool.test( name ) ) {
                                        // Set corresponding property to false
-                                       if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-                                               elem[ propName ] = false;
-                                       // Support: IE<9
-                                       // Also clear defaultChecked/defaultSelected (if appropriate)
-                                       } else {
-                                               elem[ jQuery.camelCase( "default-" + name ) ] =
-                                                       elem[ propName ] = false;
-                                       }
-
-                               // See #9699 for explanation of this approach (setting first, then removal)
-                               } else {
-                                       jQuery.attr( elem, name, "" );
+                                       elem[ propName ] = false;
                                }
 
-                               elem.removeAttribute( getSetAttribute ? name : propName );
+                               elem.removeAttribute( name );
                        }
                }
        },
@@ -8006,9 +7027,8 @@ jQuery.extend({
        attrHooks: {
                type: {
                        set: function( elem, value ) {
-                               if ( !support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-                                       // Setting the type on a radio button after the value resets the value in IE6-9
-                                       // Reset value to default in case type is set after value during creation
+                               if ( !support.radioValue && value === "radio" &&
+                                       jQuery.nodeName( elem, "input" ) ) {
                                        var val = elem.value;
                                        elem.setAttribute( "type", value );
                                        if ( val ) {
@@ -8021,155 +7041,40 @@ jQuery.extend({
        }
 });
 
-// Hook for boolean attributes
+// Hooks for boolean attributes
 boolHook = {
        set: function( elem, value, name ) {
                if ( value === false ) {
                        // Remove boolean attributes when set to false
                        jQuery.removeAttr( elem, name );
-               } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-                       // IE<8 needs the *property* name
-                       elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
-
-               // Use defaultChecked and defaultSelected for oldIE
                } else {
-                       elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+                       elem.setAttribute( name, name );
                }
-
                return name;
        }
 };
-
-// Retrieve booleans specially
 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-
        var getter = attrHandle[ name ] || jQuery.find.attr;
 
-       attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
-               function( elem, name, isXML ) {
-                       var ret, handle;
-                       if ( !isXML ) {
-                               // Avoid an infinite loop by temporarily removing this function from the getter
-                               handle = attrHandle[ name ];
-                               attrHandle[ name ] = ret;
-                               ret = getter( elem, name, isXML ) != null ?
-                                       name.toLowerCase() :
-                                       null;
-                               attrHandle[ name ] = handle;
-                       }
-                       return ret;
-               } :
-               function( elem, name, isXML ) {
-                       if ( !isXML ) {
-                               return elem[ jQuery.camelCase( "default-" + name ) ] ?
-                                       name.toLowerCase() :
-                                       null;
-                       }
-               };
-});
-
-// fix oldIE attroperties
-if ( !getSetInput || !getSetAttribute ) {
-       jQuery.attrHooks.value = {
-               set: function( elem, value, name ) {
-                       if ( jQuery.nodeName( elem, "input" ) ) {
-                               // Does not return so that setAttribute is also used
-                               elem.defaultValue = value;
-                       } else {
-                               // Use nodeHook if defined (#1954); otherwise setAttribute is fine
-                               return nodeHook && nodeHook.set( elem, value, name );
-                       }
-               }
-       };
-}
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
-       // Use this for any attribute in IE6/7
-       // This fixes almost every IE6/7 issue
-       nodeHook = {
-               set: function( elem, value, name ) {
-                       // Set the existing or create a new attribute node
-                       var ret = elem.getAttributeNode( name );
-                       if ( !ret ) {
-                               elem.setAttributeNode(
-                                       (ret = elem.ownerDocument.createAttribute( name ))
-                               );
-                       }
-
-                       ret.value = value += "";
-
-                       // Break association with cloned elements by also using setAttribute (#9646)
-                       if ( name === "value" || value === elem.getAttribute( name ) ) {
-                               return value;
-                       }
-               }
-       };
-
-       // Some attributes are constructed with empty-string values when not defined
-       attrHandle.id = attrHandle.name = attrHandle.coords =
-               function( elem, name, isXML ) {
-                       var ret;
-                       if ( !isXML ) {
-                               return (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
-                                       ret.value :
-                                       null;
-                       }
-               };
-
-       // Fixing value retrieval on a button requires this module
-       jQuery.valHooks.button = {
-               get: function( elem, name ) {
-                       var ret = elem.getAttributeNode( name );
-                       if ( ret && ret.specified ) {
-                               return ret.value;
-                       }
-               },
-               set: nodeHook.set
-       };
-
-       // Set contenteditable to false on removals(#10429)
-       // Setting to empty string throws an error as an invalid value
-       jQuery.attrHooks.contenteditable = {
-               set: function( elem, value, name ) {
-                       nodeHook.set( elem, value === "" ? false : value, name );
-               }
-       };
-
-       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
-       // This is for removals
-       jQuery.each([ "width", "height" ], function( i, name ) {
-               jQuery.attrHooks[ name ] = {
-                       set: function( elem, value ) {
-                               if ( value === "" ) {
-                                       elem.setAttribute( name, "auto" );
-                                       return value;
-                               }
-                       }
-               };
-       });
-}
-
-if ( !support.style ) {
-       jQuery.attrHooks.style = {
-               get: function( elem ) {
-                       // Return undefined in the case of empty string
-                       // Note: IE uppercases css property names, but if we were to .toLowerCase()
-                       // .cssText, that would destroy case senstitivity in URL's, like in "background"
-                       return elem.style.cssText || undefined;
-               },
-               set: function( elem, value ) {
-                       return ( elem.style.cssText = value + "" );
+       attrHandle[ name ] = function( elem, name, isXML ) {
+               var ret, handle;
+               if ( !isXML ) {
+                       // Avoid an infinite loop by temporarily removing this function from the getter
+                       handle = attrHandle[ name ];
+                       attrHandle[ name ] = ret;
+                       ret = getter( elem, name, isXML ) != null ?
+                               name.toLowerCase() :
+                               null;
+                       attrHandle[ name ] = handle;
                }
+               return ret;
        };
-}
+});
 
 
 
 
-var rfocusable = /^(?:input|select|textarea|button|object)$/i,
-       rclickable = /^(?:a|area)$/i;
+var rfocusable = /^(?:input|select|textarea|button)$/i;
 
 jQuery.fn.extend({
        prop: function( name, value ) {
@@ -8177,13 +7082,8 @@ jQuery.fn.extend({
        },
 
        removeProp: function( name ) {
-               name = jQuery.propFix[ name ] || name;
                return this.each(function() {
-                       // try/catch handles cases where IE balks (such as removing a property on window)
-                       try {
-                               this[ name ] = undefined;
-                               delete this[ name ];
-                       } catch( e ) {}
+                       delete this[ jQuery.propFix[ name ] || name ];
                });
        }
 });
@@ -8198,7 +7098,7 @@ jQuery.extend({
                var ret, hooks, notxml,
                        nType = elem.nodeType;
 
-               // don't get/set properties on text, comment and attribute nodes
+               // Don't get/set properties on text, comment and attribute nodes
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
                        return;
                }
@@ -8226,49 +7126,20 @@ jQuery.extend({
        propHooks: {
                tabIndex: {
                        get: function( elem ) {
-                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                               // Use proper attribute retrieval(#12072)
-                               var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-                               return tabindex ?
-                                       parseInt( tabindex, 10 ) :
-                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                               0 :
-                                               -1;
+                               return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+                                       elem.tabIndex :
+                                       -1;
                        }
                }
        }
 });
 
-// Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !support.hrefNormalized ) {
-       // href/src property should get the full normalized URL (#10299/#12915)
-       jQuery.each([ "href", "src" ], function( i, name ) {
-               jQuery.propHooks[ name ] = {
-                       get: function( elem ) {
-                               return elem.getAttribute( name, 4 );
-                       }
-               };
-       });
-}
-
-// Support: Safari, IE9+
-// mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
 if ( !support.optSelected ) {
        jQuery.propHooks.selected = {
                get: function( elem ) {
                        var parent = elem.parentNode;
-
-                       if ( parent ) {
-                               parent.selectedIndex;
-
-                               // Make sure that it also works with optgroups, see #5701
-                               if ( parent.parentNode ) {
-                                       parent.parentNode.selectedIndex;
-                               }
+                       if ( parent && parent.parentNode ) {
+                               parent.parentNode.selectedIndex;
                        }
                        return null;
                }
@@ -8290,11 +7161,6 @@ jQuery.each([
        jQuery.propFix[ this.toLowerCase() ] = this;
 });
 
-// IE6/7 call enctype encoding
-if ( !support.enctype ) {
-       jQuery.propFix.enctype = "encoding";
-}
-
 
 
 
@@ -8303,9 +7169,9 @@ var rclass = /[\t\r\n\f]/g;
 jQuery.fn.extend({
        addClass: function( value ) {
                var classes, elem, cur, clazz, j, finalValue,
+                       proceed = typeof value === "string" && value,
                        i = 0,
-                       len = this.length,
-                       proceed = typeof value === "string" && value;
+                       len = this.length;
 
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function( j ) {
@@ -8346,104 +7212,261 @@ jQuery.fn.extend({
 
        removeClass: function( value ) {
                var classes, elem, cur, clazz, j, finalValue,
+                       proceed = arguments.length === 0 || typeof value === "string" && value,
                        i = 0,
-                       len = this.length,
-                       proceed = arguments.length === 0 || typeof value === "string" && value;
+                       len = this.length;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call( this, j, this.className ) );
+                       });
+               }
+               if ( proceed ) {
+                       classes = ( value || "" ).match( rnotwhite ) || [];
+
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               // This expression is here for better compressibility (see addClass)
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       ""
+                               );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               // Remove *all* instances
+                                               while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+                                                       cur = cur.replace( " " + clazz + " ", " " );
+                                               }
+                                       }
+
+                                       // Only assign if different to avoid unneeded rendering.
+                                       finalValue = value ? jQuery.trim( cur ) : "";
+                                       if ( elem.className !== finalValue ) {
+                                               elem.className = finalValue;
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value;
+
+               if ( typeof stateVal === "boolean" && type === "string" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // Toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       classNames = value.match( rnotwhite ) || [];
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // Check each className given, space separated list
+                                       if ( self.hasClass( className ) ) {
+                                               self.removeClass( className );
+                                       } else {
+                                               self.addClass( className );
+                                       }
+                               }
+
+                       // Toggle whole class name
+                       } else if ( type === strundefined || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       data_priv.set( this, "__className__", this.className );
+                               }
+
+                               // If the element has a class name or if we're passed `false`,
+                               // then remove the whole classname (if there was one, the above saved it).
+                               // Otherwise bring back whatever was previously saved (if anything),
+                               // falling back to the empty string if nothing was stored.
+                               this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // Handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // Handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
+
+                       return;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each(function( i ) {
+                       var val;
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, jQuery( this ).val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map( val, function( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
+
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               var val = jQuery.find.attr( elem, "value" );
+                               return val != null ?
+                                       val :
+                                       // Support: IE10-11+
+                                       // option.text throws exceptions (#14686, #14858)
+                                       jQuery.trim( jQuery.text( elem ) );
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, option,
+                                       options = elem.options,
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one" || index < 0,
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length,
+                                       i = index < 0 ?
+                                               max :
+                                               one ? index : 0;
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).removeClass( value.call( this, j, this.className ) );
-                       });
-               }
-               if ( proceed ) {
-                       classes = ( value || "" ).match( rnotwhite ) || [];
+                               // Loop through all the selected options
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
 
-                       for ( ; i < len; i++ ) {
-                               elem = this[ i ];
-                               // This expression is here for better compressibility (see addClass)
-                               cur = elem.nodeType === 1 && ( elem.className ?
-                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
-                                       ""
-                               );
+                                       // IE6-9 doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
 
-                               if ( cur ) {
-                                       j = 0;
-                                       while ( (clazz = classes[j++]) ) {
-                                               // Remove *all* instances
-                                               while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
-                                                       cur = cur.replace( " " + clazz + " ", " " );
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
                                                }
-                                       }
 
-                                       // only assign if different to avoid unneeded rendering.
-                                       finalValue = value ? jQuery.trim( cur ) : "";
-                                       if ( elem.className !== finalValue ) {
-                                               elem.className = finalValue;
+                                               // Multi-Selects return an array
+                                               values.push( value );
                                        }
                                }
-                       }
-               }
-
-               return this;
-       },
-
-       toggleClass: function( value, stateVal ) {
-               var type = typeof value;
-
-               if ( typeof stateVal === "boolean" && type === "string" ) {
-                       return stateVal ? this.addClass( value ) : this.removeClass( value );
-               }
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( i ) {
-                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-                       });
-               }
+                               return values;
+                       },
 
-               return this.each(function() {
-                       if ( type === "string" ) {
-                               // toggle individual class names
-                               var className,
-                                       i = 0,
-                                       self = jQuery( this ),
-                                       classNames = value.match( rnotwhite ) || [];
+                       set: function( elem, value ) {
+                               var optionSet, option,
+                                       options = elem.options,
+                                       values = jQuery.makeArray( value ),
+                                       i = options.length;
 
-                               while ( (className = classNames[ i++ ]) ) {
-                                       // check each className given, space separated list
-                                       if ( self.hasClass( className ) ) {
-                                               self.removeClass( className );
-                                       } else {
-                                               self.addClass( className );
+                               while ( i-- ) {
+                                       option = options[ i ];
+                                       if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+                                               optionSet = true;
                                        }
                                }
 
-                       // Toggle whole class name
-                       } else if ( type === strundefined || type === "boolean" ) {
-                               if ( this.className ) {
-                                       // store className if set
-                                       jQuery._data( this, "__className__", this.className );
+                               // Force browsers to behave consistently when non-matching value is set
+                               if ( !optionSet ) {
+                                       elem.selectedIndex = -1;
                                }
-
-                               // If the element has a class name or if we're passed "false",
-                               // then remove the whole classname (if there was one, the above saved it).
-                               // Otherwise bring back whatever was previously saved (if anything),
-                               // falling back to the empty string if nothing was stored.
-                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                               return values;
                        }
-               });
-       },
+               }
+       }
+});
 
-       hasClass: function( selector ) {
-               var className = " " + selector + " ",
-                       i = 0,
-                       l = this.length;
-               for ( ; i < l; i++ ) {
-                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
-                               return true;
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
                        }
                }
-
-               return false;
+       };
+       if ( !support.checkOn ) {
+               jQuery.valHooks[ this ].get = function( elem ) {
+                       return elem.getAttribute("value") === null ? "on" : elem.value;
+               };
        }
 });
 
@@ -8493,48 +7516,10 @@ var rquery = (/\?/);
 
 
 
-var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
-
+// Support: Android 2.3
+// Workaround failure to string-cast null input
 jQuery.parseJSON = function( data ) {
-       // Attempt to parse using the native JSON parser first
-       if ( window.JSON && window.JSON.parse ) {
-               // Support: Android 2.3
-               // Workaround failure to string-cast null input
-               return window.JSON.parse( data + "" );
-       }
-
-       var requireNonComma,
-               depth = null,
-               str = jQuery.trim( data + "" );
-
-       // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
-       // after removing valid tokens
-       return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
-
-               // Force termination if we see a misplaced comma
-               if ( requireNonComma && comma ) {
-                       depth = 0;
-               }
-
-               // Perform no more replacements after returning to outermost depth
-               if ( depth === 0 ) {
-                       return token;
-               }
-
-               // Commas must not follow "[", "{", or ","
-               requireNonComma = open || comma;
-
-               // Determine new depth
-               // array/object open ("[" or "{"): depth += true - false (increment)
-               // array/object close ("]" or "}"): depth += false - true (decrement)
-               // other cases ("," or primitive): depth += true - true (numeric cast)
-               depth += !close - !open;
-
-               // Remove this token
-               return "";
-       }) ) ?
-               ( Function( "return " + str ) )() :
-               jQuery.error( "Invalid JSON: " + data );
+       return JSON.parse( data + "" );
 };
 
 
@@ -8544,19 +7529,16 @@ jQuery.parseXML = function( data ) {
        if ( !data || typeof data !== "string" ) {
                return null;
        }
+
+       // Support: IE9
        try {
-               if ( window.DOMParser ) { // Standard
-                       tmp = new DOMParser();
-                       xml = tmp.parseFromString( data, "text/xml" );
-               } else { // IE
-                       xml = new ActiveXObject( "Microsoft.XMLDOM" );
-                       xml.async = "false";
-                       xml.loadXML( data );
-               }
-       } catch( e ) {
+               tmp = new DOMParser();
+               xml = tmp.parseFromString( data, "text/xml" );
+       } catch ( e ) {
                xml = undefined;
        }
-       if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+
+       if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
                jQuery.error( "Invalid XML: " + data );
        }
        return xml;
@@ -8564,13 +7546,9 @@ jQuery.parseXML = function( data ) {
 
 
 var
-       // Document location
-       ajaxLocParts,
-       ajaxLocation,
-
        rhash = /#.*$/,
        rts = /([?&])_=[^&]*/,
-       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
        // #7653, #8125, #8152: local protocol detection
        rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        rnoContent = /^(?:GET|HEAD)$/,
@@ -8596,22 +7574,13 @@ var
        transports = {},
 
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-       allTypes = "*/".concat("*");
+       allTypes = "*/".concat( "*" ),
 
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
-       ajaxLocation = location.href;
-} catch( e ) {
-       // Use the href attribute of an A element
-       // since IE will modify it given document.location
-       ajaxLocation = document.createElement( "a" );
-       ajaxLocation.href = "";
-       ajaxLocation = ajaxLocation.href;
-}
+       // Document location
+       ajaxLocation = window.location.href,
 
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+       // Segment location into parts
+       ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
 
 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
 function addToPrefiltersOrTransports( structure ) {
@@ -8632,7 +7601,7 @@ function addToPrefiltersOrTransports( structure ) {
                        // For each dataType in the dataTypeExpression
                        while ( (dataType = dataTypes[i++]) ) {
                                // Prepend if requested
-                               if ( dataType.charAt( 0 ) === "+" ) {
+                               if ( dataType[0] === "+" ) {
                                        dataType = dataType.slice( 1 ) || "*";
                                        (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
 
@@ -8674,7 +7643,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
 // that takes "flat" options (not to be deep extended)
 // Fixes #9887
 function ajaxExtend( target, src ) {
-       var deep, key,
+       var key, deep,
                flatOptions = jQuery.ajaxSettings.flatOptions || {};
 
        for ( key in src ) {
@@ -8694,7 +7663,8 @@ function ajaxExtend( target, src ) {
  * - returns the corresponding response
  */
 function ajaxHandleResponses( s, jqXHR, responses ) {
-       var firstDataType, ct, finalDataType, type,
+
+       var ct, type, finalDataType, firstDataType,
                contents = s.contents,
                dataTypes = s.dataTypes;
 
@@ -8780,7 +7750,7 @@ function ajaxConvert( s, response, jqXHR, isSuccess ) {
 
                if ( current ) {
 
-                       // There's only work to do if current dataType is non-auto
+               // There's only work to do if current dataType is non-auto
                        if ( current === "*" ) {
 
                                current = prev;
@@ -8943,23 +7913,20 @@ jQuery.extend({
                // Force options to be an object
                options = options || {};
 
-               var // Cross-domain detection vars
-                       parts,
-                       // Loop variable
-                       i,
+               var transport,
                        // URL without anti-cache param
                        cacheURL,
-                       // Response headers as string
+                       // Response headers
                        responseHeadersString,
+                       responseHeaders,
                        // timeout handle
                        timeoutTimer,
-
+                       // Cross-domain detection vars
+                       parts,
                        // To know if global events are to be dispatched
                        fireGlobals,
-
-                       transport,
-                       // Response headers
-                       responseHeaders,
+                       // Loop variable
+                       i,
                        // Create the final options object
                        s = jQuery.ajaxSetup( {}, options ),
                        // Callbacks context
@@ -9056,10 +8023,11 @@ jQuery.extend({
                jqXHR.error = jqXHR.fail;
 
                // Remove hash character (#7531: and string promotion)
-               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // Add protocol if not provided (prefilters might expect it)
                // Handle falsy url in the settings object (#10093: consistency with old signature)
                // We also use the url parameter if available
-               s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+               s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+                       .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
 
                // Alias method option to type as per ticket #12004
                s.type = options.method || options.type || s.method || s.type;
@@ -9091,7 +8059,8 @@ jQuery.extend({
                }
 
                // We can fire global events as of now if asked to
-               fireGlobals = s.global;
+               // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+               fireGlobals = jQuery.event && s.global;
 
                // Watch for a new set of requests
                if ( fireGlobals && jQuery.active++ === 0 ) {
@@ -9164,7 +8133,7 @@ jQuery.extend({
                        return jqXHR.abort();
                }
 
-               // aborting is no longer a cancellation
+               // Aborting is no longer a cancellation
                strAbort = "abort";
 
                // Install callbacks on deferreds
@@ -9276,8 +8245,7 @@ jQuery.extend({
                                        isSuccess = !error;
                                }
                        } else {
-                               // We extract error from statusText
-                               // then normalize statusText and status for non-aborts
+                               // Extract error from statusText and normalize for non-aborts
                                error = statusText;
                                if ( status || !statusText ) {
                                        statusText = "error";
@@ -9333,7 +8301,7 @@ jQuery.extend({
 
 jQuery.each( [ "get", "post" ], function( i, method ) {
        jQuery[ method ] = function( url, data, callback, type ) {
-               // shift arguments if data argument was omitted
+               // Shift arguments if data argument was omitted
                if ( jQuery.isFunction( data ) ) {
                        type = type || callback;
                        callback = data;
@@ -9350,13 +8318,6 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
        };
 });
 
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
-       jQuery.fn[ type ] = function( fn ) {
-               return this.on( type, fn );
-       };
-});
-
 
 jQuery._evalUrl = function( url ) {
        return jQuery.ajax({
@@ -9372,25 +8333,28 @@ jQuery._evalUrl = function( url ) {
 
 jQuery.fn.extend({
        wrapAll: function( html ) {
+               var wrap;
+
                if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapAll( html.call(this, i) );
+                       return this.each(function( i ) {
+                               jQuery( this ).wrapAll( html.call(this, i) );
                        });
                }
 
-               if ( this[0] ) {
+               if ( this[ 0 ] ) {
+
                        // The elements to wrap the target around
-                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+                       wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
 
-                       if ( this[0].parentNode ) {
-                               wrap.insertBefore( this[0] );
+                       if ( this[ 0 ].parentNode ) {
+                               wrap.insertBefore( this[ 0 ] );
                        }
 
                        wrap.map(function() {
                                var elem = this;
 
-                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-                                       elem = elem.firstChild;
+                               while ( elem.firstElementChild ) {
+                                       elem = elem.firstElementChild;
                                }
 
                                return elem;
@@ -9402,8 +8366,8 @@ jQuery.fn.extend({
 
        wrapInner: function( html ) {
                if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapInner( html.call(this, i) );
+                       return this.each(function( i ) {
+                               jQuery( this ).wrapInner( html.call(this, i) );
                        });
                }
 
@@ -9423,7 +8387,7 @@ jQuery.fn.extend({
        wrap: function( html ) {
                var isFunction = jQuery.isFunction( html );
 
-               return this.each(function(i) {
+               return this.each(function( i ) {
                        jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
                });
        },
@@ -9441,11 +8405,8 @@ jQuery.fn.extend({
 jQuery.expr.filters.hidden = function( elem ) {
        // Support: Opera <= 12.12
        // Opera reports offsetWidths and offsetHeights less than zero on some elements
-       return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
-               (!support.reliableHiddenOffsets() &&
-                       ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+       return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
 };
-
 jQuery.expr.filters.visible = function( elem ) {
        return !jQuery.expr.filters.hidden( elem );
 };
@@ -9534,7 +8495,8 @@ jQuery.fn.extend({
                })
                .filter(function() {
                        var type = this.type;
-                       // Use .is(":disabled") so that fieldset[disabled] works
+
+                       // Use .is( ":disabled" ) so that fieldset[disabled] works
                        return this.name && !jQuery( this ).is( ":disabled" ) &&
                                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
                                ( this.checked || !rcheckableType.test( type ) );
@@ -9554,194 +8516,134 @@ jQuery.fn.extend({
 });
 
 
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
-       // Support: IE6+
-       function() {
-
-               // XHR cannot access local files, always use ActiveX for that case
-               return !this.isLocal &&
-
-                       // Support: IE7-8
-                       // oldIE XHR does not support non-RFC2616 methods (#13240)
-                       // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
-                       // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
-                       // Although this check for six methods instead of eight
-                       // since IE also does not support "trace" and "connect"
-                       /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
-
-                       createStandardXHR() || createActiveXHR();
-       } :
-       // For all other browsers, use the standard XMLHttpRequest object
-       createStandardXHR;
+jQuery.ajaxSettings.xhr = function() {
+       try {
+               return new XMLHttpRequest();
+       } catch( e ) {}
+};
 
 var xhrId = 0,
        xhrCallbacks = {},
+       xhrSuccessStatus = {
+               // file protocol always yields status code 0, assume 200
+               0: 200,
+               // Support: IE9
+               // #1450: sometimes IE returns 1223 when it should be 204
+               1223: 204
+       },
        xhrSupported = jQuery.ajaxSettings.xhr();
 
-// Support: IE<10
+// Support: IE9
 // Open requests must be manually aborted on unload (#5280)
-if ( window.ActiveXObject ) {
-       jQuery( window ).on( "unload", function() {
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+       window.attachEvent( "onunload", function() {
                for ( var key in xhrCallbacks ) {
-                       xhrCallbacks[ key ]( undefined, true );
+                       xhrCallbacks[ key ]();
                }
        });
 }
 
-// Determine support properties
 support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
-       jQuery.ajaxTransport(function( options ) {
-               // Cross domain only allowed if supported through XMLHttpRequest
-               if ( !options.crossDomain || support.cors ) {
+support.ajax = xhrSupported = !!xhrSupported;
 
-                       var callback;
+jQuery.ajaxTransport(function( options ) {
+       var callback;
 
-                       return {
-                               send: function( headers, complete ) {
-                                       var i,
-                                               xhr = options.xhr(),
-                                               id = ++xhrId;
-
-                                       // Open the socket
-                                       xhr.open( options.type, options.url, options.async, options.username, options.password );
-
-                                       // Apply custom fields if provided
-                                       if ( options.xhrFields ) {
-                                               for ( i in options.xhrFields ) {
-                                                       xhr[ i ] = options.xhrFields[ i ];
-                                               }
-                                       }
+       // Cross domain only allowed if supported through XMLHttpRequest
+       if ( support.cors || xhrSupported && !options.crossDomain ) {
+               return {
+                       send: function( headers, complete ) {
+                               var i,
+                                       xhr = options.xhr(),
+                                       id = ++xhrId;
 
-                                       // Override mime type if needed
-                                       if ( options.mimeType && xhr.overrideMimeType ) {
-                                               xhr.overrideMimeType( options.mimeType );
-                                       }
+                               xhr.open( options.type, options.url, options.async, options.username, options.password );
 
-                                       // X-Requested-With header
-                                       // For cross-domain requests, seeing as conditions for a preflight are
-                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
-                                       // (it can always be set on a per-request basis or even using ajaxSetup)
-                                       // For same-domain requests, won't change header if already provided.
-                                       if ( !options.crossDomain && !headers["X-Requested-With"] ) {
-                                               headers["X-Requested-With"] = "XMLHttpRequest";
+                               // Apply custom fields if provided
+                               if ( options.xhrFields ) {
+                                       for ( i in options.xhrFields ) {
+                                               xhr[ i ] = options.xhrFields[ i ];
                                        }
+                               }
 
-                                       // Set headers
-                                       for ( i in headers ) {
-                                               // Support: IE<9
-                                               // IE's ActiveXObject throws a 'Type Mismatch' exception when setting
-                                               // request header to a null-value.
-                                               //
-                                               // To keep consistent with other XHR implementations, cast the value
-                                               // to string and ignore `undefined`.
-                                               if ( headers[ i ] !== undefined ) {
-                                                       xhr.setRequestHeader( i, headers[ i ] + "" );
-                                               }
-                                       }
+                               // Override mime type if needed
+                               if ( options.mimeType && xhr.overrideMimeType ) {
+                                       xhr.overrideMimeType( options.mimeType );
+                               }
 
-                                       // Do send the request
-                                       // This may raise an exception which is actually
-                                       // handled in jQuery.ajax (so no try/catch here)
-                                       xhr.send( ( options.hasContent && options.data ) || null );
+                               // X-Requested-With header
+                               // For cross-domain requests, seeing as conditions for a preflight are
+                               // akin to a jigsaw puzzle, we simply never set it to be sure.
+                               // (it can always be set on a per-request basis or even using ajaxSetup)
+                               // For same-domain requests, won't change header if already provided.
+                               if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+                                       headers["X-Requested-With"] = "XMLHttpRequest";
+                               }
 
-                                       // Listener
-                                       callback = function( _, isAbort ) {
-                                               var status, statusText, responses;
+                               // Set headers
+                               for ( i in headers ) {
+                                       xhr.setRequestHeader( i, headers[ i ] );
+                               }
 
-                                               // Was never called and is aborted or complete
-                                               if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-                                                       // Clean up
+                               // Callback
+                               callback = function( type ) {
+                                       return function() {
+                                               if ( callback ) {
                                                        delete xhrCallbacks[ id ];
-                                                       callback = undefined;
-                                                       xhr.onreadystatechange = jQuery.noop;
-
-                                                       // Abort manually if needed
-                                                       if ( isAbort ) {
-                                                               if ( xhr.readyState !== 4 ) {
-                                                                       xhr.abort();
-                                                               }
+                                                       callback = xhr.onload = xhr.onerror = null;
+
+                                                       if ( type === "abort" ) {
+                                                               xhr.abort();
+                                                       } else if ( type === "error" ) {
+                                                               complete(
+                                                                       // file: protocol always yields status 0; see #8605, #14207
+                                                                       xhr.status,
+                                                                       xhr.statusText
+                                                               );
                                                        } else {
-                                                               responses = {};
-                                                               status = xhr.status;
-
-                                                               // Support: IE<10
-                                                               // Accessing binary-data responseText throws an exception
-                                                               // (#11426)
-                                                               if ( typeof xhr.responseText === "string" ) {
-                                                                       responses.text = xhr.responseText;
-                                                               }
-
-                                                               // Firefox throws an exception when accessing
-                                                               // statusText for faulty cross-domain requests
-                                                               try {
-                                                                       statusText = xhr.statusText;
-                                                               } catch( e ) {
-                                                                       // We normalize with Webkit giving an empty statusText
-                                                                       statusText = "";
-                                                               }
-
-                                                               // Filter status for non standard behaviors
-
-                                                               // If the request is local and we have data: assume a success
-                                                               // (success with no data won't get notified, that's the best we
-                                                               // can do given current implementations)
-                                                               if ( !status && options.isLocal && !options.crossDomain ) {
-                                                                       status = responses.text ? 200 : 404;
-                                                               // IE - #1450: sometimes returns 1223 when it should be 204
-                                                               } else if ( status === 1223 ) {
-                                                                       status = 204;
-                                                               }
+                                                               complete(
+                                                                       xhrSuccessStatus[ xhr.status ] || xhr.status,
+                                                                       xhr.statusText,
+                                                                       // Support: IE9
+                                                                       // Accessing binary-data responseText throws an exception
+                                                                       // (#11426)
+                                                                       typeof xhr.responseText === "string" ? {
+                                                                               text: xhr.responseText
+                                                                       } : undefined,
+                                                                       xhr.getAllResponseHeaders()
+                                                               );
                                                        }
                                                }
-
-                                               // Call complete if needed
-                                               if ( responses ) {
-                                                       complete( status, statusText, responses, xhr.getAllResponseHeaders() );
-                                               }
                                        };
+                               };
 
-                                       if ( !options.async ) {
-                                               // if we're in sync mode we fire the callback
-                                               callback();
-                                       } else if ( xhr.readyState === 4 ) {
-                                               // (IE6 & IE7) if it's in cache and has been
-                                               // retrieved directly we need to fire the callback
-                                               setTimeout( callback );
-                                       } else {
-                                               // Add to the list of active xhr callbacks
-                                               xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
-                                       }
-                               },
+                               // Listen to events
+                               xhr.onload = callback();
+                               xhr.onerror = callback("error");
 
-                               abort: function() {
+                               // Create the abort callback
+                               callback = xhrCallbacks[ id ] = callback("abort");
+
+                               try {
+                                       // Do send the request (this may raise an exception)
+                                       xhr.send( options.hasContent && options.data || null );
+                               } catch ( e ) {
+                                       // #14683: Only rethrow if this hasn't been notified as an error yet
                                        if ( callback ) {
-                                               callback( undefined, true );
+                                               throw e;
                                        }
                                }
-                       };
-               }
-       });
-}
-
-// Functions to create xhrs
-function createStandardXHR() {
-       try {
-               return new window.XMLHttpRequest();
-       } catch( e ) {}
-}
+                       },
 
-function createActiveXHR() {
-       try {
-               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-       } catch( e ) {}
-}
+                       abort: function() {
+                               if ( callback ) {
+                                       callback();
+                               }
+                       }
+               };
+       }
+});
 
 
 
@@ -9762,71 +8664,42 @@ jQuery.ajaxSetup({
        }
 });
 
-// Handle cache's special case and global
+// Handle cache's special case and crossDomain
 jQuery.ajaxPrefilter( "script", function( s ) {
        if ( s.cache === undefined ) {
                s.cache = false;
        }
        if ( s.crossDomain ) {
                s.type = "GET";
-               s.global = false;
        }
 });
 
 // Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
+jQuery.ajaxTransport( "script", function( s ) {
        // This transport only deals with cross domain requests
        if ( s.crossDomain ) {
-
-               var script,
-                       head = document.head || jQuery("head")[0] || document.documentElement;
-
+               var script, callback;
                return {
-
-                       send: function( _, callback ) {
-
-                               script = document.createElement("script");
-
-                               script.async = true;
-
-                               if ( s.scriptCharset ) {
-                                       script.charset = s.scriptCharset;
-                               }
-
-                               script.src = s.url;
-
-                               // Attach handlers for all browsers
-                               script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-                                               // Handle memory leak in IE
-                                               script.onload = script.onreadystatechange = null;
-
-                                               // Remove the script
-                                               if ( script.parentNode ) {
-                                                       script.parentNode.removeChild( script );
-                                               }
-
-                                               // Dereference the script
-                                               script = null;
-
-                                               // Callback if not abort
-                                               if ( !isAbort ) {
-                                                       callback( 200, "success" );
+                       send: function( _, complete ) {
+                               script = jQuery("<script>").prop({
+                                       async: true,
+                                       charset: s.scriptCharset,
+                                       src: s.url
+                               }).on(
+                                       "load error",
+                                       callback = function( evt ) {
+                                               script.remove();
+                                               callback = null;
+                                               if ( evt ) {
+                                                       complete( evt.type === "error" ? 404 : 200, evt.type );
                                                }
                                        }
-                               };
-
-                               // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
-                               // Use native DOM manipulation to avoid our domManip AJAX trickery
-                               head.insertBefore( script, head.firstChild );
+                               );
+                               document.head.appendChild( script[ 0 ] );
                        },
-
                        abort: function() {
-                               if ( script ) {
-                                       script.onload( undefined, true );
+                               if ( callback ) {
+                                       callback();
                                }
                        }
                };
@@ -9962,12 +8835,12 @@ jQuery.fn.load = function( url, params, callback ) {
                return _load.apply( this, arguments );
        }
 
-       var selector, response, type,
+       var selector, type, response,
                self = this,
                off = url.indexOf(" ");
 
        if ( off >= 0 ) {
-               selector = url.slice( off, url.length );
+               selector = jQuery.trim( url.slice( off ) );
                url = url.slice( 0, off );
        }
 
@@ -10017,6 +8890,16 @@ jQuery.fn.load = function( url, params, callback ) {
 
 
 
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+       jQuery.fn[ type ] = function( fn ) {
+               return this.on( type, fn );
+       };
+});
+
+
+
+
 jQuery.expr.filters.animated = function( elem ) {
        return jQuery.grep(jQuery.timers, function( fn ) {
                return elem === fn.elem;
@@ -10026,18 +8909,13 @@ jQuery.expr.filters.animated = function( elem ) {
 
 
 
-
 var docElem = window.document.documentElement;
 
 /**
  * Gets a window from an element
  */
 function getWindow( elem ) {
-       return jQuery.isWindow( elem ) ?
-               elem :
-               elem.nodeType === 9 ?
-                       elem.defaultView || elem.parentWindow :
-                       false;
+       return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
 }
 
 jQuery.offset = {
@@ -10047,7 +8925,7 @@ jQuery.offset = {
                        curElem = jQuery( elem ),
                        props = {};
 
-               // set position first, in-case top/left are set even on static elem
+               // Set position first, in-case top/left are set even on static elem
                if ( position === "static" ) {
                        elem.style.position = "relative";
                }
@@ -10056,13 +8934,15 @@ jQuery.offset = {
                curCSSTop = jQuery.css( elem, "top" );
                curCSSLeft = jQuery.css( elem, "left" );
                calculatePosition = ( position === "absolute" || position === "fixed" ) &&
-                       jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
+                       ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
 
-               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               // Need to be able to calculate position if either
+               // top or left is auto and position is either absolute or fixed
                if ( calculatePosition ) {
                        curPosition = curElem.position();
                        curTop = curPosition.top;
                        curLeft = curPosition.left;
+
                } else {
                        curTop = parseFloat( curCSSTop ) || 0;
                        curLeft = parseFloat( curCSSLeft ) || 0;
@@ -10081,6 +8961,7 @@ jQuery.offset = {
 
                if ( "using" in options ) {
                        options.using.call( elem, props );
+
                } else {
                        curElem.css( props );
                }
@@ -10098,8 +8979,8 @@ jQuery.fn.extend({
                }
 
                var docElem, win,
-                       box = { top: 0, left: 0 },
                        elem = this[ 0 ],
+                       box = { top: 0, left: 0 },
                        doc = elem && elem.ownerDocument;
 
                if ( !doc ) {
@@ -10113,15 +8994,15 @@ jQuery.fn.extend({
                        return box;
                }
 
+               // Support: BlackBerry 5, iOS 3 (original iPhone)
                // If we don't have gBCR, just use 0,0 rather than error
-               // BlackBerry 5, iOS 3 (original iPhone)
                if ( typeof elem.getBoundingClientRect !== strundefined ) {
                        box = elem.getBoundingClientRect();
                }
                win = getWindow( doc );
                return {
-                       top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
-                       left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+                       top: box.top + win.pageYOffset - docElem.clientTop,
+                       left: box.left + win.pageXOffset - docElem.clientLeft
                };
        },
 
@@ -10131,13 +9012,14 @@ jQuery.fn.extend({
                }
 
                var offsetParent, offset,
-                       parentOffset = { top: 0, left: 0 },
-                       elem = this[ 0 ];
+                       elem = this[ 0 ],
+                       parentOffset = { top: 0, left: 0 };
 
-               // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+               // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
                if ( jQuery.css( elem, "position" ) === "fixed" ) {
-                       // we assume that getBoundingClientRect is available when computed position is fixed
+                       // Assume getBoundingClientRect is there when computed position is fixed
                        offset = elem.getBoundingClientRect();
+
                } else {
                        // Get *real* offsetParent
                        offsetParent = this.offsetParent();
@@ -10149,16 +9031,14 @@ jQuery.fn.extend({
                        }
 
                        // Add offsetParent borders
-                       parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+                       parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
                        parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
                }
 
                // Subtract parent offsets and element margins
-               // note: when an element has margin: auto the offsetLeft and marginLeft
-               // are the same in Safari causing offset.left to incorrectly be 0
                return {
-                       top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+                       top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
                };
        },
 
@@ -10169,6 +9049,7 @@ jQuery.fn.extend({
                        while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
                                offsetParent = offsetParent.offsetParent;
                        }
+
                        return offsetParent || docElem;
                });
        }
@@ -10176,22 +9057,20 @@ jQuery.fn.extend({
 
 // Create scrollLeft and scrollTop methods
 jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
-       var top = /Y/.test( prop );
+       var top = "pageYOffset" === prop;
 
        jQuery.fn[ method ] = function( val ) {
                return access( this, function( elem, method, val ) {
                        var win = getWindow( elem );
 
                        if ( val === undefined ) {
-                               return win ? (prop in win) ? win[ prop ] :
-                                       win.document.documentElement[ method ] :
-                                       elem[ method ];
+                               return win ? win[ prop ] : elem[ method ];
                        }
 
                        if ( win ) {
                                win.scrollTo(
-                                       !top ? val : jQuery( win ).scrollLeft(),
-                                       top ? val : jQuery( win ).scrollTop()
+                                       !top ? val : window.pageXOffset,
+                                       top ? val : window.pageYOffset
                                );
 
                        } else {
@@ -10201,16 +9080,18 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
        };
 });
 
+// Support: Safari<7+, Chrome<37+
 // Add the top/left cssHooks using jQuery.fn.position
 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// getComputedStyle returns percent when specified for top/left/bottom/right
-// rather than make the css module depend on the offset module, we just check for it here
+// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
 jQuery.each( [ "top", "left" ], function( i, prop ) {
        jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
                function( elem, computed ) {
                        if ( computed ) {
                                computed = curCSS( elem, prop );
-                               // if curCSS returns percentage, fallback to offset
+                               // If curCSS returns percentage, fallback to offset
                                return rnumnonpx.test( computed ) ?
                                        jQuery( elem ).position()[ prop ] + "px" :
                                        computed;
@@ -10223,7 +9104,7 @@ jQuery.each( [ "top", "left" ], function( i, prop ) {
 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-               // margin is only for outerHeight, outerWidth
+               // Margin is only for outerHeight, outerWidth
                jQuery.fn[ funcName ] = function( margin, value ) {
                        var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
                                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
@@ -10242,8 +9123,8 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
                                if ( elem.nodeType === 9 ) {
                                        doc = elem.documentElement;
 
-                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+                                       // whichever is greatest
                                        return Math.max(
                                                elem.body[ "scroll" + name ], doc[ "scroll" + name ],
                                                elem.body[ "offset" + name ], doc[ "offset" + name ],
@@ -10280,6 +9161,12 @@ jQuery.fn.andSelf = jQuery.fn.addBack;
 // derived from file names, and jQuery is normally delivered in a lowercase
 // file name. Do this after creating the global so that if an AMD module wants
 // to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
 if ( typeof define === "function" && define.amd ) {
        define( "jquery", [], function() {
                return jQuery;
@@ -10308,8 +9195,8 @@ jQuery.noConflict = function( deep ) {
        return jQuery;
 };
 
-// Expose jQuery and $ identifiers, even in
-// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
 // and CommonJS for browser emulators (#13566)
 if ( typeof noGlobal === strundefined ) {
        window.jQuery = window.$ = jQuery;