jquery-rails 4.4.0 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,15 +1,12 @@
1
1
  /*!
2
- * jQuery JavaScript Library v3.5.1
2
+ * jQuery JavaScript Library v3.7.0
3
3
  * https://jquery.com/
4
4
  *
5
- * Includes Sizzle.js
6
- * https://sizzlejs.com/
7
- *
8
- * Copyright JS Foundation and other contributors
5
+ * Copyright OpenJS Foundation and other contributors
9
6
  * Released under the MIT license
10
7
  * https://jquery.org/license
11
8
  *
12
- * Date: 2020-05-04T22:49Z
9
+ * Date: 2023-05-11T18:29Z
13
10
  */
14
11
  ( function( global, factory ) {
15
12
 
@@ -23,7 +20,7 @@
23
20
  // (such as Node.js), expose a factory as module.exports.
24
21
  // This accentuates the need for the creation of a real `window`.
25
22
  // e.g. var jQuery = require("jquery")(window);
26
- // See ticket #14549 for more info.
23
+ // See ticket trac-14549 for more info.
27
24
  module.exports = global.document ?
28
25
  factory( global, true ) :
29
26
  function( w ) {
@@ -76,12 +73,16 @@ var support = {};
76
73
 
77
74
  var isFunction = function isFunction( obj ) {
78
75
 
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
- };
76
+ // Support: Chrome <=57, Firefox <=52
77
+ // In some browsers, typeof returns "function" for HTML <object> elements
78
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
79
+ // We don't want to classify *any* DOM node as a function.
80
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
81
+ // Plus for old WebKit, typeof returns "function" for HTML collections
82
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
83
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
84
+ typeof obj.item !== "function";
85
+ };
85
86
 
86
87
 
87
88
  var isWindow = function isWindow( obj ) {
@@ -146,8 +147,9 @@ function toType( obj ) {
146
147
 
147
148
 
148
149
 
149
- var
150
- version = "3.5.1",
150
+ var version = "3.7.0",
151
+
152
+ rhtmlSuffix = /HTML$/i,
151
153
 
152
154
  // Define a local copy of jQuery
153
155
  jQuery = function( selector, context ) {
@@ -393,6 +395,33 @@ jQuery.extend( {
393
395
  return obj;
394
396
  },
395
397
 
398
+
399
+ // Retrieve the text value of an array of DOM nodes
400
+ text: function( elem ) {
401
+ var node,
402
+ ret = "",
403
+ i = 0,
404
+ nodeType = elem.nodeType;
405
+
406
+ if ( !nodeType ) {
407
+
408
+ // If no nodeType, this is expected to be an array
409
+ while ( ( node = elem[ i++ ] ) ) {
410
+
411
+ // Do not traverse comment nodes
412
+ ret += jQuery.text( node );
413
+ }
414
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
415
+ return elem.textContent;
416
+ } else if ( nodeType === 3 || nodeType === 4 ) {
417
+ return elem.nodeValue;
418
+ }
419
+
420
+ // Do not include comment or processing instruction nodes
421
+
422
+ return ret;
423
+ },
424
+
396
425
  // results is for internal usage only
397
426
  makeArray: function( arr, results ) {
398
427
  var ret = results || [];
@@ -401,7 +430,7 @@ jQuery.extend( {
401
430
  if ( isArrayLike( Object( arr ) ) ) {
402
431
  jQuery.merge( ret,
403
432
  typeof arr === "string" ?
404
- [ arr ] : arr
433
+ [ arr ] : arr
405
434
  );
406
435
  } else {
407
436
  push.call( ret, arr );
@@ -415,6 +444,15 @@ jQuery.extend( {
415
444
  return arr == null ? -1 : indexOf.call( arr, elem, i );
416
445
  },
417
446
 
447
+ isXMLDoc: function( elem ) {
448
+ var namespace = elem && elem.namespaceURI,
449
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
450
+
451
+ // Assume HTML when documentElement doesn't yet exist, such as inside
452
+ // document fragments.
453
+ return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
454
+ },
455
+
418
456
  // Support: Android <=4.0 only, PhantomJS 1 only
419
457
  // push.apply(_, arraylike) throws on ancient WebKit
420
458
  merge: function( first, second ) {
@@ -496,9 +534,9 @@ if ( typeof Symbol === "function" ) {
496
534
 
497
535
  // Populate the class2type map
498
536
  jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
499
- function( _i, name ) {
500
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
501
- } );
537
+ function( _i, name ) {
538
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
539
+ } );
502
540
 
503
541
  function isArrayLike( obj ) {
504
542
 
@@ -516,43 +554,98 @@ function isArrayLike( obj ) {
516
554
  return type === "array" || length === 0 ||
517
555
  typeof length === "number" && length > 0 && ( length - 1 ) in obj;
518
556
  }
519
- var Sizzle =
520
- /*!
521
- * Sizzle CSS Selector Engine v2.3.5
522
- * https://sizzlejs.com/
523
- *
524
- * Copyright JS Foundation and other contributors
525
- * Released under the MIT license
526
- * https://js.foundation/
527
- *
528
- * Date: 2020-03-14
529
- */
530
- ( function( window ) {
557
+
558
+
559
+ function nodeName( elem, name ) {
560
+
561
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
562
+
563
+ }
564
+ var pop = arr.pop;
565
+
566
+
567
+ var sort = arr.sort;
568
+
569
+
570
+ var splice = arr.splice;
571
+
572
+
573
+ var whitespace = "[\\x20\\t\\r\\n\\f]";
574
+
575
+
576
+ var rtrimCSS = new RegExp(
577
+ "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
578
+ "g"
579
+ );
580
+
581
+
582
+
583
+
584
+ // Note: an element does not contain itself
585
+ jQuery.contains = function( a, b ) {
586
+ var bup = b && b.parentNode;
587
+
588
+ return a === bup || !!( bup && bup.nodeType === 1 && (
589
+
590
+ // Support: IE 9 - 11+
591
+ // IE doesn't have `contains` on SVG.
592
+ a.contains ?
593
+ a.contains( bup ) :
594
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
595
+ ) );
596
+ };
597
+
598
+
599
+
600
+
601
+ // CSS string/identifier serialization
602
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
603
+ var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
604
+
605
+ function fcssescape( ch, asCodePoint ) {
606
+ if ( asCodePoint ) {
607
+
608
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
609
+ if ( ch === "\0" ) {
610
+ return "\uFFFD";
611
+ }
612
+
613
+ // Control characters and (dependent upon position) numbers get escaped as code points
614
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
615
+ }
616
+
617
+ // Other potentially-special ASCII characters get backslash-escaped
618
+ return "\\" + ch;
619
+ }
620
+
621
+ jQuery.escapeSelector = function( sel ) {
622
+ return ( sel + "" ).replace( rcssescape, fcssescape );
623
+ };
624
+
625
+
626
+
627
+
628
+ var preferredDoc = document,
629
+ pushNative = push;
630
+
631
+ ( function() {
632
+
531
633
  var i,
532
- support,
533
634
  Expr,
534
- getText,
535
- isXML,
536
- tokenize,
537
- compile,
538
- select,
539
635
  outermostContext,
540
636
  sortInput,
541
637
  hasDuplicate,
638
+ push = pushNative,
542
639
 
543
640
  // Local document vars
544
- setDocument,
545
641
  document,
546
- docElem,
642
+ documentElement,
547
643
  documentIsHTML,
548
644
  rbuggyQSA,
549
- rbuggyMatches,
550
645
  matches,
551
- contains,
552
646
 
553
647
  // Instance-specific data
554
- expando = "sizzle" + 1 * new Date(),
555
- preferredDoc = window.document,
648
+ expando = jQuery.expando,
556
649
  dirruns = 0,
557
650
  done = 0,
558
651
  classCache = createCache(),
@@ -566,47 +659,22 @@ var i,
566
659
  return 0;
567
660
  },
568
661
 
569
- // Instance methods
570
- hasOwn = ( {} ).hasOwnProperty,
571
- arr = [],
572
- pop = arr.pop,
573
- pushNative = arr.push,
574
- push = arr.push,
575
- slice = arr.slice,
576
-
577
- // Use a stripped-down indexOf as it's faster than native
578
- // https://jsperf.com/thor-indexof-vs-for/5
579
- indexOf = function( list, elem ) {
580
- var i = 0,
581
- len = list.length;
582
- for ( ; i < len; i++ ) {
583
- if ( list[ i ] === elem ) {
584
- return i;
585
- }
586
- }
587
- return -1;
588
- },
589
-
590
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
591
- "ismap|loop|multiple|open|readonly|required|scoped",
662
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
663
+ "loop|multiple|open|readonly|required|scoped",
592
664
 
593
665
  // Regular expressions
594
666
 
595
- // http://www.w3.org/TR/css3-selectors/#whitespace
596
- whitespace = "[\\x20\\t\\r\\n\\f]",
597
-
598
667
  // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
599
668
  identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
600
669
  "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
601
670
 
602
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
671
+ // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
603
672
  attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
604
673
 
605
674
  // Operator (capture 2)
606
675
  "*([*^$|!~]?=)" + whitespace +
607
676
 
608
- // "Attribute values must be CSS identifiers [capture 5]
609
- // or strings [capture 3 or capture 4]"
677
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
610
678
  "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
611
679
  whitespace + "*\\]",
612
680
 
@@ -625,101 +693,88 @@ var i,
625
693
 
626
694
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
627
695
  rwhitespace = new RegExp( whitespace + "+", "g" ),
628
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
629
- whitespace + "+$", "g" ),
630
696
 
631
697
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
632
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
633
- "*" ),
698
+ rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
699
+ whitespace + "*" ),
634
700
  rdescend = new RegExp( whitespace + "|>" ),
635
701
 
636
702
  rpseudo = new RegExp( pseudos ),
637
703
  ridentifier = new RegExp( "^" + identifier + "$" ),
638
704
 
639
705
  matchExpr = {
640
- "ID": new RegExp( "^#(" + identifier + ")" ),
641
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
642
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
643
- "ATTR": new RegExp( "^" + attributes ),
644
- "PSEUDO": new RegExp( "^" + pseudos ),
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" ),
648
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
706
+ ID: new RegExp( "^#(" + identifier + ")" ),
707
+ CLASS: new RegExp( "^\\.(" + identifier + ")" ),
708
+ TAG: new RegExp( "^(" + identifier + "|[*])" ),
709
+ ATTR: new RegExp( "^" + attributes ),
710
+ PSEUDO: new RegExp( "^" + pseudos ),
711
+ CHILD: new RegExp(
712
+ "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
713
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
714
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
715
+ bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
649
716
 
650
717
  // For use in libraries implementing .is()
651
718
  // We use this for POS matching in `select`
652
- "needsContext": new RegExp( "^" + whitespace +
719
+ needsContext: new RegExp( "^" + whitespace +
653
720
  "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
654
721
  "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
655
722
  },
656
723
 
657
- rhtml = /HTML$/i,
658
724
  rinputs = /^(?:input|select|textarea|button)$/i,
659
725
  rheader = /^h\d$/i,
660
726
 
661
- rnative = /^[^{]+\{\s*\[native \w/,
662
-
663
727
  // Easily-parseable/retrievable ID or TAG or CLASS selectors
664
728
  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
665
729
 
666
730
  rsibling = /[+~]/,
667
731
 
668
732
  // CSS escapes
669
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
670
- runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
733
+ // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
734
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
735
+ "?|\\\\([^\\r\\n\\f])", "g" ),
671
736
  funescape = function( escape, nonHex ) {
672
737
  var high = "0x" + escape.slice( 1 ) - 0x10000;
673
738
 
674
- return nonHex ?
739
+ if ( nonHex ) {
675
740
 
676
741
  // 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
683
- high < 0 ?
684
- String.fromCharCode( high + 0x10000 ) :
685
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
686
- },
687
-
688
- // CSS string/identifier serialization
689
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
690
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
691
- fcssescape = function( ch, asCodePoint ) {
692
- if ( asCodePoint ) {
693
-
694
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
695
- if ( ch === "\0" ) {
696
- return "\uFFFD";
697
- }
698
-
699
- // Control characters and (dependent upon position) numbers get escaped as code points
700
- return ch.slice( 0, -1 ) + "\\" +
701
- ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
742
+ return nonHex;
702
743
  }
703
744
 
704
- // Other potentially-special ASCII characters get backslash-escaped
705
- return "\\" + ch;
745
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
746
+ // Support: IE <=11+
747
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
748
+ // surrogate pair
749
+ return high < 0 ?
750
+ String.fromCharCode( high + 0x10000 ) :
751
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
706
752
  },
707
753
 
708
- // Used for iframes
709
- // See setDocument()
754
+ // Used for iframes; see `setDocument`.
755
+ // Support: IE 9 - 11+, Edge 12 - 18+
710
756
  // Removing the function wrapper causes a "Permission Denied"
711
- // error in IE
757
+ // error in IE/Edge.
712
758
  unloadHandler = function() {
713
759
  setDocument();
714
760
  },
715
761
 
716
762
  inDisabledFieldset = addCombinator(
717
763
  function( elem ) {
718
- return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
764
+ return elem.disabled === true && nodeName( elem, "fieldset" );
719
765
  },
720
766
  { dir: "parentNode", next: "legend" }
721
767
  );
722
768
 
769
+ // Support: IE <=9 only
770
+ // Accessing document.activeElement can throw unexpectedly
771
+ // https://bugs.jquery.com/ticket/13393
772
+ function safeActiveElement() {
773
+ try {
774
+ return document.activeElement;
775
+ } catch ( err ) { }
776
+ }
777
+
723
778
  // Optimize for push.apply( _, NodeList )
724
779
  try {
725
780
  push.apply(
@@ -727,32 +782,22 @@ try {
727
782
  preferredDoc.childNodes
728
783
  );
729
784
 
730
- // Support: Android<4.0
785
+ // Support: Android <=4.0
731
786
  // Detect silently failing push.apply
732
787
  // eslint-disable-next-line no-unused-expressions
733
788
  arr[ preferredDoc.childNodes.length ].nodeType;
734
789
  } catch ( e ) {
735
- push = { apply: arr.length ?
736
-
737
- // Leverage slice if possible
738
- function( target, els ) {
790
+ push = {
791
+ apply: function( target, els ) {
739
792
  pushNative.apply( target, slice.call( els ) );
740
- } :
741
-
742
- // Support: IE<9
743
- // Otherwise append directly
744
- function( target, els ) {
745
- var j = target.length,
746
- i = 0;
747
-
748
- // Can't trust NodeList.length
749
- while ( ( target[ j++ ] = els[ i++ ] ) ) {}
750
- target.length = j - 1;
793
+ },
794
+ call: function( target ) {
795
+ pushNative.apply( target, slice.call( arguments, 1 ) );
751
796
  }
752
797
  };
753
798
  }
754
799
 
755
- function Sizzle( selector, context, results, seed ) {
800
+ function find( selector, context, results, seed ) {
756
801
  var m, i, elem, nid, match, groups, newSelector,
757
802
  newContext = context && context.ownerDocument,
758
803
 
@@ -786,11 +831,10 @@ function Sizzle( selector, context, results, seed ) {
786
831
  if ( nodeType === 9 ) {
787
832
  if ( ( elem = context.getElementById( m ) ) ) {
788
833
 
789
- // Support: IE, Opera, Webkit
790
- // TODO: identify versions
834
+ // Support: IE 9 only
791
835
  // getElementById can match elements by name instead of ID
792
836
  if ( elem.id === m ) {
793
- results.push( elem );
837
+ push.call( results, elem );
794
838
  return results;
795
839
  }
796
840
  } else {
@@ -800,14 +844,13 @@ function Sizzle( selector, context, results, seed ) {
800
844
  // Element context
801
845
  } else {
802
846
 
803
- // Support: IE, Opera, Webkit
804
- // TODO: identify versions
847
+ // Support: IE 9 only
805
848
  // getElementById can match elements by name instead of ID
806
849
  if ( newContext && ( elem = newContext.getElementById( m ) ) &&
807
- contains( context, elem ) &&
850
+ find.contains( context, elem ) &&
808
851
  elem.id === m ) {
809
852
 
810
- results.push( elem );
853
+ push.call( results, elem );
811
854
  return results;
812
855
  }
813
856
  }
@@ -818,22 +861,15 @@ function Sizzle( selector, context, results, seed ) {
818
861
  return results;
819
862
 
820
863
  // Class selector
821
- } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
822
- context.getElementsByClassName ) {
823
-
864
+ } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
824
865
  push.apply( results, context.getElementsByClassName( m ) );
825
866
  return results;
826
867
  }
827
868
  }
828
869
 
829
870
  // Take advantage of querySelectorAll
830
- if ( support.qsa &&
831
- !nonnativeSelectorCache[ selector + " " ] &&
832
- ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
833
-
834
- // Support: IE 8 only
835
- // Exclude object elements
836
- ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
871
+ if ( !nonnativeSelectorCache[ selector + " " ] &&
872
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
837
873
 
838
874
  newSelector = selector;
839
875
  newContext = context;
@@ -846,7 +882,7 @@ function Sizzle( selector, context, results, seed ) {
846
882
  // as such selectors are not recognized by querySelectorAll.
847
883
  // Thanks to Andrew Dupont for this technique.
848
884
  if ( nodeType === 1 &&
849
- ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
885
+ ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
850
886
 
851
887
  // Expand context for sibling selectors
852
888
  newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
@@ -854,11 +890,15 @@ function Sizzle( selector, context, results, seed ) {
854
890
 
855
891
  // We can use :scope instead of the ID hack if the browser
856
892
  // supports it & if we're not changing the context.
857
- if ( newContext !== context || !support.scope ) {
893
+ // Support: IE 11+, Edge 17 - 18+
894
+ // IE/Edge sometimes throw a "Permission denied" error when
895
+ // strict-comparing two documents; shallow comparisons work.
896
+ // eslint-disable-next-line eqeqeq
897
+ if ( newContext != context || !support.scope ) {
858
898
 
859
899
  // Capture the context ID, setting it first if necessary
860
900
  if ( ( nid = context.getAttribute( "id" ) ) ) {
861
- nid = nid.replace( rcssescape, fcssescape );
901
+ nid = jQuery.escapeSelector( nid );
862
902
  } else {
863
903
  context.setAttribute( "id", ( nid = expando ) );
864
904
  }
@@ -891,7 +931,7 @@ function Sizzle( selector, context, results, seed ) {
891
931
  }
892
932
 
893
933
  // All others
894
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
934
+ return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
895
935
  }
896
936
 
897
937
  /**
@@ -905,7 +945,8 @@ function createCache() {
905
945
 
906
946
  function cache( key, value ) {
907
947
 
908
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
948
+ // Use (key + " ") to avoid collision with native prototype properties
949
+ // (see https://github.com/jquery/sizzle/issues/157)
909
950
  if ( keys.push( key + " " ) > Expr.cacheLength ) {
910
951
 
911
952
  // Only keep the most recent entries
@@ -917,7 +958,7 @@ function createCache() {
917
958
  }
918
959
 
919
960
  /**
920
- * Mark a function for special use by Sizzle
961
+ * Mark a function for special use by jQuery selector module
921
962
  * @param {Function} fn The function to mark
922
963
  */
923
964
  function markFunction( fn ) {
@@ -948,56 +989,13 @@ function assert( fn ) {
948
989
  }
949
990
  }
950
991
 
951
- /**
952
- * Adds the same handler for all of the specified attrs
953
- * @param {String} attrs Pipe-separated list of attributes
954
- * @param {Function} handler The method that will be applied
955
- */
956
- function addHandle( attrs, handler ) {
957
- var arr = attrs.split( "|" ),
958
- i = arr.length;
959
-
960
- while ( i-- ) {
961
- Expr.attrHandle[ arr[ i ] ] = handler;
962
- }
963
- }
964
-
965
- /**
966
- * Checks document order of two siblings
967
- * @param {Element} a
968
- * @param {Element} b
969
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
970
- */
971
- function siblingCheck( a, b ) {
972
- var cur = b && a,
973
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
974
- a.sourceIndex - b.sourceIndex;
975
-
976
- // Use IE sourceIndex if available on both nodes
977
- if ( diff ) {
978
- return diff;
979
- }
980
-
981
- // Check if b follows a
982
- if ( cur ) {
983
- while ( ( cur = cur.nextSibling ) ) {
984
- if ( cur === b ) {
985
- return -1;
986
- }
987
- }
988
- }
989
-
990
- return a ? 1 : -1;
991
- }
992
-
993
992
  /**
994
993
  * Returns a function to use in pseudos for input types
995
994
  * @param {String} type
996
995
  */
997
996
  function createInputPseudo( type ) {
998
997
  return function( elem ) {
999
- var name = elem.nodeName.toLowerCase();
1000
- return name === "input" && elem.type === type;
998
+ return nodeName( elem, "input" ) && elem.type === type;
1001
999
  };
1002
1000
  }
1003
1001
 
@@ -1007,8 +1005,8 @@ function createInputPseudo( type ) {
1007
1005
  */
1008
1006
  function createButtonPseudo( type ) {
1009
1007
  return function( elem ) {
1010
- var name = elem.nodeName.toLowerCase();
1011
- return ( name === "input" || name === "button" ) && elem.type === type;
1008
+ return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
1009
+ elem.type === type;
1012
1010
  };
1013
1011
  }
1014
1012
 
@@ -1044,14 +1042,13 @@ function createDisabledPseudo( disabled ) {
1044
1042
  }
1045
1043
  }
1046
1044
 
1047
- // Support: IE 6 - 11
1045
+ // Support: IE 6 - 11+
1048
1046
  // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1049
1047
  return elem.isDisabled === disabled ||
1050
1048
 
1051
1049
  // Where there is no isDisabled, check manually
1052
- /* jshint -W018 */
1053
1050
  elem.isDisabled !== !disabled &&
1054
- inDisabledFieldset( elem ) === disabled;
1051
+ inDisabledFieldset( elem ) === disabled;
1055
1052
  }
1056
1053
 
1057
1054
  return elem.disabled === disabled;
@@ -1091,7 +1088,7 @@ function createPositionalPseudo( fn ) {
1091
1088
  }
1092
1089
 
1093
1090
  /**
1094
- * Checks a node for validity as a Sizzle context
1091
+ * Checks a node for validity as a jQuery selector context
1095
1092
  * @param {Element|Object=} context
1096
1093
  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1097
1094
  */
@@ -1099,31 +1096,13 @@ function testContext( context ) {
1099
1096
  return context && typeof context.getElementsByTagName !== "undefined" && context;
1100
1097
  }
1101
1098
 
1102
- // Expose support vars for convenience
1103
- support = Sizzle.support = {};
1104
-
1105
- /**
1106
- * Detects XML nodes
1107
- * @param {Element|Object} elem An element or a document
1108
- * @returns {Boolean} True iff elem is a non-HTML XML node
1109
- */
1110
- isXML = Sizzle.isXML = function( elem ) {
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" );
1118
- };
1119
-
1120
1099
  /**
1121
1100
  * Sets document-related variables once based on the current document
1122
- * @param {Element|Object} [doc] An element or document object to use to set the document
1101
+ * @param {Element|Object} [node] An element or document object to use to set the document
1123
1102
  * @returns {Object} Returns the current document
1124
1103
  */
1125
- setDocument = Sizzle.setDocument = function( node ) {
1126
- var hasCompare, subWindow,
1104
+ function setDocument( node ) {
1105
+ var subWindow,
1127
1106
  doc = node ? node.ownerDocument || node : preferredDoc;
1128
1107
 
1129
1108
  // Return early if doc is invalid or already selected
@@ -1137,11 +1116,17 @@ setDocument = Sizzle.setDocument = function( node ) {
1137
1116
 
1138
1117
  // Update global variables
1139
1118
  document = doc;
1140
- docElem = document.documentElement;
1141
- documentIsHTML = !isXML( document );
1119
+ documentElement = document.documentElement;
1120
+ documentIsHTML = !jQuery.isXMLDoc( document );
1121
+
1122
+ // Support: iOS 7 only, IE 9 - 11+
1123
+ // Older browsers didn't support unprefixed `matches`.
1124
+ matches = documentElement.matches ||
1125
+ documentElement.webkitMatchesSelector ||
1126
+ documentElement.msMatchesSelector;
1142
1127
 
1143
1128
  // Support: IE 9 - 11+, Edge 12 - 18+
1144
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1129
+ // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936)
1145
1130
  // Support: IE 11+, Edge 17 - 18+
1146
1131
  // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1147
1132
  // two documents; shallow comparisons work.
@@ -1149,75 +1134,67 @@ setDocument = Sizzle.setDocument = function( node ) {
1149
1134
  if ( preferredDoc != document &&
1150
1135
  ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1151
1136
 
1152
- // Support: IE 11, Edge
1153
- if ( subWindow.addEventListener ) {
1154
- subWindow.addEventListener( "unload", unloadHandler, false );
1155
-
1156
- // Support: IE 9 - 10 only
1157
- } else if ( subWindow.attachEvent ) {
1158
- subWindow.attachEvent( "onunload", unloadHandler );
1159
- }
1137
+ // Support: IE 9 - 11+, Edge 12 - 18+
1138
+ subWindow.addEventListener( "unload", unloadHandler );
1160
1139
  }
1161
1140
 
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;
1141
+ // Support: IE <10
1142
+ // Check if getElementById returns elements by name
1143
+ // The broken getElementById methods don't pick up programmatically-set names,
1144
+ // so use a roundabout getElementsByName test
1145
+ support.getById = assert( function( el ) {
1146
+ documentElement.appendChild( el ).id = jQuery.expando;
1147
+ return !document.getElementsByName ||
1148
+ !document.getElementsByName( jQuery.expando ).length;
1171
1149
  } );
1172
1150
 
1173
- /* Attributes
1174
- ---------------------------------------------------------------------- */
1175
-
1176
- // Support: IE<8
1177
- // Verify that getAttribute really returns attributes and not properties
1178
- // (excepting IE8 booleans)
1179
- support.attributes = assert( function( el ) {
1180
- el.className = "i";
1181
- return !el.getAttribute( "className" );
1151
+ // Support: IE 9 only
1152
+ // Check to see if it's possible to do matchesSelector
1153
+ // on a disconnected node.
1154
+ support.disconnectedMatch = assert( function( el ) {
1155
+ return matches.call( el, "*" );
1182
1156
  } );
1183
1157
 
1184
- /* getElement(s)By*
1185
- ---------------------------------------------------------------------- */
1186
-
1187
- // Check if getElementsByTagName("*") returns only elements
1188
- support.getElementsByTagName = assert( function( el ) {
1189
- el.appendChild( document.createComment( "" ) );
1190
- return !el.getElementsByTagName( "*" ).length;
1158
+ // Support: IE 9 - 11+, Edge 12 - 18+
1159
+ // IE/Edge don't support the :scope pseudo-class.
1160
+ support.scope = assert( function() {
1161
+ return document.querySelectorAll( ":scope" );
1191
1162
  } );
1192
1163
 
1193
- // Support: IE<9
1194
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1195
-
1196
- // Support: IE<10
1197
- // Check if getElementById returns elements by name
1198
- // The broken getElementById methods don't pick up programmatically-set names,
1199
- // so use a roundabout getElementsByName test
1200
- support.getById = assert( function( el ) {
1201
- docElem.appendChild( el ).id = expando;
1202
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
1164
+ // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
1165
+ // Make sure the `:has()` argument is parsed unforgivingly.
1166
+ // We include `*` in the test to detect buggy implementations that are
1167
+ // _selectively_ forgiving (specifically when the list includes at least
1168
+ // one valid selector).
1169
+ // Note that we treat complete lack of support for `:has()` as if it were
1170
+ // spec-compliant support, which is fine because use of `:has()` in such
1171
+ // environments will fail in the qSA path and fall back to jQuery traversal
1172
+ // anyway.
1173
+ support.cssHas = assert( function() {
1174
+ try {
1175
+ document.querySelector( ":has(*,:jqfake)" );
1176
+ return false;
1177
+ } catch ( e ) {
1178
+ return true;
1179
+ }
1203
1180
  } );
1204
1181
 
1205
1182
  // ID filter and find
1206
1183
  if ( support.getById ) {
1207
- Expr.filter[ "ID" ] = function( id ) {
1184
+ Expr.filter.ID = function( id ) {
1208
1185
  var attrId = id.replace( runescape, funescape );
1209
1186
  return function( elem ) {
1210
1187
  return elem.getAttribute( "id" ) === attrId;
1211
1188
  };
1212
1189
  };
1213
- Expr.find[ "ID" ] = function( id, context ) {
1190
+ Expr.find.ID = function( id, context ) {
1214
1191
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1215
1192
  var elem = context.getElementById( id );
1216
1193
  return elem ? [ elem ] : [];
1217
1194
  }
1218
1195
  };
1219
1196
  } else {
1220
- Expr.filter[ "ID" ] = function( id ) {
1197
+ Expr.filter.ID = function( id ) {
1221
1198
  var attrId = id.replace( runescape, funescape );
1222
1199
  return function( elem ) {
1223
1200
  var node = typeof elem.getAttributeNode !== "undefined" &&
@@ -1228,7 +1205,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1228
1205
 
1229
1206
  // Support: IE 6 - 7 only
1230
1207
  // getElementById is not reliable as a find shortcut
1231
- Expr.find[ "ID" ] = function( id, context ) {
1208
+ Expr.find.ID = function( id, context ) {
1232
1209
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1233
1210
  var node, i, elems,
1234
1211
  elem = context.getElementById( id );
@@ -1258,40 +1235,18 @@ setDocument = Sizzle.setDocument = function( node ) {
1258
1235
  }
1259
1236
 
1260
1237
  // Tag
1261
- Expr.find[ "TAG" ] = support.getElementsByTagName ?
1262
- function( tag, context ) {
1263
- if ( typeof context.getElementsByTagName !== "undefined" ) {
1264
- return context.getElementsByTagName( tag );
1265
-
1266
- // DocumentFragment nodes don't have gEBTN
1267
- } else if ( support.qsa ) {
1268
- return context.querySelectorAll( tag );
1269
- }
1270
- } :
1271
-
1272
- function( tag, context ) {
1273
- var elem,
1274
- tmp = [],
1275
- i = 0,
1276
-
1277
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1278
- results = context.getElementsByTagName( tag );
1279
-
1280
- // Filter out possible comments
1281
- if ( tag === "*" ) {
1282
- while ( ( elem = results[ i++ ] ) ) {
1283
- if ( elem.nodeType === 1 ) {
1284
- tmp.push( elem );
1285
- }
1286
- }
1238
+ Expr.find.TAG = function( tag, context ) {
1239
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
1240
+ return context.getElementsByTagName( tag );
1287
1241
 
1288
- return tmp;
1289
- }
1290
- return results;
1291
- };
1242
+ // DocumentFragment nodes don't have gEBTN
1243
+ } else {
1244
+ return context.querySelectorAll( tag );
1245
+ }
1246
+ };
1292
1247
 
1293
1248
  // Class
1294
- Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
1249
+ Expr.find.CLASS = function( className, context ) {
1295
1250
  if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1296
1251
  return context.getElementsByClassName( className );
1297
1252
  }
@@ -1302,177 +1257,94 @@ setDocument = Sizzle.setDocument = function( node ) {
1302
1257
 
1303
1258
  // QSA and matchesSelector support
1304
1259
 
1305
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1306
- rbuggyMatches = [];
1307
-
1308
- // qSa(:focus) reports false when true (Chrome 21)
1309
- // We allow this because of a bug in IE8/9 that throws an error
1310
- // whenever `document.activeElement` is accessed on an iframe
1311
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
1312
- // See https://bugs.jquery.com/ticket/13378
1313
1260
  rbuggyQSA = [];
1314
1261
 
1315
- if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1316
-
1317
- // Build QSA regex
1318
- // Regex strategy adopted from Diego Perini
1319
- assert( function( el ) {
1320
-
1321
- var input;
1322
-
1323
- // Select is set to empty string on purpose
1324
- // This is to test IE's treatment of not explicitly
1325
- // setting a boolean content attribute,
1326
- // since its presence should be enough
1327
- // https://bugs.jquery.com/ticket/12359
1328
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1329
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1330
- "<option selected=''></option></select>";
1331
-
1332
- // Support: IE8, Opera 11-12.16
1333
- // Nothing should be selected when empty strings follow ^= or $= or *=
1334
- // The test attribute must be unknown in Opera but "safe" for WinRT
1335
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1336
- if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
1337
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1338
- }
1339
-
1340
- // Support: IE8
1341
- // Boolean attributes and "value" are not treated correctly
1342
- if ( !el.querySelectorAll( "[selected]" ).length ) {
1343
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1344
- }
1345
-
1346
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1347
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
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 + "*(?:''|\"\")" );
1362
- }
1363
-
1364
- // Webkit/Opera - :checked should return selected option elements
1365
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1366
- // IE8 throws error here and will not see later tests
1367
- if ( !el.querySelectorAll( ":checked" ).length ) {
1368
- rbuggyQSA.push( ":checked" );
1369
- }
1370
-
1371
- // Support: Safari 8+, iOS 8+
1372
- // https://bugs.webkit.org/show_bug.cgi?id=136851
1373
- // In-page `selector#id sibling-combinator selector` fails
1374
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1375
- rbuggyQSA.push( ".#.+[+~]" );
1376
- }
1377
-
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 ) {
1385
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
1386
- "<select disabled='disabled'><option/></select>";
1262
+ // Build QSA regex
1263
+ // Regex strategy adopted from Diego Perini
1264
+ assert( function( el ) {
1387
1265
 
1388
- // Support: Windows 8 Native Apps
1389
- // The type and name attributes are restricted during .innerHTML assignment
1390
- var input = document.createElement( "input" );
1391
- input.setAttribute( "type", "hidden" );
1392
- el.appendChild( input ).setAttribute( "name", "D" );
1266
+ var input;
1393
1267
 
1394
- // Support: IE8
1395
- // Enforce case-sensitivity of name attribute
1396
- if ( el.querySelectorAll( "[name=d]" ).length ) {
1397
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1398
- }
1268
+ documentElement.appendChild( el ).innerHTML =
1269
+ "<a id='" + expando + "' href='' disabled='disabled'></a>" +
1270
+ "<select id='" + expando + "-\r\\' disabled='disabled'>" +
1271
+ "<option selected=''></option></select>";
1399
1272
 
1400
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1401
- // IE8 throws error here and will not see later tests
1402
- if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1403
- rbuggyQSA.push( ":enabled", ":disabled" );
1404
- }
1273
+ // Support: iOS <=7 - 8 only
1274
+ // Boolean attributes and "value" are not treated correctly in some XML documents
1275
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
1276
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1277
+ }
1405
1278
 
1406
- // Support: IE9-11+
1407
- // IE's :disabled selector does not pick up the children of disabled fieldsets
1408
- docElem.appendChild( el ).disabled = true;
1409
- if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1410
- rbuggyQSA.push( ":enabled", ":disabled" );
1411
- }
1279
+ // Support: iOS <=7 - 8 only
1280
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1281
+ rbuggyQSA.push( "~=" );
1282
+ }
1412
1283
 
1413
- // Support: Opera 10 - 11 only
1414
- // Opera 10-11 does not throw on post-comma invalid pseudos
1415
- el.querySelectorAll( "*,:x" );
1416
- rbuggyQSA.push( ",.*:" );
1417
- } );
1418
- }
1284
+ // Support: iOS 8 only
1285
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
1286
+ // In-page `selector#id sibling-combinator selector` fails
1287
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1288
+ rbuggyQSA.push( ".#.+[+~]" );
1289
+ }
1419
1290
 
1420
- if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1421
- docElem.webkitMatchesSelector ||
1422
- docElem.mozMatchesSelector ||
1423
- docElem.oMatchesSelector ||
1424
- docElem.msMatchesSelector ) ) ) ) {
1291
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1292
+ // In some of the document kinds, these selectors wouldn't work natively.
1293
+ // This is probably OK but for backwards compatibility we want to maintain
1294
+ // handling them through jQuery traversal in jQuery 3.x.
1295
+ if ( !el.querySelectorAll( ":checked" ).length ) {
1296
+ rbuggyQSA.push( ":checked" );
1297
+ }
1425
1298
 
1426
- assert( function( el ) {
1299
+ // Support: Windows 8 Native Apps
1300
+ // The type and name attributes are restricted during .innerHTML assignment
1301
+ input = document.createElement( "input" );
1302
+ input.setAttribute( "type", "hidden" );
1303
+ el.appendChild( input ).setAttribute( "name", "D" );
1304
+
1305
+ // Support: IE 9 - 11+
1306
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
1307
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1308
+ // In some of the document kinds, these selectors wouldn't work natively.
1309
+ // This is probably OK but for backwards compatibility we want to maintain
1310
+ // handling them through jQuery traversal in jQuery 3.x.
1311
+ documentElement.appendChild( el ).disabled = true;
1312
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1313
+ rbuggyQSA.push( ":enabled", ":disabled" );
1314
+ }
1315
+
1316
+ // Support: IE 11+, Edge 15 - 18+
1317
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1318
+ // Adding a temporary attribute to the document before the selection works
1319
+ // around the issue.
1320
+ // Interestingly, IE 10 & older don't seem to have the issue.
1321
+ input = document.createElement( "input" );
1322
+ input.setAttribute( "name", "" );
1323
+ el.appendChild( input );
1324
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
1325
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1326
+ whitespace + "*(?:''|\"\")" );
1327
+ }
1328
+ } );
1427
1329
 
1428
- // Check to see if it's possible to do matchesSelector
1429
- // on a disconnected node (IE 9)
1430
- support.disconnectedMatch = matches.call( el, "*" );
1330
+ if ( !support.cssHas ) {
1431
1331
 
1432
- // This should fail with an exception
1433
- // Gecko does not error, returns false instead
1434
- matches.call( el, "[s!='']:x" );
1435
- rbuggyMatches.push( "!=", pseudos );
1436
- } );
1332
+ // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
1333
+ // Our regular `try-catch` mechanism fails to detect natively-unsupported
1334
+ // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
1335
+ // in browsers that parse the `:has()` argument as a forgiving selector list.
1336
+ // https://drafts.csswg.org/selectors/#relational now requires the argument
1337
+ // to be parsed unforgivingly, but browsers have not yet fully adjusted.
1338
+ rbuggyQSA.push( ":has" );
1437
1339
  }
1438
1340
 
1439
1341
  rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1440
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
1441
-
1442
- /* Contains
1443
- ---------------------------------------------------------------------- */
1444
- hasCompare = rnative.test( docElem.compareDocumentPosition );
1445
-
1446
- // Element contains another
1447
- // Purposefully self-exclusive
1448
- // As in, an element does not contain itself
1449
- contains = hasCompare || rnative.test( docElem.contains ) ?
1450
- function( a, b ) {
1451
- var adown = a.nodeType === 9 ? a.documentElement : a,
1452
- bup = b && b.parentNode;
1453
- return a === bup || !!( bup && bup.nodeType === 1 && (
1454
- adown.contains ?
1455
- adown.contains( bup ) :
1456
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1457
- ) );
1458
- } :
1459
- function( a, b ) {
1460
- if ( b ) {
1461
- while ( ( b = b.parentNode ) ) {
1462
- if ( b === a ) {
1463
- return true;
1464
- }
1465
- }
1466
- }
1467
- return false;
1468
- };
1469
1342
 
1470
1343
  /* Sorting
1471
1344
  ---------------------------------------------------------------------- */
1472
1345
 
1473
1346
  // Document order sorting
1474
- sortOrder = hasCompare ?
1475
- function( a, b ) {
1347
+ sortOrder = function( a, b ) {
1476
1348
 
1477
1349
  // Flag for duplicate removal
1478
1350
  if ( a === b ) {
@@ -1506,8 +1378,8 @@ setDocument = Sizzle.setDocument = function( node ) {
1506
1378
  // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1507
1379
  // two documents; shallow comparisons work.
1508
1380
  // eslint-disable-next-line eqeqeq
1509
- if ( a == document || a.ownerDocument == preferredDoc &&
1510
- contains( preferredDoc, a ) ) {
1381
+ if ( a === document || a.ownerDocument == preferredDoc &&
1382
+ find.contains( preferredDoc, a ) ) {
1511
1383
  return -1;
1512
1384
  }
1513
1385
 
@@ -1515,100 +1387,33 @@ setDocument = Sizzle.setDocument = function( node ) {
1515
1387
  // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1516
1388
  // two documents; shallow comparisons work.
1517
1389
  // eslint-disable-next-line eqeqeq
1518
- if ( b == document || b.ownerDocument == preferredDoc &&
1519
- contains( preferredDoc, b ) ) {
1390
+ if ( b === document || b.ownerDocument == preferredDoc &&
1391
+ find.contains( preferredDoc, b ) ) {
1520
1392
  return 1;
1521
1393
  }
1522
1394
 
1523
1395
  // Maintain original order
1524
1396
  return sortInput ?
1525
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1397
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1526
1398
  0;
1527
1399
  }
1528
1400
 
1529
1401
  return compare & 4 ? -1 : 1;
1530
- } :
1531
- function( a, b ) {
1532
-
1533
- // Exit early if the nodes are identical
1534
- if ( a === b ) {
1535
- hasDuplicate = true;
1536
- return 0;
1537
- }
1538
-
1539
- var cur,
1540
- i = 0,
1541
- aup = a.parentNode,
1542
- bup = b.parentNode,
1543
- ap = [ a ],
1544
- bp = [ b ];
1545
-
1546
- // Parentless nodes are either documents or disconnected
1547
- if ( !aup || !bup ) {
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 */
1556
- aup ? -1 :
1557
- bup ? 1 :
1558
- sortInput ?
1559
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1560
- 0;
1561
-
1562
- // If the nodes are siblings, we can do a quick check
1563
- } else if ( aup === bup ) {
1564
- return siblingCheck( a, b );
1565
- }
1566
-
1567
- // Otherwise we need full lists of their ancestors for comparison
1568
- cur = a;
1569
- while ( ( cur = cur.parentNode ) ) {
1570
- ap.unshift( cur );
1571
- }
1572
- cur = b;
1573
- while ( ( cur = cur.parentNode ) ) {
1574
- bp.unshift( cur );
1575
- }
1576
-
1577
- // Walk down the tree looking for a discrepancy
1578
- while ( ap[ i ] === bp[ i ] ) {
1579
- i++;
1580
- }
1581
-
1582
- return i ?
1583
-
1584
- // Do a sibling check if the nodes have a common ancestor
1585
- siblingCheck( ap[ i ], bp[ i ] ) :
1586
-
1587
- // Otherwise nodes in our document sort first
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 */
1595
- 0;
1596
1402
  };
1597
1403
 
1598
1404
  return document;
1599
- };
1405
+ }
1600
1406
 
1601
- Sizzle.matches = function( expr, elements ) {
1602
- return Sizzle( expr, null, null, elements );
1407
+ find.matches = function( expr, elements ) {
1408
+ return find( expr, null, null, elements );
1603
1409
  };
1604
1410
 
1605
- Sizzle.matchesSelector = function( elem, expr ) {
1411
+ find.matchesSelector = function( elem, expr ) {
1606
1412
  setDocument( elem );
1607
1413
 
1608
- if ( support.matchesSelector && documentIsHTML &&
1414
+ if ( documentIsHTML &&
1609
1415
  !nonnativeSelectorCache[ expr + " " ] &&
1610
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1611
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1416
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1612
1417
 
1613
1418
  try {
1614
1419
  var ret = matches.call( elem, expr );
@@ -1616,9 +1421,9 @@ Sizzle.matchesSelector = function( elem, expr ) {
1616
1421
  // IE 9's matchesSelector returns false on disconnected nodes
1617
1422
  if ( ret || support.disconnectedMatch ||
1618
1423
 
1619
- // As well, disconnected nodes are said to be in a document
1620
- // fragment in IE 9
1621
- elem.document && elem.document.nodeType !== 11 ) {
1424
+ // As well, disconnected nodes are said to be in a document
1425
+ // fragment in IE 9
1426
+ elem.document && elem.document.nodeType !== 11 ) {
1622
1427
  return ret;
1623
1428
  }
1624
1429
  } catch ( e ) {
@@ -1626,10 +1431,10 @@ Sizzle.matchesSelector = function( elem, expr ) {
1626
1431
  }
1627
1432
  }
1628
1433
 
1629
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
1434
+ return find( expr, document, null, [ elem ] ).length > 0;
1630
1435
  };
1631
1436
 
1632
- Sizzle.contains = function( context, elem ) {
1437
+ find.contains = function( context, elem ) {
1633
1438
 
1634
1439
  // Set document vars if needed
1635
1440
  // Support: IE 11+, Edge 17 - 18+
@@ -1639,10 +1444,11 @@ Sizzle.contains = function( context, elem ) {
1639
1444
  if ( ( context.ownerDocument || context ) != document ) {
1640
1445
  setDocument( context );
1641
1446
  }
1642
- return contains( context, elem );
1447
+ return jQuery.contains( context, elem );
1643
1448
  };
1644
1449
 
1645
- Sizzle.attr = function( elem, name ) {
1450
+
1451
+ find.attr = function( elem, name ) {
1646
1452
 
1647
1453
  // Set document vars if needed
1648
1454
  // Support: IE 11+, Edge 17 - 18+
@@ -1655,25 +1461,19 @@ Sizzle.attr = function( elem, name ) {
1655
1461
 
1656
1462
  var fn = Expr.attrHandle[ name.toLowerCase() ],
1657
1463
 
1658
- // Don't get fooled by Object.prototype properties (jQuery #13807)
1464
+ // Don't get fooled by Object.prototype properties (see trac-13807)
1659
1465
  val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1660
1466
  fn( elem, name, !documentIsHTML ) :
1661
1467
  undefined;
1662
1468
 
1663
- return val !== undefined ?
1664
- val :
1665
- support.attributes || !documentIsHTML ?
1666
- elem.getAttribute( name ) :
1667
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
1668
- val.value :
1669
- null;
1670
- };
1469
+ if ( val !== undefined ) {
1470
+ return val;
1471
+ }
1671
1472
 
1672
- Sizzle.escape = function( sel ) {
1673
- return ( sel + "" ).replace( rcssescape, fcssescape );
1473
+ return elem.getAttribute( name );
1674
1474
  };
1675
1475
 
1676
- Sizzle.error = function( msg ) {
1476
+ find.error = function( msg ) {
1677
1477
  throw new Error( "Syntax error, unrecognized expression: " + msg );
1678
1478
  };
1679
1479
 
@@ -1681,16 +1481,20 @@ Sizzle.error = function( msg ) {
1681
1481
  * Document sorting and removing duplicates
1682
1482
  * @param {ArrayLike} results
1683
1483
  */
1684
- Sizzle.uniqueSort = function( results ) {
1484
+ jQuery.uniqueSort = function( results ) {
1685
1485
  var elem,
1686
1486
  duplicates = [],
1687
1487
  j = 0,
1688
1488
  i = 0;
1689
1489
 
1690
1490
  // Unless we *know* we can detect duplicates, assume their presence
1691
- hasDuplicate = !support.detectDuplicates;
1692
- sortInput = !support.sortStable && results.slice( 0 );
1693
- results.sort( sortOrder );
1491
+ //
1492
+ // Support: Android <=4.0+
1493
+ // Testing for detecting duplicates is unpredictable so instead assume we can't
1494
+ // depend on duplicate detection in all browsers without a stable sort.
1495
+ hasDuplicate = !support.sortStable;
1496
+ sortInput = !support.sortStable && slice.call( results, 0 );
1497
+ sort.call( results, sortOrder );
1694
1498
 
1695
1499
  if ( hasDuplicate ) {
1696
1500
  while ( ( elem = results[ i++ ] ) ) {
@@ -1699,7 +1503,7 @@ Sizzle.uniqueSort = function( results ) {
1699
1503
  }
1700
1504
  }
1701
1505
  while ( j-- ) {
1702
- results.splice( duplicates[ j ], 1 );
1506
+ splice.call( results, duplicates[ j ], 1 );
1703
1507
  }
1704
1508
  }
1705
1509
 
@@ -1710,47 +1514,11 @@ Sizzle.uniqueSort = function( results ) {
1710
1514
  return results;
1711
1515
  };
1712
1516
 
1713
- /**
1714
- * Utility function for retrieving the text value of an array of DOM nodes
1715
- * @param {Array|Element} elem
1716
- */
1717
- getText = Sizzle.getText = function( elem ) {
1718
- var node,
1719
- ret = "",
1720
- i = 0,
1721
- nodeType = elem.nodeType;
1722
-
1723
- if ( !nodeType ) {
1724
-
1725
- // If no nodeType, this is expected to be an array
1726
- while ( ( node = elem[ i++ ] ) ) {
1727
-
1728
- // Do not traverse comment nodes
1729
- ret += getText( node );
1730
- }
1731
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1732
-
1733
- // Use textContent for elements
1734
- // innerText usage removed for consistency of new lines (jQuery #11153)
1735
- if ( typeof elem.textContent === "string" ) {
1736
- return elem.textContent;
1737
- } else {
1738
-
1739
- // Traverse its children
1740
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1741
- ret += getText( elem );
1742
- }
1743
- }
1744
- } else if ( nodeType === 3 || nodeType === 4 ) {
1745
- return elem.nodeValue;
1746
- }
1747
-
1748
- // Do not include comment or processing instruction nodes
1749
-
1750
- return ret;
1517
+ jQuery.fn.uniqueSort = function() {
1518
+ return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
1751
1519
  };
1752
1520
 
1753
- Expr = Sizzle.selectors = {
1521
+ Expr = jQuery.expr = {
1754
1522
 
1755
1523
  // Can be adjusted by the user
1756
1524
  cacheLength: 50,
@@ -1771,12 +1539,12 @@ Expr = Sizzle.selectors = {
1771
1539
  },
1772
1540
 
1773
1541
  preFilter: {
1774
- "ATTR": function( match ) {
1542
+ ATTR: function( match ) {
1775
1543
  match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1776
1544
 
1777
1545
  // Move the given value to match[3] whether quoted or unquoted
1778
- match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1779
- match[ 5 ] || "" ).replace( runescape, funescape );
1546
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
1547
+ .replace( runescape, funescape );
1780
1548
 
1781
1549
  if ( match[ 2 ] === "~=" ) {
1782
1550
  match[ 3 ] = " " + match[ 3 ] + " ";
@@ -1785,7 +1553,7 @@ Expr = Sizzle.selectors = {
1785
1553
  return match.slice( 0, 4 );
1786
1554
  },
1787
1555
 
1788
- "CHILD": function( match ) {
1556
+ CHILD: function( match ) {
1789
1557
 
1790
1558
  /* matches from matchExpr["CHILD"]
1791
1559
  1 type (only|nth|...)
@@ -1803,29 +1571,30 @@ Expr = Sizzle.selectors = {
1803
1571
 
1804
1572
  // nth-* requires argument
1805
1573
  if ( !match[ 3 ] ) {
1806
- Sizzle.error( match[ 0 ] );
1574
+ find.error( match[ 0 ] );
1807
1575
  }
1808
1576
 
1809
1577
  // numeric x and y parameters for Expr.filter.CHILD
1810
1578
  // remember that false/true cast respectively to 0/1
1811
1579
  match[ 4 ] = +( match[ 4 ] ?
1812
1580
  match[ 5 ] + ( match[ 6 ] || 1 ) :
1813
- 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1581
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
1582
+ );
1814
1583
  match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1815
1584
 
1816
- // other types prohibit arguments
1585
+ // other types prohibit arguments
1817
1586
  } else if ( match[ 3 ] ) {
1818
- Sizzle.error( match[ 0 ] );
1587
+ find.error( match[ 0 ] );
1819
1588
  }
1820
1589
 
1821
1590
  return match;
1822
1591
  },
1823
1592
 
1824
- "PSEUDO": function( match ) {
1593
+ PSEUDO: function( match ) {
1825
1594
  var excess,
1826
1595
  unquoted = !match[ 6 ] && match[ 2 ];
1827
1596
 
1828
- if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
1597
+ if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
1829
1598
  return null;
1830
1599
  }
1831
1600
 
@@ -1854,36 +1623,36 @@ Expr = Sizzle.selectors = {
1854
1623
 
1855
1624
  filter: {
1856
1625
 
1857
- "TAG": function( nodeNameSelector ) {
1858
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1626
+ TAG: function( nodeNameSelector ) {
1627
+ var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1859
1628
  return nodeNameSelector === "*" ?
1860
1629
  function() {
1861
1630
  return true;
1862
1631
  } :
1863
1632
  function( elem ) {
1864
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1633
+ return nodeName( elem, expectedNodeName );
1865
1634
  };
1866
1635
  },
1867
1636
 
1868
- "CLASS": function( className ) {
1637
+ CLASS: function( className ) {
1869
1638
  var pattern = classCache[ className + " " ];
1870
1639
 
1871
1640
  return pattern ||
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
- );
1641
+ ( pattern = new RegExp( "(^|" + whitespace + ")" + className +
1642
+ "(" + whitespace + "|$)" ) ) &&
1643
+ classCache( className, function( elem ) {
1644
+ return pattern.test(
1645
+ typeof elem.className === "string" && elem.className ||
1646
+ typeof elem.getAttribute !== "undefined" &&
1647
+ elem.getAttribute( "class" ) ||
1648
+ ""
1649
+ );
1881
1650
  } );
1882
1651
  },
1883
1652
 
1884
- "ATTR": function( name, operator, check ) {
1653
+ ATTR: function( name, operator, check ) {
1885
1654
  return function( elem ) {
1886
- var result = Sizzle.attr( elem, name );
1655
+ var result = find.attr( elem, name );
1887
1656
 
1888
1657
  if ( result == null ) {
1889
1658
  return operator === "!=";
@@ -1894,22 +1663,34 @@ Expr = Sizzle.selectors = {
1894
1663
 
1895
1664
  result += "";
1896
1665
 
1897
- /* eslint-disable max-len */
1898
-
1899
- return operator === "=" ? result === check :
1900
- operator === "!=" ? result !== check :
1901
- operator === "^=" ? check && result.indexOf( check ) === 0 :
1902
- operator === "*=" ? check && result.indexOf( check ) > -1 :
1903
- operator === "$=" ? check && result.slice( -check.length ) === check :
1904
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1905
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1906
- false;
1907
- /* eslint-enable max-len */
1666
+ if ( operator === "=" ) {
1667
+ return result === check;
1668
+ }
1669
+ if ( operator === "!=" ) {
1670
+ return result !== check;
1671
+ }
1672
+ if ( operator === "^=" ) {
1673
+ return check && result.indexOf( check ) === 0;
1674
+ }
1675
+ if ( operator === "*=" ) {
1676
+ return check && result.indexOf( check ) > -1;
1677
+ }
1678
+ if ( operator === "$=" ) {
1679
+ return check && result.slice( -check.length ) === check;
1680
+ }
1681
+ if ( operator === "~=" ) {
1682
+ return ( " " + result.replace( rwhitespace, " " ) + " " )
1683
+ .indexOf( check ) > -1;
1684
+ }
1685
+ if ( operator === "|=" ) {
1686
+ return result === check || result.slice( 0, check.length + 1 ) === check + "-";
1687
+ }
1908
1688
 
1689
+ return false;
1909
1690
  };
1910
1691
  },
1911
1692
 
1912
- "CHILD": function( type, what, _argument, first, last ) {
1693
+ CHILD: function( type, what, _argument, first, last ) {
1913
1694
  var simple = type.slice( 0, 3 ) !== "nth",
1914
1695
  forward = type.slice( -4 ) !== "last",
1915
1696
  ofType = what === "of-type";
@@ -1922,7 +1703,7 @@ Expr = Sizzle.selectors = {
1922
1703
  } :
1923
1704
 
1924
1705
  function( elem, _context, xml ) {
1925
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
1706
+ var cache, outerCache, node, nodeIndex, start,
1926
1707
  dir = simple !== forward ? "nextSibling" : "previousSibling",
1927
1708
  parent = elem.parentNode,
1928
1709
  name = ofType && elem.nodeName.toLowerCase(),
@@ -1937,7 +1718,7 @@ Expr = Sizzle.selectors = {
1937
1718
  node = elem;
1938
1719
  while ( ( node = node[ dir ] ) ) {
1939
1720
  if ( ofType ?
1940
- node.nodeName.toLowerCase() === name :
1721
+ nodeName( node, name ) :
1941
1722
  node.nodeType === 1 ) {
1942
1723
 
1943
1724
  return false;
@@ -1956,17 +1737,8 @@ Expr = Sizzle.selectors = {
1956
1737
  if ( forward && useCache ) {
1957
1738
 
1958
1739
  // Seek `elem` from a previously-cached index
1959
-
1960
- // ...in a gzip-friendly way
1961
- node = parent;
1962
- outerCache = node[ expando ] || ( node[ expando ] = {} );
1963
-
1964
- // Support: IE <9 only
1965
- // Defend against cloned attroperties (jQuery gh-1709)
1966
- uniqueCache = outerCache[ node.uniqueID ] ||
1967
- ( outerCache[ node.uniqueID ] = {} );
1968
-
1969
- cache = uniqueCache[ type ] || [];
1740
+ outerCache = parent[ expando ] || ( parent[ expando ] = {} );
1741
+ cache = outerCache[ type ] || [];
1970
1742
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1971
1743
  diff = nodeIndex && cache[ 2 ];
1972
1744
  node = nodeIndex && parent.childNodes[ nodeIndex ];
@@ -1978,7 +1750,7 @@ Expr = Sizzle.selectors = {
1978
1750
 
1979
1751
  // When found, cache indexes on `parent` and break
1980
1752
  if ( node.nodeType === 1 && ++diff && node === elem ) {
1981
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1753
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1982
1754
  break;
1983
1755
  }
1984
1756
  }
@@ -1987,17 +1759,8 @@ Expr = Sizzle.selectors = {
1987
1759
 
1988
1760
  // Use previously-cached element index if available
1989
1761
  if ( useCache ) {
1990
-
1991
- // ...in a gzip-friendly way
1992
- node = elem;
1993
- outerCache = node[ expando ] || ( node[ expando ] = {} );
1994
-
1995
- // Support: IE <9 only
1996
- // Defend against cloned attroperties (jQuery gh-1709)
1997
- uniqueCache = outerCache[ node.uniqueID ] ||
1998
- ( outerCache[ node.uniqueID ] = {} );
1999
-
2000
- cache = uniqueCache[ type ] || [];
1762
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
1763
+ cache = outerCache[ type ] || [];
2001
1764
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2002
1765
  diff = nodeIndex;
2003
1766
  }
@@ -2011,7 +1774,7 @@ Expr = Sizzle.selectors = {
2011
1774
  ( diff = nodeIndex = 0 ) || start.pop() ) ) {
2012
1775
 
2013
1776
  if ( ( ofType ?
2014
- node.nodeName.toLowerCase() === name :
1777
+ nodeName( node, name ) :
2015
1778
  node.nodeType === 1 ) &&
2016
1779
  ++diff ) {
2017
1780
 
@@ -2019,13 +1782,7 @@ Expr = Sizzle.selectors = {
2019
1782
  if ( useCache ) {
2020
1783
  outerCache = node[ expando ] ||
2021
1784
  ( node[ expando ] = {} );
2022
-
2023
- // Support: IE <9 only
2024
- // Defend against cloned attroperties (jQuery gh-1709)
2025
- uniqueCache = outerCache[ node.uniqueID ] ||
2026
- ( outerCache[ node.uniqueID ] = {} );
2027
-
2028
- uniqueCache[ type ] = [ dirruns, diff ];
1785
+ outerCache[ type ] = [ dirruns, diff ];
2029
1786
  }
2030
1787
 
2031
1788
  if ( node === elem ) {
@@ -2043,19 +1800,19 @@ Expr = Sizzle.selectors = {
2043
1800
  };
2044
1801
  },
2045
1802
 
2046
- "PSEUDO": function( pseudo, argument ) {
1803
+ PSEUDO: function( pseudo, argument ) {
2047
1804
 
2048
1805
  // pseudo-class names are case-insensitive
2049
- // http://www.w3.org/TR/selectors/#pseudo-classes
1806
+ // https://www.w3.org/TR/selectors/#pseudo-classes
2050
1807
  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2051
1808
  // Remember that setFilters inherits from pseudos
2052
1809
  var args,
2053
1810
  fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2054
- Sizzle.error( "unsupported pseudo: " + pseudo );
1811
+ find.error( "unsupported pseudo: " + pseudo );
2055
1812
 
2056
1813
  // The user may use createPseudo to indicate that
2057
1814
  // arguments are needed to create the filter function
2058
- // just as Sizzle does
1815
+ // just as jQuery does
2059
1816
  if ( fn[ expando ] ) {
2060
1817
  return fn( argument );
2061
1818
  }
@@ -2069,7 +1826,7 @@ Expr = Sizzle.selectors = {
2069
1826
  matched = fn( seed, argument ),
2070
1827
  i = matched.length;
2071
1828
  while ( i-- ) {
2072
- idx = indexOf( seed, matched[ i ] );
1829
+ idx = indexOf.call( seed, matched[ i ] );
2073
1830
  seed[ idx ] = !( matches[ idx ] = matched[ i ] );
2074
1831
  }
2075
1832
  } ) :
@@ -2085,14 +1842,14 @@ Expr = Sizzle.selectors = {
2085
1842
  pseudos: {
2086
1843
 
2087
1844
  // Potentially complex pseudos
2088
- "not": markFunction( function( selector ) {
1845
+ not: markFunction( function( selector ) {
2089
1846
 
2090
1847
  // Trim the selector passed to compile
2091
1848
  // to avoid treating leading and trailing
2092
1849
  // spaces as combinators
2093
1850
  var input = [],
2094
1851
  results = [],
2095
- matcher = compile( selector.replace( rtrim, "$1" ) );
1852
+ matcher = compile( selector.replace( rtrimCSS, "$1" ) );
2096
1853
 
2097
1854
  return matcher[ expando ] ?
2098
1855
  markFunction( function( seed, matches, _context, xml ) {
@@ -2111,22 +1868,23 @@ Expr = Sizzle.selectors = {
2111
1868
  input[ 0 ] = elem;
2112
1869
  matcher( input, null, xml, results );
2113
1870
 
2114
- // Don't keep the element (issue #299)
1871
+ // Don't keep the element
1872
+ // (see https://github.com/jquery/sizzle/issues/299)
2115
1873
  input[ 0 ] = null;
2116
1874
  return !results.pop();
2117
1875
  };
2118
1876
  } ),
2119
1877
 
2120
- "has": markFunction( function( selector ) {
1878
+ has: markFunction( function( selector ) {
2121
1879
  return function( elem ) {
2122
- return Sizzle( selector, elem ).length > 0;
1880
+ return find( selector, elem ).length > 0;
2123
1881
  };
2124
1882
  } ),
2125
1883
 
2126
- "contains": markFunction( function( text ) {
1884
+ contains: markFunction( function( text ) {
2127
1885
  text = text.replace( runescape, funescape );
2128
1886
  return function( elem ) {
2129
- return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
1887
+ return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
2130
1888
  };
2131
1889
  } ),
2132
1890
 
@@ -2136,12 +1894,12 @@ Expr = Sizzle.selectors = {
2136
1894
  // or beginning with the identifier C immediately followed by "-".
2137
1895
  // The matching of C against the element's language value is performed case-insensitively.
2138
1896
  // The identifier C does not have to be a valid language name."
2139
- // http://www.w3.org/TR/selectors/#lang-pseudo
2140
- "lang": markFunction( function( lang ) {
1897
+ // https://www.w3.org/TR/selectors/#lang-pseudo
1898
+ lang: markFunction( function( lang ) {
2141
1899
 
2142
1900
  // lang value must be a valid identifier
2143
1901
  if ( !ridentifier.test( lang || "" ) ) {
2144
- Sizzle.error( "unsupported lang: " + lang );
1902
+ find.error( "unsupported lang: " + lang );
2145
1903
  }
2146
1904
  lang = lang.replace( runescape, funescape ).toLowerCase();
2147
1905
  return function( elem ) {
@@ -2160,38 +1918,39 @@ Expr = Sizzle.selectors = {
2160
1918
  } ),
2161
1919
 
2162
1920
  // Miscellaneous
2163
- "target": function( elem ) {
1921
+ target: function( elem ) {
2164
1922
  var hash = window.location && window.location.hash;
2165
1923
  return hash && hash.slice( 1 ) === elem.id;
2166
1924
  },
2167
1925
 
2168
- "root": function( elem ) {
2169
- return elem === docElem;
1926
+ root: function( elem ) {
1927
+ return elem === documentElement;
2170
1928
  },
2171
1929
 
2172
- "focus": function( elem ) {
2173
- return elem === document.activeElement &&
2174
- ( !document.hasFocus || document.hasFocus() ) &&
1930
+ focus: function( elem ) {
1931
+ return elem === safeActiveElement() &&
1932
+ document.hasFocus() &&
2175
1933
  !!( elem.type || elem.href || ~elem.tabIndex );
2176
1934
  },
2177
1935
 
2178
1936
  // Boolean properties
2179
- "enabled": createDisabledPseudo( false ),
2180
- "disabled": createDisabledPseudo( true ),
1937
+ enabled: createDisabledPseudo( false ),
1938
+ disabled: createDisabledPseudo( true ),
2181
1939
 
2182
- "checked": function( elem ) {
1940
+ checked: function( elem ) {
2183
1941
 
2184
1942
  // In CSS3, :checked should return both checked and selected elements
2185
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2186
- var nodeName = elem.nodeName.toLowerCase();
2187
- return ( nodeName === "input" && !!elem.checked ) ||
2188
- ( nodeName === "option" && !!elem.selected );
1943
+ // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1944
+ return ( nodeName( elem, "input" ) && !!elem.checked ) ||
1945
+ ( nodeName( elem, "option" ) && !!elem.selected );
2189
1946
  },
2190
1947
 
2191
- "selected": function( elem ) {
1948
+ selected: function( elem ) {
2192
1949
 
2193
- // Accessing this property makes selected-by-default
2194
- // options in Safari work properly
1950
+ // Support: IE <=11+
1951
+ // Accessing the selectedIndex property
1952
+ // forces the browser to treat the default option as
1953
+ // selected when in an optgroup.
2195
1954
  if ( elem.parentNode ) {
2196
1955
  // eslint-disable-next-line no-unused-expressions
2197
1956
  elem.parentNode.selectedIndex;
@@ -2201,9 +1960,9 @@ Expr = Sizzle.selectors = {
2201
1960
  },
2202
1961
 
2203
1962
  // Contents
2204
- "empty": function( elem ) {
1963
+ empty: function( elem ) {
2205
1964
 
2206
- // http://www.w3.org/TR/selectors/#empty-pseudo
1965
+ // https://www.w3.org/TR/selectors/#empty-pseudo
2207
1966
  // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2208
1967
  // but not by others (comment: 8; processing instruction: 7; etc.)
2209
1968
  // nodeType < 6 works because attributes (2) do not appear as children
@@ -2215,49 +1974,49 @@ Expr = Sizzle.selectors = {
2215
1974
  return true;
2216
1975
  },
2217
1976
 
2218
- "parent": function( elem ) {
2219
- return !Expr.pseudos[ "empty" ]( elem );
1977
+ parent: function( elem ) {
1978
+ return !Expr.pseudos.empty( elem );
2220
1979
  },
2221
1980
 
2222
1981
  // Element/input types
2223
- "header": function( elem ) {
1982
+ header: function( elem ) {
2224
1983
  return rheader.test( elem.nodeName );
2225
1984
  },
2226
1985
 
2227
- "input": function( elem ) {
1986
+ input: function( elem ) {
2228
1987
  return rinputs.test( elem.nodeName );
2229
1988
  },
2230
1989
 
2231
- "button": function( elem ) {
2232
- var name = elem.nodeName.toLowerCase();
2233
- return name === "input" && elem.type === "button" || name === "button";
1990
+ button: function( elem ) {
1991
+ return nodeName( elem, "input" ) && elem.type === "button" ||
1992
+ nodeName( elem, "button" );
2234
1993
  },
2235
1994
 
2236
- "text": function( elem ) {
1995
+ text: function( elem ) {
2237
1996
  var attr;
2238
- return elem.nodeName.toLowerCase() === "input" &&
2239
- elem.type === "text" &&
1997
+ return nodeName( elem, "input" ) && elem.type === "text" &&
2240
1998
 
2241
- // Support: IE<8
2242
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1999
+ // Support: IE <10 only
2000
+ // New HTML5 attribute values (e.g., "search") appear
2001
+ // with elem.type === "text"
2243
2002
  ( ( attr = elem.getAttribute( "type" ) ) == null ||
2244
2003
  attr.toLowerCase() === "text" );
2245
2004
  },
2246
2005
 
2247
2006
  // Position-in-collection
2248
- "first": createPositionalPseudo( function() {
2007
+ first: createPositionalPseudo( function() {
2249
2008
  return [ 0 ];
2250
2009
  } ),
2251
2010
 
2252
- "last": createPositionalPseudo( function( _matchIndexes, length ) {
2011
+ last: createPositionalPseudo( function( _matchIndexes, length ) {
2253
2012
  return [ length - 1 ];
2254
2013
  } ),
2255
2014
 
2256
- "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2015
+ eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
2257
2016
  return [ argument < 0 ? argument + length : argument ];
2258
2017
  } ),
2259
2018
 
2260
- "even": createPositionalPseudo( function( matchIndexes, length ) {
2019
+ even: createPositionalPseudo( function( matchIndexes, length ) {
2261
2020
  var i = 0;
2262
2021
  for ( ; i < length; i += 2 ) {
2263
2022
  matchIndexes.push( i );
@@ -2265,7 +2024,7 @@ Expr = Sizzle.selectors = {
2265
2024
  return matchIndexes;
2266
2025
  } ),
2267
2026
 
2268
- "odd": createPositionalPseudo( function( matchIndexes, length ) {
2027
+ odd: createPositionalPseudo( function( matchIndexes, length ) {
2269
2028
  var i = 1;
2270
2029
  for ( ; i < length; i += 2 ) {
2271
2030
  matchIndexes.push( i );
@@ -2273,19 +2032,24 @@ Expr = Sizzle.selectors = {
2273
2032
  return matchIndexes;
2274
2033
  } ),
2275
2034
 
2276
- "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2277
- var i = argument < 0 ?
2278
- argument + length :
2279
- argument > length ?
2280
- length :
2281
- argument;
2035
+ lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2036
+ var i;
2037
+
2038
+ if ( argument < 0 ) {
2039
+ i = argument + length;
2040
+ } else if ( argument > length ) {
2041
+ i = length;
2042
+ } else {
2043
+ i = argument;
2044
+ }
2045
+
2282
2046
  for ( ; --i >= 0; ) {
2283
2047
  matchIndexes.push( i );
2284
2048
  }
2285
2049
  return matchIndexes;
2286
2050
  } ),
2287
2051
 
2288
- "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2052
+ gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2289
2053
  var i = argument < 0 ? argument + length : argument;
2290
2054
  for ( ; ++i < length; ) {
2291
2055
  matchIndexes.push( i );
@@ -2295,7 +2059,7 @@ Expr = Sizzle.selectors = {
2295
2059
  }
2296
2060
  };
2297
2061
 
2298
- Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
2062
+ Expr.pseudos.nth = Expr.pseudos.eq;
2299
2063
 
2300
2064
  // Add button/input type pseudos
2301
2065
  for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2310,7 +2074,7 @@ function setFilters() {}
2310
2074
  setFilters.prototype = Expr.filters = Expr.pseudos;
2311
2075
  Expr.setFilters = new setFilters();
2312
2076
 
2313
- tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2077
+ function tokenize( selector, parseOnly ) {
2314
2078
  var matched, match, tokens, type,
2315
2079
  soFar, groups, preFilters,
2316
2080
  cached = tokenCache[ selector + " " ];
@@ -2338,13 +2102,13 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2338
2102
  matched = false;
2339
2103
 
2340
2104
  // Combinators
2341
- if ( ( match = rcombinators.exec( soFar ) ) ) {
2105
+ if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
2342
2106
  matched = match.shift();
2343
2107
  tokens.push( {
2344
2108
  value: matched,
2345
2109
 
2346
2110
  // Cast descendant combinators to space
2347
- type: match[ 0 ].replace( rtrim, " " )
2111
+ type: match[ 0 ].replace( rtrimCSS, " " )
2348
2112
  } );
2349
2113
  soFar = soFar.slice( matched.length );
2350
2114
  }
@@ -2371,14 +2135,16 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2371
2135
  // Return the length of the invalid excess
2372
2136
  // if we're just parsing
2373
2137
  // Otherwise, throw an error or return tokens
2374
- return parseOnly ?
2375
- soFar.length :
2376
- soFar ?
2377
- Sizzle.error( selector ) :
2138
+ if ( parseOnly ) {
2139
+ return soFar.length;
2140
+ }
2378
2141
 
2379
- // Cache the tokens
2380
- tokenCache( selector, groups ).slice( 0 );
2381
- };
2142
+ return soFar ?
2143
+ find.error( selector ) :
2144
+
2145
+ // Cache the tokens
2146
+ tokenCache( selector, groups ).slice( 0 );
2147
+ }
2382
2148
 
2383
2149
  function toSelector( tokens ) {
2384
2150
  var i = 0,
@@ -2411,7 +2177,7 @@ function addCombinator( matcher, combinator, base ) {
2411
2177
 
2412
2178
  // Check against all ancestor/preceding elements
2413
2179
  function( elem, context, xml ) {
2414
- var oldCache, uniqueCache, outerCache,
2180
+ var oldCache, outerCache,
2415
2181
  newCache = [ dirruns, doneName ];
2416
2182
 
2417
2183
  // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
@@ -2428,14 +2194,9 @@ function addCombinator( matcher, combinator, base ) {
2428
2194
  if ( elem.nodeType === 1 || checkNonElements ) {
2429
2195
  outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2430
2196
 
2431
- // Support: IE <9 only
2432
- // Defend against cloned attroperties (jQuery gh-1709)
2433
- uniqueCache = outerCache[ elem.uniqueID ] ||
2434
- ( outerCache[ elem.uniqueID ] = {} );
2435
-
2436
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
2197
+ if ( skip && nodeName( elem, skip ) ) {
2437
2198
  elem = elem[ dir ] || elem;
2438
- } else if ( ( oldCache = uniqueCache[ key ] ) &&
2199
+ } else if ( ( oldCache = outerCache[ key ] ) &&
2439
2200
  oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2440
2201
 
2441
2202
  // Assign to newCache so results back-propagate to previous elements
@@ -2443,7 +2204,7 @@ function addCombinator( matcher, combinator, base ) {
2443
2204
  } else {
2444
2205
 
2445
2206
  // Reuse newcache so results back-propagate to previous elements
2446
- uniqueCache[ key ] = newCache;
2207
+ outerCache[ key ] = newCache;
2447
2208
 
2448
2209
  // A match means we're done; a fail means we have to keep checking
2449
2210
  if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
@@ -2475,7 +2236,7 @@ function multipleContexts( selector, contexts, results ) {
2475
2236
  var i = 0,
2476
2237
  len = contexts.length;
2477
2238
  for ( ; i < len; i++ ) {
2478
- Sizzle( selector, contexts[ i ], results );
2239
+ find( selector, contexts[ i ], results );
2479
2240
  }
2480
2241
  return results;
2481
2242
  }
@@ -2509,38 +2270,37 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2509
2270
  postFinder = setMatcher( postFinder, postSelector );
2510
2271
  }
2511
2272
  return markFunction( function( seed, results, context, xml ) {
2512
- var temp, i, elem,
2273
+ var temp, i, elem, matcherOut,
2513
2274
  preMap = [],
2514
2275
  postMap = [],
2515
2276
  preexisting = results.length,
2516
2277
 
2517
2278
  // Get initial elements from seed or context
2518
- elems = seed || multipleContexts(
2519
- selector || "*",
2520
- context.nodeType ? [ context ] : context,
2521
- []
2522
- ),
2279
+ elems = seed ||
2280
+ multipleContexts( selector || "*",
2281
+ context.nodeType ? [ context ] : context, [] ),
2523
2282
 
2524
2283
  // Prefilter to get matcher input, preserving a map for seed-results synchronization
2525
2284
  matcherIn = preFilter && ( seed || !selector ) ?
2526
2285
  condense( elems, preMap, preFilter, context, xml ) :
2527
- elems,
2286
+ elems;
2528
2287
 
2529
- matcherOut = matcher ?
2288
+ if ( matcher ) {
2530
2289
 
2531
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2532
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2290
+ // If we have a postFinder, or filtered seed, or non-seed postFilter
2291
+ // or preexisting results,
2292
+ matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2533
2293
 
2534
- // ...intermediate processing is necessary
2535
- [] :
2294
+ // ...intermediate processing is necessary
2295
+ [] :
2536
2296
 
2537
- // ...otherwise use results directly
2538
- results :
2539
- matcherIn;
2297
+ // ...otherwise use results directly
2298
+ results;
2540
2299
 
2541
- // Find primary matches
2542
- if ( matcher ) {
2300
+ // Find primary matches
2543
2301
  matcher( matcherIn, matcherOut, context, xml );
2302
+ } else {
2303
+ matcherOut = matcherIn;
2544
2304
  }
2545
2305
 
2546
2306
  // Apply postFilter
@@ -2578,7 +2338,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2578
2338
  i = matcherOut.length;
2579
2339
  while ( i-- ) {
2580
2340
  if ( ( elem = matcherOut[ i ] ) &&
2581
- ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
2341
+ ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
2582
2342
 
2583
2343
  seed[ temp ] = !( results[ temp ] = elem );
2584
2344
  }
@@ -2613,15 +2373,21 @@ function matcherFromTokens( tokens ) {
2613
2373
  return elem === checkContext;
2614
2374
  }, implicitRelative, true ),
2615
2375
  matchAnyContext = addCombinator( function( elem ) {
2616
- return indexOf( checkContext, elem ) > -1;
2376
+ return indexOf.call( checkContext, elem ) > -1;
2617
2377
  }, implicitRelative, true ),
2618
2378
  matchers = [ function( elem, context, xml ) {
2619
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2379
+
2380
+ // Support: IE 11+, Edge 17 - 18+
2381
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2382
+ // two documents; shallow comparisons work.
2383
+ // eslint-disable-next-line eqeqeq
2384
+ var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
2620
2385
  ( checkContext = context ).nodeType ?
2621
2386
  matchContext( elem, context, xml ) :
2622
2387
  matchAnyContext( elem, context, xml ) );
2623
2388
 
2624
- // Avoid hanging onto element (issue #299)
2389
+ // Avoid hanging onto element
2390
+ // (see https://github.com/jquery/sizzle/issues/299)
2625
2391
  checkContext = null;
2626
2392
  return ret;
2627
2393
  } ];
@@ -2646,11 +2412,10 @@ function matcherFromTokens( tokens ) {
2646
2412
  i > 1 && elementMatcher( matchers ),
2647
2413
  i > 1 && toSelector(
2648
2414
 
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 === " " ? "*" : "" } )
2653
- ).replace( rtrim, "$1" ),
2415
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2416
+ tokens.slice( 0, i - 1 )
2417
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2418
+ ).replace( rtrimCSS, "$1" ),
2654
2419
  matcher,
2655
2420
  i < j && matcherFromTokens( tokens.slice( i, j ) ),
2656
2421
  j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
@@ -2676,7 +2441,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2676
2441
  contextBackup = outermostContext,
2677
2442
 
2678
2443
  // We must always have either seed elements or outermost context
2679
- elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2444
+ elems = seed || byElement && Expr.find.TAG( "*", outermost ),
2680
2445
 
2681
2446
  // Use integer dirruns iff this is the outermost matcher
2682
2447
  dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
@@ -2692,8 +2457,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2692
2457
  }
2693
2458
 
2694
2459
  // Add elements passing elementMatchers directly to results
2695
- // Support: IE<9, Safari
2696
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2460
+ // Support: iOS <=7 - 9 only
2461
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
2462
+ // elements by id. (see trac-14142)
2697
2463
  for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2698
2464
  if ( byElement && elem ) {
2699
2465
  j = 0;
@@ -2708,7 +2474,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2708
2474
  }
2709
2475
  while ( ( matcher = elementMatchers[ j++ ] ) ) {
2710
2476
  if ( matcher( elem, context || document, xml ) ) {
2711
- results.push( elem );
2477
+ push.call( results, elem );
2712
2478
  break;
2713
2479
  }
2714
2480
  }
@@ -2771,7 +2537,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2771
2537
  if ( outermost && !seed && setMatched.length > 0 &&
2772
2538
  ( matchedCount + setMatchers.length ) > 1 ) {
2773
2539
 
2774
- Sizzle.uniqueSort( results );
2540
+ jQuery.uniqueSort( results );
2775
2541
  }
2776
2542
  }
2777
2543
 
@@ -2789,7 +2555,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2789
2555
  superMatcher;
2790
2556
  }
2791
2557
 
2792
- compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2558
+ function compile( selector, match /* Internal Use Only */ ) {
2793
2559
  var i,
2794
2560
  setMatchers = [],
2795
2561
  elementMatchers = [],
@@ -2812,27 +2578,25 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2812
2578
  }
2813
2579
 
2814
2580
  // Cache the compiled function
2815
- cached = compilerCache(
2816
- selector,
2817
- matcherFromGroupMatchers( elementMatchers, setMatchers )
2818
- );
2581
+ cached = compilerCache( selector,
2582
+ matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2819
2583
 
2820
2584
  // Save selector and tokenization
2821
2585
  cached.selector = selector;
2822
2586
  }
2823
2587
  return cached;
2824
- };
2588
+ }
2825
2589
 
2826
2590
  /**
2827
- * A low-level selection function that works with Sizzle's compiled
2591
+ * A low-level selection function that works with jQuery's compiled
2828
2592
  * selector functions
2829
2593
  * @param {String|Function} selector A selector or a pre-compiled
2830
- * selector function built with Sizzle.compile
2594
+ * selector function built with jQuery selector compile
2831
2595
  * @param {Element} context
2832
2596
  * @param {Array} [results]
2833
2597
  * @param {Array} [seed] A set of elements to match against
2834
2598
  */
2835
- select = Sizzle.select = function( selector, context, results, seed ) {
2599
+ function select( selector, context, results, seed ) {
2836
2600
  var i, tokens, token, type, find,
2837
2601
  compiled = typeof selector === "function" && selector,
2838
2602
  match = !seed && tokenize( ( selector = compiled.selector || selector ) );
@@ -2846,10 +2610,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2846
2610
  // Reduce context if the leading compound selector is an ID
2847
2611
  tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2848
2612
  if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2849
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2613
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2850
2614
 
2851
- context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2852
- .replace( runescape, funescape ), context ) || [] )[ 0 ];
2615
+ context = ( Expr.find.ID(
2616
+ token.matches[ 0 ].replace( runescape, funescape ),
2617
+ context
2618
+ ) || [] )[ 0 ];
2853
2619
  if ( !context ) {
2854
2620
  return results;
2855
2621
 
@@ -2862,7 +2628,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2862
2628
  }
2863
2629
 
2864
2630
  // Fetch a seed set for right-to-left matching
2865
- i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
2631
+ i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
2866
2632
  while ( i-- ) {
2867
2633
  token = tokens[ i ];
2868
2634
 
@@ -2875,8 +2641,8 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2875
2641
  // Search, expanding context for leading sibling combinators
2876
2642
  if ( ( seed = find(
2877
2643
  token.matches[ 0 ].replace( runescape, funescape ),
2878
- rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2879
- context
2644
+ rsibling.test( tokens[ 0 ].type ) &&
2645
+ testContext( context.parentNode ) || context
2880
2646
  ) ) ) {
2881
2647
 
2882
2648
  // If seed is empty or no tokens remain, we can return early
@@ -2903,21 +2669,18 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2903
2669
  !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2904
2670
  );
2905
2671
  return results;
2906
- };
2672
+ }
2907
2673
 
2908
2674
  // One-time assignments
2909
2675
 
2676
+ // Support: Android <=4.0 - 4.1+
2910
2677
  // Sort stability
2911
2678
  support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2912
2679
 
2913
- // Support: Chrome 14-35+
2914
- // Always assume duplicates if they aren't passed to the comparison function
2915
- support.detectDuplicates = !!hasDuplicate;
2916
-
2917
2680
  // Initialize against the default document
2918
2681
  setDocument();
2919
2682
 
2920
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2683
+ // Support: Android <=4.0 - 4.1+
2921
2684
  // Detached nodes confoundingly follow *each other*
2922
2685
  support.sortDetached = assert( function( el ) {
2923
2686
 
@@ -2925,68 +2688,29 @@ support.sortDetached = assert( function( el ) {
2925
2688
  return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2926
2689
  } );
2927
2690
 
2928
- // Support: IE<8
2929
- // Prevent attribute/property "interpolation"
2930
- // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2931
- if ( !assert( function( el ) {
2932
- el.innerHTML = "<a href='#'></a>";
2933
- return el.firstChild.getAttribute( "href" ) === "#";
2934
- } ) ) {
2935
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
2936
- if ( !isXML ) {
2937
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2938
- }
2939
- } );
2940
- }
2941
-
2942
- // Support: IE<9
2943
- // Use defaultValue in place of getAttribute("value")
2944
- if ( !support.attributes || !assert( function( el ) {
2945
- el.innerHTML = "<input/>";
2946
- el.firstChild.setAttribute( "value", "" );
2947
- return el.firstChild.getAttribute( "value" ) === "";
2948
- } ) ) {
2949
- addHandle( "value", function( elem, _name, isXML ) {
2950
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2951
- return elem.defaultValue;
2952
- }
2953
- } );
2954
- }
2955
-
2956
- // Support: IE<9
2957
- // Use getAttributeNode to fetch booleans when getAttribute lies
2958
- if ( !assert( function( el ) {
2959
- return el.getAttribute( "disabled" ) == null;
2960
- } ) ) {
2961
- addHandle( booleans, function( elem, name, isXML ) {
2962
- var val;
2963
- if ( !isXML ) {
2964
- return elem[ name ] === true ? name.toLowerCase() :
2965
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
2966
- val.value :
2967
- null;
2968
- }
2969
- } );
2970
- }
2971
-
2972
- return Sizzle;
2973
-
2974
- } )( window );
2975
-
2976
-
2977
-
2978
- jQuery.find = Sizzle;
2979
- jQuery.expr = Sizzle.selectors;
2691
+ jQuery.find = find;
2980
2692
 
2981
2693
  // Deprecated
2982
2694
  jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2983
- jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2984
- jQuery.text = Sizzle.getText;
2985
- jQuery.isXMLDoc = Sizzle.isXML;
2986
- jQuery.contains = Sizzle.contains;
2987
- jQuery.escapeSelector = Sizzle.escape;
2695
+ jQuery.unique = jQuery.uniqueSort;
2696
+
2697
+ // These have always been private, but they used to be documented
2698
+ // as part of Sizzle so let's maintain them in the 3.x line
2699
+ // for backwards compatibility purposes.
2700
+ find.compile = compile;
2701
+ find.select = select;
2702
+ find.setDocument = setDocument;
2703
+
2704
+ find.escape = jQuery.escapeSelector;
2705
+ find.getText = jQuery.text;
2706
+ find.isXML = jQuery.isXMLDoc;
2707
+ find.selectors = jQuery.expr;
2708
+ find.support = jQuery.support;
2709
+ find.uniqueSort = jQuery.uniqueSort;
2988
2710
 
2711
+ /* eslint-enable */
2989
2712
 
2713
+ } )();
2990
2714
 
2991
2715
 
2992
2716
  var dir = function( elem, dir, until ) {
@@ -3020,13 +2744,6 @@ var siblings = function( n, elem ) {
3020
2744
 
3021
2745
  var rneedsContext = jQuery.expr.match.needsContext;
3022
2746
 
3023
-
3024
-
3025
- function nodeName( elem, name ) {
3026
-
3027
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3028
-
3029
- };
3030
2747
  var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3031
2748
 
3032
2749
 
@@ -3125,8 +2842,8 @@ jQuery.fn.extend( {
3125
2842
  var rootjQuery,
3126
2843
 
3127
2844
  // A simple way to check for HTML strings
3128
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3129
- // Strict HTML recognition (#11290: must start with <)
2845
+ // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
2846
+ // Strict HTML recognition (trac-11290: must start with <)
3130
2847
  // Shortcut simple #id case for speed
3131
2848
  rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3132
2849
 
@@ -3277,7 +2994,7 @@ jQuery.fn.extend( {
3277
2994
  if ( cur.nodeType < 11 && ( targets ?
3278
2995
  targets.index( cur ) > -1 :
3279
2996
 
3280
- // Don't pass non-elements to Sizzle
2997
+ // Don't pass non-elements to jQuery#find
3281
2998
  cur.nodeType === 1 &&
3282
2999
  jQuery.find.matchesSelector( cur, selectors ) ) ) {
3283
3000
 
@@ -3832,7 +3549,7 @@ jQuery.extend( {
3832
3549
 
3833
3550
  if ( jQuery.Deferred.exceptionHook ) {
3834
3551
  jQuery.Deferred.exceptionHook( e,
3835
- process.stackTrace );
3552
+ process.error );
3836
3553
  }
3837
3554
 
3838
3555
  // Support: Promises/A+ section 2.3.3.3.4.1
@@ -3860,10 +3577,17 @@ jQuery.extend( {
3860
3577
  process();
3861
3578
  } else {
3862
3579
 
3863
- // Call an optional hook to record the stack, in case of exception
3580
+ // Call an optional hook to record the error, in case of exception
3864
3581
  // since it's otherwise lost when execution goes async
3865
- if ( jQuery.Deferred.getStackHook ) {
3866
- process.stackTrace = jQuery.Deferred.getStackHook();
3582
+ if ( jQuery.Deferred.getErrorHook ) {
3583
+ process.error = jQuery.Deferred.getErrorHook();
3584
+
3585
+ // The deprecated alias of the above. While the name suggests
3586
+ // returning the stack, not an error instance, jQuery just passes
3587
+ // it directly to `console.warn` so both will work; an instance
3588
+ // just better cooperates with source maps.
3589
+ } else if ( jQuery.Deferred.getStackHook ) {
3590
+ process.error = jQuery.Deferred.getStackHook();
3867
3591
  }
3868
3592
  window.setTimeout( process );
3869
3593
  }
@@ -3997,8 +3721,8 @@ jQuery.extend( {
3997
3721
  resolveContexts = Array( i ),
3998
3722
  resolveValues = slice.call( arguments ),
3999
3723
 
4000
- // the master Deferred
4001
- master = jQuery.Deferred(),
3724
+ // the primary Deferred
3725
+ primary = jQuery.Deferred(),
4002
3726
 
4003
3727
  // subordinate callback factory
4004
3728
  updateFunc = function( i ) {
@@ -4006,30 +3730,30 @@ jQuery.extend( {
4006
3730
  resolveContexts[ i ] = this;
4007
3731
  resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
4008
3732
  if ( !( --remaining ) ) {
4009
- master.resolveWith( resolveContexts, resolveValues );
3733
+ primary.resolveWith( resolveContexts, resolveValues );
4010
3734
  }
4011
3735
  };
4012
3736
  };
4013
3737
 
4014
3738
  // Single- and empty arguments are adopted like Promise.resolve
4015
3739
  if ( remaining <= 1 ) {
4016
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
3740
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
4017
3741
  !remaining );
4018
3742
 
4019
3743
  // Use .then() to unwrap secondary thenables (cf. gh-3000)
4020
- if ( master.state() === "pending" ||
3744
+ if ( primary.state() === "pending" ||
4021
3745
  isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4022
3746
 
4023
- return master.then();
3747
+ return primary.then();
4024
3748
  }
4025
3749
  }
4026
3750
 
4027
3751
  // Multiple arguments are aggregated like Promise.all array elements
4028
3752
  while ( i-- ) {
4029
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
3753
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
4030
3754
  }
4031
3755
 
4032
- return master.promise();
3756
+ return primary.promise();
4033
3757
  }
4034
3758
  } );
4035
3759
 
@@ -4038,12 +3762,16 @@ jQuery.extend( {
4038
3762
  // warn about them ASAP rather than swallowing them by default.
4039
3763
  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4040
3764
 
4041
- jQuery.Deferred.exceptionHook = function( error, stack ) {
3765
+ // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
3766
+ // captured before the async barrier to get the original error cause
3767
+ // which may otherwise be hidden.
3768
+ jQuery.Deferred.exceptionHook = function( error, asyncError ) {
4042
3769
 
4043
3770
  // Support: IE 8 - 9 only
4044
3771
  // Console exists when dev tools are open, which can happen at any time
4045
3772
  if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4046
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3773
+ window.console.warn( "jQuery.Deferred exception: " + error.message,
3774
+ error.stack, asyncError );
4047
3775
  }
4048
3776
  };
4049
3777
 
@@ -4083,7 +3811,7 @@ jQuery.extend( {
4083
3811
  isReady: false,
4084
3812
 
4085
3813
  // A counter to track how many items to wait for before
4086
- // the ready event fires. See #6781
3814
+ // the ready event fires. See trac-6781
4087
3815
  readyWait: 1,
4088
3816
 
4089
3817
  // Handle when the DOM is ready
@@ -4180,8 +3908,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4180
3908
  for ( ; i < len; i++ ) {
4181
3909
  fn(
4182
3910
  elems[ i ], key, raw ?
4183
- value :
4184
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
3911
+ value :
3912
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
4185
3913
  );
4186
3914
  }
4187
3915
  }
@@ -4211,7 +3939,7 @@ function fcamelCase( _all, letter ) {
4211
3939
 
4212
3940
  // Convert dashed to camelCase; used by the css and data modules
4213
3941
  // Support: IE <=9 - 11, Edge 12 - 15
4214
- // Microsoft forgot to hump their vendor prefix (#9572)
3942
+ // Microsoft forgot to hump their vendor prefix (trac-9572)
4215
3943
  function camelCase( string ) {
4216
3944
  return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4217
3945
  }
@@ -4247,7 +3975,7 @@ Data.prototype = {
4247
3975
  value = {};
4248
3976
 
4249
3977
  // We can accept data for non-element nodes in modern browsers,
4250
- // but we should not, see #8335.
3978
+ // but we should not, see trac-8335.
4251
3979
  // Always return an empty object.
4252
3980
  if ( acceptData( owner ) ) {
4253
3981
 
@@ -4486,7 +4214,7 @@ jQuery.fn.extend( {
4486
4214
  while ( i-- ) {
4487
4215
 
4488
4216
  // Support: IE 11 only
4489
- // The attrs elements can be null (#14894)
4217
+ // The attrs elements can be null (trac-14894)
4490
4218
  if ( attrs[ i ] ) {
4491
4219
  name = attrs[ i ].name;
4492
4220
  if ( name.indexOf( "data-" ) === 0 ) {
@@ -4909,9 +4637,9 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4909
4637
  input = document.createElement( "input" );
4910
4638
 
4911
4639
  // Support: Android 4.0 - 4.3 only
4912
- // Check state lost if the name is set (#11217)
4640
+ // Check state lost if the name is set (trac-11217)
4913
4641
  // Support: Windows Web Apps (WWA)
4914
- // `name` and `type` must use .setAttribute for WWA (#14901)
4642
+ // `name` and `type` must use .setAttribute for WWA (trac-14901)
4915
4643
  input.setAttribute( "type", "radio" );
4916
4644
  input.setAttribute( "checked", "checked" );
4917
4645
  input.setAttribute( "name", "t" );
@@ -4935,7 +4663,7 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4935
4663
  } )();
4936
4664
 
4937
4665
 
4938
- // We have to close these tags to support XHTML (#13200)
4666
+ // We have to close these tags to support XHTML (trac-13200)
4939
4667
  var wrapMap = {
4940
4668
 
4941
4669
  // XHTML parsers do not magically insert elements in the
@@ -4961,7 +4689,7 @@ if ( !support.option ) {
4961
4689
  function getAll( context, tag ) {
4962
4690
 
4963
4691
  // Support: IE <=9 - 11 only
4964
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
4692
+ // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
4965
4693
  var ret;
4966
4694
 
4967
4695
  if ( typeof context.getElementsByTagName !== "undefined" ) {
@@ -5044,7 +4772,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
5044
4772
  // Remember the top-level container
5045
4773
  tmp = fragment.firstChild;
5046
4774
 
5047
- // Ensure the created nodes are orphaned (#12392)
4775
+ // Ensure the created nodes are orphaned (trac-12392)
5048
4776
  tmp.textContent = "";
5049
4777
  }
5050
4778
  }
@@ -5089,10 +4817,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
5089
4817
  }
5090
4818
 
5091
4819
 
5092
- var
5093
- rkeyEvent = /^key/,
5094
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
5095
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4820
+ var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5096
4821
 
5097
4822
  function returnTrue() {
5098
4823
  return true;
@@ -5102,25 +4827,6 @@ function returnFalse() {
5102
4827
  return false;
5103
4828
  }
5104
4829
 
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
-
5115
- // Support: IE <=9 only
5116
- // Accessing document.activeElement can throw unexpectedly
5117
- // https://bugs.jquery.com/ticket/13393
5118
- function safeActiveElement() {
5119
- try {
5120
- return document.activeElement;
5121
- } catch ( err ) { }
5122
- }
5123
-
5124
4830
  function on( elem, types, selector, data, fn, one ) {
5125
4831
  var origFn, type;
5126
4832
 
@@ -5387,8 +5093,8 @@ jQuery.event = {
5387
5093
  event = jQuery.event.fix( nativeEvent ),
5388
5094
 
5389
5095
  handlers = (
5390
- dataPriv.get( this, "events" ) || Object.create( null )
5391
- )[ event.type ] || [],
5096
+ dataPriv.get( this, "events" ) || Object.create( null )
5097
+ )[ event.type ] || [],
5392
5098
  special = jQuery.event.special[ event.type ] || {};
5393
5099
 
5394
5100
  // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5468,15 +5174,15 @@ jQuery.event = {
5468
5174
 
5469
5175
  for ( ; cur !== this; cur = cur.parentNode || this ) {
5470
5176
 
5471
- // Don't check non-elements (#13208)
5472
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5177
+ // Don't check non-elements (trac-13208)
5178
+ // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
5473
5179
  if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5474
5180
  matchedHandlers = [];
5475
5181
  matchedSelectors = {};
5476
5182
  for ( i = 0; i < delegateCount; i++ ) {
5477
5183
  handleObj = handlers[ i ];
5478
5184
 
5479
- // Don't conflict with Object.prototype properties (#13203)
5185
+ // Don't conflict with Object.prototype properties (trac-13203)
5480
5186
  sel = handleObj.selector + " ";
5481
5187
 
5482
5188
  if ( matchedSelectors[ sel ] === undefined ) {
@@ -5512,12 +5218,12 @@ jQuery.event = {
5512
5218
  get: isFunction( hook ) ?
5513
5219
  function() {
5514
5220
  if ( this.originalEvent ) {
5515
- return hook( this.originalEvent );
5221
+ return hook( this.originalEvent );
5516
5222
  }
5517
5223
  } :
5518
5224
  function() {
5519
5225
  if ( this.originalEvent ) {
5520
- return this.originalEvent[ name ];
5226
+ return this.originalEvent[ name ];
5521
5227
  }
5522
5228
  },
5523
5229
 
@@ -5558,7 +5264,7 @@ jQuery.event = {
5558
5264
  el.click && nodeName( el, "input" ) ) {
5559
5265
 
5560
5266
  // dataPriv.set( el, "click", ... )
5561
- leverageNative( el, "click", returnTrue );
5267
+ leverageNative( el, "click", true );
5562
5268
  }
5563
5269
 
5564
5270
  // Return false to allow normal processing in the caller
@@ -5609,10 +5315,10 @@ jQuery.event = {
5609
5315
  // synthetic events by interrupting progress until reinvoked in response to
5610
5316
  // *native* events that it fires directly, ensuring that state changes have
5611
5317
  // already occurred before other listeners are invoked.
5612
- function leverageNative( el, type, expectSync ) {
5318
+ function leverageNative( el, type, isSetup ) {
5613
5319
 
5614
- // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5615
- if ( !expectSync ) {
5320
+ // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
5321
+ if ( !isSetup ) {
5616
5322
  if ( dataPriv.get( el, type ) === undefined ) {
5617
5323
  jQuery.event.add( el, type, returnTrue );
5618
5324
  }
@@ -5624,15 +5330,13 @@ function leverageNative( el, type, expectSync ) {
5624
5330
  jQuery.event.add( el, type, {
5625
5331
  namespace: false,
5626
5332
  handler: function( event ) {
5627
- var notAsync, result,
5333
+ var result,
5628
5334
  saved = dataPriv.get( this, type );
5629
5335
 
5630
5336
  if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5631
5337
 
5632
5338
  // 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 ) {
5339
+ if ( !saved ) {
5636
5340
 
5637
5341
  // Store arguments for use when handling the inner native event
5638
5342
  // There will always be at least one argument (an event object), so this array
@@ -5641,27 +5345,22 @@ function leverageNative( el, type, expectSync ) {
5641
5345
  dataPriv.set( this, type, saved );
5642
5346
 
5643
5347
  // 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
5348
  this[ type ]();
5648
5349
  result = dataPriv.get( this, type );
5649
- if ( saved !== result || notAsync ) {
5650
- dataPriv.set( this, type, false );
5651
- } else {
5652
- result = {};
5653
- }
5350
+ dataPriv.set( this, type, false );
5351
+
5654
5352
  if ( saved !== result ) {
5655
5353
 
5656
5354
  // Cancel the outer synthetic event
5657
5355
  event.stopImmediatePropagation();
5658
5356
  event.preventDefault();
5659
- return result.value;
5357
+
5358
+ return result;
5660
5359
  }
5661
5360
 
5662
5361
  // 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.
5362
+ // (focus or blur), assume that the surrogate already propagated from triggering
5363
+ // the native event and prevent that from happening again here.
5665
5364
  // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5666
5365
  // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5667
5366
  // less bad than duplication.
@@ -5671,22 +5370,25 @@ function leverageNative( el, type, expectSync ) {
5671
5370
 
5672
5371
  // If this is a native event triggered above, everything is now in order
5673
5372
  // Fire an inner synthetic event with the original arguments
5674
- } else if ( saved.length ) {
5373
+ } else if ( saved ) {
5675
5374
 
5676
5375
  // ...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();
5376
+ dataPriv.set( this, type, jQuery.event.trigger(
5377
+ saved[ 0 ],
5378
+ saved.slice( 1 ),
5379
+ this
5380
+ ) );
5381
+
5382
+ // Abort handling of the native event by all jQuery handlers while allowing
5383
+ // native handlers on the same element to run. On target, this is achieved
5384
+ // by stopping immediate propagation just on the jQuery event. However,
5385
+ // the native event is re-wrapped by a jQuery one on each level of the
5386
+ // propagation so the only way to stop it for jQuery is to stop it for
5387
+ // everyone via native `stopPropagation()`. This is not a problem for
5388
+ // focus/blur which don't bubble, but it does also stop click on checkboxes
5389
+ // and radios. We accept this limitation.
5390
+ event.stopPropagation();
5391
+ event.isImmediatePropagationStopped = returnTrue;
5690
5392
  }
5691
5393
  }
5692
5394
  } );
@@ -5724,7 +5426,7 @@ jQuery.Event = function( src, props ) {
5724
5426
 
5725
5427
  // Create target properties
5726
5428
  // Support: Safari <=6 - 7 only
5727
- // Target should not be a text node (#504, #13143)
5429
+ // Target should not be a text node (trac-504, trac-13143)
5728
5430
  this.target = ( src.target && src.target.nodeType === 3 ) ?
5729
5431
  src.target.parentNode :
5730
5432
  src.target;
@@ -5821,49 +5523,77 @@ jQuery.each( {
5821
5523
  targetTouches: true,
5822
5524
  toElement: true,
5823
5525
  touches: true,
5526
+ which: true
5527
+ }, jQuery.event.addProp );
5824
5528
 
5825
- which: function( event ) {
5826
- var button = event.button;
5827
-
5828
- // Add which for key events
5829
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
5830
- return event.charCode != null ? event.charCode : event.keyCode;
5831
- }
5832
-
5833
- // Add which for click: 1 === left; 2 === middle; 3 === right
5834
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5835
- if ( button & 1 ) {
5836
- return 1;
5837
- }
5529
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5838
5530
 
5839
- if ( button & 2 ) {
5840
- return 3;
5841
- }
5531
+ function focusMappedHandler( nativeEvent ) {
5532
+ if ( document.documentMode ) {
5842
5533
 
5843
- if ( button & 4 ) {
5844
- return 2;
5534
+ // Support: IE 11+
5535
+ // Attach a single focusin/focusout handler on the document while someone wants
5536
+ // focus/blur. This is because the former are synchronous in IE while the latter
5537
+ // are async. In other browsers, all those handlers are invoked synchronously.
5538
+
5539
+ // `handle` from private data would already wrap the event, but we need
5540
+ // to change the `type` here.
5541
+ var handle = dataPriv.get( this, "handle" ),
5542
+ event = jQuery.event.fix( nativeEvent );
5543
+ event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
5544
+ event.isSimulated = true;
5545
+
5546
+ // First, handle focusin/focusout
5547
+ handle( nativeEvent );
5548
+
5549
+ // ...then, handle focus/blur
5550
+ //
5551
+ // focus/blur don't bubble while focusin/focusout do; simulate the former by only
5552
+ // invoking the handler at the lower level.
5553
+ if ( event.target === event.currentTarget ) {
5554
+
5555
+ // The setup part calls `leverageNative`, which, in turn, calls
5556
+ // `jQuery.event.add`, so event handle will already have been set
5557
+ // by this point.
5558
+ handle( event );
5845
5559
  }
5560
+ } else {
5846
5561
 
5847
- return 0;
5562
+ // For non-IE browsers, attach a single capturing handler on the document
5563
+ // while someone wants focusin/focusout.
5564
+ jQuery.event.simulate( delegateType, nativeEvent.target,
5565
+ jQuery.event.fix( nativeEvent ) );
5848
5566
  }
5849
-
5850
- return event.which;
5851
5567
  }
5852
- }, jQuery.event.addProp );
5853
5568
 
5854
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5855
5569
  jQuery.event.special[ type ] = {
5856
5570
 
5857
5571
  // Utilize native event if possible so blur/focus sequence is correct
5858
5572
  setup: function() {
5859
5573
 
5574
+ var attaches;
5575
+
5860
5576
  // Claim the first handler
5861
5577
  // dataPriv.set( this, "focus", ... )
5862
5578
  // dataPriv.set( this, "blur", ... )
5863
- leverageNative( this, type, expectSync );
5579
+ leverageNative( this, type, true );
5864
5580
 
5865
- // Return false to allow normal processing in the caller
5866
- return false;
5581
+ if ( document.documentMode ) {
5582
+
5583
+ // Support: IE 9 - 11+
5584
+ // We use the same native handler for focusin & focus (and focusout & blur)
5585
+ // so we need to coordinate setup & teardown parts between those events.
5586
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5587
+ attaches = dataPriv.get( this, delegateType );
5588
+ if ( !attaches ) {
5589
+ this.addEventListener( delegateType, focusMappedHandler );
5590
+ }
5591
+ dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
5592
+ } else {
5593
+
5594
+ // Return false to allow normal processing in the caller
5595
+ return false;
5596
+ }
5867
5597
  },
5868
5598
  trigger: function() {
5869
5599
 
@@ -5874,8 +5604,84 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
5874
5604
  return true;
5875
5605
  },
5876
5606
 
5607
+ teardown: function() {
5608
+ var attaches;
5609
+
5610
+ if ( document.documentMode ) {
5611
+ attaches = dataPriv.get( this, delegateType ) - 1;
5612
+ if ( !attaches ) {
5613
+ this.removeEventListener( delegateType, focusMappedHandler );
5614
+ dataPriv.remove( this, delegateType );
5615
+ } else {
5616
+ dataPriv.set( this, delegateType, attaches );
5617
+ }
5618
+ } else {
5619
+
5620
+ // Return false to indicate standard teardown should be applied
5621
+ return false;
5622
+ }
5623
+ },
5624
+
5625
+ // Suppress native focus or blur if we're currently inside
5626
+ // a leveraged native-event stack
5627
+ _default: function( event ) {
5628
+ return dataPriv.get( event.target, type );
5629
+ },
5630
+
5877
5631
  delegateType: delegateType
5878
5632
  };
5633
+
5634
+ // Support: Firefox <=44
5635
+ // Firefox doesn't have focus(in | out) events
5636
+ // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5637
+ //
5638
+ // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
5639
+ // focus(in | out) events fire after focus & blur events,
5640
+ // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5641
+ // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
5642
+ //
5643
+ // Support: IE 9 - 11+
5644
+ // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
5645
+ // attach a single handler for both events in IE.
5646
+ jQuery.event.special[ delegateType ] = {
5647
+ setup: function() {
5648
+
5649
+ // Handle: regular nodes (via `this.ownerDocument`), window
5650
+ // (via `this.document`) & document (via `this`).
5651
+ var doc = this.ownerDocument || this.document || this,
5652
+ dataHolder = document.documentMode ? this : doc,
5653
+ attaches = dataPriv.get( dataHolder, delegateType );
5654
+
5655
+ // Support: IE 9 - 11+
5656
+ // We use the same native handler for focusin & focus (and focusout & blur)
5657
+ // so we need to coordinate setup & teardown parts between those events.
5658
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5659
+ if ( !attaches ) {
5660
+ if ( document.documentMode ) {
5661
+ this.addEventListener( delegateType, focusMappedHandler );
5662
+ } else {
5663
+ doc.addEventListener( type, focusMappedHandler, true );
5664
+ }
5665
+ }
5666
+ dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
5667
+ },
5668
+ teardown: function() {
5669
+ var doc = this.ownerDocument || this.document || this,
5670
+ dataHolder = document.documentMode ? this : doc,
5671
+ attaches = dataPriv.get( dataHolder, delegateType ) - 1;
5672
+
5673
+ if ( !attaches ) {
5674
+ if ( document.documentMode ) {
5675
+ this.removeEventListener( delegateType, focusMappedHandler );
5676
+ } else {
5677
+ doc.removeEventListener( type, focusMappedHandler, true );
5678
+ }
5679
+ dataPriv.remove( dataHolder, delegateType );
5680
+ } else {
5681
+ dataPriv.set( dataHolder, delegateType, attaches );
5682
+ }
5683
+ }
5684
+ };
5879
5685
  } );
5880
5686
 
5881
5687
  // Create mouseenter/leave events using mouseover/out and event-time checks
@@ -5970,7 +5776,8 @@ var
5970
5776
 
5971
5777
  // checked="checked" or checked
5972
5778
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5973
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5779
+
5780
+ rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
5974
5781
 
5975
5782
  // Prefer a tbody over its parent table for containing new rows
5976
5783
  function manipulationTarget( elem, content ) {
@@ -6084,7 +5891,7 @@ function domManip( collection, args, callback, ignored ) {
6084
5891
 
6085
5892
  // Use the original fragment for the last item
6086
5893
  // instead of the first because it can end up
6087
- // being emptied incorrectly in certain situations (#8070).
5894
+ // being emptied incorrectly in certain situations (trac-8070).
6088
5895
  for ( ; i < l; i++ ) {
6089
5896
  node = fragment;
6090
5897
 
@@ -6125,6 +5932,12 @@ function domManip( collection, args, callback, ignored ) {
6125
5932
  }, doc );
6126
5933
  }
6127
5934
  } else {
5935
+
5936
+ // Unwrap a CDATA section containing script contents. This shouldn't be
5937
+ // needed as in XML documents they're already not visible when
5938
+ // inspecting element contents and in HTML documents they have no
5939
+ // meaning but we're preserving that logic for backwards compatibility.
5940
+ // This will be removed completely in 4.0. See gh-4904.
6128
5941
  DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
6129
5942
  }
6130
5943
  }
@@ -6171,7 +5984,8 @@ jQuery.extend( {
6171
5984
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6172
5985
  !jQuery.isXMLDoc( elem ) ) {
6173
5986
 
6174
- // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
5987
+ // We eschew jQuery#find here for performance reasons:
5988
+ // https://jsperf.com/getall-vs-sizzle/2
6175
5989
  destElements = getAll( clone );
6176
5990
  srcElements = getAll( elem );
6177
5991
 
@@ -6407,9 +6221,12 @@ jQuery.each( {
6407
6221
  } );
6408
6222
  var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6409
6223
 
6224
+ var rcustomProp = /^--/;
6225
+
6226
+
6410
6227
  var getStyles = function( elem ) {
6411
6228
 
6412
- // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6229
+ // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
6413
6230
  // IE throws on elements created in popups
6414
6231
  // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6415
6232
  var view = elem.ownerDocument.defaultView;
@@ -6509,7 +6326,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6509
6326
  }
6510
6327
 
6511
6328
  // Support: IE <=9 - 11 only
6512
- // Style of cloned element affects source element cloned (#8908)
6329
+ // Style of cloned element affects source element cloned (trac-8908)
6513
6330
  div.style.backgroundClip = "content-box";
6514
6331
  div.cloneNode( true ).style.backgroundClip = "";
6515
6332
  support.clearCloneStyle = div.style.backgroundClip === "content-box";
@@ -6541,6 +6358,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6541
6358
  // set in CSS while `offset*` properties report correct values.
6542
6359
  // Behavior in IE 9 is more subtle than in newer versions & it passes
6543
6360
  // some versions of this test; make sure not to make it pass there!
6361
+ //
6362
+ // Support: Firefox 70+
6363
+ // Only Firefox includes border widths
6364
+ // in computed dimensions. (gh-4529)
6544
6365
  reliableTrDimensions: function() {
6545
6366
  var table, tr, trChild, trStyle;
6546
6367
  if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6369,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6548
6369
  tr = document.createElement( "tr" );
6549
6370
  trChild = document.createElement( "div" );
6550
6371
 
6551
- table.style.cssText = "position:absolute;left:-11111px";
6372
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
6373
+ tr.style.cssText = "border:1px solid";
6374
+
6375
+ // Support: Chrome 86+
6376
+ // Height set through cssText does not get applied.
6377
+ // Computed height then comes back as 0.
6552
6378
  tr.style.height = "1px";
6553
6379
  trChild.style.height = "9px";
6554
6380
 
6381
+ // Support: Android 8 Chrome 86+
6382
+ // In our bodyBackground.html iframe,
6383
+ // display for all div elements is set to "inline",
6384
+ // which causes a problem only in Android 8 Chrome 86.
6385
+ // Ensuring the div is display: block
6386
+ // gets around this issue.
6387
+ trChild.style.display = "block";
6388
+
6555
6389
  documentElement
6556
6390
  .appendChild( table )
6557
6391
  .appendChild( tr )
6558
6392
  .appendChild( trChild );
6559
6393
 
6560
6394
  trStyle = window.getComputedStyle( tr );
6561
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
6395
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
6396
+ parseInt( trStyle.borderTopWidth, 10 ) +
6397
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
6562
6398
 
6563
6399
  documentElement.removeChild( table );
6564
6400
  }
@@ -6570,6 +6406,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6570
6406
 
6571
6407
  function curCSS( elem, name, computed ) {
6572
6408
  var width, minWidth, maxWidth, ret,
6409
+ isCustomProp = rcustomProp.test( name ),
6573
6410
 
6574
6411
  // Support: Firefox 51+
6575
6412
  // Retrieving style before computed somehow
@@ -6580,11 +6417,42 @@ function curCSS( elem, name, computed ) {
6580
6417
  computed = computed || getStyles( elem );
6581
6418
 
6582
6419
  // getPropertyValue is needed for:
6583
- // .css('filter') (IE 9 only, #12537)
6584
- // .css('--customProperty) (#3144)
6420
+ // .css('filter') (IE 9 only, trac-12537)
6421
+ // .css('--customProperty) (gh-3144)
6585
6422
  if ( computed ) {
6423
+
6424
+ // Support: IE <=9 - 11+
6425
+ // IE only supports `"float"` in `getPropertyValue`; in computed styles
6426
+ // it's only available as `"cssFloat"`. We no longer modify properties
6427
+ // sent to `.css()` apart from camelCasing, so we need to check both.
6428
+ // Normally, this would create difference in behavior: if
6429
+ // `getPropertyValue` returns an empty string, the value returned
6430
+ // by `.css()` would be `undefined`. This is usually the case for
6431
+ // disconnected elements. However, in IE even disconnected elements
6432
+ // with no styles return `"none"` for `getPropertyValue( "float" )`
6586
6433
  ret = computed.getPropertyValue( name ) || computed[ name ];
6587
6434
 
6435
+ if ( isCustomProp && ret ) {
6436
+
6437
+ // Support: Firefox 105+, Chrome <=105+
6438
+ // Spec requires trimming whitespace for custom properties (gh-4926).
6439
+ // Firefox only trims leading whitespace. Chrome just collapses
6440
+ // both leading & trailing whitespace to a single space.
6441
+ //
6442
+ // Fall back to `undefined` if empty string returned.
6443
+ // This collapses a missing definition with property defined
6444
+ // and set to an empty string but there's no standard API
6445
+ // allowing us to differentiate them without a performance penalty
6446
+ // and returning `undefined` aligns with older jQuery.
6447
+ //
6448
+ // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
6449
+ // as whitespace while CSS does not, but this is not a problem
6450
+ // because CSS preprocessing replaces them with U+000A LINE FEED
6451
+ // (which *is* CSS whitespace)
6452
+ // https://www.w3.org/TR/css-syntax-3/#input-preprocessing
6453
+ ret = ret.replace( rtrimCSS, "$1" ) || undefined;
6454
+ }
6455
+
6588
6456
  if ( ret === "" && !isAttached( elem ) ) {
6589
6457
  ret = jQuery.style( elem, name );
6590
6458
  }
@@ -6680,7 +6548,6 @@ var
6680
6548
  // except "table", "table-cell", or "table-caption"
6681
6549
  // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6682
6550
  rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6683
- rcustomProp = /^--/,
6684
6551
  cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6685
6552
  cssNormalTransform = {
6686
6553
  letterSpacing: "0",
@@ -6702,7 +6569,8 @@ function setPositiveNumber( _elem, value, subtract ) {
6702
6569
  function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6703
6570
  var i = dimension === "width" ? 1 : 0,
6704
6571
  extra = 0,
6705
- delta = 0;
6572
+ delta = 0,
6573
+ marginDelta = 0;
6706
6574
 
6707
6575
  // Adjustment may not be necessary
6708
6576
  if ( box === ( isBorderBox ? "border" : "content" ) ) {
@@ -6712,8 +6580,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6712
6580
  for ( ; i < 4; i += 2 ) {
6713
6581
 
6714
6582
  // Both box models exclude margin
6583
+ // Count margin delta separately to only add it after scroll gutter adjustment.
6584
+ // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
6715
6585
  if ( box === "margin" ) {
6716
- delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6586
+ marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6717
6587
  }
6718
6588
 
6719
6589
  // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
@@ -6764,7 +6634,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6764
6634
  ) ) || 0;
6765
6635
  }
6766
6636
 
6767
- return delta;
6637
+ return delta + marginDelta;
6768
6638
  }
6769
6639
 
6770
6640
  function getWidthOrHeight( elem, dimension, extra ) {
@@ -6862,26 +6732,35 @@ jQuery.extend( {
6862
6732
 
6863
6733
  // Don't automatically add "px" to these possibly-unitless properties
6864
6734
  cssNumber: {
6865
- "animationIterationCount": true,
6866
- "columnCount": true,
6867
- "fillOpacity": true,
6868
- "flexGrow": true,
6869
- "flexShrink": true,
6870
- "fontWeight": true,
6871
- "gridArea": true,
6872
- "gridColumn": true,
6873
- "gridColumnEnd": true,
6874
- "gridColumnStart": true,
6875
- "gridRow": true,
6876
- "gridRowEnd": true,
6877
- "gridRowStart": true,
6878
- "lineHeight": true,
6879
- "opacity": true,
6880
- "order": true,
6881
- "orphans": true,
6882
- "widows": true,
6883
- "zIndex": true,
6884
- "zoom": true
6735
+ animationIterationCount: true,
6736
+ aspectRatio: true,
6737
+ borderImageSlice: true,
6738
+ columnCount: true,
6739
+ flexGrow: true,
6740
+ flexShrink: true,
6741
+ fontWeight: true,
6742
+ gridArea: true,
6743
+ gridColumn: true,
6744
+ gridColumnEnd: true,
6745
+ gridColumnStart: true,
6746
+ gridRow: true,
6747
+ gridRowEnd: true,
6748
+ gridRowStart: true,
6749
+ lineHeight: true,
6750
+ opacity: true,
6751
+ order: true,
6752
+ orphans: true,
6753
+ scale: true,
6754
+ widows: true,
6755
+ zIndex: true,
6756
+ zoom: true,
6757
+
6758
+ // SVG-related
6759
+ fillOpacity: true,
6760
+ floodOpacity: true,
6761
+ stopOpacity: true,
6762
+ strokeMiterlimit: true,
6763
+ strokeOpacity: true
6885
6764
  },
6886
6765
 
6887
6766
  // Add in properties whose names you wish to fix before
@@ -6916,15 +6795,15 @@ jQuery.extend( {
6916
6795
  if ( value !== undefined ) {
6917
6796
  type = typeof value;
6918
6797
 
6919
- // Convert "+=" or "-=" to relative numbers (#7345)
6798
+ // Convert "+=" or "-=" to relative numbers (trac-7345)
6920
6799
  if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6921
6800
  value = adjustCSS( elem, name, ret );
6922
6801
 
6923
- // Fixes bug #9237
6802
+ // Fixes bug trac-9237
6924
6803
  type = "number";
6925
6804
  }
6926
6805
 
6927
- // Make sure that null and NaN values aren't set (#7116)
6806
+ // Make sure that null and NaN values aren't set (trac-7116)
6928
6807
  if ( value == null || value !== value ) {
6929
6808
  return;
6930
6809
  }
@@ -7022,10 +6901,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
7022
6901
  // Running getBoundingClientRect on a disconnected node
7023
6902
  // in IE throws an error.
7024
6903
  ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
7025
- swap( elem, cssShow, function() {
7026
- return getWidthOrHeight( elem, dimension, extra );
7027
- } ) :
7028
- getWidthOrHeight( elem, dimension, extra );
6904
+ swap( elem, cssShow, function() {
6905
+ return getWidthOrHeight( elem, dimension, extra );
6906
+ } ) :
6907
+ getWidthOrHeight( elem, dimension, extra );
7029
6908
  }
7030
6909
  },
7031
6910
 
@@ -7084,7 +6963,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
7084
6963
  swap( elem, { marginLeft: 0 }, function() {
7085
6964
  return elem.getBoundingClientRect().left;
7086
6965
  } )
7087
- ) + "px";
6966
+ ) + "px";
7088
6967
  }
7089
6968
  }
7090
6969
  );
@@ -7223,7 +7102,7 @@ Tween.propHooks = {
7223
7102
  if ( jQuery.fx.step[ tween.prop ] ) {
7224
7103
  jQuery.fx.step[ tween.prop ]( tween );
7225
7104
  } else if ( tween.elem.nodeType === 1 && (
7226
- jQuery.cssHooks[ tween.prop ] ||
7105
+ jQuery.cssHooks[ tween.prop ] ||
7227
7106
  tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
7228
7107
  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7229
7108
  } else {
@@ -7468,7 +7347,7 @@ function defaultPrefilter( elem, props, opts ) {
7468
7347
 
7469
7348
  anim.done( function() {
7470
7349
 
7471
- /* eslint-enable no-loop-func */
7350
+ /* eslint-enable no-loop-func */
7472
7351
 
7473
7352
  // The final step of a "hide" animation is actually hiding the element
7474
7353
  if ( !hidden ) {
@@ -7548,7 +7427,7 @@ function Animation( elem, properties, options ) {
7548
7427
  remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7549
7428
 
7550
7429
  // Support: Android 2.3 only
7551
- // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7430
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
7552
7431
  temp = remaining / animation.duration || 0,
7553
7432
  percent = 1 - temp,
7554
7433
  index = 0,
@@ -7588,7 +7467,7 @@ function Animation( elem, properties, options ) {
7588
7467
  tweens: [],
7589
7468
  createTween: function( prop, end ) {
7590
7469
  var tween = jQuery.Tween( elem, animation.opts, prop, end,
7591
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
7470
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
7592
7471
  animation.tweens.push( tween );
7593
7472
  return tween;
7594
7473
  },
@@ -7761,7 +7640,8 @@ jQuery.fn.extend( {
7761
7640
  anim.stop( true );
7762
7641
  }
7763
7642
  };
7764
- doAnimation.finish = doAnimation;
7643
+
7644
+ doAnimation.finish = doAnimation;
7765
7645
 
7766
7646
  return empty || optall.queue === false ?
7767
7647
  this.each( doAnimation ) :
@@ -7937,7 +7817,6 @@ jQuery.fx.speeds = {
7937
7817
 
7938
7818
 
7939
7819
  // Based off of the plugin by Clint Helfers, with permission.
7940
- // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7941
7820
  jQuery.fn.delay = function( time, type ) {
7942
7821
  time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7943
7822
  type = type || "fx";
@@ -8162,8 +8041,7 @@ jQuery.extend( {
8162
8041
  // Support: IE <=9 - 11 only
8163
8042
  // elem.tabIndex doesn't always return the
8164
8043
  // correct value when it hasn't been explicitly set
8165
- // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8166
- // Use proper attribute retrieval(#12072)
8044
+ // Use proper attribute retrieval (trac-12072)
8167
8045
  var tabindex = jQuery.find.attr( elem, "tabindex" );
8168
8046
 
8169
8047
  if ( tabindex ) {
@@ -8267,8 +8145,7 @@ function classesToArray( value ) {
8267
8145
 
8268
8146
  jQuery.fn.extend( {
8269
8147
  addClass: function( value ) {
8270
- var classes, elem, cur, curValue, clazz, j, finalValue,
8271
- i = 0;
8148
+ var classNames, cur, curValue, className, i, finalValue;
8272
8149
 
8273
8150
  if ( isFunction( value ) ) {
8274
8151
  return this.each( function( j ) {
@@ -8276,36 +8153,35 @@ jQuery.fn.extend( {
8276
8153
  } );
8277
8154
  }
8278
8155
 
8279
- classes = classesToArray( value );
8156
+ classNames = classesToArray( value );
8280
8157
 
8281
- if ( classes.length ) {
8282
- while ( ( elem = this[ i++ ] ) ) {
8283
- curValue = getClass( elem );
8284
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8158
+ if ( classNames.length ) {
8159
+ return this.each( function() {
8160
+ curValue = getClass( this );
8161
+ cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8285
8162
 
8286
8163
  if ( cur ) {
8287
- j = 0;
8288
- while ( ( clazz = classes[ j++ ] ) ) {
8289
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8290
- cur += clazz + " ";
8164
+ for ( i = 0; i < classNames.length; i++ ) {
8165
+ className = classNames[ i ];
8166
+ if ( cur.indexOf( " " + className + " " ) < 0 ) {
8167
+ cur += className + " ";
8291
8168
  }
8292
8169
  }
8293
8170
 
8294
8171
  // Only assign if different to avoid unneeded rendering.
8295
8172
  finalValue = stripAndCollapse( cur );
8296
8173
  if ( curValue !== finalValue ) {
8297
- elem.setAttribute( "class", finalValue );
8174
+ this.setAttribute( "class", finalValue );
8298
8175
  }
8299
8176
  }
8300
- }
8177
+ } );
8301
8178
  }
8302
8179
 
8303
8180
  return this;
8304
8181
  },
8305
8182
 
8306
8183
  removeClass: function( value ) {
8307
- var classes, elem, cur, curValue, clazz, j, finalValue,
8308
- i = 0;
8184
+ var classNames, cur, curValue, className, i, finalValue;
8309
8185
 
8310
8186
  if ( isFunction( value ) ) {
8311
8187
  return this.each( function( j ) {
@@ -8317,45 +8193,42 @@ jQuery.fn.extend( {
8317
8193
  return this.attr( "class", "" );
8318
8194
  }
8319
8195
 
8320
- classes = classesToArray( value );
8196
+ classNames = classesToArray( value );
8321
8197
 
8322
- if ( classes.length ) {
8323
- while ( ( elem = this[ i++ ] ) ) {
8324
- curValue = getClass( elem );
8198
+ if ( classNames.length ) {
8199
+ return this.each( function() {
8200
+ curValue = getClass( this );
8325
8201
 
8326
8202
  // This expression is here for better compressibility (see addClass)
8327
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8203
+ cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8328
8204
 
8329
8205
  if ( cur ) {
8330
- j = 0;
8331
- while ( ( clazz = classes[ j++ ] ) ) {
8206
+ for ( i = 0; i < classNames.length; i++ ) {
8207
+ className = classNames[ i ];
8332
8208
 
8333
8209
  // Remove *all* instances
8334
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8335
- cur = cur.replace( " " + clazz + " ", " " );
8210
+ while ( cur.indexOf( " " + className + " " ) > -1 ) {
8211
+ cur = cur.replace( " " + className + " ", " " );
8336
8212
  }
8337
8213
  }
8338
8214
 
8339
8215
  // Only assign if different to avoid unneeded rendering.
8340
8216
  finalValue = stripAndCollapse( cur );
8341
8217
  if ( curValue !== finalValue ) {
8342
- elem.setAttribute( "class", finalValue );
8218
+ this.setAttribute( "class", finalValue );
8343
8219
  }
8344
8220
  }
8345
- }
8221
+ } );
8346
8222
  }
8347
8223
 
8348
8224
  return this;
8349
8225
  },
8350
8226
 
8351
8227
  toggleClass: function( value, stateVal ) {
8352
- var type = typeof value,
8228
+ var classNames, className, i, self,
8229
+ type = typeof value,
8353
8230
  isValidValue = type === "string" || Array.isArray( value );
8354
8231
 
8355
- if ( typeof stateVal === "boolean" && isValidValue ) {
8356
- return stateVal ? this.addClass( value ) : this.removeClass( value );
8357
- }
8358
-
8359
8232
  if ( isFunction( value ) ) {
8360
8233
  return this.each( function( i ) {
8361
8234
  jQuery( this ).toggleClass(
@@ -8365,17 +8238,20 @@ jQuery.fn.extend( {
8365
8238
  } );
8366
8239
  }
8367
8240
 
8368
- return this.each( function() {
8369
- var className, i, self, classNames;
8241
+ if ( typeof stateVal === "boolean" && isValidValue ) {
8242
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
8243
+ }
8370
8244
 
8245
+ classNames = classesToArray( value );
8246
+
8247
+ return this.each( function() {
8371
8248
  if ( isValidValue ) {
8372
8249
 
8373
8250
  // Toggle individual class names
8374
- i = 0;
8375
8251
  self = jQuery( this );
8376
- classNames = classesToArray( value );
8377
8252
 
8378
- while ( ( className = classNames[ i++ ] ) ) {
8253
+ for ( i = 0; i < classNames.length; i++ ) {
8254
+ className = classNames[ i ];
8379
8255
 
8380
8256
  // Check each className given, space separated list
8381
8257
  if ( self.hasClass( className ) ) {
@@ -8401,8 +8277,8 @@ jQuery.fn.extend( {
8401
8277
  if ( this.setAttribute ) {
8402
8278
  this.setAttribute( "class",
8403
8279
  className || value === false ?
8404
- "" :
8405
- dataPriv.get( this, "__className__" ) || ""
8280
+ "" :
8281
+ dataPriv.get( this, "__className__" ) || ""
8406
8282
  );
8407
8283
  }
8408
8284
  }
@@ -8417,7 +8293,7 @@ jQuery.fn.extend( {
8417
8293
  while ( ( elem = this[ i++ ] ) ) {
8418
8294
  if ( elem.nodeType === 1 &&
8419
8295
  ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8420
- return true;
8296
+ return true;
8421
8297
  }
8422
8298
  }
8423
8299
 
@@ -8509,7 +8385,7 @@ jQuery.extend( {
8509
8385
  val :
8510
8386
 
8511
8387
  // Support: IE <=10 - 11 only
8512
- // option.text throws exceptions (#14686, #14858)
8388
+ // option.text throws exceptions (trac-14686, trac-14858)
8513
8389
  // Strip and collapse whitespace
8514
8390
  // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8515
8391
  stripAndCollapse( jQuery.text( elem ) );
@@ -8536,7 +8412,7 @@ jQuery.extend( {
8536
8412
  option = options[ i ];
8537
8413
 
8538
8414
  // Support: IE <=9 only
8539
- // IE8-9 doesn't update selected after form reset (#2551)
8415
+ // IE8-9 doesn't update selected after form reset (trac-2551)
8540
8416
  if ( ( option.selected || i === index ) &&
8541
8417
 
8542
8418
  // Don't return options that are disabled or in a disabled optgroup
@@ -8610,9 +8486,39 @@ jQuery.each( [ "radio", "checkbox" ], function() {
8610
8486
 
8611
8487
 
8612
8488
  // Return jQuery for attributes-only inclusion
8489
+ var location = window.location;
8613
8490
 
8491
+ var nonce = { guid: Date.now() };
8492
+
8493
+ var rquery = ( /\?/ );
8614
8494
 
8615
- support.focusin = "onfocusin" in window;
8495
+
8496
+
8497
+ // Cross-browser xml parsing
8498
+ jQuery.parseXML = function( data ) {
8499
+ var xml, parserErrorElem;
8500
+ if ( !data || typeof data !== "string" ) {
8501
+ return null;
8502
+ }
8503
+
8504
+ // Support: IE 9 - 11 only
8505
+ // IE throws on parseFromString with invalid input.
8506
+ try {
8507
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8508
+ } catch ( e ) {}
8509
+
8510
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8511
+ if ( !xml || parserErrorElem ) {
8512
+ jQuery.error( "Invalid XML: " + (
8513
+ parserErrorElem ?
8514
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
8515
+ return el.textContent;
8516
+ } ).join( "\n" ) :
8517
+ data
8518
+ ) );
8519
+ }
8520
+ return xml;
8521
+ };
8616
8522
 
8617
8523
 
8618
8524
  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
@@ -8679,8 +8585,8 @@ jQuery.extend( jQuery.event, {
8679
8585
  return;
8680
8586
  }
8681
8587
 
8682
- // Determine event propagation path in advance, per W3C events spec (#9951)
8683
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8588
+ // Determine event propagation path in advance, per W3C events spec (trac-9951)
8589
+ // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
8684
8590
  if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8685
8591
 
8686
8592
  bubbleType = special.delegateType || type;
@@ -8707,9 +8613,7 @@ jQuery.extend( jQuery.event, {
8707
8613
  special.bindType || type;
8708
8614
 
8709
8615
  // jQuery handler
8710
- handle = (
8711
- dataPriv.get( cur, "events" ) || Object.create( null )
8712
- )[ event.type ] &&
8616
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
8713
8617
  dataPriv.get( cur, "handle" );
8714
8618
  if ( handle ) {
8715
8619
  handle.apply( cur, data );
@@ -8734,7 +8638,7 @@ jQuery.extend( jQuery.event, {
8734
8638
  acceptData( elem ) ) {
8735
8639
 
8736
8640
  // Call a native DOM method on the target with the same name as the event.
8737
- // Don't do default actions on window, that's where global variables be (#6170)
8641
+ // Don't do default actions on window, that's where global variables be (trac-6170)
8738
8642
  if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8739
8643
 
8740
8644
  // Don't re-trigger an onFOO event when we call its FOO() method
@@ -8802,80 +8706,6 @@ jQuery.fn.extend( {
8802
8706
  } );
8803
8707
 
8804
8708
 
8805
- // Support: Firefox <=44
8806
- // Firefox doesn't have focus(in | out) events
8807
- // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8808
- //
8809
- // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8810
- // focus(in | out) events fire after focus & blur events,
8811
- // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8812
- // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8813
- if ( !support.focusin ) {
8814
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8815
-
8816
- // Attach a single capturing handler on the document while someone wants focusin/focusout
8817
- var handler = function( event ) {
8818
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8819
- };
8820
-
8821
- jQuery.event.special[ fix ] = {
8822
- setup: function() {
8823
-
8824
- // Handle: regular nodes (via `this.ownerDocument`), window
8825
- // (via `this.document`) & document (via `this`).
8826
- var doc = this.ownerDocument || this.document || this,
8827
- attaches = dataPriv.access( doc, fix );
8828
-
8829
- if ( !attaches ) {
8830
- doc.addEventListener( orig, handler, true );
8831
- }
8832
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8833
- },
8834
- teardown: function() {
8835
- var doc = this.ownerDocument || this.document || this,
8836
- attaches = dataPriv.access( doc, fix ) - 1;
8837
-
8838
- if ( !attaches ) {
8839
- doc.removeEventListener( orig, handler, true );
8840
- dataPriv.remove( doc, fix );
8841
-
8842
- } else {
8843
- dataPriv.access( doc, fix, attaches );
8844
- }
8845
- }
8846
- };
8847
- } );
8848
- }
8849
- var location = window.location;
8850
-
8851
- var nonce = { guid: Date.now() };
8852
-
8853
- var rquery = ( /\?/ );
8854
-
8855
-
8856
-
8857
- // Cross-browser xml parsing
8858
- jQuery.parseXML = function( data ) {
8859
- var xml;
8860
- if ( !data || typeof data !== "string" ) {
8861
- return null;
8862
- }
8863
-
8864
- // Support: IE 9 - 11 only
8865
- // IE throws on parseFromString with invalid input.
8866
- try {
8867
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8868
- } catch ( e ) {
8869
- xml = undefined;
8870
- }
8871
-
8872
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8873
- jQuery.error( "Invalid XML: " + data );
8874
- }
8875
- return xml;
8876
- };
8877
-
8878
-
8879
8709
  var
8880
8710
  rbracket = /\[\]$/,
8881
8711
  rCRLF = /\r?\n/g,
@@ -8971,16 +8801,14 @@ jQuery.fn.extend( {
8971
8801
  // Can add propHook for "elements" to filter or add form elements
8972
8802
  var elements = jQuery.prop( this, "elements" );
8973
8803
  return elements ? jQuery.makeArray( elements ) : this;
8974
- } )
8975
- .filter( function() {
8804
+ } ).filter( function() {
8976
8805
  var type = this.type;
8977
8806
 
8978
8807
  // Use .is( ":disabled" ) so that fieldset[disabled] works
8979
8808
  return this.name && !jQuery( this ).is( ":disabled" ) &&
8980
8809
  rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8981
8810
  ( this.checked || !rcheckableType.test( type ) );
8982
- } )
8983
- .map( function( _i, elem ) {
8811
+ } ).map( function( _i, elem ) {
8984
8812
  var val = jQuery( this ).val();
8985
8813
 
8986
8814
  if ( val == null ) {
@@ -9005,7 +8833,7 @@ var
9005
8833
  rantiCache = /([?&])_=[^&]*/,
9006
8834
  rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
9007
8835
 
9008
- // #7653, #8125, #8152: local protocol detection
8836
+ // trac-7653, trac-8125, trac-8152: local protocol detection
9009
8837
  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
9010
8838
  rnoContent = /^(?:GET|HEAD)$/,
9011
8839
  rprotocol = /^\/\//,
@@ -9028,12 +8856,13 @@ var
9028
8856
  */
9029
8857
  transports = {},
9030
8858
 
9031
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8859
+ // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
9032
8860
  allTypes = "*/".concat( "*" ),
9033
8861
 
9034
8862
  // Anchor tag for parsing the document origin
9035
8863
  originAnchor = document.createElement( "a" );
9036
- originAnchor.href = location.href;
8864
+
8865
+ originAnchor.href = location.href;
9037
8866
 
9038
8867
  // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
9039
8868
  function addToPrefiltersOrTransports( structure ) {
@@ -9098,7 +8927,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
9098
8927
 
9099
8928
  // A special extend for ajax options
9100
8929
  // that takes "flat" options (not to be deep extended)
9101
- // Fixes #9887
8930
+ // Fixes trac-9887
9102
8931
  function ajaxExtend( target, src ) {
9103
8932
  var key, deep,
9104
8933
  flatOptions = jQuery.ajaxSettings.flatOptions || {};
@@ -9414,8 +9243,8 @@ jQuery.extend( {
9414
9243
  // Context for global events is callbackContext if it is a DOM node or jQuery collection
9415
9244
  globalEventContext = s.context &&
9416
9245
  ( callbackContext.nodeType || callbackContext.jquery ) ?
9417
- jQuery( callbackContext ) :
9418
- jQuery.event,
9246
+ jQuery( callbackContext ) :
9247
+ jQuery.event,
9419
9248
 
9420
9249
  // Deferreds
9421
9250
  deferred = jQuery.Deferred(),
@@ -9509,12 +9338,12 @@ jQuery.extend( {
9509
9338
  deferred.promise( jqXHR );
9510
9339
 
9511
9340
  // Add protocol if not provided (prefilters might expect it)
9512
- // Handle falsy url in the settings object (#10093: consistency with old signature)
9341
+ // Handle falsy url in the settings object (trac-10093: consistency with old signature)
9513
9342
  // We also use the url parameter if available
9514
9343
  s.url = ( ( url || s.url || location.href ) + "" )
9515
9344
  .replace( rprotocol, location.protocol + "//" );
9516
9345
 
9517
- // Alias method option to type as per ticket #12004
9346
+ // Alias method option to type as per ticket trac-12004
9518
9347
  s.type = options.method || options.type || s.method || s.type;
9519
9348
 
9520
9349
  // Extract dataTypes list
@@ -9557,7 +9386,7 @@ jQuery.extend( {
9557
9386
  }
9558
9387
 
9559
9388
  // We can fire global events as of now if asked to
9560
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9389
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
9561
9390
  fireGlobals = jQuery.event && s.global;
9562
9391
 
9563
9392
  // Watch for a new set of requests
@@ -9586,7 +9415,7 @@ jQuery.extend( {
9586
9415
  if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9587
9416
  cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9588
9417
 
9589
- // #9682: remove data so that it's not used in an eventual retry
9418
+ // trac-9682: remove data so that it's not used in an eventual retry
9590
9419
  delete s.data;
9591
9420
  }
9592
9421
 
@@ -9727,8 +9556,10 @@ jQuery.extend( {
9727
9556
  response = ajaxHandleResponses( s, jqXHR, responses );
9728
9557
  }
9729
9558
 
9730
- // Use a noop converter for missing script
9731
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
9559
+ // Use a noop converter for missing script but not if jsonp
9560
+ if ( !isSuccess &&
9561
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
9562
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
9732
9563
  s.converters[ "text script" ] = function() {};
9733
9564
  }
9734
9565
 
@@ -9857,7 +9688,7 @@ jQuery._evalUrl = function( url, options, doc ) {
9857
9688
  return jQuery.ajax( {
9858
9689
  url: url,
9859
9690
 
9860
- // Make this explicit, since user can override this through ajaxSetup (#11264)
9691
+ // Make this explicit, since user can override this through ajaxSetup (trac-11264)
9861
9692
  type: "GET",
9862
9693
  dataType: "script",
9863
9694
  cache: true,
@@ -9966,7 +9797,7 @@ var xhrSuccessStatus = {
9966
9797
  0: 200,
9967
9798
 
9968
9799
  // Support: IE <=9 only
9969
- // #1450: sometimes IE returns 1223 when it should be 204
9800
+ // trac-1450: sometimes IE returns 1223 when it should be 204
9970
9801
  1223: 204
9971
9802
  },
9972
9803
  xhrSupported = jQuery.ajaxSettings.xhr();
@@ -10038,7 +9869,7 @@ jQuery.ajaxTransport( function( options ) {
10038
9869
  } else {
10039
9870
  complete(
10040
9871
 
10041
- // File: protocol always yields status 0; see #8605, #14207
9872
+ // File: protocol always yields status 0; see trac-8605, trac-14207
10042
9873
  xhr.status,
10043
9874
  xhr.statusText
10044
9875
  );
@@ -10099,7 +9930,7 @@ jQuery.ajaxTransport( function( options ) {
10099
9930
  xhr.send( options.hasContent && options.data || null );
10100
9931
  } catch ( e ) {
10101
9932
 
10102
- // #14683: Only rethrow if this hasn't been notified as an error yet
9933
+ // trac-14683: Only rethrow if this hasn't been notified as an error yet
10103
9934
  if ( callback ) {
10104
9935
  throw e;
10105
9936
  }
@@ -10466,12 +10297,6 @@ jQuery.offset = {
10466
10297
  options.using.call( elem, props );
10467
10298
 
10468
10299
  } else {
10469
- if ( typeof props.top === "number" ) {
10470
- props.top += "px";
10471
- }
10472
- if ( typeof props.left === "number" ) {
10473
- props.left += "px";
10474
- }
10475
10300
  curElem.css( props );
10476
10301
  }
10477
10302
  }
@@ -10640,8 +10465,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
10640
10465
 
10641
10466
  // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10642
10467
  jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10643
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10644
- function( defaultExtra, funcName ) {
10468
+ jQuery.each( {
10469
+ padding: "inner" + name,
10470
+ content: type,
10471
+ "": "outer" + name
10472
+ }, function( defaultExtra, funcName ) {
10645
10473
 
10646
10474
  // Margin is only for outerHeight, outerWidth
10647
10475
  jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10554,8 @@ jQuery.fn.extend( {
10726
10554
  }
10727
10555
  } );
10728
10556
 
10729
- jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10557
+ jQuery.each(
10558
+ ( "blur focus focusin focusout resize scroll click dblclick " +
10730
10559
  "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10731
10560
  "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10732
10561
  function( _i, name ) {
@@ -10737,14 +10566,17 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10737
10566
  this.on( name, null, data, fn ) :
10738
10567
  this.trigger( name );
10739
10568
  };
10740
- } );
10569
+ }
10570
+ );
10741
10571
 
10742
10572
 
10743
10573
 
10744
10574
 
10745
10575
  // Support: Android <=4.0 only
10746
10576
  // Make sure we trim BOM and NBSP
10747
- var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10577
+ // Require that the "whitespace run" starts from a non-whitespace
10578
+ // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
10579
+ var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
10748
10580
 
10749
10581
  // Bind a function to a context, optionally partially applying any
10750
10582
  // arguments.
@@ -10811,7 +10643,7 @@ jQuery.isNumeric = function( obj ) {
10811
10643
  jQuery.trim = function( text ) {
10812
10644
  return text == null ?
10813
10645
  "" :
10814
- ( text + "" ).replace( rtrim, "" );
10646
+ ( text + "" ).replace( rtrim, "$1" );
10815
10647
  };
10816
10648
 
10817
10649
 
@@ -10859,8 +10691,8 @@ jQuery.noConflict = function( deep ) {
10859
10691
  };
10860
10692
 
10861
10693
  // Expose jQuery and $ identifiers, even in AMD
10862
- // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10863
- // and CommonJS for browser emulators (#13566)
10694
+ // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
10695
+ // and CommonJS for browser emulators (trac-13566)
10864
10696
  if ( typeof noGlobal === "undefined" ) {
10865
10697
  window.jQuery = window.$ = jQuery;
10866
10698
  }