SECURITY: resources: Patch jQuery 3.3.1 for CVE-2019-11358
[lhc/web/wiklou.git] / resources / lib / jquery / jquery.js
index d2d8ca4..34a5703 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v3.2.1
+ * jQuery JavaScript Library v3.3.1
  * https://jquery.com/
  *
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2017-03-20T18:59Z
+ * Date: 2018-01-20T17:24Z
  */
 ( function( global, factory ) {
 
@@ -71,16 +71,57 @@ var ObjectFunctionString = fnToString.call( Object );
 
 var support = {};
 
+var isFunction = function isFunction( obj ) {
 
+      // Support: Chrome <=57, Firefox <=52
+      // In some browsers, typeof returns "function" for HTML <object> elements
+      // (i.e., `typeof document.createElement( "object" ) === "function"`).
+      // We don't want to classify *any* DOM node as a function.
+      return typeof obj === "function" && typeof obj.nodeType !== "number";
+  };
 
-       function DOMEval( code, doc ) {
+
+var isWindow = function isWindow( obj ) {
+               return obj != null && obj === obj.window;
+       };
+
+
+
+
+       var preservedScriptAttributes = {
+               type: true,
+               src: true,
+               noModule: true
+       };
+
+       function DOMEval( code, doc, node ) {
                doc = doc || document;
 
-               var script = doc.createElement( "script" );
+               var i,
+                       script = doc.createElement( "script" );
 
                script.text = code;
+               if ( node ) {
+                       for ( i in preservedScriptAttributes ) {
+                               if ( node[ i ] ) {
+                                       script[ i ] = node[ i ];
+                               }
+                       }
+               }
                doc.head.appendChild( script ).parentNode.removeChild( script );
        }
+
+
+function toType( obj ) {
+       if ( obj == null ) {
+               return obj + "";
+       }
+
+       // Support: Android <=2.3 only (functionish RegExp)
+       return typeof obj === "object" || typeof obj === "function" ?
+               class2type[ toString.call( obj ) ] || "object" :
+               typeof obj;
+}
 /* global Symbol */
 // Defining this global in .eslintrc.json would create a danger of using the global
 // unguarded in another place, it seems safer to define global only for this module
@@ -88,7 +129,7 @@ var support = {};
 
 
 var
-       version = "3.2.1",
+       version = "3.3.1",
 
        // Define a local copy of jQuery
        jQuery = function( selector, context ) {
@@ -100,16 +141,7 @@ var
 
        // Support: Android <=4.0 only
        // Make sure we trim BOM and NBSP
-       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-       // Matches dashed string for camelizing
-       rmsPrefix = /^-ms-/,
-       rdashAlpha = /-([a-z])/g,
-
-       // Used by jQuery.camelCase as callback to replace()
-       fcamelCase = function( all, letter ) {
-               return letter.toUpperCase();
-       };
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
 
 jQuery.fn = jQuery.prototype = {
 
@@ -209,7 +241,7 @@ jQuery.extend = jQuery.fn.extend = function() {
        }
 
        // Handle case when target is a string or something (possible in deep copy)
-       if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+       if ( typeof target !== "object" && !isFunction( target ) ) {
                target = {};
        }
 
@@ -229,8 +261,9 @@ jQuery.extend = jQuery.fn.extend = function() {
                                src = target[ name ];
                                copy = options[ name ];
 
+                               // Prevent Object.prototype pollution
                                // Prevent never-ending loop
-                               if ( target === copy ) {
+                               if ( name === "__proto__" || target === copy ) {
                                        continue;
                                }
 
@@ -275,28 +308,6 @@ jQuery.extend( {
 
        noop: function() {},
 
-       isFunction: function( obj ) {
-               return jQuery.type( obj ) === "function";
-       },
-
-       isWindow: function( obj ) {
-               return obj != null && obj === obj.window;
-       },
-
-       isNumeric: function( obj ) {
-
-               // As of jQuery 3.0, isNumeric is limited to
-               // strings and numbers (primitives or objects)
-               // that can be coerced to finite numbers (gh-2662)
-               var type = jQuery.type( obj );
-               return ( type === "number" || type === "string" ) &&
-
-                       // parseFloat NaNs numeric-cast false positives ("")
-                       // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-                       // subtraction forces infinities to NaN
-                       !isNaN( obj - parseFloat( obj ) );
-       },
-
        isPlainObject: function( obj ) {
                var proto, Ctor;
 
@@ -330,29 +341,11 @@ jQuery.extend( {
                return true;
        },
 
-       type: function( obj ) {
-               if ( obj == null ) {
-                       return obj + "";
-               }
-
-               // Support: Android <=2.3 only (functionish RegExp)
-               return typeof obj === "object" || typeof obj === "function" ?
-                       class2type[ toString.call( obj ) ] || "object" :
-                       typeof obj;
-       },
-
        // Evaluates a script in a global context
        globalEval: function( code ) {
                DOMEval( code );
        },
 
-       // Convert dashed to camelCase; used by the css and data modules
-       // Support: IE <=9 - 11, Edge 12 - 13
-       // Microsoft forgot to hump their vendor prefix (#9572)
-       camelCase: function( string ) {
-               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-       },
-
        each: function( obj, callback ) {
                var length, i = 0;
 
@@ -473,37 +466,6 @@ jQuery.extend( {
        // A global GUID counter for objects
        guid: 1,
 
-       // Bind a function to a context, optionally partially applying any
-       // arguments.
-       proxy: function( fn, context ) {
-               var tmp, args, proxy;
-
-               if ( typeof context === "string" ) {
-                       tmp = fn[ context ];
-                       context = fn;
-                       fn = tmp;
-               }
-
-               // Quick check to determine if target is callable, in the spec
-               // this throws a TypeError, but we will just return undefined.
-               if ( !jQuery.isFunction( fn ) ) {
-                       return undefined;
-               }
-
-               // Simulated bind
-               args = slice.call( arguments, 2 );
-               proxy = function() {
-                       return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-               };
-
-               // Set the guid of unique handler to the same of original handler, so it can be removed
-               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-               return proxy;
-       },
-
-       now: Date.now,
-
        // jQuery.support is not used in Core but other projects attach their
        // properties to it so it needs to exist.
        support: support
@@ -526,9 +488,9 @@ function isArrayLike( obj ) {
        // hasOwn isn't used here due to false negatives
        // regarding Nodelist length in IE
        var length = !!obj && "length" in obj && obj.length,
-               type = jQuery.type( obj );
+               type = toType( obj );
 
-       if ( type === "function" || jQuery.isWindow( obj ) ) {
+       if ( isFunction( obj ) || isWindow( obj ) ) {
                return false;
        }
 
@@ -2848,11 +2810,9 @@ var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|
 
 
 
-var risSimple = /^.[^:#\[\.,]*$/;
-
 // Implement the identical functionality for filter and not
 function winnow( elements, qualifier, not ) {
-       if ( jQuery.isFunction( qualifier ) ) {
+       if ( isFunction( qualifier ) ) {
                return jQuery.grep( elements, function( elem, i ) {
                        return !!qualifier.call( elem, i, elem ) !== not;
                } );
@@ -2872,16 +2832,8 @@ function winnow( elements, qualifier, not ) {
                } );
        }
 
-       // Simple selector that can be filtered directly, removing non-Elements
-       if ( risSimple.test( qualifier ) ) {
-               return jQuery.filter( qualifier, elements, not );
-       }
-
-       // Complex selector, compare the two sets, removing non-Elements
-       qualifier = jQuery.filter( qualifier, elements );
-       return jQuery.grep( elements, function( elem ) {
-               return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
-       } );
+       // Filtered directly for both simple and complex selectors
+       return jQuery.filter( qualifier, elements, not );
 }
 
 jQuery.filter = function( expr, elems, not ) {
@@ -3002,7 +2954,7 @@ var rootjQuery,
                                                for ( match in context ) {
 
                                                        // Properties of context are called as methods if possible
-                                                       if ( jQuery.isFunction( this[ match ] ) ) {
+                                                       if ( isFunction( this[ match ] ) ) {
                                                                this[ match ]( context[ match ] );
 
                                                        // ...and otherwise set as attributes
@@ -3045,7 +2997,7 @@ var rootjQuery,
 
                // HANDLE: $(function)
                // Shortcut for document ready
-               } else if ( jQuery.isFunction( selector ) ) {
+               } else if ( isFunction( selector ) ) {
                        return root.ready !== undefined ?
                                root.ready( selector ) :
 
@@ -3360,11 +3312,11 @@ jQuery.Callbacks = function( options ) {
 
                                        ( function add( args ) {
                                                jQuery.each( args, function( _, arg ) {
-                                                       if ( jQuery.isFunction( arg ) ) {
+                                                       if ( isFunction( arg ) ) {
                                                                if ( !options.unique || !self.has( arg ) ) {
                                                                        list.push( arg );
                                                                }
-                                                       } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+                                                       } else if ( arg && arg.length && toType( arg ) !== "string" ) {
 
                                                                // Inspect recursively
                                                                add( arg );
@@ -3479,11 +3431,11 @@ function adoptValue( value, resolve, reject, noValue ) {
        try {
 
                // Check for promise aspect first to privilege synchronous behavior
-               if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
+               if ( value && isFunction( ( method = value.promise ) ) ) {
                        method.call( value ).done( resolve ).fail( reject );
 
                // Other thenables
-               } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
+               } else if ( value && isFunction( ( method = value.then ) ) ) {
                        method.call( value, resolve, reject );
 
                // Other non-thenables
@@ -3541,14 +3493,14 @@ jQuery.extend( {
                                                jQuery.each( tuples, function( i, tuple ) {
 
                                                        // Map tuples (progress, done, fail) to arguments (done, fail, progress)
-                                                       var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+                                                       var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
 
                                                        // deferred.progress(function() { bind to newDefer or newDefer.notify })
                                                        // deferred.done(function() { bind to newDefer or newDefer.resolve })
                                                        // deferred.fail(function() { bind to newDefer or newDefer.reject })
                                                        deferred[ tuple[ 1 ] ]( function() {
                                                                var returned = fn && fn.apply( this, arguments );
-                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                               if ( returned && isFunction( returned.promise ) ) {
                                                                        returned.promise()
                                                                                .progress( newDefer.notify )
                                                                                .done( newDefer.resolve )
@@ -3602,7 +3554,7 @@ jQuery.extend( {
                                                                                returned.then;
 
                                                                        // Handle a returned thenable
-                                                                       if ( jQuery.isFunction( then ) ) {
+                                                                       if ( isFunction( then ) ) {
 
                                                                                // Special processors (notify) just wait for resolution
                                                                                if ( special ) {
@@ -3698,7 +3650,7 @@ jQuery.extend( {
                                                        resolve(
                                                                0,
                                                                newDefer,
-                                                               jQuery.isFunction( onProgress ) ?
+                                                               isFunction( onProgress ) ?
                                                                        onProgress :
                                                                        Identity,
                                                                newDefer.notifyWith
@@ -3710,7 +3662,7 @@ jQuery.extend( {
                                                        resolve(
                                                                0,
                                                                newDefer,
-                                                               jQuery.isFunction( onFulfilled ) ?
+                                                               isFunction( onFulfilled ) ?
                                                                        onFulfilled :
                                                                        Identity
                                                        )
@@ -3721,7 +3673,7 @@ jQuery.extend( {
                                                        resolve(
                                                                0,
                                                                newDefer,
-                                                               jQuery.isFunction( onRejected ) ?
+                                                               isFunction( onRejected ) ?
                                                                        onRejected :
                                                                        Thrower
                                                        )
@@ -3761,8 +3713,15 @@ jQuery.extend( {
                                        // fulfilled_callbacks.disable
                                        tuples[ 3 - i ][ 2 ].disable,
 
+                                       // rejected_handlers.disable
+                                       // fulfilled_handlers.disable
+                                       tuples[ 3 - i ][ 3 ].disable,
+
                                        // progress_callbacks.lock
-                                       tuples[ 0 ][ 2 ].lock
+                                       tuples[ 0 ][ 2 ].lock,
+
+                                       // progress_handlers.lock
+                                       tuples[ 0 ][ 3 ].lock
                                );
                        }
 
@@ -3832,7 +3791,7 @@ jQuery.extend( {
 
                        // Use .then() to unwrap secondary thenables (cf. gh-3000)
                        if ( master.state() === "pending" ||
-                               jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+                               isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
 
                                return master.then();
                        }
@@ -3960,7 +3919,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
                bulk = key == null;
 
        // Sets many values
-       if ( jQuery.type( key ) === "object" ) {
+       if ( toType( key ) === "object" ) {
                chainable = true;
                for ( i in key ) {
                        access( elems, fn, i, key[ i ], true, emptyGet, raw );
@@ -3970,7 +3929,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
        } else if ( value !== undefined ) {
                chainable = true;
 
-               if ( !jQuery.isFunction( value ) ) {
+               if ( !isFunction( value ) ) {
                        raw = true;
                }
 
@@ -4012,6 +3971,23 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
 
        return len ? fn( elems[ 0 ], key ) : emptyGet;
 };
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( all, letter ) {
+       return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+       return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
 var acceptData = function( owner ) {
 
        // Accepts only:
@@ -4074,14 +4050,14 @@ Data.prototype = {
                // Handle: [ owner, key, value ] args
                // Always use camelCase key (gh-2257)
                if ( typeof data === "string" ) {
-                       cache[ jQuery.camelCase( data ) ] = value;
+                       cache[ camelCase( data ) ] = value;
 
                // Handle: [ owner, { properties } ] args
                } else {
 
                        // Copy the properties one-by-one to the cache object
                        for ( prop in data ) {
-                               cache[ jQuery.camelCase( prop ) ] = data[ prop ];
+                               cache[ camelCase( prop ) ] = data[ prop ];
                        }
                }
                return cache;
@@ -4091,7 +4067,7 @@ Data.prototype = {
                        this.cache( owner ) :
 
                        // Always use camelCase key (gh-2257)
-                       owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
+                       owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
        },
        access: function( owner, key, value ) {
 
@@ -4139,9 +4115,9 @@ Data.prototype = {
 
                                // If key is an array of keys...
                                // We always set camelCase keys, so remove that.
-                               key = key.map( jQuery.camelCase );
+                               key = key.map( camelCase );
                        } else {
-                               key = jQuery.camelCase( key );
+                               key = camelCase( key );
 
                                // If a key with the spaces exists, use it.
                                // Otherwise, create an array by matching non-whitespace
@@ -4287,7 +4263,7 @@ jQuery.fn.extend( {
                                                if ( attrs[ i ] ) {
                                                        name = attrs[ i ].name;
                                                        if ( name.indexOf( "data-" ) === 0 ) {
-                                                               name = jQuery.camelCase( name.slice( 5 ) );
+                                                               name = camelCase( name.slice( 5 ) );
                                                                dataAttr( elem, name, data[ name ] );
                                                        }
                                                }
@@ -4534,8 +4510,7 @@ var swap = function( elem, options, callback, args ) {
 
 
 function adjustCSS( elem, prop, valueParts, tween ) {
-       var adjusted,
-               scale = 1,
+       var adjusted, scale,
                maxIterations = 20,
                currentValue = tween ?
                        function() {
@@ -4553,30 +4528,33 @@ function adjustCSS( elem, prop, valueParts, tween ) {
 
        if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
 
+               // Support: Firefox <=54
+               // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+               initial = initial / 2;
+
                // Trust units reported by jQuery.css
                unit = unit || initialInUnit[ 3 ];
 
-               // Make sure we update the tween properties later on
-               valueParts = valueParts || [];
-
                // Iteratively approximate from a nonzero starting point
                initialInUnit = +initial || 1;
 
-               do {
+               while ( maxIterations-- ) {
 
-                       // 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
-                       initialInUnit = initialInUnit / scale;
+                       // Evaluate and update our best guess (doubling guesses that zero out).
+                       // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
                        jQuery.style( elem, prop, initialInUnit + unit );
+                       if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+                               maxIterations = 0;
+                       }
+                       initialInUnit = initialInUnit / scale;
 
-               // 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 = currentValue() / initial ) && scale !== 1 && --maxIterations
-               );
+               }
+
+               initialInUnit = initialInUnit * 2;
+               jQuery.style( elem, prop, initialInUnit + unit );
+
+               // Make sure we update the tween properties later on
+               valueParts = valueParts || [];
        }
 
        if ( valueParts ) {
@@ -4694,7 +4672,7 @@ var rcheckableType = ( /^(?:checkbox|radio)$/i );
 
 var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
 
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
 
 
 
@@ -4776,7 +4754,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
                if ( elem || elem === 0 ) {
 
                        // Add nodes directly
-                       if ( jQuery.type( elem ) === "object" ) {
+                       if ( toType( elem ) === "object" ) {
 
                                // Support: Android <=4.0 only, PhantomJS 1 only
                                // push.apply(_, arraylike) throws on ancient WebKit
@@ -5286,7 +5264,7 @@ jQuery.event = {
                        enumerable: true,
                        configurable: true,
 
-                       get: jQuery.isFunction( hook ) ?
+                       get: isFunction( hook ) ?
                                function() {
                                        if ( this.originalEvent ) {
                                                        return hook( this.originalEvent );
@@ -5421,7 +5399,7 @@ jQuery.Event = function( src, props ) {
        }
 
        // Create a timestamp if incoming event doesn't have one
-       this.timeStamp = src && src.timeStamp || jQuery.now();
+       this.timeStamp = src && src.timeStamp || Date.now();
 
        // Mark it as fixed
        this[ jQuery.expando ] = true;
@@ -5620,14 +5598,13 @@ var
 
        /* eslint-enable */
 
-       // Support: IE <=10 - 11, Edge 12 - 13
+       // Support: IE <=10 - 11, Edge 12 - 13 only
        // In IE/Edge using regex groups here causes severe slowdowns.
        // See https://connect.microsoft.com/IE/feedback/details/1736512/
        rnoInnerhtml = /<script|<style|<link/i,
 
        // checked="checked" or checked
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-       rscriptTypeMasked = /^true\/(.*)/,
        rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
 
 // Prefer a tbody over its parent table for containing new rows
@@ -5635,7 +5612,7 @@ function manipulationTarget( elem, content ) {
        if ( nodeName( elem, "table" ) &&
                nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
 
-               return jQuery( ">tbody", elem )[ 0 ] || elem;
+               return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
        }
 
        return elem;
@@ -5647,10 +5624,8 @@ function disableScript( elem ) {
        return elem;
 }
 function restoreScript( elem ) {
-       var match = rscriptTypeMasked.exec( elem.type );
-
-       if ( match ) {
-               elem.type = match[ 1 ];
+       if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+               elem.type = elem.type.slice( 5 );
        } else {
                elem.removeAttribute( "type" );
        }
@@ -5716,15 +5691,15 @@ function domManip( collection, args, callback, ignored ) {
                l = collection.length,
                iNoClone = l - 1,
                value = args[ 0 ],
-               isFunction = jQuery.isFunction( value );
+               valueIsFunction = isFunction( value );
 
        // We can't cloneNode fragments that contain checked, in WebKit
-       if ( isFunction ||
+       if ( valueIsFunction ||
                        ( l > 1 && typeof value === "string" &&
                                !support.checkClone && rchecked.test( value ) ) ) {
                return collection.each( function( index ) {
                        var self = collection.eq( index );
-                       if ( isFunction ) {
+                       if ( valueIsFunction ) {
                                args[ 0 ] = value.call( this, index, self.html() );
                        }
                        domManip( self, args, callback, ignored );
@@ -5778,14 +5753,14 @@ function domManip( collection, args, callback, ignored ) {
                                                !dataPriv.access( node, "globalEval" ) &&
                                                jQuery.contains( doc, node ) ) {
 
-                                               if ( node.src ) {
+                                               if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
 
                                                        // Optional AJAX dependency, but won't run scripts if not present
                                                        if ( jQuery._evalUrl ) {
                                                                jQuery._evalUrl( node.src );
                                                        }
                                                } else {
-                                                       DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
+                                                       DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
                                                }
                                        }
                                }
@@ -6065,8 +6040,6 @@ jQuery.each( {
                return this.pushStack( ret );
        };
 } );
-var rmargin = ( /^margin/ );
-
 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
 
 var getStyles = function( elem ) {
@@ -6083,6 +6056,8 @@ var getStyles = function( elem ) {
                return view.getComputedStyle( elem );
        };
 
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
 
 
 ( function() {
@@ -6096,25 +6071,33 @@ var getStyles = function( elem ) {
                        return;
                }
 
+               container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+                       "margin-top:1px;padding:0;border:0";
                div.style.cssText =
-                       "box-sizing:border-box;" +
-                       "position:relative;display:block;" +
+                       "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
                        "margin:auto;border:1px;padding:1px;" +
-                       "top:1%;width:50%";
-               div.innerHTML = "";
-               documentElement.appendChild( container );
+                       "width:60%;top:1%";
+               documentElement.appendChild( container ).appendChild( div );
 
                var divStyle = window.getComputedStyle( div );
                pixelPositionVal = divStyle.top !== "1%";
 
                // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
-               reliableMarginLeftVal = divStyle.marginLeft === "2px";
-               boxSizingReliableVal = divStyle.width === "4px";
+               reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
 
-               // Support: Android 4.0 - 4.3 only
+               // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
                // Some styles come back with percentage values, even though they shouldn't
-               div.style.marginRight = "50%";
-               pixelMarginRightVal = divStyle.marginRight === "4px";
+               div.style.right = "60%";
+               pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+               // Support: IE 9 - 11 only
+               // Detect misreporting of content dimensions for box-sizing:border-box elements
+               boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+               // Support: IE 9 only
+               // Detect overflow:scroll screwiness (gh-3699)
+               div.style.position = "absolute";
+               scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
 
                documentElement.removeChild( container );
 
@@ -6123,7 +6106,12 @@ var getStyles = function( elem ) {
                div = null;
        }
 
-       var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
+       function roundPixelMeasures( measure ) {
+               return Math.round( parseFloat( measure ) );
+       }
+
+       var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+               reliableMarginLeftVal,
                container = document.createElement( "div" ),
                div = document.createElement( "div" );
 
@@ -6138,26 +6126,26 @@ var getStyles = function( elem ) {
        div.cloneNode( true ).style.backgroundClip = "";
        support.clearCloneStyle = div.style.backgroundClip === "content-box";
 
-       container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
-               "padding:0;margin-top:1px;position:absolute";
-       container.appendChild( div );
-
        jQuery.extend( support, {
-               pixelPosition: function() {
-                       computeStyleTests();
-                       return pixelPositionVal;
-               },
                boxSizingReliable: function() {
                        computeStyleTests();
                        return boxSizingReliableVal;
                },
-               pixelMarginRight: function() {
+               pixelBoxStyles: function() {
+                       computeStyleTests();
+                       return pixelBoxStylesVal;
+               },
+               pixelPosition: function() {
                        computeStyleTests();
-                       return pixelMarginRightVal;
+                       return pixelPositionVal;
                },
                reliableMarginLeft: function() {
                        computeStyleTests();
                        return reliableMarginLeftVal;
+               },
+               scrollboxSize: function() {
+                       computeStyleTests();
+                       return scrollboxSizeVal;
                }
        } );
 } )();
@@ -6189,7 +6177,7 @@ function curCSS( elem, name, computed ) {
                // but width seems to be reliably pixels.
                // This is against the CSSOM draft spec:
                // https://drafts.csswg.org/cssom/#resolved-values
-               if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+               if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
 
                        // Remember the original values
                        width = style.width;
@@ -6294,87 +6282,120 @@ function setPositiveNumber( elem, value, subtract ) {
                value;
 }
 
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-       var i,
-               val = 0;
-
-       // If we already have the right measurement, avoid augmentation
-       if ( extra === ( isBorderBox ? "border" : "content" ) ) {
-               i = 4;
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+       var i = dimension === "width" ? 1 : 0,
+               extra = 0,
+               delta = 0;
 
-       // Otherwise initialize for horizontal or vertical properties
-       } else {
-               i = name === "width" ? 1 : 0;
+       // Adjustment may not be necessary
+       if ( box === ( isBorderBox ? "border" : "content" ) ) {
+               return 0;
        }
 
        for ( ; i < 4; i += 2 ) {
 
-               // Both box models exclude margin, so add it if we want it
-               if ( extra === "margin" ) {
-                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+               // Both box models exclude margin
+               if ( box === "margin" ) {
+                       delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
                }
 
-               if ( isBorderBox ) {
+               // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+               if ( !isBorderBox ) {
 
-                       // border-box includes padding, so remove it if we want content
-                       if ( extra === "content" ) {
-                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-                       }
+                       // Add padding
+                       delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 
-                       // 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 );
+                       // For "border" or "margin", add border
+                       if ( box !== "padding" ) {
+                               delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+                       // But still keep track of it otherwise
+                       } else {
+                               extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
                        }
+
+               // If we get here with a border-box (content + padding + border), we're seeking "content" or
+               // "padding" or "margin"
                } else {
 
-                       // At this point, extra isn't content, so add padding
-                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+                       // For "content", subtract padding
+                       if ( box === "content" ) {
+                               delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+                       }
 
-                       // 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 );
+                       // For "content" or "padding", subtract border
+                       if ( box !== "margin" ) {
+                               delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
                        }
                }
        }
 
-       return val;
+       // Account for positive content-box scroll gutter when requested by providing computedVal
+       if ( !isBorderBox && computedVal >= 0 ) {
+
+               // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+               // Assuming integer scroll gutter, subtract the rest and round down
+               delta += Math.max( 0, Math.ceil(
+                       elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+                       computedVal -
+                       delta -
+                       extra -
+                       0.5
+               ) );
+       }
+
+       return delta;
 }
 
-function getWidthOrHeight( elem, name, extra ) {
+function getWidthOrHeight( elem, dimension, extra ) {
 
        // Start with computed style
-       var valueIsBorderBox,
-               styles = getStyles( elem ),
-               val = curCSS( elem, name, styles ),
-               isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+       var styles = getStyles( elem ),
+               val = curCSS( elem, dimension, styles ),
+               isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+               valueIsBorderBox = isBorderBox;
 
-       // Computed unit is not pixels. Stop here and return.
+       // Support: Firefox <=54
+       // Return a confounding non-pixel value or feign ignorance, as appropriate.
        if ( rnumnonpx.test( val ) ) {
-               return val;
+               if ( !extra ) {
+                       return val;
+               }
+               val = "auto";
        }
 
        // 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 = valueIsBorderBox &&
+               ( support.boxSizingReliable() || val === elem.style[ dimension ] );
 
-       // Fall back to offsetWidth/Height when value is "auto"
+       // Fall back to offsetWidth/offsetHeight when value is "auto"
        // This happens for inline elements with no explicit setting (gh-3571)
-       if ( val === "auto" ) {
-               val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
+       // Support: Android <=4.1 - 4.3 only
+       // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+       if ( val === "auto" ||
+               !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
+
+               val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
+
+               // offsetWidth/offsetHeight provide border-box values
+               valueIsBorderBox = true;
        }
 
-       // Normalize "", auto, and prepare for extra
+       // Normalize "" and auto
        val = parseFloat( val ) || 0;
 
-       // Use the active box-sizing model to add/subtract irrelevant styles
+       // Adjust for the element's box model
        return ( val +
-               augmentWidthOrHeight(
+               boxModelAdjustment(
                        elem,
-                       name,
+                       dimension,
                        extra || ( isBorderBox ? "border" : "content" ),
                        valueIsBorderBox,
-                       styles
+                       styles,
+
+                       // Provide the current computed size to request scroll gutter calculation (gh-3589)
+                       val
                )
        ) + "px";
 }
@@ -6415,9 +6436,7 @@ jQuery.extend( {
 
        // Add in properties whose names you wish to fix before
        // setting or getting the value
-       cssProps: {
-               "float": "cssFloat"
-       },
+       cssProps: {},
 
        // Get and set the style property on a DOM Node
        style: function( elem, name, value, extra ) {
@@ -6429,7 +6448,7 @@ jQuery.extend( {
 
                // Make sure that we're working with the right name
                var ret, type, hooks,
-                       origName = jQuery.camelCase( name ),
+                       origName = camelCase( name ),
                        isCustomProp = rcustomProp.test( name ),
                        style = elem.style;
 
@@ -6497,7 +6516,7 @@ jQuery.extend( {
 
        css: function( elem, name, extra, styles ) {
                var val, num, hooks,
-                       origName = jQuery.camelCase( name ),
+                       origName = camelCase( name ),
                        isCustomProp = rcustomProp.test( name );
 
                // Make sure that we're working with the right name. We don't
@@ -6535,8 +6554,8 @@ jQuery.extend( {
        }
 } );
 
-jQuery.each( [ "height", "width" ], function( i, name ) {
-       jQuery.cssHooks[ name ] = {
+jQuery.each( [ "height", "width" ], function( i, dimension ) {
+       jQuery.cssHooks[ dimension ] = {
                get: function( elem, computed, extra ) {
                        if ( computed ) {
 
@@ -6552,29 +6571,41 @@ jQuery.each( [ "height", "width" ], function( i, name ) {
                                        // in IE throws an error.
                                        ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
                                                swap( elem, cssShow, function() {
-                                                       return getWidthOrHeight( elem, name, extra );
+                                                       return getWidthOrHeight( elem, dimension, extra );
                                                } ) :
-                                               getWidthOrHeight( elem, name, extra );
+                                               getWidthOrHeight( elem, dimension, extra );
                        }
                },
 
                set: function( elem, value, extra ) {
                        var matches,
-                               styles = extra && getStyles( elem ),
-                               subtract = extra && augmentWidthOrHeight(
+                               styles = getStyles( elem ),
+                               isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                               subtract = extra && boxModelAdjustment(
                                        elem,
-                                       name,
+                                       dimension,
                                        extra,
-                                       jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                                       isBorderBox,
                                        styles
                                );
 
+                       // Account for unreliable border-box dimensions by comparing offset* to computed and
+                       // faking a content-box to get border and padding (gh-3699)
+                       if ( isBorderBox && support.scrollboxSize() === styles.position ) {
+                               subtract -= Math.ceil(
+                                       elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+                                       parseFloat( styles[ dimension ] ) -
+                                       boxModelAdjustment( elem, dimension, "border", false, styles ) -
+                                       0.5
+                               );
+                       }
+
                        // Convert to pixels if value adjustment is needed
                        if ( subtract && ( matches = rcssNum.exec( value ) ) &&
                                ( matches[ 3 ] || "px" ) !== "px" ) {
 
-                               elem.style[ name ] = value;
-                               value = jQuery.css( elem, name );
+                               elem.style[ dimension ] = value;
+                               value = jQuery.css( elem, dimension );
                        }
 
                        return setPositiveNumber( elem, value, subtract );
@@ -6618,7 +6649,7 @@ jQuery.each( {
                }
        };
 
-       if ( !rmargin.test( prefix ) ) {
+       if ( prefix !== "margin" ) {
                jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
        }
 } );
@@ -6789,7 +6820,7 @@ function createFxNow() {
        window.setTimeout( function() {
                fxNow = undefined;
        } );
-       return ( fxNow = jQuery.now() );
+       return ( fxNow = Date.now() );
 }
 
 // Generate parameters to create a standard animation
@@ -6893,9 +6924,10 @@ function defaultPrefilter( elem, props, opts ) {
        // Restrict "overflow" and "display" styles during box animations
        if ( isBox && elem.nodeType === 1 ) {
 
-               // Support: IE <=9 - 11, Edge 12 - 13
+               // Support: IE <=9 - 11, Edge 12 - 15
                // Record all 3 overflow attributes because IE does not infer the shorthand
-               // from identically-valued overflowX and overflowY
+               // from identically-valued overflowX and overflowY and Edge just mirrors
+               // the overflowX value there.
                opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
 
                // Identify a display type, preferring old show/hide data over the CSS cascade
@@ -7003,7 +7035,7 @@ function propFilter( props, specialEasing ) {
 
        // camelCase, specialEasing and expand cssHook pass
        for ( index in props ) {
-               name = jQuery.camelCase( index );
+               name = camelCase( index );
                easing = specialEasing[ name ];
                value = props[ index ];
                if ( Array.isArray( value ) ) {
@@ -7128,9 +7160,9 @@ function Animation( elem, properties, options ) {
        for ( ; index < length; index++ ) {
                result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
                if ( result ) {
-                       if ( jQuery.isFunction( result.stop ) ) {
+                       if ( isFunction( result.stop ) ) {
                                jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
-                                       jQuery.proxy( result.stop, result );
+                                       result.stop.bind( result );
                        }
                        return result;
                }
@@ -7138,7 +7170,7 @@ function Animation( elem, properties, options ) {
 
        jQuery.map( props, createTween, animation );
 
-       if ( jQuery.isFunction( animation.opts.start ) ) {
+       if ( isFunction( animation.opts.start ) ) {
                animation.opts.start.call( elem, animation );
        }
 
@@ -7171,7 +7203,7 @@ jQuery.Animation = jQuery.extend( Animation, {
        },
 
        tweener: function( props, callback ) {
-               if ( jQuery.isFunction( props ) ) {
+               if ( isFunction( props ) ) {
                        callback = props;
                        props = [ "*" ];
                } else {
@@ -7203,9 +7235,9 @@ jQuery.Animation = jQuery.extend( Animation, {
 jQuery.speed = function( speed, easing, fn ) {
        var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
                complete: fn || !fn && easing ||
-                       jQuery.isFunction( speed ) && speed,
+                       isFunction( speed ) && speed,
                duration: speed,
-               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+               easing: fn && easing || easing && !isFunction( easing ) && easing
        };
 
        // Go to the end state if fx are off
@@ -7232,7 +7264,7 @@ jQuery.speed = function( speed, easing, fn ) {
        opt.old = opt.complete;
 
        opt.complete = function() {
-               if ( jQuery.isFunction( opt.old ) ) {
+               if ( isFunction( opt.old ) ) {
                        opt.old.call( this );
                }
 
@@ -7396,7 +7428,7 @@ jQuery.fx.tick = function() {
                i = 0,
                timers = jQuery.timers;
 
-       fxNow = jQuery.now();
+       fxNow = Date.now();
 
        for ( ; i < timers.length; i++ ) {
                timer = timers[ i ];
@@ -7749,7 +7781,7 @@ jQuery.each( [
 
 
        // Strip and collapse whitespace according to HTML spec
-       // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
+       // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
        function stripAndCollapse( value ) {
                var tokens = value.match( rnothtmlwhite ) || [];
                return tokens.join( " " );
@@ -7760,20 +7792,30 @@ function getClass( elem ) {
        return elem.getAttribute && elem.getAttribute( "class" ) || "";
 }
 
+function classesToArray( value ) {
+       if ( Array.isArray( value ) ) {
+               return value;
+       }
+       if ( typeof value === "string" ) {
+               return value.match( rnothtmlwhite ) || [];
+       }
+       return [];
+}
+
 jQuery.fn.extend( {
        addClass: function( value ) {
                var classes, elem, cur, curValue, clazz, j, finalValue,
                        i = 0;
 
-               if ( jQuery.isFunction( value ) ) {
+               if ( isFunction( value ) ) {
                        return this.each( function( j ) {
                                jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
                        } );
                }
 
-               if ( typeof value === "string" && value ) {
-                       classes = value.match( rnothtmlwhite ) || [];
+               classes = classesToArray( value );
 
+               if ( classes.length ) {
                        while ( ( elem = this[ i++ ] ) ) {
                                curValue = getClass( elem );
                                cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
@@ -7802,7 +7844,7 @@ jQuery.fn.extend( {
                var classes, elem, cur, curValue, clazz, j, finalValue,
                        i = 0;
 
-               if ( jQuery.isFunction( value ) ) {
+               if ( isFunction( value ) ) {
                        return this.each( function( j ) {
                                jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
                        } );
@@ -7812,9 +7854,9 @@ jQuery.fn.extend( {
                        return this.attr( "class", "" );
                }
 
-               if ( typeof value === "string" && value ) {
-                       classes = value.match( rnothtmlwhite ) || [];
+               classes = classesToArray( value );
 
+               if ( classes.length ) {
                        while ( ( elem = this[ i++ ] ) ) {
                                curValue = getClass( elem );
 
@@ -7844,13 +7886,14 @@ jQuery.fn.extend( {
        },
 
        toggleClass: function( value, stateVal ) {
-               var type = typeof value;
+               var type = typeof value,
+                       isValidValue = type === "string" || Array.isArray( value );
 
-               if ( typeof stateVal === "boolean" && type === "string" ) {
+               if ( typeof stateVal === "boolean" && isValidValue ) {
                        return stateVal ? this.addClass( value ) : this.removeClass( value );
                }
 
-               if ( jQuery.isFunction( value ) ) {
+               if ( isFunction( value ) ) {
                        return this.each( function( i ) {
                                jQuery( this ).toggleClass(
                                        value.call( this, i, getClass( this ), stateVal ),
@@ -7862,12 +7905,12 @@ jQuery.fn.extend( {
                return this.each( function() {
                        var className, i, self, classNames;
 
-                       if ( type === "string" ) {
+                       if ( isValidValue ) {
 
                                // Toggle individual class names
                                i = 0;
                                self = jQuery( this );
-                               classNames = value.match( rnothtmlwhite ) || [];
+                               classNames = classesToArray( value );
 
                                while ( ( className = classNames[ i++ ] ) ) {
 
@@ -7926,7 +7969,7 @@ var rreturn = /\r/g;
 
 jQuery.fn.extend( {
        val: function( value ) {
-               var hooks, ret, isFunction,
+               var hooks, ret, valueIsFunction,
                        elem = this[ 0 ];
 
                if ( !arguments.length ) {
@@ -7955,7 +7998,7 @@ jQuery.fn.extend( {
                        return;
                }
 
-               isFunction = jQuery.isFunction( value );
+               valueIsFunction = isFunction( value );
 
                return this.each( function( i ) {
                        var val;
@@ -7964,7 +8007,7 @@ jQuery.fn.extend( {
                                return;
                        }
 
-                       if ( isFunction ) {
+                       if ( valueIsFunction ) {
                                val = value.call( this, i, jQuery( this ).val() );
                        } else {
                                val = value;
@@ -8106,18 +8149,24 @@ jQuery.each( [ "radio", "checkbox" ], function() {
 // Return jQuery for attributes-only inclusion
 
 
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       stopPropagationCallback = function( e ) {
+               e.stopPropagation();
+       };
 
 jQuery.extend( jQuery.event, {
 
        trigger: function( event, data, elem, onlyHandlers ) {
 
-               var i, cur, tmp, bubbleType, ontype, handle, special,
+               var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
                        eventPath = [ elem || document ],
                        type = hasOwn.call( event, "type" ) ? event.type : event,
                        namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
 
-               cur = tmp = elem = elem || document;
+               cur = lastElement = tmp = elem = elem || document;
 
                // Don't do events on text and comment nodes
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
@@ -8169,7 +8218,7 @@ jQuery.extend( jQuery.event, {
 
                // Determine event propagation path in advance, per W3C events spec (#9951)
                // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+               if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
 
                        bubbleType = special.delegateType || type;
                        if ( !rfocusMorph.test( bubbleType + type ) ) {
@@ -8189,7 +8238,7 @@ jQuery.extend( jQuery.event, {
                // Fire handlers on the event path
                i = 0;
                while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-
+                       lastElement = cur;
                        event.type = i > 1 ?
                                bubbleType :
                                special.bindType || type;
@@ -8221,7 +8270,7 @@ jQuery.extend( jQuery.event, {
 
                                // Call a native DOM method on the target with the same name as the event.
                                // Don't do default actions on window, that's where global variables be (#6170)
-                               if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+                               if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
 
                                        // Don't re-trigger an onFOO event when we call its FOO() method
                                        tmp = elem[ ontype ];
@@ -8232,7 +8281,17 @@ jQuery.extend( jQuery.event, {
 
                                        // Prevent re-triggering of the same event, since we already bubbled it above
                                        jQuery.event.triggered = type;
+
+                                       if ( event.isPropagationStopped() ) {
+                                               lastElement.addEventListener( type, stopPropagationCallback );
+                                       }
+
                                        elem[ type ]();
+
+                                       if ( event.isPropagationStopped() ) {
+                                               lastElement.removeEventListener( type, stopPropagationCallback );
+                                       }
+
                                        jQuery.event.triggered = undefined;
 
                                        if ( tmp ) {
@@ -8278,31 +8337,6 @@ jQuery.fn.extend( {
 } );
 
 
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
-       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-       "change select submit keydown keypress keyup contextmenu" ).split( " " ),
-       function( i, name ) {
-
-       // Handle event binding
-       jQuery.fn[ name ] = function( data, fn ) {
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
-       };
-} );
-
-jQuery.fn.extend( {
-       hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-       }
-} );
-
-
-
-
-support.focusin = "onfocusin" in window;
-
-
 // Support: Firefox <=44
 // Firefox doesn't have focus(in | out) events
 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
@@ -8346,7 +8380,7 @@ if ( !support.focusin ) {
 }
 var location = window.location;
 
-var nonce = jQuery.now();
+var nonce = Date.now();
 
 var rquery = ( /\?/ );
 
@@ -8404,7 +8438,7 @@ function buildParams( prefix, obj, traditional, add ) {
                        }
                } );
 
-       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+       } else if ( !traditional && toType( obj ) === "object" ) {
 
                // Serialize object item.
                for ( name in obj ) {
@@ -8426,7 +8460,7 @@ jQuery.param = function( a, traditional ) {
                add = function( key, valueOrFunction ) {
 
                        // If value is a function, invoke it and use its return value
-                       var value = jQuery.isFunction( valueOrFunction ) ?
+                       var value = isFunction( valueOrFunction ) ?
                                valueOrFunction() :
                                valueOrFunction;
 
@@ -8544,7 +8578,7 @@ function addToPrefiltersOrTransports( structure ) {
                        i = 0,
                        dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
 
-               if ( jQuery.isFunction( func ) ) {
+               if ( isFunction( func ) ) {
 
                        // For each dataType in the dataTypeExpression
                        while ( ( dataType = dataTypes[ i++ ] ) ) {
@@ -9016,7 +9050,7 @@ jQuery.extend( {
                if ( s.crossDomain == null ) {
                        urlAnchor = document.createElement( "a" );
 
-                       // Support: IE <=8 - 11, Edge 12 - 13
+                       // Support: IE <=8 - 11, Edge 12 - 15
                        // IE throws exception on accessing the href property if url is malformed,
                        // e.g. http://example.com:80x/
                        try {
@@ -9074,8 +9108,8 @@ jQuery.extend( {
                        // Remember the hash so we can put it back
                        uncached = s.url.slice( cacheURL.length );
 
-                       // If data is available, append data to url
-                       if ( s.data ) {
+                       // If data is available and should be processed, append data to url
+                       if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
                                cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
 
                                // #9682: remove data so that it's not used in an eventual retry
@@ -9312,7 +9346,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
        jQuery[ method ] = function( url, data, callback, type ) {
 
                // Shift arguments if data argument was omitted
-               if ( jQuery.isFunction( data ) ) {
+               if ( isFunction( data ) ) {
                        type = type || callback;
                        callback = data;
                        data = undefined;
@@ -9350,7 +9384,7 @@ jQuery.fn.extend( {
                var wrap;
 
                if ( this[ 0 ] ) {
-                       if ( jQuery.isFunction( html ) ) {
+                       if ( isFunction( html ) ) {
                                html = html.call( this[ 0 ] );
                        }
 
@@ -9376,7 +9410,7 @@ jQuery.fn.extend( {
        },
 
        wrapInner: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
+               if ( isFunction( html ) ) {
                        return this.each( function( i ) {
                                jQuery( this ).wrapInner( html.call( this, i ) );
                        } );
@@ -9396,10 +9430,10 @@ jQuery.fn.extend( {
        },
 
        wrap: function( html ) {
-               var isFunction = jQuery.isFunction( html );
+               var htmlIsFunction = isFunction( html );
 
                return this.each( function( i ) {
-                       jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
+                       jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
                } );
        },
 
@@ -9491,7 +9525,8 @@ jQuery.ajaxTransport( function( options ) {
                                        return function() {
                                                if ( callback ) {
                                                        callback = errorCallback = xhr.onload =
-                                                               xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
+                                                               xhr.onerror = xhr.onabort = xhr.ontimeout =
+                                                                       xhr.onreadystatechange = null;
 
                                                        if ( type === "abort" ) {
                                                                xhr.abort();
@@ -9531,7 +9566,7 @@ jQuery.ajaxTransport( function( options ) {
 
                                // Listen to events
                                xhr.onload = callback();
-                               errorCallback = xhr.onerror = callback( "error" );
+                               errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
 
                                // Support: IE 9 only
                                // Use onreadystatechange to replace onabort
@@ -9685,7 +9720,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
        if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
 
                // Get callback name, remembering preexisting value associated with it
-               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+               callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
                        s.jsonpCallback() :
                        s.jsonpCallback;
 
@@ -9736,7 +9771,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
                        }
 
                        // Call if it was a function and we have a response
-                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                       if ( responseContainer && isFunction( overwritten ) ) {
                                overwritten( responseContainer[ 0 ] );
                        }
 
@@ -9828,7 +9863,7 @@ jQuery.fn.load = function( url, params, callback ) {
        }
 
        // If it's a function
-       if ( jQuery.isFunction( params ) ) {
+       if ( isFunction( params ) ) {
 
                // We assume that it's the callback
                callback = params;
@@ -9936,7 +9971,7 @@ jQuery.offset = {
                        curLeft = parseFloat( curCSSLeft ) || 0;
                }
 
-               if ( jQuery.isFunction( options ) ) {
+               if ( isFunction( options ) ) {
 
                        // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
                        options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
@@ -9959,6 +9994,8 @@ jQuery.offset = {
 };
 
 jQuery.fn.extend( {
+
+       // offset() relates an element's border box to the document origin
        offset: function( options ) {
 
                // Preserve chaining for setter
@@ -9970,7 +10007,7 @@ jQuery.fn.extend( {
                                } );
                }
 
-               var doc, docElem, rect, win,
+               var rect, win,
                        elem = this[ 0 ];
 
                if ( !elem ) {
@@ -9985,50 +10022,52 @@ jQuery.fn.extend( {
                        return { top: 0, left: 0 };
                }
 
+               // Get document-relative position by adding viewport scroll to viewport-relative gBCR
                rect = elem.getBoundingClientRect();
-
-               doc = elem.ownerDocument;
-               docElem = doc.documentElement;
-               win = doc.defaultView;
-
+               win = elem.ownerDocument.defaultView;
                return {
-                       top: rect.top + win.pageYOffset - docElem.clientTop,
-                       left: rect.left + win.pageXOffset - docElem.clientLeft
+                       top: rect.top + win.pageYOffset,
+                       left: rect.left + win.pageXOffset
                };
        },
 
+       // position() relates an element's margin box to its offset parent's padding box
+       // This corresponds to the behavior of CSS absolute positioning
        position: function() {
                if ( !this[ 0 ] ) {
                        return;
                }
 
-               var offsetParent, offset,
+               var offsetParent, offset, doc,
                        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
+               // position:fixed elements are offset from the viewport, which itself always has zero offset
                if ( jQuery.css( elem, "position" ) === "fixed" ) {
 
-                       // Assume getBoundingClientRect is there when computed position is fixed
+                       // Assume position:fixed implies availability of getBoundingClientRect
                        offset = elem.getBoundingClientRect();
 
                } else {
+                       offset = this.offset();
 
-                       // Get *real* offsetParent
-                       offsetParent = this.offsetParent();
+                       // Account for the *real* offset parent, which can be the document or its root element
+                       // when a statically positioned element is identified
+                       doc = elem.ownerDocument;
+                       offsetParent = elem.offsetParent || doc.documentElement;
+                       while ( offsetParent &&
+                               ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+                               jQuery.css( offsetParent, "position" ) === "static" ) {
 
-                       // Get correct offsets
-                       offset = this.offset();
-                       if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
-                               parentOffset = offsetParent.offset();
+                               offsetParent = offsetParent.parentNode;
                        }
+                       if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
 
-                       // Add offsetParent borders
-                       parentOffset = {
-                               top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
-                               left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
-                       };
+                               // Incorporate borders into its offset, since they are outside its content origin
+                               parentOffset = jQuery( offsetParent ).offset();
+                               parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+                               parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+                       }
                }
 
                // Subtract parent offsets and element margins
@@ -10070,7 +10109,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
 
                        // Coalesce documents and windows
                        var win;
-                       if ( jQuery.isWindow( elem ) ) {
+                       if ( isWindow( elem ) ) {
                                win = elem;
                        } else if ( elem.nodeType === 9 ) {
                                win = elem.defaultView;
@@ -10128,7 +10167,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
                        return access( this, function( elem, type, value ) {
                                var doc;
 
-                               if ( jQuery.isWindow( elem ) ) {
+                               if ( isWindow( elem ) ) {
 
                                        // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
                                        return funcName.indexOf( "outer" ) === 0 ?
@@ -10162,6 +10201,28 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
 } );
 
 
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+       function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+} );
+
+jQuery.fn.extend( {
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+} );
+
+
+
+
 jQuery.fn.extend( {
 
        bind: function( types, data, fn ) {
@@ -10183,6 +10244,37 @@ jQuery.fn.extend( {
        }
 } );
 
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+       var tmp, args, proxy;
+
+       if ( typeof context === "string" ) {
+               tmp = fn[ context ];
+               context = fn;
+               fn = tmp;
+       }
+
+       // Quick check to determine if target is callable, in the spec
+       // this throws a TypeError, but we will just return undefined.
+       if ( !isFunction( fn ) ) {
+               return undefined;
+       }
+
+       // Simulated bind
+       args = slice.call( arguments, 2 );
+       proxy = function() {
+               return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+       };
+
+       // Set the guid of unique handler to the same of original handler, so it can be removed
+       proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+       return proxy;
+};
+
 jQuery.holdReady = function( hold ) {
        if ( hold ) {
                jQuery.readyWait++;
@@ -10193,6 +10285,26 @@ jQuery.holdReady = function( hold ) {
 jQuery.isArray = Array.isArray;
 jQuery.parseJSON = JSON.parse;
 jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+       // As of jQuery 3.0, isNumeric is limited to
+       // strings and numbers (primitives or objects)
+       // that can be coerced to finite numbers (gh-2662)
+       var type = jQuery.type( obj );
+       return ( type === "number" || type === "string" ) &&
+
+               // parseFloat NaNs numeric-cast false positives ("")
+               // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+               // subtraction forces infinities to NaN
+               !isNaN( obj - parseFloat( obj ) );
+};