jquery-rails 4.3.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * jQuery JavaScript Library v3.2.1
2
+ * jQuery JavaScript Library v3.5.1
3
3
  * https://jquery.com/
4
4
  *
5
5
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
9
9
  * Released under the MIT license
10
10
  * https://jquery.org/license
11
11
  *
12
- * Date: 2017-03-20T18:59Z
12
+ * Date: 2020-05-04T22:49Z
13
13
  */
14
14
  ( function( global, factory ) {
15
15
 
@@ -47,13 +47,16 @@
47
47
 
48
48
  var arr = [];
49
49
 
50
- var document = window.document;
51
-
52
50
  var getProto = Object.getPrototypeOf;
53
51
 
54
52
  var slice = arr.slice;
55
53
 
56
- var concat = arr.concat;
54
+ var flat = arr.flat ? function( array ) {
55
+ return arr.flat.call( array );
56
+ } : function( array ) {
57
+ return arr.concat.apply( [], array );
58
+ };
59
+
57
60
 
58
61
  var push = arr.push;
59
62
 
@@ -71,16 +74,72 @@ var ObjectFunctionString = fnToString.call( Object );
71
74
 
72
75
  var support = {};
73
76
 
77
+ var isFunction = function isFunction( obj ) {
78
+
79
+ // Support: Chrome <=57, Firefox <=52
80
+ // In some browsers, typeof returns "function" for HTML <object> elements
81
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
82
+ // We don't want to classify *any* DOM node as a function.
83
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
84
+ };
85
+
86
+
87
+ var isWindow = function isWindow( obj ) {
88
+ return obj != null && obj === obj.window;
89
+ };
90
+
91
+
92
+ var document = window.document;
74
93
 
75
94
 
76
- function DOMEval( code, doc ) {
95
+
96
+ var preservedScriptAttributes = {
97
+ type: true,
98
+ src: true,
99
+ nonce: true,
100
+ noModule: true
101
+ };
102
+
103
+ function DOMEval( code, node, doc ) {
77
104
  doc = doc || document;
78
105
 
79
- var script = doc.createElement( "script" );
106
+ var i, val,
107
+ script = doc.createElement( "script" );
80
108
 
81
109
  script.text = code;
110
+ if ( node ) {
111
+ for ( i in preservedScriptAttributes ) {
112
+
113
+ // Support: Firefox 64+, Edge 18+
114
+ // Some browsers don't support the "nonce" property on scripts.
115
+ // On the other hand, just using `getAttribute` is not enough as
116
+ // the `nonce` attribute is reset to an empty string whenever it
117
+ // becomes browsing-context connected.
118
+ // See https://github.com/whatwg/html/issues/2369
119
+ // See https://html.spec.whatwg.org/#nonce-attributes
120
+ // The `node.getAttribute` check was added for the sake of
121
+ // `jQuery.globalEval` so that it can fake a nonce-containing node
122
+ // via an object.
123
+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
124
+ if ( val ) {
125
+ script.setAttribute( i, val );
126
+ }
127
+ }
128
+ }
82
129
  doc.head.appendChild( script ).parentNode.removeChild( script );
83
130
  }
131
+
132
+
133
+ function toType( obj ) {
134
+ if ( obj == null ) {
135
+ return obj + "";
136
+ }
137
+
138
+ // Support: Android <=2.3 only (functionish RegExp)
139
+ return typeof obj === "object" || typeof obj === "function" ?
140
+ class2type[ toString.call( obj ) ] || "object" :
141
+ typeof obj;
142
+ }
84
143
  /* global Symbol */
85
144
  // Defining this global in .eslintrc.json would create a danger of using the global
86
145
  // unguarded in another place, it seems safer to define global only for this module
@@ -88,7 +147,7 @@ var support = {};
88
147
 
89
148
 
90
149
  var
91
- version = "3.2.1",
150
+ version = "3.5.1",
92
151
 
93
152
  // Define a local copy of jQuery
94
153
  jQuery = function( selector, context ) {
@@ -96,19 +155,6 @@ var
96
155
  // The jQuery object is actually just the init constructor 'enhanced'
97
156
  // Need init if jQuery is called (just allow error to be thrown if not included)
98
157
  return new jQuery.fn.init( selector, context );
99
- },
100
-
101
- // Support: Android <=4.0 only
102
- // Make sure we trim BOM and NBSP
103
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
104
-
105
- // Matches dashed string for camelizing
106
- rmsPrefix = /^-ms-/,
107
- rdashAlpha = /-([a-z])/g,
108
-
109
- // Used by jQuery.camelCase as callback to replace()
110
- fcamelCase = function( all, letter ) {
111
- return letter.toUpperCase();
112
158
  };
113
159
 
114
160
  jQuery.fn = jQuery.prototype = {
@@ -175,6 +221,18 @@ jQuery.fn = jQuery.prototype = {
175
221
  return this.eq( -1 );
176
222
  },
177
223
 
224
+ even: function() {
225
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
226
+ return ( i + 1 ) % 2;
227
+ } ) );
228
+ },
229
+
230
+ odd: function() {
231
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
232
+ return i % 2;
233
+ } ) );
234
+ },
235
+
178
236
  eq: function( i ) {
179
237
  var len = this.length,
180
238
  j = +i + ( i < 0 ? len : 0 );
@@ -209,7 +267,7 @@ jQuery.extend = jQuery.fn.extend = function() {
209
267
  }
210
268
 
211
269
  // Handle case when target is a string or something (possible in deep copy)
212
- if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
270
+ if ( typeof target !== "object" && !isFunction( target ) ) {
213
271
  target = {};
214
272
  }
215
273
 
@@ -226,25 +284,28 @@ jQuery.extend = jQuery.fn.extend = function() {
226
284
 
227
285
  // Extend the base object
228
286
  for ( name in options ) {
229
- src = target[ name ];
230
287
  copy = options[ name ];
231
288
 
289
+ // Prevent Object.prototype pollution
232
290
  // Prevent never-ending loop
233
- if ( target === copy ) {
291
+ if ( name === "__proto__" || target === copy ) {
234
292
  continue;
235
293
  }
236
294
 
237
295
  // Recurse if we're merging plain objects or arrays
238
296
  if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
239
297
  ( copyIsArray = Array.isArray( copy ) ) ) ) {
298
+ src = target[ name ];
240
299
 
241
- if ( copyIsArray ) {
242
- copyIsArray = false;
243
- clone = src && Array.isArray( src ) ? src : [];
244
-
300
+ // Ensure proper type for the source value
301
+ if ( copyIsArray && !Array.isArray( src ) ) {
302
+ clone = [];
303
+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
304
+ clone = {};
245
305
  } else {
246
- clone = src && jQuery.isPlainObject( src ) ? src : {};
306
+ clone = src;
247
307
  }
308
+ copyIsArray = false;
248
309
 
249
310
  // Never move original objects, clone them
250
311
  target[ name ] = jQuery.extend( deep, clone, copy );
@@ -275,28 +336,6 @@ jQuery.extend( {
275
336
 
276
337
  noop: function() {},
277
338
 
278
- isFunction: function( obj ) {
279
- return jQuery.type( obj ) === "function";
280
- },
281
-
282
- isWindow: function( obj ) {
283
- return obj != null && obj === obj.window;
284
- },
285
-
286
- isNumeric: function( obj ) {
287
-
288
- // As of jQuery 3.0, isNumeric is limited to
289
- // strings and numbers (primitives or objects)
290
- // that can be coerced to finite numbers (gh-2662)
291
- var type = jQuery.type( obj );
292
- return ( type === "number" || type === "string" ) &&
293
-
294
- // parseFloat NaNs numeric-cast false positives ("")
295
- // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
296
- // subtraction forces infinities to NaN
297
- !isNaN( obj - parseFloat( obj ) );
298
- },
299
-
300
339
  isPlainObject: function( obj ) {
301
340
  var proto, Ctor;
302
341
 
@@ -319,9 +358,6 @@ jQuery.extend( {
319
358
  },
320
359
 
321
360
  isEmptyObject: function( obj ) {
322
-
323
- /* eslint-disable no-unused-vars */
324
- // See https://github.com/eslint/eslint/issues/6125
325
361
  var name;
326
362
 
327
363
  for ( name in obj ) {
@@ -330,27 +366,10 @@ jQuery.extend( {
330
366
  return true;
331
367
  },
332
368
 
333
- type: function( obj ) {
334
- if ( obj == null ) {
335
- return obj + "";
336
- }
337
-
338
- // Support: Android <=2.3 only (functionish RegExp)
339
- return typeof obj === "object" || typeof obj === "function" ?
340
- class2type[ toString.call( obj ) ] || "object" :
341
- typeof obj;
342
- },
343
-
344
- // Evaluates a script in a global context
345
- globalEval: function( code ) {
346
- DOMEval( code );
347
- },
348
-
349
- // Convert dashed to camelCase; used by the css and data modules
350
- // Support: IE <=9 - 11, Edge 12 - 13
351
- // Microsoft forgot to hump their vendor prefix (#9572)
352
- camelCase: function( string ) {
353
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
369
+ // Evaluates a script in a provided context; falls back to the global one
370
+ // if not specified.
371
+ globalEval: function( code, options, doc ) {
372
+ DOMEval( code, { nonce: options && options.nonce }, doc );
354
373
  },
355
374
 
356
375
  each: function( obj, callback ) {
@@ -374,13 +393,6 @@ jQuery.extend( {
374
393
  return obj;
375
394
  },
376
395
 
377
- // Support: Android <=4.0 only
378
- trim: function( text ) {
379
- return text == null ?
380
- "" :
381
- ( text + "" ).replace( rtrim, "" );
382
- },
383
-
384
396
  // results is for internal usage only
385
397
  makeArray: function( arr, results ) {
386
398
  var ret = results || [];
@@ -467,43 +479,12 @@ jQuery.extend( {
467
479
  }
468
480
 
469
481
  // Flatten any nested arrays
470
- return concat.apply( [], ret );
482
+ return flat( ret );
471
483
  },
472
484
 
473
485
  // A global GUID counter for objects
474
486
  guid: 1,
475
487
 
476
- // Bind a function to a context, optionally partially applying any
477
- // arguments.
478
- proxy: function( fn, context ) {
479
- var tmp, args, proxy;
480
-
481
- if ( typeof context === "string" ) {
482
- tmp = fn[ context ];
483
- context = fn;
484
- fn = tmp;
485
- }
486
-
487
- // Quick check to determine if target is callable, in the spec
488
- // this throws a TypeError, but we will just return undefined.
489
- if ( !jQuery.isFunction( fn ) ) {
490
- return undefined;
491
- }
492
-
493
- // Simulated bind
494
- args = slice.call( arguments, 2 );
495
- proxy = function() {
496
- return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
497
- };
498
-
499
- // Set the guid of unique handler to the same of original handler, so it can be removed
500
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
501
-
502
- return proxy;
503
- },
504
-
505
- now: Date.now,
506
-
507
488
  // jQuery.support is not used in Core but other projects attach their
508
489
  // properties to it so it needs to exist.
509
490
  support: support
@@ -515,7 +496,7 @@ if ( typeof Symbol === "function" ) {
515
496
 
516
497
  // Populate the class2type map
517
498
  jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
518
- function( i, name ) {
499
+ function( _i, name ) {
519
500
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
520
501
  } );
521
502
 
@@ -526,9 +507,9 @@ function isArrayLike( obj ) {
526
507
  // hasOwn isn't used here due to false negatives
527
508
  // regarding Nodelist length in IE
528
509
  var length = !!obj && "length" in obj && obj.length,
529
- type = jQuery.type( obj );
510
+ type = toType( obj );
530
511
 
531
- if ( type === "function" || jQuery.isWindow( obj ) ) {
512
+ if ( isFunction( obj ) || isWindow( obj ) ) {
532
513
  return false;
533
514
  }
534
515
 
@@ -537,17 +518,16 @@ function isArrayLike( obj ) {
537
518
  }
538
519
  var Sizzle =
539
520
  /*!
540
- * Sizzle CSS Selector Engine v2.3.3
521
+ * Sizzle CSS Selector Engine v2.3.5
541
522
  * https://sizzlejs.com/
542
523
  *
543
- * Copyright jQuery Foundation and other contributors
524
+ * Copyright JS Foundation and other contributors
544
525
  * Released under the MIT license
545
- * http://jquery.org/license
526
+ * https://js.foundation/
546
527
  *
547
- * Date: 2016-08-08
528
+ * Date: 2020-03-14
548
529
  */
549
- (function( window ) {
550
-
530
+ ( function( window ) {
551
531
  var i,
552
532
  support,
553
533
  Expr,
@@ -578,6 +558,7 @@ var i,
578
558
  classCache = createCache(),
579
559
  tokenCache = createCache(),
580
560
  compilerCache = createCache(),
561
+ nonnativeSelectorCache = createCache(),
581
562
  sortOrder = function( a, b ) {
582
563
  if ( a === b ) {
583
564
  hasDuplicate = true;
@@ -586,61 +567,71 @@ var i,
586
567
  },
587
568
 
588
569
  // Instance methods
589
- hasOwn = ({}).hasOwnProperty,
570
+ hasOwn = ( {} ).hasOwnProperty,
590
571
  arr = [],
591
572
  pop = arr.pop,
592
- push_native = arr.push,
573
+ pushNative = arr.push,
593
574
  push = arr.push,
594
575
  slice = arr.slice,
576
+
595
577
  // Use a stripped-down indexOf as it's faster than native
596
578
  // https://jsperf.com/thor-indexof-vs-for/5
597
579
  indexOf = function( list, elem ) {
598
580
  var i = 0,
599
581
  len = list.length;
600
582
  for ( ; i < len; i++ ) {
601
- if ( list[i] === elem ) {
583
+ if ( list[ i ] === elem ) {
602
584
  return i;
603
585
  }
604
586
  }
605
587
  return -1;
606
588
  },
607
589
 
608
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
590
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
591
+ "ismap|loop|multiple|open|readonly|required|scoped",
609
592
 
610
593
  // Regular expressions
611
594
 
612
595
  // http://www.w3.org/TR/css3-selectors/#whitespace
613
596
  whitespace = "[\\x20\\t\\r\\n\\f]",
614
597
 
615
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
616
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
598
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
599
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
600
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
617
601
 
618
602
  // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
619
603
  attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
604
+
620
605
  // Operator (capture 2)
621
606
  "*([*^$|!~]?=)" + whitespace +
622
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
623
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
624
- "*\\]",
607
+
608
+ // "Attribute values must be CSS identifiers [capture 5]
609
+ // or strings [capture 3 or capture 4]"
610
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
611
+ whitespace + "*\\]",
625
612
 
626
613
  pseudos = ":(" + identifier + ")(?:\\((" +
614
+
627
615
  // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
628
616
  // 1. quoted (capture 3; capture 4 or capture 5)
629
617
  "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
618
+
630
619
  // 2. simple (capture 6)
631
620
  "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
621
+
632
622
  // 3. anything else (capture 2)
633
623
  ".*" +
634
624
  ")\\)|)",
635
625
 
636
626
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
637
627
  rwhitespace = new RegExp( whitespace + "+", "g" ),
638
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
628
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
629
+ whitespace + "+$", "g" ),
639
630
 
640
631
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
641
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
642
-
643
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
632
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
633
+ "*" ),
634
+ rdescend = new RegExp( whitespace + "|>" ),
644
635
 
645
636
  rpseudo = new RegExp( pseudos ),
646
637
  ridentifier = new RegExp( "^" + identifier + "$" ),
@@ -651,16 +642,19 @@ var i,
651
642
  "TAG": new RegExp( "^(" + identifier + "|[*])" ),
652
643
  "ATTR": new RegExp( "^" + attributes ),
653
644
  "PSEUDO": new RegExp( "^" + pseudos ),
654
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
655
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
656
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
645
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
646
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
647
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
657
648
  "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
649
+
658
650
  // For use in libraries implementing .is()
659
651
  // We use this for POS matching in `select`
660
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
661
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
652
+ "needsContext": new RegExp( "^" + whitespace +
653
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
654
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
662
655
  },
663
656
 
657
+ rhtml = /HTML$/i,
664
658
  rinputs = /^(?:input|select|textarea|button)$/i,
665
659
  rheader = /^h\d$/i,
666
660
 
@@ -673,18 +667,21 @@ var i,
673
667
 
674
668
  // CSS escapes
675
669
  // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
676
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
677
- funescape = function( _, escaped, escapedWhitespace ) {
678
- var high = "0x" + escaped - 0x10000;
679
- // NaN means non-codepoint
680
- // Support: Firefox<24
681
- // Workaround erroneous numeric interpretation of +"0x"
682
- return high !== high || escapedWhitespace ?
683
- escaped :
670
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
671
+ funescape = function( escape, nonHex ) {
672
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
673
+
674
+ return nonHex ?
675
+
676
+ // Strip the backslash prefix from a non-hex escape sequence
677
+ nonHex :
678
+
679
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
680
+ // Support: IE <=11+
681
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
682
+ // surrogate pair
684
683
  high < 0 ?
685
- // BMP codepoint
686
684
  String.fromCharCode( high + 0x10000 ) :
687
- // Supplemental Plane codepoint (surrogate pair)
688
685
  String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
689
686
  },
690
687
 
@@ -700,7 +697,8 @@ var i,
700
697
  }
701
698
 
702
699
  // Control characters and (dependent upon position) numbers get escaped as code points
703
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
700
+ return ch.slice( 0, -1 ) + "\\" +
701
+ ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
704
702
  }
705
703
 
706
704
  // Other potentially-special ASCII characters get backslash-escaped
@@ -715,9 +713,9 @@ var i,
715
713
  setDocument();
716
714
  },
717
715
 
718
- disabledAncestor = addCombinator(
716
+ inDisabledFieldset = addCombinator(
719
717
  function( elem ) {
720
- return elem.disabled === true && ("form" in elem || "label" in elem);
718
+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
721
719
  },
722
720
  { dir: "parentNode", next: "legend" }
723
721
  );
@@ -725,18 +723,20 @@ var i,
725
723
  // Optimize for push.apply( _, NodeList )
726
724
  try {
727
725
  push.apply(
728
- (arr = slice.call( preferredDoc.childNodes )),
726
+ ( arr = slice.call( preferredDoc.childNodes ) ),
729
727
  preferredDoc.childNodes
730
728
  );
729
+
731
730
  // Support: Android<4.0
732
731
  // Detect silently failing push.apply
732
+ // eslint-disable-next-line no-unused-expressions
733
733
  arr[ preferredDoc.childNodes.length ].nodeType;
734
734
  } catch ( e ) {
735
735
  push = { apply: arr.length ?
736
736
 
737
737
  // Leverage slice if possible
738
738
  function( target, els ) {
739
- push_native.apply( target, slice.call(els) );
739
+ pushNative.apply( target, slice.call( els ) );
740
740
  } :
741
741
 
742
742
  // Support: IE<9
@@ -744,8 +744,9 @@ try {
744
744
  function( target, els ) {
745
745
  var j = target.length,
746
746
  i = 0;
747
+
747
748
  // Can't trust NodeList.length
748
- while ( (target[j++] = els[i++]) ) {}
749
+ while ( ( target[ j++ ] = els[ i++ ] ) ) {}
749
750
  target.length = j - 1;
750
751
  }
751
752
  };
@@ -769,24 +770,21 @@ function Sizzle( selector, context, results, seed ) {
769
770
 
770
771
  // Try to shortcut find operations (as opposed to filters) in HTML documents
771
772
  if ( !seed ) {
772
-
773
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
774
- setDocument( context );
775
- }
773
+ setDocument( context );
776
774
  context = context || document;
777
775
 
778
776
  if ( documentIsHTML ) {
779
777
 
780
778
  // If the selector is sufficiently simple, try using a "get*By*" DOM method
781
779
  // (excepting DocumentFragment context, where the methods don't exist)
782
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
780
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
783
781
 
784
782
  // ID selector
785
- if ( (m = match[1]) ) {
783
+ if ( ( m = match[ 1 ] ) ) {
786
784
 
787
785
  // Document context
788
786
  if ( nodeType === 9 ) {
789
- if ( (elem = context.getElementById( m )) ) {
787
+ if ( ( elem = context.getElementById( m ) ) ) {
790
788
 
791
789
  // Support: IE, Opera, Webkit
792
790
  // TODO: identify versions
@@ -805,7 +803,7 @@ function Sizzle( selector, context, results, seed ) {
805
803
  // Support: IE, Opera, Webkit
806
804
  // TODO: identify versions
807
805
  // getElementById can match elements by name instead of ID
808
- if ( newContext && (elem = newContext.getElementById( m )) &&
806
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
809
807
  contains( context, elem ) &&
810
808
  elem.id === m ) {
811
809
 
@@ -815,12 +813,12 @@ function Sizzle( selector, context, results, seed ) {
815
813
  }
816
814
 
817
815
  // Type selector
818
- } else if ( match[2] ) {
816
+ } else if ( match[ 2 ] ) {
819
817
  push.apply( results, context.getElementsByTagName( selector ) );
820
818
  return results;
821
819
 
822
820
  // Class selector
823
- } else if ( (m = match[3]) && support.getElementsByClassName &&
821
+ } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
824
822
  context.getElementsByClassName ) {
825
823
 
826
824
  push.apply( results, context.getElementsByClassName( m ) );
@@ -830,50 +828,62 @@ function Sizzle( selector, context, results, seed ) {
830
828
 
831
829
  // Take advantage of querySelectorAll
832
830
  if ( support.qsa &&
833
- !compilerCache[ selector + " " ] &&
834
- (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
835
-
836
- if ( nodeType !== 1 ) {
837
- newContext = context;
838
- newSelector = selector;
831
+ !nonnativeSelectorCache[ selector + " " ] &&
832
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
839
833
 
840
- // qSA looks outside Element context, which is not what we want
841
- // Thanks to Andrew Dupont for this workaround technique
842
- // Support: IE <=8
834
+ // Support: IE 8 only
843
835
  // Exclude object elements
844
- } else if ( context.nodeName.toLowerCase() !== "object" ) {
836
+ ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
845
837
 
846
- // Capture the context ID, setting it first if necessary
847
- if ( (nid = context.getAttribute( "id" )) ) {
848
- nid = nid.replace( rcssescape, fcssescape );
849
- } else {
850
- context.setAttribute( "id", (nid = expando) );
838
+ newSelector = selector;
839
+ newContext = context;
840
+
841
+ // qSA considers elements outside a scoping root when evaluating child or
842
+ // descendant combinators, which is not what we want.
843
+ // In such cases, we work around the behavior by prefixing every selector in the
844
+ // list with an ID selector referencing the scope context.
845
+ // The technique has to be used as well when a leading combinator is used
846
+ // as such selectors are not recognized by querySelectorAll.
847
+ // Thanks to Andrew Dupont for this technique.
848
+ if ( nodeType === 1 &&
849
+ ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
850
+
851
+ // Expand context for sibling selectors
852
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
853
+ context;
854
+
855
+ // We can use :scope instead of the ID hack if the browser
856
+ // supports it & if we're not changing the context.
857
+ if ( newContext !== context || !support.scope ) {
858
+
859
+ // Capture the context ID, setting it first if necessary
860
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
861
+ nid = nid.replace( rcssescape, fcssescape );
862
+ } else {
863
+ context.setAttribute( "id", ( nid = expando ) );
864
+ }
851
865
  }
852
866
 
853
867
  // Prefix every selector in the list
854
868
  groups = tokenize( selector );
855
869
  i = groups.length;
856
870
  while ( i-- ) {
857
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
871
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
872
+ toSelector( groups[ i ] );
858
873
  }
859
874
  newSelector = groups.join( "," );
860
-
861
- // Expand context for sibling selectors
862
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
863
- context;
864
875
  }
865
876
 
866
- if ( newSelector ) {
867
- try {
868
- push.apply( results,
869
- newContext.querySelectorAll( newSelector )
870
- );
871
- return results;
872
- } catch ( qsaError ) {
873
- } finally {
874
- if ( nid === expando ) {
875
- context.removeAttribute( "id" );
876
- }
877
+ try {
878
+ push.apply( results,
879
+ newContext.querySelectorAll( newSelector )
880
+ );
881
+ return results;
882
+ } catch ( qsaError ) {
883
+ nonnativeSelectorCache( selector, true );
884
+ } finally {
885
+ if ( nid === expando ) {
886
+ context.removeAttribute( "id" );
877
887
  }
878
888
  }
879
889
  }
@@ -894,12 +904,14 @@ function createCache() {
894
904
  var keys = [];
895
905
 
896
906
  function cache( key, value ) {
907
+
897
908
  // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
898
909
  if ( keys.push( key + " " ) > Expr.cacheLength ) {
910
+
899
911
  // Only keep the most recent entries
900
912
  delete cache[ keys.shift() ];
901
913
  }
902
- return (cache[ key + " " ] = value);
914
+ return ( cache[ key + " " ] = value );
903
915
  }
904
916
  return cache;
905
917
  }
@@ -918,17 +930,19 @@ function markFunction( fn ) {
918
930
  * @param {Function} fn Passed the created element and returns a boolean result
919
931
  */
920
932
  function assert( fn ) {
921
- var el = document.createElement("fieldset");
933
+ var el = document.createElement( "fieldset" );
922
934
 
923
935
  try {
924
936
  return !!fn( el );
925
- } catch (e) {
937
+ } catch ( e ) {
926
938
  return false;
927
939
  } finally {
940
+
928
941
  // Remove from its parent by default
929
942
  if ( el.parentNode ) {
930
943
  el.parentNode.removeChild( el );
931
944
  }
945
+
932
946
  // release memory in IE
933
947
  el = null;
934
948
  }
@@ -940,11 +954,11 @@ function assert( fn ) {
940
954
  * @param {Function} handler The method that will be applied
941
955
  */
942
956
  function addHandle( attrs, handler ) {
943
- var arr = attrs.split("|"),
957
+ var arr = attrs.split( "|" ),
944
958
  i = arr.length;
945
959
 
946
960
  while ( i-- ) {
947
- Expr.attrHandle[ arr[i] ] = handler;
961
+ Expr.attrHandle[ arr[ i ] ] = handler;
948
962
  }
949
963
  }
950
964
 
@@ -966,7 +980,7 @@ function siblingCheck( a, b ) {
966
980
 
967
981
  // Check if b follows a
968
982
  if ( cur ) {
969
- while ( (cur = cur.nextSibling) ) {
983
+ while ( ( cur = cur.nextSibling ) ) {
970
984
  if ( cur === b ) {
971
985
  return -1;
972
986
  }
@@ -994,7 +1008,7 @@ function createInputPseudo( type ) {
994
1008
  function createButtonPseudo( type ) {
995
1009
  return function( elem ) {
996
1010
  var name = elem.nodeName.toLowerCase();
997
- return (name === "input" || name === "button") && elem.type === type;
1011
+ return ( name === "input" || name === "button" ) && elem.type === type;
998
1012
  };
999
1013
  }
1000
1014
 
@@ -1037,7 +1051,7 @@ function createDisabledPseudo( disabled ) {
1037
1051
  // Where there is no isDisabled, check manually
1038
1052
  /* jshint -W018 */
1039
1053
  elem.isDisabled !== !disabled &&
1040
- disabledAncestor( elem ) === disabled;
1054
+ inDisabledFieldset( elem ) === disabled;
1041
1055
  }
1042
1056
 
1043
1057
  return elem.disabled === disabled;
@@ -1059,21 +1073,21 @@ function createDisabledPseudo( disabled ) {
1059
1073
  * @param {Function} fn
1060
1074
  */
1061
1075
  function createPositionalPseudo( fn ) {
1062
- return markFunction(function( argument ) {
1076
+ return markFunction( function( argument ) {
1063
1077
  argument = +argument;
1064
- return markFunction(function( seed, matches ) {
1078
+ return markFunction( function( seed, matches ) {
1065
1079
  var j,
1066
1080
  matchIndexes = fn( [], seed.length, argument ),
1067
1081
  i = matchIndexes.length;
1068
1082
 
1069
1083
  // Match elements found at the specified indexes
1070
1084
  while ( i-- ) {
1071
- if ( seed[ (j = matchIndexes[i]) ] ) {
1072
- seed[j] = !(matches[j] = seed[j]);
1085
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1086
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
1073
1087
  }
1074
1088
  }
1075
- });
1076
- });
1089
+ } );
1090
+ } );
1077
1091
  }
1078
1092
 
1079
1093
  /**
@@ -1094,10 +1108,13 @@ support = Sizzle.support = {};
1094
1108
  * @returns {Boolean} True iff elem is a non-HTML XML node
1095
1109
  */
1096
1110
  isXML = Sizzle.isXML = function( elem ) {
1097
- // documentElement is verified for cases where it doesn't yet exist
1098
- // (such as loading iframes in IE - #4833)
1099
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1100
- return documentElement ? documentElement.nodeName !== "HTML" : false;
1111
+ var namespace = elem.namespaceURI,
1112
+ docElem = ( elem.ownerDocument || elem ).documentElement;
1113
+
1114
+ // Support: IE <=8
1115
+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1116
+ // https://bugs.jquery.com/ticket/4833
1117
+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1101
1118
  };
1102
1119
 
1103
1120
  /**
@@ -1110,7 +1127,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1110
1127
  doc = node ? node.ownerDocument || node : preferredDoc;
1111
1128
 
1112
1129
  // Return early if doc is invalid or already selected
1113
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1130
+ // Support: IE 11+, Edge 17 - 18+
1131
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1132
+ // two documents; shallow comparisons work.
1133
+ // eslint-disable-next-line eqeqeq
1134
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1114
1135
  return document;
1115
1136
  }
1116
1137
 
@@ -1119,10 +1140,14 @@ setDocument = Sizzle.setDocument = function( node ) {
1119
1140
  docElem = document.documentElement;
1120
1141
  documentIsHTML = !isXML( document );
1121
1142
 
1122
- // Support: IE 9-11, Edge
1143
+ // Support: IE 9 - 11+, Edge 12 - 18+
1123
1144
  // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1124
- if ( preferredDoc !== document &&
1125
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1145
+ // Support: IE 11+, Edge 17 - 18+
1146
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1147
+ // two documents; shallow comparisons work.
1148
+ // eslint-disable-next-line eqeqeq
1149
+ if ( preferredDoc != document &&
1150
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1126
1151
 
1127
1152
  // Support: IE 11, Edge
1128
1153
  if ( subWindow.addEventListener ) {
@@ -1134,25 +1159,36 @@ setDocument = Sizzle.setDocument = function( node ) {
1134
1159
  }
1135
1160
  }
1136
1161
 
1162
+ // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1163
+ // Safari 4 - 5 only, Opera <=11.6 - 12.x only
1164
+ // IE/Edge & older browsers don't support the :scope pseudo-class.
1165
+ // Support: Safari 6.0 only
1166
+ // Safari 6.0 supports :scope but it's an alias of :root there.
1167
+ support.scope = assert( function( el ) {
1168
+ docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1169
+ return typeof el.querySelectorAll !== "undefined" &&
1170
+ !el.querySelectorAll( ":scope fieldset div" ).length;
1171
+ } );
1172
+
1137
1173
  /* Attributes
1138
1174
  ---------------------------------------------------------------------- */
1139
1175
 
1140
1176
  // Support: IE<8
1141
1177
  // Verify that getAttribute really returns attributes and not properties
1142
1178
  // (excepting IE8 booleans)
1143
- support.attributes = assert(function( el ) {
1179
+ support.attributes = assert( function( el ) {
1144
1180
  el.className = "i";
1145
- return !el.getAttribute("className");
1146
- });
1181
+ return !el.getAttribute( "className" );
1182
+ } );
1147
1183
 
1148
1184
  /* getElement(s)By*
1149
1185
  ---------------------------------------------------------------------- */
1150
1186
 
1151
1187
  // Check if getElementsByTagName("*") returns only elements
1152
- support.getElementsByTagName = assert(function( el ) {
1153
- el.appendChild( document.createComment("") );
1154
- return !el.getElementsByTagName("*").length;
1155
- });
1188
+ support.getElementsByTagName = assert( function( el ) {
1189
+ el.appendChild( document.createComment( "" ) );
1190
+ return !el.getElementsByTagName( "*" ).length;
1191
+ } );
1156
1192
 
1157
1193
  // Support: IE<9
1158
1194
  support.getElementsByClassName = rnative.test( document.getElementsByClassName );
@@ -1161,38 +1197,38 @@ setDocument = Sizzle.setDocument = function( node ) {
1161
1197
  // Check if getElementById returns elements by name
1162
1198
  // The broken getElementById methods don't pick up programmatically-set names,
1163
1199
  // so use a roundabout getElementsByName test
1164
- support.getById = assert(function( el ) {
1200
+ support.getById = assert( function( el ) {
1165
1201
  docElem.appendChild( el ).id = expando;
1166
1202
  return !document.getElementsByName || !document.getElementsByName( expando ).length;
1167
- });
1203
+ } );
1168
1204
 
1169
1205
  // ID filter and find
1170
1206
  if ( support.getById ) {
1171
- Expr.filter["ID"] = function( id ) {
1207
+ Expr.filter[ "ID" ] = function( id ) {
1172
1208
  var attrId = id.replace( runescape, funescape );
1173
1209
  return function( elem ) {
1174
- return elem.getAttribute("id") === attrId;
1210
+ return elem.getAttribute( "id" ) === attrId;
1175
1211
  };
1176
1212
  };
1177
- Expr.find["ID"] = function( id, context ) {
1213
+ Expr.find[ "ID" ] = function( id, context ) {
1178
1214
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1179
1215
  var elem = context.getElementById( id );
1180
1216
  return elem ? [ elem ] : [];
1181
1217
  }
1182
1218
  };
1183
1219
  } else {
1184
- Expr.filter["ID"] = function( id ) {
1220
+ Expr.filter[ "ID" ] = function( id ) {
1185
1221
  var attrId = id.replace( runescape, funescape );
1186
1222
  return function( elem ) {
1187
1223
  var node = typeof elem.getAttributeNode !== "undefined" &&
1188
- elem.getAttributeNode("id");
1224
+ elem.getAttributeNode( "id" );
1189
1225
  return node && node.value === attrId;
1190
1226
  };
1191
1227
  };
1192
1228
 
1193
1229
  // Support: IE 6 - 7 only
1194
1230
  // getElementById is not reliable as a find shortcut
1195
- Expr.find["ID"] = function( id, context ) {
1231
+ Expr.find[ "ID" ] = function( id, context ) {
1196
1232
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1197
1233
  var node, i, elems,
1198
1234
  elem = context.getElementById( id );
@@ -1200,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1200
1236
  if ( elem ) {
1201
1237
 
1202
1238
  // Verify the id attribute
1203
- node = elem.getAttributeNode("id");
1239
+ node = elem.getAttributeNode( "id" );
1204
1240
  if ( node && node.value === id ) {
1205
1241
  return [ elem ];
1206
1242
  }
@@ -1208,8 +1244,8 @@ setDocument = Sizzle.setDocument = function( node ) {
1208
1244
  // Fall back on getElementsByName
1209
1245
  elems = context.getElementsByName( id );
1210
1246
  i = 0;
1211
- while ( (elem = elems[i++]) ) {
1212
- node = elem.getAttributeNode("id");
1247
+ while ( ( elem = elems[ i++ ] ) ) {
1248
+ node = elem.getAttributeNode( "id" );
1213
1249
  if ( node && node.value === id ) {
1214
1250
  return [ elem ];
1215
1251
  }
@@ -1222,7 +1258,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1222
1258
  }
1223
1259
 
1224
1260
  // Tag
1225
- Expr.find["TAG"] = support.getElementsByTagName ?
1261
+ Expr.find[ "TAG" ] = support.getElementsByTagName ?
1226
1262
  function( tag, context ) {
1227
1263
  if ( typeof context.getElementsByTagName !== "undefined" ) {
1228
1264
  return context.getElementsByTagName( tag );
@@ -1237,12 +1273,13 @@ setDocument = Sizzle.setDocument = function( node ) {
1237
1273
  var elem,
1238
1274
  tmp = [],
1239
1275
  i = 0,
1276
+
1240
1277
  // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1241
1278
  results = context.getElementsByTagName( tag );
1242
1279
 
1243
1280
  // Filter out possible comments
1244
1281
  if ( tag === "*" ) {
1245
- while ( (elem = results[i++]) ) {
1282
+ while ( ( elem = results[ i++ ] ) ) {
1246
1283
  if ( elem.nodeType === 1 ) {
1247
1284
  tmp.push( elem );
1248
1285
  }
@@ -1254,7 +1291,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1254
1291
  };
1255
1292
 
1256
1293
  // Class
1257
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1294
+ Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
1258
1295
  if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1259
1296
  return context.getElementsByClassName( className );
1260
1297
  }
@@ -1275,10 +1312,14 @@ setDocument = Sizzle.setDocument = function( node ) {
1275
1312
  // See https://bugs.jquery.com/ticket/13378
1276
1313
  rbuggyQSA = [];
1277
1314
 
1278
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1315
+ if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1316
+
1279
1317
  // Build QSA regex
1280
1318
  // Regex strategy adopted from Diego Perini
1281
- assert(function( el ) {
1319
+ assert( function( el ) {
1320
+
1321
+ var input;
1322
+
1282
1323
  // Select is set to empty string on purpose
1283
1324
  // This is to test IE's treatment of not explicitly
1284
1325
  // setting a boolean content attribute,
@@ -1292,78 +1333,98 @@ setDocument = Sizzle.setDocument = function( node ) {
1292
1333
  // Nothing should be selected when empty strings follow ^= or $= or *=
1293
1334
  // The test attribute must be unknown in Opera but "safe" for WinRT
1294
1335
  // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1295
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1336
+ if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
1296
1337
  rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1297
1338
  }
1298
1339
 
1299
1340
  // Support: IE8
1300
1341
  // Boolean attributes and "value" are not treated correctly
1301
- if ( !el.querySelectorAll("[selected]").length ) {
1342
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
1302
1343
  rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1303
1344
  }
1304
1345
 
1305
1346
  // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1306
1347
  if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1307
- rbuggyQSA.push("~=");
1348
+ rbuggyQSA.push( "~=" );
1349
+ }
1350
+
1351
+ // Support: IE 11+, Edge 15 - 18+
1352
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1353
+ // Adding a temporary attribute to the document before the selection works
1354
+ // around the issue.
1355
+ // Interestingly, IE 10 & older don't seem to have the issue.
1356
+ input = document.createElement( "input" );
1357
+ input.setAttribute( "name", "" );
1358
+ el.appendChild( input );
1359
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
1360
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1361
+ whitespace + "*(?:''|\"\")" );
1308
1362
  }
1309
1363
 
1310
1364
  // Webkit/Opera - :checked should return selected option elements
1311
1365
  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1312
1366
  // IE8 throws error here and will not see later tests
1313
- if ( !el.querySelectorAll(":checked").length ) {
1314
- rbuggyQSA.push(":checked");
1367
+ if ( !el.querySelectorAll( ":checked" ).length ) {
1368
+ rbuggyQSA.push( ":checked" );
1315
1369
  }
1316
1370
 
1317
1371
  // Support: Safari 8+, iOS 8+
1318
1372
  // https://bugs.webkit.org/show_bug.cgi?id=136851
1319
1373
  // In-page `selector#id sibling-combinator selector` fails
1320
1374
  if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1321
- rbuggyQSA.push(".#.+[+~]");
1375
+ rbuggyQSA.push( ".#.+[+~]" );
1322
1376
  }
1323
- });
1324
1377
 
1325
- assert(function( el ) {
1378
+ // Support: Firefox <=3.6 - 5 only
1379
+ // Old Firefox doesn't throw on a badly-escaped identifier.
1380
+ el.querySelectorAll( "\\\f" );
1381
+ rbuggyQSA.push( "[\\r\\n\\f]" );
1382
+ } );
1383
+
1384
+ assert( function( el ) {
1326
1385
  el.innerHTML = "<a href='' disabled='disabled'></a>" +
1327
1386
  "<select disabled='disabled'><option/></select>";
1328
1387
 
1329
1388
  // Support: Windows 8 Native Apps
1330
1389
  // The type and name attributes are restricted during .innerHTML assignment
1331
- var input = document.createElement("input");
1390
+ var input = document.createElement( "input" );
1332
1391
  input.setAttribute( "type", "hidden" );
1333
1392
  el.appendChild( input ).setAttribute( "name", "D" );
1334
1393
 
1335
1394
  // Support: IE8
1336
1395
  // Enforce case-sensitivity of name attribute
1337
- if ( el.querySelectorAll("[name=d]").length ) {
1396
+ if ( el.querySelectorAll( "[name=d]" ).length ) {
1338
1397
  rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1339
1398
  }
1340
1399
 
1341
1400
  // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1342
1401
  // IE8 throws error here and will not see later tests
1343
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
1402
+ if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1344
1403
  rbuggyQSA.push( ":enabled", ":disabled" );
1345
1404
  }
1346
1405
 
1347
1406
  // Support: IE9-11+
1348
1407
  // IE's :disabled selector does not pick up the children of disabled fieldsets
1349
1408
  docElem.appendChild( el ).disabled = true;
1350
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
1409
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1351
1410
  rbuggyQSA.push( ":enabled", ":disabled" );
1352
1411
  }
1353
1412
 
1413
+ // Support: Opera 10 - 11 only
1354
1414
  // Opera 10-11 does not throw on post-comma invalid pseudos
1355
- el.querySelectorAll("*,:x");
1356
- rbuggyQSA.push(",.*:");
1357
- });
1415
+ el.querySelectorAll( "*,:x" );
1416
+ rbuggyQSA.push( ",.*:" );
1417
+ } );
1358
1418
  }
1359
1419
 
1360
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1420
+ if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1361
1421
  docElem.webkitMatchesSelector ||
1362
1422
  docElem.mozMatchesSelector ||
1363
1423
  docElem.oMatchesSelector ||
1364
- docElem.msMatchesSelector) )) ) {
1424
+ docElem.msMatchesSelector ) ) ) ) {
1425
+
1426
+ assert( function( el ) {
1365
1427
 
1366
- assert(function( el ) {
1367
1428
  // Check to see if it's possible to do matchesSelector
1368
1429
  // on a disconnected node (IE 9)
1369
1430
  support.disconnectedMatch = matches.call( el, "*" );
@@ -1372,11 +1433,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1372
1433
  // Gecko does not error, returns false instead
1373
1434
  matches.call( el, "[s!='']:x" );
1374
1435
  rbuggyMatches.push( "!=", pseudos );
1375
- });
1436
+ } );
1376
1437
  }
1377
1438
 
1378
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1379
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1439
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1440
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
1380
1441
 
1381
1442
  /* Contains
1382
1443
  ---------------------------------------------------------------------- */
@@ -1393,11 +1454,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1393
1454
  adown.contains ?
1394
1455
  adown.contains( bup ) :
1395
1456
  a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1396
- ));
1457
+ ) );
1397
1458
  } :
1398
1459
  function( a, b ) {
1399
1460
  if ( b ) {
1400
- while ( (b = b.parentNode) ) {
1461
+ while ( ( b = b.parentNode ) ) {
1401
1462
  if ( b === a ) {
1402
1463
  return true;
1403
1464
  }
@@ -1426,7 +1487,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1426
1487
  }
1427
1488
 
1428
1489
  // Calculate position if both inputs belong to the same document
1429
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1490
+ // Support: IE 11+, Edge 17 - 18+
1491
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1492
+ // two documents; shallow comparisons work.
1493
+ // eslint-disable-next-line eqeqeq
1494
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1430
1495
  a.compareDocumentPosition( b ) :
1431
1496
 
1432
1497
  // Otherwise we know they are disconnected
@@ -1434,13 +1499,24 @@ setDocument = Sizzle.setDocument = function( node ) {
1434
1499
 
1435
1500
  // Disconnected nodes
1436
1501
  if ( compare & 1 ||
1437
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1502
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1438
1503
 
1439
1504
  // Choose the first element that is related to our preferred document
1440
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1505
+ // Support: IE 11+, Edge 17 - 18+
1506
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1507
+ // two documents; shallow comparisons work.
1508
+ // eslint-disable-next-line eqeqeq
1509
+ if ( a == document || a.ownerDocument == preferredDoc &&
1510
+ contains( preferredDoc, a ) ) {
1441
1511
  return -1;
1442
1512
  }
1443
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1513
+
1514
+ // Support: IE 11+, Edge 17 - 18+
1515
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1516
+ // two documents; shallow comparisons work.
1517
+ // eslint-disable-next-line eqeqeq
1518
+ if ( b == document || b.ownerDocument == preferredDoc &&
1519
+ contains( preferredDoc, b ) ) {
1444
1520
  return 1;
1445
1521
  }
1446
1522
 
@@ -1453,6 +1529,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1453
1529
  return compare & 4 ? -1 : 1;
1454
1530
  } :
1455
1531
  function( a, b ) {
1532
+
1456
1533
  // Exit early if the nodes are identical
1457
1534
  if ( a === b ) {
1458
1535
  hasDuplicate = true;
@@ -1468,8 +1545,14 @@ setDocument = Sizzle.setDocument = function( node ) {
1468
1545
 
1469
1546
  // Parentless nodes are either documents or disconnected
1470
1547
  if ( !aup || !bup ) {
1471
- return a === document ? -1 :
1472
- b === document ? 1 :
1548
+
1549
+ // Support: IE 11+, Edge 17 - 18+
1550
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1551
+ // two documents; shallow comparisons work.
1552
+ /* eslint-disable eqeqeq */
1553
+ return a == document ? -1 :
1554
+ b == document ? 1 :
1555
+ /* eslint-enable eqeqeq */
1473
1556
  aup ? -1 :
1474
1557
  bup ? 1 :
1475
1558
  sortInput ?
@@ -1483,26 +1566,32 @@ setDocument = Sizzle.setDocument = function( node ) {
1483
1566
 
1484
1567
  // Otherwise we need full lists of their ancestors for comparison
1485
1568
  cur = a;
1486
- while ( (cur = cur.parentNode) ) {
1569
+ while ( ( cur = cur.parentNode ) ) {
1487
1570
  ap.unshift( cur );
1488
1571
  }
1489
1572
  cur = b;
1490
- while ( (cur = cur.parentNode) ) {
1573
+ while ( ( cur = cur.parentNode ) ) {
1491
1574
  bp.unshift( cur );
1492
1575
  }
1493
1576
 
1494
1577
  // Walk down the tree looking for a discrepancy
1495
- while ( ap[i] === bp[i] ) {
1578
+ while ( ap[ i ] === bp[ i ] ) {
1496
1579
  i++;
1497
1580
  }
1498
1581
 
1499
1582
  return i ?
1583
+
1500
1584
  // Do a sibling check if the nodes have a common ancestor
1501
- siblingCheck( ap[i], bp[i] ) :
1585
+ siblingCheck( ap[ i ], bp[ i ] ) :
1502
1586
 
1503
1587
  // Otherwise nodes in our document sort first
1504
- ap[i] === preferredDoc ? -1 :
1505
- bp[i] === preferredDoc ? 1 :
1588
+ // Support: IE 11+, Edge 17 - 18+
1589
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1590
+ // two documents; shallow comparisons work.
1591
+ /* eslint-disable eqeqeq */
1592
+ ap[ i ] == preferredDoc ? -1 :
1593
+ bp[ i ] == preferredDoc ? 1 :
1594
+ /* eslint-enable eqeqeq */
1506
1595
  0;
1507
1596
  };
1508
1597
 
@@ -1514,16 +1603,10 @@ Sizzle.matches = function( expr, elements ) {
1514
1603
  };
1515
1604
 
1516
1605
  Sizzle.matchesSelector = function( elem, expr ) {
1517
- // Set document vars if needed
1518
- if ( ( elem.ownerDocument || elem ) !== document ) {
1519
- setDocument( elem );
1520
- }
1521
-
1522
- // Make sure that attribute selectors are quoted
1523
- expr = expr.replace( rattributeQuotes, "='$1']" );
1606
+ setDocument( elem );
1524
1607
 
1525
1608
  if ( support.matchesSelector && documentIsHTML &&
1526
- !compilerCache[ expr + " " ] &&
1609
+ !nonnativeSelectorCache[ expr + " " ] &&
1527
1610
  ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1528
1611
  ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1529
1612
 
@@ -1532,32 +1615,46 @@ Sizzle.matchesSelector = function( elem, expr ) {
1532
1615
 
1533
1616
  // IE 9's matchesSelector returns false on disconnected nodes
1534
1617
  if ( ret || support.disconnectedMatch ||
1535
- // As well, disconnected nodes are said to be in a document
1536
- // fragment in IE 9
1537
- elem.document && elem.document.nodeType !== 11 ) {
1618
+
1619
+ // As well, disconnected nodes are said to be in a document
1620
+ // fragment in IE 9
1621
+ elem.document && elem.document.nodeType !== 11 ) {
1538
1622
  return ret;
1539
1623
  }
1540
- } catch (e) {}
1624
+ } catch ( e ) {
1625
+ nonnativeSelectorCache( expr, true );
1626
+ }
1541
1627
  }
1542
1628
 
1543
1629
  return Sizzle( expr, document, null, [ elem ] ).length > 0;
1544
1630
  };
1545
1631
 
1546
1632
  Sizzle.contains = function( context, elem ) {
1633
+
1547
1634
  // Set document vars if needed
1548
- if ( ( context.ownerDocument || context ) !== document ) {
1635
+ // Support: IE 11+, Edge 17 - 18+
1636
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1637
+ // two documents; shallow comparisons work.
1638
+ // eslint-disable-next-line eqeqeq
1639
+ if ( ( context.ownerDocument || context ) != document ) {
1549
1640
  setDocument( context );
1550
1641
  }
1551
1642
  return contains( context, elem );
1552
1643
  };
1553
1644
 
1554
1645
  Sizzle.attr = function( elem, name ) {
1646
+
1555
1647
  // Set document vars if needed
1556
- if ( ( elem.ownerDocument || elem ) !== document ) {
1648
+ // Support: IE 11+, Edge 17 - 18+
1649
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1650
+ // two documents; shallow comparisons work.
1651
+ // eslint-disable-next-line eqeqeq
1652
+ if ( ( elem.ownerDocument || elem ) != document ) {
1557
1653
  setDocument( elem );
1558
1654
  }
1559
1655
 
1560
1656
  var fn = Expr.attrHandle[ name.toLowerCase() ],
1657
+
1561
1658
  // Don't get fooled by Object.prototype properties (jQuery #13807)
1562
1659
  val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1563
1660
  fn( elem, name, !documentIsHTML ) :
@@ -1567,13 +1664,13 @@ Sizzle.attr = function( elem, name ) {
1567
1664
  val :
1568
1665
  support.attributes || !documentIsHTML ?
1569
1666
  elem.getAttribute( name ) :
1570
- (val = elem.getAttributeNode(name)) && val.specified ?
1667
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
1571
1668
  val.value :
1572
1669
  null;
1573
1670
  };
1574
1671
 
1575
1672
  Sizzle.escape = function( sel ) {
1576
- return (sel + "").replace( rcssescape, fcssescape );
1673
+ return ( sel + "" ).replace( rcssescape, fcssescape );
1577
1674
  };
1578
1675
 
1579
1676
  Sizzle.error = function( msg ) {
@@ -1596,7 +1693,7 @@ Sizzle.uniqueSort = function( results ) {
1596
1693
  results.sort( sortOrder );
1597
1694
 
1598
1695
  if ( hasDuplicate ) {
1599
- while ( (elem = results[i++]) ) {
1696
+ while ( ( elem = results[ i++ ] ) ) {
1600
1697
  if ( elem === results[ i ] ) {
1601
1698
  j = duplicates.push( i );
1602
1699
  }
@@ -1624,17 +1721,21 @@ getText = Sizzle.getText = function( elem ) {
1624
1721
  nodeType = elem.nodeType;
1625
1722
 
1626
1723
  if ( !nodeType ) {
1724
+
1627
1725
  // If no nodeType, this is expected to be an array
1628
- while ( (node = elem[i++]) ) {
1726
+ while ( ( node = elem[ i++ ] ) ) {
1727
+
1629
1728
  // Do not traverse comment nodes
1630
1729
  ret += getText( node );
1631
1730
  }
1632
1731
  } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1732
+
1633
1733
  // Use textContent for elements
1634
1734
  // innerText usage removed for consistency of new lines (jQuery #11153)
1635
1735
  if ( typeof elem.textContent === "string" ) {
1636
1736
  return elem.textContent;
1637
1737
  } else {
1738
+
1638
1739
  // Traverse its children
1639
1740
  for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1640
1741
  ret += getText( elem );
@@ -1643,6 +1744,7 @@ getText = Sizzle.getText = function( elem ) {
1643
1744
  } else if ( nodeType === 3 || nodeType === 4 ) {
1644
1745
  return elem.nodeValue;
1645
1746
  }
1747
+
1646
1748
  // Do not include comment or processing instruction nodes
1647
1749
 
1648
1750
  return ret;
@@ -1670,19 +1772,21 @@ Expr = Sizzle.selectors = {
1670
1772
 
1671
1773
  preFilter: {
1672
1774
  "ATTR": function( match ) {
1673
- match[1] = match[1].replace( runescape, funescape );
1775
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1674
1776
 
1675
1777
  // Move the given value to match[3] whether quoted or unquoted
1676
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1778
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1779
+ match[ 5 ] || "" ).replace( runescape, funescape );
1677
1780
 
1678
- if ( match[2] === "~=" ) {
1679
- match[3] = " " + match[3] + " ";
1781
+ if ( match[ 2 ] === "~=" ) {
1782
+ match[ 3 ] = " " + match[ 3 ] + " ";
1680
1783
  }
1681
1784
 
1682
1785
  return match.slice( 0, 4 );
1683
1786
  },
1684
1787
 
1685
1788
  "CHILD": function( match ) {
1789
+
1686
1790
  /* matches from matchExpr["CHILD"]
1687
1791
  1 type (only|nth|...)
1688
1792
  2 what (child|of-type)
@@ -1693,22 +1797,25 @@ Expr = Sizzle.selectors = {
1693
1797
  7 sign of y-component
1694
1798
  8 y of y-component
1695
1799
  */
1696
- match[1] = match[1].toLowerCase();
1800
+ match[ 1 ] = match[ 1 ].toLowerCase();
1801
+
1802
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1697
1803
 
1698
- if ( match[1].slice( 0, 3 ) === "nth" ) {
1699
1804
  // nth-* requires argument
1700
- if ( !match[3] ) {
1701
- Sizzle.error( match[0] );
1805
+ if ( !match[ 3 ] ) {
1806
+ Sizzle.error( match[ 0 ] );
1702
1807
  }
1703
1808
 
1704
1809
  // numeric x and y parameters for Expr.filter.CHILD
1705
1810
  // remember that false/true cast respectively to 0/1
1706
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1707
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1811
+ match[ 4 ] = +( match[ 4 ] ?
1812
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
1813
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1814
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1708
1815
 
1709
- // other types prohibit arguments
1710
- } else if ( match[3] ) {
1711
- Sizzle.error( match[0] );
1816
+ // other types prohibit arguments
1817
+ } else if ( match[ 3 ] ) {
1818
+ Sizzle.error( match[ 0 ] );
1712
1819
  }
1713
1820
 
1714
1821
  return match;
@@ -1716,26 +1823,28 @@ Expr = Sizzle.selectors = {
1716
1823
 
1717
1824
  "PSEUDO": function( match ) {
1718
1825
  var excess,
1719
- unquoted = !match[6] && match[2];
1826
+ unquoted = !match[ 6 ] && match[ 2 ];
1720
1827
 
1721
- if ( matchExpr["CHILD"].test( match[0] ) ) {
1828
+ if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
1722
1829
  return null;
1723
1830
  }
1724
1831
 
1725
1832
  // Accept quoted arguments as-is
1726
- if ( match[3] ) {
1727
- match[2] = match[4] || match[5] || "";
1833
+ if ( match[ 3 ] ) {
1834
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1728
1835
 
1729
1836
  // Strip excess characters from unquoted arguments
1730
1837
  } else if ( unquoted && rpseudo.test( unquoted ) &&
1838
+
1731
1839
  // Get excess from tokenize (recursively)
1732
- (excess = tokenize( unquoted, true )) &&
1840
+ ( excess = tokenize( unquoted, true ) ) &&
1841
+
1733
1842
  // advance to the next closing parenthesis
1734
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1843
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1735
1844
 
1736
1845
  // excess is a negative index
1737
- match[0] = match[0].slice( 0, excess );
1738
- match[2] = unquoted.slice( 0, excess );
1846
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
1847
+ match[ 2 ] = unquoted.slice( 0, excess );
1739
1848
  }
1740
1849
 
1741
1850
  // Return only captures needed by the pseudo filter method (type and argument)
@@ -1748,7 +1857,9 @@ Expr = Sizzle.selectors = {
1748
1857
  "TAG": function( nodeNameSelector ) {
1749
1858
  var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1750
1859
  return nodeNameSelector === "*" ?
1751
- function() { return true; } :
1860
+ function() {
1861
+ return true;
1862
+ } :
1752
1863
  function( elem ) {
1753
1864
  return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1754
1865
  };
@@ -1758,10 +1869,16 @@ Expr = Sizzle.selectors = {
1758
1869
  var pattern = classCache[ className + " " ];
1759
1870
 
1760
1871
  return pattern ||
1761
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1762
- classCache( className, function( elem ) {
1763
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1764
- });
1872
+ ( pattern = new RegExp( "(^|" + whitespace +
1873
+ ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1874
+ className, function( elem ) {
1875
+ return pattern.test(
1876
+ typeof elem.className === "string" && elem.className ||
1877
+ typeof elem.getAttribute !== "undefined" &&
1878
+ elem.getAttribute( "class" ) ||
1879
+ ""
1880
+ );
1881
+ } );
1765
1882
  },
1766
1883
 
1767
1884
  "ATTR": function( name, operator, check ) {
@@ -1777,6 +1894,8 @@ Expr = Sizzle.selectors = {
1777
1894
 
1778
1895
  result += "";
1779
1896
 
1897
+ /* eslint-disable max-len */
1898
+
1780
1899
  return operator === "=" ? result === check :
1781
1900
  operator === "!=" ? result !== check :
1782
1901
  operator === "^=" ? check && result.indexOf( check ) === 0 :
@@ -1785,10 +1904,12 @@ Expr = Sizzle.selectors = {
1785
1904
  operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1786
1905
  operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1787
1906
  false;
1907
+ /* eslint-enable max-len */
1908
+
1788
1909
  };
1789
1910
  },
1790
1911
 
1791
- "CHILD": function( type, what, argument, first, last ) {
1912
+ "CHILD": function( type, what, _argument, first, last ) {
1792
1913
  var simple = type.slice( 0, 3 ) !== "nth",
1793
1914
  forward = type.slice( -4 ) !== "last",
1794
1915
  ofType = what === "of-type";
@@ -1800,7 +1921,7 @@ Expr = Sizzle.selectors = {
1800
1921
  return !!elem.parentNode;
1801
1922
  } :
1802
1923
 
1803
- function( elem, context, xml ) {
1924
+ function( elem, _context, xml ) {
1804
1925
  var cache, uniqueCache, outerCache, node, nodeIndex, start,
1805
1926
  dir = simple !== forward ? "nextSibling" : "previousSibling",
1806
1927
  parent = elem.parentNode,
@@ -1814,7 +1935,7 @@ Expr = Sizzle.selectors = {
1814
1935
  if ( simple ) {
1815
1936
  while ( dir ) {
1816
1937
  node = elem;
1817
- while ( (node = node[ dir ]) ) {
1938
+ while ( ( node = node[ dir ] ) ) {
1818
1939
  if ( ofType ?
1819
1940
  node.nodeName.toLowerCase() === name :
1820
1941
  node.nodeType === 1 ) {
@@ -1822,6 +1943,7 @@ Expr = Sizzle.selectors = {
1822
1943
  return false;
1823
1944
  }
1824
1945
  }
1946
+
1825
1947
  // Reverse direction for :only-* (if we haven't yet done so)
1826
1948
  start = dir = type === "only" && !start && "nextSibling";
1827
1949
  }
@@ -1837,22 +1959,22 @@ Expr = Sizzle.selectors = {
1837
1959
 
1838
1960
  // ...in a gzip-friendly way
1839
1961
  node = parent;
1840
- outerCache = node[ expando ] || (node[ expando ] = {});
1962
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
1841
1963
 
1842
1964
  // Support: IE <9 only
1843
1965
  // Defend against cloned attroperties (jQuery gh-1709)
1844
1966
  uniqueCache = outerCache[ node.uniqueID ] ||
1845
- (outerCache[ node.uniqueID ] = {});
1967
+ ( outerCache[ node.uniqueID ] = {} );
1846
1968
 
1847
1969
  cache = uniqueCache[ type ] || [];
1848
1970
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1849
1971
  diff = nodeIndex && cache[ 2 ];
1850
1972
  node = nodeIndex && parent.childNodes[ nodeIndex ];
1851
1973
 
1852
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1974
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
1853
1975
 
1854
1976
  // Fallback to seeking `elem` from the start
1855
- (diff = nodeIndex = 0) || start.pop()) ) {
1977
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1856
1978
 
1857
1979
  // When found, cache indexes on `parent` and break
1858
1980
  if ( node.nodeType === 1 && ++diff && node === elem ) {
@@ -1862,16 +1984,18 @@ Expr = Sizzle.selectors = {
1862
1984
  }
1863
1985
 
1864
1986
  } else {
1987
+
1865
1988
  // Use previously-cached element index if available
1866
1989
  if ( useCache ) {
1990
+
1867
1991
  // ...in a gzip-friendly way
1868
1992
  node = elem;
1869
- outerCache = node[ expando ] || (node[ expando ] = {});
1993
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
1870
1994
 
1871
1995
  // Support: IE <9 only
1872
1996
  // Defend against cloned attroperties (jQuery gh-1709)
1873
1997
  uniqueCache = outerCache[ node.uniqueID ] ||
1874
- (outerCache[ node.uniqueID ] = {});
1998
+ ( outerCache[ node.uniqueID ] = {} );
1875
1999
 
1876
2000
  cache = uniqueCache[ type ] || [];
1877
2001
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
@@ -1881,9 +2005,10 @@ Expr = Sizzle.selectors = {
1881
2005
  // xml :nth-child(...)
1882
2006
  // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1883
2007
  if ( diff === false ) {
2008
+
1884
2009
  // Use the same loop as above to seek `elem` from the start
1885
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1886
- (diff = nodeIndex = 0) || start.pop()) ) {
2010
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
2011
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1887
2012
 
1888
2013
  if ( ( ofType ?
1889
2014
  node.nodeName.toLowerCase() === name :
@@ -1892,12 +2017,13 @@ Expr = Sizzle.selectors = {
1892
2017
 
1893
2018
  // Cache the index of each encountered element
1894
2019
  if ( useCache ) {
1895
- outerCache = node[ expando ] || (node[ expando ] = {});
2020
+ outerCache = node[ expando ] ||
2021
+ ( node[ expando ] = {} );
1896
2022
 
1897
2023
  // Support: IE <9 only
1898
2024
  // Defend against cloned attroperties (jQuery gh-1709)
1899
2025
  uniqueCache = outerCache[ node.uniqueID ] ||
1900
- (outerCache[ node.uniqueID ] = {});
2026
+ ( outerCache[ node.uniqueID ] = {} );
1901
2027
 
1902
2028
  uniqueCache[ type ] = [ dirruns, diff ];
1903
2029
  }
@@ -1918,6 +2044,7 @@ Expr = Sizzle.selectors = {
1918
2044
  },
1919
2045
 
1920
2046
  "PSEUDO": function( pseudo, argument ) {
2047
+
1921
2048
  // pseudo-class names are case-insensitive
1922
2049
  // http://www.w3.org/TR/selectors/#pseudo-classes
1923
2050
  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
@@ -1937,15 +2064,15 @@ Expr = Sizzle.selectors = {
1937
2064
  if ( fn.length > 1 ) {
1938
2065
  args = [ pseudo, pseudo, "", argument ];
1939
2066
  return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1940
- markFunction(function( seed, matches ) {
2067
+ markFunction( function( seed, matches ) {
1941
2068
  var idx,
1942
2069
  matched = fn( seed, argument ),
1943
2070
  i = matched.length;
1944
2071
  while ( i-- ) {
1945
- idx = indexOf( seed, matched[i] );
1946
- seed[ idx ] = !( matches[ idx ] = matched[i] );
2072
+ idx = indexOf( seed, matched[ i ] );
2073
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
1947
2074
  }
1948
- }) :
2075
+ } ) :
1949
2076
  function( elem ) {
1950
2077
  return fn( elem, 0, args );
1951
2078
  };
@@ -1956,8 +2083,10 @@ Expr = Sizzle.selectors = {
1956
2083
  },
1957
2084
 
1958
2085
  pseudos: {
2086
+
1959
2087
  // Potentially complex pseudos
1960
- "not": markFunction(function( selector ) {
2088
+ "not": markFunction( function( selector ) {
2089
+
1961
2090
  // Trim the selector passed to compile
1962
2091
  // to avoid treating leading and trailing
1963
2092
  // spaces as combinators
@@ -1966,39 +2095,40 @@ Expr = Sizzle.selectors = {
1966
2095
  matcher = compile( selector.replace( rtrim, "$1" ) );
1967
2096
 
1968
2097
  return matcher[ expando ] ?
1969
- markFunction(function( seed, matches, context, xml ) {
2098
+ markFunction( function( seed, matches, _context, xml ) {
1970
2099
  var elem,
1971
2100
  unmatched = matcher( seed, null, xml, [] ),
1972
2101
  i = seed.length;
1973
2102
 
1974
2103
  // Match elements unmatched by `matcher`
1975
2104
  while ( i-- ) {
1976
- if ( (elem = unmatched[i]) ) {
1977
- seed[i] = !(matches[i] = elem);
2105
+ if ( ( elem = unmatched[ i ] ) ) {
2106
+ seed[ i ] = !( matches[ i ] = elem );
1978
2107
  }
1979
2108
  }
1980
- }) :
1981
- function( elem, context, xml ) {
1982
- input[0] = elem;
2109
+ } ) :
2110
+ function( elem, _context, xml ) {
2111
+ input[ 0 ] = elem;
1983
2112
  matcher( input, null, xml, results );
2113
+
1984
2114
  // Don't keep the element (issue #299)
1985
- input[0] = null;
2115
+ input[ 0 ] = null;
1986
2116
  return !results.pop();
1987
2117
  };
1988
- }),
2118
+ } ),
1989
2119
 
1990
- "has": markFunction(function( selector ) {
2120
+ "has": markFunction( function( selector ) {
1991
2121
  return function( elem ) {
1992
2122
  return Sizzle( selector, elem ).length > 0;
1993
2123
  };
1994
- }),
2124
+ } ),
1995
2125
 
1996
- "contains": markFunction(function( text ) {
2126
+ "contains": markFunction( function( text ) {
1997
2127
  text = text.replace( runescape, funescape );
1998
2128
  return function( elem ) {
1999
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2129
+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
2000
2130
  };
2001
- }),
2131
+ } ),
2002
2132
 
2003
2133
  // "Whether an element is represented by a :lang() selector
2004
2134
  // is based solely on the element's language value
@@ -2008,25 +2138,26 @@ Expr = Sizzle.selectors = {
2008
2138
  // The identifier C does not have to be a valid language name."
2009
2139
  // http://www.w3.org/TR/selectors/#lang-pseudo
2010
2140
  "lang": markFunction( function( lang ) {
2141
+
2011
2142
  // lang value must be a valid identifier
2012
- if ( !ridentifier.test(lang || "") ) {
2143
+ if ( !ridentifier.test( lang || "" ) ) {
2013
2144
  Sizzle.error( "unsupported lang: " + lang );
2014
2145
  }
2015
2146
  lang = lang.replace( runescape, funescape ).toLowerCase();
2016
2147
  return function( elem ) {
2017
2148
  var elemLang;
2018
2149
  do {
2019
- if ( (elemLang = documentIsHTML ?
2150
+ if ( ( elemLang = documentIsHTML ?
2020
2151
  elem.lang :
2021
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2152
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2022
2153
 
2023
2154
  elemLang = elemLang.toLowerCase();
2024
2155
  return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2025
2156
  }
2026
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2157
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2027
2158
  return false;
2028
2159
  };
2029
- }),
2160
+ } ),
2030
2161
 
2031
2162
  // Miscellaneous
2032
2163
  "target": function( elem ) {
@@ -2039,7 +2170,9 @@ Expr = Sizzle.selectors = {
2039
2170
  },
2040
2171
 
2041
2172
  "focus": function( elem ) {
2042
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2173
+ return elem === document.activeElement &&
2174
+ ( !document.hasFocus || document.hasFocus() ) &&
2175
+ !!( elem.type || elem.href || ~elem.tabIndex );
2043
2176
  },
2044
2177
 
2045
2178
  // Boolean properties
@@ -2047,16 +2180,20 @@ Expr = Sizzle.selectors = {
2047
2180
  "disabled": createDisabledPseudo( true ),
2048
2181
 
2049
2182
  "checked": function( elem ) {
2183
+
2050
2184
  // In CSS3, :checked should return both checked and selected elements
2051
2185
  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2052
2186
  var nodeName = elem.nodeName.toLowerCase();
2053
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2187
+ return ( nodeName === "input" && !!elem.checked ) ||
2188
+ ( nodeName === "option" && !!elem.selected );
2054
2189
  },
2055
2190
 
2056
2191
  "selected": function( elem ) {
2192
+
2057
2193
  // Accessing this property makes selected-by-default
2058
2194
  // options in Safari work properly
2059
2195
  if ( elem.parentNode ) {
2196
+ // eslint-disable-next-line no-unused-expressions
2060
2197
  elem.parentNode.selectedIndex;
2061
2198
  }
2062
2199
 
@@ -2065,6 +2202,7 @@ Expr = Sizzle.selectors = {
2065
2202
 
2066
2203
  // Contents
2067
2204
  "empty": function( elem ) {
2205
+
2068
2206
  // http://www.w3.org/TR/selectors/#empty-pseudo
2069
2207
  // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2070
2208
  // but not by others (comment: 8; processing instruction: 7; etc.)
@@ -2078,7 +2216,7 @@ Expr = Sizzle.selectors = {
2078
2216
  },
2079
2217
 
2080
2218
  "parent": function( elem ) {
2081
- return !Expr.pseudos["empty"]( elem );
2219
+ return !Expr.pseudos[ "empty" ]( elem );
2082
2220
  },
2083
2221
 
2084
2222
  // Element/input types
@@ -2102,57 +2240,62 @@ Expr = Sizzle.selectors = {
2102
2240
 
2103
2241
  // Support: IE<8
2104
2242
  // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2105
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2243
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
2244
+ attr.toLowerCase() === "text" );
2106
2245
  },
2107
2246
 
2108
2247
  // Position-in-collection
2109
- "first": createPositionalPseudo(function() {
2248
+ "first": createPositionalPseudo( function() {
2110
2249
  return [ 0 ];
2111
- }),
2250
+ } ),
2112
2251
 
2113
- "last": createPositionalPseudo(function( matchIndexes, length ) {
2252
+ "last": createPositionalPseudo( function( _matchIndexes, length ) {
2114
2253
  return [ length - 1 ];
2115
- }),
2254
+ } ),
2116
2255
 
2117
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2256
+ "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2118
2257
  return [ argument < 0 ? argument + length : argument ];
2119
- }),
2258
+ } ),
2120
2259
 
2121
- "even": createPositionalPseudo(function( matchIndexes, length ) {
2260
+ "even": createPositionalPseudo( function( matchIndexes, length ) {
2122
2261
  var i = 0;
2123
2262
  for ( ; i < length; i += 2 ) {
2124
2263
  matchIndexes.push( i );
2125
2264
  }
2126
2265
  return matchIndexes;
2127
- }),
2266
+ } ),
2128
2267
 
2129
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
2268
+ "odd": createPositionalPseudo( function( matchIndexes, length ) {
2130
2269
  var i = 1;
2131
2270
  for ( ; i < length; i += 2 ) {
2132
2271
  matchIndexes.push( i );
2133
2272
  }
2134
2273
  return matchIndexes;
2135
- }),
2274
+ } ),
2136
2275
 
2137
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2138
- var i = argument < 0 ? argument + length : argument;
2276
+ "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2277
+ var i = argument < 0 ?
2278
+ argument + length :
2279
+ argument > length ?
2280
+ length :
2281
+ argument;
2139
2282
  for ( ; --i >= 0; ) {
2140
2283
  matchIndexes.push( i );
2141
2284
  }
2142
2285
  return matchIndexes;
2143
- }),
2286
+ } ),
2144
2287
 
2145
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2288
+ "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2146
2289
  var i = argument < 0 ? argument + length : argument;
2147
2290
  for ( ; ++i < length; ) {
2148
2291
  matchIndexes.push( i );
2149
2292
  }
2150
2293
  return matchIndexes;
2151
- })
2294
+ } )
2152
2295
  }
2153
2296
  };
2154
2297
 
2155
- Expr.pseudos["nth"] = Expr.pseudos["eq"];
2298
+ Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
2156
2299
 
2157
2300
  // Add button/input type pseudos
2158
2301
  for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2183,37 +2326,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2183
2326
  while ( soFar ) {
2184
2327
 
2185
2328
  // Comma and first run
2186
- if ( !matched || (match = rcomma.exec( soFar )) ) {
2329
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2187
2330
  if ( match ) {
2331
+
2188
2332
  // Don't consume trailing commas as valid
2189
- soFar = soFar.slice( match[0].length ) || soFar;
2333
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
2190
2334
  }
2191
- groups.push( (tokens = []) );
2335
+ groups.push( ( tokens = [] ) );
2192
2336
  }
2193
2337
 
2194
2338
  matched = false;
2195
2339
 
2196
2340
  // Combinators
2197
- if ( (match = rcombinators.exec( soFar )) ) {
2341
+ if ( ( match = rcombinators.exec( soFar ) ) ) {
2198
2342
  matched = match.shift();
2199
- tokens.push({
2343
+ tokens.push( {
2200
2344
  value: matched,
2345
+
2201
2346
  // Cast descendant combinators to space
2202
- type: match[0].replace( rtrim, " " )
2203
- });
2347
+ type: match[ 0 ].replace( rtrim, " " )
2348
+ } );
2204
2349
  soFar = soFar.slice( matched.length );
2205
2350
  }
2206
2351
 
2207
2352
  // Filters
2208
2353
  for ( type in Expr.filter ) {
2209
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2210
- (match = preFilters[ type ]( match ))) ) {
2354
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2355
+ ( match = preFilters[ type ]( match ) ) ) ) {
2211
2356
  matched = match.shift();
2212
- tokens.push({
2357
+ tokens.push( {
2213
2358
  value: matched,
2214
2359
  type: type,
2215
2360
  matches: match
2216
- });
2361
+ } );
2217
2362
  soFar = soFar.slice( matched.length );
2218
2363
  }
2219
2364
  }
@@ -2230,6 +2375,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2230
2375
  soFar.length :
2231
2376
  soFar ?
2232
2377
  Sizzle.error( selector ) :
2378
+
2233
2379
  // Cache the tokens
2234
2380
  tokenCache( selector, groups ).slice( 0 );
2235
2381
  };
@@ -2239,7 +2385,7 @@ function toSelector( tokens ) {
2239
2385
  len = tokens.length,
2240
2386
  selector = "";
2241
2387
  for ( ; i < len; i++ ) {
2242
- selector += tokens[i].value;
2388
+ selector += tokens[ i ].value;
2243
2389
  }
2244
2390
  return selector;
2245
2391
  }
@@ -2252,9 +2398,10 @@ function addCombinator( matcher, combinator, base ) {
2252
2398
  doneName = done++;
2253
2399
 
2254
2400
  return combinator.first ?
2401
+
2255
2402
  // Check against closest ancestor/preceding element
2256
2403
  function( elem, context, xml ) {
2257
- while ( (elem = elem[ dir ]) ) {
2404
+ while ( ( elem = elem[ dir ] ) ) {
2258
2405
  if ( elem.nodeType === 1 || checkNonElements ) {
2259
2406
  return matcher( elem, context, xml );
2260
2407
  }
@@ -2269,7 +2416,7 @@ function addCombinator( matcher, combinator, base ) {
2269
2416
 
2270
2417
  // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2271
2418
  if ( xml ) {
2272
- while ( (elem = elem[ dir ]) ) {
2419
+ while ( ( elem = elem[ dir ] ) ) {
2273
2420
  if ( elem.nodeType === 1 || checkNonElements ) {
2274
2421
  if ( matcher( elem, context, xml ) ) {
2275
2422
  return true;
@@ -2277,27 +2424,29 @@ function addCombinator( matcher, combinator, base ) {
2277
2424
  }
2278
2425
  }
2279
2426
  } else {
2280
- while ( (elem = elem[ dir ]) ) {
2427
+ while ( ( elem = elem[ dir ] ) ) {
2281
2428
  if ( elem.nodeType === 1 || checkNonElements ) {
2282
- outerCache = elem[ expando ] || (elem[ expando ] = {});
2429
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2283
2430
 
2284
2431
  // Support: IE <9 only
2285
2432
  // Defend against cloned attroperties (jQuery gh-1709)
2286
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2433
+ uniqueCache = outerCache[ elem.uniqueID ] ||
2434
+ ( outerCache[ elem.uniqueID ] = {} );
2287
2435
 
2288
2436
  if ( skip && skip === elem.nodeName.toLowerCase() ) {
2289
2437
  elem = elem[ dir ] || elem;
2290
- } else if ( (oldCache = uniqueCache[ key ]) &&
2438
+ } else if ( ( oldCache = uniqueCache[ key ] ) &&
2291
2439
  oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2292
2440
 
2293
2441
  // Assign to newCache so results back-propagate to previous elements
2294
- return (newCache[ 2 ] = oldCache[ 2 ]);
2442
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
2295
2443
  } else {
2444
+
2296
2445
  // Reuse newcache so results back-propagate to previous elements
2297
2446
  uniqueCache[ key ] = newCache;
2298
2447
 
2299
2448
  // A match means we're done; a fail means we have to keep checking
2300
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2449
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2301
2450
  return true;
2302
2451
  }
2303
2452
  }
@@ -2313,20 +2462,20 @@ function elementMatcher( matchers ) {
2313
2462
  function( elem, context, xml ) {
2314
2463
  var i = matchers.length;
2315
2464
  while ( i-- ) {
2316
- if ( !matchers[i]( elem, context, xml ) ) {
2465
+ if ( !matchers[ i ]( elem, context, xml ) ) {
2317
2466
  return false;
2318
2467
  }
2319
2468
  }
2320
2469
  return true;
2321
2470
  } :
2322
- matchers[0];
2471
+ matchers[ 0 ];
2323
2472
  }
2324
2473
 
2325
2474
  function multipleContexts( selector, contexts, results ) {
2326
2475
  var i = 0,
2327
2476
  len = contexts.length;
2328
2477
  for ( ; i < len; i++ ) {
2329
- Sizzle( selector, contexts[i], results );
2478
+ Sizzle( selector, contexts[ i ], results );
2330
2479
  }
2331
2480
  return results;
2332
2481
  }
@@ -2339,7 +2488,7 @@ function condense( unmatched, map, filter, context, xml ) {
2339
2488
  mapped = map != null;
2340
2489
 
2341
2490
  for ( ; i < len; i++ ) {
2342
- if ( (elem = unmatched[i]) ) {
2491
+ if ( ( elem = unmatched[ i ] ) ) {
2343
2492
  if ( !filter || filter( elem, context, xml ) ) {
2344
2493
  newUnmatched.push( elem );
2345
2494
  if ( mapped ) {
@@ -2359,14 +2508,18 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2359
2508
  if ( postFinder && !postFinder[ expando ] ) {
2360
2509
  postFinder = setMatcher( postFinder, postSelector );
2361
2510
  }
2362
- return markFunction(function( seed, results, context, xml ) {
2511
+ return markFunction( function( seed, results, context, xml ) {
2363
2512
  var temp, i, elem,
2364
2513
  preMap = [],
2365
2514
  postMap = [],
2366
2515
  preexisting = results.length,
2367
2516
 
2368
2517
  // Get initial elements from seed or context
2369
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2518
+ elems = seed || multipleContexts(
2519
+ selector || "*",
2520
+ context.nodeType ? [ context ] : context,
2521
+ []
2522
+ ),
2370
2523
 
2371
2524
  // Prefilter to get matcher input, preserving a map for seed-results synchronization
2372
2525
  matcherIn = preFilter && ( seed || !selector ) ?
@@ -2374,6 +2527,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2374
2527
  elems,
2375
2528
 
2376
2529
  matcherOut = matcher ?
2530
+
2377
2531
  // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2378
2532
  postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2379
2533
 
@@ -2397,8 +2551,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2397
2551
  // Un-match failing elements by moving them back to matcherIn
2398
2552
  i = temp.length;
2399
2553
  while ( i-- ) {
2400
- if ( (elem = temp[i]) ) {
2401
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2554
+ if ( ( elem = temp[ i ] ) ) {
2555
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2402
2556
  }
2403
2557
  }
2404
2558
  }
@@ -2406,25 +2560,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2406
2560
  if ( seed ) {
2407
2561
  if ( postFinder || preFilter ) {
2408
2562
  if ( postFinder ) {
2563
+
2409
2564
  // Get the final matcherOut by condensing this intermediate into postFinder contexts
2410
2565
  temp = [];
2411
2566
  i = matcherOut.length;
2412
2567
  while ( i-- ) {
2413
- if ( (elem = matcherOut[i]) ) {
2568
+ if ( ( elem = matcherOut[ i ] ) ) {
2569
+
2414
2570
  // Restore matcherIn since elem is not yet a final match
2415
- temp.push( (matcherIn[i] = elem) );
2571
+ temp.push( ( matcherIn[ i ] = elem ) );
2416
2572
  }
2417
2573
  }
2418
- postFinder( null, (matcherOut = []), temp, xml );
2574
+ postFinder( null, ( matcherOut = [] ), temp, xml );
2419
2575
  }
2420
2576
 
2421
2577
  // Move matched elements from seed to results to keep them synchronized
2422
2578
  i = matcherOut.length;
2423
2579
  while ( i-- ) {
2424
- if ( (elem = matcherOut[i]) &&
2425
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2580
+ if ( ( elem = matcherOut[ i ] ) &&
2581
+ ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
2426
2582
 
2427
- seed[temp] = !(results[temp] = elem);
2583
+ seed[ temp ] = !( results[ temp ] = elem );
2428
2584
  }
2429
2585
  }
2430
2586
  }
@@ -2442,14 +2598,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2442
2598
  push.apply( results, matcherOut );
2443
2599
  }
2444
2600
  }
2445
- });
2601
+ } );
2446
2602
  }
2447
2603
 
2448
2604
  function matcherFromTokens( tokens ) {
2449
2605
  var checkContext, matcher, j,
2450
2606
  len = tokens.length,
2451
- leadingRelative = Expr.relative[ tokens[0].type ],
2452
- implicitRelative = leadingRelative || Expr.relative[" "],
2607
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2608
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
2453
2609
  i = leadingRelative ? 1 : 0,
2454
2610
 
2455
2611
  // The foundational matcher ensures that elements are reachable from top-level context(s)
@@ -2461,38 +2617,43 @@ function matcherFromTokens( tokens ) {
2461
2617
  }, implicitRelative, true ),
2462
2618
  matchers = [ function( elem, context, xml ) {
2463
2619
  var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2464
- (checkContext = context).nodeType ?
2620
+ ( checkContext = context ).nodeType ?
2465
2621
  matchContext( elem, context, xml ) :
2466
2622
  matchAnyContext( elem, context, xml ) );
2623
+
2467
2624
  // Avoid hanging onto element (issue #299)
2468
2625
  checkContext = null;
2469
2626
  return ret;
2470
2627
  } ];
2471
2628
 
2472
2629
  for ( ; i < len; i++ ) {
2473
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2474
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2630
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2631
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2475
2632
  } else {
2476
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2633
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2477
2634
 
2478
2635
  // Return special upon seeing a positional matcher
2479
2636
  if ( matcher[ expando ] ) {
2637
+
2480
2638
  // Find the next relative operator (if any) for proper handling
2481
2639
  j = ++i;
2482
2640
  for ( ; j < len; j++ ) {
2483
- if ( Expr.relative[ tokens[j].type ] ) {
2641
+ if ( Expr.relative[ tokens[ j ].type ] ) {
2484
2642
  break;
2485
2643
  }
2486
2644
  }
2487
2645
  return setMatcher(
2488
2646
  i > 1 && elementMatcher( matchers ),
2489
2647
  i > 1 && toSelector(
2490
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2491
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2648
+
2649
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2650
+ tokens
2651
+ .slice( 0, i - 1 )
2652
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2492
2653
  ).replace( rtrim, "$1" ),
2493
2654
  matcher,
2494
2655
  i < j && matcherFromTokens( tokens.slice( i, j ) ),
2495
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2656
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2496
2657
  j < len && toSelector( tokens )
2497
2658
  );
2498
2659
  }
@@ -2513,28 +2674,40 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2513
2674
  unmatched = seed && [],
2514
2675
  setMatched = [],
2515
2676
  contextBackup = outermostContext,
2677
+
2516
2678
  // We must always have either seed elements or outermost context
2517
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2679
+ elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2680
+
2518
2681
  // Use integer dirruns iff this is the outermost matcher
2519
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2682
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2520
2683
  len = elems.length;
2521
2684
 
2522
2685
  if ( outermost ) {
2523
- outermostContext = context === document || context || outermost;
2686
+
2687
+ // Support: IE 11+, Edge 17 - 18+
2688
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2689
+ // two documents; shallow comparisons work.
2690
+ // eslint-disable-next-line eqeqeq
2691
+ outermostContext = context == document || context || outermost;
2524
2692
  }
2525
2693
 
2526
2694
  // Add elements passing elementMatchers directly to results
2527
2695
  // Support: IE<9, Safari
2528
2696
  // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2529
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2697
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2530
2698
  if ( byElement && elem ) {
2531
2699
  j = 0;
2532
- if ( !context && elem.ownerDocument !== document ) {
2700
+
2701
+ // Support: IE 11+, Edge 17 - 18+
2702
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2703
+ // two documents; shallow comparisons work.
2704
+ // eslint-disable-next-line eqeqeq
2705
+ if ( !context && elem.ownerDocument != document ) {
2533
2706
  setDocument( elem );
2534
2707
  xml = !documentIsHTML;
2535
2708
  }
2536
- while ( (matcher = elementMatchers[j++]) ) {
2537
- if ( matcher( elem, context || document, xml) ) {
2709
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
2710
+ if ( matcher( elem, context || document, xml ) ) {
2538
2711
  results.push( elem );
2539
2712
  break;
2540
2713
  }
@@ -2546,8 +2719,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2546
2719
 
2547
2720
  // Track unmatched elements for set filters
2548
2721
  if ( bySet ) {
2722
+
2549
2723
  // They will have gone through all possible matchers
2550
- if ( (elem = !matcher && elem) ) {
2724
+ if ( ( elem = !matcher && elem ) ) {
2551
2725
  matchedCount--;
2552
2726
  }
2553
2727
 
@@ -2571,16 +2745,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2571
2745
  // numerically zero.
2572
2746
  if ( bySet && i !== matchedCount ) {
2573
2747
  j = 0;
2574
- while ( (matcher = setMatchers[j++]) ) {
2748
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
2575
2749
  matcher( unmatched, setMatched, context, xml );
2576
2750
  }
2577
2751
 
2578
2752
  if ( seed ) {
2753
+
2579
2754
  // Reintegrate element matches to eliminate the need for sorting
2580
2755
  if ( matchedCount > 0 ) {
2581
2756
  while ( i-- ) {
2582
- if ( !(unmatched[i] || setMatched[i]) ) {
2583
- setMatched[i] = pop.call( results );
2757
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2758
+ setMatched[ i ] = pop.call( results );
2584
2759
  }
2585
2760
  }
2586
2761
  }
@@ -2621,13 +2796,14 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2621
2796
  cached = compilerCache[ selector + " " ];
2622
2797
 
2623
2798
  if ( !cached ) {
2799
+
2624
2800
  // Generate a function of recursive functions that can be used to check each element
2625
2801
  if ( !match ) {
2626
2802
  match = tokenize( selector );
2627
2803
  }
2628
2804
  i = match.length;
2629
2805
  while ( i-- ) {
2630
- cached = matcherFromTokens( match[i] );
2806
+ cached = matcherFromTokens( match[ i ] );
2631
2807
  if ( cached[ expando ] ) {
2632
2808
  setMatchers.push( cached );
2633
2809
  } else {
@@ -2636,7 +2812,10 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2636
2812
  }
2637
2813
 
2638
2814
  // Cache the compiled function
2639
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2815
+ cached = compilerCache(
2816
+ selector,
2817
+ matcherFromGroupMatchers( elementMatchers, setMatchers )
2818
+ );
2640
2819
 
2641
2820
  // Save selector and tokenization
2642
2821
  cached.selector = selector;
@@ -2656,7 +2835,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2656
2835
  select = Sizzle.select = function( selector, context, results, seed ) {
2657
2836
  var i, tokens, token, type, find,
2658
2837
  compiled = typeof selector === "function" && selector,
2659
- match = !seed && tokenize( (selector = compiled.selector || selector) );
2838
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2660
2839
 
2661
2840
  results = results || [];
2662
2841
 
@@ -2665,11 +2844,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2665
2844
  if ( match.length === 1 ) {
2666
2845
 
2667
2846
  // Reduce context if the leading compound selector is an ID
2668
- tokens = match[0] = match[0].slice( 0 );
2669
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2670
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2847
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2848
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2849
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2671
2850
 
2672
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2851
+ context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2852
+ .replace( runescape, funescape ), context ) || [] )[ 0 ];
2673
2853
  if ( !context ) {
2674
2854
  return results;
2675
2855
 
@@ -2682,20 +2862,22 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2682
2862
  }
2683
2863
 
2684
2864
  // Fetch a seed set for right-to-left matching
2685
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2865
+ i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
2686
2866
  while ( i-- ) {
2687
- token = tokens[i];
2867
+ token = tokens[ i ];
2688
2868
 
2689
2869
  // Abort if we hit a combinator
2690
- if ( Expr.relative[ (type = token.type) ] ) {
2870
+ if ( Expr.relative[ ( type = token.type ) ] ) {
2691
2871
  break;
2692
2872
  }
2693
- if ( (find = Expr.find[ type ]) ) {
2873
+ if ( ( find = Expr.find[ type ] ) ) {
2874
+
2694
2875
  // Search, expanding context for leading sibling combinators
2695
- if ( (seed = find(
2696
- token.matches[0].replace( runescape, funescape ),
2697
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2698
- )) ) {
2876
+ if ( ( seed = find(
2877
+ token.matches[ 0 ].replace( runescape, funescape ),
2878
+ rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2879
+ context
2880
+ ) ) ) {
2699
2881
 
2700
2882
  // If seed is empty or no tokens remain, we can return early
2701
2883
  tokens.splice( i, 1 );
@@ -2726,7 +2908,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2726
2908
  // One-time assignments
2727
2909
 
2728
2910
  // Sort stability
2729
- support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2911
+ support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2730
2912
 
2731
2913
  // Support: Chrome 14-35+
2732
2914
  // Always assume duplicates if they aren't passed to the comparison function
@@ -2737,58 +2919,59 @@ setDocument();
2737
2919
 
2738
2920
  // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2739
2921
  // Detached nodes confoundingly follow *each other*
2740
- support.sortDetached = assert(function( el ) {
2922
+ support.sortDetached = assert( function( el ) {
2923
+
2741
2924
  // Should return 1, but returns 4 (following)
2742
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2743
- });
2925
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2926
+ } );
2744
2927
 
2745
2928
  // Support: IE<8
2746
2929
  // Prevent attribute/property "interpolation"
2747
2930
  // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2748
- if ( !assert(function( el ) {
2931
+ if ( !assert( function( el ) {
2749
2932
  el.innerHTML = "<a href='#'></a>";
2750
- return el.firstChild.getAttribute("href") === "#" ;
2751
- }) ) {
2933
+ return el.firstChild.getAttribute( "href" ) === "#";
2934
+ } ) ) {
2752
2935
  addHandle( "type|href|height|width", function( elem, name, isXML ) {
2753
2936
  if ( !isXML ) {
2754
2937
  return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2755
2938
  }
2756
- });
2939
+ } );
2757
2940
  }
2758
2941
 
2759
2942
  // Support: IE<9
2760
2943
  // Use defaultValue in place of getAttribute("value")
2761
- if ( !support.attributes || !assert(function( el ) {
2944
+ if ( !support.attributes || !assert( function( el ) {
2762
2945
  el.innerHTML = "<input/>";
2763
2946
  el.firstChild.setAttribute( "value", "" );
2764
2947
  return el.firstChild.getAttribute( "value" ) === "";
2765
- }) ) {
2766
- addHandle( "value", function( elem, name, isXML ) {
2948
+ } ) ) {
2949
+ addHandle( "value", function( elem, _name, isXML ) {
2767
2950
  if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2768
2951
  return elem.defaultValue;
2769
2952
  }
2770
- });
2953
+ } );
2771
2954
  }
2772
2955
 
2773
2956
  // Support: IE<9
2774
2957
  // Use getAttributeNode to fetch booleans when getAttribute lies
2775
- if ( !assert(function( el ) {
2776
- return el.getAttribute("disabled") == null;
2777
- }) ) {
2958
+ if ( !assert( function( el ) {
2959
+ return el.getAttribute( "disabled" ) == null;
2960
+ } ) ) {
2778
2961
  addHandle( booleans, function( elem, name, isXML ) {
2779
2962
  var val;
2780
2963
  if ( !isXML ) {
2781
2964
  return elem[ name ] === true ? name.toLowerCase() :
2782
- (val = elem.getAttributeNode( name )) && val.specified ?
2965
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
2783
2966
  val.value :
2784
- null;
2967
+ null;
2785
2968
  }
2786
- });
2969
+ } );
2787
2970
  }
2788
2971
 
2789
2972
  return Sizzle;
2790
2973
 
2791
- })( window );
2974
+ } )( window );
2792
2975
 
2793
2976
 
2794
2977
 
@@ -2848,11 +3031,9 @@ var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|
2848
3031
 
2849
3032
 
2850
3033
 
2851
- var risSimple = /^.[^:#\[\.,]*$/;
2852
-
2853
3034
  // Implement the identical functionality for filter and not
2854
3035
  function winnow( elements, qualifier, not ) {
2855
- if ( jQuery.isFunction( qualifier ) ) {
3036
+ if ( isFunction( qualifier ) ) {
2856
3037
  return jQuery.grep( elements, function( elem, i ) {
2857
3038
  return !!qualifier.call( elem, i, elem ) !== not;
2858
3039
  } );
@@ -2872,16 +3053,8 @@ function winnow( elements, qualifier, not ) {
2872
3053
  } );
2873
3054
  }
2874
3055
 
2875
- // Simple selector that can be filtered directly, removing non-Elements
2876
- if ( risSimple.test( qualifier ) ) {
2877
- return jQuery.filter( qualifier, elements, not );
2878
- }
2879
-
2880
- // Complex selector, compare the two sets, removing non-Elements
2881
- qualifier = jQuery.filter( qualifier, elements );
2882
- return jQuery.grep( elements, function( elem ) {
2883
- return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
2884
- } );
3056
+ // Filtered directly for both simple and complex selectors
3057
+ return jQuery.filter( qualifier, elements, not );
2885
3058
  }
2886
3059
 
2887
3060
  jQuery.filter = function( expr, elems, not ) {
@@ -3002,7 +3175,7 @@ var rootjQuery,
3002
3175
  for ( match in context ) {
3003
3176
 
3004
3177
  // Properties of context are called as methods if possible
3005
- if ( jQuery.isFunction( this[ match ] ) ) {
3178
+ if ( isFunction( this[ match ] ) ) {
3006
3179
  this[ match ]( context[ match ] );
3007
3180
 
3008
3181
  // ...and otherwise set as attributes
@@ -3045,7 +3218,7 @@ var rootjQuery,
3045
3218
 
3046
3219
  // HANDLE: $(function)
3047
3220
  // Shortcut for document ready
3048
- } else if ( jQuery.isFunction( selector ) ) {
3221
+ } else if ( isFunction( selector ) ) {
3049
3222
  return root.ready !== undefined ?
3050
3223
  root.ready( selector ) :
3051
3224
 
@@ -3167,7 +3340,7 @@ jQuery.each( {
3167
3340
  parents: function( elem ) {
3168
3341
  return dir( elem, "parentNode" );
3169
3342
  },
3170
- parentsUntil: function( elem, i, until ) {
3343
+ parentsUntil: function( elem, _i, until ) {
3171
3344
  return dir( elem, "parentNode", until );
3172
3345
  },
3173
3346
  next: function( elem ) {
@@ -3182,10 +3355,10 @@ jQuery.each( {
3182
3355
  prevAll: function( elem ) {
3183
3356
  return dir( elem, "previousSibling" );
3184
3357
  },
3185
- nextUntil: function( elem, i, until ) {
3358
+ nextUntil: function( elem, _i, until ) {
3186
3359
  return dir( elem, "nextSibling", until );
3187
3360
  },
3188
- prevUntil: function( elem, i, until ) {
3361
+ prevUntil: function( elem, _i, until ) {
3189
3362
  return dir( elem, "previousSibling", until );
3190
3363
  },
3191
3364
  siblings: function( elem ) {
@@ -3195,18 +3368,24 @@ jQuery.each( {
3195
3368
  return siblings( elem.firstChild );
3196
3369
  },
3197
3370
  contents: function( elem ) {
3198
- if ( nodeName( elem, "iframe" ) ) {
3199
- return elem.contentDocument;
3200
- }
3371
+ if ( elem.contentDocument != null &&
3201
3372
 
3202
- // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3203
- // Treat the template element as a regular one in browsers that
3204
- // don't support it.
3205
- if ( nodeName( elem, "template" ) ) {
3206
- elem = elem.content || elem;
3207
- }
3373
+ // Support: IE 11+
3374
+ // <object> elements with no `data` attribute has an object
3375
+ // `contentDocument` with a `null` prototype.
3376
+ getProto( elem.contentDocument ) ) {
3208
3377
 
3209
- return jQuery.merge( [], elem.childNodes );
3378
+ return elem.contentDocument;
3379
+ }
3380
+
3381
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3382
+ // Treat the template element as a regular one in browsers that
3383
+ // don't support it.
3384
+ if ( nodeName( elem, "template" ) ) {
3385
+ elem = elem.content || elem;
3386
+ }
3387
+
3388
+ return jQuery.merge( [], elem.childNodes );
3210
3389
  }
3211
3390
  }, function( name, fn ) {
3212
3391
  jQuery.fn[ name ] = function( until, selector ) {
@@ -3360,11 +3539,11 @@ jQuery.Callbacks = function( options ) {
3360
3539
 
3361
3540
  ( function add( args ) {
3362
3541
  jQuery.each( args, function( _, arg ) {
3363
- if ( jQuery.isFunction( arg ) ) {
3542
+ if ( isFunction( arg ) ) {
3364
3543
  if ( !options.unique || !self.has( arg ) ) {
3365
3544
  list.push( arg );
3366
3545
  }
3367
- } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
3546
+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
3368
3547
 
3369
3548
  // Inspect recursively
3370
3549
  add( arg );
@@ -3479,11 +3658,11 @@ function adoptValue( value, resolve, reject, noValue ) {
3479
3658
  try {
3480
3659
 
3481
3660
  // Check for promise aspect first to privilege synchronous behavior
3482
- if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
3661
+ if ( value && isFunction( ( method = value.promise ) ) ) {
3483
3662
  method.call( value ).done( resolve ).fail( reject );
3484
3663
 
3485
3664
  // Other thenables
3486
- } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
3665
+ } else if ( value && isFunction( ( method = value.then ) ) ) {
3487
3666
  method.call( value, resolve, reject );
3488
3667
 
3489
3668
  // Other non-thenables
@@ -3538,17 +3717,17 @@ jQuery.extend( {
3538
3717
  var fns = arguments;
3539
3718
 
3540
3719
  return jQuery.Deferred( function( newDefer ) {
3541
- jQuery.each( tuples, function( i, tuple ) {
3720
+ jQuery.each( tuples, function( _i, tuple ) {
3542
3721
 
3543
3722
  // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3544
- var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3723
+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3545
3724
 
3546
3725
  // deferred.progress(function() { bind to newDefer or newDefer.notify })
3547
3726
  // deferred.done(function() { bind to newDefer or newDefer.resolve })
3548
3727
  // deferred.fail(function() { bind to newDefer or newDefer.reject })
3549
3728
  deferred[ tuple[ 1 ] ]( function() {
3550
3729
  var returned = fn && fn.apply( this, arguments );
3551
- if ( returned && jQuery.isFunction( returned.promise ) ) {
3730
+ if ( returned && isFunction( returned.promise ) ) {
3552
3731
  returned.promise()
3553
3732
  .progress( newDefer.notify )
3554
3733
  .done( newDefer.resolve )
@@ -3602,7 +3781,7 @@ jQuery.extend( {
3602
3781
  returned.then;
3603
3782
 
3604
3783
  // Handle a returned thenable
3605
- if ( jQuery.isFunction( then ) ) {
3784
+ if ( isFunction( then ) ) {
3606
3785
 
3607
3786
  // Special processors (notify) just wait for resolution
3608
3787
  if ( special ) {
@@ -3698,7 +3877,7 @@ jQuery.extend( {
3698
3877
  resolve(
3699
3878
  0,
3700
3879
  newDefer,
3701
- jQuery.isFunction( onProgress ) ?
3880
+ isFunction( onProgress ) ?
3702
3881
  onProgress :
3703
3882
  Identity,
3704
3883
  newDefer.notifyWith
@@ -3710,7 +3889,7 @@ jQuery.extend( {
3710
3889
  resolve(
3711
3890
  0,
3712
3891
  newDefer,
3713
- jQuery.isFunction( onFulfilled ) ?
3892
+ isFunction( onFulfilled ) ?
3714
3893
  onFulfilled :
3715
3894
  Identity
3716
3895
  )
@@ -3721,7 +3900,7 @@ jQuery.extend( {
3721
3900
  resolve(
3722
3901
  0,
3723
3902
  newDefer,
3724
- jQuery.isFunction( onRejected ) ?
3903
+ isFunction( onRejected ) ?
3725
3904
  onRejected :
3726
3905
  Thrower
3727
3906
  )
@@ -3761,8 +3940,15 @@ jQuery.extend( {
3761
3940
  // fulfilled_callbacks.disable
3762
3941
  tuples[ 3 - i ][ 2 ].disable,
3763
3942
 
3943
+ // rejected_handlers.disable
3944
+ // fulfilled_handlers.disable
3945
+ tuples[ 3 - i ][ 3 ].disable,
3946
+
3764
3947
  // progress_callbacks.lock
3765
- tuples[ 0 ][ 2 ].lock
3948
+ tuples[ 0 ][ 2 ].lock,
3949
+
3950
+ // progress_handlers.lock
3951
+ tuples[ 0 ][ 3 ].lock
3766
3952
  );
3767
3953
  }
3768
3954
 
@@ -3832,7 +4018,7 @@ jQuery.extend( {
3832
4018
 
3833
4019
  // Use .then() to unwrap secondary thenables (cf. gh-3000)
3834
4020
  if ( master.state() === "pending" ||
3835
- jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4021
+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3836
4022
 
3837
4023
  return master.then();
3838
4024
  }
@@ -3960,7 +4146,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3960
4146
  bulk = key == null;
3961
4147
 
3962
4148
  // Sets many values
3963
- if ( jQuery.type( key ) === "object" ) {
4149
+ if ( toType( key ) === "object" ) {
3964
4150
  chainable = true;
3965
4151
  for ( i in key ) {
3966
4152
  access( elems, fn, i, key[ i ], true, emptyGet, raw );
@@ -3970,7 +4156,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3970
4156
  } else if ( value !== undefined ) {
3971
4157
  chainable = true;
3972
4158
 
3973
- if ( !jQuery.isFunction( value ) ) {
4159
+ if ( !isFunction( value ) ) {
3974
4160
  raw = true;
3975
4161
  }
3976
4162
 
@@ -3984,7 +4170,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3984
4170
  // ...except when executing function values
3985
4171
  } else {
3986
4172
  bulk = fn;
3987
- fn = function( elem, key, value ) {
4173
+ fn = function( elem, _key, value ) {
3988
4174
  return bulk.call( jQuery( elem ), value );
3989
4175
  };
3990
4176
  }
@@ -4012,6 +4198,23 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4012
4198
 
4013
4199
  return len ? fn( elems[ 0 ], key ) : emptyGet;
4014
4200
  };
4201
+
4202
+
4203
+ // Matches dashed string for camelizing
4204
+ var rmsPrefix = /^-ms-/,
4205
+ rdashAlpha = /-([a-z])/g;
4206
+
4207
+ // Used by camelCase as callback to replace()
4208
+ function fcamelCase( _all, letter ) {
4209
+ return letter.toUpperCase();
4210
+ }
4211
+
4212
+ // Convert dashed to camelCase; used by the css and data modules
4213
+ // Support: IE <=9 - 11, Edge 12 - 15
4214
+ // Microsoft forgot to hump their vendor prefix (#9572)
4215
+ function camelCase( string ) {
4216
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4217
+ }
4015
4218
  var acceptData = function( owner ) {
4016
4219
 
4017
4220
  // Accepts only:
@@ -4074,14 +4277,14 @@ Data.prototype = {
4074
4277
  // Handle: [ owner, key, value ] args
4075
4278
  // Always use camelCase key (gh-2257)
4076
4279
  if ( typeof data === "string" ) {
4077
- cache[ jQuery.camelCase( data ) ] = value;
4280
+ cache[ camelCase( data ) ] = value;
4078
4281
 
4079
4282
  // Handle: [ owner, { properties } ] args
4080
4283
  } else {
4081
4284
 
4082
4285
  // Copy the properties one-by-one to the cache object
4083
4286
  for ( prop in data ) {
4084
- cache[ jQuery.camelCase( prop ) ] = data[ prop ];
4287
+ cache[ camelCase( prop ) ] = data[ prop ];
4085
4288
  }
4086
4289
  }
4087
4290
  return cache;
@@ -4091,7 +4294,7 @@ Data.prototype = {
4091
4294
  this.cache( owner ) :
4092
4295
 
4093
4296
  // Always use camelCase key (gh-2257)
4094
- owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
4297
+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4095
4298
  },
4096
4299
  access: function( owner, key, value ) {
4097
4300
 
@@ -4139,9 +4342,9 @@ Data.prototype = {
4139
4342
 
4140
4343
  // If key is an array of keys...
4141
4344
  // We always set camelCase keys, so remove that.
4142
- key = key.map( jQuery.camelCase );
4345
+ key = key.map( camelCase );
4143
4346
  } else {
4144
- key = jQuery.camelCase( key );
4347
+ key = camelCase( key );
4145
4348
 
4146
4349
  // If a key with the spaces exists, use it.
4147
4350
  // Otherwise, create an array by matching non-whitespace
@@ -4287,7 +4490,7 @@ jQuery.fn.extend( {
4287
4490
  if ( attrs[ i ] ) {
4288
4491
  name = attrs[ i ].name;
4289
4492
  if ( name.indexOf( "data-" ) === 0 ) {
4290
- name = jQuery.camelCase( name.slice( 5 ) );
4493
+ name = camelCase( name.slice( 5 ) );
4291
4494
  dataAttr( elem, name, data[ name ] );
4292
4495
  }
4293
4496
  }
@@ -4491,6 +4694,26 @@ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4491
4694
 
4492
4695
  var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4493
4696
 
4697
+ var documentElement = document.documentElement;
4698
+
4699
+
4700
+
4701
+ var isAttached = function( elem ) {
4702
+ return jQuery.contains( elem.ownerDocument, elem );
4703
+ },
4704
+ composed = { composed: true };
4705
+
4706
+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4707
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
4708
+ // Support: iOS 10.0-10.2 only
4709
+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4710
+ // leading to errors. We need to check for `getRootNode`.
4711
+ if ( documentElement.getRootNode ) {
4712
+ isAttached = function( elem ) {
4713
+ return jQuery.contains( elem.ownerDocument, elem ) ||
4714
+ elem.getRootNode( composed ) === elem.ownerDocument;
4715
+ };
4716
+ }
4494
4717
  var isHiddenWithinTree = function( elem, el ) {
4495
4718
 
4496
4719
  // isHiddenWithinTree might be called from jQuery#filter function;
@@ -4505,37 +4728,15 @@ var isHiddenWithinTree = function( elem, el ) {
4505
4728
  // Support: Firefox <=43 - 45
4506
4729
  // Disconnected elements can have computed display: none, so first confirm that elem is
4507
4730
  // in the document.
4508
- jQuery.contains( elem.ownerDocument, elem ) &&
4731
+ isAttached( elem ) &&
4509
4732
 
4510
4733
  jQuery.css( elem, "display" ) === "none";
4511
4734
  };
4512
4735
 
4513
- var swap = function( elem, options, callback, args ) {
4514
- var ret, name,
4515
- old = {};
4516
-
4517
- // Remember the old values, and insert the new ones
4518
- for ( name in options ) {
4519
- old[ name ] = elem.style[ name ];
4520
- elem.style[ name ] = options[ name ];
4521
- }
4522
-
4523
- ret = callback.apply( elem, args || [] );
4524
-
4525
- // Revert the old values
4526
- for ( name in options ) {
4527
- elem.style[ name ] = old[ name ];
4528
- }
4529
-
4530
- return ret;
4531
- };
4532
-
4533
-
4534
4736
 
4535
4737
 
4536
4738
  function adjustCSS( elem, prop, valueParts, tween ) {
4537
- var adjusted,
4538
- scale = 1,
4739
+ var adjusted, scale,
4539
4740
  maxIterations = 20,
4540
4741
  currentValue = tween ?
4541
4742
  function() {
@@ -4548,35 +4749,39 @@ function adjustCSS( elem, prop, valueParts, tween ) {
4548
4749
  unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4549
4750
 
4550
4751
  // Starting value computation is required for potential unit mismatches
4551
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4752
+ initialInUnit = elem.nodeType &&
4753
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4552
4754
  rcssNum.exec( jQuery.css( elem, prop ) );
4553
4755
 
4554
4756
  if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4555
4757
 
4758
+ // Support: Firefox <=54
4759
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4760
+ initial = initial / 2;
4761
+
4556
4762
  // Trust units reported by jQuery.css
4557
4763
  unit = unit || initialInUnit[ 3 ];
4558
4764
 
4559
- // Make sure we update the tween properties later on
4560
- valueParts = valueParts || [];
4561
-
4562
4765
  // Iteratively approximate from a nonzero starting point
4563
4766
  initialInUnit = +initial || 1;
4564
4767
 
4565
- do {
4566
-
4567
- // If previous iteration zeroed out, double until we get *something*.
4568
- // Use string for doubling so we don't accidentally see scale as unchanged below
4569
- scale = scale || ".5";
4768
+ while ( maxIterations-- ) {
4570
4769
 
4571
- // Adjust and apply
4572
- initialInUnit = initialInUnit / scale;
4770
+ // Evaluate and update our best guess (doubling guesses that zero out).
4771
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4573
4772
  jQuery.style( elem, prop, initialInUnit + unit );
4773
+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4774
+ maxIterations = 0;
4775
+ }
4776
+ initialInUnit = initialInUnit / scale;
4574
4777
 
4575
- // Update scale, tolerating zero or NaN from tween.cur()
4576
- // Break the loop if scale is unchanged or perfect, or if we've just had enough.
4577
- } while (
4578
- scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
4579
- );
4778
+ }
4779
+
4780
+ initialInUnit = initialInUnit * 2;
4781
+ jQuery.style( elem, prop, initialInUnit + unit );
4782
+
4783
+ // Make sure we update the tween properties later on
4784
+ valueParts = valueParts || [];
4580
4785
  }
4581
4786
 
4582
4787
  if ( valueParts ) {
@@ -4692,17 +4897,46 @@ jQuery.fn.extend( {
4692
4897
  } );
4693
4898
  var rcheckableType = ( /^(?:checkbox|radio)$/i );
4694
4899
 
4695
- var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4900
+ var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4696
4901
 
4697
- var rscriptType = ( /^$|\/(?:java|ecma)script/i );
4902
+ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4698
4903
 
4699
4904
 
4700
4905
 
4701
- // We have to close these tags to support XHTML (#13200)
4702
- var wrapMap = {
4906
+ ( function() {
4907
+ var fragment = document.createDocumentFragment(),
4908
+ div = fragment.appendChild( document.createElement( "div" ) ),
4909
+ input = document.createElement( "input" );
4910
+
4911
+ // Support: Android 4.0 - 4.3 only
4912
+ // Check state lost if the name is set (#11217)
4913
+ // Support: Windows Web Apps (WWA)
4914
+ // `name` and `type` must use .setAttribute for WWA (#14901)
4915
+ input.setAttribute( "type", "radio" );
4916
+ input.setAttribute( "checked", "checked" );
4917
+ input.setAttribute( "name", "t" );
4918
+
4919
+ div.appendChild( input );
4920
+
4921
+ // Support: Android <=4.1 only
4922
+ // Older WebKit doesn't clone checked state correctly in fragments
4923
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4924
+
4925
+ // Support: IE <=11 only
4926
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
4927
+ div.innerHTML = "<textarea>x</textarea>";
4928
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4703
4929
 
4704
4930
  // Support: IE <=9 only
4705
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
4931
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
4932
+ // the select element.
4933
+ div.innerHTML = "<option></option>";
4934
+ support.option = !!div.lastChild;
4935
+ } )();
4936
+
4937
+
4938
+ // We have to close these tags to support XHTML (#13200)
4939
+ var wrapMap = {
4706
4940
 
4707
4941
  // XHTML parsers do not magically insert elements in the
4708
4942
  // same way that tag soup parsers do. So we cannot shorten
@@ -4715,12 +4949,14 @@ var wrapMap = {
4715
4949
  _default: [ 0, "", "" ]
4716
4950
  };
4717
4951
 
4718
- // Support: IE <=9 only
4719
- wrapMap.optgroup = wrapMap.option;
4720
-
4721
4952
  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4722
4953
  wrapMap.th = wrapMap.td;
4723
4954
 
4955
+ // Support: IE <=9 only
4956
+ if ( !support.option ) {
4957
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4958
+ }
4959
+
4724
4960
 
4725
4961
  function getAll( context, tag ) {
4726
4962
 
@@ -4764,7 +5000,7 @@ function setGlobalEval( elems, refElements ) {
4764
5000
  var rhtml = /<|&#?\w+;/;
4765
5001
 
4766
5002
  function buildFragment( elems, context, scripts, selection, ignored ) {
4767
- var elem, tmp, tag, wrap, contains, j,
5003
+ var elem, tmp, tag, wrap, attached, j,
4768
5004
  fragment = context.createDocumentFragment(),
4769
5005
  nodes = [],
4770
5006
  i = 0,
@@ -4776,7 +5012,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4776
5012
  if ( elem || elem === 0 ) {
4777
5013
 
4778
5014
  // Add nodes directly
4779
- if ( jQuery.type( elem ) === "object" ) {
5015
+ if ( toType( elem ) === "object" ) {
4780
5016
 
4781
5017
  // Support: Android <=4.0 only, PhantomJS 1 only
4782
5018
  // push.apply(_, arraylike) throws on ancient WebKit
@@ -4828,13 +5064,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4828
5064
  continue;
4829
5065
  }
4830
5066
 
4831
- contains = jQuery.contains( elem.ownerDocument, elem );
5067
+ attached = isAttached( elem );
4832
5068
 
4833
5069
  // Append to fragment
4834
5070
  tmp = getAll( fragment.appendChild( elem ), "script" );
4835
5071
 
4836
5072
  // Preserve script evaluation history
4837
- if ( contains ) {
5073
+ if ( attached ) {
4838
5074
  setGlobalEval( tmp );
4839
5075
  }
4840
5076
 
@@ -4853,34 +5089,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4853
5089
  }
4854
5090
 
4855
5091
 
4856
- ( function() {
4857
- var fragment = document.createDocumentFragment(),
4858
- div = fragment.appendChild( document.createElement( "div" ) ),
4859
- input = document.createElement( "input" );
4860
-
4861
- // Support: Android 4.0 - 4.3 only
4862
- // Check state lost if the name is set (#11217)
4863
- // Support: Windows Web Apps (WWA)
4864
- // `name` and `type` must use .setAttribute for WWA (#14901)
4865
- input.setAttribute( "type", "radio" );
4866
- input.setAttribute( "checked", "checked" );
4867
- input.setAttribute( "name", "t" );
4868
-
4869
- div.appendChild( input );
4870
-
4871
- // Support: Android <=4.1 only
4872
- // Older WebKit doesn't clone checked state correctly in fragments
4873
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4874
-
4875
- // Support: IE <=11 only
4876
- // Make sure textarea (and checkbox) defaultValue is properly cloned
4877
- div.innerHTML = "<textarea>x</textarea>";
4878
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4879
- } )();
4880
- var documentElement = document.documentElement;
4881
-
4882
-
4883
-
4884
5092
  var
4885
5093
  rkeyEvent = /^key/,
4886
5094
  rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
@@ -4894,8 +5102,19 @@ function returnFalse() {
4894
5102
  return false;
4895
5103
  }
4896
5104
 
5105
+ // Support: IE <=9 - 11+
5106
+ // focus() and blur() are asynchronous, except when they are no-op.
5107
+ // So expect focus to be synchronous when the element is already active,
5108
+ // and blur to be synchronous when the element is not already active.
5109
+ // (focus and blur are always synchronous in other supported browsers,
5110
+ // this just defines when we can count on it).
5111
+ function expectSync( elem, type ) {
5112
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
5113
+ }
5114
+
4897
5115
  // Support: IE <=9 only
4898
- // See #13393 for more info
5116
+ // Accessing document.activeElement can throw unexpectedly
5117
+ // https://bugs.jquery.com/ticket/13393
4899
5118
  function safeActiveElement() {
4900
5119
  try {
4901
5120
  return document.activeElement;
@@ -4978,8 +5197,8 @@ jQuery.event = {
4978
5197
  special, handlers, type, namespaces, origType,
4979
5198
  elemData = dataPriv.get( elem );
4980
5199
 
4981
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
4982
- if ( !elemData ) {
5200
+ // Only attach events to objects that accept data
5201
+ if ( !acceptData( elem ) ) {
4983
5202
  return;
4984
5203
  }
4985
5204
 
@@ -5003,7 +5222,7 @@ jQuery.event = {
5003
5222
 
5004
5223
  // Init the element's event structure and main handler, if this is the first
5005
5224
  if ( !( events = elemData.events ) ) {
5006
- events = elemData.events = {};
5225
+ events = elemData.events = Object.create( null );
5007
5226
  }
5008
5227
  if ( !( eventHandle = elemData.handle ) ) {
5009
5228
  eventHandle = elemData.handle = function( e ) {
@@ -5161,12 +5380,15 @@ jQuery.event = {
5161
5380
 
5162
5381
  dispatch: function( nativeEvent ) {
5163
5382
 
5164
- // Make a writable jQuery.Event from the native event object
5165
- var event = jQuery.event.fix( nativeEvent );
5166
-
5167
5383
  var i, j, ret, matched, handleObj, handlerQueue,
5168
5384
  args = new Array( arguments.length ),
5169
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5385
+
5386
+ // Make a writable jQuery.Event from the native event object
5387
+ event = jQuery.event.fix( nativeEvent ),
5388
+
5389
+ handlers = (
5390
+ dataPriv.get( this, "events" ) || Object.create( null )
5391
+ )[ event.type ] || [],
5170
5392
  special = jQuery.event.special[ event.type ] || {};
5171
5393
 
5172
5394
  // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5195,9 +5417,10 @@ jQuery.event = {
5195
5417
  while ( ( handleObj = matched.handlers[ j++ ] ) &&
5196
5418
  !event.isImmediatePropagationStopped() ) {
5197
5419
 
5198
- // Triggered event must either 1) have no namespace, or 2) have namespace(s)
5199
- // a subset or equal to those in the bound event (both can have no namespace).
5200
- if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5420
+ // If the event is namespaced, then each handler is only invoked if it is
5421
+ // specially universal or its namespaces are a superset of the event's.
5422
+ if ( !event.rnamespace || handleObj.namespace === false ||
5423
+ event.rnamespace.test( handleObj.namespace ) ) {
5201
5424
 
5202
5425
  event.handleObj = handleObj;
5203
5426
  event.data = handleObj.data;
@@ -5286,7 +5509,7 @@ jQuery.event = {
5286
5509
  enumerable: true,
5287
5510
  configurable: true,
5288
5511
 
5289
- get: jQuery.isFunction( hook ) ?
5512
+ get: isFunction( hook ) ?
5290
5513
  function() {
5291
5514
  if ( this.originalEvent ) {
5292
5515
  return hook( this.originalEvent );
@@ -5321,39 +5544,51 @@ jQuery.event = {
5321
5544
  // Prevent triggered image.load events from bubbling to window.load
5322
5545
  noBubble: true
5323
5546
  },
5324
- focus: {
5547
+ click: {
5325
5548
 
5326
- // Fire native event if possible so blur/focus sequence is correct
5327
- trigger: function() {
5328
- if ( this !== safeActiveElement() && this.focus ) {
5329
- this.focus();
5330
- return false;
5331
- }
5332
- },
5333
- delegateType: "focusin"
5334
- },
5335
- blur: {
5336
- trigger: function() {
5337
- if ( this === safeActiveElement() && this.blur ) {
5338
- this.blur();
5339
- return false;
5549
+ // Utilize native event to ensure correct state for checkable inputs
5550
+ setup: function( data ) {
5551
+
5552
+ // For mutual compressibility with _default, replace `this` access with a local var.
5553
+ // `|| data` is dead code meant only to preserve the variable through minification.
5554
+ var el = this || data;
5555
+
5556
+ // Claim the first handler
5557
+ if ( rcheckableType.test( el.type ) &&
5558
+ el.click && nodeName( el, "input" ) ) {
5559
+
5560
+ // dataPriv.set( el, "click", ... )
5561
+ leverageNative( el, "click", returnTrue );
5340
5562
  }
5563
+
5564
+ // Return false to allow normal processing in the caller
5565
+ return false;
5341
5566
  },
5342
- delegateType: "focusout"
5343
- },
5344
- click: {
5567
+ trigger: function( data ) {
5345
5568
 
5346
- // For checkbox, fire native event so checked state will be right
5347
- trigger: function() {
5348
- if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5349
- this.click();
5350
- return false;
5569
+ // For mutual compressibility with _default, replace `this` access with a local var.
5570
+ // `|| data` is dead code meant only to preserve the variable through minification.
5571
+ var el = this || data;
5572
+
5573
+ // Force setup before triggering a click
5574
+ if ( rcheckableType.test( el.type ) &&
5575
+ el.click && nodeName( el, "input" ) ) {
5576
+
5577
+ leverageNative( el, "click" );
5351
5578
  }
5579
+
5580
+ // Return non-false to allow normal event-path propagation
5581
+ return true;
5352
5582
  },
5353
5583
 
5354
- // For cross-browser consistency, don't fire native .click() on links
5584
+ // For cross-browser consistency, suppress native .click() on links
5585
+ // Also prevent it if we're currently inside a leveraged native-event stack
5355
5586
  _default: function( event ) {
5356
- return nodeName( event.target, "a" );
5587
+ var target = event.target;
5588
+ return rcheckableType.test( target.type ) &&
5589
+ target.click && nodeName( target, "input" ) &&
5590
+ dataPriv.get( target, "click" ) ||
5591
+ nodeName( target, "a" );
5357
5592
  }
5358
5593
  },
5359
5594
 
@@ -5367,8 +5602,95 @@ jQuery.event = {
5367
5602
  }
5368
5603
  }
5369
5604
  }
5370
- }
5371
- };
5605
+ }
5606
+ };
5607
+
5608
+ // Ensure the presence of an event listener that handles manually-triggered
5609
+ // synthetic events by interrupting progress until reinvoked in response to
5610
+ // *native* events that it fires directly, ensuring that state changes have
5611
+ // already occurred before other listeners are invoked.
5612
+ function leverageNative( el, type, expectSync ) {
5613
+
5614
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5615
+ if ( !expectSync ) {
5616
+ if ( dataPriv.get( el, type ) === undefined ) {
5617
+ jQuery.event.add( el, type, returnTrue );
5618
+ }
5619
+ return;
5620
+ }
5621
+
5622
+ // Register the controller as a special universal handler for all event namespaces
5623
+ dataPriv.set( el, type, false );
5624
+ jQuery.event.add( el, type, {
5625
+ namespace: false,
5626
+ handler: function( event ) {
5627
+ var notAsync, result,
5628
+ saved = dataPriv.get( this, type );
5629
+
5630
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5631
+
5632
+ // Interrupt processing of the outer synthetic .trigger()ed event
5633
+ // Saved data should be false in such cases, but might be a leftover capture object
5634
+ // from an async native handler (gh-4350)
5635
+ if ( !saved.length ) {
5636
+
5637
+ // Store arguments for use when handling the inner native event
5638
+ // There will always be at least one argument (an event object), so this array
5639
+ // will not be confused with a leftover capture object.
5640
+ saved = slice.call( arguments );
5641
+ dataPriv.set( this, type, saved );
5642
+
5643
+ // Trigger the native event and capture its result
5644
+ // Support: IE <=9 - 11+
5645
+ // focus() and blur() are asynchronous
5646
+ notAsync = expectSync( this, type );
5647
+ this[ type ]();
5648
+ result = dataPriv.get( this, type );
5649
+ if ( saved !== result || notAsync ) {
5650
+ dataPriv.set( this, type, false );
5651
+ } else {
5652
+ result = {};
5653
+ }
5654
+ if ( saved !== result ) {
5655
+
5656
+ // Cancel the outer synthetic event
5657
+ event.stopImmediatePropagation();
5658
+ event.preventDefault();
5659
+ return result.value;
5660
+ }
5661
+
5662
+ // If this is an inner synthetic event for an event with a bubbling surrogate
5663
+ // (focus or blur), assume that the surrogate already propagated from triggering the
5664
+ // native event and prevent that from happening again here.
5665
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5666
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5667
+ // less bad than duplication.
5668
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5669
+ event.stopPropagation();
5670
+ }
5671
+
5672
+ // If this is a native event triggered above, everything is now in order
5673
+ // Fire an inner synthetic event with the original arguments
5674
+ } else if ( saved.length ) {
5675
+
5676
+ // ...and capture the result
5677
+ dataPriv.set( this, type, {
5678
+ value: jQuery.event.trigger(
5679
+
5680
+ // Support: IE <=9 - 11+
5681
+ // Extend with the prototype to reset the above stopImmediatePropagation()
5682
+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5683
+ saved.slice( 1 ),
5684
+ this
5685
+ )
5686
+ } );
5687
+
5688
+ // Abort handling of the native event
5689
+ event.stopImmediatePropagation();
5690
+ }
5691
+ }
5692
+ } );
5693
+ }
5372
5694
 
5373
5695
  jQuery.removeEvent = function( elem, type, handle ) {
5374
5696
 
@@ -5421,7 +5743,7 @@ jQuery.Event = function( src, props ) {
5421
5743
  }
5422
5744
 
5423
5745
  // Create a timestamp if incoming event doesn't have one
5424
- this.timeStamp = src && src.timeStamp || jQuery.now();
5746
+ this.timeStamp = src && src.timeStamp || Date.now();
5425
5747
 
5426
5748
  // Mark it as fixed
5427
5749
  this[ jQuery.expando ] = true;
@@ -5482,6 +5804,7 @@ jQuery.each( {
5482
5804
  shiftKey: true,
5483
5805
  view: true,
5484
5806
  "char": true,
5807
+ code: true,
5485
5808
  charCode: true,
5486
5809
  key: true,
5487
5810
  keyCode: true,
@@ -5528,6 +5851,33 @@ jQuery.each( {
5528
5851
  }
5529
5852
  }, jQuery.event.addProp );
5530
5853
 
5854
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5855
+ jQuery.event.special[ type ] = {
5856
+
5857
+ // Utilize native event if possible so blur/focus sequence is correct
5858
+ setup: function() {
5859
+
5860
+ // Claim the first handler
5861
+ // dataPriv.set( this, "focus", ... )
5862
+ // dataPriv.set( this, "blur", ... )
5863
+ leverageNative( this, type, expectSync );
5864
+
5865
+ // Return false to allow normal processing in the caller
5866
+ return false;
5867
+ },
5868
+ trigger: function() {
5869
+
5870
+ // Force setup before trigger
5871
+ leverageNative( this, type );
5872
+
5873
+ // Return non-false to allow normal event-path propagation
5874
+ return true;
5875
+ },
5876
+
5877
+ delegateType: delegateType
5878
+ };
5879
+ } );
5880
+
5531
5881
  // Create mouseenter/leave events using mouseover/out and event-time checks
5532
5882
  // so that event delegation works in jQuery.
5533
5883
  // Do the same for pointerenter/pointerleave and pointerover/pointerout
@@ -5613,21 +5963,13 @@ jQuery.fn.extend( {
5613
5963
 
5614
5964
  var
5615
5965
 
5616
- /* eslint-disable max-len */
5617
-
5618
- // See https://github.com/eslint/eslint/issues/3229
5619
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5620
-
5621
- /* eslint-enable */
5622
-
5623
- // Support: IE <=10 - 11, Edge 12 - 13
5966
+ // Support: IE <=10 - 11, Edge 12 - 13 only
5624
5967
  // In IE/Edge using regex groups here causes severe slowdowns.
5625
5968
  // See https://connect.microsoft.com/IE/feedback/details/1736512/
5626
5969
  rnoInnerhtml = /<script|<style|<link/i,
5627
5970
 
5628
5971
  // checked="checked" or checked
5629
5972
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5630
- rscriptTypeMasked = /^true\/(.*)/,
5631
5973
  rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5632
5974
 
5633
5975
  // Prefer a tbody over its parent table for containing new rows
@@ -5635,7 +5977,7 @@ function manipulationTarget( elem, content ) {
5635
5977
  if ( nodeName( elem, "table" ) &&
5636
5978
  nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5637
5979
 
5638
- return jQuery( ">tbody", elem )[ 0 ] || elem;
5980
+ return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5639
5981
  }
5640
5982
 
5641
5983
  return elem;
@@ -5647,10 +5989,8 @@ function disableScript( elem ) {
5647
5989
  return elem;
5648
5990
  }
5649
5991
  function restoreScript( elem ) {
5650
- var match = rscriptTypeMasked.exec( elem.type );
5651
-
5652
- if ( match ) {
5653
- elem.type = match[ 1 ];
5992
+ if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5993
+ elem.type = elem.type.slice( 5 );
5654
5994
  } else {
5655
5995
  elem.removeAttribute( "type" );
5656
5996
  }
@@ -5659,7 +5999,7 @@ function restoreScript( elem ) {
5659
5999
  }
5660
6000
 
5661
6001
  function cloneCopyEvent( src, dest ) {
5662
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
6002
+ var i, l, type, pdataOld, udataOld, udataCur, events;
5663
6003
 
5664
6004
  if ( dest.nodeType !== 1 ) {
5665
6005
  return;
@@ -5667,13 +6007,11 @@ function cloneCopyEvent( src, dest ) {
5667
6007
 
5668
6008
  // 1. Copy private data: events, handlers, etc.
5669
6009
  if ( dataPriv.hasData( src ) ) {
5670
- pdataOld = dataPriv.access( src );
5671
- pdataCur = dataPriv.set( dest, pdataOld );
6010
+ pdataOld = dataPriv.get( src );
5672
6011
  events = pdataOld.events;
5673
6012
 
5674
6013
  if ( events ) {
5675
- delete pdataCur.handle;
5676
- pdataCur.events = {};
6014
+ dataPriv.remove( dest, "handle events" );
5677
6015
 
5678
6016
  for ( type in events ) {
5679
6017
  for ( i = 0, l = events[ type ].length; i < l; i++ ) {
@@ -5709,22 +6047,22 @@ function fixInput( src, dest ) {
5709
6047
  function domManip( collection, args, callback, ignored ) {
5710
6048
 
5711
6049
  // Flatten any nested arrays
5712
- args = concat.apply( [], args );
6050
+ args = flat( args );
5713
6051
 
5714
6052
  var fragment, first, scripts, hasScripts, node, doc,
5715
6053
  i = 0,
5716
6054
  l = collection.length,
5717
6055
  iNoClone = l - 1,
5718
6056
  value = args[ 0 ],
5719
- isFunction = jQuery.isFunction( value );
6057
+ valueIsFunction = isFunction( value );
5720
6058
 
5721
6059
  // We can't cloneNode fragments that contain checked, in WebKit
5722
- if ( isFunction ||
6060
+ if ( valueIsFunction ||
5723
6061
  ( l > 1 && typeof value === "string" &&
5724
6062
  !support.checkClone && rchecked.test( value ) ) ) {
5725
6063
  return collection.each( function( index ) {
5726
6064
  var self = collection.eq( index );
5727
- if ( isFunction ) {
6065
+ if ( valueIsFunction ) {
5728
6066
  args[ 0 ] = value.call( this, index, self.html() );
5729
6067
  }
5730
6068
  domManip( self, args, callback, ignored );
@@ -5778,14 +6116,16 @@ function domManip( collection, args, callback, ignored ) {
5778
6116
  !dataPriv.access( node, "globalEval" ) &&
5779
6117
  jQuery.contains( doc, node ) ) {
5780
6118
 
5781
- if ( node.src ) {
6119
+ if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
5782
6120
 
5783
6121
  // Optional AJAX dependency, but won't run scripts if not present
5784
- if ( jQuery._evalUrl ) {
5785
- jQuery._evalUrl( node.src );
6122
+ if ( jQuery._evalUrl && !node.noModule ) {
6123
+ jQuery._evalUrl( node.src, {
6124
+ nonce: node.nonce || node.getAttribute( "nonce" )
6125
+ }, doc );
5786
6126
  }
5787
6127
  } else {
5788
- DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
6128
+ DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5789
6129
  }
5790
6130
  }
5791
6131
  }
@@ -5807,7 +6147,7 @@ function remove( elem, selector, keepData ) {
5807
6147
  }
5808
6148
 
5809
6149
  if ( node.parentNode ) {
5810
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
6150
+ if ( keepData && isAttached( node ) ) {
5811
6151
  setGlobalEval( getAll( node, "script" ) );
5812
6152
  }
5813
6153
  node.parentNode.removeChild( node );
@@ -5819,13 +6159,13 @@ function remove( elem, selector, keepData ) {
5819
6159
 
5820
6160
  jQuery.extend( {
5821
6161
  htmlPrefilter: function( html ) {
5822
- return html.replace( rxhtmlTag, "<$1></$2>" );
6162
+ return html;
5823
6163
  },
5824
6164
 
5825
6165
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5826
6166
  var i, l, srcElements, destElements,
5827
6167
  clone = elem.cloneNode( true ),
5828
- inPage = jQuery.contains( elem.ownerDocument, elem );
6168
+ inPage = isAttached( elem );
5829
6169
 
5830
6170
  // Fix IE cloning issues
5831
6171
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
@@ -6065,8 +6405,6 @@ jQuery.each( {
6065
6405
  return this.pushStack( ret );
6066
6406
  };
6067
6407
  } );
6068
- var rmargin = ( /^margin/ );
6069
-
6070
6408
  var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6071
6409
 
6072
6410
  var getStyles = function( elem ) {
@@ -6083,6 +6421,29 @@ var getStyles = function( elem ) {
6083
6421
  return view.getComputedStyle( elem );
6084
6422
  };
6085
6423
 
6424
+ var swap = function( elem, options, callback ) {
6425
+ var ret, name,
6426
+ old = {};
6427
+
6428
+ // Remember the old values, and insert the new ones
6429
+ for ( name in options ) {
6430
+ old[ name ] = elem.style[ name ];
6431
+ elem.style[ name ] = options[ name ];
6432
+ }
6433
+
6434
+ ret = callback.call( elem );
6435
+
6436
+ // Revert the old values
6437
+ for ( name in options ) {
6438
+ elem.style[ name ] = old[ name ];
6439
+ }
6440
+
6441
+ return ret;
6442
+ };
6443
+
6444
+
6445
+ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6446
+
6086
6447
 
6087
6448
 
6088
6449
  ( function() {
@@ -6096,25 +6457,35 @@ var getStyles = function( elem ) {
6096
6457
  return;
6097
6458
  }
6098
6459
 
6460
+ container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6461
+ "margin-top:1px;padding:0;border:0";
6099
6462
  div.style.cssText =
6100
- "box-sizing:border-box;" +
6101
- "position:relative;display:block;" +
6463
+ "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6102
6464
  "margin:auto;border:1px;padding:1px;" +
6103
- "top:1%;width:50%";
6104
- div.innerHTML = "";
6105
- documentElement.appendChild( container );
6465
+ "width:60%;top:1%";
6466
+ documentElement.appendChild( container ).appendChild( div );
6106
6467
 
6107
6468
  var divStyle = window.getComputedStyle( div );
6108
6469
  pixelPositionVal = divStyle.top !== "1%";
6109
6470
 
6110
6471
  // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6111
- reliableMarginLeftVal = divStyle.marginLeft === "2px";
6112
- boxSizingReliableVal = divStyle.width === "4px";
6472
+ reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6113
6473
 
6114
- // Support: Android 4.0 - 4.3 only
6474
+ // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6115
6475
  // Some styles come back with percentage values, even though they shouldn't
6116
- div.style.marginRight = "50%";
6117
- pixelMarginRightVal = divStyle.marginRight === "4px";
6476
+ div.style.right = "60%";
6477
+ pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6478
+
6479
+ // Support: IE 9 - 11 only
6480
+ // Detect misreporting of content dimensions for box-sizing:border-box elements
6481
+ boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6482
+
6483
+ // Support: IE 9 only
6484
+ // Detect overflow:scroll screwiness (gh-3699)
6485
+ // Support: Chrome <=64
6486
+ // Don't get tricked when zoom affects offsetWidth (gh-4029)
6487
+ div.style.position = "absolute";
6488
+ scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6118
6489
 
6119
6490
  documentElement.removeChild( container );
6120
6491
 
@@ -6123,7 +6494,12 @@ var getStyles = function( elem ) {
6123
6494
  div = null;
6124
6495
  }
6125
6496
 
6126
- var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
6497
+ function roundPixelMeasures( measure ) {
6498
+ return Math.round( parseFloat( measure ) );
6499
+ }
6500
+
6501
+ var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6502
+ reliableTrDimensionsVal, reliableMarginLeftVal,
6127
6503
  container = document.createElement( "div" ),
6128
6504
  div = document.createElement( "div" );
6129
6505
 
@@ -6138,26 +6514,55 @@ var getStyles = function( elem ) {
6138
6514
  div.cloneNode( true ).style.backgroundClip = "";
6139
6515
  support.clearCloneStyle = div.style.backgroundClip === "content-box";
6140
6516
 
6141
- container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
6142
- "padding:0;margin-top:1px;position:absolute";
6143
- container.appendChild( div );
6144
-
6145
6517
  jQuery.extend( support, {
6146
- pixelPosition: function() {
6147
- computeStyleTests();
6148
- return pixelPositionVal;
6149
- },
6150
6518
  boxSizingReliable: function() {
6151
6519
  computeStyleTests();
6152
6520
  return boxSizingReliableVal;
6153
6521
  },
6154
- pixelMarginRight: function() {
6522
+ pixelBoxStyles: function() {
6155
6523
  computeStyleTests();
6156
- return pixelMarginRightVal;
6524
+ return pixelBoxStylesVal;
6525
+ },
6526
+ pixelPosition: function() {
6527
+ computeStyleTests();
6528
+ return pixelPositionVal;
6157
6529
  },
6158
6530
  reliableMarginLeft: function() {
6159
6531
  computeStyleTests();
6160
6532
  return reliableMarginLeftVal;
6533
+ },
6534
+ scrollboxSize: function() {
6535
+ computeStyleTests();
6536
+ return scrollboxSizeVal;
6537
+ },
6538
+
6539
+ // Support: IE 9 - 11+, Edge 15 - 18+
6540
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6541
+ // set in CSS while `offset*` properties report correct values.
6542
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
6543
+ // some versions of this test; make sure not to make it pass there!
6544
+ reliableTrDimensions: function() {
6545
+ var table, tr, trChild, trStyle;
6546
+ if ( reliableTrDimensionsVal == null ) {
6547
+ table = document.createElement( "table" );
6548
+ tr = document.createElement( "tr" );
6549
+ trChild = document.createElement( "div" );
6550
+
6551
+ table.style.cssText = "position:absolute;left:-11111px";
6552
+ tr.style.height = "1px";
6553
+ trChild.style.height = "9px";
6554
+
6555
+ documentElement
6556
+ .appendChild( table )
6557
+ .appendChild( tr )
6558
+ .appendChild( trChild );
6559
+
6560
+ trStyle = window.getComputedStyle( tr );
6561
+ reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
6562
+
6563
+ documentElement.removeChild( table );
6564
+ }
6565
+ return reliableTrDimensionsVal;
6161
6566
  }
6162
6567
  } );
6163
6568
  } )();
@@ -6180,7 +6585,7 @@ function curCSS( elem, name, computed ) {
6180
6585
  if ( computed ) {
6181
6586
  ret = computed.getPropertyValue( name ) || computed[ name ];
6182
6587
 
6183
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6588
+ if ( ret === "" && !isAttached( elem ) ) {
6184
6589
  ret = jQuery.style( elem, name );
6185
6590
  }
6186
6591
 
@@ -6189,7 +6594,7 @@ function curCSS( elem, name, computed ) {
6189
6594
  // but width seems to be reliably pixels.
6190
6595
  // This is against the CSSOM draft spec:
6191
6596
  // https://drafts.csswg.org/cssom/#resolved-values
6192
- if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6597
+ if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6193
6598
 
6194
6599
  // Remember the original values
6195
6600
  width = style.width;
@@ -6236,30 +6641,13 @@ function addGetHookIf( conditionFn, hookFn ) {
6236
6641
  }
6237
6642
 
6238
6643
 
6239
- var
6240
-
6241
- // Swappable if display is none or starts with table
6242
- // except "table", "table-cell", or "table-caption"
6243
- // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6244
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6245
- rcustomProp = /^--/,
6246
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6247
- cssNormalTransform = {
6248
- letterSpacing: "0",
6249
- fontWeight: "400"
6250
- },
6251
-
6252
- cssPrefixes = [ "Webkit", "Moz", "ms" ],
6253
- emptyStyle = document.createElement( "div" ).style;
6644
+ var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6645
+ emptyStyle = document.createElement( "div" ).style,
6646
+ vendorProps = {};
6254
6647
 
6255
- // Return a css property mapped to a potentially vendor prefixed property
6648
+ // Return a vendor-prefixed property or undefined
6256
6649
  function vendorPropName( name ) {
6257
6650
 
6258
- // Shortcut for names that are not vendor prefixed
6259
- if ( name in emptyStyle ) {
6260
- return name;
6261
- }
6262
-
6263
6651
  // Check for vendor prefixed names
6264
6652
  var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6265
6653
  i = cssPrefixes.length;
@@ -6272,17 +6660,34 @@ function vendorPropName( name ) {
6272
6660
  }
6273
6661
  }
6274
6662
 
6275
- // Return a property mapped along what jQuery.cssProps suggests or to
6276
- // a vendor prefixed property.
6663
+ // Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6277
6664
  function finalPropName( name ) {
6278
- var ret = jQuery.cssProps[ name ];
6279
- if ( !ret ) {
6280
- ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6665
+ var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6666
+
6667
+ if ( final ) {
6668
+ return final;
6281
6669
  }
6282
- return ret;
6670
+ if ( name in emptyStyle ) {
6671
+ return name;
6672
+ }
6673
+ return vendorProps[ name ] = vendorPropName( name ) || name;
6283
6674
  }
6284
6675
 
6285
- function setPositiveNumber( elem, value, subtract ) {
6676
+
6677
+ var
6678
+
6679
+ // Swappable if display is none or starts with table
6680
+ // except "table", "table-cell", or "table-caption"
6681
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6682
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6683
+ rcustomProp = /^--/,
6684
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6685
+ cssNormalTransform = {
6686
+ letterSpacing: "0",
6687
+ fontWeight: "400"
6688
+ };
6689
+
6690
+ function setPositiveNumber( _elem, value, subtract ) {
6286
6691
 
6287
6692
  // Any relative (+/-) values have already been
6288
6693
  // normalized at this point
@@ -6294,87 +6699,146 @@ function setPositiveNumber( elem, value, subtract ) {
6294
6699
  value;
6295
6700
  }
6296
6701
 
6297
- function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6298
- var i,
6299
- val = 0;
6300
-
6301
- // If we already have the right measurement, avoid augmentation
6302
- if ( extra === ( isBorderBox ? "border" : "content" ) ) {
6303
- i = 4;
6702
+ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6703
+ var i = dimension === "width" ? 1 : 0,
6704
+ extra = 0,
6705
+ delta = 0;
6304
6706
 
6305
- // Otherwise initialize for horizontal or vertical properties
6306
- } else {
6307
- i = name === "width" ? 1 : 0;
6707
+ // Adjustment may not be necessary
6708
+ if ( box === ( isBorderBox ? "border" : "content" ) ) {
6709
+ return 0;
6308
6710
  }
6309
6711
 
6310
6712
  for ( ; i < 4; i += 2 ) {
6311
6713
 
6312
- // Both box models exclude margin, so add it if we want it
6313
- if ( extra === "margin" ) {
6314
- val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6714
+ // Both box models exclude margin
6715
+ if ( box === "margin" ) {
6716
+ delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6315
6717
  }
6316
6718
 
6317
- if ( isBorderBox ) {
6719
+ // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6720
+ if ( !isBorderBox ) {
6318
6721
 
6319
- // border-box includes padding, so remove it if we want content
6320
- if ( extra === "content" ) {
6321
- val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6322
- }
6722
+ // Add padding
6723
+ delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6323
6724
 
6324
- // At this point, extra isn't border nor margin, so remove border
6325
- if ( extra !== "margin" ) {
6326
- val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6725
+ // For "border" or "margin", add border
6726
+ if ( box !== "padding" ) {
6727
+ delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6728
+
6729
+ // But still keep track of it otherwise
6730
+ } else {
6731
+ extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6327
6732
  }
6733
+
6734
+ // If we get here with a border-box (content + padding + border), we're seeking "content" or
6735
+ // "padding" or "margin"
6328
6736
  } else {
6329
6737
 
6330
- // At this point, extra isn't content, so add padding
6331
- val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6738
+ // For "content", subtract padding
6739
+ if ( box === "content" ) {
6740
+ delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6741
+ }
6332
6742
 
6333
- // At this point, extra isn't content nor padding, so add border
6334
- if ( extra !== "padding" ) {
6335
- val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6743
+ // For "content" or "padding", subtract border
6744
+ if ( box !== "margin" ) {
6745
+ delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6336
6746
  }
6337
6747
  }
6338
6748
  }
6339
6749
 
6340
- return val;
6750
+ // Account for positive content-box scroll gutter when requested by providing computedVal
6751
+ if ( !isBorderBox && computedVal >= 0 ) {
6752
+
6753
+ // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6754
+ // Assuming integer scroll gutter, subtract the rest and round down
6755
+ delta += Math.max( 0, Math.ceil(
6756
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6757
+ computedVal -
6758
+ delta -
6759
+ extra -
6760
+ 0.5
6761
+
6762
+ // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6763
+ // Use an explicit zero to avoid NaN (gh-3964)
6764
+ ) ) || 0;
6765
+ }
6766
+
6767
+ return delta;
6341
6768
  }
6342
6769
 
6343
- function getWidthOrHeight( elem, name, extra ) {
6770
+ function getWidthOrHeight( elem, dimension, extra ) {
6344
6771
 
6345
6772
  // Start with computed style
6346
- var valueIsBorderBox,
6347
- styles = getStyles( elem ),
6348
- val = curCSS( elem, name, styles ),
6349
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6773
+ var styles = getStyles( elem ),
6774
+
6775
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6776
+ // Fake content-box until we know it's needed to know the true value.
6777
+ boxSizingNeeded = !support.boxSizingReliable() || extra,
6778
+ isBorderBox = boxSizingNeeded &&
6779
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6780
+ valueIsBorderBox = isBorderBox,
6350
6781
 
6351
- // Computed unit is not pixels. Stop here and return.
6782
+ val = curCSS( elem, dimension, styles ),
6783
+ offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6784
+
6785
+ // Support: Firefox <=54
6786
+ // Return a confounding non-pixel value or feign ignorance, as appropriate.
6352
6787
  if ( rnumnonpx.test( val ) ) {
6353
- return val;
6788
+ if ( !extra ) {
6789
+ return val;
6790
+ }
6791
+ val = "auto";
6354
6792
  }
6355
6793
 
6356
- // Check for style in case a browser which returns unreliable values
6357
- // for getComputedStyle silently falls back to the reliable elem.style
6358
- valueIsBorderBox = isBorderBox &&
6359
- ( support.boxSizingReliable() || val === elem.style[ name ] );
6360
6794
 
6361
- // Fall back to offsetWidth/Height when value is "auto"
6362
- // This happens for inline elements with no explicit setting (gh-3571)
6363
- if ( val === "auto" ) {
6364
- val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
6795
+ // Support: IE 9 - 11 only
6796
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
6797
+ // In those cases, the computed value can be trusted to be border-box.
6798
+ if ( ( !support.boxSizingReliable() && isBorderBox ||
6799
+
6800
+ // Support: IE 10 - 11+, Edge 15 - 18+
6801
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6802
+ // set in CSS while `offset*` properties report correct values.
6803
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
6804
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6805
+
6806
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
6807
+ // This happens for inline elements with no explicit setting (gh-3571)
6808
+ val === "auto" ||
6809
+
6810
+ // Support: Android <=4.1 - 4.3 only
6811
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6812
+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6813
+
6814
+ // Make sure the element is visible & connected
6815
+ elem.getClientRects().length ) {
6816
+
6817
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6818
+
6819
+ // Where available, offsetWidth/offsetHeight approximate border box dimensions.
6820
+ // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6821
+ // retrieved value as a content box dimension.
6822
+ valueIsBorderBox = offsetProp in elem;
6823
+ if ( valueIsBorderBox ) {
6824
+ val = elem[ offsetProp ];
6825
+ }
6365
6826
  }
6366
6827
 
6367
- // Normalize "", auto, and prepare for extra
6828
+ // Normalize "" and auto
6368
6829
  val = parseFloat( val ) || 0;
6369
6830
 
6370
- // Use the active box-sizing model to add/subtract irrelevant styles
6831
+ // Adjust for the element's box model
6371
6832
  return ( val +
6372
- augmentWidthOrHeight(
6833
+ boxModelAdjustment(
6373
6834
  elem,
6374
- name,
6835
+ dimension,
6375
6836
  extra || ( isBorderBox ? "border" : "content" ),
6376
6837
  valueIsBorderBox,
6377
- styles
6838
+ styles,
6839
+
6840
+ // Provide the current computed size to request scroll gutter calculation (gh-3589)
6841
+ val
6378
6842
  )
6379
6843
  ) + "px";
6380
6844
  }
@@ -6404,6 +6868,13 @@ jQuery.extend( {
6404
6868
  "flexGrow": true,
6405
6869
  "flexShrink": true,
6406
6870
  "fontWeight": true,
6871
+ "gridArea": true,
6872
+ "gridColumn": true,
6873
+ "gridColumnEnd": true,
6874
+ "gridColumnStart": true,
6875
+ "gridRow": true,
6876
+ "gridRowEnd": true,
6877
+ "gridRowStart": true,
6407
6878
  "lineHeight": true,
6408
6879
  "opacity": true,
6409
6880
  "order": true,
@@ -6415,9 +6886,7 @@ jQuery.extend( {
6415
6886
 
6416
6887
  // Add in properties whose names you wish to fix before
6417
6888
  // setting or getting the value
6418
- cssProps: {
6419
- "float": "cssFloat"
6420
- },
6889
+ cssProps: {},
6421
6890
 
6422
6891
  // Get and set the style property on a DOM Node
6423
6892
  style: function( elem, name, value, extra ) {
@@ -6429,7 +6898,7 @@ jQuery.extend( {
6429
6898
 
6430
6899
  // Make sure that we're working with the right name
6431
6900
  var ret, type, hooks,
6432
- origName = jQuery.camelCase( name ),
6901
+ origName = camelCase( name ),
6433
6902
  isCustomProp = rcustomProp.test( name ),
6434
6903
  style = elem.style;
6435
6904
 
@@ -6461,7 +6930,9 @@ jQuery.extend( {
6461
6930
  }
6462
6931
 
6463
6932
  // If a number was passed in, add the unit (except for certain CSS properties)
6464
- if ( type === "number" ) {
6933
+ // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6934
+ // "px" to a few hardcoded values.
6935
+ if ( type === "number" && !isCustomProp ) {
6465
6936
  value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6466
6937
  }
6467
6938
 
@@ -6497,7 +6968,7 @@ jQuery.extend( {
6497
6968
 
6498
6969
  css: function( elem, name, extra, styles ) {
6499
6970
  var val, num, hooks,
6500
- origName = jQuery.camelCase( name ),
6971
+ origName = camelCase( name ),
6501
6972
  isCustomProp = rcustomProp.test( name );
6502
6973
 
6503
6974
  // Make sure that we're working with the right name. We don't
@@ -6535,8 +7006,8 @@ jQuery.extend( {
6535
7006
  }
6536
7007
  } );
6537
7008
 
6538
- jQuery.each( [ "height", "width" ], function( i, name ) {
6539
- jQuery.cssHooks[ name ] = {
7009
+ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
7010
+ jQuery.cssHooks[ dimension ] = {
6540
7011
  get: function( elem, computed, extra ) {
6541
7012
  if ( computed ) {
6542
7013
 
@@ -6552,29 +7023,52 @@ jQuery.each( [ "height", "width" ], function( i, name ) {
6552
7023
  // in IE throws an error.
6553
7024
  ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6554
7025
  swap( elem, cssShow, function() {
6555
- return getWidthOrHeight( elem, name, extra );
7026
+ return getWidthOrHeight( elem, dimension, extra );
6556
7027
  } ) :
6557
- getWidthOrHeight( elem, name, extra );
7028
+ getWidthOrHeight( elem, dimension, extra );
6558
7029
  }
6559
7030
  },
6560
7031
 
6561
7032
  set: function( elem, value, extra ) {
6562
7033
  var matches,
6563
- styles = extra && getStyles( elem ),
6564
- subtract = extra && augmentWidthOrHeight(
6565
- elem,
6566
- name,
6567
- extra,
7034
+ styles = getStyles( elem ),
7035
+
7036
+ // Only read styles.position if the test has a chance to fail
7037
+ // to avoid forcing a reflow.
7038
+ scrollboxSizeBuggy = !support.scrollboxSize() &&
7039
+ styles.position === "absolute",
7040
+
7041
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
7042
+ boxSizingNeeded = scrollboxSizeBuggy || extra,
7043
+ isBorderBox = boxSizingNeeded &&
6568
7044
  jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6569
- styles
7045
+ subtract = extra ?
7046
+ boxModelAdjustment(
7047
+ elem,
7048
+ dimension,
7049
+ extra,
7050
+ isBorderBox,
7051
+ styles
7052
+ ) :
7053
+ 0;
7054
+
7055
+ // Account for unreliable border-box dimensions by comparing offset* to computed and
7056
+ // faking a content-box to get border and padding (gh-3699)
7057
+ if ( isBorderBox && scrollboxSizeBuggy ) {
7058
+ subtract -= Math.ceil(
7059
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
7060
+ parseFloat( styles[ dimension ] ) -
7061
+ boxModelAdjustment( elem, dimension, "border", false, styles ) -
7062
+ 0.5
6570
7063
  );
7064
+ }
6571
7065
 
6572
7066
  // Convert to pixels if value adjustment is needed
6573
7067
  if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6574
7068
  ( matches[ 3 ] || "px" ) !== "px" ) {
6575
7069
 
6576
- elem.style[ name ] = value;
6577
- value = jQuery.css( elem, name );
7070
+ elem.style[ dimension ] = value;
7071
+ value = jQuery.css( elem, dimension );
6578
7072
  }
6579
7073
 
6580
7074
  return setPositiveNumber( elem, value, subtract );
@@ -6618,7 +7112,7 @@ jQuery.each( {
6618
7112
  }
6619
7113
  };
6620
7114
 
6621
- if ( !rmargin.test( prefix ) ) {
7115
+ if ( prefix !== "margin" ) {
6622
7116
  jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6623
7117
  }
6624
7118
  } );
@@ -6728,9 +7222,9 @@ Tween.propHooks = {
6728
7222
  // Use .style if available and use plain properties where available.
6729
7223
  if ( jQuery.fx.step[ tween.prop ] ) {
6730
7224
  jQuery.fx.step[ tween.prop ]( tween );
6731
- } else if ( tween.elem.nodeType === 1 &&
6732
- ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
6733
- jQuery.cssHooks[ tween.prop ] ) ) {
7225
+ } else if ( tween.elem.nodeType === 1 && (
7226
+ jQuery.cssHooks[ tween.prop ] ||
7227
+ tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
6734
7228
  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6735
7229
  } else {
6736
7230
  tween.elem[ tween.prop ] = tween.now;
@@ -6789,7 +7283,7 @@ function createFxNow() {
6789
7283
  window.setTimeout( function() {
6790
7284
  fxNow = undefined;
6791
7285
  } );
6792
- return ( fxNow = jQuery.now() );
7286
+ return ( fxNow = Date.now() );
6793
7287
  }
6794
7288
 
6795
7289
  // Generate parameters to create a standard animation
@@ -6893,9 +7387,10 @@ function defaultPrefilter( elem, props, opts ) {
6893
7387
  // Restrict "overflow" and "display" styles during box animations
6894
7388
  if ( isBox && elem.nodeType === 1 ) {
6895
7389
 
6896
- // Support: IE <=9 - 11, Edge 12 - 13
7390
+ // Support: IE <=9 - 11, Edge 12 - 15
6897
7391
  // Record all 3 overflow attributes because IE does not infer the shorthand
6898
- // from identically-valued overflowX and overflowY
7392
+ // from identically-valued overflowX and overflowY and Edge just mirrors
7393
+ // the overflowX value there.
6899
7394
  opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
6900
7395
 
6901
7396
  // Identify a display type, preferring old show/hide data over the CSS cascade
@@ -7003,7 +7498,7 @@ function propFilter( props, specialEasing ) {
7003
7498
 
7004
7499
  // camelCase, specialEasing and expand cssHook pass
7005
7500
  for ( index in props ) {
7006
- name = jQuery.camelCase( index );
7501
+ name = camelCase( index );
7007
7502
  easing = specialEasing[ name ];
7008
7503
  value = props[ index ];
7009
7504
  if ( Array.isArray( value ) ) {
@@ -7128,9 +7623,9 @@ function Animation( elem, properties, options ) {
7128
7623
  for ( ; index < length; index++ ) {
7129
7624
  result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7130
7625
  if ( result ) {
7131
- if ( jQuery.isFunction( result.stop ) ) {
7626
+ if ( isFunction( result.stop ) ) {
7132
7627
  jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7133
- jQuery.proxy( result.stop, result );
7628
+ result.stop.bind( result );
7134
7629
  }
7135
7630
  return result;
7136
7631
  }
@@ -7138,7 +7633,7 @@ function Animation( elem, properties, options ) {
7138
7633
 
7139
7634
  jQuery.map( props, createTween, animation );
7140
7635
 
7141
- if ( jQuery.isFunction( animation.opts.start ) ) {
7636
+ if ( isFunction( animation.opts.start ) ) {
7142
7637
  animation.opts.start.call( elem, animation );
7143
7638
  }
7144
7639
 
@@ -7171,7 +7666,7 @@ jQuery.Animation = jQuery.extend( Animation, {
7171
7666
  },
7172
7667
 
7173
7668
  tweener: function( props, callback ) {
7174
- if ( jQuery.isFunction( props ) ) {
7669
+ if ( isFunction( props ) ) {
7175
7670
  callback = props;
7176
7671
  props = [ "*" ];
7177
7672
  } else {
@@ -7203,9 +7698,9 @@ jQuery.Animation = jQuery.extend( Animation, {
7203
7698
  jQuery.speed = function( speed, easing, fn ) {
7204
7699
  var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7205
7700
  complete: fn || !fn && easing ||
7206
- jQuery.isFunction( speed ) && speed,
7701
+ isFunction( speed ) && speed,
7207
7702
  duration: speed,
7208
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7703
+ easing: fn && easing || easing && !isFunction( easing ) && easing
7209
7704
  };
7210
7705
 
7211
7706
  // Go to the end state if fx are off
@@ -7232,7 +7727,7 @@ jQuery.speed = function( speed, easing, fn ) {
7232
7727
  opt.old = opt.complete;
7233
7728
 
7234
7729
  opt.complete = function() {
7235
- if ( jQuery.isFunction( opt.old ) ) {
7730
+ if ( isFunction( opt.old ) ) {
7236
7731
  opt.old.call( this );
7237
7732
  }
7238
7733
 
@@ -7284,7 +7779,7 @@ jQuery.fn.extend( {
7284
7779
  clearQueue = type;
7285
7780
  type = undefined;
7286
7781
  }
7287
- if ( clearQueue && type !== false ) {
7782
+ if ( clearQueue ) {
7288
7783
  this.queue( type || "fx", [] );
7289
7784
  }
7290
7785
 
@@ -7367,7 +7862,7 @@ jQuery.fn.extend( {
7367
7862
  }
7368
7863
  } );
7369
7864
 
7370
- jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7865
+ jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7371
7866
  var cssFn = jQuery.fn[ name ];
7372
7867
  jQuery.fn[ name ] = function( speed, easing, callback ) {
7373
7868
  return speed == null || typeof speed === "boolean" ?
@@ -7396,7 +7891,7 @@ jQuery.fx.tick = function() {
7396
7891
  i = 0,
7397
7892
  timers = jQuery.timers;
7398
7893
 
7399
- fxNow = jQuery.now();
7894
+ fxNow = Date.now();
7400
7895
 
7401
7896
  for ( ; i < timers.length; i++ ) {
7402
7897
  timer = timers[ i ];
@@ -7588,7 +8083,7 @@ boolHook = {
7588
8083
  }
7589
8084
  };
7590
8085
 
7591
- jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
8086
+ jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
7592
8087
  var getter = attrHandle[ name ] || jQuery.find.attr;
7593
8088
 
7594
8089
  attrHandle[ name ] = function( elem, name, isXML ) {
@@ -7749,7 +8244,7 @@ jQuery.each( [
7749
8244
 
7750
8245
 
7751
8246
  // Strip and collapse whitespace according to HTML spec
7752
- // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
8247
+ // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
7753
8248
  function stripAndCollapse( value ) {
7754
8249
  var tokens = value.match( rnothtmlwhite ) || [];
7755
8250
  return tokens.join( " " );
@@ -7760,20 +8255,30 @@ function getClass( elem ) {
7760
8255
  return elem.getAttribute && elem.getAttribute( "class" ) || "";
7761
8256
  }
7762
8257
 
8258
+ function classesToArray( value ) {
8259
+ if ( Array.isArray( value ) ) {
8260
+ return value;
8261
+ }
8262
+ if ( typeof value === "string" ) {
8263
+ return value.match( rnothtmlwhite ) || [];
8264
+ }
8265
+ return [];
8266
+ }
8267
+
7763
8268
  jQuery.fn.extend( {
7764
8269
  addClass: function( value ) {
7765
8270
  var classes, elem, cur, curValue, clazz, j, finalValue,
7766
8271
  i = 0;
7767
8272
 
7768
- if ( jQuery.isFunction( value ) ) {
8273
+ if ( isFunction( value ) ) {
7769
8274
  return this.each( function( j ) {
7770
8275
  jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
7771
8276
  } );
7772
8277
  }
7773
8278
 
7774
- if ( typeof value === "string" && value ) {
7775
- classes = value.match( rnothtmlwhite ) || [];
8279
+ classes = classesToArray( value );
7776
8280
 
8281
+ if ( classes.length ) {
7777
8282
  while ( ( elem = this[ i++ ] ) ) {
7778
8283
  curValue = getClass( elem );
7779
8284
  cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
@@ -7802,7 +8307,7 @@ jQuery.fn.extend( {
7802
8307
  var classes, elem, cur, curValue, clazz, j, finalValue,
7803
8308
  i = 0;
7804
8309
 
7805
- if ( jQuery.isFunction( value ) ) {
8310
+ if ( isFunction( value ) ) {
7806
8311
  return this.each( function( j ) {
7807
8312
  jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
7808
8313
  } );
@@ -7812,9 +8317,9 @@ jQuery.fn.extend( {
7812
8317
  return this.attr( "class", "" );
7813
8318
  }
7814
8319
 
7815
- if ( typeof value === "string" && value ) {
7816
- classes = value.match( rnothtmlwhite ) || [];
8320
+ classes = classesToArray( value );
7817
8321
 
8322
+ if ( classes.length ) {
7818
8323
  while ( ( elem = this[ i++ ] ) ) {
7819
8324
  curValue = getClass( elem );
7820
8325
 
@@ -7844,13 +8349,14 @@ jQuery.fn.extend( {
7844
8349
  },
7845
8350
 
7846
8351
  toggleClass: function( value, stateVal ) {
7847
- var type = typeof value;
8352
+ var type = typeof value,
8353
+ isValidValue = type === "string" || Array.isArray( value );
7848
8354
 
7849
- if ( typeof stateVal === "boolean" && type === "string" ) {
8355
+ if ( typeof stateVal === "boolean" && isValidValue ) {
7850
8356
  return stateVal ? this.addClass( value ) : this.removeClass( value );
7851
8357
  }
7852
8358
 
7853
- if ( jQuery.isFunction( value ) ) {
8359
+ if ( isFunction( value ) ) {
7854
8360
  return this.each( function( i ) {
7855
8361
  jQuery( this ).toggleClass(
7856
8362
  value.call( this, i, getClass( this ), stateVal ),
@@ -7862,12 +8368,12 @@ jQuery.fn.extend( {
7862
8368
  return this.each( function() {
7863
8369
  var className, i, self, classNames;
7864
8370
 
7865
- if ( type === "string" ) {
8371
+ if ( isValidValue ) {
7866
8372
 
7867
8373
  // Toggle individual class names
7868
8374
  i = 0;
7869
8375
  self = jQuery( this );
7870
- classNames = value.match( rnothtmlwhite ) || [];
8376
+ classNames = classesToArray( value );
7871
8377
 
7872
8378
  while ( ( className = classNames[ i++ ] ) ) {
7873
8379
 
@@ -7926,7 +8432,7 @@ var rreturn = /\r/g;
7926
8432
 
7927
8433
  jQuery.fn.extend( {
7928
8434
  val: function( value ) {
7929
- var hooks, ret, isFunction,
8435
+ var hooks, ret, valueIsFunction,
7930
8436
  elem = this[ 0 ];
7931
8437
 
7932
8438
  if ( !arguments.length ) {
@@ -7955,7 +8461,7 @@ jQuery.fn.extend( {
7955
8461
  return;
7956
8462
  }
7957
8463
 
7958
- isFunction = jQuery.isFunction( value );
8464
+ valueIsFunction = isFunction( value );
7959
8465
 
7960
8466
  return this.each( function( i ) {
7961
8467
  var val;
@@ -7964,7 +8470,7 @@ jQuery.fn.extend( {
7964
8470
  return;
7965
8471
  }
7966
8472
 
7967
- if ( isFunction ) {
8473
+ if ( valueIsFunction ) {
7968
8474
  val = value.call( this, i, jQuery( this ).val() );
7969
8475
  } else {
7970
8476
  val = value;
@@ -8106,18 +8612,24 @@ jQuery.each( [ "radio", "checkbox" ], function() {
8106
8612
  // Return jQuery for attributes-only inclusion
8107
8613
 
8108
8614
 
8109
- var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
8615
+ support.focusin = "onfocusin" in window;
8616
+
8617
+
8618
+ var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8619
+ stopPropagationCallback = function( e ) {
8620
+ e.stopPropagation();
8621
+ };
8110
8622
 
8111
8623
  jQuery.extend( jQuery.event, {
8112
8624
 
8113
8625
  trigger: function( event, data, elem, onlyHandlers ) {
8114
8626
 
8115
- var i, cur, tmp, bubbleType, ontype, handle, special,
8627
+ var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8116
8628
  eventPath = [ elem || document ],
8117
8629
  type = hasOwn.call( event, "type" ) ? event.type : event,
8118
8630
  namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8119
8631
 
8120
- cur = tmp = elem = elem || document;
8632
+ cur = lastElement = tmp = elem = elem || document;
8121
8633
 
8122
8634
  // Don't do events on text and comment nodes
8123
8635
  if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
@@ -8169,7 +8681,7 @@ jQuery.extend( jQuery.event, {
8169
8681
 
8170
8682
  // Determine event propagation path in advance, per W3C events spec (#9951)
8171
8683
  // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8172
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
8684
+ if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8173
8685
 
8174
8686
  bubbleType = special.delegateType || type;
8175
8687
  if ( !rfocusMorph.test( bubbleType + type ) ) {
@@ -8189,13 +8701,15 @@ jQuery.extend( jQuery.event, {
8189
8701
  // Fire handlers on the event path
8190
8702
  i = 0;
8191
8703
  while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8192
-
8704
+ lastElement = cur;
8193
8705
  event.type = i > 1 ?
8194
8706
  bubbleType :
8195
8707
  special.bindType || type;
8196
8708
 
8197
8709
  // jQuery handler
8198
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8710
+ handle = (
8711
+ dataPriv.get( cur, "events" ) || Object.create( null )
8712
+ )[ event.type ] &&
8199
8713
  dataPriv.get( cur, "handle" );
8200
8714
  if ( handle ) {
8201
8715
  handle.apply( cur, data );
@@ -8221,7 +8735,7 @@ jQuery.extend( jQuery.event, {
8221
8735
 
8222
8736
  // Call a native DOM method on the target with the same name as the event.
8223
8737
  // Don't do default actions on window, that's where global variables be (#6170)
8224
- if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
8738
+ if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8225
8739
 
8226
8740
  // Don't re-trigger an onFOO event when we call its FOO() method
8227
8741
  tmp = elem[ ontype ];
@@ -8232,7 +8746,17 @@ jQuery.extend( jQuery.event, {
8232
8746
 
8233
8747
  // Prevent re-triggering of the same event, since we already bubbled it above
8234
8748
  jQuery.event.triggered = type;
8749
+
8750
+ if ( event.isPropagationStopped() ) {
8751
+ lastElement.addEventListener( type, stopPropagationCallback );
8752
+ }
8753
+
8235
8754
  elem[ type ]();
8755
+
8756
+ if ( event.isPropagationStopped() ) {
8757
+ lastElement.removeEventListener( type, stopPropagationCallback );
8758
+ }
8759
+
8236
8760
  jQuery.event.triggered = undefined;
8237
8761
 
8238
8762
  if ( tmp ) {
@@ -8278,31 +8802,6 @@ jQuery.fn.extend( {
8278
8802
  } );
8279
8803
 
8280
8804
 
8281
- jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
8282
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8283
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
8284
- function( i, name ) {
8285
-
8286
- // Handle event binding
8287
- jQuery.fn[ name ] = function( data, fn ) {
8288
- return arguments.length > 0 ?
8289
- this.on( name, null, data, fn ) :
8290
- this.trigger( name );
8291
- };
8292
- } );
8293
-
8294
- jQuery.fn.extend( {
8295
- hover: function( fnOver, fnOut ) {
8296
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8297
- }
8298
- } );
8299
-
8300
-
8301
-
8302
-
8303
- support.focusin = "onfocusin" in window;
8304
-
8305
-
8306
8805
  // Support: Firefox <=44
8307
8806
  // Firefox doesn't have focus(in | out) events
8308
8807
  // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
@@ -8321,7 +8820,10 @@ if ( !support.focusin ) {
8321
8820
 
8322
8821
  jQuery.event.special[ fix ] = {
8323
8822
  setup: function() {
8324
- var doc = this.ownerDocument || this,
8823
+
8824
+ // Handle: regular nodes (via `this.ownerDocument`), window
8825
+ // (via `this.document`) & document (via `this`).
8826
+ var doc = this.ownerDocument || this.document || this,
8325
8827
  attaches = dataPriv.access( doc, fix );
8326
8828
 
8327
8829
  if ( !attaches ) {
@@ -8330,7 +8832,7 @@ if ( !support.focusin ) {
8330
8832
  dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8331
8833
  },
8332
8834
  teardown: function() {
8333
- var doc = this.ownerDocument || this,
8835
+ var doc = this.ownerDocument || this.document || this,
8334
8836
  attaches = dataPriv.access( doc, fix ) - 1;
8335
8837
 
8336
8838
  if ( !attaches ) {
@@ -8346,7 +8848,7 @@ if ( !support.focusin ) {
8346
8848
  }
8347
8849
  var location = window.location;
8348
8850
 
8349
- var nonce = jQuery.now();
8851
+ var nonce = { guid: Date.now() };
8350
8852
 
8351
8853
  var rquery = ( /\?/ );
8352
8854
 
@@ -8404,7 +8906,7 @@ function buildParams( prefix, obj, traditional, add ) {
8404
8906
  }
8405
8907
  } );
8406
8908
 
8407
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
8909
+ } else if ( !traditional && toType( obj ) === "object" ) {
8408
8910
 
8409
8911
  // Serialize object item.
8410
8912
  for ( name in obj ) {
@@ -8426,7 +8928,7 @@ jQuery.param = function( a, traditional ) {
8426
8928
  add = function( key, valueOrFunction ) {
8427
8929
 
8428
8930
  // If value is a function, invoke it and use its return value
8429
- var value = jQuery.isFunction( valueOrFunction ) ?
8931
+ var value = isFunction( valueOrFunction ) ?
8430
8932
  valueOrFunction() :
8431
8933
  valueOrFunction;
8432
8934
 
@@ -8434,6 +8936,10 @@ jQuery.param = function( a, traditional ) {
8434
8936
  encodeURIComponent( value == null ? "" : value );
8435
8937
  };
8436
8938
 
8939
+ if ( a == null ) {
8940
+ return "";
8941
+ }
8942
+
8437
8943
  // If an array was passed in, assume that it is an array of form elements.
8438
8944
  if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8439
8945
 
@@ -8474,7 +8980,7 @@ jQuery.fn.extend( {
8474
8980
  rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8475
8981
  ( this.checked || !rcheckableType.test( type ) );
8476
8982
  } )
8477
- .map( function( i, elem ) {
8983
+ .map( function( _i, elem ) {
8478
8984
  var val = jQuery( this ).val();
8479
8985
 
8480
8986
  if ( val == null ) {
@@ -8544,7 +9050,7 @@ function addToPrefiltersOrTransports( structure ) {
8544
9050
  i = 0,
8545
9051
  dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8546
9052
 
8547
- if ( jQuery.isFunction( func ) ) {
9053
+ if ( isFunction( func ) ) {
8548
9054
 
8549
9055
  // For each dataType in the dataTypeExpression
8550
9056
  while ( ( dataType = dataTypes[ i++ ] ) ) {
@@ -8936,12 +9442,14 @@ jQuery.extend( {
8936
9442
  if ( !responseHeaders ) {
8937
9443
  responseHeaders = {};
8938
9444
  while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
8939
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9445
+ responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9446
+ ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9447
+ .concat( match[ 2 ] );
8940
9448
  }
8941
9449
  }
8942
- match = responseHeaders[ key.toLowerCase() ];
9450
+ match = responseHeaders[ key.toLowerCase() + " " ];
8943
9451
  }
8944
- return match == null ? null : match;
9452
+ return match == null ? null : match.join( ", " );
8945
9453
  },
8946
9454
 
8947
9455
  // Raw string
@@ -9016,7 +9524,7 @@ jQuery.extend( {
9016
9524
  if ( s.crossDomain == null ) {
9017
9525
  urlAnchor = document.createElement( "a" );
9018
9526
 
9019
- // Support: IE <=8 - 11, Edge 12 - 13
9527
+ // Support: IE <=8 - 11, Edge 12 - 15
9020
9528
  // IE throws exception on accessing the href property if url is malformed,
9021
9529
  // e.g. http://example.com:80x/
9022
9530
  try {
@@ -9074,8 +9582,8 @@ jQuery.extend( {
9074
9582
  // Remember the hash so we can put it back
9075
9583
  uncached = s.url.slice( cacheURL.length );
9076
9584
 
9077
- // If data is available, append data to url
9078
- if ( s.data ) {
9585
+ // If data is available and should be processed, append data to url
9586
+ if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9079
9587
  cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9080
9588
 
9081
9589
  // #9682: remove data so that it's not used in an eventual retry
@@ -9085,7 +9593,8 @@ jQuery.extend( {
9085
9593
  // Add or update anti-cache param if needed
9086
9594
  if ( s.cache === false ) {
9087
9595
  cacheURL = cacheURL.replace( rantiCache, "$1" );
9088
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9596
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9597
+ uncached;
9089
9598
  }
9090
9599
 
9091
9600
  // Put hash and anti-cache on the URL that will be requested (gh-1732)
@@ -9218,6 +9727,11 @@ jQuery.extend( {
9218
9727
  response = ajaxHandleResponses( s, jqXHR, responses );
9219
9728
  }
9220
9729
 
9730
+ // Use a noop converter for missing script
9731
+ if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
9732
+ s.converters[ "text script" ] = function() {};
9733
+ }
9734
+
9221
9735
  // Convert no matter what (that way responseXXX fields are always set)
9222
9736
  response = ajaxConvert( s, response, jqXHR, isSuccess );
9223
9737
 
@@ -9308,11 +9822,11 @@ jQuery.extend( {
9308
9822
  }
9309
9823
  } );
9310
9824
 
9311
- jQuery.each( [ "get", "post" ], function( i, method ) {
9825
+ jQuery.each( [ "get", "post" ], function( _i, method ) {
9312
9826
  jQuery[ method ] = function( url, data, callback, type ) {
9313
9827
 
9314
9828
  // Shift arguments if data argument was omitted
9315
- if ( jQuery.isFunction( data ) ) {
9829
+ if ( isFunction( data ) ) {
9316
9830
  type = type || callback;
9317
9831
  callback = data;
9318
9832
  data = undefined;
@@ -9329,8 +9843,17 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
9329
9843
  };
9330
9844
  } );
9331
9845
 
9846
+ jQuery.ajaxPrefilter( function( s ) {
9847
+ var i;
9848
+ for ( i in s.headers ) {
9849
+ if ( i.toLowerCase() === "content-type" ) {
9850
+ s.contentType = s.headers[ i ] || "";
9851
+ }
9852
+ }
9853
+ } );
9854
+
9332
9855
 
9333
- jQuery._evalUrl = function( url ) {
9856
+ jQuery._evalUrl = function( url, options, doc ) {
9334
9857
  return jQuery.ajax( {
9335
9858
  url: url,
9336
9859
 
@@ -9340,7 +9863,16 @@ jQuery._evalUrl = function( url ) {
9340
9863
  cache: true,
9341
9864
  async: false,
9342
9865
  global: false,
9343
- "throws": true
9866
+
9867
+ // Only evaluate the response if it is successful (gh-4126)
9868
+ // dataFilter is not invoked for failure responses, so using it instead
9869
+ // of the default converter is kludgy but it works.
9870
+ converters: {
9871
+ "text script": function() {}
9872
+ },
9873
+ dataFilter: function( response ) {
9874
+ jQuery.globalEval( response, options, doc );
9875
+ }
9344
9876
  } );
9345
9877
  };
9346
9878
 
@@ -9350,7 +9882,7 @@ jQuery.fn.extend( {
9350
9882
  var wrap;
9351
9883
 
9352
9884
  if ( this[ 0 ] ) {
9353
- if ( jQuery.isFunction( html ) ) {
9885
+ if ( isFunction( html ) ) {
9354
9886
  html = html.call( this[ 0 ] );
9355
9887
  }
9356
9888
 
@@ -9376,7 +9908,7 @@ jQuery.fn.extend( {
9376
9908
  },
9377
9909
 
9378
9910
  wrapInner: function( html ) {
9379
- if ( jQuery.isFunction( html ) ) {
9911
+ if ( isFunction( html ) ) {
9380
9912
  return this.each( function( i ) {
9381
9913
  jQuery( this ).wrapInner( html.call( this, i ) );
9382
9914
  } );
@@ -9396,10 +9928,10 @@ jQuery.fn.extend( {
9396
9928
  },
9397
9929
 
9398
9930
  wrap: function( html ) {
9399
- var isFunction = jQuery.isFunction( html );
9931
+ var htmlIsFunction = isFunction( html );
9400
9932
 
9401
9933
  return this.each( function( i ) {
9402
- jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
9934
+ jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9403
9935
  } );
9404
9936
  },
9405
9937
 
@@ -9491,7 +10023,8 @@ jQuery.ajaxTransport( function( options ) {
9491
10023
  return function() {
9492
10024
  if ( callback ) {
9493
10025
  callback = errorCallback = xhr.onload =
9494
- xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
10026
+ xhr.onerror = xhr.onabort = xhr.ontimeout =
10027
+ xhr.onreadystatechange = null;
9495
10028
 
9496
10029
  if ( type === "abort" ) {
9497
10030
  xhr.abort();
@@ -9531,7 +10064,7 @@ jQuery.ajaxTransport( function( options ) {
9531
10064
 
9532
10065
  // Listen to events
9533
10066
  xhr.onload = callback();
9534
- errorCallback = xhr.onerror = callback( "error" );
10067
+ errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
9535
10068
 
9536
10069
  // Support: IE 9 only
9537
10070
  // Use onreadystatechange to replace onabort
@@ -9622,24 +10155,21 @@ jQuery.ajaxPrefilter( "script", function( s ) {
9622
10155
  // Bind script tag hack transport
9623
10156
  jQuery.ajaxTransport( "script", function( s ) {
9624
10157
 
9625
- // This transport only deals with cross domain requests
9626
- if ( s.crossDomain ) {
10158
+ // This transport only deals with cross domain or forced-by-attrs requests
10159
+ if ( s.crossDomain || s.scriptAttrs ) {
9627
10160
  var script, callback;
9628
10161
  return {
9629
10162
  send: function( _, complete ) {
9630
- script = jQuery( "<script>" ).prop( {
9631
- charset: s.scriptCharset,
9632
- src: s.url
9633
- } ).on(
9634
- "load error",
9635
- callback = function( evt ) {
10163
+ script = jQuery( "<script>" )
10164
+ .attr( s.scriptAttrs || {} )
10165
+ .prop( { charset: s.scriptCharset, src: s.url } )
10166
+ .on( "load error", callback = function( evt ) {
9636
10167
  script.remove();
9637
10168
  callback = null;
9638
10169
  if ( evt ) {
9639
10170
  complete( evt.type === "error" ? 404 : 200, evt.type );
9640
10171
  }
9641
- }
9642
- );
10172
+ } );
9643
10173
 
9644
10174
  // Use native DOM manipulation to avoid our domManip AJAX trickery
9645
10175
  document.head.appendChild( script[ 0 ] );
@@ -9663,7 +10193,7 @@ var oldCallbacks = [],
9663
10193
  jQuery.ajaxSetup( {
9664
10194
  jsonp: "callback",
9665
10195
  jsonpCallback: function() {
9666
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
10196
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
9667
10197
  this[ callback ] = true;
9668
10198
  return callback;
9669
10199
  }
@@ -9685,7 +10215,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9685
10215
  if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9686
10216
 
9687
10217
  // Get callback name, remembering preexisting value associated with it
9688
- callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
10218
+ callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
9689
10219
  s.jsonpCallback() :
9690
10220
  s.jsonpCallback;
9691
10221
 
@@ -9736,7 +10266,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9736
10266
  }
9737
10267
 
9738
10268
  // Call if it was a function and we have a response
9739
- if ( responseContainer && jQuery.isFunction( overwritten ) ) {
10269
+ if ( responseContainer && isFunction( overwritten ) ) {
9740
10270
  overwritten( responseContainer[ 0 ] );
9741
10271
  }
9742
10272
 
@@ -9828,7 +10358,7 @@ jQuery.fn.load = function( url, params, callback ) {
9828
10358
  }
9829
10359
 
9830
10360
  // If it's a function
9831
- if ( jQuery.isFunction( params ) ) {
10361
+ if ( isFunction( params ) ) {
9832
10362
 
9833
10363
  // We assume that it's the callback
9834
10364
  callback = params;
@@ -9880,23 +10410,6 @@ jQuery.fn.load = function( url, params, callback ) {
9880
10410
 
9881
10411
 
9882
10412
 
9883
- // Attach a bunch of functions for handling common AJAX events
9884
- jQuery.each( [
9885
- "ajaxStart",
9886
- "ajaxStop",
9887
- "ajaxComplete",
9888
- "ajaxError",
9889
- "ajaxSuccess",
9890
- "ajaxSend"
9891
- ], function( i, type ) {
9892
- jQuery.fn[ type ] = function( fn ) {
9893
- return this.on( type, fn );
9894
- };
9895
- } );
9896
-
9897
-
9898
-
9899
-
9900
10413
  jQuery.expr.pseudos.animated = function( elem ) {
9901
10414
  return jQuery.grep( jQuery.timers, function( fn ) {
9902
10415
  return elem === fn.elem;
@@ -9936,7 +10449,7 @@ jQuery.offset = {
9936
10449
  curLeft = parseFloat( curCSSLeft ) || 0;
9937
10450
  }
9938
10451
 
9939
- if ( jQuery.isFunction( options ) ) {
10452
+ if ( isFunction( options ) ) {
9940
10453
 
9941
10454
  // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
9942
10455
  options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
@@ -9953,12 +10466,20 @@ jQuery.offset = {
9953
10466
  options.using.call( elem, props );
9954
10467
 
9955
10468
  } else {
10469
+ if ( typeof props.top === "number" ) {
10470
+ props.top += "px";
10471
+ }
10472
+ if ( typeof props.left === "number" ) {
10473
+ props.left += "px";
10474
+ }
9956
10475
  curElem.css( props );
9957
10476
  }
9958
10477
  }
9959
10478
  };
9960
10479
 
9961
10480
  jQuery.fn.extend( {
10481
+
10482
+ // offset() relates an element's border box to the document origin
9962
10483
  offset: function( options ) {
9963
10484
 
9964
10485
  // Preserve chaining for setter
@@ -9970,7 +10491,7 @@ jQuery.fn.extend( {
9970
10491
  } );
9971
10492
  }
9972
10493
 
9973
- var doc, docElem, rect, win,
10494
+ var rect, win,
9974
10495
  elem = this[ 0 ];
9975
10496
 
9976
10497
  if ( !elem ) {
@@ -9985,50 +10506,52 @@ jQuery.fn.extend( {
9985
10506
  return { top: 0, left: 0 };
9986
10507
  }
9987
10508
 
10509
+ // Get document-relative position by adding viewport scroll to viewport-relative gBCR
9988
10510
  rect = elem.getBoundingClientRect();
9989
-
9990
- doc = elem.ownerDocument;
9991
- docElem = doc.documentElement;
9992
- win = doc.defaultView;
9993
-
10511
+ win = elem.ownerDocument.defaultView;
9994
10512
  return {
9995
- top: rect.top + win.pageYOffset - docElem.clientTop,
9996
- left: rect.left + win.pageXOffset - docElem.clientLeft
10513
+ top: rect.top + win.pageYOffset,
10514
+ left: rect.left + win.pageXOffset
9997
10515
  };
9998
10516
  },
9999
10517
 
10518
+ // position() relates an element's margin box to its offset parent's padding box
10519
+ // This corresponds to the behavior of CSS absolute positioning
10000
10520
  position: function() {
10001
10521
  if ( !this[ 0 ] ) {
10002
10522
  return;
10003
10523
  }
10004
10524
 
10005
- var offsetParent, offset,
10525
+ var offsetParent, offset, doc,
10006
10526
  elem = this[ 0 ],
10007
10527
  parentOffset = { top: 0, left: 0 };
10008
10528
 
10009
- // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10010
- // because it is its only offset parent
10529
+ // position:fixed elements are offset from the viewport, which itself always has zero offset
10011
10530
  if ( jQuery.css( elem, "position" ) === "fixed" ) {
10012
10531
 
10013
- // Assume getBoundingClientRect is there when computed position is fixed
10532
+ // Assume position:fixed implies availability of getBoundingClientRect
10014
10533
  offset = elem.getBoundingClientRect();
10015
10534
 
10016
10535
  } else {
10536
+ offset = this.offset();
10017
10537
 
10018
- // Get *real* offsetParent
10019
- offsetParent = this.offsetParent();
10538
+ // Account for the *real* offset parent, which can be the document or its root element
10539
+ // when a statically positioned element is identified
10540
+ doc = elem.ownerDocument;
10541
+ offsetParent = elem.offsetParent || doc.documentElement;
10542
+ while ( offsetParent &&
10543
+ ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10544
+ jQuery.css( offsetParent, "position" ) === "static" ) {
10020
10545
 
10021
- // Get correct offsets
10022
- offset = this.offset();
10023
- if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
10024
- parentOffset = offsetParent.offset();
10546
+ offsetParent = offsetParent.parentNode;
10025
10547
  }
10548
+ if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10026
10549
 
10027
- // Add offsetParent borders
10028
- parentOffset = {
10029
- top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
10030
- left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
10031
- };
10550
+ // Incorporate borders into its offset, since they are outside its content origin
10551
+ parentOffset = jQuery( offsetParent ).offset();
10552
+ parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10553
+ parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10554
+ }
10032
10555
  }
10033
10556
 
10034
10557
  // Subtract parent offsets and element margins
@@ -10070,7 +10593,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
10070
10593
 
10071
10594
  // Coalesce documents and windows
10072
10595
  var win;
10073
- if ( jQuery.isWindow( elem ) ) {
10596
+ if ( isWindow( elem ) ) {
10074
10597
  win = elem;
10075
10598
  } else if ( elem.nodeType === 9 ) {
10076
10599
  win = elem.defaultView;
@@ -10099,7 +10622,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
10099
10622
  // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10100
10623
  // getComputedStyle returns percent when specified for top/left/bottom/right;
10101
10624
  // rather than make the css module depend on the offset module, just check for it here
10102
- jQuery.each( [ "top", "left" ], function( i, prop ) {
10625
+ jQuery.each( [ "top", "left" ], function( _i, prop ) {
10103
10626
  jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10104
10627
  function( elem, computed ) {
10105
10628
  if ( computed ) {
@@ -10128,7 +10651,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10128
10651
  return access( this, function( elem, type, value ) {
10129
10652
  var doc;
10130
10653
 
10131
- if ( jQuery.isWindow( elem ) ) {
10654
+ if ( isWindow( elem ) ) {
10132
10655
 
10133
10656
  // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10134
10657
  return funcName.indexOf( "outer" ) === 0 ?
@@ -10162,6 +10685,22 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10162
10685
  } );
10163
10686
 
10164
10687
 
10688
+ jQuery.each( [
10689
+ "ajaxStart",
10690
+ "ajaxStop",
10691
+ "ajaxComplete",
10692
+ "ajaxError",
10693
+ "ajaxSuccess",
10694
+ "ajaxSend"
10695
+ ], function( _i, type ) {
10696
+ jQuery.fn[ type ] = function( fn ) {
10697
+ return this.on( type, fn );
10698
+ };
10699
+ } );
10700
+
10701
+
10702
+
10703
+
10165
10704
  jQuery.fn.extend( {
10166
10705
 
10167
10706
  bind: function( types, data, fn ) {
@@ -10180,9 +10719,64 @@ jQuery.fn.extend( {
10180
10719
  return arguments.length === 1 ?
10181
10720
  this.off( selector, "**" ) :
10182
10721
  this.off( types, selector || "**", fn );
10722
+ },
10723
+
10724
+ hover: function( fnOver, fnOut ) {
10725
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10183
10726
  }
10184
10727
  } );
10185
10728
 
10729
+ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10730
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10731
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10732
+ function( _i, name ) {
10733
+
10734
+ // Handle event binding
10735
+ jQuery.fn[ name ] = function( data, fn ) {
10736
+ return arguments.length > 0 ?
10737
+ this.on( name, null, data, fn ) :
10738
+ this.trigger( name );
10739
+ };
10740
+ } );
10741
+
10742
+
10743
+
10744
+
10745
+ // Support: Android <=4.0 only
10746
+ // Make sure we trim BOM and NBSP
10747
+ var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10748
+
10749
+ // Bind a function to a context, optionally partially applying any
10750
+ // arguments.
10751
+ // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10752
+ // However, it is not slated for removal any time soon
10753
+ jQuery.proxy = function( fn, context ) {
10754
+ var tmp, args, proxy;
10755
+
10756
+ if ( typeof context === "string" ) {
10757
+ tmp = fn[ context ];
10758
+ context = fn;
10759
+ fn = tmp;
10760
+ }
10761
+
10762
+ // Quick check to determine if target is callable, in the spec
10763
+ // this throws a TypeError, but we will just return undefined.
10764
+ if ( !isFunction( fn ) ) {
10765
+ return undefined;
10766
+ }
10767
+
10768
+ // Simulated bind
10769
+ args = slice.call( arguments, 2 );
10770
+ proxy = function() {
10771
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10772
+ };
10773
+
10774
+ // Set the guid of unique handler to the same of original handler, so it can be removed
10775
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10776
+
10777
+ return proxy;
10778
+ };
10779
+
10186
10780
  jQuery.holdReady = function( hold ) {
10187
10781
  if ( hold ) {
10188
10782
  jQuery.readyWait++;
@@ -10193,7 +10787,32 @@ jQuery.holdReady = function( hold ) {
10193
10787
  jQuery.isArray = Array.isArray;
10194
10788
  jQuery.parseJSON = JSON.parse;
10195
10789
  jQuery.nodeName = nodeName;
10790
+ jQuery.isFunction = isFunction;
10791
+ jQuery.isWindow = isWindow;
10792
+ jQuery.camelCase = camelCase;
10793
+ jQuery.type = toType;
10794
+
10795
+ jQuery.now = Date.now;
10796
+
10797
+ jQuery.isNumeric = function( obj ) {
10196
10798
 
10799
+ // As of jQuery 3.0, isNumeric is limited to
10800
+ // strings and numbers (primitives or objects)
10801
+ // that can be coerced to finite numbers (gh-2662)
10802
+ var type = jQuery.type( obj );
10803
+ return ( type === "number" || type === "string" ) &&
10804
+
10805
+ // parseFloat NaNs numeric-cast false positives ("")
10806
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10807
+ // subtraction forces infinities to NaN
10808
+ !isNaN( obj - parseFloat( obj ) );
10809
+ };
10810
+
10811
+ jQuery.trim = function( text ) {
10812
+ return text == null ?
10813
+ "" :
10814
+ ( text + "" ).replace( rtrim, "" );
10815
+ };
10197
10816
 
10198
10817
 
10199
10818
 
@@ -10242,7 +10861,7 @@ jQuery.noConflict = function( deep ) {
10242
10861
  // Expose jQuery and $ identifiers, even in AMD
10243
10862
  // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10244
10863
  // and CommonJS for browser emulators (#13566)
10245
- if ( !noGlobal ) {
10864
+ if ( typeof noGlobal === "undefined" ) {
10246
10865
  window.jQuery = window.$ = jQuery;
10247
10866
  }
10248
10867