From 39b788867dea95f15be4cfea0dcdb4d875c1163a Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 30 Sep 2022 13:09:10 +0200 Subject: [PATCH] Updated docs and manual --- Makefile | 1 + docs/Reticulum Manual.pdf | Bin 2365177 -> 2366646 bytes docs/manual/_sources/index.rst.txt | 2 +- docs/manual/_sources/reference.rst.txt | 106 +- docs/manual/_static/jquery-3.5.1.js | 10872 --------------------- docs/manual/_static/underscore-1.12.0.js | 2027 ---- docs/manual/examples.html | 20 +- docs/manual/index.html | 30 +- docs/manual/networks.html | 10 +- docs/manual/objects.inv | Bin 2171 -> 2140 bytes docs/manual/reference.html | 277 +- docs/manual/searchindex.js | 2 +- docs/manual/support.html | 10 +- docs/source/conf.py | 17 +- docs/source/index.rst | 2 +- docs/source/reference.rst | 106 +- 16 files changed, 335 insertions(+), 13147 deletions(-) delete mode 100644 docs/manual/_static/jquery-3.5.1.js delete mode 100644 docs/manual/_static/underscore-1.12.0.js diff --git a/Makefile b/Makefile index 1e20a37..3890f1a 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ clean: @-rm -rf ./tests/__pycache__ @-rm -rf ./tests/rnsconfig/storage @-rm -rf ./*.egg-info + @make -C docs clean @echo Done remove_symlinks: diff --git a/docs/Reticulum Manual.pdf b/docs/Reticulum Manual.pdf index 8c47e3241f336bdd0b7176e499fb0c8473220b05..b7805fe47d8182f73432ef447ab8b3641c4777e9 100644 GIT binary patch delta 97473 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 delta 97774 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 G@c#g-k*M?l diff --git a/docs/manual/_sources/index.rst.txt b/docs/manual/_sources/index.rst.txt index bb3e0f5..d61a548 100644 --- a/docs/manual/_sources/index.rst.txt +++ b/docs/manual/_sources/index.rst.txt @@ -15,8 +15,8 @@ to participate in the development of Reticulum itself. hardware interfaces networks - reference examples + reference support diff --git a/docs/manual/_sources/reference.rst.txt b/docs/manual/_sources/reference.rst.txt index e09ec49..27e6eff 100644 --- a/docs/manual/_sources/reference.rst.txt +++ b/docs/manual/_sources/reference.rst.txt @@ -1,18 +1,26 @@ +:tocdepth: 4 + .. _api-main: ************* API Reference ************* -This reference guide lists and explains all classes exposed by the RNS API. +This chapter lists and explains all classes exposed by the Reticulum Network Stack API, along with their methods and usage. It can be used as a reference while writing applications that utilise Reticulum, or read in entirity to gain an understanding of the complete functionality of RNS from a developers perspective. Classes ========================= -Communication over a Reticulum network is achieved using a set of classes exposed by RNS. +Communication over a Reticulum network is achieved using a set of classes exposed by the RNS API. .. _api-reticulum: -Reticulum ---------- +.. only:: html + + |start-h3| Reticulum |end-h3| + +.. only:: latex + + Reticulum + --------- .. autoclass:: RNS.Reticulum :members: @@ -20,64 +28,120 @@ Reticulum .. _api-identity: -Identity --------- +.. only:: html + + |start-h3| Identity |end-h3| + +.. only:: latex + + Identity + -------- .. autoclass:: RNS.Identity :members: .. _api-destination: -Destination ------------ +.. only:: html + + |start-h3| Destination |end-h3| + +.. only:: latex + + Destination + ----------- .. autoclass:: RNS.Destination :members: .. _api-packet: -Packet ------- +.. only:: html + + |start-h3| Packet |end-h3| + +.. only:: latex + + Packet + ------ .. autoclass:: RNS.Packet(destination, data, create_receipt = True) :members: .. _api-packetreceipt: -Packet Receipt --------------- +.. only:: html + + |start-h3| Packet Receipt |end-h3| + +.. only:: latex + + Packet Receipt + -------------- .. autoclass:: RNS.PacketReceipt() :members: .. _api-link: -Link ----- +.. only:: html + + |start-h3| Link |end-h3| + +.. only:: latex + + Link + ---- .. autoclass:: RNS.Link(destination, established_callback=None, closed_callback = None) :members: .. _api-requestreceipt: -Request Receipt ---------------- +.. only:: html + + |start-h3| Request Receipt |end-h3| + +.. only:: latex + + Request Receipt + --------------- .. autoclass:: RNS.RequestReceipt() :members: .. _api-resource: -Resource --------- +.. only:: html + + |start-h3| Resource |end-h3| + +.. only:: latex + + Resource + -------- .. autoclass:: RNS.Resource(data, link, advertise=True, auto_compress=True, callback=None, progress_callback=None, timeout=None) :members: .. _api-transport: -Transport ---------- +.. only:: html + + |start-h3| Transport |end-h3| + +.. only:: latex + + Transport + --------- .. autoclass:: RNS.Transport - :members: \ No newline at end of file + :members: + +.. |start-h3| raw:: html + +

+ +.. |end-h3| raw:: html + +

\ No newline at end of file diff --git a/docs/manual/_static/jquery-3.5.1.js b/docs/manual/_static/jquery-3.5.1.js deleted file mode 100644 index 5093733..0000000 --- a/docs/manual/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "