PageSourceSearch

https://pskovlib.ru/media/t4/optimize/js/da68a1570b478d39d6ef3a5779ca21b9.js

js pskovlib.ru collected 2026-10-02 10:05:37 UTC 397,462 bytes, 12,010 lines download raw bytes

vendor: 4,853 bytes, lines 1-184
1/*jquery.js*/
2/*!
3 * jQuery JavaScript Library v1.12.4-joomla
4 * http://jquery.com/
5 *
6 * Includes Sizzle.js
7 * http://sizzlejs.com/
8 *
9 * Copyright jQuery Foundation and other contributors
10 * Released under the MIT license
11 * http://jquery.org/license
12 *
13 * Date: 2016-05-20T17:17Z
14 *
15 * Modified by Joomla: Mitigate possible XSS vulnerability (gh-2432), CMS Issue 19464; Prevent Object Prototype Polution, https://github.com/jquery/jquery/pull/4333
16 * Modified by Joomla: Mitigate possible XSS vulnerability CVE-2020-11022 and CVE-2020-11023, CMS Issue 28948; https://github.com/DanielRuf/snyk-js-jquery-565129 & https://git.drupalcode.org/project/drupal/-/commit/8a48ad8710aa2ec3dc32e03ad5985710079b65aa
17 */
18
19(function( global, factory ) {
20
21	if ( typeof module === "object" && typeof module.exports === "object" ) {
22		// For CommonJS and CommonJS-like environments where a proper `window`
23		// is present, execute the factory and get jQuery.
24		// For environments that do not have a `window` with a `document`
25		// (such as Node.js), expose a factory as module.exports.
26		// This accentuates the need for the creation of a real `window`.
27		// e.g. var jQuery = require("jquery")(window);
28		// See ticket #14549 for more info.
29		module.exports = global.document ?
30			factory( global, true ) :
31			function( w ) {
32				if ( !w.document ) {
33					throw new Error( "jQuery requires a window with a document" );
34				}
35				return factory( w );
36			};
37	} else {
38		factory( global );
39	}
40
41// Pass this if window is not defined yet
42}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
43
44// Support: Firefox 18+
45// Can't be in strict mode, several libs including ASP.NET trace
46// the stack via arguments.caller.callee and Firefox dies if
47// you try to trace through "use strict" call chains. (#13335)
48//"use strict";
49var deletedIds = [];
50
51var document = window.document;
52
53var slice = deletedIds.slice;
54
55var concat = deletedIds.concat;
56
57var push = deletedIds.push;
58
59var indexOf = deletedIds.indexOf;
60
61var class2type = {};
62
63var toString = class2type.toString;
64
65var hasOwn = class2type.hasOwnProperty;
66
67var support = {};
68
69
70
71var
72	version = "1.12.4",
73
74	// Define a local copy of jQuery
75	jQuery = function( selector, context ) {
76
77		// The jQuery object is actually just the init constructor 'enhanced'
78		// Need init if jQuery is called (just allow error to be thrown if not included)
79		return new jQuery.fn.init( selector, context );
80	},
81
82	// Support: Android<4.1, IE<9
83	// Make sure we trim BOM and NBSP
84	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
85
86	// Matches dashed string for camelizing
87	rmsPrefix = /^-ms-/,
88	rdashAlpha = /-([\da-z])/gi,
89
90	// Used by jQuery.camelCase as callback to replace()
91	fcamelCase = function( all, letter ) {
92		return letter.toUpperCase();
93	};
94
95jQuery.fn = jQuery.prototype = {
96
97	// The current version of jQuery being used
98	jquery: version,
99
100	constructor: jQuery,
101
102	// Start with an empty selector
103	selector: "",
104
105	// The default length of a jQuery object is 0
106	length: 0,
107
108	toArray: function() {
109		return slice.call( this );
110	},
111
112	// Get the Nth element in the matched element set OR
113	// Get the whole matched element set as a clean array
114	get: function( num ) {
115		return num != null ?
116
117			// Return just the one element from the set
118			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
119
120			// Return all the elements in a clean array
121			slice.call( this );
122	},
123
124	// Take an array of elements and push it onto the stack
125	// (returning the new matched element set)
126	pushStack: function( elems ) {
127
128		// Build a new jQuery matched element set
129		var ret = jQuery.merge( this.constructor(), elems );
130
131		// Add the old object onto the stack (as a reference)
132		ret.prevObject = this;
133		ret.context = this.context;
134
135		// Return the newly-formed element set
136		return ret;
137	},
138
139	// Execute a callback for every element in the matched set.
140	each: function( callback ) {
141		return jQuery.each( this, callback );
142	},
143
144	map: function( callback ) {
145		return this.pushStack( jQuery.map( this, function( elem, i ) {
146			return callback.call( elem, i, elem );
147		} ) );
148	},
149
150	slice: function() {
151		return this.pushStack( slice.apply( this, arguments ) );
152	},
153
154	first: function() {
155		return this.eq( 0 );
156	},
157
158	last: function() {
159		return this.eq( -1 );
160	},
161
162	eq: function( i ) {
163		var len = this.length,
164			j = +i + ( i < 0 ? len : 0 );
165		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
166	},
167
168	end: function() {
169		return this.prevObject || this.constructor();
170	},
171
172	// For internal use only.
173	// Behaves like an Array's method, not like a jQuery method.
174	push: push,
175	sort: deletedIds.sort,
176	splice: deletedIds.splice
177};
178
179jQuery.extend = jQuery.fn.extend = function() {
180	var src, copyIsArray, copy, name, options, clone,
181		target = arguments[ 0 ] || {},
182		i = 1,
183		length = arguments.length,
184		deep = false;
vendor: 8,993 bytes, lines 185-558
185
186	// Handle a deep copy situation
187	if ( typeof target === "boolean" ) {
188		deep = target;
189
190		// skip the boolean and the target
191		target = arguments[ i ] || {};
192		i++;
193	}
194
195	// Handle case when target is a string or something (possible in deep copy)
196	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
197		target = {};
198	}
199
200	// extend jQuery itself if only one argument is passed
201	if ( i === length ) {
202		target = this;
203		i--;
204	}
205
206	for ( ; i < length; i++ ) {
207
208		// Only deal with non-null/undefined values
209		if ( ( options = arguments[ i ] ) != null ) {
210
211			// Extend the base object
212			for ( name in options ) {
213				src = target[ name ];
214				copy = options[ name ];
215
216				// Prevent never-ending loop
217				// ADDED by Joomla: Prevent Object Prototype Polution, see https://github.com/jquery/jquery/pull/4333
218				if ( name === "__proto__" || target === copy ) {
219					continue;
220				}
221
222				// Recurse if we're merging plain objects or arrays
223				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
224					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
225
226					if ( copyIsArray ) {
227						copyIsArray = false;
228						clone = src && jQuery.isArray( src ) ? src : [];
229
230					} else {
231						clone = src && jQuery.isPlainObject( src ) ? src : {};
232					}
233
234					// Never move original objects, clone them
235					target[ name ] = jQuery.extend( deep, clone, copy );
236
237				// Don't bring in undefined values
238				} else if ( copy !== undefined ) {
239					target[ name ] = copy;
240				}
241			}
242		}
243	}
244
245	// Return the modified object
246	return target;
247};
248
249jQuery.extend( {
250
251	// Unique for each copy of jQuery on the page
252	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
253
254	// Assume jQuery is ready without the ready module
255	isReady: true,
256
257	error: function( msg ) {
258		throw new Error( msg );
259	},
260
261	noop: function() {},
262
263	// See test/unit/core.js for details concerning isFunction.
264	// Since version 1.3, DOM methods and functions like alert
265	// aren't supported. They return false on IE (#2968).
266	isFunction: function( obj ) {
267		return jQuery.type( obj ) === "function";
268	},
269
270	isArray: Array.isArray || function( obj ) {
271		return jQuery.type( obj ) === "array";
272	},
273
274	isWindow: function( obj ) {
275		/* jshint eqeqeq: false */
276		return obj != null && obj == obj.window;
277	},
278
279	isNumeric: function( obj ) {
280
281		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
282		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
283		// subtraction forces infinities to NaN
284		// adding 1 corrects loss of precision from parseFloat (#15100)
285		var realStringObj = obj && obj.toString();
286		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
287	},
288
289	isEmptyObject: function( obj ) {
290		var name;
291		for ( name in obj ) {
292			return false;
293		}
294		return true;
295	},
296
297	isPlainObject: function( obj ) {
298		var key;
299
300		// Must be an Object.
301		// Because of IE, we also have to check the presence of the constructor property.
302		// Make sure that DOM nodes and window objects don't pass through, as well
303		if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
304			return false;
305		}
306
307		try {
308
309			// Not own constructor property must be Object
310			if ( obj.constructor &&
311				!hasOwn.call( obj, "constructor" ) &&
312				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
313				return false;
314			}
315		} catch ( e ) {
316
317			// IE8,9 Will throw exceptions on certain host objects #9897
318			return false;
319		}
320
321		// Support: IE<9
322		// Handle iteration over inherited properties before own properties.
323		if ( !support.ownFirst ) {
324			for ( key in obj ) {
325				return hasOwn.call( obj, key );
326			}
327		}
328
329		// Own properties are enumerated firstly, so to speed up,
330		// if last one is own, then all properties are own.
331		for ( key in obj ) {}
332
333		return key === undefined || hasOwn.call( obj, key );
334	},
335
336	type: function( obj ) {
337		if ( obj == null ) {
338			return obj + "";
339		}
340		return typeof obj === "object" || typeof obj === "function" ?
341			class2type[ toString.call( obj ) ] || "object" :
342			typeof obj;
343	},
344
345	// Workarounds based on findings by Jim Driscoll
346	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
347	globalEval: function( data ) {
348		if ( data && jQuery.trim( data ) ) {
349
350			// We use execScript on Internet Explorer
351			// We use an anonymous function so that context is window
352			// rather than jQuery in Firefox
353			( window.execScript || function( data ) {
354				window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
355			} )( data );
356		}
357	},
358
359	// Convert dashed to camelCase; used by the css and data modules
360	// Microsoft forgot to hump their vendor prefix (#9572)
361	camelCase: function( string ) {
362		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
363	},
364
365	nodeName: function( elem, name ) {
366		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
367	},
368
369	each: function( obj, callback ) {
370		var length, i = 0;
371
372		if ( isArrayLike( obj ) ) {
373			length = obj.length;
374			for ( ; i < length; i++ ) {
375				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
376					break;
377				}
378			}
379		} else {
380			for ( i in obj ) {
381				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
382					break;
383				}
384			}
385		}
386
387		return obj;
388	},
389
390	// Support: Android<4.1, IE<9
391	trim: function( text ) {
392		return text == null ?
393			"" :
394			( text + "" ).replace( rtrim, "" );
395	},
396
397	// results is for internal usage only
398	makeArray: function( arr, results ) {
399		var ret = results || [];
400
401		if ( arr != null ) {
402			if ( isArrayLike( Object( arr ) ) ) {
403				jQuery.merge( ret,
404					typeof arr === "string" ?
405					[ arr ] : arr
406				);
407			} else {
408				push.call( ret, arr );
409			}
410		}
411
412		return ret;
413	},
414
415	inArray: function( elem, arr, i ) {
416		var len;
417
418		if ( arr ) {
419			if ( indexOf ) {
420				return indexOf.call( arr, elem, i );
421			}
422
423			len = arr.length;
424			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
425
426			for ( ; i < len; i++ ) {
427
428				// Skip accessing in sparse arrays
429				if ( i in arr && arr[ i ] === elem ) {
430					return i;
431				}
432			}
433		}
434
435		return -1;
436	},
437
438	merge: function( first, second ) {
439		var len = +second.length,
440			j = 0,
441			i = first.length;
442
443		while ( j < len ) {
444			first[ i++ ] = second[ j++ ];
445		}
446
447		// Support: IE<9
448		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
449		if ( len !== len ) {
450			while ( second[ j ] !== undefined ) {
451				first[ i++ ] = second[ j++ ];
452			}
453		}
454
455		first.length = i;
456
457		return first;
458	},
459
460	grep: function( elems, callback, invert ) {
461		var callbackInverse,
462			matches = [],
463			i = 0,
464			length = elems.length,
465			callbackExpect = !invert;
466
467		// Go through the array, only saving the items
468		// that pass the validator function
469		for ( ; i < length; i++ ) {
470			callbackInverse = !callback( elems[ i ], i );
471			if ( callbackInverse !== callbackExpect ) {
472				matches.push( elems[ i ] );
473			}
474		}
475
476		return matches;
477	},
478
479	// arg is for internal usage only
480	map: function( elems, callback, arg ) {
481		var length, value,
482			i = 0,
483			ret = [];
484
485		// Go through the array, translating each of the items to their new values
486		if ( isArrayLike( elems ) ) {
487			length = elems.length;
488			for ( ; i < length; i++ ) {
489				value = callback( elems[ i ], i, arg );
490
491				if ( value != null ) {
492					ret.push( value );
493				}
494			}
495
496		// Go through every key on the object,
497		} else {
498			for ( i in elems ) {
499				value = callback( elems[ i ], i, arg );
500
501				if ( value != null ) {
502					ret.push( value );
503				}
504			}
505		}
506
507		// Flatten any nested arrays
508		return concat.apply( [], ret );
509	},
510
511	// A global GUID counter for objects
512	guid: 1,
513
514	// Bind a function to a context, optionally partially applying any
515	// arguments.
516	proxy: function( fn, context ) {
517		var args, proxy, tmp;
518
519		if ( typeof context === "string" ) {
520			tmp = fn[ context ];
521			context = fn;
522			fn = tmp;
523		}
524
525		// Quick check to determine if target is callable, in the spec
526		// this throws a TypeError, but we will just return undefined.
527		if ( !jQuery.isFunction( fn ) ) {
528			return undefined;
529		}
530
531		// Simulated bind
532		args = slice.call( arguments, 2 );
533		proxy = function() {
534			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
535		};
536
537		// Set the guid of unique handler to the same of original handler, so it can be removed
538		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
539
540		return proxy;
541	},
542
543	now: function() {
544		return +( new Date() );
545	},
546
547	// jQuery.support is not used in Core but other projects attach their
548	// properties to it so it needs to exist.
549	support: support
550} );
551
552// JSHint would error on this code due to the Symbol not being defined in ES5.
553// Defining this global in .jshintrc would create a danger of using the global
554// unguarded in another place, it seems safer to just disable JSHint for these
555// three lines.
556/* jshint ignore: start */
557if ( typeof Symbol === "function" ) {
558	jQuery.fn[ Symbol.iterator ] = deletedIds
vendor: 63,327 bytes, lines 558-2795
558[ Symbol.iterator ];
559}
560/* jshint ignore: end */
561
562// Populate the class2type map
563jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
564function( i, name ) {
565	class2type[ "[object " + name + "]" ] = name.toLowerCase();
566} );
567
568function isArrayLike( obj ) {
569
570	// Support: iOS 8.2 (not reproducible in simulator)
571	// `in` check used to prevent JIT error (gh-2145)
572	// hasOwn isn't used here due to false negatives
573	// regarding Nodelist length in IE
574	var length = !!obj && "length" in obj && obj.length,
575		type = jQuery.type( obj );
576
577	if ( type === "function" || jQuery.isWindow( obj ) ) {
578		return false;
579	}
580
581	return type === "array" || length === 0 ||
582		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
583}
584var Sizzle =
585/*!
586 * Sizzle CSS Selector Engine v2.2.1
587 * http://sizzlejs.com/
588 *
589 * Copyright jQuery Foundation and other contributors
590 * Released under the MIT license
591 * http://jquery.org/license
592 *
593 * Date: 2015-10-17
594 */
595(function( window ) {
596
597var i,
598	support,
599	Expr,
600	getText,
601	isXML,
602	tokenize,
603	compile,
604	select,
605	outermostContext,
606	sortInput,
607	hasDuplicate,
608
609	// Local document vars
610	setDocument,
611	document,
612	docElem,
613	documentIsHTML,
614	rbuggyQSA,
615	rbuggyMatches,
616	matches,
617	contains,
618
619	// Instance-specific data
620	expando = "sizzle" + 1 * new Date(),
621	preferredDoc = window.document,
622	dirruns = 0,
623	done = 0,
624	classCache = createCache(),
625	tokenCache = createCache(),
626	compilerCache = createCache(),
627	sortOrder = function( a, b ) {
628		if ( a === b ) {
629			hasDuplicate = true;
630		}
631		return 0;
632	},
633
634	// General-purpose constants
635	MAX_NEGATIVE = 1 << 31,
636
637	// Instance methods
638	hasOwn = ({}).hasOwnProperty,
639	arr = [],
640	pop = arr.pop,
641	push_native = arr.push,
642	push = arr.push,
643	slice = arr.slice,
644	// Use a stripped-down indexOf as it's faster than native
645	// http://jsperf.com/thor-indexof-vs-for/5
646	indexOf = function( list, elem ) {
647		var i = 0,
648			len = list.length;
649		for ( ; i < len; i++ ) {
650			if ( list[i] === elem ) {
651				return i;
652			}
653		}
654		return -1;
655	},
656
657	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
658
659	// Regular expressions
660
661	// http://www.w3.org/TR/css3-selectors/#whitespace
662	whitespace = "[\\x20\\t\\r\\n\\f]",
663
664	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
665	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
666
667	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
668	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
669		// Operator (capture 2)
670		"*([*^$|!~]?=)" + whitespace +
671		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
672		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
673		"*\\]",
674
675	pseudos = ":(" + identifier + ")(?:\\((" +
676		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
677		// 1. quoted (capture 3; capture 4 or capture 5)
678		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
679		// 2. simple (capture 6)
680		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
681		// 3. anything else (capture 2)
682		".*" +
683		")\\)|)",
684
685	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
686	rwhitespace = new RegExp( whitespace + "+", "g" ),
687	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
688
689	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
690	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
691
692	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
693
694	rpseudo = new RegExp( pseudos ),
695	ridentifier = new RegExp( "^" + identifier + "$" ),
696
697	matchExpr = {
698		"ID": new RegExp( "^#(" + identifier + ")" ),
699		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
700		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
701		"ATTR": new RegExp( "^" + attributes ),
702		"PSEUDO": new RegExp( "^" + pseudos ),
703		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
704			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
705			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
706		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
707		// For use in libraries implementing .is()
708		// We use this for POS matching in `select`
709		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
710			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
711	},
712
713	rinputs = /^(?:input|select|textarea|button)$/i,
714	rheader = /^h\d$/i,
715
716	rnative = /^[^{]+\{\s*\[native \w/,
717
718	// Easily-parseable/retrievable ID or TAG or CLASS selectors
719	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
720
721	rsibling = /[+~]/,
722	rescape = /'|\\/g,
723
724	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
725	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
726	funescape = function( _, escaped, escapedWhitespace ) {
727		var high = "0x" + escaped - 0x10000;
728		// NaN means non-codepoint
729		// Support: Firefox<24
730		// Workaround erroneous numeric interpretation of +"0x"
731		return high !== high || escapedWhitespace ?
732			escaped :
733			high < 0 ?
734				// BMP codepoint
735				String.fromCharCode( high + 0x10000 ) :
736				// Supplemental Plane codepoint (surrogate pair)
737				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
738	},
739
740	// Used for iframes
741	// See setDocument()
742	// Removing the function wrapper causes a "Permission Denied"
743	// error in IE
744	unloadHandler = function() {
745		setDocument();
746	};
747
748// Optimize for push.apply( _, NodeList )
749try {
750	push.apply(
751		(arr = slice.call( preferredDoc.childNodes )),
752		preferredDoc.childNodes
753	);
754	// Support: Android<4.0
755	// Detect silently failing push.apply
756	arr[ preferredDoc.childNodes.length ].nodeType;
757} catch ( e ) {
758	push = { apply: arr.length ?
759
760		// Leverage slice if possible
761		function( target, els ) {
762			push_native.apply( target, slice.call(els) );
763		} :
764
765		// Support: IE<9
766		// Otherwise append directly
767		function( target, els ) {
768			var j = target.length,
769				i = 0;
770			// Can't trust NodeList.length
771			while ( (target[j++] = els[i++]) ) {}
772			target.length = j - 1;
773		}
774	};
775}
776
777function Sizzle( selector, context, results, seed ) {
778	var m, i, elem, nid, nidselect, match, groups, newSelector,
779		newContext = context && context.ownerDocument,
780
781		// nodeType defaults to 9, since context defaults to document
782		nodeType = context ? context.nodeType : 9;
783
784	results = results || [];
785
786	// Return early from calls with invalid selector or context
787	if ( typeof selector !== "string" || !selector ||
788		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
789
790		return results;
791	}
792
793	// Try to shortcut find operations (as opposed to filters) in HTML documents
794	if ( !seed ) {
795
796		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
797			setDocument( context );
798		}
799		context = context || document;
800
801		if ( documentIsHTML ) {
802
803			// If the selector is sufficiently simple, try using a "get*By*" DOM method
804			// (excepting DocumentFragment context, where the methods don't exist)
805			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
806
807				// ID selector
808				if ( (m = match[1]) ) {
809
810					// Document context
811					if ( nodeType === 9 ) {
812						if ( (elem = context.getElementById( m )) ) {
813
814							// Support: IE, Opera, Webkit
815							// TODO: identify versions
816							// getElementById can match elements by name instead of ID
817							if ( elem.id === m ) {
818								results.push( elem );
819								return results;
820							}
821						} else {
822							return results;
823						}
824
825					// Element context
826					} else {
827
828						// Support: IE, Opera, Webkit
829						// TODO: identify versions
830						// getElementById can match elements by name instead of ID
831						if ( newContext && (elem = newContext.getElementById( m )) &&
832							contains( context, elem ) &&
833							elem.id === m ) {
834
835							results.push( elem );
836							return results;
837						}
838					}
839
840				// Type selector
841				} else if ( match[2] ) {
842					push.apply( results, context.getElementsByTagName( selector ) );
843					return results;
844
845				// Class selector
846				} else if ( (m = match[3]) && support.getElementsByClassName &&
847					context.getElementsByClassName ) {
848
849					push.apply( results, context.getElementsByClassName( m ) );
850					return results;
851				}
852			}
853
854			// Take advantage of querySelectorAll
855			if ( support.qsa &&
856				!compilerCache[ selector + " " ] &&
857				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
858
859				if ( nodeType !== 1 ) {
860					newContext = context;
861					newSelector = selector;
862
863				// qSA looks outside Element context, which is not what we want
864				// Thanks to Andrew Dupont for this workaround technique
865				// Support: IE <=8
866				// Exclude object elements
867				} else if ( context.nodeName.toLowerCase() !== "object" ) {
868
869					// Capture the context ID, setting it first if necessary
870					if ( (nid = context.getAttribute( "id" )) ) {
871						nid = nid.replace( rescape, "\\$&" );
872					} else {
873						context.setAttribute( "id", (nid = expando) );
874					}
875
876					// Prefix every selector in the list
877					groups = tokenize( selector );
878					i = groups.length;
879					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
880					while ( i-- ) {
881						groups[i] = nidselect + " " + toSelector( groups[i] );
882					}
883					newSelector = groups.join( "," );
884
885					// Expand context for sibling selectors
886					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
887						context;
888				}
889
890				if ( newSelector ) {
891					try {
892						push.apply( results,
893							newContext.querySelectorAll( newSelector )
894						);
895						return results;
896					} catch ( qsaError ) {
897					} finally {
898						if ( nid === expando ) {
899							context.removeAttribute( "id" );
900						}
901					}
902				}
903			}
904		}
905	}
906
907	// All others
908	return select( selector.replace( rtrim, "$1" ), context, results, seed );
909}
910
911/**
912 * Create key-value caches of limited size
913 * @returns {function(string, object)} Returns the Object data after storing it on itself with
914 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
915 *	deleting the oldest entry
916 */
917function createCache() {
918	var keys = [];
919
920	function cache( key, value ) {
921		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
922		if ( keys.push( key + " " ) > Expr.cacheLength ) {
923			// Only keep the most recent entries
924			delete cache[ keys.shift() ];
925		}
926		return (cache[ key + " " ] = value);
927	}
928	return cache;
929}
930
931/**
932 * Mark a function for special use by Sizzle
933 * @param {Function} fn The function to mark
934 */
935function markFunction( fn ) {
936	fn[ expando ] = true;
937	return fn;
938}
939
940/**
941 * Support testing using an element
942 * @param {Function} fn Passed the created div and expects a boolean result
943 */
944function assert( fn ) {
945	var div = document.createElement("div");
946
947	try {
948		return !!fn( div );
949	} catch (e) {
950		return false;
951	} finally {
952		// Remove from its parent by default
953		if ( div.parentNode ) {
954			div.parentNode.removeChild( div );
955		}
956		// release memory in IE
957		div = null;
958	}
959}
960
961/**
962 * Adds the same handler for all of the specified attrs
963 * @param {String} attrs Pipe-separated list of attributes
964 * @param {Function} handler The method that will be applied
965 */
966function addHandle( attrs, handler ) {
967	var arr = attrs.split("|"),
968		i = arr.length;
969
970	while ( i-- ) {
971		Expr.attrHandle[ arr[i] ] = handler;
972	}
973}
974
975/**
976 * Checks document order of two siblings
977 * @param {Element} a
978 * @param {Element} b
979 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
980 */
981function siblingCheck( a, b ) {
982	var cur = b && a,
983		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
984			( ~b.sourceIndex || MAX_NEGATIVE ) -
985			( ~a.sourceIndex || MAX_NEGATIVE );
986
987	// Use IE sourceIndex if available on both nodes
988	if ( diff ) {
989		return diff;
990	}
991
992	// Check if b follows a
993	if ( cur ) {
994		while ( (cur = cur.nextSibling) ) {
995			if ( cur === b ) {
996				return -1;
997			}
998		}
999	}
1000
1001	return a ? 1 : -1;
1002}
1003
1004/**
1005 * Returns a function to use in pseudos for input types
1006 * @param {String} type
1007 */
1008function createInputPseudo( type ) {
1009	return function( elem ) {
1010		var name = elem.nodeName.toLowerCase();
1011		return name === "input" && elem.type === type;
1012	};
1013}
1014
1015/**
1016 * Returns a function to use in pseudos for buttons
1017 * @param {String} type
1018 */
1019function createButtonPseudo( type ) {
1020	return function( elem ) {
1021		var name = elem.nodeName.toLowerCase();
1022		return (name === "input" || name === "button") && elem.type === type;
1023	};
1024}
1025
1026/**
1027 * Returns a function to use in pseudos for positionals
1028 * @param {Function} fn
1029 */
1030function createPositionalPseudo( fn ) {
1031	return markFunction(function( argument ) {
1032		argument = +argument;
1033		return markFunction(function( seed, matches ) {
1034			var j,
1035				matchIndexes = fn( [], seed.length, argument ),
1036				i = matchIndexes.length;
1037
1038			// Match elements found at the specified indexes
1039			while ( i-- ) {
1040				if ( seed[ (j = matchIndexes[i]) ] ) {
1041					seed[j] = !(matches[j] = seed[j]);
1042				}
1043			}
1044		});
1045	});
1046}
1047
1048/**
1049 * Checks a node for validity as a Sizzle context
1050 * @param {Element|Object=} context
1051 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1052 */
1053function testContext( context ) {
1054	return context && typeof context.getElementsByTagName !== "undefined" && context;
1055}
1056
1057// Expose support vars for convenience
1058support = Sizzle.support = {};
1059
1060/**
1061 * Detects XML nodes
1062 * @param {Element|Object} elem An element or a document
1063 * @returns {Boolean} True iff elem is a non-HTML XML node
1064 */
1065isXML = Sizzle.isXML = function( elem ) {
1066	// documentElement is verified for cases where it doesn't yet exist
1067	// (such as loading iframes in IE - #4833)
1068	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1069	return documentElement ? documentElement.nodeName !== "HTML" : false;
1070};
1071
1072/**
1073 * Sets document-related variables once based on the current document
1074 * @param {Element|Object} [doc] An element or document object to use to set the document
1075 * @returns {Object} Returns the current document
1076 */
1077setDocument = Sizzle.setDocument = function( node ) {
1078	var hasCompare, parent,
1079		doc = node ? node.ownerDocument || node : preferredDoc;
1080
1081	// Return early if doc is invalid or already selected
1082	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1083		return document;
1084	}
1085
1086	// Update global variables
1087	document = doc;
1088	docElem = document.documentElement;
1089	documentIsHTML = !isXML( document );
1090
1091	// Support: IE 9-11, Edge
1092	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1093	if ( (parent = document.defaultView) && parent.top !== parent ) {
1094		// Support: IE 11
1095		if ( parent.addEventListener ) {
1096			parent.addEventListener( "unload", unloadHandler, false );
1097
1098		// Support: IE 9 - 10 only
1099		} else if ( parent.attachEvent ) {
1100			parent.attachEvent( "onunload", unloadHandler );
1101		}
1102	}
1103
1104	/* Attributes
1105	---------------------------------------------------------------------- */
1106
1107	// Support: IE<8
1108	// Verify that getAttribute really returns attributes and not properties
1109	// (excepting IE8 booleans)
1110	support.attributes = assert(function( div ) {
1111		div.className = "i";
1112		return !div.getAttribute("className");
1113	});
1114
1115	/* getElement(s)By*
1116	---------------------------------------------------------------------- */
1117
1118	// Check if getElementsByTagName("*") returns only elements
1119	support.getElementsByTagName = assert(function( div ) {
1120		div.appendChild( document.createComment("") );
1121		return !div.getElementsByTagName("*").length;
1122	});
1123
1124	// Support: IE<9
1125	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1126
1127	// Support: IE<10
1128	// Check if getElementById returns elements by name
1129	// The broken getElementById methods don't pick up programatically-set names,
1130	// so use a roundabout getElementsByName test
1131	support.getById = assert(function( div ) {
1132		docElem.appendChild( div ).id = expando;
1133		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1134	});
1135
1136	// ID find and filter
1137	if ( support.getById ) {
1138		Expr.find["ID"] = function( id, context ) {
1139			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1140				var m = context.getElementById( id );
1141				return m ? [ m ] : [];
1142			}
1143		};
1144		Expr.filter["ID"] = function( id ) {
1145			var attrId = id.replace( runescape, funescape );
1146			return function( elem ) {
1147				return elem.getAttribute("id") === attrId;
1148			};
1149		};
1150	} else {
1151		// Support: IE6/7
1152		// getElementById is not reliable as a find shortcut
1153		delete Expr.find["ID"];
1154
1155		Expr.filter["ID"] =  function( id ) {
1156			var attrId = id.replace( runescape, funescape );
1157			return function( elem ) {
1158				var node = typeof elem.getAttributeNode !== "undefined" &&
1159					elem.getAttributeNode("id");
1160				return node && node.value === attrId;
1161			};
1162		};
1163	}
1164
1165	// Tag
1166	Expr.find["TAG"] = support.getElementsByTagName ?
1167		function( tag, context ) {
1168			if ( typeof context.getElementsByTagName !== "undefined" ) {
1169				return context.getElementsByTagName( tag );
1170
1171			// DocumentFragment nodes don't have gEBTN
1172			} else if ( support.qsa ) {
1173				return context.querySelectorAll( tag );
1174			}
1175		} :
1176
1177		function( tag, context ) {
1178			var elem,
1179				tmp = [],
1180				i = 0,
1181				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1182				results = context.getElementsByTagName( tag );
1183
1184			// Filter out possible comments
1185			if ( tag === "*" ) {
1186				while ( (elem = results[i++]) ) {
1187					if ( elem.nodeType === 1 ) {
1188						tmp.push( elem );
1189					}
1190				}
1191
1192				return tmp;
1193			}
1194			return results;
1195		};
1196
1197	// Class
1198	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1199		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1200			return context.getElementsByClassName( className );
1201		}
1202	};
1203
1204	/* QSA/matchesSelector
1205	---------------------------------------------------------------------- */
1206
1207	// QSA and matchesSelector support
1208
1209	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1210	rbuggyMatches = [];
1211
1212	// qSa(:focus) reports false when true (Chrome 21)
1213	// We allow this because of a bug in IE8/9 that throws an error
1214	// whenever `document.activeElement` is accessed on an iframe
1215	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1216	// See http://bugs.jquery.com/ticket/13378
1217	rbuggyQSA = [];
1218
1219	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1220		// Build QSA regex
1221		// Regex strategy adopted from Diego Perini
1222		assert(function( div ) {
1223			// Select is set to empty string on purpose
1224			// This is to test IE's treatment of not explicitly
1225			// setting a boolean content attribute,
1226			// since its presence should be enough
1227			// http://bugs.jquery.com/ticket/12359
1228			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
1229				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1230				"<option selected=''></option></select>";
1231
1232			// Support: IE8, Opera 11-12.16
1233			// Nothing should be selected when empty strings follow ^= or $= or *=
1234			// The test attribute must be unknown in Opera but "safe" for WinRT
1235			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1236			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
1237				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1238			}
1239
1240			// Support: IE8
1241			// Boolean attributes and "value" are not treated correctly
1242			if ( !div.querySelectorAll("[selected]").length ) {
1243				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1244			}
1245
1246			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1247			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1248				rbuggyQSA.push("~=");
1249			}
1250
1251			// Webkit/Opera - :checked should return selected option elements
1252			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1253			// IE8 throws error here and will not see later tests
1254			if ( !div.querySelectorAll(":checked").length ) {
1255				rbuggyQSA.push(":checked");
1256			}
1257
1258			// Support: Safari 8+, iOS 8+
1259			// https://bugs.webkit.org/show_bug.cgi?id=136851
1260			// In-page `selector#id sibing-combinator selector` fails
1261			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
1262				rbuggyQSA.push(".#.+[+~]");
1263			}
1264		});
1265
1266		assert(function( div ) {
1267			// Support: Windows 8 Native Apps
1268			// The type and name attributes are restricted during .innerHTML assignment
1269			var input = document.createElement("input");
1270			input.setAttribute( "type", "hidden" );
1271			div.appendChild( input ).setAttribute( "name", "D" );
1272
1273			// Support: IE8
1274			// Enforce case-sensitivity of name attribute
1275			if ( div.querySelectorAll("[name=d]").length ) {
1276				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1277			}
1278
1279			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1280			// IE8 throws error here and will not see later tests
1281			if ( !div.querySelectorAll(":enabled").length ) {
1282				rbuggyQSA.push( ":enabled", ":disabled" );
1283			}
1284
1285			// Opera 10-11 does not throw on post-comma invalid pseudos
1286			div.querySelectorAll("*,:x");
1287			rbuggyQSA.push(",.*:");
1288		});
1289	}
1290
1291	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1292		docElem.webkitMatchesSelector ||
1293		docElem.mozMatchesSelector ||
1294		docElem.oMatchesSelector ||
1295		docElem.msMatchesSelector) )) ) {
1296
1297		assert(function( div ) {
1298			// Check to see if it's possible to do matchesSelector
1299			// on a disconnected node (IE 9)
1300			support.disconnectedMatch = matches.call( div, "div" );
1301
1302			// This should fail with an exception
1303			// Gecko does not error, returns false instead
1304			matches.call( div, "[s!='']:x" );
1305			rbuggyMatches.push( "!=", pseudos );
1306		});
1307	}
1308
1309	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1310	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1311
1312	/* Contains
1313	---------------------------------------------------------------------- */
1314	hasCompare = rnative.test( docElem.compareDocumentPosition );
1315
1316	// Element contains another
1317	// Purposefully self-exclusive
1318	// As in, an element does not contain itself
1319	contains = hasCompare || rnative.test( docElem.contains ) ?
1320		function( a, b ) {
1321			var adown = a.nodeType === 9 ? a.documentElement : a,
1322				bup = b && b.parentNode;
1323			return a === bup || !!( bup && bup.nodeType === 1 && (
1324				adown.contains ?
1325					adown.contains( bup ) :
1326					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1327			));
1328		} :
1329		function( a, b ) {
1330			if ( b ) {
1331				while ( (b = b.parentNode) ) {
1332					if ( b === a ) {
1333						return true;
1334					}
1335				}
1336			}
1337			return false;
1338		};
1339
1340	/* Sorting
1341	---------------------------------------------------------------------- */
1342
1343	// Document order sorting
1344	sortOrder = hasCompare ?
1345	function( a, b ) {
1346
1347		// Flag for duplicate removal
1348		if ( a === b ) {
1349			hasDuplicate = true;
1350			return 0;
1351		}
1352
1353		// Sort on method existence if only one input has compareDocumentPosition
1354		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1355		if ( compare ) {
1356			return compare;
1357		}
1358
1359		// Calculate position if both inputs belong to the same document
1360		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1361			a.compareDocumentPosition( b ) :
1362
1363			// Otherwise we know they are disconnected
1364			1;
1365
1366		// Disconnected nodes
1367		if ( compare & 1 ||
1368			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1369
1370			// Choose the first element that is related to our preferred document
1371			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1372				return -1;
1373			}
1374			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1375				return 1;
1376			}
1377
1378			// Maintain original order
1379			return sortInput ?
1380				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1381				0;
1382		}
1383
1384		return compare & 4 ? -1 : 1;
1385	} :
1386	function( a, b ) {
1387		// Exit early if the nodes are identical
1388		if ( a === b ) {
1389			hasDuplicate = true;
1390			return 0;
1391		}
1392
1393		var cur,
1394			i = 0,
1395			aup = a.parentNode,
1396			bup = b.parentNode,
1397			ap = [ a ],
1398			bp = [ b ];
1399
1400		// Parentless nodes are either documents or disconnected
1401		if ( !aup || !bup ) {
1402			return a === document ? -1 :
1403				b === document ? 1 :
1404				aup ? -1 :
1405				bup ? 1 :
1406				sortInput ?
1407				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1408				0;
1409
1410		// If the nodes are siblings, we can do a quick check
1411		} else if ( aup === bup ) {
1412			return siblingCheck( a, b );
1413		}
1414
1415		// Otherwise we need full lists of their ancestors for comparison
1416		cur = a;
1417		while ( (cur = cur.parentNode) ) {
1418			ap.unshift( cur );
1419		}
1420		cur = b;
1421		while ( (cur = cur.parentNode) ) {
1422			bp.unshift( cur );
1423		}
1424
1425		// Walk down the tree looking for a discrepancy
1426		while ( ap[i] === bp[i] ) {
1427			i++;
1428		}
1429
1430		return i ?
1431			// Do a sibling check if the nodes have a common ancestor
1432			siblingCheck( ap[i], bp[i] ) :
1433
1434			// Otherwise nodes in our document sort first
1435			ap[i] === preferredDoc ? -1 :
1436			bp[i] === preferredDoc ? 1 :
1437			0;
1438	};
1439
1440	return document;
1441};
1442
1443Sizzle.matches = function( expr, elements ) {
1444	return Sizzle( expr, null, null, elements );
1445};
1446
1447Sizzle.matchesSelector = function( elem, expr ) {
1448	// Set document vars if needed
1449	if ( ( elem.ownerDocument || elem ) !== document ) {
1450		setDocument( elem );
1451	}
1452
1453	// Make sure that attribute selectors are quoted
1454	expr = expr.replace( rattributeQuotes, "='$1']" );
1455
1456	if ( support.matchesSelector && documentIsHTML &&
1457		!compilerCache[ expr + " " ] &&
1458		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1459		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1460
1461		try {
1462			var ret = matches.call( elem, expr );
1463
1464			// IE 9's matchesSelector returns false on disconnected nodes
1465			if ( ret || support.disconnectedMatch ||
1466					// As well, disconnected nodes are said to be in a document
1467					// fragment in IE 9
1468					elem.document && elem.document.nodeType !== 11 ) {
1469				return ret;
1470			}
1471		} catch (e) {}
1472	}
1473
1474	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1475};
1476
1477Sizzle.contains = function( context, elem ) {
1478	// Set document vars if needed
1479	if ( ( context.ownerDocument || context ) !== document ) {
1480		setDocument( context );
1481	}
1482	return contains( context, elem );
1483};
1484
1485Sizzle.attr = function( elem, name ) {
1486	// Set document vars if needed
1487	if ( ( elem.ownerDocument || elem ) !== document ) {
1488		setDocument( elem );
1489	}
1490
1491	var fn = Expr.attrHandle[ name.toLowerCase() ],
1492		// Don't get fooled by Object.prototype properties (jQuery #13807)
1493		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1494			fn( elem, name, !documentIsHTML ) :
1495			undefined;
1496
1497	return val !== undefined ?
1498		val :
1499		support.attributes || !documentIsHTML ?
1500			elem.getAttribute( name ) :
1501			(val = elem.getAttributeNode(name)) && val.specified ?
1502				val.value :
1503				null;
1504};
1505
1506Sizzle.error = function( msg ) {
1507	throw new Error( "Syntax error, unrecognized expression: " + msg );
1508};
1509
1510/**
1511 * Document sorting and removing duplicates
1512 * @param {ArrayLike} results
1513 */
1514Sizzle.uniqueSort = function( results ) {
1515	var elem,
1516		duplicates = [],
1517		j = 0,
1518		i = 0;
1519
1520	// Unless we *know* we can detect duplicates, assume their presence
1521	hasDuplicate = !support.detectDuplicates;
1522	sortInput = !support.sortStable && results.slice( 0 );
1523	results.sort( sortOrder );
1524
1525	if ( hasDuplicate ) {
1526		while ( (elem = results[i++]) ) {
1527			if ( elem === results[ i ] ) {
1528				j = duplicates.push( i );
1529			}
1530		}
1531		while ( j-- ) {
1532			results.splice( duplicates[ j ], 1 );
1533		}
1534	}
1535
1536	// Clear input after sorting to release objects
1537	// See https://github.com/jquery/sizzle/pull/225
1538	sortInput = null;
1539
1540	return results;
1541};
1542
1543/**
1544 * Utility function for retrieving the text value of an array of DOM nodes
1545 * @param {Array|Element} elem
1546 */
1547getText = Sizzle.getText = function( elem ) {
1548	var node,
1549		ret = "",
1550		i = 0,
1551		nodeType = elem.nodeType;
1552
1553	if ( !nodeType ) {
1554		// If no nodeType, this is expected to be an array
1555		while ( (node = elem[i++]) ) {
1556			// Do not traverse comment nodes
1557			ret += getText( node );
1558		}
1559	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1560		// Use textContent for elements
1561		// innerText usage removed for consistency of new lines (jQuery #11153)
1562		if ( typeof elem.textContent === "string" ) {
1563			return elem.textContent;
1564		} else {
1565			// Traverse its children
1566			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1567				ret += getText( elem );
1568			}
1569		}
1570	} else if ( nodeType === 3 || nodeType === 4 ) {
1571		return elem.nodeValue;
1572	}
1573	// Do not include comment or processing instruction nodes
1574
1575	return ret;
1576};
1577
1578Expr = Sizzle.selectors = {
1579
1580	// Can be adjusted by the user
1581	cacheLength: 50,
1582
1583	createPseudo: markFunction,
1584
1585	match: matchExpr,
1586
1587	attrHandle: {},
1588
1589	find: {},
1590
1591	relative: {
1592		">": { dir: "parentNode", first: true },
1593		" ": { dir: "parentNode" },
1594		"+": { dir: "previousSibling", first: true },
1595		"~": { dir: "previousSibling" }
1596	},
1597
1598	preFilter: {
1599		"ATTR": function( match ) {
1600			match[1] = match[1].replace( runescape, funescape );
1601
1602			// Move the given value to match[3] whether quoted or unquoted
1603			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1604
1605			if ( match[2] === "~=" ) {
1606				match[3] = " " + match[3] + " ";
1607			}
1608
1609			return match.slice( 0, 4 );
1610		},
1611
1612		"CHILD": function( match ) {
1613			/* matches from matchExpr["CHILD"]
1614				1 type (only|nth|...)
1615				2 what (child|of-type)
1616				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1617				4 xn-component of xn+y argument ([+-]?\d*n|)
1618				5 sign of xn-component
1619				6 x of xn-component
1620				7 sign of y-component
1621				8 y of y-component
1622			*/
1623			match[1] = match[1].toLowerCase();
1624
1625			if ( match[1].slice( 0, 3 ) === "nth" ) {
1626				// nth-* requires argument
1627				if ( !match[3] ) {
1628					Sizzle.error( match[0] );
1629				}
1630
1631				// numeric x and y parameters for Expr.filter.CHILD
1632				// remember that false/true cast respectively to 0/1
1633				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1634				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1635
1636			// other types prohibit arguments
1637			} else if ( match[3] ) {
1638				Sizzle.error( match[0] );
1639			}
1640
1641			return match;
1642		},
1643
1644		"PSEUDO": function( match ) {
1645			var excess,
1646				unquoted = !match[6] && match[2];
1647
1648			if ( matchExpr["CHILD"].test( match[0] ) ) {
1649				return null;
1650			}
1651
1652			// Accept quoted arguments as-is
1653			if ( match[3] ) {
1654				match[2] = match[4] || match[5] || "";
1655
1656			// Strip excess characters from unquoted arguments
1657			} else if ( unquoted && rpseudo.test( unquoted ) &&
1658				// Get excess from tokenize (recursively)
1659				(excess = tokenize( unquoted, true )) &&
1660				// advance to the next closing parenthesis
1661				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1662
1663				// excess is a negative index
1664				match[0] = match[0].slice( 0, excess );
1665				match[2] = unquoted.slice( 0, excess );
1666			}
1667
1668			// Return only captures needed by the pseudo filter method (type and argument)
1669			return match.slice( 0, 3 );
1670		}
1671	},
1672
1673	filter: {
1674
1675		"TAG": function( nodeNameSelector ) {
1676			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1677			return nodeNameSelector === "*" ?
1678				function() { return true; } :
1679				function( elem ) {
1680					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1681				};
1682		},
1683
1684		"CLASS": function( className ) {
1685			var pattern = classCache[ className + " " ];
1686
1687			return pattern ||
1688				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1689				classCache( className, function( elem ) {
1690					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1691				});
1692		},
1693
1694		"ATTR": function( name, operator, check ) {
1695			return function( elem ) {
1696				var result = Sizzle.attr( elem, name );
1697
1698				if ( result == null ) {
1699					return operator === "!=";
1700				}
1701				if ( !operator ) {
1702					return true;
1703				}
1704
1705				result += "";
1706
1707				return operator === "=" ? result === check :
1708					operator === "!=" ? result !== check :
1709					operator === "^=" ? check && result.indexOf( check ) === 0 :
1710					operator === "*=" ? check && result.indexOf( check ) > -1 :
1711					operator === "$=" ? check && result.slice( -check.length ) === check :
1712					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1713					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1714					false;
1715			};
1716		},
1717
1718		"CHILD": function( type, what, argument, first, last ) {
1719			var simple = type.slice( 0, 3 ) !== "nth",
1720				forward = type.slice( -4 ) !== "last",
1721				ofType = what === "of-type";
1722
1723			return first === 1 && last === 0 ?
1724
1725				// Shortcut for :nth-*(n)
1726				function( elem ) {
1727					return !!elem.parentNode;
1728				} :
1729
1730				function( elem, context, xml ) {
1731					var cache, uniqueCache, outerCache, node, nodeIndex, start,
1732						dir = simple !== forward ? "nextSibling" : "previousSibling",
1733						parent = elem.parentNode,
1734						name = ofType && elem.nodeName.toLowerCase(),
1735						useCache = !xml && !ofType,
1736						diff = false;
1737
1738					if ( parent ) {
1739
1740						// :(first|last|only)-(child|of-type)
1741						if ( simple ) {
1742							while ( dir ) {
1743								node = elem;
1744								while ( (node = node[ dir ]) ) {
1745									if ( ofType ?
1746										node.nodeName.toLowerCase() === name :
1747										node.nodeType === 1 ) {
1748
1749										return false;
1750									}
1751								}
1752								// Reverse direction for :only-* (if we haven't yet done so)
1753								start = dir = type === "only" && !start && "nextSibling";
1754							}
1755							return true;
1756						}
1757
1758						start = [ forward ? parent.firstChild : parent.lastChild ];
1759
1760						// non-xml :nth-child(...) stores cache data on `parent`
1761						if ( forward && useCache ) {
1762
1763							// Seek `elem` from a previously-cached index
1764
1765							// ...in a gzip-friendly way
1766							node = parent;
1767							outerCache = node[ expando ] || (node[ expando ] = {});
1768
1769							// Support: IE <9 only
1770							// Defend against cloned attroperties (jQuery gh-1709)
1771							uniqueCache = outerCache[ node.uniqueID ] ||
1772								(outerCache[ node.uniqueID ] = {});
1773
1774							cache = uniqueCache[ type ] || [];
1775							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1776							diff = nodeIndex && cache[ 2 ];
1777							node = nodeIndex && parent.childNodes[ nodeIndex ];
1778
1779							while ( (node = ++nodeIndex && node && node[ dir ] ||
1780
1781								// Fallback to seeking `elem` from the start
1782								(diff = nodeIndex = 0) || start.pop()) ) {
1783
1784								// When found, cache indexes on `parent` and break
1785								if ( node.nodeType === 1 && ++diff && node === elem ) {
1786									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1787									break;
1788								}
1789							}
1790
1791						} else {
1792							// Use previously-cached element index if available
1793							if ( useCache ) {
1794								// ...in a gzip-friendly way
1795								node = elem;
1796								outerCache = node[ expando ] || (node[ expando ] = {});
1797
1798								// Support: IE <9 only
1799								// Defend against cloned attroperties (jQuery gh-1709)
1800								uniqueCache = outerCache[ node.uniqueID ] ||
1801									(outerCache[ node.uniqueID ] = {});
1802
1803								cache = uniqueCache[ type ] || [];
1804								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1805								diff = nodeIndex;
1806							}
1807
1808							// xml :nth-child(...)
1809							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
1810							if ( diff === false ) {
1811								// Use the same loop as above to seek `elem` from the start
1812								while ( (node = ++nodeIndex && node && node[ dir ] ||
1813									(diff = nodeIndex = 0) || start.pop()) ) {
1814
1815									if ( ( ofType ?
1816										node.nodeName.toLowerCase() === name :
1817										node.nodeType === 1 ) &&
1818										++diff ) {
1819
1820										// Cache the index of each encountered element
1821										if ( useCache ) {
1822											outerCache = node[ expando ] || (node[ expando ] = {});
1823
1824											// Support: IE <9 only
1825											// Defend against cloned attroperties (jQuery gh-1709)
1826											uniqueCache = outerCache[ node.uniqueID ] ||
1827												(outerCache[ node.uniqueID ] = {});
1828
1829											uniqueCache[ type ] = [ dirruns, diff ];
1830										}
1831
1832										if ( node === elem ) {
1833											break;
1834										}
1835									}
1836								}
1837							}
1838						}
1839
1840						// Incorporate the offset, then check against cycle size
1841						diff -= last;
1842						return diff === first || ( diff % first === 0 && diff / first >= 0 );
1843					}
1844				};
1845		},
1846
1847		"PSEUDO": function( pseudo, argument ) {
1848			// pseudo-class names are case-insensitive
1849			// http://www.w3.org/TR/selectors/#pseudo-classes
1850			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1851			// Remember that setFilters inherits from pseudos
1852			var args,
1853				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1854					Sizzle.error( "unsupported pseudo: " + pseudo );
1855
1856			// The user may use createPseudo to indicate that
1857			// arguments are needed to create the filter function
1858			// just as Sizzle does
1859			if ( fn[ expando ] ) {
1860				return fn( argument );
1861			}
1862
1863			// But maintain support for old signatures
1864			if ( fn.length > 1 ) {
1865				args = [ pseudo, pseudo, "", argument ];
1866				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1867					markFunction(function( seed, matches ) {
1868						var idx,
1869							matched = fn( seed, argument ),
1870							i = matched.length;
1871						while ( i-- ) {
1872							idx = indexOf( seed, matched[i] );
1873							seed[ idx ] = !( matches[ idx ] = matched[i] );
1874						}
1875					}) :
1876					function( elem ) {
1877						return fn( elem, 0, args );
1878					};
1879			}
1880
1881			return fn;
1882		}
1883	},
1884
1885	pseudos: {
1886		// Potentially complex pseudos
1887		"not": markFunction(function( selector ) {
1888			// Trim the selector passed to compile
1889			// to avoid treating leading and trailing
1890			// spaces as combinators
1891			var input = [],
1892				results = [],
1893				matcher = compile( selector.replace( rtrim, "$1" ) );
1894
1895			return matcher[ expando ] ?
1896				markFunction(function( seed, matches, context, xml ) {
1897					var elem,
1898						unmatched = matcher( seed, null, xml, [] ),
1899						i = seed.length;
1900
1901					// Match elements unmatched by `matcher`
1902					while ( i-- ) {
1903						if ( (elem = unmatched[i]) ) {
1904							seed[i] = !(matches[i] = elem);
1905						}
1906					}
1907				}) :
1908				function( elem, context, xml ) {
1909					input[0] = elem;
1910					matcher( input, null, xml, results );
1911					// Don't keep the element (issue #299)
1912					input[0] = null;
1913					return !results.pop();
1914				};
1915		}),
1916
1917		"has": markFunction(function( selector ) {
1918			return function( elem ) {
1919				return Sizzle( selector, elem ).length > 0;
1920			};
1921		}),
1922
1923		"contains": markFunction(function( text ) {
1924			text = text.replace( runescape, funescape );
1925			return function( elem ) {
1926				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1927			};
1928		}),
1929
1930		// "Whether an element is represented by a :lang() selector
1931		// is based solely on the element's language value
1932		// being equal to the identifier C,
1933		// or beginning with the identifier C immediately followed by "-".
1934		// The matching of C against the element's language value is performed case-insensitively.
1935		// The identifier C does not have to be a valid language name."
1936		// http://www.w3.org/TR/selectors/#lang-pseudo
1937		"lang": markFunction( function( lang ) {
1938			// lang value must be a valid identifier
1939			if ( !ridentifier.test(lang || "") ) {
1940				Sizzle.error( "unsupported lang: " + lang );
1941			}
1942			lang = lang.replace( runescape, funescape ).toLowerCase();
1943			return function( elem ) {
1944				var elemLang;
1945				do {
1946					if ( (elemLang = documentIsHTML ?
1947						elem.lang :
1948						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1949
1950						elemLang = elemLang.toLowerCase();
1951						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1952					}
1953				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1954				return false;
1955			};
1956		}),
1957
1958		// Miscellaneous
1959		"target": function( elem ) {
1960			var hash = window.location && window.location.hash;
1961			return hash && hash.slice( 1 ) === elem.id;
1962		},
1963
1964		"root": function( elem ) {
1965			return elem === docElem;
1966		},
1967
1968		"focus": function( elem ) {
1969			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1970		},
1971
1972		// Boolean properties
1973		"enabled": function( elem ) {
1974			return elem.disabled === false;
1975		},
1976
1977		"disabled": function( elem ) {
1978			return elem.disabled === true;
1979		},
1980
1981		"checked": function( elem ) {
1982			// In CSS3, :checked should return both checked and selected elements
1983			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1984			var nodeName = elem.nodeName.toLowerCase();
1985			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1986		},
1987
1988		"selected": function( elem ) {
1989			// Accessing this property makes selected-by-default
1990			// options in Safari work properly
1991			if ( elem.parentNode ) {
1992				elem.parentNode.selectedIndex;
1993			}
1994
1995			return elem.selected === true;
1996		},
1997
1998		// Contents
1999		"empty": function( elem ) {
2000			// http://www.w3.org/TR/selectors/#empty-pseudo
2001			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2002			//   but not by others (comment: 8; processing instruction: 7; etc.)
2003			// nodeType < 6 works because attributes (2) do not appear as children
2004			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2005				if ( elem.nodeType < 6 ) {
2006					return false;
2007				}
2008			}
2009			return true;
2010		},
2011
2012		"parent": function( elem ) {
2013			return !Expr.pseudos["empty"]( elem );
2014		},
2015
2016		// Element/input types
2017		"header": function( elem ) {
2018			return rheader.test( elem.nodeName );
2019		},
2020
2021		"input": function( elem ) {
2022			return rinputs.test( elem.nodeName );
2023		},
2024
2025		"button": function( elem ) {
2026			var name = elem.nodeName.toLowerCase();
2027			return name === "input" && elem.type === "button" || name === "button";
2028		},
2029
2030		"text": function( elem ) {
2031			var attr;
2032			return elem.nodeName.toLowerCase() === "input" &&
2033				elem.type === "text" &&
2034
2035				// Support: IE<8
2036				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2037				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2038		},
2039
2040		// Position-in-collection
2041		"first": createPositionalPseudo(function() {
2042			return [ 0 ];
2043		}),
2044
2045		"last": createPositionalPseudo(function( matchIndexes, length ) {
2046			return [ length - 1 ];
2047		}),
2048
2049		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2050			return [ argument < 0 ? argument + length : argument ];
2051		}),
2052
2053		"even": createPositionalPseudo(function( matchIndexes, length ) {
2054			var i = 0;
2055			for ( ; i < length; i += 2 ) {
2056				matchIndexes.push( i );
2057			}
2058			return matchIndexes;
2059		}),
2060
2061		"odd": createPositionalPseudo(function( matchIndexes, length ) {
2062			var i = 1;
2063			for ( ; i < length; i += 2 ) {
2064				matchIndexes.push( i );
2065			}
2066			return matchIndexes;
2067		}),
2068
2069		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2070			var i = argument < 0 ? argument + length : argument;
2071			for ( ; --i >= 0; ) {
2072				matchIndexes.push( i );
2073			}
2074			return matchIndexes;
2075		}),
2076
2077		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2078			var i = argument < 0 ? argument + length : argument;
2079			for ( ; ++i < length; ) {
2080				matchIndexes.push( i );
2081			}
2082			return matchIndexes;
2083		})
2084	}
2085};
2086
2087Expr.pseudos["nth"] = Expr.pseudos["eq"];
2088
2089// Add button/input type pseudos
2090for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2091	Expr.pseudos[ i ] = createInputPseudo( i );
2092}
2093for ( i in { submit: true, reset: true } ) {
2094	Expr.pseudos[ i ] = createButtonPseudo( i );
2095}
2096
2097// Easy API for creating new setFilters
2098function setFilters() {}
2099setFilters.prototype = Expr.filters = Expr.pseudos;
2100Expr.setFilters = new setFilters();
2101
2102tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2103	var matched, match, tokens, type,
2104		soFar, groups, preFilters,
2105		cached = tokenCache[ selector + " " ];
2106
2107	if ( cached ) {
2108		return parseOnly ? 0 : cached.slice( 0 );
2109	}
2110
2111	soFar = selector;
2112	groups = [];
2113	preFilters = Expr.preFilter;
2114
2115	while ( soFar ) {
2116
2117		// Comma and first run
2118		if ( !matched || (match = rcomma.exec( soFar )) ) {
2119			if ( match ) {
2120				// Don't consume trailing commas as valid
2121				soFar = soFar.slice( match[0].length ) || soFar;
2122			}
2123			groups.push( (tokens = []) );
2124		}
2125
2126		matched = false;
2127
2128		// Combinators
2129		if ( (match = rcombinators.exec( soFar )) ) {
2130			matched = match.shift();
2131			tokens.push({
2132				value: matched,
2133				// Cast descendant combinators to space
2134				type: match[0].replace( rtrim, " " )
2135			});
2136			soFar = soFar.slice( matched.length );
2137		}
2138
2139		// Filters
2140		for ( type in Expr.filter ) {
2141			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2142				(match = preFilters[ type ]( match ))) ) {
2143				matched = match.shift();
2144				tokens.push({
2145					value: matched,
2146					type: type,
2147					matches: match
2148				});
2149				soFar = soFar.slice( matched.length );
2150			}
2151		}
2152
2153		if ( !matched ) {
2154			break;
2155		}
2156	}
2157
2158	// Return the length of the invalid excess
2159	// if we're just parsing
2160	// Otherwise, throw an error or return tokens
2161	return parseOnly ?
2162		soFar.length :
2163		soFar ?
2164			Sizzle.error( selector ) :
2165			// Cache the tokens
2166			tokenCache( selector, groups ).slice( 0 );
2167};
2168
2169function toSelector( tokens ) {
2170	var i = 0,
2171		len = tokens.length,
2172		selector = "";
2173	for ( ; i < len; i++ ) {
2174		selector += tokens[i].value;
2175	}
2176	return selector;
2177}
2178
2179function addCombinator( matcher, combinator, base ) {
2180	var dir = combinator.dir,
2181		checkNonElements = base && dir === "parentNode",
2182		doneName = done++;
2183
2184	return combinator.first ?
2185		// Check against closest ancestor/preceding element
2186		function( elem, context, xml ) {
2187			while ( (elem = elem[ dir ]) ) {
2188				if ( elem.nodeType === 1 || checkNonElements ) {
2189					return matcher( elem, context, xml );
2190				}
2191			}
2192		} :
2193
2194		// Check against all ancestor/preceding elements
2195		function( elem, context, xml ) {
2196			var oldCache, uniqueCache, outerCache,
2197				newCache = [ dirruns, doneName ];
2198
2199			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2200			if ( xml ) {
2201				while ( (elem = elem[ dir ]) ) {
2202					if ( elem.nodeType === 1 || checkNonElements ) {
2203						if ( matcher( elem, context, xml ) ) {
2204							return true;
2205						}
2206					}
2207				}
2208			} else {
2209				while ( (elem = elem[ dir ]) ) {
2210					if ( elem.nodeType === 1 || checkNonElements ) {
2211						outerCache = elem[ expando ] || (elem[ expando ] = {});
2212
2213						// Support: IE <9 only
2214						// Defend against cloned attroperties (jQuery gh-1709)
2215						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2216
2217						if ( (oldCache = uniqueCache[ dir ]) &&
2218							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2219
2220							// Assign to newCache so results back-propagate to previous elements
2221							return (newCache[ 2 ] = oldCache[ 2 ]);
2222						} else {
2223							// Reuse newcache so results back-propagate to previous elements
2224							uniqueCache[ dir ] = newCache;
2225
2226							// A match means we're done; a fail means we have to keep checking
2227							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2228								return true;
2229							}
2230						}
2231					}
2232				}
2233			}
2234		};
2235}
2236
2237function elementMatcher( matchers ) {
2238	return matchers.length > 1 ?
2239		function( elem, context, xml ) {
2240			var i = matchers.length;
2241			while ( i-- ) {
2242				if ( !matchers[i]( elem, context, xml ) ) {
2243					return false;
2244				}
2245			}
2246			return true;
2247		} :
2248		matchers[0];
2249}
2250
2251function multipleContexts( selector, contexts, results ) {
2252	var i = 0,
2253		len = contexts.length;
2254	for ( ; i < len; i++ ) {
2255		Sizzle( selector, contexts[i], results );
2256	}
2257	return results;
2258}
2259
2260function condense( unmatched, map, filter, context, xml ) {
2261	var elem,
2262		newUnmatched = [],
2263		i = 0,
2264		len = unmatched.length,
2265		mapped = map != null;
2266
2267	for ( ; i < len; i++ ) {
2268		if ( (elem = unmatched[i]) ) {
2269			if ( !filter || filter( elem, context, xml ) ) {
2270				newUnmatched.push( elem );
2271				if ( mapped ) {
2272					map.push( i );
2273				}
2274			}
2275		}
2276	}
2277
2278	return newUnmatched;
2279}
2280
2281function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2282	if ( postFilter && !postFilter[ expando ] ) {
2283		postFilter = setMatcher( postFilter );
2284	}
2285	if ( postFinder && !postFinder[ expando ] ) {
2286		postFinder = setMatcher( postFinder, postSelector );
2287	}
2288	return markFunction(function( seed, results, context, xml ) {
2289		var temp, i, elem,
2290			preMap = [],
2291			postMap = [],
2292			preexisting = results.length,
2293
2294			// Get initial elements from seed or context
2295			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2296
2297			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2298			matcherIn = preFilter && ( seed || !selector ) ?
2299				condense( elems, preMap, preFilter, context, xml ) :
2300				elems,
2301
2302			matcherOut = matcher ?
2303				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2304				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2305
2306					// ...intermediate processing is necessary
2307					[] :
2308
2309					// ...otherwise use results directly
2310					results :
2311				matcherIn;
2312
2313		// Find primary matches
2314		if ( matcher ) {
2315			matcher( matcherIn, matcherOut, context, xml );
2316		}
2317
2318		// Apply postFilter
2319		if ( postFilter ) {
2320			temp = condense( matcherOut, postMap );
2321			postFilter( temp, [], context, xml );
2322
2323			// Un-match failing elements by moving them back to matcherIn
2324			i = temp.length;
2325			while ( i-- ) {
2326				if ( (elem = temp[i]) ) {
2327					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2328				}
2329			}
2330		}
2331
2332		if ( seed ) {
2333			if ( postFinder || preFilter ) {
2334				if ( postFinder ) {
2335					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2336					temp = [];
2337					i = matcherOut.length;
2338					while ( i-- ) {
2339						if ( (elem = matcherOut[i]) ) {
2340							// Restore matcherIn since elem is not yet a final match
2341							temp.push( (matcherIn[i] = elem) );
2342						}
2343					}
2344					postFinder( null, (matcherOut = []), temp, xml );
2345				}
2346
2347				// Move matched elements from seed to results to keep them synchronized
2348				i = matcherOut.length;
2349				while ( i-- ) {
2350					if ( (elem = matcherOut[i]) &&
2351						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2352
2353						seed[temp] = !(results[temp] = elem);
2354					}
2355				}
2356			}
2357
2358		// Add elements to results, through postFinder if defined
2359		} else {
2360			matcherOut = condense(
2361				matcherOut === results ?
2362					matcherOut.splice( preexisting, matcherOut.length ) :
2363					matcherOut
2364			);
2365			if ( postFinder ) {
2366				postFinder( null, results, matcherOut, xml );
2367			} else {
2368				push.apply( results, matcherOut );
2369			}
2370		}
2371	});
2372}
2373
2374function matcherFromTokens( tokens ) {
2375	var checkContext, matcher, j,
2376		len = tokens.length,
2377		leadingRelative = Expr.relative[ tokens[0].type ],
2378		implicitRelative = leadingRelative || Expr.relative[" "],
2379		i = leadingRelative ? 1 : 0,
2380
2381		// The foundational matcher ensures that elements are reachable from top-level context(s)
2382		matchContext = addCombinator( function( elem ) {
2383			return elem === checkContext;
2384		}, implicitRelative, true ),
2385		matchAnyContext = addCombinator( function( elem ) {
2386			return indexOf( checkContext, elem ) > -1;
2387		}, implicitRelative, true ),
2388		matchers = [ function( elem, context, xml ) {
2389			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2390				(checkContext = context).nodeType ?
2391					matchContext( elem, context, xml ) :
2392					matchAnyContext( elem, context, xml ) );
2393			// Avoid hanging onto element (issue #299)
2394			checkContext = null;
2395			return ret;
2396		} ];
2397
2398	for ( ; i < len; i++ ) {
2399		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2400			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2401		} else {
2402			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2403
2404			// Return special upon seeing a positional matcher
2405			if ( matcher[ expando ] ) {
2406				// Find the next relative operator (if any) for proper handling
2407				j = ++i;
2408				for ( ; j < len; j++ ) {
2409					if ( Expr.relative[ tokens[j].type ] ) {
2410						break;
2411					}
2412				}
2413				return setMatcher(
2414					i > 1 && elementMatcher( matchers ),
2415					i > 1 && toSelector(
2416						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2417						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2418					).replace( rtrim, "$1" ),
2419					matcher,
2420					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2421					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2422					j < len && toSelector( tokens )
2423				);
2424			}
2425			matchers.push( matcher );
2426		}
2427	}
2428
2429	return elementMatcher( matchers );
2430}
2431
2432function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2433	var bySet = setMatchers.length > 0,
2434		byElement = elementMatchers.length > 0,
2435		superMatcher = function( seed, context, xml, results, outermost ) {
2436			var elem, j, matcher,
2437				matchedCount = 0,
2438				i = "0",
2439				unmatched = seed && [],
2440				setMatched = [],
2441				contextBackup = outermostContext,
2442				// We must always have either seed elements or outermost context
2443				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2444				// Use integer dirruns iff this is the outermost matcher
2445				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2446				len = elems.length;
2447
2448			if ( outermost ) {
2449				outermostContext = context === document || context || outermost;
2450			}
2451
2452			// Add elements passing elementMatchers directly to results
2453			// Support: IE<9, Safari
2454			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2455			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2456				if ( byElement && elem ) {
2457					j = 0;
2458					if ( !context && elem.ownerDocument !== document ) {
2459						setDocument( elem );
2460						xml = !documentIsHTML;
2461					}
2462					while ( (matcher = elementMatchers[j++]) ) {
2463						if ( matcher( elem, context || document, xml) ) {
2464							results.push( elem );
2465							break;
2466						}
2467					}
2468					if ( outermost ) {
2469						dirruns = dirrunsUnique;
2470					}
2471				}
2472
2473				// Track unmatched elements for set filters
2474				if ( bySet ) {
2475					// They will have gone through all possible matchers
2476					if ( (elem = !matcher && elem) ) {
2477						matchedCount--;
2478					}
2479
2480					// Lengthen the array for every element, matched or not
2481					if ( seed ) {
2482						unmatched.push( elem );
2483					}
2484				}
2485			}
2486
2487			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2488			// makes the latter nonnegative.
2489			matchedCount += i;
2490
2491			// Apply set filters to unmatched elements
2492			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2493			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2494			// no element matchers and no seed.
2495			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2496			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2497			// numerically zero.
2498			if ( bySet && i !== matchedCount ) {
2499				j = 0;
2500				while ( (matcher = setMatchers[j++]) ) {
2501					matcher( unmatched, setMatched, context, xml );
2502				}
2503
2504				if ( seed ) {
2505					// Reintegrate element matches to eliminate the need for sorting
2506					if ( matchedCount > 0 ) {
2507						while ( i-- ) {
2508							if ( !(unmatched[i] || setMatched[i]) ) {
2509								setMatched[i] = pop.call( results );
2510							}
2511						}
2512					}
2513
2514					// Discard index placeholder values to get only actual matches
2515					setMatched = condense( setMatched );
2516				}
2517
2518				// Add matches to results
2519				push.apply( results, setMatched );
2520
2521				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2522				if ( outermost && !seed && setMatched.length > 0 &&
2523					( matchedCount + setMatchers.length ) > 1 ) {
2524
2525					Sizzle.uniqueSort( results );
2526				}
2527			}
2528
2529			// Override manipulation of globals by nested matchers
2530			if ( outermost ) {
2531				dirruns = dirrunsUnique;
2532				outermostContext = contextBackup;
2533			}
2534
2535			return unmatched;
2536		};
2537
2538	return bySet ?
2539		markFunction( superMatcher ) :
2540		superMatcher;
2541}
2542
2543compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2544	var i,
2545		setMatchers = [],
2546		elementMatchers = [],
2547		cached = compilerCache[ selector + " " ];
2548
2549	if ( !cached ) {
2550		// Generate a function of recursive functions that can be used to check each element
2551		if ( !match ) {
2552			match = tokenize( selector );
2553		}
2554		i = match.length;
2555		while ( i-- ) {
2556			cached = matcherFromTokens( match[i] );
2557			if ( cached[ expando ] ) {
2558				setMatchers.push( cached );
2559			} else {
2560				elementMatchers.push( cached );
2561			}
2562		}
2563
2564		// Cache the compiled function
2565		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2566
2567		// Save selector and tokenization
2568		cached.selector = selector;
2569	}
2570	return cached;
2571};
2572
2573/**
2574 * A low-level selection function that works with Sizzle's compiled
2575 *  selector functions
2576 * @param {String|Function} selector A selector or a pre-compiled
2577 *  selector function built with Sizzle.compile
2578 * @param {Element} context
2579 * @param {Array} [results]
2580 * @param {Array} [seed] A set of elements to match against
2581 */
2582select = Sizzle.select = function( selector, context, results, seed ) {
2583	var i, tokens, token, type, find,
2584		compiled = typeof selector === "function" && selector,
2585		match = !seed && tokenize( (selector = compiled.selector || selector) );
2586
2587	results = results || [];
2588
2589	// Try to minimize operations if there is only one selector in the list and no seed
2590	// (the latter of which guarantees us context)
2591	if ( match.length === 1 ) {
2592
2593		// Reduce context if the leading compound selector is an ID
2594		tokens = match[0] = match[0].slice( 0 );
2595		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2596				support.getById && context.nodeType === 9 && documentIsHTML &&
2597				Expr.relative[ tokens[1].type ] ) {
2598
2599			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2600			if ( !context ) {
2601				return results;
2602
2603			// Precompiled matchers will still verify ancestry, so step up a level
2604			} else if ( compiled ) {
2605				context = context.parentNode;
2606			}
2607
2608			selector = selector.slice( tokens.shift().value.length );
2609		}
2610
2611		// Fetch a seed set for right-to-left matching
2612		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2613		while ( i-- ) {
2614			token = tokens[i];
2615
2616			// Abort if we hit a combinator
2617			if ( Expr.relative[ (type = token.type) ] ) {
2618				break;
2619			}
2620			if ( (find = Expr.find[ type ]) ) {
2621				// Search, expanding context for leading sibling combinators
2622				if ( (seed = find(
2623					token.matches[0].replace( runescape, funescape ),
2624					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2625				)) ) {
2626
2627					// If seed is empty or no tokens remain, we can return early
2628					tokens.splice( i, 1 );
2629					selector = seed.length && toSelector( tokens );
2630					if ( !selector ) {
2631						push.apply( results, seed );
2632						return results;
2633					}
2634
2635					break;
2636				}
2637			}
2638		}
2639	}
2640
2641	// Compile and execute a filtering function if one is not provided
2642	// Provide `match` to avoid retokenization if we modified the selector above
2643	( compiled || compile( selector, match ) )(
2644		seed,
2645		context,
2646		!documentIsHTML,
2647		results,
2648		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2649	);
2650	return results;
2651};
2652
2653// One-time assignments
2654
2655// Sort stability
2656support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2657
2658// Support: Chrome 14-35+
2659// Always assume duplicates if they aren't passed to the comparison function
2660support.detectDuplicates = !!hasDuplicate;
2661
2662// Initialize against the default document
2663setDocument();
2664
2665// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2666// Detached nodes confoundingly follow *each other*
2667support.sortDetached = assert(function( div1 ) {
2668	// Should return 1, but returns 4 (following)
2669	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2670});
2671
2672// Support: IE<8
2673// Prevent attribute/property "interpolation"
2674// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2675if ( !assert(function( div ) {
2676	div.innerHTML = "<a href='#'></a>";
2677	return div.firstChild.getAttribute("href") === "#" ;
2678}) ) {
2679	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2680		if ( !isXML ) {
2681			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2682		}
2683	});
2684}
2685
2686// Support: IE<9
2687// Use defaultValue in place of getAttribute("value")
2688if ( !support.attributes || !assert(function( div ) {
2689	div.innerHTML = "<input/>";
2690	div.firstChild.setAttribute( "value", "" );
2691	return div.firstChild.getAttribute( "value" ) === "";
2692}) ) {
2693	addHandle( "value", function( elem, name, isXML ) {
2694		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2695			return elem.defaultValue;
2696		}
2697	});
2698}
2699
2700// Support: IE<9
2701// Use getAttributeNode to fetch booleans when getAttribute lies
2702if ( !assert(function( div ) {
2703	return div.getAttribute("disabled") == null;
2704}) ) {
2705	addHandle( booleans, function( elem, name, isXML ) {
2706		var val;
2707		if ( !isXML ) {
2708			return elem[ name ] === true ? name.toLowerCase() :
2709					(val = elem.getAttributeNode( name )) && val.specified ?
2710					val.value :
2711				null;
2712		}
2713	});
2714}
2715
2716return Sizzle;
2717
2718})( window );
2719
2720
2721
2722jQuery.find = Sizzle;
2723jQuery.expr = Sizzle.selectors;
2724jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2725jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2726jQuery.text = Sizzle.getText;
2727jQuery.isXMLDoc = Sizzle.isXML;
2728jQuery.contains = Sizzle.contains;
2729
2730
2731
2732var dir = function( elem, dir, until ) {
2733	var matched = [],
2734		truncate = until !== undefined;
2735
2736	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2737		if ( elem.nodeType === 1 ) {
2738			if ( truncate && jQuery( elem ).is( until ) ) {
2739				break;
2740			}
2741			matched.push( elem );
2742		}
2743	}
2744	return matched;
2745};
2746
2747
2748var siblings = function( n, elem ) {
2749	var matched = [];
2750
2751	for ( ; n; n = n.nextSibling ) {
2752		if ( n.nodeType === 1 && n !== elem ) {
2753			matched.push( n );
2754		}
2755	}
2756
2757	return matched;
2758};
2759
2760
2761var rneedsContext = jQuery.expr.match.needsContext;
2762
2763var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
2764
2765
2766
2767var risSimple = /^.[^:#\[\.,]*$/;
2768
2769// Implement the identical functionality for filter and not
2770function winnow( elements, qualifier, not ) {
2771	if ( jQuery.isFunction( qualifier ) ) {
2772		return jQuery.grep( elements, function( elem, i ) {
2773			/* jshint -W018 */
2774			return !!qualifier.call( elem, i, elem ) !== not;
2775		} );
2776
2777	}
2778
2779	if ( qualifier.nodeType ) {
2780		return jQuery.grep( elements, function( elem ) {
2781			return ( elem === qualifier ) !== not;
2782		} );
2783
2784	}
2785
2786	if ( typeof qualifier === "string" ) {
2787		if ( risSimple.test( qualifier ) ) {
2788			return jQuery.filter( qualifier, elements, not );
2789		}
2790
2791		qualifier = jQuery.filter( qualifier, elements );
2792	}
2793
2794	return jQuery.grep( elements, function( elem ) {
2795		return ( 
2795jQuery.inArray( elem, qualifier ) > -1 ) !== not;
2796	} );
2797}
2798
2799jQuery.filter = function( expr, elems, not ) {
2800	var elem = elems[ 0 ];
2801
2802	if ( not ) {
2803		expr = ":not(" + expr + ")";
2804	}
2805
2806	return elems.length === 1 && elem.nodeType === 1 ?
2807		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
2808		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2809			return elem.nodeType === 1;
2810		} ) );
2811};
2812
2813jQuery.fn.extend( {
2814	find: function( selector ) {
2815		var i,
2816			ret = [],
2817			self = this,
2818			len = self.length;
2819
2820		if ( typeof selector !== "string" ) {
vendor: 5,394 bytes, lines 2821-3023
2821			return this.pushStack( jQuery( selector ).filter( function() {
2822				for ( i = 0; i < len; i++ ) {
2823					if ( jQuery.contains( self[ i ], this ) ) {
2824						return true;
2825					}
2826				}
2827			} ) );
2828		}
2829
2830		for ( i = 0; i < len; i++ ) {
2831			jQuery.find( selector, self[ i ], ret );
2832		}
2833
2834		// Needed because $( selector, context ) becomes $( context ).find( selector )
2835		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
2836		ret.selector = this.selector ? this.selector + " " + selector : selector;
2837		return ret;
2838	},
2839	filter: function( selector ) {
2840		return this.pushStack( winnow( this, selector || [], false ) );
2841	},
2842	not: function( selector ) {
2843		return this.pushStack( winnow( this, selector || [], true ) );
2844	},
2845	is: function( selector ) {
2846		return !!winnow(
2847			this,
2848
2849			// If this is a positional/relative selector, check membership in the returned set
2850			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2851			typeof selector === "string" && rneedsContext.test( selector ) ?
2852				jQuery( selector ) :
2853				selector || [],
2854			false
2855		).length;
2856	}
2857} );
2858
2859
2860// Initialize a jQuery object
2861
2862
2863// A central reference to the root jQuery(document)
2864var rootjQuery,
2865
2866	// A simple way to check for HTML strings
2867	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2868	// Strict HTML recognition (#11290: must start with <)
2869	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2870
2871	init = jQuery.fn.init = function( selector, context, root ) {
2872		var match, elem;
2873
2874		// HANDLE: $(""), $(null), $(undefined), $(false)
2875		if ( !selector ) {
2876			return this;
2877		}
2878
2879		// init accepts an alternate rootjQuery
2880		// so migrate can support jQuery.sub (gh-2101)
2881		root = root || rootjQuery;
2882
2883		// Handle HTML strings
2884		if ( typeof selector === "string" ) {
2885			if ( selector.charAt( 0 ) === "<" &&
2886				selector.charAt( selector.length - 1 ) === ">" &&
2887				selector.length >= 3 ) {
2888
2889				// Assume that strings that start and end with <> are HTML and skip the regex check
2890				match = [ null, selector, null ];
2891
2892			} else {
2893				match = rquickExpr.exec( selector );
2894			}
2895
2896			// Match html or make sure no context is specified for #id
2897			if ( match && ( match[ 1 ] || !context ) ) {
2898
2899				// HANDLE: $(html) -> $(array)
2900				if ( match[ 1 ] ) {
2901					context = context instanceof jQuery ? context[ 0 ] : context;
2902
2903					// scripts is true for back-compat
2904					// Intentionally let the error be thrown if parseHTML is not present
2905					jQuery.merge( this, jQuery.parseHTML(
2906						match[ 1 ],
2907						context && context.nodeType ? context.ownerDocument || context : document,
2908						true
2909					) );
2910
2911					// HANDLE: $(html, props)
2912					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
2913						for ( match in context ) {
2914
2915							// Properties of context are called as methods if possible
2916							if ( jQuery.isFunction( this[ match ] ) ) {
2917								this[ match ]( context[ match ] );
2918
2919							// ...and otherwise set as attributes
2920							} else {
2921								this.attr( match, context[ match ] );
2922							}
2923						}
2924					}
2925
2926					return this;
2927
2928				// HANDLE: $(#id)
2929				} else {
2930					elem = document.getElementById( match[ 2 ] );
2931
2932					// Check parentNode to catch when Blackberry 4.6 returns
2933					// nodes that are no longer in the document #6963
2934					if ( elem && elem.parentNode ) {
2935
2936						// Handle the case where IE and Opera return items
2937						// by name instead of ID
2938						if ( elem.id !== match[ 2 ] ) {
2939							return rootjQuery.find( selector );
2940						}
2941
2942						// Otherwise, we inject the element directly into the jQuery object
2943						this.length = 1;
2944						this[ 0 ] = elem;
2945					}
2946
2947					this.context = document;
2948					this.selector = selector;
2949					return this;
2950				}
2951
2952			// HANDLE: $(expr, $(...))
2953			} else if ( !context || context.jquery ) {
2954				return ( context || root ).find( selector );
2955
2956			// HANDLE: $(expr, context)
2957			// (which is just equivalent to: $(context).find(expr)
2958			} else {
2959				return this.constructor( context ).find( selector );
2960			}
2961
2962		// HANDLE: $(DOMElement)
2963		} else if ( selector.nodeType ) {
2964			this.context = this[ 0 ] = selector;
2965			this.length = 1;
2966			return this;
2967
2968		// HANDLE: $(function)
2969		// Shortcut for document ready
2970		} else if ( jQuery.isFunction( selector ) ) {
2971			return typeof root.ready !== "undefined" ?
2972				root.ready( selector ) :
2973
2974				// Execute immediately if ready is not present
2975				selector( jQuery );
2976		}
2977
2978		if ( selector.selector !== undefined ) {
2979			this.selector = selector.selector;
2980			this.context = selector.context;
2981		}
2982
2983		return jQuery.makeArray( selector, this );
2984	};
2985
2986// Give the init function the jQuery prototype for later instantiation
2987init.prototype = jQuery.fn;
2988
2989// Initialize central reference
2990rootjQuery = jQuery( document );
2991
2992
2993var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2994
2995	// methods guaranteed to produce a unique set when starting from a unique set
2996	guaranteedUnique = {
2997		children: true,
2998		contents: true,
2999		next: true,
3000		prev: true
3001	};
3002
3003jQuery.fn.extend( {
3004	has: function( target ) {
3005		var i,
3006			targets = jQuery( target, this ),
3007			len = targets.length;
3008
3009		return this.filter( function() {
3010			for ( i = 0; i < len; i++ ) {
3011				if ( jQuery.contains( this, targets[ i ] ) ) {
3012					return true;
3013				}
3014			}
3015		} );
3016	},
3017
3018	closest: function( selectors, context ) {
3019		var cur,
3020			i = 0,
3021			l = this.length,
3022			matched = [],
3023			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
vendor: 12,881 bytes, lines 3024-3532
3024				jQuery( selectors, context || this.context ) :
3025				0;
3026
3027		for ( ; i < l; i++ ) {
3028			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3029
3030				// Always skip document fragments
3031				if ( cur.nodeType < 11 && ( pos ?
3032					pos.index( cur ) > -1 :
3033
3034					// Don't pass non-elements to Sizzle
3035					cur.nodeType === 1 &&
3036						jQuery.find.matchesSelector( cur, selectors ) ) ) {
3037
3038					matched.push( cur );
3039					break;
3040				}
3041			}
3042		}
3043
3044		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3045	},
3046
3047	// Determine the position of an element within
3048	// the matched set of elements
3049	index: function( elem ) {
3050
3051		// No argument, return index in parent
3052		if ( !elem ) {
3053			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3054		}
3055
3056		// index in selector
3057		if ( typeof elem === "string" ) {
3058			return jQuery.inArray( this[ 0 ], jQuery( elem ) );
3059		}
3060
3061		// Locate the position of the desired element
3062		return jQuery.inArray(
3063
3064			// If it receives a jQuery object, the first element is used
3065			elem.jquery ? elem[ 0 ] : elem, this );
3066	},
3067
3068	add: function( selector, context ) {
3069		return this.pushStack(
3070			jQuery.uniqueSort(
3071				jQuery.merge( this.get(), jQuery( selector, context ) )
3072			)
3073		);
3074	},
3075
3076	addBack: function( selector ) {
3077		return this.add( selector == null ?
3078			this.prevObject : this.prevObject.filter( selector )
3079		);
3080	}
3081} );
3082
3083function sibling( cur, dir ) {
3084	do {
3085		cur = cur[ dir ];
3086	} while ( cur && cur.nodeType !== 1 );
3087
3088	return cur;
3089}
3090
3091jQuery.each( {
3092	parent: function( elem ) {
3093		var parent = elem.parentNode;
3094		return parent && parent.nodeType !== 11 ? parent : null;
3095	},
3096	parents: function( elem ) {
3097		return dir( elem, "parentNode" );
3098	},
3099	parentsUntil: function( elem, i, until ) {
3100		return dir( elem, "parentNode", until );
3101	},
3102	next: function( elem ) {
3103		return sibling( elem, "nextSibling" );
3104	},
3105	prev: function( elem ) {
3106		return sibling( elem, "previousSibling" );
3107	},
3108	nextAll: function( elem ) {
3109		return dir( elem, "nextSibling" );
3110	},
3111	prevAll: function( elem ) {
3112		return dir( elem, "previousSibling" );
3113	},
3114	nextUntil: function( elem, i, until ) {
3115		return dir( elem, "nextSibling", until );
3116	},
3117	prevUntil: function( elem, i, until ) {
3118		return dir( elem, "previousSibling", until );
3119	},
3120	siblings: function( elem ) {
3121		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3122	},
3123	children: function( elem ) {
3124		return siblings( elem.firstChild );
3125	},
3126	contents: function( elem ) {
3127		return jQuery.nodeName( elem, "iframe" ) ?
3128			elem.contentDocument || elem.contentWindow.document :
3129			jQuery.merge( [], elem.childNodes );
3130	}
3131}, function( name, fn ) {
3132	jQuery.fn[ name ] = function( until, selector ) {
3133		var ret = jQuery.map( this, fn, until );
3134
3135		if ( name.slice( -5 ) !== "Until" ) {
3136			selector = until;
3137		}
3138
3139		if ( selector && typeof selector === "string" ) {
3140			ret = jQuery.filter( selector, ret );
3141		}
3142
3143		if ( this.length > 1 ) {
3144
3145			// Remove duplicates
3146			if ( !guaranteedUnique[ name ] ) {
3147				ret = jQuery.uniqueSort( ret );
3148			}
3149
3150			// Reverse order for parents* and prev-derivatives
3151			if ( rparentsprev.test( name ) ) {
3152				ret = ret.reverse();
3153			}
3154		}
3155
3156		return this.pushStack( ret );
3157	};
3158} );
3159var rnotwhite = ( /\S+/g );
3160
3161
3162
3163// Convert String-formatted options into Object-formatted ones
3164function createOptions( options ) {
3165	var object = {};
3166	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
3167		object[ flag ] = true;
3168	} );
3169	return object;
3170}
3171
3172/*
3173 * Create a callback list using the following parameters:
3174 *
3175 *	options: an optional list of space-separated options that will change how
3176 *			the callback list behaves or a more traditional option object
3177 *
3178 * By default a callback list will act like an event callback list and can be
3179 * "fired" multiple times.
3180 *
3181 * Possible options:
3182 *
3183 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3184 *
3185 *	memory:			will keep track of previous values and will call any callback added
3186 *					after the list has been fired right away with the latest "memorized"
3187 *					values (like a Deferred)
3188 *
3189 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3190 *
3191 *	stopOnFalse:	interrupt callings when a callback returns false
3192 *
3193 */
3194jQuery.Callbacks = function( options ) {
3195
3196	// Convert options from String-formatted to Object-formatted if needed
3197	// (we check in cache first)
3198	options = typeof options === "string" ?
3199		createOptions( options ) :
3200		jQuery.extend( {}, options );
3201
3202	var // Flag to know if list is currently firing
3203		firing,
3204
3205		// Last fire value for non-forgettable lists
3206		memory,
3207
3208		// Flag to know if list was already fired
3209		fired,
3210
3211		// Flag to prevent firing
3212		locked,
3213
3214		// Actual callback list
3215		list = [],
3216
3217		// Queue of execution data for repeatable lists
3218		queue = [],
3219
3220		// Index of currently firing callback (modified by add/remove as needed)
3221		firingIndex = -1,
3222
3223		// Fire callbacks
3224		fire = function() {
3225
3226			// Enforce single-firing
3227			locked = options.once;
3228
3229			// Execute callbacks for all pending executions,
3230			// respecting firingIndex overrides and runtime changes
3231			fired = firing = true;
3232			for ( ; queue.length; firingIndex = -1 ) {
3233				memory = queue.shift();
3234				while ( ++firingIndex < list.length ) {
3235
3236					// Run callback and check for early termination
3237					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3238						options.stopOnFalse ) {
3239
3240						// Jump to end and forget the data so .add doesn't re-fire
3241						firingIndex = list.length;
3242						memory = false;
3243					}
3244				}
3245			}
3246
3247			// Forget the data if we're done with it
3248			if ( !options.memory ) {
3249				memory = false;
3250			}
3251
3252			firing = false;
3253
3254			// Clean up if we're done firing for good
3255			if ( locked ) {
3256
3257				// Keep an empty list if we have data for future add calls
3258				if ( memory ) {
3259					list = [];
3260
3261				// Otherwise, this object is spent
3262				} else {
3263					list = "";
3264				}
3265			}
3266		},
3267
3268		// Actual Callbacks object
3269		self = {
3270
3271			// Add a callback or a collection of callbacks to the list
3272			add: function() {
3273				if ( list ) {
3274
3275					// If we have memory from a past run, we should fire after adding
3276					if ( memory && !firing ) {
3277						firingIndex = list.length - 1;
3278						queue.push( memory );
3279					}
3280
3281					( function add( args ) {
3282						jQuery.each( args, function( _, arg ) {
3283							if ( jQuery.isFunction( arg ) ) {
3284								if ( !options.unique || !self.has( arg ) ) {
3285									list.push( arg );
3286								}
3287							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
3288
3289								// Inspect recursively
3290								add( arg );
3291							}
3292						} );
3293					} )( arguments );
3294
3295					if ( memory && !firing ) {
3296						fire();
3297					}
3298				}
3299				return this;
3300			},
3301
3302			// Remove a callback from the list
3303			remove: function() {
3304				jQuery.each( arguments, function( _, arg ) {
3305					var index;
3306					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3307						list.splice( index, 1 );
3308
3309						// Handle firing indexes
3310						if ( index <= firingIndex ) {
3311							firingIndex--;
3312						}
3313					}
3314				} );
3315				return this;
3316			},
3317
3318			// Check if a given callback is in the list.
3319			// If no argument is given, return whether or not list has callbacks attached.
3320			has: function( fn ) {
3321				return fn ?
3322					jQuery.inArray( fn, list ) > -1 :
3323					list.length > 0;
3324			},
3325
3326			// Remove all callbacks from the list
3327			empty: function() {
3328				if ( list ) {
3329					list = [];
3330				}
3331				return this;
3332			},
3333
3334			// Disable .fire and .add
3335			// Abort any current/pending executions
3336			// Clear all callbacks and values
3337			disable: function() {
3338				locked = queue = [];
3339				list = memory = "";
3340				return this;
3341			},
3342			disabled: function() {
3343				return !list;
3344			},
3345
3346			// Disable .fire
3347			// Also disable .add unless we have memory (since it would have no effect)
3348			// Abort any pending executions
3349			lock: function() {
3350				locked = true;
3351				if ( !memory ) {
3352					self.disable();
3353				}
3354				return this;
3355			},
3356			locked: function() {
3357				return !!locked;
3358			},
3359
3360			// Call all callbacks with the given context and arguments
3361			fireWith: function( context, args ) {
3362				if ( !locked ) {
3363					args = args || [];
3364					args = [ context, args.slice ? args.slice() : args ];
3365					queue.push( args );
3366					if ( !firing ) {
3367						fire();
3368					}
3369				}
3370				return this;
3371			},
3372
3373			// Call all the callbacks with the given arguments
3374			fire: function() {
3375				self.fireWith( this, arguments );
3376				return this;
3377			},
3378
3379			// To know if the callbacks have already been called at least once
3380			fired: function() {
3381				return !!fired;
3382			}
3383		};
3384
3385	return self;
3386};
3387
3388
3389jQuery.extend( {
3390
3391	Deferred: function( func ) {
3392		var tuples = [
3393
3394				// action, add listener, listener list, final state
3395				[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
3396				[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
3397				[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
3398			],
3399			state = "pending",
3400			promise = {
3401				state: function() {
3402					return state;
3403				},
3404				always: function() {
3405					deferred.done( arguments ).fail( arguments );
3406					return this;
3407				},
3408				then: function( /* fnDone, fnFail, fnProgress */ ) {
3409					var fns = arguments;
3410					return jQuery.Deferred( function( newDefer ) {
3411						jQuery.each( tuples, function( i, tuple ) {
3412							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3413
3414							// deferred[ done | fail | progress ] for forwarding actions to newDefer
3415							deferred[ tuple[ 1 ] ]( function() {
3416								var returned = fn && fn.apply( this, arguments );
3417								if ( returned && jQuery.isFunction( returned.promise ) ) {
3418									returned.promise()
3419										.progress( newDefer.notify )
3420										.done( newDefer.resolve )
3421										.fail( newDefer.reject );
3422								} else {
3423									newDefer[ tuple[ 0 ] + "With" ](
3424										this === promise ? newDefer.promise() : this,
3425										fn ? [ returned ] : arguments
3426									);
3427								}
3428							} );
3429						} );
3430						fns = null;
3431					} ).promise();
3432				},
3433
3434				// Get a promise for this deferred
3435				// If obj is provided, the promise aspect is added to the object
3436				promise: function( obj ) {
3437					return obj != null ? jQuery.extend( obj, promise ) : promise;
3438				}
3439			},
3440			deferred = {};
3441
3442		// Keep pipe for back-compat
3443		promise.pipe = promise.then;
3444
3445		// Add list-specific methods
3446		jQuery.each( tuples, function( i, tuple ) {
3447			var list = tuple[ 2 ],
3448				stateString = tuple[ 3 ];
3449
3450			// promise[ done | fail | progress ] = list.add
3451			promise[ tuple[ 1 ] ] = list.add;
3452
3453			// Handle state
3454			if ( stateString ) {
3455				list.add( function() {
3456
3457					// state = [ resolved | rejected ]
3458					state = stateString;
3459
3460				// [ reject_list | resolve_list ].disable; progress_list.lock
3461				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3462			}
3463
3464			// deferred[ resolve | reject | notify ]
3465			deferred[ tuple[ 0 ] ] = function() {
3466				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
3467				return this;
3468			};
3469			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3470		} );
3471
3472		// Make the deferred a promise
3473		promise.promise( deferred );
3474
3475		// Call given func if any
3476		if ( func ) {
3477			func.call( deferred, deferred );
3478		}
3479
3480		// All done!
3481		return deferred;
3482	},
3483
3484	// Deferred helper
3485	when: function( subordinate /* , ..., subordinateN */ ) {
3486		var i = 0,
3487			resolveValues = slice.call( arguments ),
3488			length = resolveValues.length,
3489
3490			// the count of uncompleted subordinates
3491			remaining = length !== 1 ||
3492				( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3493
3494			// the master Deferred.
3495			// If resolveValues consist of only a single Deferred, just use that.
3496			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3497
3498			// Update function for both resolve and progress values
3499			updateFunc = function( i, contexts, values ) {
3500				return function( value ) {
3501					contexts[ i ] = this;
3502					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3503					if ( values === progressValues ) {
3504						deferred.notifyWith( contexts, values );
3505
3506					} else if ( !( --remaining ) ) {
3507						deferred.resolveWith( contexts, values );
3508					}
3509				};
3510			},
3511
3512			progressValues, progressContexts, resolveContexts;
3513
3514		// add listeners to Deferred subordinates; treat others as resolved
3515		if ( length > 1 ) {
3516			progressValues = new Array( length );
3517			progressContexts = new Array( length );
3518			resolveContexts = new Array( length );
3519			for ( ; i < length; i++ ) {
3520				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3521					resolveValues[ i ].promise()
3522						.progress( updateFunc( i, progressContexts, progressValues ) )
3523						.done( updateFunc( i, resolveContexts, resolveValues ) )
3524						.fail( deferred.reject );
3525				} else {
3526					--remaining;
3527				}
3528			}
3529		}
3530
3531		// if we're not waiting on anything, resolve the master
3532		if ( !remaining ) {
vendor: 2,149 bytes, lines 3533-3632
3533			deferred.resolveWith( resolveContexts, resolveValues );
3534		}
3535
3536		return deferred.promise();
3537	}
3538} );
3539
3540
3541// The deferred used on DOM ready
3542var readyList;
3543
3544jQuery.fn.ready = function( fn ) {
3545
3546	// Add the callback
3547	jQuery.ready.promise().done( fn );
3548
3549	return this;
3550};
3551
3552jQuery.extend( {
3553
3554	// Is the DOM ready to be used? Set to true once it occurs.
3555	isReady: false,
3556
3557	// A counter to track how many items to wait for before
3558	// the ready event fires. See #6781
3559	readyWait: 1,
3560
3561	// Hold (or release) the ready event
3562	holdReady: function( hold ) {
3563		if ( hold ) {
3564			jQuery.readyWait++;
3565		} else {
3566			jQuery.ready( true );
3567		}
3568	},
3569
3570	// Handle when the DOM is ready
3571	ready: function( wait ) {
3572
3573		// Abort if there are pending holds or we're already ready
3574		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3575			return;
3576		}
3577
3578		// Remember that the DOM is ready
3579		jQuery.isReady = true;
3580
3581		// If a normal DOM Ready event fired, decrement, and wait if need be
3582		if ( wait !== true && --jQuery.readyWait > 0 ) {
3583			return;
3584		}
3585
3586		// If there are functions bound, to execute
3587		readyList.resolveWith( document, [ jQuery ] );
3588
3589		// Trigger any bound ready events
3590		if ( jQuery.fn.triggerHandler ) {
3591			jQuery( document ).triggerHandler( "ready" );
3592			jQuery( document ).off( "ready" );
3593		}
3594	}
3595} );
3596
3597/**
3598 * Clean-up method for dom ready events
3599 */
3600function detach() {
3601	if ( document.addEventListener ) {
3602		document.removeEventListener( "DOMContentLoaded", completed );
3603		window.removeEventListener( "load", completed );
3604
3605	} else {
3606		document.detachEvent( "onreadystatechange", completed );
3607		window.detachEvent( "onload", completed );
3608	}
3609}
3610
3611/**
3612 * The ready event handler and self cleanup method
3613 */
3614function completed() {
3615
3616	// readyState === "complete" is good enough for us to call the dom ready in oldIE
3617	if ( document.addEventListener ||
3618		window.event.type === "load" ||
3619		document.readyState === "complete" ) {
3620
3621		detach();
3622		jQuery.ready();
3623	}
3624}
3625
3626jQuery.ready.promise = function( obj ) {
3627	if ( !readyList ) {
3628
3629		readyList = jQuery.Deferred();
3630
3631		// Catch cases where $(document).ready() is called
3632		// after the browser event has already occurred.
3633		// Support: IE6-10
3634		// Older IE sometimes signals "interactive" too soon
3635		if ( document.readyState === "complete" ||
3636			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
3637
3638			// Handle it asynchronously to allow scripts the opportunity to delay ready
3639			window.setTimeout( jQuery.ready );
3640
3641		// Standards-based browsers support DOMContentLoaded
3642		} else if ( document.addEventListener ) {
3643
3644			// Use the handy event callback
3645			document.addEventListener( "DOMContentLoaded", completed );
3646
3647			// A fallback to window.onload, that will always work
3648			window.addEventListener( "load", completed );
3649
3650		// If IE event model is used
3651		} else {
3652
3653			// Ensure firing before onload, maybe late but safe also for iframes
3654			document.attachEvent( "onreadystatechange", completed );
3655
3656			// A fallback to window.onload, that will always work
3657			window.attachEvent( "onload", completed );
3658
3659			// If IE and not a frame
3660			// continually check to see if the document is ready
3661			var top = false;
3662
3663			try {
3664				top = window.frameElement == null && document.documentElement;
3665			} catch ( e ) {}
3666
3667			if ( top && top.doScroll ) {
3668				( function doScrollCheck() {
3669					if ( !jQuery.isReady ) {
3670
3671						try {
3672
3673							// Use the trick by Diego Perini
3674							// http://javascript.nwbox.com/IEContentLoaded/
3675							top.doScroll( "left" );
3676						} catch ( e ) {
3677							return window.setTimeout( doScrollCheck, 50 );
3678						}
3679
3680						// detach all dom ready events
3681						detach();
3682
3683						// and execute any waiting functions
3684						jQuery.ready();
3685					}
3686				} )();
3687			}
3688		}
3689	}
3690	return readyList.promise( obj );
3691};
3692
3693// Kick off the DOM ready check even if the user does not
3694jQuery.ready.promise();
3695
3696
3697
3698
3699// Support: IE<9
3700// Iteration over object's inherited properties before its own
3701var i;
3702for ( i in jQuery( support ) ) {
3703	break;
3704}
3705support.ownFirst = i === "0";
3706
3707// Note: most support tests are defined in their respective modules.
3708// false until the test is run
3709support.inlineBlockNeedsLayout = false;
3710
3711// Execute ASAP in case we need to set body.style.zoom
3712jQuery( function() {
3713
3714	// Minified: var a,b,c,d
3715	var val, div, body, container;
3716
3717	body = document.getElementsByTagName( "body" )[ 0 ];
3718	if ( !body || !body.style ) {
3719
3720		// Return for frameset docs that don't have a body
3721		return;
3722	}
3723
3724	// Setup
3725	div = document.createElement( "div" );
3726	container = document.createElement( "div" );
3727	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
3728	body.appendChild( container ).appendChild( div );
3729
3730	if ( typeof div.style.zoom !== "undefined" ) {
3731
3732		// Support: IE<8
3733		// Check if natively block-level elements act like inline-block
3734		// elements when setting their display to 'inline' and giving
3735		// them layout
3736		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
3737
3738		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
3739		if ( val ) {
3740
3741			// Prevent IE 6 from affecting layout for positioned elements #11048
3742			// Prevent IE from shrinking the body in IE 7 mode #12869
3743			// Support: IE<8
3744			body.style.zoom = 1;
3745		}
3746	}
3747
3748	body.removeChild( container );
3749} );
3750
3751
3752( function() {
3753	var div = document.createElement( "div" );
3754
3755	// Support: IE<9
3756	support.deleteExpando = true;
3757	try {
3758		delete div.test;
3759	} catch ( e ) {
3760		support.deleteExpando = false;
3761	}
3762
3763	// Null elements to avoid leaks in IE.
3764	div = null;
3765} )();
3766var acceptData = function( elem ) {
3767	var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
3768		nodeType = +elem.nodeType || 1;
3769
3770	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
3771	return nodeType !== 1 && nodeType !== 9 ?
3772		false :
3773
3774		// Nodes accept data unless otherwise specified; rejection can be conditional
3775		!noData || noData !== true && elem.getAttribute( "classid" ) === noData;
3776};
3777
3778
3779
3780
3781var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
3782	rmultiDash = /([A-Z])/g;
3783
3784function dataAttr( elem, key, data ) {
3785
3786	// If nothing was found internally, try to fetch any
3787	// data from the HTML5 data-* attribute
3788	if ( data === undefined && elem.nodeType === 1 ) {
3789
3790		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3791
3792		data = elem.getAttribute( name );
3793
3794		if ( typeof data === "string" ) {
3795			try {
3796				data = data === "true" ? true :
vendor: 11,186 bytes, lines 3797-4261
3797					data === "false" ? false :
3798					data === "null" ? null :
3799
3800					// Only convert to a number if it doesn't change the string
3801					+data + "" === data ? +data :
3802					rbrace.test( data ) ? jQuery.parseJSON( data ) :
3803					data;
3804			} catch ( e ) {}
3805
3806			// Make sure we set the data so it isn't changed later
3807			jQuery.data( elem, key, data );
3808
3809		} else {
3810			data = undefined;
3811		}
3812	}
3813
3814	return data;
3815}
3816
3817// checks a cache object for emptiness
3818function isEmptyDataObject( obj ) {
3819	var name;
3820	for ( name in obj ) {
3821
3822		// if the public data object is empty, the private is still empty
3823		if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
3824			continue;
3825		}
3826		if ( name !== "toJSON" ) {
3827			return false;
3828		}
3829	}
3830
3831	return true;
3832}
3833
3834function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
3835	if ( !acceptData( elem ) ) {
3836		return;
3837	}
3838
3839	var ret, thisCache,
3840		internalKey = jQuery.expando,
3841
3842		// We have to handle DOM nodes and JS objects differently because IE6-7
3843		// can't GC object references properly across the DOM-JS boundary
3844		isNode = elem.nodeType,
3845
3846		// Only DOM nodes need the global jQuery cache; JS object data is
3847		// attached directly to the object so GC can occur automatically
3848		cache = isNode ? jQuery.cache : elem,
3849
3850		// Only defining an ID for JS objects if its cache already exists allows
3851		// the code to shortcut on the same path as a DOM node with no cache
3852		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
3853
3854	// Avoid doing any more work than we need to when trying to get data on an
3855	// object that has no data at all
3856	if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
3857		data === undefined && typeof name === "string" ) {
3858		return;
3859	}
3860
3861	if ( !id ) {
3862
3863		// Only DOM nodes need a new unique ID for each element since their data
3864		// ends up in the global cache
3865		if ( isNode ) {
3866			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
3867		} else {
3868			id = internalKey;
3869		}
3870	}
3871
3872	if ( !cache[ id ] ) {
3873
3874		// Avoid exposing jQuery metadata on plain JS objects when the object
3875		// is serialized using JSON.stringify
3876		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
3877	}
3878
3879	// An object can be passed to jQuery.data instead of a key/value pair; this gets
3880	// shallow copied over onto the existing cache
3881	if ( typeof name === "object" || typeof name === "function" ) {
3882		if ( pvt ) {
3883			cache[ id ] = jQuery.extend( cache[ id ], name );
3884		} else {
3885			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
3886		}
3887	}
3888
3889	thisCache = cache[ id ];
3890
3891	// jQuery data() is stored in a separate object inside the object's internal data
3892	// cache in order to avoid key collisions between internal data and user-defined
3893	// data.
3894	if ( !pvt ) {
3895		if ( !thisCache.data ) {
3896			thisCache.data = {};
3897		}
3898
3899		thisCache = thisCache.data;
3900	}
3901
3902	if ( data !== undefined ) {
3903		thisCache[ jQuery.camelCase( name ) ] = data;
3904	}
3905
3906	// Check for both converted-to-camel and non-converted data property names
3907	// If a data property was specified
3908	if ( typeof name === "string" ) {
3909
3910		// First Try to find as-is property data
3911		ret = thisCache[ name ];
3912
3913		// Test for null|undefined property data
3914		if ( ret == null ) {
3915
3916			// Try to find the camelCased property
3917			ret = thisCache[ jQuery.camelCase( name ) ];
3918		}
3919	} else {
3920		ret = thisCache;
3921	}
3922
3923	return ret;
3924}
3925
3926function internalRemoveData( elem, name, pvt ) {
3927	if ( !acceptData( elem ) ) {
3928		return;
3929	}
3930
3931	var thisCache, i,
3932		isNode = elem.nodeType,
3933
3934		// See jQuery.data for more information
3935		cache = isNode ? jQuery.cache : elem,
3936		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
3937
3938	// If there is already no cache entry for this object, there is no
3939	// purpose in continuing
3940	if ( !cache[ id ] ) {
3941		return;
3942	}
3943
3944	if ( name ) {
3945
3946		thisCache = pvt ? cache[ id ] : cache[ id ].data;
3947
3948		if ( thisCache ) {
3949
3950			// Support array or space separated string names for data keys
3951			if ( !jQuery.isArray( name ) ) {
3952
3953				// try the string as a key before any manipulation
3954				if ( name in thisCache ) {
3955					name = [ name ];
3956				} else {
3957
3958					// split the camel cased version by spaces unless a key with the spaces exists
3959					name = jQuery.camelCase( name );
3960					if ( name in thisCache ) {
3961						name = [ name ];
3962					} else {
3963						name = name.split( " " );
3964					}
3965				}
3966			} else {
3967
3968				// If "name" is an array of keys...
3969				// When data is initially created, via ("key", "val") signature,
3970				// keys will be converted to camelCase.
3971				// Since there is no way to tell _how_ a key was added, remove
3972				// both plain key and camelCase key. #12786
3973				// This will only penalize the array argument path.
3974				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
3975			}
3976
3977			i = name.length;
3978			while ( i-- ) {
3979				delete thisCache[ name[ i ] ];
3980			}
3981
3982			// If there is no data left in the cache, we want to continue
3983			// and let the cache object itself get destroyed
3984			if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
3985				return;
3986			}
3987		}
3988	}
3989
3990	// See jQuery.data for more information
3991	if ( !pvt ) {
3992		delete cache[ id ].data;
3993
3994		// Don't destroy the parent cache unless the internal data object
3995		// had been the only thing left in it
3996		if ( !isEmptyDataObject( cache[ id ] ) ) {
3997			return;
3998		}
3999	}
4000
4001	// Destroy the cache
4002	if ( isNode ) {
4003		jQuery.cleanData( [ elem ], true );
4004
4005	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
4006	/* jshint eqeqeq: false */
4007	} else if ( support.deleteExpando || cache != cache.window ) {
4008		/* jshint eqeqeq: true */
4009		delete cache[ id ];
4010
4011	// When all else fails, undefined
4012	} else {
4013		cache[ id ] = undefined;
4014	}
4015}
4016
4017jQuery.extend( {
4018	cache: {},
4019
4020	// The following elements (space-suffixed to avoid Object.prototype collisions)
4021	// throw uncatchable exceptions if you attempt to set expando properties
4022	noData: {
4023		"applet ": true,
4024		"embed ": true,
4025
4026		// ...but Flash objects (which have this classid) *can* handle expandos
4027		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
4028	},
4029
4030	hasData: function( elem ) {
4031		elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
4032		return !!elem && !isEmptyDataObject( elem );
4033	},
4034
4035	data: function( elem, name, data ) {
4036		return internalData( elem, name, data );
4037	},
4038
4039	removeData: function( elem, name ) {
4040		return internalRemoveData( elem, name );
4041	},
4042
4043	// For internal use only.
4044	_data: function( elem, name, data ) {
4045		return internalData( elem, name, data, true );
4046	},
4047
4048	_removeData: function( elem, name ) {
4049		return internalRemoveData( elem, name, true );
4050	}
4051} );
4052
4053jQuery.fn.extend( {
4054	data: function( key, value ) {
4055		var i, name, data,
4056			elem = this[ 0 ],
4057			attrs = elem && elem.attributes;
4058
4059		// Special expections of .data basically thwart jQuery.access,
4060		// so implement the relevant behavior ourselves
4061
4062		// Gets all values
4063		if ( key === undefined ) {
4064			if ( this.length ) {
4065				data = jQuery.data( elem );
4066
4067				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
4068					i = attrs.length;
4069					while ( i-- ) {
4070
4071						// Support: IE11+
4072						// The attrs elements can be null (#14894)
4073						if ( attrs[ i ] ) {
4074							name = attrs[ i ].name;
4075							if ( name.indexOf( "data-" ) === 0 ) {
4076								name = jQuery.camelCase( name.slice( 5 ) );
4077								dataAttr( elem, name, data[ name ] );
4078							}
4079						}
4080					}
4081					jQuery._data( elem, "parsedAttrs", true );
4082				}
4083			}
4084
4085			return data;
4086		}
4087
4088		// Sets multiple values
4089		if ( typeof key === "object" ) {
4090			return this.each( function() {
4091				jQuery.data( this, key );
4092			} );
4093		}
4094
4095		return arguments.length > 1 ?
4096
4097			// Sets one value
4098			this.each( function() {
4099				jQuery.data( this, key, value );
4100			} ) :
4101
4102			// Gets one value
4103			// Try to fetch any internally stored data first
4104			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
4105	},
4106
4107	removeData: function( key ) {
4108		return this.each( function() {
4109			jQuery.removeData( this, key );
4110		} );
4111	}
4112} );
4113
4114
4115jQuery.extend( {
4116	queue: function( elem, type, data ) {
4117		var queue;
4118
4119		if ( elem ) {
4120			type = ( type || "fx" ) + "queue";
4121			queue = jQuery._data( elem, type );
4122
4123			// Speed up dequeue by getting out quickly if this is just a lookup
4124			if ( data ) {
4125				if ( !queue || jQuery.isArray( data ) ) {
4126					queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
4127				} else {
4128					queue.push( data );
4129				}
4130			}
4131			return queue || [];
4132		}
4133	},
4134
4135	dequeue: function( elem, type ) {
4136		type = type || "fx";
4137
4138		var queue = jQuery.queue( elem, type ),
4139			startLength = queue.length,
4140			fn = queue.shift(),
4141			hooks = jQuery._queueHooks( elem, type ),
4142			next = function() {
4143				jQuery.dequeue( elem, type );
4144			};
4145
4146		// If the fx queue is dequeued, always remove the progress sentinel
4147		if ( fn === "inprogress" ) {
4148			fn = queue.shift();
4149			startLength--;
4150		}
4151
4152		if ( fn ) {
4153
4154			// Add a progress sentinel to prevent the fx queue from being
4155			// automatically dequeued
4156			if ( type === "fx" ) {
4157				queue.unshift( "inprogress" );
4158			}
4159
4160			// clear up the last queue stop function
4161			delete hooks.stop;
4162			fn.call( elem, next, hooks );
4163		}
4164
4165		if ( !startLength && hooks ) {
4166			hooks.empty.fire();
4167		}
4168	},
4169
4170	// not intended for public consumption - generates a queueHooks object,
4171	// or returns the current one
4172	_queueHooks: function( elem, type ) {
4173		var key = type + "queueHooks";
4174		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
4175			empty: jQuery.Callbacks( "once memory" ).add( function() {
4176				jQuery._removeData( elem, type + "queue" );
4177				jQuery._removeData( elem, key );
4178			} )
4179		} );
4180	}
4181} );
4182
4183jQuery.fn.extend( {
4184	queue: function( type, data ) {
4185		var setter = 2;
4186
4187		if ( typeof type !== "string" ) {
4188			data = type;
4189			type = "fx";
4190			setter--;
4191		}
4192
4193		if ( arguments.length < setter ) {
4194			return jQuery.queue( this[ 0 ], type );
4195		}
4196
4197		return data === undefined ?
4198			this :
4199			this.each( function() {
4200				var queue = jQuery.queue( this, type, data );
4201
4202				// ensure a hooks for this queue
4203				jQuery._queueHooks( this, type );
4204
4205				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4206					jQuery.dequeue( this, type );
4207				}
4208			} );
4209	},
4210	dequeue: function( type ) {
4211		return this.each( function() {
4212			jQuery.dequeue( this, type );
4213		} );
4214	},
4215	clearQueue: function( type ) {
4216		return this.queue( type || "fx", [] );
4217	},
4218
4219	// Get a promise resolved when queues of a certain type
4220	// are emptied (fx is the type by default)
4221	promise: function( type, obj ) {
4222		var tmp,
4223			count = 1,
4224			defer = jQuery.Deferred(),
4225			elements = this,
4226			i = this.length,
4227			resolve = function() {
4228				if ( !( --count ) ) {
4229					defer.resolveWith( elements, [ elements ] );
4230				}
4231			};
4232
4233		if ( typeof type !== "string" ) {
4234			obj = type;
4235			type = undefined;
4236		}
4237		type = type || "fx";
4238
4239		while ( i-- ) {
4240			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
4241			if ( tmp && tmp.empty ) {
4242				count++;
4243				tmp.empty.add( resolve );
4244			}
4245		}
4246		resolve();
4247		return defer.promise( obj );
4248	}
4249} );
4250
4251
4252( function() {
4253	var shrinkWrapBlocksVal;
4254
4255	support.shrinkWrapBlocks = function() {
4256		if ( shrinkWrapBlocksVal != null ) {
4257			return shrinkWrapBlocksVal;
4258		}
4259
4260		// Will be changed later if needed.
4261		shrinkWrapBlocksVal = false;
vendor: 4,171 bytes, lines 4262-4410
4262
4263		// Minified: var b,c,d
4264		var div, body, container;
4265
4266		body = document.getElementsByTagName( "body" )[ 0 ];
4267		if ( !body || !body.style ) {
4268
4269			// Test fired too early or in an unsupported environment, exit.
4270			return;
4271		}
4272
4273		// Setup
4274		div = document.createElement( "div" );
4275		container = document.createElement( "div" );
4276		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
4277		body.appendChild( container ).appendChild( div );
4278
4279		// Support: IE6
4280		// Check if elements with layout shrink-wrap their children
4281		if ( typeof div.style.zoom !== "undefined" ) {
4282
4283			// Reset CSS: box-sizing; display; margin; border
4284			div.style.cssText =
4285
4286				// Support: Firefox<29, Android 2.3
4287				// Vendor-prefix box-sizing
4288				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
4289				"box-sizing:content-box;display:block;margin:0;border:0;" +
4290				"padding:1px;width:1px;zoom:1";
4291			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
4292			shrinkWrapBlocksVal = div.offsetWidth !== 3;
4293		}
4294
4295		body.removeChild( container );
4296
4297		return shrinkWrapBlocksVal;
4298	};
4299
4300} )();
4301var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4302
4303var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4304
4305
4306var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4307
4308var isHidden = function( elem, el ) {
4309
4310		// isHidden might be called from jQuery#filter function;
4311		// in that case, element will be second argument
4312		elem = el || elem;
4313		return jQuery.css( elem, "display" ) === "none" ||
4314			!jQuery.contains( elem.ownerDocument, elem );
4315	};
4316
4317
4318
4319function adjustCSS( elem, prop, valueParts, tween ) {
4320	var adjusted,
4321		scale = 1,
4322		maxIterations = 20,
4323		currentValue = tween ?
4324			function() { return tween.cur(); } :
4325			function() { return jQuery.css( elem, prop, "" ); },
4326		initial = currentValue(),
4327		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4328
4329		// Starting value computation is required for potential unit mismatches
4330		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4331			rcssNum.exec( jQuery.css( elem, prop ) );
4332
4333	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4334
4335		// Trust units reported by jQuery.css
4336		unit = unit || initialInUnit[ 3 ];
4337
4338		// Make sure we update the tween properties later on
4339		valueParts = valueParts || [];
4340
4341		// Iteratively approximate from a nonzero starting point
4342		initialInUnit = +initial || 1;
4343
4344		do {
4345
4346			// If previous iteration zeroed out, double until we get *something*.
4347			// Use string for doubling so we don't accidentally see scale as unchanged below
4348			scale = scale || ".5";
4349
4350			// Adjust and apply
4351			initialInUnit = initialInUnit / scale;
4352			jQuery.style( elem, prop, initialInUnit + unit );
4353
4354		// Update scale, tolerating zero or NaN from tween.cur()
4355		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
4356		} while (
4357			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
4358		);
4359	}
4360
4361	if ( valueParts ) {
4362		initialInUnit = +initialInUnit || +initial || 0;
4363
4364		// Apply relative offset (+=/-=) if specified
4365		adjusted = valueParts[ 1 ] ?
4366			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4367			+valueParts[ 2 ];
4368		if ( tween ) {
4369			tween.unit = unit;
4370			tween.start = initialInUnit;
4371			tween.end = adjusted;
4372		}
4373	}
4374	return adjusted;
4375}
4376
4377
4378// Multifunctional method to get and set values of a collection
4379// The value/s can optionally be executed if it's a function
4380var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4381	var i = 0,
4382		length = elems.length,
4383		bulk = key == null;
4384
4385	// Sets many values
4386	if ( jQuery.type( key ) === "object" ) {
4387		chainable = true;
4388		for ( i in key ) {
4389			access( elems, fn, i, key[ i ], true, emptyGet, raw );
4390		}
4391
4392	// Sets one value
4393	} else if ( value !== undefined ) {
4394		chainable = true;
4395
4396		if ( !jQuery.isFunction( value ) ) {
4397			raw = true;
4398		}
4399
4400		if ( bulk ) {
4401
4402			// Bulk operations run against the entire set
4403			if ( raw ) {
4404				fn.call( elems, value );
4405				fn = null;
4406
4407			// ...except when executing function values
4408			} else {
4409				bulk = fn;
4410				fn = function( elem, key, value ) {
4411					return bulk.call( jQuery( elem ), value );
4412				};
4413			}
4414		}
4415
4416		if ( fn ) {
4417			for ( ; i < length; i++ ) {
4418				fn(
4419					elems[ i ],
4420					key,
4421					raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
4422				);
4423			}
4424		}
4425	}
4426
4427	return chainable ?
4428		elems :
4429
4430		// Gets
4431		bulk ?
4432			fn.call( elems ) :
4433			length ? fn( elems[ 0 ], key ) : emptyGet;
4434};
4435var rcheckableType = ( /^(?:checkbox|radio)$/i );
4436
4437var rtagName = ( /<([\w:-]+)/ );
4438
4439var rscriptType = ( /^$|\/(?:java|ecma)script/i );
4440
4441var rleadingWhitespace = ( /^\s+/ );
4442
4443var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
4444		"details|dialog|figcaption|figure|footer|header|hgroup|main|" +
4445		"mark|meter|nav|output|picture|progress|section|summary|template|time|video";
4446
4447
4448
4449function createSafeFragment( document ) {
4450	var list = nodeNames.split( "|" ),
4451		safeFrag = document.createDocumentFragment();
4452
4453	if ( safeFrag.createElement ) {
4454		while ( list.length ) {
4455			safeFrag.createElement(
4456				list.pop()
4457			);
4458		}
4459	}
4460	return safeFrag;
4461}
4462
4463
4464( function() {
4465	var div = document.createElement( "div" ),
4466		fragment = document.createDocumentFragment(),
4467		input = document.createElement( "input" );
4468
4469	// Setup
4470	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
4471
4472	// IE strips leading whitespace when .innerHTML is used
4473	support.leadingWhitespace = div.firstChild.nodeType === 3;
4474
4475	// Make sure that tbody elements aren't automatically inserted
4476	// IE will insert them into empty tables
4477	support.tbody = !div.getElementsByTagName( "tbody" ).length;
4478
4479	// Make sure that link elements get serialized correctly by innerHTML
4480	// This requires a wrapper element in IE
4481	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
4482
4483	// Makes sure cloning an html5 element does not cause problems
4484	// Where outerHTML is undefined, this still works
4485	support.html5Clone =
4486		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
4487
4488	// Check if a disconnected checkbox will retain its checked
4489	// value of true after appended to the DOM (IE6/7)
4490	input.type = "checkbox";
4491	input.checked = true;
4492	fragment.appendChild( input );
4493	support.appendChecked = input.checked;
4494
4495	// Make sure textarea (and checkbox) defaultValue is properly cloned
4496	// Support: IE6-IE11+
4497	div.innerHTML = "<textarea>x</textarea>";
4498	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4499
4500	// Support: IE <=9 only
4501	// IE <=9 replaces <option> tags with their contents when inserted outside of
4502	// the select element.
4503	div.innerHTML = "<option></option>";
4504	support.option = !!div.lastChild;
4505
4506	// #11217 - WebKit loses check when the name is after the checked attribute
4507	fragment.appendChild( div );
4508
4509	// Support: Windows Web Apps (WWA)
4510	// `name` and `type` must use .setAttribute for WWA (#14901)
4511	input = document.createElement( "input" );
4512	input.setAttribute( "type", "radio" );
4513	input.setAttribute( "checked", "checked" );
4514	input.setAttribute( "name", "t" );
4515
4516	div.appendChild( input );
4517
4518	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
4519	// old WebKit doesn't clone checked state correctly in fragments
4520	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4521
4522	// Support: IE<9
4523	// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
4524	support.noCloneEvent = !!div.addEventListener;
4525
4526	// Support: IE<9
4527	// Since attributes and properties are the same in IE,
4528	// cleanData must set properties to undefined rather than use removeAttribute
4529	div[ jQuery.expando ] = 1;
4530	support.attributes = !div.getAttribute( jQuery.expando );
4531} )();
4532
4533
4534// We have to close these tags to support XHTML (#13200)
4535var wrapMap = {
4536	legend: [ 1, "<fieldset>", "</fieldset>" ],
4537	area: [ 1, "<map>", "</map>" ],
4538
4539	// Support: IE8
4540	param: [ 1, "<object>", "</object>" ],
4541	thead: [ 1, "<table>", "</table>" ],
4542	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4543	col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
4544	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4545
4546	// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
4547	// unless wrapped in a div with non-breaking characters in front of it.
4548	_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
4549};
4550
4551// Support: IE8-IE9
4552wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4553wrapMap.th = wrapMap.td;
4554
4555
4556// Support: IE <=9 only
4557if ( !support.option ) {
4558	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4559}
4560
4561
4562function getAll( context, tag ) {
4563	var elems, elem,
4564		i = 0,
4565		found = typeof context.getElementsByTagName !== "undefined" ?
4566			context.getElementsByTagName( tag || "*" ) :
4567			typeof context.querySelectorAll !== "undefined" ?
4568				context.querySelectorAll( tag || "*" ) :
4569				undefined;
4570
4571	if ( !found ) {
4572		for ( found = [], elems = context.childNodes || context;
4573			( elem = elems[ i ] ) != null;
4574			i++
4575		) {
4576			if ( !tag || jQuery.nodeName( elem, tag ) ) {
4577				found.push( elem );
4578			} else {
4579				jQuery.merge( found, getAll( elem, tag ) );
4580			}
4581		}
4582	}
4583
4584	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
4585		jQuery.merge( [ context ], found ) :
4586		found;
4587}
4588
4589
4590// Mark scripts as having already been evaluated
4591function setGlobalEval( elems, refElements ) {
4592	var elem,
4593		i = 0;
4594	for ( ; ( elem = elems[ i ] ) != null; i++ ) {
4595		jQuery._data(
4596			elem,
4597			"globalEval",
4598			!refElements || jQuery._data( refElements[ i ], "globalEval" )
4599		);
4600	}
4601}
4602
4603
vendor: 45,423 bytes, lines 4604-6235
4604var rhtml = /<|&#?\w+;/,
4605	rtbody = /<tbody/i;
4606
4607function fixDefaultChecked( elem ) {
4608	if ( rcheckableType.test( elem.type ) ) {
4609		elem.defaultChecked = elem.checked;
4610	}
4611}
4612
4613function buildFragment( elems, context, scripts, selection, ignored ) {
4614	var j, elem, contains,
4615		tmp, tag, tbody, wrap,
4616		l = elems.length,
4617
4618		// Ensure a safe fragment
4619		safe = createSafeFragment( context ),
4620
4621		nodes = [],
4622		i = 0;
4623
4624	for ( ; i < l; i++ ) {
4625		elem = elems[ i ];
4626
4627		if ( elem || elem === 0 ) {
4628
4629			// Add nodes directly
4630			if ( jQuery.type( elem ) === "object" ) {
4631				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4632
4633			// Convert non-html into a text node
4634			} else if ( !rhtml.test( elem ) ) {
4635				nodes.push( context.createTextNode( elem ) );
4636
4637			// Convert html into DOM nodes
4638			} else {
4639				tmp = tmp || safe.appendChild( context.createElement( "div" ) );
4640
4641				// Deserialize a standard representation
4642				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4643				wrap = wrapMap[ tag ] || wrapMap._default;
4644
4645				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4646
4647				// Descend through wrappers to the right content
4648				j = wrap[ 0 ];
4649				while ( j-- ) {
4650					tmp = tmp.lastChild;
4651				}
4652
4653				// Manually add leading whitespace removed by IE
4654				if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
4655					nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
4656				}
4657
4658				// Remove IE's autoinserted <tbody> from table fragments
4659				if ( !support.tbody ) {
4660
4661					// String was a <table>, *may* have spurious <tbody>
4662					elem = tag === "table" && !rtbody.test( elem ) ?
4663						tmp.firstChild :
4664
4665						// String was a bare <thead> or <tfoot>
4666						wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
4667							tmp :
4668							0;
4669
4670					j = elem && elem.childNodes.length;
4671					while ( j-- ) {
4672						if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
4673							!tbody.childNodes.length ) {
4674
4675							elem.removeChild( tbody );
4676						}
4677					}
4678				}
4679
4680				jQuery.merge( nodes, tmp.childNodes );
4681
4682				// Fix #12392 for WebKit and IE > 9
4683				tmp.textContent = "";
4684
4685				// Fix #12392 for oldIE
4686				while ( tmp.firstChild ) {
4687					tmp.removeChild( tmp.firstChild );
4688				}
4689
4690				// Remember the top-level container for proper cleanup
4691				tmp = safe.lastChild;
4692			}
4693		}
4694	}
4695
4696	// Fix #11356: Clear elements from fragment
4697	if ( tmp ) {
4698		safe.removeChild( tmp );
4699	}
4700
4701	// Reset defaultChecked for any radios and checkboxes
4702	// about to be appended to the DOM in IE 6/7 (#8060)
4703	if ( !support.appendChecked ) {
4704		jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
4705	}
4706
4707	i = 0;
4708	while ( ( elem = nodes[ i++ ] ) ) {
4709
4710		// Skip elements already in the context collection (trac-4087)
4711		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4712			if ( ignored ) {
4713				ignored.push( elem );
4714			}
4715
4716			continue;
4717		}
4718
4719		contains = jQuery.contains( elem.ownerDocument, elem );
4720
4721		// Append to fragment
4722		tmp = getAll( safe.appendChild( elem ), "script" );
4723
4724		// Preserve script evaluation history
4725		if ( contains ) {
4726			setGlobalEval( tmp );
4727		}
4728
4729		// Capture executables
4730		if ( scripts ) {
4731			j = 0;
4732			while ( ( elem = tmp[ j++ ] ) ) {
4733				if ( rscriptType.test( elem.type || "" ) ) {
4734					scripts.push( elem );
4735				}
4736			}
4737		}
4738	}
4739
4740	tmp = null;
4741
4742	return safe;
4743}
4744
4745
4746( function() {
4747	var i, eventName,
4748		div = document.createElement( "div" );
4749
4750	// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
4751	for ( i in { submit: true, change: true, focusin: true } ) {
4752		eventName = "on" + i;
4753
4754		if ( !( support[ i ] = eventName in window ) ) {
4755
4756			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
4757			div.setAttribute( eventName, "t" );
4758			support[ i ] = div.attributes[ eventName ].expando === false;
4759		}
4760	}
4761
4762	// Null elements to avoid leaks in IE.
4763	div = null;
4764} )();
4765
4766
4767var rformElems = /^(?:input|select|textarea)$/i,
4768	rkeyEvent = /^key/,
4769	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4770	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4771	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4772
4773function returnTrue() {
4774	return true;
4775}
4776
4777function returnFalse() {
4778	return false;
4779}
4780
4781// Support: IE9
4782// See #13393 for more info
4783function safeActiveElement() {
4784	try {
4785		return document.activeElement;
4786	} catch ( err ) { }
4787}
4788
4789function on( elem, types, selector, data, fn, one ) {
4790	var origFn, type;
4791
4792	// Types can be a map of types/handlers
4793	if ( typeof types === "object" ) {
4794
4795		// ( types-Object, selector, data )
4796		if ( typeof selector !== "string" ) {
4797
4798			// ( types-Object, data )
4799			data = data || selector;
4800			selector = undefined;
4801		}
4802		for ( type in types ) {
4803			on( elem, type, selector, data, types[ type ], one );
4804		}
4805		return elem;
4806	}
4807
4808	if ( data == null && fn == null ) {
4809
4810		// ( types, fn )
4811		fn = selector;
4812		data = selector = undefined;
4813	} else if ( fn == null ) {
4814		if ( typeof selector === "string" ) {
4815
4816			// ( types, selector, fn )
4817			fn = data;
4818			data = undefined;
4819		} else {
4820
4821			// ( types, data, fn )
4822			fn = data;
4823			data = selector;
4824			selector = undefined;
4825		}
4826	}
4827	if ( fn === false ) {
4828		fn = returnFalse;
4829	} else if ( !fn ) {
4830		return elem;
4831	}
4832
4833	if ( one === 1 ) {
4834		origFn = fn;
4835		fn = function( event ) {
4836
4837			// Can use an empty set, since event contains the info
4838			jQuery().off( event );
4839			return origFn.apply( this, arguments );
4840		};
4841
4842		// Use same guid so caller can remove using origFn
4843		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4844	}
4845	return elem.each( function() {
4846		jQuery.event.add( this, types, fn, data, selector );
4847	} );
4848}
4849
4850/*
4851 * Helper functions for managing events -- not part of the public interface.
4852 * Props to Dean Edwards' addEvent library for many of the ideas.
4853 */
4854jQuery.event = {
4855
4856	global: {},
4857
4858	add: function( elem, types, handler, data, selector ) {
4859		var tmp, events, t, handleObjIn,
4860			special, eventHandle, handleObj,
4861			handlers, type, namespaces, origType,
4862			elemData = jQuery._data( elem );
4863
4864		// Don't attach events to noData or text/comment nodes (but allow plain objects)
4865		if ( !elemData ) {
4866			return;
4867		}
4868
4869		// Caller can pass in an object of custom data in lieu of the handler
4870		if ( handler.handler ) {
4871			handleObjIn = handler;
4872			handler = handleObjIn.handler;
4873			selector = handleObjIn.selector;
4874		}
4875
4876		// Make sure that the handler has a unique ID, used to find/remove it later
4877		if ( !handler.guid ) {
4878			handler.guid = jQuery.guid++;
4879		}
4880
4881		// Init the element's event structure and main handler, if this is the first
4882		if ( !( events = elemData.events ) ) {
4883			events = elemData.events = {};
4884		}
4885		if ( !( eventHandle = elemData.handle ) ) {
4886			eventHandle = elemData.handle = function( e ) {
4887
4888				// Discard the second event of a jQuery.event.trigger() and
4889				// when an event is called after a page has unloaded
4890				return typeof jQuery !== "undefined" &&
4891					( !e || jQuery.event.triggered !== e.type ) ?
4892					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
4893					undefined;
4894			};
4895
4896			// Add elem as a property of the handle fn to prevent a memory leak
4897			// with IE non-native events
4898			eventHandle.elem = elem;
4899		}
4900
4901		// Handle multiple events separated by a space
4902		types = ( types || "" ).match( rnotwhite ) || [ "" ];
4903		t = types.length;
4904		while ( t-- ) {
4905			tmp = rtypenamespace.exec( types[ t ] ) || [];
4906			type = origType = tmp[ 1 ];
4907			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
4908
4909			// There *must* be a type, no attaching namespace-only handlers
4910			if ( !type ) {
4911				continue;
4912			}
4913
4914			// If event changes its type, use the special event handlers for the changed type
4915			special = jQuery.event.special[ type ] || {};
4916
4917			// If selector defined, determine special event api type, otherwise given type
4918			type = ( selector ? special.delegateType : special.bindType ) || type;
4919
4920			// Update special based on newly reset type
4921			special = jQuery.event.special[ type ] || {};
4922
4923			// handleObj is passed to all event handlers
4924			handleObj = jQuery.extend( {
4925				type: type,
4926				origType: origType,
4927				data: data,
4928				handler: handler,
4929				guid: handler.guid,
4930				selector: selector,
4931				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4932				namespace: namespaces.join( "." )
4933			}, handleObjIn );
4934
4935			// Init the event handler queue if we're the first
4936			if ( !( handlers = events[ type ] ) ) {
4937				handlers = events[ type ] = [];
4938				handlers.delegateCount = 0;
4939
4940				// Only use addEventListener/attachEvent if the special events handler returns false
4941				if ( !special.setup ||
4942					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4943
4944					// Bind the global event handler to the element
4945					if ( elem.addEventListener ) {
4946						elem.addEventListener( type, eventHandle, false );
4947
4948					} else if ( elem.attachEvent ) {
4949						elem.attachEvent( "on" + type, eventHandle );
4950					}
4951				}
4952			}
4953
4954			if ( special.add ) {
4955				special.add.call( elem, handleObj );
4956
4957				if ( !handleObj.handler.guid ) {
4958					handleObj.handler.guid = handler.guid;
4959				}
4960			}
4961
4962			// Add to the element's handler list, delegates in front
4963			if ( selector ) {
4964				handlers.splice( handlers.delegateCount++, 0, handleObj );
4965			} else {
4966				handlers.push( handleObj );
4967			}
4968
4969			// Keep track of which events have ever been used, for event optimization
4970			jQuery.event.global[ type ] = true;
4971		}
4972
4973		// Nullify elem to prevent memory leaks in IE
4974		elem = null;
4975	},
4976
4977	// Detach an event or set of events from an element
4978	remove: function( elem, types, handler, selector, mappedTypes ) {
4979		var j, handleObj, tmp,
4980			origCount, t, events,
4981			special, handlers, type,
4982			namespaces, origType,
4983			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
4984
4985		if ( !elemData || !( events = elemData.events ) ) {
4986			return;
4987		}
4988
4989		// Once for each type.namespace in types; type may be omitted
4990		types = ( types || "" ).match( rnotwhite ) || [ "" ];
4991		t = types.length;
4992		while ( t-- ) {
4993			tmp = rtypenamespace.exec( types[ t ] ) || [];
4994			type = origType = tmp[ 1 ];
4995			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
4996
4997			// Unbind all events (on this namespace, if provided) for the element
4998			if ( !type ) {
4999				for ( type in events ) {
5000					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5001				}
5002				continue;
5003			}
5004
5005			special = jQuery.event.special[ type ] || {};
5006			type = ( selector ? special.delegateType : special.bindType ) || type;
5007			handlers = events[ type ] || [];
5008			tmp = tmp[ 2 ] &&
5009				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5010
5011			// Remove matching events
5012			origCount = j = handlers.length;
5013			while ( j-- ) {
5014				handleObj = handlers[ j ];
5015
5016				if ( ( mappedTypes || origType === handleObj.origType ) &&
5017					( !handler || handler.guid === handleObj.guid ) &&
5018					( !tmp || tmp.test( handleObj.namespace ) ) &&
5019					( !selector || selector === handleObj.selector ||
5020						selector === "**" && handleObj.selector ) ) {
5021					handlers.splice( j, 1 );
5022
5023					if ( handleObj.selector ) {
5024						handlers.delegateCount--;
5025					}
5026					if ( special.remove ) {
5027						special.remove.call( elem, handleObj );
5028					}
5029				}
5030			}
5031
5032			// Remove generic event handler if we removed something and no more handlers exist
5033			// (avoids potential for endless recursion during removal of special event handlers)
5034			if ( origCount && !handlers.length ) {
5035				if ( !special.teardown ||
5036					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5037
5038					jQuery.removeEvent( elem, type, elemData.handle );
5039				}
5040
5041				delete events[ type ];
5042			}
5043		}
5044
5045		// Remove the expando if it's no longer used
5046		if ( jQuery.isEmptyObject( events ) ) {
5047			delete elemData.handle;
5048
5049			// removeData also checks for emptiness and clears the expando if empty
5050			// so use it instead of delete
5051			jQuery._removeData( elem, "events" );
5052		}
5053	},
5054
5055	trigger: function( event, data, elem, onlyHandlers ) {
5056		var handle, ontype, cur,
5057			bubbleType, special, tmp, i,
5058			eventPath = [ elem || document ],
5059			type = hasOwn.call( event, "type" ) ? event.type : event,
5060			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
5061
5062		cur = tmp = elem = elem || document;
5063
5064		// Don't do events on text and comment nodes
5065		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
5066			return;
5067		}
5068
5069		// focus/blur morphs to focusin/out; ensure we're not firing them right now
5070		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
5071			return;
5072		}
5073
5074		if ( type.indexOf( "." ) > -1 ) {
5075
5076			// Namespaced trigger; create a regexp to match event type in handle()
5077			namespaces = type.split( "." );
5078			type = namespaces.shift();
5079			namespaces.sort();
5080		}
5081		ontype = type.indexOf( ":" ) < 0 && "on" + type;
5082
5083		// Caller can pass in a jQuery.Event object, Object, or just an event type string
5084		event = event[ jQuery.expando ] ?
5085			event :
5086			new jQuery.Event( type, typeof event === "object" && event );
5087
5088		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
5089		event.isTrigger = onlyHandlers ? 2 : 3;
5090		event.namespace = namespaces.join( "." );
5091		event.rnamespace = event.namespace ?
5092			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
5093			null;
5094
5095		// Clean up the event in case it is being reused
5096		event.result = undefined;
5097		if ( !event.target ) {
5098			event.target = elem;
5099		}
5100
5101		// Clone any incoming data and prepend the event, creating the handler arg list
5102		data = data == null ?
5103			[ event ] :
5104			jQuery.makeArray( data, [ event ] );
5105
5106		// Allow special events to draw outside the lines
5107		special = jQuery.event.special[ type ] || {};
5108		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
5109			return;
5110		}
5111
5112		// Determine event propagation path in advance, per W3C events spec (#9951)
5113		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
5114		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
5115
5116			bubbleType = special.delegateType || type;
5117			if ( !rfocusMorph.test( bubbleType + type ) ) {
5118				cur = cur.parentNode;
5119			}
5120			for ( ; cur; cur = cur.parentNode ) {
5121				eventPath.push( cur );
5122				tmp = cur;
5123			}
5124
5125			// Only add window if we got to document (e.g., not plain obj or detached DOM)
5126			if ( tmp === ( elem.ownerDocument || document ) ) {
5127				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
5128			}
5129		}
5130
5131		// Fire handlers on the event path
5132		i = 0;
5133		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
5134
5135			event.type = i > 1 ?
5136				bubbleType :
5137				special.bindType || type;
5138
5139			// jQuery handler
5140			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
5141				jQuery._data( cur, "handle" );
5142
5143			if ( handle ) {
5144				handle.apply( cur, data );
5145			}
5146
5147			// Native handler
5148			handle = ontype && cur[ ontype ];
5149			if ( handle && handle.apply && acceptData( cur ) ) {
5150				event.result = handle.apply( cur, data );
5151				if ( event.result === false ) {
5152					event.preventDefault();
5153				}
5154			}
5155		}
5156		event.type = type;
5157
5158		// If nobody prevented the default action, do it now
5159		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
5160
5161			if (
5162				( !special._default ||
5163				 special._default.apply( eventPath.pop(), data ) === false
5164				) && acceptData( elem )
5165			) {
5166
5167				// Call a native DOM method on the target with the same name name as the event.
5168				// Can't use an .isFunction() check here because IE6/7 fails that test.
5169				// Don't do default actions on window, that's where global variables be (#6170)
5170				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
5171
5172					// Don't re-trigger an onFOO event when we call its FOO() method
5173					tmp = elem[ ontype ];
5174
5175					if ( tmp ) {
5176						elem[ ontype ] = null;
5177					}
5178
5179					// Prevent re-triggering of the same event, since we already bubbled it above
5180					jQuery.event.triggered = type;
5181					try {
5182						elem[ type ]();
5183					} catch ( e ) {
5184
5185						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
5186						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
5187					}
5188					jQuery.event.triggered = undefined;
5189
5190					if ( tmp ) {
5191						elem[ ontype ] = tmp;
5192					}
5193				}
5194			}
5195		}
5196
5197		return event.result;
5198	},
5199
5200	dispatch: function( event ) {
5201
5202		// Make a writable jQuery.Event from the native event object
5203		event = jQuery.event.fix( event );
5204
5205		var i, j, ret, matched, handleObj,
5206			handlerQueue = [],
5207			args = slice.call( arguments ),
5208			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
5209			special = jQuery.event.special[ event.type ] || {};
5210
5211		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5212		args[ 0 ] = event;
5213		event.delegateTarget = this;
5214
5215		// Call the preDispatch hook for the mapped type, and let it bail if desired
5216		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5217			return;
5218		}
5219
5220		// Determine handlers
5221		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5222
5223		// Run delegates first; they may want to stop propagation beneath us
5224		i = 0;
5225		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5226			event.currentTarget = matched.elem;
5227
5228			j = 0;
5229			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5230				!event.isImmediatePropagationStopped() ) {
5231
5232				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
5233				// a subset or equal to those in the bound event (both can have no namespace).
5234				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5235
5236					event.handleObj = handleObj;
5237					event.data = handleObj.data;
5238
5239					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5240						handleObj.handler ).apply( matched.elem, args );
5241
5242					if ( ret !== undefined ) {
5243						if ( ( event.result = ret ) === false ) {
5244							event.preventDefault();
5245							event.stopPropagation();
5246						}
5247					}
5248				}
5249			}
5250		}
5251
5252		// Call the postDispatch hook for the mapped type
5253		if ( special.postDispatch ) {
5254			special.postDispatch.call( this, event );
5255		}
5256
5257		return event.result;
5258	},
5259
5260	handlers: function( event, handlers ) {
5261		var i, matches, sel, handleObj,
5262			handlerQueue = [],
5263			delegateCount = handlers.delegateCount,
5264			cur = event.target;
5265
5266		// Support (at least): Chrome, IE9
5267		// Find delegate handlers
5268		// Black-hole SVG <use> instance trees (#13180)
5269		//
5270		// Support: Firefox<=42+
5271		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
5272		if ( delegateCount && cur.nodeType &&
5273			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
5274
5275			/* jshint eqeqeq: false */
5276			for ( ; cur != this; cur = cur.parentNode || this ) {
5277				/* jshint eqeqeq: true */
5278
5279				// Don't check non-elements (#13208)
5280				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5281				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
5282					matches = [];
5283					for ( i = 0; i < delegateCount; i++ ) {
5284						handleObj = handlers[ i ];
5285
5286						// Don't conflict with Object.prototype properties (#13203)
5287						sel = handleObj.selector + " ";
5288
5289						if ( matches[ sel ] === undefined ) {
5290							matches[ sel ] = handleObj.needsContext ?
5291								jQuery( sel, this ).index( cur ) > -1 :
5292								jQuery.find( sel, this, null, [ cur ] ).length;
5293						}
5294						if ( matches[ sel ] ) {
5295							matches.push( handleObj );
5296						}
5297					}
5298					if ( matches.length ) {
5299						handlerQueue.push( { elem: cur, handlers: matches } );
5300					}
5301				}
5302			}
5303		}
5304
5305		// Add the remaining (directly-bound) handlers
5306		if ( delegateCount < handlers.length ) {
5307			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
5308		}
5309
5310		return handlerQueue;
5311	},
5312
5313	fix: function( event ) {
5314		if ( event[ jQuery.expando ] ) {
5315			return event;
5316		}
5317
5318		// Create a writable copy of the event object and normalize some properties
5319		var i, prop, copy,
5320			type = event.type,
5321			originalEvent = event,
5322			fixHook = this.fixHooks[ type ];
5323
5324		if ( !fixHook ) {
5325			this.fixHooks[ type ] = fixHook =
5326				rmouseEvent.test( type ) ? this.mouseHooks :
5327				rkeyEvent.test( type ) ? this.keyHooks :
5328				{};
5329		}
5330		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
5331
5332		event = new jQuery.Event( originalEvent );
5333
5334		i = copy.length;
5335		while ( i-- ) {
5336			prop = copy[ i ];
5337			event[ prop ] = originalEvent[ prop ];
5338		}
5339
5340		// Support: IE<9
5341		// Fix target property (#1925)
5342		if ( !event.target ) {
5343			event.target = originalEvent.srcElement || document;
5344		}
5345
5346		// Support: Safari 6-8+
5347		// Target should not be a text node (#504, #13143)
5348		if ( event.target.nodeType === 3 ) {
5349			event.target = event.target.parentNode;
5350		}
5351
5352		// Support: IE<9
5353		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
5354		event.metaKey = !!event.metaKey;
5355
5356		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
5357	},
5358
5359	// Includes some event props shared by KeyEvent and MouseEvent
5360	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
5361		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
5362
5363	fixHooks: {},
5364
5365	keyHooks: {
5366		props: "char charCode key keyCode".split( " " ),
5367		filter: function( event, original ) {
5368
5369			// Add which for key events
5370			if ( event.which == null ) {
5371				event.which = original.charCode != null ? original.charCode : original.keyCode;
5372			}
5373
5374			return event;
5375		}
5376	},
5377
5378	mouseHooks: {
5379		props: ( "button buttons clientX clientY fromElement offsetX offsetY " +
5380			"pageX pageY screenX screenY toElement" ).split( " " ),
5381		filter: function( event, original ) {
5382			var body, eventDoc, doc,
5383				button = original.button,
5384				fromElement = original.fromElement;
5385
5386			// Calculate pageX/Y if missing and clientX/Y available
5387			if ( event.pageX == null && original.clientX != null ) {
5388				eventDoc = event.target.ownerDocument || document;
5389				doc = eventDoc.documentElement;
5390				body = eventDoc.body;
5391
5392				event.pageX = original.clientX +
5393					( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
5394					( doc && doc.clientLeft || body && body.clientLeft || 0 );
5395				event.pageY = original.clientY +
5396					( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
5397					( doc && doc.clientTop  || body && body.clientTop  || 0 );
5398			}
5399
5400			// Add relatedTarget, if necessary
5401			if ( !event.relatedTarget && fromElement ) {
5402				event.relatedTarget = fromElement === event.target ?
5403					original.toElement :
5404					fromElement;
5405			}
5406
5407			// Add which for click: 1 === left; 2 === middle; 3 === right
5408			// Note: button is not normalized, so don't use it
5409			if ( !event.which && button !== undefined ) {
5410				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
5411			}
5412
5413			return event;
5414		}
5415	},
5416
5417	special: {
5418		load: {
5419
5420			// Prevent triggered image.load events from bubbling to window.load
5421			noBubble: true
5422		},
5423		focus: {
5424
5425			// Fire native event if possible so blur/focus sequence is correct
5426			trigger: function() {
5427				if ( this !== safeActiveElement() && this.focus ) {
5428					try {
5429						this.focus();
5430						return false;
5431					} catch ( e ) {
5432
5433						// Support: IE<9
5434						// If we error on focus to hidden element (#1486, #12518),
5435						// let .trigger() run the handlers
5436					}
5437				}
5438			},
5439			delegateType: "focusin"
5440		},
5441		blur: {
5442			trigger: function() {
5443				if ( this === safeActiveElement() && this.blur ) {
5444					this.blur();
5445					return false;
5446				}
5447			},
5448			delegateType: "focusout"
5449		},
5450		click: {
5451
5452			// For checkbox, fire native event so checked state will be right
5453			trigger: function() {
5454				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
5455					this.click();
5456					return false;
5457				}
5458			},
5459
5460			// For cross-browser consistency, don't fire native .click() on links
5461			_default: function( event ) {
5462				return jQuery.nodeName( event.target, "a" );
5463			}
5464		},
5465
5466		beforeunload: {
5467			postDispatch: function( event ) {
5468
5469				// Support: Firefox 20+
5470				// Firefox doesn't alert if the returnValue field is not set.
5471				if ( event.result !== undefined && event.originalEvent ) {
5472					event.originalEvent.returnValue = event.result;
5473				}
5474			}
5475		}
5476	},
5477
5478	// Piggyback on a donor event to simulate a different one
5479	simulate: function( type, elem, event ) {
5480		var e = jQuery.extend(
5481			new jQuery.Event(),
5482			event,
5483			{
5484				type: type,
5485				isSimulated: true
5486
5487				// Previously, `originalEvent: {}` was set here, so stopPropagation call
5488				// would not be triggered on donor event, since in our own
5489				// jQuery.event.stopPropagation function we had a check for existence of
5490				// originalEvent.stopPropagation method, so, consequently it would be a noop.
5491				//
5492				// Guard for simulated events was moved to jQuery.event.stopPropagation function
5493				// since `originalEvent` should point to the original event for the
5494				// constancy with other events and for more focused logic
5495			}
5496		);
5497
5498		jQuery.event.trigger( e, null, elem );
5499
5500		if ( e.isDefaultPrevented() ) {
5501			event.preventDefault();
5502		}
5503	}
5504};
5505
5506jQuery.removeEvent = document.removeEventListener ?
5507	function( elem, type, handle ) {
5508
5509		// This "if" is needed for plain objects
5510		if ( elem.removeEventListener ) {
5511			elem.removeEventListener( type, handle );
5512		}
5513	} :
5514	function( elem, type, handle ) {
5515		var name = "on" + type;
5516
5517		if ( elem.detachEvent ) {
5518
5519			// #8545, #7054, preventing memory leaks for custom events in IE6-8
5520			// detachEvent needed property on element, by name of that event,
5521			// to properly expose it to GC
5522			if ( typeof elem[ name ] === "undefined" ) {
5523				elem[ name ] = null;
5524			}
5525
5526			elem.detachEvent( name, handle );
5527		}
5528	};
5529
5530jQuery.Event = function( src, props ) {
5531
5532	// Allow instantiation without the 'new' keyword
5533	if ( !( this instanceof jQuery.Event ) ) {
5534		return new jQuery.Event( src, props );
5535	}
5536
5537	// Event object
5538	if ( src && src.type ) {
5539		this.originalEvent = src;
5540		this.type = src.type;
5541
5542		// Events bubbling up the document may have been marked as prevented
5543		// by a handler lower down the tree; reflect the correct value.
5544		this.isDefaultPrevented = src.defaultPrevented ||
5545				src.defaultPrevented === undefined &&
5546
5547				// Support: IE < 9, Android < 4.0
5548				src.returnValue === false ?
5549			returnTrue :
5550			returnFalse;
5551
5552	// Event type
5553	} else {
5554		this.type = src;
5555	}
5556
5557	// Put explicitly provided properties onto the event object
5558	if ( props ) {
5559		jQuery.extend( this, props );
5560	}
5561
5562	// Create a timestamp if incoming event doesn't have one
5563	this.timeStamp = src && src.timeStamp || jQuery.now();
5564
5565	// Mark it as fixed
5566	this[ jQuery.expando ] = true;
5567};
5568
5569// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5570// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5571jQuery.Event.prototype = {
5572	constructor: jQuery.Event,
5573	isDefaultPrevented: returnFalse,
5574	isPropagationStopped: returnFalse,
5575	isImmediatePropagationStopped: returnFalse,
5576
5577	preventDefault: function() {
5578		var e = this.originalEvent;
5579
5580		this.isDefaultPrevented = returnTrue;
5581		if ( !e ) {
5582			return;
5583		}
5584
5585		// If preventDefault exists, run it on the original event
5586		if ( e.preventDefault ) {
5587			e.preventDefault();
5588
5589		// Support: IE
5590		// Otherwise set the returnValue property of the original event to false
5591		} else {
5592			e.returnValue = false;
5593		}
5594	},
5595	stopPropagation: function() {
5596		var e = this.originalEvent;
5597
5598		this.isPropagationStopped = returnTrue;
5599
5600		if ( !e || this.isSimulated ) {
5601			return;
5602		}
5603
5604		// If stopPropagation exists, run it on the original event
5605		if ( e.stopPropagation ) {
5606			e.stopPropagation();
5607		}
5608
5609		// Support: IE
5610		// Set the cancelBubble property of the original event to true
5611		e.cancelBubble = true;
5612	},
5613	stopImmediatePropagation: function() {
5614		var e = this.originalEvent;
5615
5616		this.isImmediatePropagationStopped = returnTrue;
5617
5618		if ( e && e.stopImmediatePropagation ) {
5619			e.stopImmediatePropagation();
5620		}
5621
5622		this.stopPropagation();
5623	}
5624};
5625
5626// Create mouseenter/leave events using mouseover/out and event-time checks
5627// so that event delegation works in jQuery.
5628// Do the same for pointerenter/pointerleave and pointerover/pointerout
5629//
5630// Support: Safari 7 only
5631// Safari sends mouseenter too often; see:
5632// https://code.google.com/p/chromium/issues/detail?id=470258
5633// for the description of the bug (it existed in older Chrome versions as well).
5634jQuery.each( {
5635	mouseenter: "mouseover",
5636	mouseleave: "mouseout",
5637	pointerenter: "pointerover",
5638	pointerleave: "pointerout"
5639}, function( orig, fix ) {
5640	jQuery.event.special[ orig ] = {
5641		delegateType: fix,
5642		bindType: fix,
5643
5644		handle: function( event ) {
5645			var ret,
5646				target = this,
5647				related = event.relatedTarget,
5648				handleObj = event.handleObj;
5649
5650			// For mouseenter/leave call the handler if related is outside the target.
5651			// NB: No relatedTarget if the mouse left/entered the browser window
5652			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5653				event.type = handleObj.origType;
5654				ret = handleObj.handler.apply( this, arguments );
5655				event.type = fix;
5656			}
5657			return ret;
5658		}
5659	};
5660} );
5661
5662// IE submit delegation
5663if ( !support.submit ) {
5664
5665	jQuery.event.special.submit = {
5666		setup: function() {
5667
5668			// Only need this for delegated form submit events
5669			if ( jQuery.nodeName( this, "form" ) ) {
5670				return false;
5671			}
5672
5673			// Lazy-add a submit handler when a descendant form may potentially be submitted
5674			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
5675
5676				// Node name check avoids a VML-related crash in IE (#9807)
5677				var elem = e.target,
5678					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ?
5679
5680						// Support: IE <=8
5681						// We use jQuery.prop instead of elem.form
5682						// to allow fixing the IE8 delegated submit issue (gh-2332)
5683						// by 3rd party polyfills/workarounds.
5684						jQuery.prop( elem, "form" ) :
5685						undefined;
5686
5687				if ( form && !jQuery._data( form, "submit" ) ) {
5688					jQuery.event.add( form, "submit._submit", function( event ) {
5689						event._submitBubble = true;
5690					} );
5691					jQuery._data( form, "submit", true );
5692				}
5693			} );
5694
5695			// return undefined since we don't need an event listener
5696		},
5697
5698		postDispatch: function( event ) {
5699
5700			// If form was submitted by the user, bubble the event up the tree
5701			if ( event._submitBubble ) {
5702				delete event._submitBubble;
5703				if ( this.parentNode && !event.isTrigger ) {
5704					jQuery.event.simulate( "submit", this.parentNode, event );
5705				}
5706			}
5707		},
5708
5709		teardown: function() {
5710
5711			// Only need this for delegated form submit events
5712			if ( jQuery.nodeName( this, "form" ) ) {
5713				return false;
5714			}
5715
5716			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
5717			jQuery.event.remove( this, "._submit" );
5718		}
5719	};
5720}
5721
5722// IE change delegation and checkbox/radio fix
5723if ( !support.change ) {
5724
5725	jQuery.event.special.change = {
5726
5727		setup: function() {
5728
5729			if ( rformElems.test( this.nodeName ) ) {
5730
5731				// IE doesn't fire change on a check/radio until blur; trigger it on click
5732				// after a propertychange. Eat the blur-change in special.change.handle.
5733				// This still fires onchange a second time for check/radio after blur.
5734				if ( this.type === "checkbox" || this.type === "radio" ) {
5735					jQuery.event.add( this, "propertychange._change", function( event ) {
5736						if ( event.originalEvent.propertyName === "checked" ) {
5737							this._justChanged = true;
5738						}
5739					} );
5740					jQuery.event.add( this, "click._change", function( event ) {
5741						if ( this._justChanged && !event.isTrigger ) {
5742							this._justChanged = false;
5743						}
5744
5745						// Allow triggered, simulated change events (#11500)
5746						jQuery.event.simulate( "change", this, event );
5747					} );
5748				}
5749				return false;
5750			}
5751
5752			// Delegated event; lazy-add a change handler on descendant inputs
5753			jQuery.event.add( this, "beforeactivate._change", function( e ) {
5754				var elem = e.target;
5755
5756				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) {
5757					jQuery.event.add( elem, "change._change", function( event ) {
5758						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
5759							jQuery.event.simulate( "change", this.parentNode, event );
5760						}
5761					} );
5762					jQuery._data( elem, "change", true );
5763				}
5764			} );
5765		},
5766
5767		handle: function( event ) {
5768			var elem = event.target;
5769
5770			// Swallow native change events from checkbox/radio, we already triggered them above
5771			if ( this !== elem || event.isSimulated || event.isTrigger ||
5772				( elem.type !== "radio" && elem.type !== "checkbox" ) ) {
5773
5774				return event.handleObj.handler.apply( this, arguments );
5775			}
5776		},
5777
5778		teardown: function() {
5779			jQuery.event.remove( this, "._change" );
5780
5781			return !rformElems.test( this.nodeName );
5782		}
5783	};
5784}
5785
5786// Support: Firefox
5787// Firefox doesn't have focus(in | out) events
5788// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5789//
5790// Support: Chrome, Safari
5791// focus(in | out) events fire after focus & blur events,
5792// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5793// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
5794if ( !support.focusin ) {
5795	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
5796
5797		// Attach a single capturing handler on the document while someone wants focusin/focusout
5798		var handler = function( event ) {
5799			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
5800		};
5801
5802		jQuery.event.special[ fix ] = {
5803			setup: function() {
5804				var doc = this.ownerDocument || this,
5805					attaches = jQuery._data( doc, fix );
5806
5807				if ( !attaches ) {
5808					doc.addEventListener( orig, handler, true );
5809				}
5810				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
5811			},
5812			teardown: function() {
5813				var doc = this.ownerDocument || this,
5814					attaches = jQuery._data( doc, fix ) - 1;
5815
5816				if ( !attaches ) {
5817					doc.removeEventListener( orig, handler, true );
5818					jQuery._removeData( doc, fix );
5819				} else {
5820					jQuery._data( doc, fix, attaches );
5821				}
5822			}
5823		};
5824	} );
5825}
5826
5827jQuery.fn.extend( {
5828
5829	on: function( types, selector, data, fn ) {
5830		return on( this, types, selector, data, fn );
5831	},
5832	one: function( types, selector, data, fn ) {
5833		return on( this, types, selector, data, fn, 1 );
5834	},
5835	off: function( types, selector, fn ) {
5836		var handleObj, type;
5837		if ( types && types.preventDefault && types.handleObj ) {
5838
5839			// ( event )  dispatched jQuery.Event
5840			handleObj = types.handleObj;
5841			jQuery( types.delegateTarget ).off(
5842				handleObj.namespace ?
5843					handleObj.origType + "." + handleObj.namespace :
5844					handleObj.origType,
5845				handleObj.selector,
5846				handleObj.handler
5847			);
5848			return this;
5849		}
5850		if ( typeof types === "object" ) {
5851
5852			// ( types-object [, selector] )
5853			for ( type in types ) {
5854				this.off( type, selector, types[ type ] );
5855			}
5856			return this;
5857		}
5858		if ( selector === false || typeof selector === "function" ) {
5859
5860			// ( types [, fn] )
5861			fn = selector;
5862			selector = undefined;
5863		}
5864		if ( fn === false ) {
5865			fn = returnFalse;
5866		}
5867		return this.each( function() {
5868			jQuery.event.remove( this, types, fn, selector );
5869		} );
5870	},
5871
5872	trigger: function( type, data ) {
5873		return this.each( function() {
5874			jQuery.event.trigger( type, data, this );
5875		} );
5876	},
5877	triggerHandler: function( type, data ) {
5878		var elem = this[ 0 ];
5879		if ( elem ) {
5880			return jQuery.event.trigger( type, data, elem, true );
5881		}
5882	}
5883} );
5884
5885
5886var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5887	rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
5888
5889	// Support: IE 10-11, Edge 10240+
5890	// In IE/Edge using regex groups here causes severe slowdowns.
5891	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5892	rnoInnerhtml = /<script|<style|<link/i,
5893
5894	// checked="checked" or checked
5895	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5896	rscriptTypeMasked = /^true\/(.*)/,
5897	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5898	safeFragment = createSafeFragment( document ),
5899	fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );
5900
5901// Support: IE<8
5902// Manipulating tables requires a tbody
5903function manipulationTarget( elem, content ) {
5904	return jQuery.nodeName( elem, "table" ) &&
5905		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
5906
5907		elem.getElementsByTagName( "tbody" )[ 0 ] ||
5908			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
5909		elem;
5910}
5911
5912// Replace/restore the type attribute of script elements for safe DOM manipulation
5913function disableScript( elem ) {
5914	elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
5915	return elem;
5916}
5917function restoreScript( elem ) {
5918	var match = rscriptTypeMasked.exec( elem.type );
5919	if ( match ) {
5920		elem.type = match[ 1 ];
5921	} else {
5922		elem.removeAttribute( "type" );
5923	}
5924	return elem;
5925}
5926
5927function cloneCopyEvent( src, dest ) {
5928	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5929		return;
5930	}
5931
5932	var type, i, l,
5933		oldData = jQuery._data( src ),
5934		curData = jQuery._data( dest, oldData ),
5935		events = oldData.events;
5936
5937	if ( events ) {
5938		delete curData.handle;
5939		curData.events = {};
5940
5941		for ( type in events ) {
5942			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5943				jQuery.event.add( dest, type, events[ type ][ i ] );
5944			}
5945		}
5946	}
5947
5948	// make the cloned public data object a copy from the original
5949	if ( curData.data ) {
5950		curData.data = jQuery.extend( {}, curData.data );
5951	}
5952}
5953
5954function fixCloneNodeIssues( src, dest ) {
5955	var nodeName, e, data;
5956
5957	// We do not need to do anything for non-Elements
5958	if ( dest.nodeType !== 1 ) {
5959		return;
5960	}
5961
5962	nodeName = dest.nodeName.toLowerCase();
5963
5964	// IE6-8 copies events bound via attachEvent when using cloneNode.
5965	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
5966		data = jQuery._data( dest );
5967
5968		for ( e in data.events ) {
5969			jQuery.removeEvent( dest, e, data.handle );
5970		}
5971
5972		// Event data gets referenced instead of copied if the expando gets copied too
5973		dest.removeAttribute( jQuery.expando );
5974	}
5975
5976	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
5977	if ( nodeName === "script" && dest.text !== src.text ) {
5978		disableScript( dest ).text = src.text;
5979		restoreScript( dest );
5980
5981	// IE6-10 improperly clones children of object elements using classid.
5982	// IE10 throws NoModificationAllowedError if parent is null, #12132.
5983	} else if ( nodeName === "object" ) {
5984		if ( dest.parentNode ) {
5985			dest.outerHTML = src.outerHTML;
5986		}
5987
5988		// This path appears unavoidable for IE9. When cloning an object
5989		// element in IE9, the outerHTML strategy above is not sufficient.
5990		// If the src has innerHTML and the destination does not,
5991		// copy the src.innerHTML into the dest.innerHTML. #10324
5992		if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {
5993			dest.innerHTML = src.innerHTML;
5994		}
5995
5996	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5997
5998		// IE6-8 fails to persist the checked state of a cloned checkbox
5999		// or radio button. Worse, IE6-7 fail to give the cloned element
6000		// a checked appearance if the defaultChecked value isn't also set
6001
6002		dest.defaultChecked = dest.checked = src.checked;
6003
6004		// IE6-7 get confused and end up setting the value of a cloned
6005		// checkbox/radio button to an empty string instead of "on"
6006		if ( dest.value !== src.value ) {
6007			dest.value = src.value;
6008		}
6009
6010	// IE6-8 fails to return the selected option to the default selected
6011	// state when cloning options
6012	} else if ( nodeName === "option" ) {
6013		dest.defaultSelected = dest.selected = src.defaultSelected;
6014
6015	// IE6-8 fails to set the defaultValue to the correct value when
6016	// cloning other types of input fields
6017	} else if ( nodeName === "input" || nodeName === "textarea" ) {
6018		dest.defaultValue = src.defaultValue;
6019	}
6020}
6021
6022function domManip( collection, args, callback, ignored ) {
6023
6024	// Flatten any nested arrays
6025	args = concat.apply( [], args );
6026
6027	var first, node, hasScripts,
6028		scripts, doc, fragment,
6029		i = 0,
6030		l = collection.length,
6031		iNoClone = l - 1,
6032		value = args[ 0 ],
6033		isFunction = jQuery.isFunction( value );
6034
6035	// We can't cloneNode fragments that contain checked, in WebKit
6036	if ( isFunction ||
6037			( l > 1 && typeof value === "string" &&
6038				!support.checkClone && rchecked.test( value ) ) ) {
6039		return collection.each( function( index ) {
6040			var self = collection.eq( index );
6041			if ( isFunction ) {
6042				args[ 0 ] = value.call( this, index, self.html() );
6043			}
6044			domManip( self, args, callback, ignored );
6045		} );
6046	}
6047
6048	if ( l ) {
6049		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
6050		first = fragment.firstChild;
6051
6052		if ( fragment.childNodes.length === 1 ) {
6053			fragment = first;
6054		}
6055
6056		// Require either new content or an interest in ignored elements to invoke the callback
6057		if ( first || ignored ) {
6058			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6059			hasScripts = scripts.length;
6060
6061			// Use the original fragment for the last item
6062			// instead of the first because it can end up
6063			// being emptied incorrectly in certain situations (#8070).
6064			for ( ; i < l; i++ ) {
6065				node = fragment;
6066
6067				if ( i !== iNoClone ) {
6068					node = jQuery.clone( node, true, true );
6069
6070					// Keep references to cloned scripts for later restoration
6071					if ( hasScripts ) {
6072
6073						// Support: Android<4.1, PhantomJS<2
6074						// push.apply(_, arraylike) throws on ancient WebKit
6075						jQuery.merge( scripts, getAll( node, "script" ) );
6076					}
6077				}
6078
6079				callback.call( collection[ i ], node, i );
6080			}
6081
6082			if ( hasScripts ) {
6083				doc = scripts[ scripts.length - 1 ].ownerDocument;
6084
6085				// Reenable scripts
6086				jQuery.map( scripts, restoreScript );
6087
6088				// Evaluate executable scripts on first document insertion
6089				for ( i = 0; i < hasScripts; i++ ) {
6090					node = scripts[ i ];
6091					if ( rscriptType.test( node.type || "" ) &&
6092						!jQuery._data( node, "globalEval" ) &&
6093						jQuery.contains( doc, node ) ) {
6094
6095						if ( node.src ) {
6096
6097							// Optional AJAX dependency, but won't run scripts if not present
6098							if ( jQuery._evalUrl ) {
6099								jQuery._evalUrl( node.src );
6100							}
6101						} else {
6102							jQuery.globalEval(
6103								( node.text || node.textContent || node.innerHTML || "" )
6104									.replace( rcleanScript, "" )
6105							);
6106						}
6107					}
6108				}
6109			}
6110
6111			// Fix #11809: Avoid leaking memory
6112			fragment = first = null;
6113		}
6114	}
6115
6116	return collection;
6117}
6118
6119function remove( elem, selector, keepData ) {
6120	var node,
6121		elems = selector ? jQuery.filter( selector, elem ) : elem,
6122		i = 0;
6123
6124	for ( ; ( node = elems[ i ] ) != null; i++ ) {
6125
6126		if ( !keepData && node.nodeType === 1 ) {
6127			jQuery.cleanData( getAll( node ) );
6128		}
6129
6130		if ( node.parentNode ) {
6131			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
6132				setGlobalEval( getAll( node, "script" ) );
6133			}
6134			node.parentNode.removeChild( node );
6135		}
6136	}
6137
6138	return elem;
6139}
6140
6141jQuery.extend( {
6142	htmlPrefilter: function( html ) {
6143		return html;
6144	},
6145
6146	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6147		var destElements, node, clone, i, srcElements,
6148			inPage = jQuery.contains( elem.ownerDocument, elem );
6149
6150		if ( support.html5Clone || jQuery.isXMLDoc( elem ) ||
6151			!rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
6152
6153			clone = elem.cloneNode( true );
6154
6155		// IE<=8 does not properly clone detached, unknown element nodes
6156		} else {
6157			fragmentDiv.innerHTML = elem.outerHTML;
6158			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
6159		}
6160
6161		if ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
6162				( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
6163
6164			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
6165			destElements = getAll( clone );
6166			srcElements = getAll( elem );
6167
6168			// Fix all IE cloning issues
6169			for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {
6170
6171				// Ensure that the destination node is not null; Fixes #9587
6172				if ( destElements[ i ] ) {
6173					fixCloneNodeIssues( node, destElements[ i ] );
6174				}
6175			}
6176		}
6177
6178		// Copy the events from the original to the clone
6179		if ( dataAndEvents ) {
6180			if ( deepDataAndEvents ) {
6181				srcElements = srcElements || getAll( elem );
6182				destElements = destElements || getAll( clone );
6183
6184				for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
6185					cloneCopyEvent( node, destElements[ i ] );
6186				}
6187			} else {
6188				cloneCopyEvent( elem, clone );
6189			}
6190		}
6191
6192		// Preserve script evaluation history
6193		destElements = getAll( clone, "script" );
6194		if ( destElements.length > 0 ) {
6195			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6196		}
6197
6198		destElements = srcElements = node = null;
6199
6200		// Return the cloned set
6201		return clone;
6202	},
6203
6204	cleanData: function( elems, /* internal */ forceAcceptData ) {
6205		var elem, type, id, data,
6206			i = 0,
6207			internalKey = jQuery.expando,
6208			cache = jQuery.cache,
6209			attributes = support.attributes,
6210			special = jQuery.event.special;
6211
6212		for ( ; ( elem = elems[ i ] ) != null; i++ ) {
6213			if ( forceAcceptData || acceptData( elem ) ) {
6214
6215				id = elem[ internalKey ];
6216				data = id && cache[ id ];
6217
6218				if ( data ) {
6219					if ( data.events ) {
6220						for ( type in data.events ) {
6221							if ( special[ type ] ) {
6222								jQuery.event.remove( elem, type );
6223
6224							// This is a shortcut to avoid jQuery.event.remove's overhead
6225							} else {
6226								jQuery.removeEvent( elem, type, data.handle );
6227							}
6228						}
6229					}
6230
6231					// Remove cache only if it was not already removed by jQuery.event.remove
6232					if ( cache[ id ] ) {
6233
6234						delete cache[ id ];
6235
6236						// Support: IE<9
6237						// IE does not allow us to delete expando properties from nodes
6238						// IE creates expando attributes along with the property
6239						// IE does not have a removeAttribute function on Document nodes
6240						if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
6241							elem.removeAttribute( internalKey );
6242
6243						// Webkit & Blink performance suffers when deleting properties
6244						// from DOM nodes, so set to undefined instead
6245						// https://code.google.com/p/chromium/issues/detail?id=378607
6246						} else {
6247							elem[ internalKey ] = undefined;
6248						}
6249
6250						deletedIds.push( id );
6251					}
6252				}
6253			}
6254		}
6255	}
6256} );
6257
6258jQuery.fn.extend( {
6259
6260	// Keep domManip exposed until 3.0 (gh-2225)
6261	domManip: domManip,
6262
6263	detach: function( selector ) {
6264		return remove( this, selector, true );
6265	},
6266
6267	remove: function( selector ) {
6268		return remove( this, selector );
6269	},
6270
6271	text: function( value ) {
6272		return access( this, function( value ) {
6273			return value === undefined ?
6274				jQuery.text( this ) :
6275				this.empty().append(
6276					( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )
6277				);
6278		}, null, value, arguments.length );
6279	},
6280
6281	append: function() {
6282		return domManip( this, arguments, function( elem ) {
6283			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6284				var target = manipulationTarget( this, elem );
6285				target.appendChild( elem );
6286			}
6287		} );
6288	},
6289
vendor: 4,288 bytes, lines 6290-6463
6290	prepend: function() {
6291		return domManip( this, arguments, function( elem ) {
6292			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6293				var target = manipulationTarget( this, elem );
6294				target.insertBefore( elem, target.firstChild );
6295			}
6296		} );
6297	},
6298
6299	before: function() {
6300		return domManip( this, arguments, function( elem ) {
6301			if ( this.parentNode ) {
6302				this.parentNode.insertBefore( elem, this );
6303			}
6304		} );
6305	},
6306
6307	after: function() {
6308		return domManip( this, arguments, function( elem ) {
6309			if ( this.parentNode ) {
6310				this.parentNode.insertBefore( elem, this.nextSibling );
6311			}
6312		} );
6313	},
6314
6315	empty: function() {
6316		var elem,
6317			i = 0;
6318
6319		for ( ; ( elem = this[ i ] ) != null; i++ ) {
6320
6321			// Remove element nodes and prevent memory leaks
6322			if ( elem.nodeType === 1 ) {
6323				jQuery.cleanData( getAll( elem, false ) );
6324			}
6325
6326			// Remove any remaining nodes
6327			while ( elem.firstChild ) {
6328				elem.removeChild( elem.firstChild );
6329			}
6330
6331			// If this is a select, ensure that it displays empty (#12336)
6332			// Support: IE<9
6333			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
6334				elem.options.length = 0;
6335			}
6336		}
6337
6338		return this;
6339	},
6340
6341	clone: function( dataAndEvents, deepDataAndEvents ) {
6342		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6343		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6344
6345		return this.map( function() {
6346			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6347		} );
6348	},
6349
6350	html: function( value ) {
6351		return access( this, function( value ) {
6352			var elem = this[ 0 ] || {},
6353				i = 0,
6354				l = this.length;
6355
6356			if ( value === undefined ) {
6357				return elem.nodeType === 1 ?
6358					elem.innerHTML.replace( rinlinejQuery, "" ) :
6359					undefined;
6360			}
6361
6362			// See if we can take a shortcut and just use innerHTML
6363			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6364				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
6365				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
6366				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6367
6368				value = jQuery.htmlPrefilter( value );
6369
6370				try {
6371					for ( ; i < l; i++ ) {
6372
6373						// Remove element nodes and prevent memory leaks
6374						elem = this[ i ] || {};
6375						if ( elem.nodeType === 1 ) {
6376							jQuery.cleanData( getAll( elem, false ) );
6377							elem.innerHTML = value;
6378						}
6379					}
6380
6381					elem = 0;
6382
6383				// If using innerHTML throws an exception, use the fallback method
6384				} catch ( e ) {}
6385			}
6386
6387			if ( elem ) {
6388				this.empty().append( value );
6389			}
6390		}, null, value, arguments.length );
6391	},
6392
6393	replaceWith: function() {
6394		var ignored = [];
6395
6396		// Make the changes, replacing each non-ignored context element with the new content
6397		return domManip( this, arguments, function( elem ) {
6398			var parent = this.parentNode;
6399
6400			if ( jQuery.inArray( this, ignored ) < 0 ) {
6401				jQuery.cleanData( getAll( this ) );
6402				if ( parent ) {
6403					parent.replaceChild( elem, this );
6404				}
6405			}
6406
6407		// Force callback invocation
6408		}, ignored );
6409	}
6410} );
6411
6412jQuery.each( {
6413	appendTo: "append",
6414	prependTo: "prepend",
6415	insertBefore: "before",
6416	insertAfter: "after",
6417	replaceAll: "replaceWith"
6418}, function( name, original ) {
6419	jQuery.fn[ name ] = function( selector ) {
6420		var elems,
6421			i = 0,
6422			ret = [],
6423			insert = jQuery( selector ),
6424			last = insert.length - 1;
6425
6426		for ( ; i <= last; i++ ) {
6427			elems = i === last ? this : this.clone( true );
6428			jQuery( insert[ i ] )[ original ]( elems );
6429
6430			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6431			push.apply( ret, elems.get() );
6432		}
6433
6434		return this.pushStack( ret );
6435	};
6436} );
6437
6438
6439var iframe,
6440	elemdisplay = {
6441
6442		// Support: Firefox
6443		// We have to pre-define these values for FF (#10227)
6444		HTML: "block",
6445		BODY: "block"
6446	};
6447
6448/**
6449 * Retrieve the actual display of a element
6450 * @param {String} name nodeName of the element
6451 * @param {Object} doc Document object
6452 */
6453
6454// Called only from within defaultDisplay
6455function actualDisplay( name, doc ) {
6456	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
6457
6458		display = jQuery.css( elem[ 0 ], "display" );
6459
6460	// We don't have any data stored on the element,
6461	// so use "detach" method as fast way to get rid of the element
6462	elem.detach();
6463
6464	return display;
6465}
6466
6467/**
6468 * Try to determine the default display value of an element
6469 * @param {String} nodeName
6470 */
6471function defaultDisplay( nodeName ) {
6472	var doc = document,
6473		display = elemdisplay[ nodeName ];
6474
6475	if ( !display ) {
6476		display = actualDisplay( nodeName, doc );
6477
6478		// If the simple way fails, read from inside an iframe
6479		if ( display === "none" || !display ) {
6480
6481			// Use the already-created iframe if possible
6482			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
6483				.appendTo( doc.documentElement );
6484
6485			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
6486			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
6487
6488			// Support: IE
6489			doc.write();
6490			doc.close();
6491
6492			display = actualDisplay( nodeName, doc );
6493			iframe.detach();
6494		}
6495
6496		// Store the correct default display
6497		elemdisplay[ nodeName ] = display;
6498	}
6499
6500	return display;
6501}
6502var rmargin = ( /^margin/ );
6503
6504var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6505
6506var swap = function( elem, options, callback, args ) {
6507	var ret, name,
6508		old = {};
6509
6510	// Remember the old values, and insert the new ones
6511	for ( name in options ) {
6512		old[ name ] = elem.style[ name ];
6513		elem.style[ name ] = options[ name ];
6514	}
6515
6516	ret = callback.apply( elem, args || [] );
6517
6518	// Revert the old values
6519	for ( name in options ) {
6520		elem.style[ name ] = old[ name ];
6521	}
6522
6523	return ret;
6524};
6525
6526
6527var documentElement = document.documentElement;
6528
6529
6530
6531( function() {
6532	var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
6533		reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
6534		container = document.createElement( "div" ),
6535		div = document.createElement( "div" );
6536
6537	// Finish early in limited (non-browser) environments
6538	if ( !div.style ) {
6539		return;
6540	}
6541
6542	div.style.cssText = "float:left;opacity:.5";
6543
6544	// Support: IE<9
6545	// Make sure that element opacity exists (as opposed to filter)
6546	support.opacity = div.style.opacity === "0.5";
6547
6548	// Verify style float existence
6549	// (IE uses styleFloat instead of cssFloat)
6550	support.cssFloat = !!div.style.cssFloat;
6551
6552	div.style.backgroundClip = "content-box";
6553	div.cloneNode( true ).style.backgroundClip = "";
6554	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6555
6556	container = document.createElement( "div" );
6557	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
6558		"padding:0;margin-top:1px;position:absolute";
6559	div.innerHTML = "";
6560	container.appendChild( div );
6561
6562	// Support: Firefox<29, Android 2.3
6563	// Vendor-prefix box-sizing
6564	support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
6565		div.style.WebkitBoxSizing === "";
6566
6567	jQuery.extend( support, {
6568		reliableHiddenOffsets: function() {
6569			if ( pixelPositionVal == null ) {
6570				computeStyleTests();
6571			}
6572			return reliableHiddenOffsetsVal;
6573		},
6574
6575		boxSizingReliable: function() {
6576
6577			// We're checking for pixelPositionVal here instead of boxSizingReliableVal
6578			// since that compresses better and they're computed together anyway.
6579			if ( pixelPositionVal == null ) {
6580				computeStyleTests();
6581			}
6582			return boxSizingReliableVal;
6583		},
6584
6585		pixelMarginRight: function() {
6586
6587			// Support: Android 4.0-4.3
6588			if ( pixelPositionVal == null ) {
6589				computeStyleTests();
6590			}
6591			return pixelMarginRightVal;
6592		},
6593
6594		pixelPosition: function() {
6595			if ( pixelPositionVal == null ) {
6596				computeStyleTests();
6597			}
6598			return pixelPositionVal;
6599		},
6600
6601		reliableMarginRight: function() {
6602
6603			// Support: Android 2.3
6604			if ( pixelPositionVal == null ) {
6605				computeStyleTests();
6606			}
6607			return reliableMarginRightVal;
6608		},
6609
6610		reliableMarginLeft: function() {
6611
6612			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
6613			if ( pixelPositionVal == null ) {
6614				computeStyleTests();
6615			}
6616			return reliableMarginLeftVal;
6617		}
6618	} );
6619
6620	function computeStyleTests() {
6621		var contents, divStyle,
6622			documentElement = document.documentElement;
6623
6624		// Setup
6625		documentElement.appendChild( container );
6626
6627		div.style.cssText =
6628
6629			// Support: Android 2.3
6630			// Vendor-prefix box-sizing
6631			"-webkit-box-sizing:border-box;box-sizing:border-box;" +
6632			"position:relative;display:block;" +
6633			"margin:auto;border:1px;padding:1px;" +
6634			"top:1%;width:50%";
6635
6636		// Support: IE<9
6637		// Assume reasonable values in the absence of getComputedStyle
6638		pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
6639		pixelMarginRightVal = reliableMarginRightVal = true;
6640
6641		// Check for getComputedStyle so that this code is not run in IE<9.
6642		if ( window.getComputedStyle ) {
6643			divStyle = window.getComputedStyle( div );
6644			pixelPositionVal = ( divStyle || {} ).top !== "1%";
6645			reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
6646			boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";
6647
6648			// Support: Android 4.0 - 4.3 only
6649			// Some styles come back with percentage values, even though they shouldn't
6650			div.style.marginRight = "50%";
6651			pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";
6652
6653			// Support: Android 2.3 only
6654			// Div with explicit width and no margin-right incorrectly
6655			// gets computed margin-right based on width of container (#3333)
6656			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6657			contents = div.appendChild( document.createElement( "div" ) );
6658
6659			// Reset CSS: box-sizing; display; margin; border; padding
6660			contents.style.cssText = div.style.cssText =
6661
6662				// Support: Android 2.3
6663				// Vendor-prefix box-sizing
6664				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
6665				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
6666			contents.style.marginRight = contents.style.width = "0";
6667			div.style.width = "1px";
6668
6669			reliableMarginRightVal =
6670				!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );
6671
6672			div.removeChild( contents );
6673		}
6674
6675		// Support: IE6-8
6676		// First check that getClientRects works as expected
6677		// Check if table cells still have offsetWidth/Height when they are set
6678		// to display:none and there are still other visible table cells in a
6679		// table row; if so, offsetWidth/Height are not reliable for use when
6680		// determining if an element has been hidden directly using
6681		// display:none (it is still safe to use offsets if a parent element is
6682		// hidden; don safety goggles and see bug #4512 for more information).
6683		div.style.display = "none";
6684		reliableHiddenOffsetsVal = div.getClientRects().length === 0;
6685		if ( reliableHiddenOffsetsVal ) {
6686			div.style.display = "";
6687			div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
6688			div.childNodes[ 0 ].style.borderCollapse = "separate";
6689			contents = div.getElementsByTagName( "td" );
6690			contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
6691			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6692			if ( reliableHiddenOffsetsVal ) {
6693				contents[ 0 ].style.display = "";
6694				contents[ 1 ].style.display = "none";
6695				reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6696			}
6697		}
6698
6699		// Teardown
6700		documentElement.removeChild( container );
6701	}
6702
6703} )();
6704
6705
6706var getStyles, curCSS,
6707	rposition = /^(top|right|bottom|left)$/;
6708
6709if ( window.getComputedStyle ) {
6710	getStyles = function( elem ) {
6711
6712		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
6713		// IE throws on elements created in popups
6714		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6715		var view = elem.ownerDocument.defaultView;
6716
6717		if ( !view || !view.opener ) {
6718			view = window;
6719		}
6720
6721		return view.getComputedStyle( elem );
6722	};
6723
6724	curCSS = function( elem, name, computed ) {
6725		var width, minWidth, maxWidth, ret,
6726			style = elem.style;
6727
6728		computed = computed || getStyles( elem );
6729
6730		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
6731		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
6732
6733		// Support: Opera 12.1x only
6734		// Fall back to style even without computed
6735		// computed is undefined for elems on document fragments
6736		if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
6737			ret = jQuery.style( elem, name );
6738		}
6739
6740		if ( computed ) {
6741
6742			// A tribute to the "awesome hack by Dean Edwards"
6743			// Chrome < 17 and Safari 5.0 uses "computed value"
6744			// instead of "used value" for margin-right
6745			// Safari 5.1.7 (at least) returns percentage for a larger set of values,
6746			// but width seems to be reliably pixels
6747			// this is against the CSSOM draft spec:
6748			// http://dev.w3.org/csswg/cssom/#resolved-values
6749			if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6750
6751				// Remember the original values
6752				width = style.width;
6753				minWidth = style.minWidth;
6754				maxWidth = style.maxWidth;
6755
6756				// Put in the new values to get a computed value out
6757				style.minWidth = style.maxWidth = style.width = ret;
6758				ret = computed.width;
6759
6760				// Revert the changed values
6761				style.width = width;
6762				style.minWidth = minWidth;
6763				style.maxWidth = maxWidth;
6764			}
6765		}
6766
vendor: 4,152 bytes, lines 6767-6929
6767		// Support: IE
6768		// IE returns zIndex value as an integer.
6769		return ret === undefined ?
6770			ret :
6771			ret + "";
6772	};
6773} else if ( documentElement.currentStyle ) {
6774	getStyles = function( elem ) {
6775		return elem.currentStyle;
6776	};
6777
6778	curCSS = function( elem, name, computed ) {
6779		var left, rs, rsLeft, ret,
6780			style = elem.style;
6781
6782		computed = computed || getStyles( elem );
6783		ret = computed ? computed[ name ] : undefined;
6784
6785		// Avoid setting ret to empty string here
6786		// so we don't default to auto
6787		if ( ret == null && style && style[ name ] ) {
6788			ret = style[ name ];
6789		}
6790
6791		// From the awesome hack by Dean Edwards
6792		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6793
6794		// If we're not dealing with a regular pixel number
6795		// but a number that has a weird ending, we need to convert it to pixels
6796		// but not position css attributes, as those are
6797		// proportional to the parent element instead
6798		// and we can't measure the parent instead because it
6799		// might trigger a "stacking dolls" problem
6800		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
6801
6802			// Remember the original values
6803			left = style.left;
6804			rs = elem.runtimeStyle;
6805			rsLeft = rs && rs.left;
6806
6807			// Put in the new values to get a computed value out
6808			if ( rsLeft ) {
6809				rs.left = elem.currentStyle.left;
6810			}
6811			style.left = name === "fontSize" ? "1em" : ret;
6812			ret = style.pixelLeft + "px";
6813
6814			// Revert the changed values
6815			style.left = left;
6816			if ( rsLeft ) {
6817				rs.left = rsLeft;
6818			}
6819		}
6820
6821		// Support: IE
6822		// IE returns zIndex value as an integer.
6823		return ret === undefined ?
6824			ret :
6825			ret + "" || "auto";
6826	};
6827}
6828
6829
6830
6831
6832function addGetHookIf( conditionFn, hookFn ) {
6833
6834	// Define the hook, we'll check on the first run if it's really needed.
6835	return {
6836		get: function() {
6837			if ( conditionFn() ) {
6838
6839				// Hook not needed (or it's not possible to use it due
6840				// to missing dependency), remove it.
6841				delete this.get;
6842				return;
6843			}
6844
6845			// Hook needed; redefine it so that the support test is not executed again.
6846			return ( this.get = hookFn ).apply( this, arguments );
6847		}
6848	};
6849}
6850
6851
6852var
6853
6854		ralpha = /alpha\([^)]*\)/i,
6855	ropacity = /opacity\s*=\s*([^)]*)/i,
6856
6857	// swappable if display is none or starts with table except
6858	// "table", "table-cell", or "table-caption"
6859	// see here for display values:
6860	// https://developer.mozilla.org/en-US/docs/CSS/display
6861	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6862	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
6863
6864	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6865	cssNormalTransform = {
6866		letterSpacing: "0",
6867		fontWeight: "400"
6868	},
6869
6870	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
6871	emptyStyle = document.createElement( "div" ).style;
6872
6873
6874// return a css property mapped to a potentially vendor prefixed property
6875function vendorPropName( name ) {
6876
6877	// shortcut for names that are not vendor prefixed
6878	if ( name in emptyStyle ) {
6879		return name;
6880	}
6881
6882	// check for vendor prefixed names
6883	var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
6884		i = cssPrefixes.length;
6885
6886	while ( i-- ) {
6887		name = cssPrefixes[ i ] + capName;
6888		if ( name in emptyStyle ) {
6889			return name;
6890		}
6891	}
6892}
6893
6894function showHide( elements, show ) {
6895	var display, elem, hidden,
6896		values = [],
6897		index = 0,
6898		length = elements.length;
6899
6900	for ( ; index < length; index++ ) {
6901		elem = elements[ index ];
6902		if ( !elem.style ) {
6903			continue;
6904		}
6905
6906		values[ index ] = jQuery._data( elem, "olddisplay" );
6907		display = elem.style.display;
6908		if ( show ) {
6909
6910			// Reset the inline display of this element to learn if it is
6911			// being hidden by cascaded rules or not
6912			if ( !values[ index ] && display === "none" ) {
6913				elem.style.display = "";
6914			}
6915
6916			// Set elements which have been overridden with display: none
6917			// in a stylesheet to whatever the default browser style is
6918			// for such an element
6919			if ( elem.style.display === "" && isHidden( elem ) ) {
6920				values[ index ] =
6921					jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
6922			}
6923		} else {
6924			hidden = isHidden( elem );
6925
6926			if ( display && display !== "none" || !hidden ) {
6927				jQuery._data(
6928					elem,
6929					"olddisplay",
vendor: 6,043 bytes, lines 6930-7141
6930					hidden ? display : jQuery.css( elem, "display" )
6931				);
6932			}
6933		}
6934	}
6935
6936	// Set the display of most of the elements in a second loop
6937	// to avoid the constant reflow
6938	for ( index = 0; index < length; index++ ) {
6939		elem = elements[ index ];
6940		if ( !elem.style ) {
6941			continue;
6942		}
6943		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6944			elem.style.display = show ? values[ index ] || "" : "none";
6945		}
6946	}
6947
6948	return elements;
6949}
6950
6951function setPositiveNumber( elem, value, subtract ) {
6952	var matches = rnumsplit.exec( value );
6953	return matches ?
6954
6955		// Guard against undefined "subtract", e.g., when used as in cssHooks
6956		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
6957		value;
6958}
6959
6960function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6961	var i = extra === ( isBorderBox ? "border" : "content" ) ?
6962
6963		// If we already have the right measurement, avoid augmentation
6964		4 :
6965
6966		// Otherwise initialize for horizontal or vertical properties
6967		name === "width" ? 1 : 0,
6968
6969		val = 0;
6970
6971	for ( ; i < 4; i += 2 ) {
6972
6973		// both box models exclude margin, so add it if we want it
6974		if ( extra === "margin" ) {
6975			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6976		}
6977
6978		if ( isBorderBox ) {
6979
6980			// border-box includes padding, so remove it if we want content
6981			if ( extra === "content" ) {
6982				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6983			}
6984
6985			// at this point, extra isn't border nor margin, so remove border
6986			if ( extra !== "margin" ) {
6987				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6988			}
6989		} else {
6990
6991			// at this point, extra isn't content, so add padding
6992			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6993
6994			// at this point, extra isn't content nor padding, so add border
6995			if ( extra !== "padding" ) {
6996				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6997			}
6998		}
6999	}
7000
7001	return val;
7002}
7003
7004function getWidthOrHeight( elem, name, extra ) {
7005
7006	// Start with offset property, which is equivalent to the border-box value
7007	var valueIsBorderBox = true,
7008		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
7009		styles = getStyles( elem ),
7010		isBorderBox = support.boxSizing &&
7011			jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
7012
7013	// some non-html elements return undefined for offsetWidth, so check for null/undefined
7014	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
7015	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
7016	if ( val <= 0 || val == null ) {
7017
7018		// Fall back to computed then uncomputed css if necessary
7019		val = curCSS( elem, name, styles );
7020		if ( val < 0 || val == null ) {
7021			val = elem.style[ name ];
7022		}
7023
7024		// Computed unit is not pixels. Stop here and return.
7025		if ( rnumnonpx.test( val ) ) {
7026			return val;
7027		}
7028
7029		// we need the check for style in case a browser which returns unreliable values
7030		// for getComputedStyle silently falls back to the reliable elem.style
7031		valueIsBorderBox = isBorderBox &&
7032			( support.boxSizingReliable() || val === elem.style[ name ] );
7033
7034		// Normalize "", auto, and prepare for extra
7035		val = parseFloat( val ) || 0;
7036	}
7037
7038	// use the active box-sizing model to add/subtract irrelevant styles
7039	return ( val +
7040		augmentWidthOrHeight(
7041			elem,
7042			name,
7043			extra || ( isBorderBox ? "border" : "content" ),
7044			valueIsBorderBox,
7045			styles
7046		)
7047	) + "px";
7048}
7049
7050jQuery.extend( {
7051
7052	// Add in style property hooks for overriding the default
7053	// behavior of getting and setting a style property
7054	cssHooks: {
7055		opacity: {
7056			get: function( elem, computed ) {
7057				if ( computed ) {
7058
7059					// We should always get a number back from opacity
7060					var ret = curCSS( elem, "opacity" );
7061					return ret === "" ? "1" : ret;
7062				}
7063			}
7064		}
7065	},
7066
7067	// Don't automatically add "px" to these possibly-unitless properties
7068	cssNumber: {
7069		"animationIterationCount": true,
7070		"columnCount": true,
7071		"fillOpacity": true,
7072		"flexGrow": true,
7073		"flexShrink": true,
7074		"fontWeight": true,
7075		"lineHeight": true,
7076		"opacity": true,
7077		"order": true,
7078		"orphans": true,
7079		"widows": true,
7080		"zIndex": true,
7081		"zoom": true
7082	},
7083
7084	// Add in properties whose names you wish to fix before
7085	// setting or getting the value
7086	cssProps: {
7087
7088		// normalize float css property
7089		"float": support.cssFloat ? "cssFloat" : "styleFloat"
7090	},
7091
7092	// Get and set the style property on a DOM Node
7093	style: function( elem, name, value, extra ) {
7094
7095		// Don't set styles on text and comment nodes
7096		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
7097			return;
7098		}
7099
7100		// Make sure that we're working with the right name
7101		var ret, type, hooks,
7102			origName = jQuery.camelCase( name ),
7103			style = elem.style;
7104
7105		name = jQuery.cssProps[ origName ] ||
7106			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
7107
7108		// gets hook for the prefixed version
7109		// followed by the unprefixed version
7110		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
7111
7112		// Check if we're setting a value
7113		if ( value !== undefined ) {
7114			type = typeof value;
7115
7116			// Convert "+=" or "-=" to relative numbers (#7345)
7117			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
7118				value = adjustCSS( elem, name, ret );
7119
7120				// Fixes bug #9237
7121				type = "number";
7122			}
7123
7124			// Make sure that null and NaN values aren't set. See: #7116
7125			if ( value == null || value !== value ) {
7126				return;
7127			}
7128
7129			// If a number was passed in, add the unit (except for certain CSS properties)
7130			if ( type === "number" ) {
7131				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
7132			}
7133
7134			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
7135			// but it would mean to define eight
7136			// (for every problematic property) identical functions
7137			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
7138				style[ name ] = "inherit";
7139			}
7140
7141			// If a hook was provided, use that value, otherwise just set the specified value
vendor: 4,586 bytes, lines 7142-7297
7142			if ( !hooks || !( "set" in hooks ) ||
7143				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
7144
7145				// Support: IE
7146				// Swallow errors from 'invalid' CSS values (#5509)
7147				try {
7148					style[ name ] = value;
7149				} catch ( e ) {}
7150			}
7151
7152		} else {
7153
7154			// If a hook was provided get the non-computed value from there
7155			if ( hooks && "get" in hooks &&
7156				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
7157
7158				return ret;
7159			}
7160
7161			// Otherwise just get the value from the style object
7162			return style[ name ];
7163		}
7164	},
7165
7166	css: function( elem, name, extra, styles ) {
7167		var num, val, hooks,
7168			origName = jQuery.camelCase( name );
7169
7170		// Make sure that we're working with the right name
7171		name = jQuery.cssProps[ origName ] ||
7172			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
7173
7174		// gets hook for the prefixed version
7175		// followed by the unprefixed version
7176		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
7177
7178		// If a hook was provided get the computed value from there
7179		if ( hooks && "get" in hooks ) {
7180			val = hooks.get( elem, true, extra );
7181		}
7182
7183		// Otherwise, if a way to get the computed value exists, use that
7184		if ( val === undefined ) {
7185			val = curCSS( elem, name, styles );
7186		}
7187
7188		//convert "normal" to computed value
7189		if ( val === "normal" && name in cssNormalTransform ) {
7190			val = cssNormalTransform[ name ];
7191		}
7192
7193		// Return, converting to number if forced or a qualifier was provided and val looks numeric
7194		if ( extra === "" || extra ) {
7195			num = parseFloat( val );
7196			return extra === true || isFinite( num ) ? num || 0 : val;
7197		}
7198		return val;
7199	}
7200} );
7201
7202jQuery.each( [ "height", "width" ], function( i, name ) {
7203	jQuery.cssHooks[ name ] = {
7204		get: function( elem, computed, extra ) {
7205			if ( computed ) {
7206
7207				// certain elements can have dimension info if we invisibly show them
7208				// however, it must have a current display style that would benefit from this
7209				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
7210					elem.offsetWidth === 0 ?
7211						swap( elem, cssShow, function() {
7212							return getWidthOrHeight( elem, name, extra );
7213						} ) :
7214						getWidthOrHeight( elem, name, extra );
7215			}
7216		},
7217
7218		set: function( elem, value, extra ) {
7219			var styles = extra && getStyles( elem );
7220			return setPositiveNumber( elem, value, extra ?
7221				augmentWidthOrHeight(
7222					elem,
7223					name,
7224					extra,
7225					support.boxSizing &&
7226						jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7227					styles
7228				) : 0
7229			);
7230		}
7231	};
7232} );
7233
7234if ( !support.opacity ) {
7235	jQuery.cssHooks.opacity = {
7236		get: function( elem, computed ) {
7237
7238			// IE uses filters for opacity
7239			return ropacity.test( ( computed && elem.currentStyle ?
7240				elem.currentStyle.filter :
7241				elem.style.filter ) || "" ) ?
7242					( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
7243					computed ? "1" : "";
7244		},
7245
7246		set: function( elem, value ) {
7247			var style = elem.style,
7248				currentStyle = elem.currentStyle,
7249				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
7250				filter = currentStyle && currentStyle.filter || style.filter || "";
7251
7252			// IE has trouble with opacity if it does not have layout
7253			// Force it by setting the zoom level
7254			style.zoom = 1;
7255
7256			// if setting opacity to 1, and no other filters exist -
7257			// attempt to remove filter attribute #6652
7258			// if value === "", then remove inline opacity #12685
7259			if ( ( value >= 1 || value === "" ) &&
7260					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
7261					style.removeAttribute ) {
7262
7263				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
7264				// if "filter:" is present at all, clearType is disabled, we want to avoid this
7265				// style.removeAttribute is IE Only, but so apparently is this code path...
7266				style.removeAttribute( "filter" );
7267
7268				// if there is no filter style applied in a css rule
7269				// or unset inline opacity, we are done
7270				if ( value === "" || currentStyle && !currentStyle.filter ) {
7271					return;
7272				}
7273			}
7274
7275			// otherwise, set new filter values
7276			style.filter = ralpha.test( filter ) ?
7277				filter.replace( ralpha, opacity ) :
7278				filter + " " + opacity;
7279		}
7280	};
7281}
7282
7283jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
7284	function( elem, computed ) {
7285		if ( computed ) {
7286			return swap( elem, { "display": "inline-block" },
7287				curCSS, [ elem, "marginRight" ] );
7288		}
7289	}
7290);
7291
7292jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
7293	function( elem, computed ) {
7294		if ( computed ) {
7295			return (
7296				parseFloat( curCSS( elem, "marginLeft" ) ) ||
7297
vendor: 4,625 bytes, lines 7298-7476
7298				// Support: IE<=11+
7299				// Running getBoundingClientRect on a disconnected node in IE throws an error
7300				// Support: IE8 only
7301				// getClientRects() errors on disconnected elems
7302				( jQuery.contains( elem.ownerDocument, elem ) ?
7303					elem.getBoundingClientRect().left -
7304						swap( elem, { marginLeft: 0 }, function() {
7305							return elem.getBoundingClientRect().left;
7306						} ) :
7307					0
7308				)
7309			) + "px";
7310		}
7311	}
7312);
7313
7314// These hooks are used by animate to expand properties
7315jQuery.each( {
7316	margin: "",
7317	padding: "",
7318	border: "Width"
7319}, function( prefix, suffix ) {
7320	jQuery.cssHooks[ prefix + suffix ] = {
7321		expand: function( value ) {
7322			var i = 0,
7323				expanded = {},
7324
7325				// assumes a single number if not a string
7326				parts = typeof value === "string" ? value.split( " " ) : [ value ];
7327
7328			for ( ; i < 4; i++ ) {
7329				expanded[ prefix + cssExpand[ i ] + suffix ] =
7330					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7331			}
7332
7333			return expanded;
7334		}
7335	};
7336
7337	if ( !rmargin.test( prefix ) ) {
7338		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7339	}
7340} );
7341
7342jQuery.fn.extend( {
7343	css: function( name, value ) {
7344		return access( this, function( elem, name, value ) {
7345			var styles, len,
7346				map = {},
7347				i = 0;
7348
7349			if ( jQuery.isArray( name ) ) {
7350				styles = getStyles( elem );
7351				len = name.length;
7352
7353				for ( ; i < len; i++ ) {
7354					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
7355				}
7356
7357				return map;
7358			}
7359
7360			return value !== undefined ?
7361				jQuery.style( elem, name, value ) :
7362				jQuery.css( elem, name );
7363		}, name, value, arguments.length > 1 );
7364	},
7365	show: function() {
7366		return showHide( this, true );
7367	},
7368	hide: function() {
7369		return showHide( this );
7370	},
7371	toggle: function( state ) {
7372		if ( typeof state === "boolean" ) {
7373			return state ? this.show() : this.hide();
7374		}
7375
7376		return this.each( function() {
7377			if ( isHidden( this ) ) {
7378				jQuery( this ).show();
7379			} else {
7380				jQuery( this ).hide();
7381			}
7382		} );
7383	}
7384} );
7385
7386
7387function Tween( elem, options, prop, end, easing ) {
7388	return new Tween.prototype.init( elem, options, prop, end, easing );
7389}
7390jQuery.Tween = Tween;
7391
7392Tween.prototype = {
7393	constructor: Tween,
7394	init: function( elem, options, prop, end, easing, unit ) {
7395		this.elem = elem;
7396		this.prop = prop;
7397		this.easing = easing || jQuery.easing._default;
7398		this.options = options;
7399		this.start = this.now = this.cur();
7400		this.end = end;
7401		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
7402	},
7403	cur: function() {
7404		var hooks = Tween.propHooks[ this.prop ];
7405
7406		return hooks && hooks.get ?
7407			hooks.get( this ) :
7408			Tween.propHooks._default.get( this );
7409	},
7410	run: function( percent ) {
7411		var eased,
7412			hooks = Tween.propHooks[ this.prop ];
7413
7414		if ( this.options.duration ) {
7415			this.pos = eased = jQuery.easing[ this.easing ](
7416				percent, this.options.duration * percent, 0, 1, this.options.duration
7417			);
7418		} else {
7419			this.pos = eased = percent;
7420		}
7421		this.now = ( this.end - this.start ) * eased + this.start;
7422
7423		if ( this.options.step ) {
7424			this.options.step.call( this.elem, this.now, this );
7425		}
7426
7427		if ( hooks && hooks.set ) {
7428			hooks.set( this );
7429		} else {
7430			Tween.propHooks._default.set( this );
7431		}
7432		return this;
7433	}
7434};
7435
7436Tween.prototype.init.prototype = Tween.prototype;
7437
7438Tween.propHooks = {
7439	_default: {
7440		get: function( tween ) {
7441			var result;
7442
7443			// Use a property on the element directly when it is not a DOM element,
7444			// or when there is no matching style property that exists.
7445			if ( tween.elem.nodeType !== 1 ||
7446				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
7447				return tween.elem[ tween.prop ];
7448			}
7449
7450			// passing an empty string as a 3rd parameter to .css will automatically
7451			// attempt a parseFloat and fallback to a string if the parse fails
7452			// so, simple values such as "10px" are parsed to Float.
7453			// complex values such as "rotate(1rad)" are returned as is.
7454			result = jQuery.css( tween.elem, tween.prop, "" );
7455
7456			// Empty strings, null, undefined and "auto" are converted to 0.
7457			return !result || result === "auto" ? 0 : result;
7458		},
7459		set: function( tween ) {
7460
7461			// use step hook for back compat - use cssHook if its there - use .style if its
7462			// available and use plain properties where available
7463			if ( jQuery.fx.step[ tween.prop ] ) {
7464				jQuery.fx.step[ tween.prop ]( tween );
7465			} else if ( tween.elem.nodeType === 1 &&
7466				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
7467					jQuery.cssHooks[ tween.prop ] ) ) {
7468				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7469			} else {
7470				tween.elem[ tween.prop ] = tween.now;
7471			}
7472		}
7473	}
7474};
7475
7476// Support: IE <=9
vendor: 5,654 bytes, lines 7477-7693
7477// Panic based approach to setting things on disconnected nodes
7478
7479Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7480	set: function( tween ) {
7481		if ( tween.elem.nodeType && tween.elem.parentNode ) {
7482			tween.elem[ tween.prop ] = tween.now;
7483		}
7484	}
7485};
7486
7487jQuery.easing = {
7488	linear: function( p ) {
7489		return p;
7490	},
7491	swing: function( p ) {
7492		return 0.5 - Math.cos( p * Math.PI ) / 2;
7493	},
7494	_default: "swing"
7495};
7496
7497jQuery.fx = Tween.prototype.init;
7498
7499// Back Compat <1.8 extension point
7500jQuery.fx.step = {};
7501
7502
7503
7504
7505var
7506	fxNow, timerId,
7507	rfxtypes = /^(?:toggle|show|hide)$/,
7508	rrun = /queueHooks$/;
7509
7510// Animations created synchronously will run synchronously
7511function createFxNow() {
7512	window.setTimeout( function() {
7513		fxNow = undefined;
7514	} );
7515	return ( fxNow = jQuery.now() );
7516}
7517
7518// Generate parameters to create a standard animation
7519function genFx( type, includeWidth ) {
7520	var which,
7521		attrs = { height: type },
7522		i = 0;
7523
7524	// if we include width, step value is 1 to do all cssExpand values,
7525	// if we don't include width, step value is 2 to skip over Left and Right
7526	includeWidth = includeWidth ? 1 : 0;
7527	for ( ; i < 4 ; i += 2 - includeWidth ) {
7528		which = cssExpand[ i ];
7529		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7530	}
7531
7532	if ( includeWidth ) {
7533		attrs.opacity = attrs.width = type;
7534	}
7535
7536	return attrs;
7537}
7538
7539function createTween( value, prop, animation ) {
7540	var tween,
7541		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7542		index = 0,
7543		length = collection.length;
7544	for ( ; index < length; index++ ) {
7545		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7546
7547			// we're done with this property
7548			return tween;
7549		}
7550	}
7551}
7552
7553function defaultPrefilter( elem, props, opts ) {
7554	/* jshint validthis: true */
7555	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
7556		anim = this,
7557		orig = {},
7558		style = elem.style,
7559		hidden = elem.nodeType && isHidden( elem ),
7560		dataShow = jQuery._data( elem, "fxshow" );
7561
7562	// handle queue: false promises
7563	if ( !opts.queue ) {
7564		hooks = jQuery._queueHooks( elem, "fx" );
7565		if ( hooks.unqueued == null ) {
7566			hooks.unqueued = 0;
7567			oldfire = hooks.empty.fire;
7568			hooks.empty.fire = function() {
7569				if ( !hooks.unqueued ) {
7570					oldfire();
7571				}
7572			};
7573		}
7574		hooks.unqueued++;
7575
7576		anim.always( function() {
7577
7578			// doing this makes sure that the complete handler will be called
7579			// before this completes
7580			anim.always( function() {
7581				hooks.unqueued--;
7582				if ( !jQuery.queue( elem, "fx" ).length ) {
7583					hooks.empty.fire();
7584				}
7585			} );
7586		} );
7587	}
7588
7589	// height/width overflow pass
7590	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
7591
7592		// Make sure that nothing sneaks out
7593		// Record all 3 overflow attributes because IE does not
7594		// change the overflow attribute when overflowX and
7595		// overflowY are set to the same value
7596		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7597
7598		// Set display property to inline-block for height/width
7599		// animations on inline elements that are having width/height animated
7600		display = jQuery.css( elem, "display" );
7601
7602		// Test default display if display is currently "none"
7603		checkDisplay = display === "none" ?
7604			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
7605
7606		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
7607
7608			// inline-level elements accept inline-block;
7609			// block-level elements need to be inline with layout
7610			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
7611				style.display = "inline-block";
7612			} else {
7613				style.zoom = 1;
7614			}
7615		}
7616	}
7617
7618	if ( opts.overflow ) {
7619		style.overflow = "hidden";
7620		if ( !support.shrinkWrapBlocks() ) {
7621			anim.always( function() {
7622				style.overflow = opts.overflow[ 0 ];
7623				style.overflowX = opts.overflow[ 1 ];
7624				style.overflowY = opts.overflow[ 2 ];
7625			} );
7626		}
7627	}
7628
7629	// show/hide pass
7630	for ( prop in props ) {
7631		value = props[ prop ];
7632		if ( rfxtypes.exec( value ) ) {
7633			delete props[ prop ];
7634			toggle = toggle || value === "toggle";
7635			if ( value === ( hidden ? "hide" : "show" ) ) {
7636
7637				// If there is dataShow left over from a stopped hide or show
7638				// and we are going to proceed with show, we should pretend to be hidden
7639				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7640					hidden = true;
7641				} else {
7642					continue;
7643				}
7644			}
7645			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7646
7647		// Any non-fx value stops us from restoring the original display value
7648		} else {
7649			display = undefined;
7650		}
7651	}
7652
7653	if ( !jQuery.isEmptyObject( orig ) ) {
7654		if ( dataShow ) {
7655			if ( "hidden" in dataShow ) {
7656				hidden = dataShow.hidden;
7657			}
7658		} else {
7659			dataShow = jQuery._data( elem, "fxshow", {} );
7660		}
7661
7662		// store state if its toggle - enables .stop().toggle() to "reverse"
7663		if ( toggle ) {
7664			dataShow.hidden = !hidden;
7665		}
7666		if ( hidden ) {
7667			jQuery( elem ).show();
7668		} else {
7669			anim.done( function() {
7670				jQuery( elem ).hide();
7671			} );
7672		}
7673		anim.done( function() {
7674			var prop;
7675			jQuery._removeData( elem, "fxshow" );
7676			for ( prop in orig ) {
7677				jQuery.style( elem, prop, orig[ prop ] );
7678			}
7679		} );
7680		for ( prop in orig ) {
7681			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7682
7683			if ( !( prop in dataShow ) ) {
7684				dataShow[ prop ] = tween.start;
7685				if ( hidden ) {
7686					tween.end = tween.start;
7687					tween.start = prop === "width" || prop === "height" ? 1 : 0;
7688				}
7689			}
7690		}
7691
7692	// If this is a noop like .hide().hide(), restore an overwritten display value
7693	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : dis
vendor: 10,851 bytes, lines 7693-8125
7693play ) === "inline" ) {
7694		style.display = display;
7695	}
7696}
7697
7698function propFilter( props, specialEasing ) {
7699	var index, name, easing, value, hooks;
7700
7701	// camelCase, specialEasing and expand cssHook pass
7702	for ( index in props ) {
7703		name = jQuery.camelCase( index );
7704		easing = specialEasing[ name ];
7705		value = props[ index ];
7706		if ( jQuery.isArray( value ) ) {
7707			easing = value[ 1 ];
7708			value = props[ index ] = value[ 0 ];
7709		}
7710
7711		if ( index !== name ) {
7712			props[ name ] = value;
7713			delete props[ index ];
7714		}
7715
7716		hooks = jQuery.cssHooks[ name ];
7717		if ( hooks && "expand" in hooks ) {
7718			value = hooks.expand( value );
7719			delete props[ name ];
7720
7721			// not quite $.extend, this wont overwrite keys already present.
7722			// also - reusing 'index' from above because we have the correct "name"
7723			for ( index in value ) {
7724				if ( !( index in props ) ) {
7725					props[ index ] = value[ index ];
7726					specialEasing[ index ] = easing;
7727				}
7728			}
7729		} else {
7730			specialEasing[ name ] = easing;
7731		}
7732	}
7733}
7734
7735function Animation( elem, properties, options ) {
7736	var result,
7737		stopped,
7738		index = 0,
7739		length = Animation.prefilters.length,
7740		deferred = jQuery.Deferred().always( function() {
7741
7742			// don't match elem in the :animated selector
7743			delete tick.elem;
7744		} ),
7745		tick = function() {
7746			if ( stopped ) {
7747				return false;
7748			}
7749			var currentTime = fxNow || createFxNow(),
7750				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7751
7752				// Support: Android 2.3
7753				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7754				temp = remaining / animation.duration || 0,
7755				percent = 1 - temp,
7756				index = 0,
7757				length = animation.tweens.length;
7758
7759			for ( ; index < length ; index++ ) {
7760				animation.tweens[ index ].run( percent );
7761			}
7762
7763			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7764
7765			if ( percent < 1 && length ) {
7766				return remaining;
7767			} else {
7768				deferred.resolveWith( elem, [ animation ] );
7769				return false;
7770			}
7771		},
7772		animation = deferred.promise( {
7773			elem: elem,
7774			props: jQuery.extend( {}, properties ),
7775			opts: jQuery.extend( true, {
7776				specialEasing: {},
7777				easing: jQuery.easing._default
7778			}, options ),
7779			originalProperties: properties,
7780			originalOptions: options,
7781			startTime: fxNow || createFxNow(),
7782			duration: options.duration,
7783			tweens: [],
7784			createTween: function( prop, end ) {
7785				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7786						animation.opts.specialEasing[ prop ] || animation.opts.easing );
7787				animation.tweens.push( tween );
7788				return tween;
7789			},
7790			stop: function( gotoEnd ) {
7791				var index = 0,
7792
7793					// if we are going to the end, we want to run all the tweens
7794					// otherwise we skip this part
7795					length = gotoEnd ? animation.tweens.length : 0;
7796				if ( stopped ) {
7797					return this;
7798				}
7799				stopped = true;
7800				for ( ; index < length ; index++ ) {
7801					animation.tweens[ index ].run( 1 );
7802				}
7803
7804				// resolve when we played the last frame
7805				// otherwise, reject
7806				if ( gotoEnd ) {
7807					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7808					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7809				} else {
7810					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7811				}
7812				return this;
7813			}
7814		} ),
7815		props = animation.props;
7816
7817	propFilter( props, animation.opts.specialEasing );
7818
7819	for ( ; index < length ; index++ ) {
7820		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7821		if ( result ) {
7822			if ( jQuery.isFunction( result.stop ) ) {
7823				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7824					jQuery.proxy( result.stop, result );
7825			}
7826			return result;
7827		}
7828	}
7829
7830	jQuery.map( props, createTween, animation );
7831
7832	if ( jQuery.isFunction( animation.opts.start ) ) {
7833		animation.opts.start.call( elem, animation );
7834	}
7835
7836	jQuery.fx.timer(
7837		jQuery.extend( tick, {
7838			elem: elem,
7839			anim: animation,
7840			queue: animation.opts.queue
7841		} )
7842	);
7843
7844	// attach callbacks from options
7845	return animation.progress( animation.opts.progress )
7846		.done( animation.opts.done, animation.opts.complete )
7847		.fail( animation.opts.fail )
7848		.always( animation.opts.always );
7849}
7850
7851jQuery.Animation = jQuery.extend( Animation, {
7852
7853	tweeners: {
7854		"*": [ function( prop, value ) {
7855			var tween = this.createTween( prop, value );
7856			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7857			return tween;
7858		} ]
7859	},
7860
7861	tweener: function( props, callback ) {
7862		if ( jQuery.isFunction( props ) ) {
7863			callback = props;
7864			props = [ "*" ];
7865		} else {
7866			props = props.match( rnotwhite );
7867		}
7868
7869		var prop,
7870			index = 0,
7871			length = props.length;
7872
7873		for ( ; index < length ; index++ ) {
7874			prop = props[ index ];
7875			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7876			Animation.tweeners[ prop ].unshift( callback );
7877		}
7878	},
7879
7880	prefilters: [ defaultPrefilter ],
7881
7882	prefilter: function( callback, prepend ) {
7883		if ( prepend ) {
7884			Animation.prefilters.unshift( callback );
7885		} else {
7886			Animation.prefilters.push( callback );
7887		}
7888	}
7889} );
7890
7891jQuery.speed = function( speed, easing, fn ) {
7892	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7893		complete: fn || !fn && easing ||
7894			jQuery.isFunction( speed ) && speed,
7895		duration: speed,
7896		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7897	};
7898
7899	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
7900		opt.duration in jQuery.fx.speeds ?
7901			jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
7902
7903	// normalize opt.queue - true/undefined/null -> "fx"
7904	if ( opt.queue == null || opt.queue === true ) {
7905		opt.queue = "fx";
7906	}
7907
7908	// Queueing
7909	opt.old = opt.complete;
7910
7911	opt.complete = function() {
7912		if ( jQuery.isFunction( opt.old ) ) {
7913			opt.old.call( this );
7914		}
7915
7916		if ( opt.queue ) {
7917			jQuery.dequeue( this, opt.queue );
7918		}
7919	};
7920
7921	return opt;
7922};
7923
7924jQuery.fn.extend( {
7925	fadeTo: function( speed, to, easing, callback ) {
7926
7927		// show any hidden elements after setting opacity to 0
7928		return this.filter( isHidden ).css( "opacity", 0 ).show()
7929
7930			// animate to the value specified
7931			.end().animate( { opacity: to }, speed, easing, callback );
7932	},
7933	animate: function( prop, speed, easing, callback ) {
7934		var empty = jQuery.isEmptyObject( prop ),
7935			optall = jQuery.speed( speed, easing, callback ),
7936			doAnimation = function() {
7937
7938				// Operate on a copy of prop so per-property easing won't be lost
7939				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7940
7941				// Empty animations, or finishing resolves immediately
7942				if ( empty || jQuery._data( this, "finish" ) ) {
7943					anim.stop( true );
7944				}
7945			};
7946			doAnimation.finish = doAnimation;
7947
7948		return empty || optall.queue === false ?
7949			this.each( doAnimation ) :
7950			this.queue( optall.queue, doAnimation );
7951	},
7952	stop: function( type, clearQueue, gotoEnd ) {
7953		var stopQueue = function( hooks ) {
7954			var stop = hooks.stop;
7955			delete hooks.stop;
7956			stop( gotoEnd );
7957		};
7958
7959		if ( typeof type !== "string" ) {
7960			gotoEnd = clearQueue;
7961			clearQueue = type;
7962			type = undefined;
7963		}
7964		if ( clearQueue && type !== false ) {
7965			this.queue( type || "fx", [] );
7966		}
7967
7968		return this.each( function() {
7969			var dequeue = true,
7970				index = type != null && type + "queueHooks",
7971				timers = jQuery.timers,
7972				data = jQuery._data( this );
7973
7974			if ( index ) {
7975				if ( data[ index ] && data[ index ].stop ) {
7976					stopQueue( data[ index ] );
7977				}
7978			} else {
7979				for ( index in data ) {
7980					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7981						stopQueue( data[ index ] );
7982					}
7983				}
7984			}
7985
7986			for ( index = timers.length; index--; ) {
7987				if ( timers[ index ].elem === this &&
7988					( type == null || timers[ index ].queue === type ) ) {
7989
7990					timers[ index ].anim.stop( gotoEnd );
7991					dequeue = false;
7992					timers.splice( index, 1 );
7993				}
7994			}
7995
7996			// start the next in the queue if the last step wasn't forced
7997			// timers currently will call their complete callbacks, which will dequeue
7998			// but only if they were gotoEnd
7999			if ( dequeue || !gotoEnd ) {
8000				jQuery.dequeue( this, type );
8001			}
8002		} );
8003	},
8004	finish: function( type ) {
8005		if ( type !== false ) {
8006			type = type || "fx";
8007		}
8008		return this.each( function() {
8009			var index,
8010				data = jQuery._data( this ),
8011				queue = data[ type + "queue" ],
8012				hooks = data[ type + "queueHooks" ],
8013				timers = jQuery.timers,
8014				length = queue ? queue.length : 0;
8015
8016			// enable finishing flag on private data
8017			data.finish = true;
8018
8019			// empty the queue first
8020			jQuery.queue( this, type, [] );
8021
8022			if ( hooks && hooks.stop ) {
8023				hooks.stop.call( this, true );
8024			}
8025
8026			// look for any active animations, and finish them
8027			for ( index = timers.length; index--; ) {
8028				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
8029					timers[ index ].anim.stop( true );
8030					timers.splice( index, 1 );
8031				}
8032			}
8033
8034			// look for any animations in the old queue and finish them
8035			for ( index = 0; index < length; index++ ) {
8036				if ( queue[ index ] && queue[ index ].finish ) {
8037					queue[ index ].finish.call( this );
8038				}
8039			}
8040
8041			// turn off finishing flag
8042			delete data.finish;
8043		} );
8044	}
8045} );
8046
8047jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
8048	var cssFn = jQuery.fn[ name ];
8049	jQuery.fn[ name ] = function( speed, easing, callback ) {
8050		return speed == null || typeof speed === "boolean" ?
8051			cssFn.apply( this, arguments ) :
8052			this.animate( genFx( name, true ), speed, easing, callback );
8053	};
8054} );
8055
8056// Generate shortcuts for custom animations
8057jQuery.each( {
8058	slideDown: genFx( "show" ),
8059	slideUp: genFx( "hide" ),
8060	slideToggle: genFx( "toggle" ),
8061	fadeIn: { opacity: "show" },
8062	fadeOut: { opacity: "hide" },
8063	fadeToggle: { opacity: "toggle" }
8064}, function( name, props ) {
8065	jQuery.fn[ name ] = function( speed, easing, callback ) {
8066		return this.animate( props, speed, easing, callback );
8067	};
8068} );
8069
8070jQuery.timers = [];
8071jQuery.fx.tick = function() {
8072	var timer,
8073		timers = jQuery.timers,
8074		i = 0;
8075
8076	fxNow = jQuery.now();
8077
8078	for ( ; i < timers.length; i++ ) {
8079		timer = timers[ i ];
8080
8081		// Checks the timer has not already been removed
8082		if ( !timer() && timers[ i ] === timer ) {
8083			timers.splice( i--, 1 );
8084		}
8085	}
8086
8087	if ( !timers.length ) {
8088		jQuery.fx.stop();
8089	}
8090	fxNow = undefined;
8091};
8092
8093jQuery.fx.timer = function( timer ) {
8094	jQuery.timers.push( timer );
8095	if ( timer() ) {
8096		jQuery.fx.start();
8097	} else {
8098		jQuery.timers.pop();
8099	}
8100};
8101
8102jQuery.fx.interval = 13;
8103
8104jQuery.fx.start = function() {
8105	if ( !timerId ) {
8106		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
8107	}
8108};
8109
8110jQuery.fx.stop = function() {
8111	window.clearInterval( timerId );
8112	timerId = null;
8113};
8114
8115jQuery.fx.speeds = {
8116	slow: 600,
8117	fast: 200,
8118
8119	// Default speed
8120	_default: 400
8121};
8122
8123
8124// Based off of the plugin by Clint Helfers, with permission.
8125// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
8126jQuery.fn.delay = function( time, type ) {
8127	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
8128	type = type || "fx";
8129
8130	return this.queue( type, function( next, hooks ) {
8131		var timeout = window.setTimeout( next, time );
8132		hooks.stop = function() {
8133			window.clearTimeout( timeout );
8134		};
8135	} );
8136};
8137
8138
8139( function() {
8140	var a,
8141		input = document.createElement( "input" ),
8142		div = document.createElement( "div" ),
8143		select = document.createElement( "select" ),
8144		opt = select.appendChild( document.createElement( "option" ) );
8145
8146	// Setup
8147	div = document.createElement( "div" );
8148	div.setAttribute( "className", "t" );
8149	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
8150	a = div.getElementsByTagName( "a" )[ 0 ];
8151
8152	// Support: Windows Web Apps (WWA)
8153	// `type` must use .setAttribute for WWA (#14901)
8154	input.setAttribute( "type", "checkbox" );
8155	div.appendChild( input );
8156
8157	a = div.getElementsByTagName( "a" )[ 0 ];
8158
8159	// First batch of tests.
8160	a.style.cssText = "top:1px";
8161
8162	// Test setAttribute on camelCase class.
8163	// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
vendor: 2,696 bytes, lines 8164-8265
8164	support.getSetAttribute = div.className !== "t";
8165
8166	// Get the style information from getAttribute
8167	// (IE uses .cssText instead)
8168	support.style = /top/.test( a.getAttribute( "style" ) );
8169
8170	// Make sure that URLs aren't manipulated
8171	// (IE normalizes it by default)
8172	support.hrefNormalized = a.getAttribute( "href" ) === "/a";
8173
8174	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
8175	support.checkOn = !!input.value;
8176
8177	// Make sure that a selected-by-default option has a working selected property.
8178	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
8179	support.optSelected = opt.selected;
8180
8181	// Tests for enctype support on a form (#6743)
8182	support.enctype = !!document.createElement( "form" ).enctype;
8183
8184	// Make sure that the options inside disabled selects aren't marked as disabled
8185	// (WebKit marks them as disabled)
8186	select.disabled = true;
8187	support.optDisabled = !opt.disabled;
8188
8189	// Support: IE8 only
8190	// Check if we can trust getAttribute("value")
8191	input = document.createElement( "input" );
8192	input.setAttribute( "value", "" );
8193	support.input = input.getAttribute( "value" ) === "";
8194
8195	// Check if an input maintains its value after becoming a radio
8196	input.value = "t";
8197	input.setAttribute( "type", "radio" );
8198	support.radioValue = input.value === "t";
8199} )();
8200
8201
8202var rreturn = /\r/g,
8203	rspaces = /[\x20\t\r\n\f]+/g;
8204
8205jQuery.fn.extend( {
8206	val: function( value ) {
8207		var hooks, ret, isFunction,
8208			elem = this[ 0 ];
8209
8210		if ( !arguments.length ) {
8211			if ( elem ) {
8212				hooks = jQuery.valHooks[ elem.type ] ||
8213					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8214
8215				if (
8216					hooks &&
8217					"get" in hooks &&
8218					( ret = hooks.get( elem, "value" ) ) !== undefined
8219				) {
8220					return ret;
8221				}
8222
8223				ret = elem.value;
8224
8225				return typeof ret === "string" ?
8226
8227					// handle most common string cases
8228					ret.replace( rreturn, "" ) :
8229
8230					// handle cases where value is null/undef or number
8231					ret == null ? "" : ret;
8232			}
8233
8234			return;
8235		}
8236
8237		isFunction = jQuery.isFunction( value );
8238
8239		return this.each( function( i ) {
8240			var val;
8241
8242			if ( this.nodeType !== 1 ) {
8243				return;
8244			}
8245
8246			if ( isFunction ) {
8247				val = value.call( this, i, jQuery( this ).val() );
8248			} else {
8249				val = value;
8250			}
8251
8252			// Treat null/undefined as ""; convert numbers to string
8253			if ( val == null ) {
8254				val = "";
8255			} else if ( typeof val === "number" ) {
8256				val += "";
8257			} else if ( jQuery.isArray( val ) ) {
8258				val = jQuery.map( val, function( value ) {
8259					return value == null ? "" : value + "";
8260				} );
8261			}
8262
8263			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8264
8265			// If set returns undefined, fall back to normal setting
vendor: 4,648 bytes, lines 8266-8456
8266			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8267				this.value = val;
8268			}
8269		} );
8270	}
8271} );
8272
8273jQuery.extend( {
8274	valHooks: {
8275		option: {
8276			get: function( elem ) {
8277				var val = jQuery.find.attr( elem, "value" );
8278				return val != null ?
8279					val :
8280
8281					// Support: IE10-11+
8282					// option.text throws exceptions (#14686, #14858)
8283					// Strip and collapse whitespace
8284					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8285					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
8286			}
8287		},
8288		select: {
8289			get: function( elem ) {
8290				var value, option,
8291					options = elem.options,
8292					index = elem.selectedIndex,
8293					one = elem.type === "select-one" || index < 0,
8294					values = one ? null : [],
8295					max = one ? index + 1 : options.length,
8296					i = index < 0 ?
8297						max :
8298						one ? index : 0;
8299
8300				// Loop through all the selected options
8301				for ( ; i < max; i++ ) {
8302					option = options[ i ];
8303
8304					// oldIE doesn't update selected after form reset (#2551)
8305					if ( ( option.selected || i === index ) &&
8306
8307							// Don't return options that are disabled or in a disabled optgroup
8308							( support.optDisabled ?
8309								!option.disabled :
8310								option.getAttribute( "disabled" ) === null ) &&
8311							( !option.parentNode.disabled ||
8312								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
8313
8314						// Get the specific value for the option
8315						value = jQuery( option ).val();
8316
8317						// We don't need an array for one selects
8318						if ( one ) {
8319							return value;
8320						}
8321
8322						// Multi-Selects return an array
8323						values.push( value );
8324					}
8325				}
8326
8327				return values;
8328			},
8329
8330			set: function( elem, value ) {
8331				var optionSet, option,
8332					options = elem.options,
8333					values = jQuery.makeArray( value ),
8334					i = options.length;
8335
8336				while ( i-- ) {
8337					option = options[ i ];
8338
8339					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {
8340
8341						// Support: IE6
8342						// When new option element is added to select box we need to
8343						// force reflow of newly added node in order to workaround delay
8344						// of initialization properties
8345						try {
8346							option.selected = optionSet = true;
8347
8348						} catch ( _ ) {
8349
8350							// Will be executed only in IE6
8351							option.scrollHeight;
8352						}
8353
8354					} else {
8355						option.selected = false;
8356					}
8357				}
8358
8359				// Force browsers to behave consistently when non-matching value is set
8360				if ( !optionSet ) {
8361					elem.selectedIndex = -1;
8362				}
8363
8364				return options;
8365			}
8366		}
8367	}
8368} );
8369
8370// Radios and checkboxes getter/setter
8371jQuery.each( [ "radio", "checkbox" ], function() {
8372	jQuery.valHooks[ this ] = {
8373		set: function( elem, value ) {
8374			if ( jQuery.isArray( value ) ) {
8375				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8376			}
8377		}
8378	};
8379	if ( !support.checkOn ) {
8380		jQuery.valHooks[ this ].get = function( elem ) {
8381			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8382		};
8383	}
8384} );
8385
8386
8387
8388
8389var nodeHook, boolHook,
8390	attrHandle = jQuery.expr.attrHandle,
8391	ruseDefault = /^(?:checked|selected)$/i,
8392	getSetAttribute = support.getSetAttribute,
8393	getSetInput = support.input;
8394
8395jQuery.fn.extend( {
8396	attr: function( name, value ) {
8397		return access( this, jQuery.attr, name, value, arguments.length > 1 );
8398	},
8399
8400	removeAttr: function( name ) {
8401		return this.each( function() {
8402			jQuery.removeAttr( this, name );
8403		} );
8404	}
8405} );
8406
8407jQuery.extend( {
8408	attr: function( elem, name, value ) {
8409		var ret, hooks,
8410			nType = elem.nodeType;
8411
8412		// Don't get/set attributes on text, comment and attribute nodes
8413		if ( nType === 3 || nType === 8 || nType === 2 ) {
8414			return;
8415		}
8416
8417		// Fallback to prop when attributes are not supported
8418		if ( typeof elem.getAttribute === "undefined" ) {
8419			return jQuery.prop( elem, name, value );
8420		}
8421
8422		// All attributes are lowercase
8423		// Grab necessary hook if one is defined
8424		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8425			name = name.toLowerCase();
8426			hooks = jQuery.attrHooks[ name ] ||
8427				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
8428		}
8429
8430		if ( value !== undefined ) {
8431			if ( value === null ) {
8432				jQuery.removeAttr( elem, name );
8433				return;
8434			}
8435
8436			if ( hooks && "set" in hooks &&
8437				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8438				return ret;
8439			}
8440
8441			elem.setAttribute( name, value + "" );
8442			return value;
8443		}
8444
8445		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8446			return ret;
8447		}
8448
8449		ret = jQuery.find.attr( elem, name );
8450
8451		// Non-existent attributes return null, we normalize to undefined
8452		return ret == null ? undefined : ret;
8453	},
8454
8455	attrHooks: {
8456		type: {
vendor: 4,457 bytes, lines 8457-8623
8457			set: function( elem, value ) {
8458				if ( !support.radioValue && value === "radio" &&
8459					jQuery.nodeName( elem, "input" ) ) {
8460
8461					// Setting the type on a radio button after the value resets the value in IE8-9
8462					// Reset value to default in case type is set after value during creation
8463					var val = elem.value;
8464					elem.setAttribute( "type", value );
8465					if ( val ) {
8466						elem.value = val;
8467					}
8468					return value;
8469				}
8470			}
8471		}
8472	},
8473
8474	removeAttr: function( elem, value ) {
8475		var name, propName,
8476			i = 0,
8477			attrNames = value && value.match( rnotwhite );
8478
8479		if ( attrNames && elem.nodeType === 1 ) {
8480			while ( ( name = attrNames[ i++ ] ) ) {
8481				propName = jQuery.propFix[ name ] || name;
8482
8483				// Boolean attributes get special treatment (#10870)
8484				if ( jQuery.expr.match.bool.test( name ) ) {
8485
8486					// Set corresponding property to false
8487					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
8488						elem[ propName ] = false;
8489
8490					// Support: IE<9
8491					// Also clear defaultChecked/defaultSelected (if appropriate)
8492					} else {
8493						elem[ jQuery.camelCase( "default-" + name ) ] =
8494							elem[ propName ] = false;
8495					}
8496
8497				// See #9699 for explanation of this approach (setting first, then removal)
8498				} else {
8499					jQuery.attr( elem, name, "" );
8500				}
8501
8502				elem.removeAttribute( getSetAttribute ? name : propName );
8503			}
8504		}
8505	}
8506} );
8507
8508// Hooks for boolean attributes
8509boolHook = {
8510	set: function( elem, value, name ) {
8511		if ( value === false ) {
8512
8513			// Remove boolean attributes when set to false
8514			jQuery.removeAttr( elem, name );
8515		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
8516
8517			// IE<8 needs the *property* name
8518			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
8519
8520		} else {
8521
8522			// Support: IE<9
8523			// Use defaultChecked and defaultSelected for oldIE
8524			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
8525		}
8526		return name;
8527	}
8528};
8529
8530jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
8531	var getter = attrHandle[ name ] || jQuery.find.attr;
8532
8533	if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
8534		attrHandle[ name ] = function( elem, name, isXML ) {
8535			var ret, handle;
8536			if ( !isXML ) {
8537
8538				// Avoid an infinite loop by temporarily removing this function from the getter
8539				handle = attrHandle[ name ];
8540				attrHandle[ name ] = ret;
8541				ret = getter( elem, name, isXML ) != null ?
8542					name.toLowerCase() :
8543					null;
8544				attrHandle[ name ] = handle;
8545			}
8546			return ret;
8547		};
8548	} else {
8549		attrHandle[ name ] = function( elem, name, isXML ) {
8550			if ( !isXML ) {
8551				return elem[ jQuery.camelCase( "default-" + name ) ] ?
8552					name.toLowerCase() :
8553					null;
8554			}
8555		};
8556	}
8557} );
8558
8559// fix oldIE attroperties
8560if ( !getSetInput || !getSetAttribute ) {
8561	jQuery.attrHooks.value = {
8562		set: function( elem, value, name ) {
8563			if ( jQuery.nodeName( elem, "input" ) ) {
8564
8565				// Does not return so that setAttribute is also used
8566				elem.defaultValue = value;
8567			} else {
8568
8569				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
8570				return nodeHook && nodeHook.set( elem, value, name );
8571			}
8572		}
8573	};
8574}
8575
8576// IE6/7 do not support getting/setting some attributes with get/setAttribute
8577if ( !getSetAttribute ) {
8578
8579	// Use this for any attribute in IE6/7
8580	// This fixes almost every IE6/7 issue
8581	nodeHook = {
8582		set: function( elem, value, name ) {
8583
8584			// Set the existing or create a new attribute node
8585			var ret = elem.getAttributeNode( name );
8586			if ( !ret ) {
8587				elem.setAttributeNode(
8588					( ret = elem.ownerDocument.createAttribute( name ) )
8589				);
8590			}
8591
8592			ret.value = value += "";
8593
8594			// Break association with cloned elements by also using setAttribute (#9646)
8595			if ( name === "value" || value === elem.getAttribute( name ) ) {
8596				return value;
8597			}
8598		}
8599	};
8600
8601	// Some attributes are constructed with empty-string values when not defined
8602	attrHandle.id = attrHandle.name = attrHandle.coords =
8603		function( elem, name, isXML ) {
8604			var ret;
8605			if ( !isXML ) {
8606				return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
8607					ret.value :
8608					null;
8609			}
8610		};
8611
8612	// Fixing value retrieval on a button requires this module
8613	jQuery.valHooks.button = {
8614		get: function( elem, name ) {
8615			var ret = elem.getAttributeNode( name );
8616			if ( ret && ret.specified ) {
8617				return ret.value;
8618			}
8619		},
8620		set: nodeHook.set
8621	};
8622
8623	// Set contenteditable to false on removals(#10429)
8624	// Setting to empty string throws an error as an invalid value
8625	jQuery.attrHooks.contenteditable = {
8626		set: function( elem, value, name ) {
8627			nodeHook.set( elem, value === "" ? false : value, name );
8628		}
8629	};
8630
8631	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
8632	// This is for removals
8633	jQuery.each( [ "width", "height" ], function( i, name ) {
8634		jQuery.attrHooks[ name ] = {
8635			set: function( elem, value ) {
8636				if ( value === "" ) {
8637					elem.setAttribute( name, "auto" );
8638					return value;
8639				}
8640			}
8641		};
8642	} );
8643}
8644
8645if ( !support.style ) {
8646	jQuery.attrHooks.style = {
8647		get: function( elem ) {
8648
8649			// Return undefined in the case of empty string
8650			// Note: IE uppercases css property names, but if we were to .toLowerCase()
8651			// .cssText, that would destroy case sensitivity in URL's, like in "background"
8652			return elem.style.cssText || undefined;
8653		},
8654		set: function( elem, value ) {
8655			return ( elem.style.cssText = value + "" );
8656		}
8657	};
8658}
8659
8660
8661
8662
8663var rfocusable = /^(?:input|select|textarea|button|object)$/i,
8664	rclickable = /^(?:a|area)$/i;
8665
8666jQuery.fn.extend( {
8667	prop: function( name, value ) {
8668		return access( this, jQuery.prop, name, value, arguments.length > 1 );
8669	},
8670
8671	removeProp: function( name ) {
8672		name = jQuery.propFix[ name ] || name;
8673		return this.each( function() {
8674
8675			// try/catch handles cases where IE balks (such as removing a property on window)
8676			try {
8677				this[ name ] = undefined;
8678				delete this[ name ];
8679			} catch ( e ) {}
8680		} );
8681	}
8682} );
8683
8684jQuery.extend( {
8685	prop: function( elem, name, value ) {
8686		var ret, hooks,
8687			nType = elem.nodeType;
8688
8689		// Don't get/set properties on text, comment and attribute nodes
8690		if ( nType === 3 || nType === 8 || nType === 2 ) {
8691			return;
8692		}
8693
8694		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8695
8696			// Fix name and attach hooks
8697			name = jQuery.propFix[ name ] || name;
8698			hooks = jQuery.propHooks[ name ];
8699		}
8700
8701		if ( value !== undefined ) {
8702			if ( hooks && "set" in hooks &&
8703				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8704				return ret;
8705			}
8706
8707			return ( elem[ name ] = value );
8708		}
8709
8710		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8711			return ret;
8712		}
8713
8714		return elem[ name ];
8715	},
8716
8717	propHooks: {
8718		tabIndex: {
8719			get: function( elem ) {
8720
8721				// elem.tabIndex doesn't always return the
8722				// correct value when it hasn't been explicitly set
8723				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8724				// Use proper attribute retrieval(#12072)
8725				var tabindex = jQuery.find.attr( elem, "tabindex" );
8726
8727				return tabindex ?
8728					parseInt( tabindex, 10 ) :
8729					rfocusable.test( elem.nodeName ) ||
8730						rclickable.test( elem.nodeName ) && elem.href ?
8731							0 :
8732							-1;
8733			}
8734		}
8735	},
8736
8737	propFix: {
8738		"for": "htmlFor",
8739		"class": "className"
8740	}
8741} );
8742
8743// Some attributes require a special call on IE
8744// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
8745if ( !support.hrefNormalized ) {
8746
8747	// href/src property should get the full normalized URL (#10299/#12915)
8748	jQuery.each( [ "href", "src" ], function( i, name ) {
8749		jQuery.propHooks[ name ] = {
8750			get: function( elem ) {
8751				return elem.getAttribute( name, 4 );
8752			}
8753		};
8754	} );
8755}
8756
8757// Support: Safari, IE9+
8758// Accessing the selectedIndex property
8759// forces the browser to respect setting selected
8760// on the option
8761// The getter ensures a default option is selected
8762// when in an optgroup
8763if ( !support.optSelected ) {
8764	jQuery.propHooks.selected = {
8765		get: function( elem ) {
8766			var parent = elem.parentNode;
8767
8768			if ( parent ) {
8769				parent.selectedIndex;
8770
8771				// Make sure that it also works with optgroups, see #5701
8772				if ( parent.parentNode ) {
8773					parent.parentNode.selectedIndex;
8774				}
8775			}
8776			return null;
8777		},
8778		set: function( elem ) {
8779			var parent = elem.parentNode;
8780			if ( parent ) {
8781				parent.selectedIndex;
8782
8783				if ( parent.parentNode ) {
8784					parent.parentNode.selectedIndex;
8785				}
8786			}
8787		}
8788	};
8789}
8790
8791jQuery.each( [
8792	"tabIndex",
8793	"readOnly",
8794	"maxLength",
8795	"cellSpacing",
8796	"cellPadding",
8797	"rowSpan",
8798	"colSpan",
8799	"useMap",
8800	"frameBorder",
8801	"contentEditable"
8802], function() {
8803	jQuery.propFix[ this.toLowerCase() ] = this;
8804} );
8805
8806// IE6/7 call enctype encoding
8807if ( !support.enctype ) {
8808	jQuery.propFix.enctype = "encoding";
8809}
8810
8811
8812
8813
8814var rclass = /[\t\r\n\f]/g;
8815
8816function getClass( elem ) {
8817	return jQuery.attr( elem, "class" ) || "";
8818}
8819
8820jQuery.fn.extend( {
8821	addClass: function( value ) {
8822		var classes, elem, cur, curValue, clazz, j, finalValue,
8823			i = 0;
8824
8825		if ( jQuery.isFunction( value ) ) {
8826			return this.each( function( j ) {
8827				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8828			} );
8829		}
8830
8831		if ( typeof value === "string" && value ) {
8832			classes = value.match( rnotwhite ) || [];
8833
8834			while ( ( elem = this[ i++ ] ) ) {
8835				curValue = getClass( elem );
8836				cur = elem.nodeType === 1 &&
8837					( " " + curValue + " " ).replace( rclass, " " );
8838
8839				if ( cur ) {
8840					j = 0;
8841					while ( ( clazz = classes[ j++ ] ) ) {
8842						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8843							cur += clazz + " ";
8844						}
8845					}
8846
8847					// only assign if different to avoid unneeded rendering.
8848					finalValue = jQuery.trim( cur );
8849					if ( curValue !== finalValue ) {
8850						jQuery.attr( elem, "class", finalValue );
8851					}
8852				}
8853			}
8854		}
8855
8856		return this;
8857	},
8858
8859	removeClass: function( value ) {
8860		var classes, elem, cur, curValue, clazz, j, finalValue,
8861			i = 0;
8862
8863		if ( jQuery.isFunction( value ) ) {
8864			return this.each( function( j ) {
8865				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8866			} );
8867		}
8868
8869		if ( !arguments.length ) {
8870			return this.attr( "class", "" );
8871		}
8872
8873		if ( typeof value === "string" && value ) {
8874			classes = value.match( rnotwhite ) || [];
8875
8876			while ( ( elem = this[ i++ ] ) ) {
8877				curValue = getClass( elem );
8878
8879				// This expression is here for better compressibility (see addClass)
8880				cur = elem.nodeType === 1 &&
8881					( " " + curValue + " " ).replace( rclass, " " );
8882
8883				if ( cur ) {
8884					j = 0;
8885					while ( ( clazz = classes[ j++ ] ) ) {
8886
8887						// Remove *all* instances
8888						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8889							cur = cur.replace( " " + clazz + " ", " " );
8890						}
8891					}
8892
8893					// Only assign if different to avoid unneeded rendering.
8894					finalValue = jQuery.trim( cur );
8895					if ( curValue !== finalValue ) {
8896						jQuery.attr( elem, "class", finalValue );
8897					}
8898				}
8899			}
8900		}
8901
8902		return this;
8903	},
8904
8905	toggleClass: function( value, stateVal ) {
8906		var type = typeof value;
8907
8908		if ( typeof stateVal === "boolean" && type === "string" ) {
8909			return stateVal ? this.addClass( value ) : this.removeClass( value );
8910		}
8911
8912		if ( jQuery.isFunction( value ) ) {
8913			return this.each( function( i ) {
8914				jQuery( this ).toggleClass(
8915					value.call( this, i, getClass( this ), stateVal ),
8916					stateVal
8917				);
8918			} );
8919		}
8920
8921		return this.each( function() {
8922			var className, i, self, classNames;
8923
8924			if ( type === "string" ) {
8925
8926				// Toggle individual class names
8927				i = 0;
8928				self = jQuery( this );
8929				classNames = value.match( rnotwhite ) || [];
8930
8931				while ( ( className = classNames[ i++ ] ) ) {
8932
8933					// Check each className given, space separated list
8934					if ( self.hasClass( className ) ) {
8935						self.removeClass( className );
8936					} else {
8937						self.addClass( className );
8938					}
8939				}
8940
8941			// Toggle whole class name
8942			} else if ( value === undefined || type === "boolean" ) {
8943				className = getClass( this );
8944				if ( className ) {
8945
8946					// store className if set
8947					jQuery._data( this, "__className__", className );
8948				}
8949
8950				// If the element has a class name or if we're passed "false",
8951				// then remove the whole classname (if there was one, the above saved it).
8952				// Otherwise bring back whatever was previously saved (if anything),
8953				// falling back to the empty string if nothing was stored.
8954				jQuery.attr( this, "class",
8955					className || value === false ?
8956					"" :
8957					jQuery._data( this, "__className__" ) || ""
8958				);
8959			}
8960		} );
8961	},
8962
8963	hasClass: function( selector ) {
8964		var className, elem,
8965			i = 0;
8966
8967		className = " " + selector + " ";
8968		while ( ( elem = this[ i++ ] ) ) {
8969			if ( elem.nodeType === 1 &&
8970				( " " + getClass( elem ) + " " ).replace( rclass, " " )
8971					.indexOf( className ) > -1
8972			) {
8973				return true;
8974			}
8975		}
8976
8977		return false;
8978	}
8979} );
8980
8981
8982
8983
8984// Return jQuery for attributes-only inclusion
8985
8986
8987jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
8988	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8989	"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
8990	function( i, name ) {
8991
8992	// Handle event binding
8993	jQuery.fn[ name ] = function( data, fn ) {
8994		return arguments.length > 0 ?
8995			this.on( name, null, data, fn ) :
8996			this.trigger( name );
8997	};
8998} );
8999
9000jQuery.fn.extend( {
9001	hover: function( fnOver, fnOut ) {
9002		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
9003	}
9004} );
9005
9006
9007var location = window.location;
9008
9009var nonce = jQuery.now();
9010
9011var rquery = ( /\?/ );
9012
9013
9014
9015var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
9016
9017jQuery.parseJSON = function( data ) {
9018
9019	// Attempt to parse using the native JSON parser first
9020	if ( window.JSON && window.JSON.parse ) {
9021
9022		// Support: Android 2.3
9023		// Workaround failure to string-cast null input
9024		return window.JSON.parse( data + "" );
9025	}
9026
9027	var requireNonComma,
9028		depth = null,
9029		str = jQuery.trim( data + "" );
9030
9031	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
9032	// after removing valid tokens
9033	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
9034
9035		// Force termination if we see a misplaced comma
9036		if ( requireNonComma && comma ) {
9037			depth = 0;
9038		}
9039
9040		// Perform no more replacements after returning to outermost depth
9041		if ( depth === 0 ) {
9042			return token;
9043		}
9044
9045		// Commas must not follow "[", "{", or ","
9046		requireNonComma = open || comma;
9047
9048		// Determine new depth
9049		// array/object open ("[" or "{"): depth += true - false (increment)
9050		// array/object close ("]" or "}"): depth += false - true (decrement)
9051		// other cases ("," or primitive): depth += true - true (numeric cast)
9052		depth += !close - !open;
9053
9054		// Remove this token
9055		return "";
9056	} ) ) ?
9057		( Function( "return " + str ) )() :
9058		jQuery.error( "Invalid JSON: " + data );
9059};
9060
9061
9062// Cross-browser xml parsing
vendor: 10,551 bytes, lines 9063-9473
9063jQuery.parseXML = function( data ) {
9064	var xml, tmp;
9065	if ( !data || typeof data !== "string" ) {
9066		return null;
9067	}
9068	try {
9069		if ( window.DOMParser ) { // Standard
9070			tmp = new window.DOMParser();
9071			xml = tmp.parseFromString( data, "text/xml" );
9072		} else { // IE
9073			xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
9074			xml.async = "false";
9075			xml.loadXML( data );
9076		}
9077	} catch ( e ) {
9078		xml = undefined;
9079	}
9080	if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
9081		jQuery.error( "Invalid XML: " + data );
9082	}
9083	return xml;
9084};
9085
9086
9087var
9088	rhash = /#.*$/,
9089	rts = /([?&])_=[^&]*/,
9090
9091	// IE leaves an \r character at EOL
9092	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
9093
9094	// #7653, #8125, #8152: local protocol detection
9095	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
9096	rnoContent = /^(?:GET|HEAD)$/,
9097	rprotocol = /^\/\//,
9098	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
9099
9100	/* Prefilters
9101	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
9102	 * 2) These are called:
9103	 *    - BEFORE asking for a transport
9104	 *    - AFTER param serialization (s.data is a string if s.processData is true)
9105	 * 3) key is the dataType
9106	 * 4) the catchall symbol "*" can be used
9107	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
9108	 */
9109	prefilters = {},
9110
9111	/* Transports bindings
9112	 * 1) key is the dataType
9113	 * 2) the catchall symbol "*" can be used
9114	 * 3) selection will start with transport dataType and THEN go to "*" if needed
9115	 */
9116	transports = {},
9117
9118	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
9119	allTypes = "*/".concat( "*" ),
9120
9121	// Document location
9122	ajaxLocation = location.href,
9123
9124	// Segment location into parts
9125	ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
9126
9127// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
9128function addToPrefiltersOrTransports( structure ) {
9129
9130	// dataTypeExpression is optional and defaults to "*"
9131	return function( dataTypeExpression, func ) {
9132
9133		if ( typeof dataTypeExpression !== "string" ) {
9134			func = dataTypeExpression;
9135			dataTypeExpression = "*";
9136		}
9137
9138		var dataType,
9139			i = 0,
9140			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
9141
9142		if ( jQuery.isFunction( func ) ) {
9143
9144			// For each dataType in the dataTypeExpression
9145			while ( ( dataType = dataTypes[ i++ ] ) ) {
9146
9147				// Prepend if requested
9148				if ( dataType.charAt( 0 ) === "+" ) {
9149					dataType = dataType.slice( 1 ) || "*";
9150					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
9151
9152				// Otherwise append
9153				} else {
9154					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
9155				}
9156			}
9157		}
9158	};
9159}
9160
9161// Base inspection function for prefilters and transports
9162function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
9163
9164	var inspected = {},
9165		seekingTransport = ( structure === transports );
9166
9167	function inspect( dataType ) {
9168		var selected;
9169		inspected[ dataType ] = true;
9170		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
9171			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
9172			if ( typeof dataTypeOrTransport === "string" &&
9173				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
9174
9175				options.dataTypes.unshift( dataTypeOrTransport );
9176				inspect( dataTypeOrTransport );
9177				return false;
9178			} else if ( seekingTransport ) {
9179				return !( selected = dataTypeOrTransport );
9180			}
9181		} );
9182		return selected;
9183	}
9184
9185	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
9186}
9187
9188// A special extend for ajax options
9189// that takes "flat" options (not to be deep extended)
9190// Fixes #9887
9191function ajaxExtend( target, src ) {
9192	var deep, key,
9193		flatOptions = jQuery.ajaxSettings.flatOptions || {};
9194
9195	for ( key in src ) {
9196		if ( src[ key ] !== undefined ) {
9197			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
9198		}
9199	}
9200	if ( deep ) {
9201		jQuery.extend( true, target, deep );
9202	}
9203
9204	return target;
9205}
9206
9207/* Handles responses to an ajax request:
9208 * - finds the right dataType (mediates between content-type and expected dataType)
9209 * - returns the corresponding response
9210 */
9211function ajaxHandleResponses( s, jqXHR, responses ) {
9212	var firstDataType, ct, finalDataType, type,
9213		contents = s.contents,
9214		dataTypes = s.dataTypes;
9215
9216	// Remove auto dataType and get content-type in the process
9217	while ( dataTypes[ 0 ] === "*" ) {
9218		dataTypes.shift();
9219		if ( ct === undefined ) {
9220			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
9221		}
9222	}
9223
9224	// Check if we're dealing with a known content-type
9225	if ( ct ) {
9226		for ( type in contents ) {
9227			if ( contents[ type ] && contents[ type ].test( ct ) ) {
9228				dataTypes.unshift( type );
9229				break;
9230			}
9231		}
9232	}
9233
9234	// Check to see if we have a response for the expected dataType
9235	if ( dataTypes[ 0 ] in responses ) {
9236		finalDataType = dataTypes[ 0 ];
9237	} else {
9238
9239		// Try convertible dataTypes
9240		for ( type in responses ) {
9241			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
9242				finalDataType = type;
9243				break;
9244			}
9245			if ( !firstDataType ) {
9246				firstDataType = type;
9247			}
9248		}
9249
9250		// Or just use first one
9251		finalDataType = finalDataType || firstDataType;
9252	}
9253
9254	// If we found a dataType
9255	// We add the dataType to the list if needed
9256	// and return the corresponding response
9257	if ( finalDataType ) {
9258		if ( finalDataType !== dataTypes[ 0 ] ) {
9259			dataTypes.unshift( finalDataType );
9260		}
9261		return responses[ finalDataType ];
9262	}
9263}
9264
9265/* Chain conversions given the request and the original response
9266 * Also sets the responseXXX fields on the jqXHR instance
9267 */
9268function ajaxConvert( s, response, jqXHR, isSuccess ) {
9269	var conv2, current, conv, tmp, prev,
9270		converters = {},
9271
9272		// Work with a copy of dataTypes in case we need to modify it for conversion
9273		dataTypes = s.dataTypes.slice();
9274
9275	// Create converters map with lowercased keys
9276	if ( dataTypes[ 1 ] ) {
9277		for ( conv in s.converters ) {
9278			converters[ conv.toLowerCase() ] = s.converters[ conv ];
9279		}
9280	}
9281
9282	current = dataTypes.shift();
9283
9284	// Convert to each sequential dataType
9285	while ( current ) {
9286
9287		if ( s.responseFields[ current ] ) {
9288			jqXHR[ s.responseFields[ current ] ] = response;
9289		}
9290
9291		// Apply the dataFilter if provided
9292		if ( !prev && isSuccess && s.dataFilter ) {
9293			response = s.dataFilter( response, s.dataType );
9294		}
9295
9296		prev = current;
9297		current = dataTypes.shift();
9298
9299		if ( current ) {
9300
9301			// There's only work to do if current dataType is non-auto
9302			if ( current === "*" ) {
9303
9304				current = prev;
9305
9306			// Convert response if prev dataType is non-auto and differs from current
9307			} else if ( prev !== "*" && prev !== current ) {
9308
9309				// ADDED by Joomla: Mitigate possible XSS vulnerability (gh-2432), CMS Issue 19464
9310				if (s.crossDomain && current === "script") {
9311					continue;
9312				}
9313
9314				// Seek a direct converter
9315				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
9316
9317				// If none found, seek a pair
9318				if ( !conv ) {
9319					for ( conv2 in converters ) {
9320
9321						// If conv2 outputs current
9322						tmp = conv2.split( " " );
9323						if ( tmp[ 1 ] === current ) {
9324
9325							// If prev can be converted to accepted input
9326							conv = converters[ prev + " " + tmp[ 0 ] ] ||
9327								converters[ "* " + tmp[ 0 ] ];
9328							if ( conv ) {
9329
9330								// Condense equivalence converters
9331								if ( conv === true ) {
9332									conv = converters[ conv2 ];
9333
9334								// Otherwise, insert the intermediate dataType
9335								} else if ( converters[ conv2 ] !== true ) {
9336									current = tmp[ 0 ];
9337									dataTypes.unshift( tmp[ 1 ] );
9338								}
9339								break;
9340							}
9341						}
9342					}
9343				}
9344
9345				// Apply converter (if not an equivalence)
9346				if ( conv !== true ) {
9347
9348					// Unless errors are allowed to bubble, catch and return them
9349					if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
9350						response = conv( response );
9351					} else {
9352						try {
9353							response = conv( response );
9354						} catch ( e ) {
9355							return {
9356								state: "parsererror",
9357								error: conv ? e : "No conversion from " + prev + " to " + current
9358							};
9359						}
9360					}
9361				}
9362			}
9363		}
9364	}
9365
9366	return { state: "success", data: response };
9367}
9368
9369jQuery.extend( {
9370
9371	// Counter for holding the number of active queries
9372	active: 0,
9373
9374	// Last-Modified header cache for next request
9375	lastModified: {},
9376	etag: {},
9377
9378	ajaxSettings: {
9379		url: ajaxLocation,
9380		type: "GET",
9381		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
9382		global: true,
9383		processData: true,
9384		async: true,
9385		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9386		/*
9387		timeout: 0,
9388		data: null,
9389		dataType: null,
9390		username: null,
9391		password: null,
9392		cache: null,
9393		throws: false,
9394		traditional: false,
9395		headers: {},
9396		*/
9397
9398		accepts: {
9399			"*": allTypes,
9400			text: "text/plain",
9401			html: "text/html",
9402			xml: "application/xml, text/xml",
9403			json: "application/json, text/javascript"
9404		},
9405
9406		contents: {
9407			xml: /\bxml\b/,
9408			html: /\bhtml/,
9409			json: /\bjson\b/
9410		},
9411
9412		responseFields: {
9413			xml: "responseXML",
9414			text: "responseText",
9415			json: "responseJSON"
9416		},
9417
9418		// Data converters
9419		// Keys separate source (or catchall "*") and destination types with a single space
9420		converters: {
9421
9422			// Convert anything to text
9423			"* text": String,
9424
9425			// Text to html (true = no transformation)
9426			"text html": true,
9427
9428			// Evaluate text as a json expression
9429			"text json": jQuery.parseJSON,
9430
9431			// Parse text as xml
9432			"text xml": jQuery.parseXML
9433		},
9434
9435		// For options that shouldn't be deep extended:
9436		// you can add your own custom options here if
9437		// and when you create one that shouldn't be
9438		// deep extended (see ajaxExtend)
9439		flatOptions: {
9440			url: true,
9441			context: true
9442		}
9443	},
9444
9445	// Creates a full fledged settings object into target
9446	// with both ajaxSettings and settings fields.
9447	// If target is omitted, writes into ajaxSettings.
9448	ajaxSetup: function( target, settings ) {
9449		return settings ?
9450
9451			// Building a settings object
9452			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9453
9454			// Extending ajaxSettings
9455			ajaxExtend( jQuery.ajaxSettings, target );
9456	},
9457
9458	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9459	ajaxTransport: addToPrefiltersOrTransports( transports ),
9460
9461	// Main method
9462	ajax: function( url, options ) {
9463
9464		// If url is an object, simulate pre-1.5 signature
9465		if ( typeof url === "object" ) {
9466			options = url;
9467			url = undefined;
9468		}
9469
9470		// Force options to be an object
9471		options = options || {};
9472
9473		var
vendor: 5,146 bytes, lines 9474-9664
9474
9475			// Cross-domain detection vars
9476			parts,
9477
9478			// Loop variable
9479			i,
9480
9481			// URL without anti-cache param
9482			cacheURL,
9483
9484			// Response headers as string
9485			responseHeadersString,
9486
9487			// timeout handle
9488			timeoutTimer,
9489
9490			// To know if global events are to be dispatched
9491			fireGlobals,
9492
9493			transport,
9494
9495			// Response headers
9496			responseHeaders,
9497
9498			// Create the final options object
9499			s = jQuery.ajaxSetup( {}, options ),
9500
9501			// Callbacks context
9502			callbackContext = s.context || s,
9503
9504			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9505			globalEventContext = s.context &&
9506				( callbackContext.nodeType || callbackContext.jquery ) ?
9507					jQuery( callbackContext ) :
9508					jQuery.event,
9509
9510			// Deferreds
9511			deferred = jQuery.Deferred(),
9512			completeDeferred = jQuery.Callbacks( "once memory" ),
9513
9514			// Status-dependent callbacks
9515			statusCode = s.statusCode || {},
9516
9517			// Headers (they are sent all at once)
9518			requestHeaders = {},
9519			requestHeadersNames = {},
9520
9521			// The jqXHR state
9522			state = 0,
9523
9524			// Default abort message
9525			strAbort = "canceled",
9526
9527			// Fake xhr
9528			jqXHR = {
9529				readyState: 0,
9530
9531				// Builds headers hashtable if needed
9532				getResponseHeader: function( key ) {
9533					var match;
9534					if ( state === 2 ) {
9535						if ( !responseHeaders ) {
9536							responseHeaders = {};
9537							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9538								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9539							}
9540						}
9541						match = responseHeaders[ key.toLowerCase() ];
9542					}
9543					return match == null ? null : match;
9544				},
9545
9546				// Raw string
9547				getAllResponseHeaders: function() {
9548					return state === 2 ? responseHeadersString : null;
9549				},
9550
9551				// Caches the header
9552				setRequestHeader: function( name, value ) {
9553					var lname = name.toLowerCase();
9554					if ( !state ) {
9555						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
9556						requestHeaders[ name ] = value;
9557					}
9558					return this;
9559				},
9560
9561				// Overrides response content-type header
9562				overrideMimeType: function( type ) {
9563					if ( !state ) {
9564						s.mimeType = type;
9565					}
9566					return this;
9567				},
9568
9569				// Status-dependent callbacks
9570				statusCode: function( map ) {
9571					var code;
9572					if ( map ) {
9573						if ( state < 2 ) {
9574							for ( code in map ) {
9575
9576								// Lazy-add the new callback in a way that preserves old ones
9577								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9578							}
9579						} else {
9580
9581							// Execute the appropriate callbacks
9582							jqXHR.always( map[ jqXHR.status ] );
9583						}
9584					}
9585					return this;
9586				},
9587
9588				// Cancel the request
9589				abort: function( statusText ) {
9590					var finalText = statusText || strAbort;
9591					if ( transport ) {
9592						transport.abort( finalText );
9593					}
9594					done( 0, finalText );
9595					return this;
9596				}
9597			};
9598
9599		// Attach deferreds
9600		deferred.promise( jqXHR ).complete = completeDeferred.add;
9601		jqXHR.success = jqXHR.done;
9602		jqXHR.error = jqXHR.fail;
9603
9604		// Remove hash character (#7531: and string promotion)
9605		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
9606		// Handle falsy url in the settings object (#10093: consistency with old signature)
9607		// We also use the url parameter if available
9608		s.url = ( ( url || s.url || ajaxLocation ) + "" )
9609			.replace( rhash, "" )
9610			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
9611
9612		// Alias method option to type as per ticket #12004
9613		s.type = options.method || options.type || s.method || s.type;
9614
9615		// Extract dataTypes list
9616		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
9617
9618		// A cross-domain request is in order when we have a protocol:host:port mismatch
9619		if ( s.crossDomain == null ) {
9620			parts = rurl.exec( s.url.toLowerCase() );
9621			s.crossDomain = !!( parts &&
9622				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
9623					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
9624						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
9625			);
9626		}
9627
9628		// Convert data if not already a string
9629		if ( s.data && s.processData && typeof s.data !== "string" ) {
9630			s.data = jQuery.param( s.data, s.traditional );
9631		}
9632
9633		// Apply prefilters
9634		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9635
9636		// If request was aborted inside a prefilter, stop there
9637		if ( state === 2 ) {
9638			return jqXHR;
9639		}
9640
9641		// We can fire global events as of now if asked to
9642		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9643		fireGlobals = jQuery.event && s.global;
9644
9645		// Watch for a new set of requests
9646		if ( fireGlobals && jQuery.active++ === 0 ) {
9647			jQuery.event.trigger( "ajaxStart" );
9648		}
9649
9650		// Uppercase the type
9651		s.type = s.type.toUpperCase();
9652
9653		// Determine if request has content
9654		s.hasContent = !rnoContent.test( s.type );
9655
9656		// Save the URL in case we're toying with the If-Modified-Since
9657		// and/or If-None-Match header later on
9658		cacheURL = s.url;
9659
9660		// More options handling for requests with no content
9661		if ( !s.hasContent ) {
9662
9663			// If data is available, append data to url
9664			if ( s.data ) {
vendor: 8,244 bytes, lines 9665-10004
9665				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
9666
9667				// #9682: remove data so that it's not used in an eventual retry
9668				delete s.data;
9669			}
9670
9671			// Add anti-cache in url if needed
9672			if ( s.cache === false ) {
9673				s.url = rts.test( cacheURL ) ?
9674
9675					// If there is already a '_' parameter, set its value
9676					cacheURL.replace( rts, "$1_=" + nonce++ ) :
9677
9678					// Otherwise add one to the end
9679					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
9680			}
9681		}
9682
9683		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9684		if ( s.ifModified ) {
9685			if ( jQuery.lastModified[ cacheURL ] ) {
9686				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9687			}
9688			if ( jQuery.etag[ cacheURL ] ) {
9689				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9690			}
9691		}
9692
9693		// Set the correct header, if data is being sent
9694		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9695			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9696		}
9697
9698		// Set the Accepts header for the server, depending on the dataType
9699		jqXHR.setRequestHeader(
9700			"Accept",
9701			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9702				s.accepts[ s.dataTypes[ 0 ] ] +
9703					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9704				s.accepts[ "*" ]
9705		);
9706
9707		// Check for headers option
9708		for ( i in s.headers ) {
9709			jqXHR.setRequestHeader( i, s.headers[ i ] );
9710		}
9711
9712		// Allow custom headers/mimetypes and early abort
9713		if ( s.beforeSend &&
9714			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
9715
9716			// Abort if not done already and return
9717			return jqXHR.abort();
9718		}
9719
9720		// aborting is no longer a cancellation
9721		strAbort = "abort";
9722
9723		// Install callbacks on deferreds
9724		for ( i in { success: 1, error: 1, complete: 1 } ) {
9725			jqXHR[ i ]( s[ i ] );
9726		}
9727
9728		// Get transport
9729		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9730
9731		// If no transport, we auto-abort
9732		if ( !transport ) {
9733			done( -1, "No Transport" );
9734		} else {
9735			jqXHR.readyState = 1;
9736
9737			// Send global event
9738			if ( fireGlobals ) {
9739				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9740			}
9741
9742			// If request was aborted inside ajaxSend, stop there
9743			if ( state === 2 ) {
9744				return jqXHR;
9745			}
9746
9747			// Timeout
9748			if ( s.async && s.timeout > 0 ) {
9749				timeoutTimer = window.setTimeout( function() {
9750					jqXHR.abort( "timeout" );
9751				}, s.timeout );
9752			}
9753
9754			try {
9755				state = 1;
9756				transport.send( requestHeaders, done );
9757			} catch ( e ) {
9758
9759				// Propagate exception as error if not done
9760				if ( state < 2 ) {
9761					done( -1, e );
9762
9763				// Simply rethrow otherwise
9764				} else {
9765					throw e;
9766				}
9767			}
9768		}
9769
9770		// Callback for when everything is done
9771		function done( status, nativeStatusText, responses, headers ) {
9772			var isSuccess, success, error, response, modified,
9773				statusText = nativeStatusText;
9774
9775			// Called once
9776			if ( state === 2 ) {
9777				return;
9778			}
9779
9780			// State is "done" now
9781			state = 2;
9782
9783			// Clear timeout if it exists
9784			if ( timeoutTimer ) {
9785				window.clearTimeout( timeoutTimer );
9786			}
9787
9788			// Dereference transport for early garbage collection
9789			// (no matter how long the jqXHR object will be used)
9790			transport = undefined;
9791
9792			// Cache response headers
9793			responseHeadersString = headers || "";
9794
9795			// Set readyState
9796			jqXHR.readyState = status > 0 ? 4 : 0;
9797
9798			// Determine if successful
9799			isSuccess = status >= 200 && status < 300 || status === 304;
9800
9801			// Get response data
9802			if ( responses ) {
9803				response = ajaxHandleResponses( s, jqXHR, responses );
9804			}
9805
9806			// Convert no matter what (that way responseXXX fields are always set)
9807			response = ajaxConvert( s, response, jqXHR, isSuccess );
9808
9809			// If successful, handle type chaining
9810			if ( isSuccess ) {
9811
9812				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9813				if ( s.ifModified ) {
9814					modified = jqXHR.getResponseHeader( "Last-Modified" );
9815					if ( modified ) {
9816						jQuery.lastModified[ cacheURL ] = modified;
9817					}
9818					modified = jqXHR.getResponseHeader( "etag" );
9819					if ( modified ) {
9820						jQuery.etag[ cacheURL ] = modified;
9821					}
9822				}
9823
9824				// if no content
9825				if ( status === 204 || s.type === "HEAD" ) {
9826					statusText = "nocontent";
9827
9828				// if not modified
9829				} else if ( status === 304 ) {
9830					statusText = "notmodified";
9831
9832				// If we have data, let's convert it
9833				} else {
9834					statusText = response.state;
9835					success = response.data;
9836					error = response.error;
9837					isSuccess = !error;
9838				}
9839			} else {
9840
9841				// We extract error from statusText
9842				// then normalize statusText and status for non-aborts
9843				error = statusText;
9844				if ( status || !statusText ) {
9845					statusText = "error";
9846					if ( status < 0 ) {
9847						status = 0;
9848					}
9849				}
9850			}
9851
9852			// Set data for the fake xhr object
9853			jqXHR.status = status;
9854			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9855
9856			// Success/Error
9857			if ( isSuccess ) {
9858				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9859			} else {
9860				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9861			}
9862
9863			// Status-dependent callbacks
9864			jqXHR.statusCode( statusCode );
9865			statusCode = undefined;
9866
9867			if ( fireGlobals ) {
9868				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9869					[ jqXHR, s, isSuccess ? success : error ] );
9870			}
9871
9872			// Complete
9873			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9874
9875			if ( fireGlobals ) {
9876				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9877
9878				// Handle the global AJAX counter
9879				if ( !( --jQuery.active ) ) {
9880					jQuery.event.trigger( "ajaxStop" );
9881				}
9882			}
9883		}
9884
9885		return jqXHR;
9886	},
9887
9888	getJSON: function( url, data, callback ) {
9889		return jQuery.get( url, data, callback, "json" );
9890	},
9891
9892	getScript: function( url, callback ) {
9893		return jQuery.get( url, undefined, callback, "script" );
9894	}
9895} );
9896
9897jQuery.each( [ "get", "post" ], function( i, method ) {
9898	jQuery[ method ] = function( url, data, callback, type ) {
9899
9900		// shift arguments if data argument was omitted
9901		if ( jQuery.isFunction( data ) ) {
9902			type = type || callback;
9903			callback = data;
9904			data = undefined;
9905		}
9906
9907		// The url can be an options object (which then must have .url)
9908		return jQuery.ajax( jQuery.extend( {
9909			url: url,
9910			type: method,
9911			dataType: type,
9912			data: data,
9913			success: callback
9914		}, jQuery.isPlainObject( url ) && url ) );
9915	};
9916} );
9917
9918
9919jQuery._evalUrl = function( url ) {
9920	return jQuery.ajax( {
9921		url: url,
9922
9923		// Make this explicit, since user can override this through ajaxSetup (#11264)
9924		type: "GET",
9925		dataType: "script",
9926		cache: true,
9927		async: false,
9928		global: false,
9929		"throws": true
9930	} );
9931};
9932
9933
9934jQuery.fn.extend( {
9935	wrapAll: function( html ) {
9936		if ( jQuery.isFunction( html ) ) {
9937			return this.each( function( i ) {
9938				jQuery( this ).wrapAll( html.call( this, i ) );
9939			} );
9940		}
9941
9942		if ( this[ 0 ] ) {
9943
9944			// The elements to wrap the target around
9945			var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9946
9947			if ( this[ 0 ].parentNode ) {
9948				wrap.insertBefore( this[ 0 ] );
9949			}
9950
9951			wrap.map( function() {
9952				var elem = this;
9953
9954				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
9955					elem = elem.firstChild;
9956				}
9957
9958				return elem;
9959			} ).append( this );
9960		}
9961
9962		return this;
9963	},
9964
9965	wrapInner: function( html ) {
9966		if ( jQuery.isFunction( html ) ) {
9967			return this.each( function( i ) {
9968				jQuery( this ).wrapInner( html.call( this, i ) );
9969			} );
9970		}
9971
9972		return this.each( function() {
9973			var self = jQuery( this ),
9974				contents = self.contents();
9975
9976			if ( contents.length ) {
9977				contents.wrapAll( html );
9978
9979			} else {
9980				self.append( html );
9981			}
9982		} );
9983	},
9984
9985	wrap: function( html ) {
9986		var isFunction = jQuery.isFunction( html );
9987
9988		return this.each( function( i ) {
9989			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
9990		} );
9991	},
9992
9993	unwrap: function() {
9994		return this.parent().each( function() {
9995			if ( !jQuery.nodeName( this, "body" ) ) {
9996				jQuery( this ).replaceWith( this.childNodes );
9997			}
9998		} ).end();
9999	}
10000} );
10001
10002
10003function getDisplay( elem ) {
10004	return elem.style && elem.style.display || jQuery.css( elem, "dis
10004play" );
10005}
10006
10007function filterHidden( elem ) {
10008
10009	// Disconnected elements are considered hidden
10010	if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {
10011		return true;
10012	}
10013	while ( elem && elem.nodeType === 1 ) {
10014		if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
10015			return true;
10016		}
10017		elem = elem.parentNode;
10018	}
10019	return false;
10020}
10021
10022jQuery.expr.filters.hidden = function( elem ) {
10023
10024	// Support: Opera <= 12.12
10025	// Opera reports offsetWidths and offsetHeights less than zero on some elements
10026	return support.reliableHiddenOffsets() ?
10027		( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
10028			!elem.getClientRects().length ) :
10029			filterHidden( elem );
10030};
10031
10032jQuery.expr.filters.visible = function( elem ) {
10033	return !jQuery.expr.filters.hidden( elem );
10034};
10035
10036
10037
10038
10039var r20 = /%20/g,
10040	rbracket = /\[\]$/,
10041	rCRLF = /\r?\n/g,
10042	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
10043	rsubmittable = /^(?:input|select|textarea|keygen)/i;
10044
10045function buildParams( prefix, obj, traditional, add ) {
10046	var name;
10047
10048	if ( jQuery.isArray( obj ) ) {
10049
10050		// Serialize array item.
10051		jQuery.each( obj, function( i, v ) {
10052			if ( traditional || rbracket.test( prefix ) ) {
10053
10054				// Treat each array item as a scalar.
10055				add( prefix, v );
10056
10057			} else {
10058
10059				// Item is non-scalar (array or object), encode its numeric index.
10060				buildParams(
10061					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
10062					v,
10063					traditional,
10064					add
10065				);
10066			}
10067		} );
10068
10069	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
10070
10071		// Serialize object item.
10072		for ( name in obj ) {
10073			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
10074		}
10075
10076	} else {
10077
10078		// Serialize scalar item.
10079		add( prefix, obj );
10080	}
10081}
10082
10083// Serialize an array of form elements or a set of
10084// key/values into a query string
10085jQuery.param = function( a, traditional ) {
10086	var prefix,
10087		s = [],
10088		add = function( key, value ) {
10089
10090			// If value is a function, invoke it and return its value
10091			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
10092			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
10093		};
10094
10095	// Set traditional to true for jQuery <= 1.3.2 behavior.
10096	if ( traditional === undefined ) {
10097		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
10098	}
10099
10100	// If an array was passed in, assume that it is an array of form elements.
10101	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
10102
10103		// Serialize the form elements
10104		jQuery.each( a, function() {
10105			add( this.name, this.value );
10106		} );
10107
10108	} else {
10109
10110		// If traditional, encode the "old" way (the way 1.3.2 or older
10111		// did it), otherwise encode params recursively.
10112		for ( prefix in a ) {
10113			buildParams( prefix, a[ prefix ], traditional, add );
10114		}
10115	}
10116
10117	// Return the resulting serialization
10118	return s.join( "&" ).replace( r20, "+" );
10119};
10120
10121jQuery.fn.extend( {
10122	serialize: function() {
10123		return jQuery.param( this.serializeArray() );
10124	},
10125	serializeArray: function() {
10126		return this.map( function() {
10127
10128			// Can add propHook for "elements" to filter or add form elements
10129			var elements = jQuery.prop( this, "elements" );
10130			return elements ? jQuery.makeArray( elements ) : this;
10131		} )
10132		.filter( function() {
10133			var type = this.type;
10134
10135			// Use .is(":disabled") so that fieldset[disabled] works
10136			return this.name && !jQuery( this ).is( ":disabled" ) &&
10137				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
10138				( this.checked || !rcheckableType.test( type ) );
10139		} )
10140		.map( function( i, elem ) {
10141			var val = jQuery( this ).val();
10142
10143			return val == null ?
10144				null :
10145				jQuery.isArray( val ) ?
10146					jQuery.map( val, function( val ) {
10147						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
10148					} ) :
10149					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
10150		} ).get();
10151	}
10152} );
10153
10154
10155// Create the request object
10156// (This is still attached to ajaxSettings for backward compatibility)
10157jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
10158
10159	// Support: IE6-IE8
10160	function() {
10161
10162		// XHR cannot access local files, always use ActiveX for that case
10163		if ( this.isLocal ) {
10164			return createActiveXHR();
10165		}
10166
vendor: 22,565 bytes, lines 10167-10987
10167		// Support: IE 9-11
10168		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
10169		// is used. In IE 9+ always use the native XHR.
10170		// Note: this condition won't catch Edge as it doesn't define
10171		// document.documentMode but it also doesn't support ActiveX so it won't
10172		// reach this code.
10173		if ( document.documentMode > 8 ) {
10174			return createStandardXHR();
10175		}
10176
10177		// Support: IE<9
10178		// oldIE XHR does not support non-RFC2616 methods (#13240)
10179		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
10180		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
10181		// Although this check for six methods instead of eight
10182		// since IE also does not support "trace" and "connect"
10183		return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
10184			createStandardXHR() || createActiveXHR();
10185	} :
10186
10187	// For all other browsers, use the standard XMLHttpRequest object
10188	createStandardXHR;
10189
10190var xhrId = 0,
10191	xhrCallbacks = {},
10192	xhrSupported = jQuery.ajaxSettings.xhr();
10193
10194// Support: IE<10
10195// Open requests must be manually aborted on unload (#5280)
10196// See https://support.microsoft.com/kb/2856746 for more info
10197if ( window.attachEvent ) {
10198	window.attachEvent( "onunload", function() {
10199		for ( var key in xhrCallbacks ) {
10200			xhrCallbacks[ key ]( undefined, true );
10201		}
10202	} );
10203}
10204
10205// Determine support properties
10206support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
10207xhrSupported = support.ajax = !!xhrSupported;
10208
10209// Create transport if the browser can provide an xhr
10210if ( xhrSupported ) {
10211
10212	jQuery.ajaxTransport( function( options ) {
10213
10214		// Cross domain only allowed if supported through XMLHttpRequest
10215		if ( !options.crossDomain || support.cors ) {
10216
10217			var callback;
10218
10219			return {
10220				send: function( headers, complete ) {
10221					var i,
10222						xhr = options.xhr(),
10223						id = ++xhrId;
10224
10225					// Open the socket
10226					xhr.open(
10227						options.type,
10228						options.url,
10229						options.async,
10230						options.username,
10231						options.password
10232					);
10233
10234					// Apply custom fields if provided
10235					if ( options.xhrFields ) {
10236						for ( i in options.xhrFields ) {
10237							xhr[ i ] = options.xhrFields[ i ];
10238						}
10239					}
10240
10241					// Override mime type if needed
10242					if ( options.mimeType && xhr.overrideMimeType ) {
10243						xhr.overrideMimeType( options.mimeType );
10244					}
10245
10246					// X-Requested-With header
10247					// For cross-domain requests, seeing as conditions for a preflight are
10248					// akin to a jigsaw puzzle, we simply never set it to be sure.
10249					// (it can always be set on a per-request basis or even using ajaxSetup)
10250					// For same-domain requests, won't change header if already provided.
10251					if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
10252						headers[ "X-Requested-With" ] = "XMLHttpRequest";
10253					}
10254
10255					// Set headers
10256					for ( i in headers ) {
10257
10258						// Support: IE<9
10259						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
10260						// request header to a null-value.
10261						//
10262						// To keep consistent with other XHR implementations, cast the value
10263						// to string and ignore `undefined`.
10264						if ( headers[ i ] !== undefined ) {
10265							xhr.setRequestHeader( i, headers[ i ] + "" );
10266						}
10267					}
10268
10269					// Do send the request
10270					// This may raise an exception which is actually
10271					// handled in jQuery.ajax (so no try/catch here)
10272					xhr.send( ( options.hasContent && options.data ) || null );
10273
10274					// Listener
10275					callback = function( _, isAbort ) {
10276						var status, statusText, responses;
10277
10278						// Was never called and is aborted or complete
10279						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
10280
10281							// Clean up
10282							delete xhrCallbacks[ id ];
10283							callback = undefined;
10284							xhr.onreadystatechange = jQuery.noop;
10285
10286							// Abort manually if needed
10287							if ( isAbort ) {
10288								if ( xhr.readyState !== 4 ) {
10289									xhr.abort();
10290								}
10291							} else {
10292								responses = {};
10293								status = xhr.status;
10294
10295								// Support: IE<10
10296								// Accessing binary-data responseText throws an exception
10297								// (#11426)
10298								if ( typeof xhr.responseText === "string" ) {
10299									responses.text = xhr.responseText;
10300								}
10301
10302								// Firefox throws an exception when accessing
10303								// statusText for faulty cross-domain requests
10304								try {
10305									statusText = xhr.statusText;
10306								} catch ( e ) {
10307
10308									// We normalize with Webkit giving an empty statusText
10309									statusText = "";
10310								}
10311
10312								// Filter status for non standard behaviors
10313
10314								// If the request is local and we have data: assume a success
10315								// (success with no data won't get notified, that's the best we
10316								// can do given current implementations)
10317								if ( !status && options.isLocal && !options.crossDomain ) {
10318									status = responses.text ? 200 : 404;
10319
10320								// IE - #1450: sometimes returns 1223 when it should be 204
10321								} else if ( status === 1223 ) {
10322									status = 204;
10323								}
10324							}
10325						}
10326
10327						// Call complete if needed
10328						if ( responses ) {
10329							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
10330						}
10331					};
10332
10333					// Do send the request
10334					// `xhr.send` may raise an exception, but it will be
10335					// handled in jQuery.ajax (so no try/catch here)
10336					if ( !options.async ) {
10337
10338						// If we're in sync mode we fire the callback
10339						callback();
10340					} else if ( xhr.readyState === 4 ) {
10341
10342						// (IE6 & IE7) if it's in cache and has been
10343						// retrieved directly we need to fire the callback
10344						window.setTimeout( callback );
10345					} else {
10346
10347						// Register the callback, but delay it in case `xhr.send` throws
10348						// Add to the list of active xhr callbacks
10349						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
10350					}
10351				},
10352
10353				abort: function() {
10354					if ( callback ) {
10355						callback( undefined, true );
10356					}
10357				}
10358			};
10359		}
10360	} );
10361}
10362
10363// Functions to create xhrs
10364function createStandardXHR() {
10365	try {
10366		return new window.XMLHttpRequest();
10367	} catch ( e ) {}
10368}
10369
10370function createActiveXHR() {
10371	try {
10372		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
10373	} catch ( e ) {}
10374}
10375
10376
10377
10378
10379// Install script dataType
10380jQuery.ajaxSetup( {
10381	accepts: {
10382		script: "text/javascript, application/javascript, " +
10383			"application/ecmascript, application/x-ecmascript"
10384	},
10385	contents: {
10386		script: /\b(?:java|ecma)script\b/
10387	},
10388	converters: {
10389		"text script": function( text ) {
10390			jQuery.globalEval( text );
10391			return text;
10392		}
10393	}
10394} );
10395
10396// Handle cache's special case and global
10397jQuery.ajaxPrefilter( "script", function( s ) {
10398	if ( s.cache === undefined ) {
10399		s.cache = false;
10400	}
10401	if ( s.crossDomain ) {
10402		s.type = "GET";
10403		s.global = false;
10404	}
10405} );
10406
10407// Bind script tag hack transport
10408jQuery.ajaxTransport( "script", function( s ) {
10409
10410	// This transport only deals with cross domain requests
10411	if ( s.crossDomain ) {
10412
10413		var script,
10414			head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;
10415
10416		return {
10417
10418			send: function( _, callback ) {
10419
10420				script = document.createElement( "script" );
10421
10422				script.async = true;
10423
10424				if ( s.scriptCharset ) {
10425					script.charset = s.scriptCharset;
10426				}
10427
10428				script.src = s.url;
10429
10430				// Attach handlers for all browsers
10431				script.onload = script.onreadystatechange = function( _, isAbort ) {
10432
10433					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
10434
10435						// Handle memory leak in IE
10436						script.onload = script.onreadystatechange = null;
10437
10438						// Remove the script
10439						if ( script.parentNode ) {
10440							script.parentNode.removeChild( script );
10441						}
10442
10443						// Dereference the script
10444						script = null;
10445
10446						// Callback if not abort
10447						if ( !isAbort ) {
10448							callback( 200, "success" );
10449						}
10450					}
10451				};
10452
10453				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
10454				// Use native DOM manipulation to avoid our domManip AJAX trickery
10455				head.insertBefore( script, head.firstChild );
10456			},
10457
10458			abort: function() {
10459				if ( script ) {
10460					script.onload( undefined, true );
10461				}
10462			}
10463		};
10464	}
10465} );
10466
10467
10468
10469
10470var oldCallbacks = [],
10471	rjsonp = /(=)\?(?=&|$)|\?\?/;
10472
10473// Default jsonp settings
10474jQuery.ajaxSetup( {
10475	jsonp: "callback",
10476	jsonpCallback: function() {
10477		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
10478		this[ callback ] = true;
10479		return callback;
10480	}
10481} );
10482
10483// Detect, normalize options and install callbacks for jsonp requests
10484jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
10485
10486	var callbackName, overwritten, responseContainer,
10487		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
10488			"url" :
10489			typeof s.data === "string" &&
10490				( s.contentType || "" )
10491					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
10492				rjsonp.test( s.data ) && "data"
10493		);
10494
10495	// Handle iff the expected data type is "jsonp" or we have a parameter to set
10496	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
10497
10498		// Get callback name, remembering preexisting value associated with it
10499		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
10500			s.jsonpCallback() :
10501			s.jsonpCallback;
10502
10503		// Insert callback into url or form data
10504		if ( jsonProp ) {
10505			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
10506		} else if ( s.jsonp !== false ) {
10507			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
10508		}
10509
10510		// Use data converter to retrieve json after script execution
10511		s.converters[ "script json" ] = function() {
10512			if ( !responseContainer ) {
10513				jQuery.error( callbackName + " was not called" );
10514			}
10515			return responseContainer[ 0 ];
10516		};
10517
10518		// force json dataType
10519		s.dataTypes[ 0 ] = "json";
10520
10521		// Install callback
10522		overwritten = window[ callbackName ];
10523		window[ callbackName ] = function() {
10524			responseContainer = arguments;
10525		};
10526
10527		// Clean-up function (fires after converters)
10528		jqXHR.always( function() {
10529
10530			// If previous value didn't exist - remove it
10531			if ( overwritten === undefined ) {
10532				jQuery( window ).removeProp( callbackName );
10533
10534			// Otherwise restore preexisting value
10535			} else {
10536				window[ callbackName ] = overwritten;
10537			}
10538
10539			// Save back as free
10540			if ( s[ callbackName ] ) {
10541
10542				// make sure that re-using the options doesn't screw things around
10543				s.jsonpCallback = originalSettings.jsonpCallback;
10544
10545				// save the callback name for future use
10546				oldCallbacks.push( callbackName );
10547			}
10548
10549			// Call if it was a function and we have a response
10550			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
10551				overwritten( responseContainer[ 0 ] );
10552			}
10553
10554			responseContainer = overwritten = undefined;
10555		} );
10556
10557		// Delegate to script
10558		return "script";
10559	}
10560} );
10561
10562
10563
10564
10565// data: string of html
10566// context (optional): If specified, the fragment will be created in this context,
10567// defaults to document
10568// keepScripts (optional): If true, will include scripts passed in the html string
10569jQuery.parseHTML = function( data, context, keepScripts ) {
10570	if ( !data || typeof data !== "string" ) {
10571		return null;
10572	}
10573	if ( typeof context === "boolean" ) {
10574		keepScripts = context;
10575		context = false;
10576	}
10577	context = context || document;
10578
10579	var parsed = rsingleTag.exec( data ),
10580		scripts = !keepScripts && [];
10581
10582	// Single tag
10583	if ( parsed ) {
10584		return [ context.createElement( parsed[ 1 ] ) ];
10585	}
10586
10587	parsed = buildFragment( [ data ], context, scripts );
10588
10589	if ( scripts && scripts.length ) {
10590		jQuery( scripts ).remove();
10591	}
10592
10593	return jQuery.merge( [], parsed.childNodes );
10594};
10595
10596
10597// Keep a copy of the old load method
10598var _load = jQuery.fn.load;
10599
10600/**
10601 * Load a url into a page
10602 */
10603jQuery.fn.load = function( url, params, callback ) {
10604	if ( typeof url !== "string" && _load ) {
10605		return _load.apply( this, arguments );
10606	}
10607
10608	var selector, type, response,
10609		self = this,
10610		off = url.indexOf( " " );
10611
10612	if ( off > -1 ) {
10613		selector = jQuery.trim( url.slice( off, url.length ) );
10614		url = url.slice( 0, off );
10615	}
10616
10617	// If it's a function
10618	if ( jQuery.isFunction( params ) ) {
10619
10620		// We assume that it's the callback
10621		callback = params;
10622		params = undefined;
10623
10624	// Otherwise, build a param string
10625	} else if ( params && typeof params === "object" ) {
10626		type = "POST";
10627	}
10628
10629	// If we have elements to modify, make the request
10630	if ( self.length > 0 ) {
10631		jQuery.ajax( {
10632			url: url,
10633
10634			// If "type" variable is undefined, then "GET" method will be used.
10635			// Make value of this field explicit since
10636			// user can override it through ajaxSetup method
10637			type: type || "GET",
10638			dataType: "html",
10639			data: params
10640		} ).done( function( responseText ) {
10641
10642			// Save response for use in complete callback
10643			response = arguments;
10644
10645			self.html( selector ?
10646
10647				// If a selector was specified, locate the right elements in a dummy div
10648				// Exclude scripts to avoid IE 'Permission Denied' errors
10649				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10650
10651				// Otherwise use the full result
10652				responseText );
10653
10654		// If the request succeeds, this function gets "data", "status", "jqXHR"
10655		// but they are ignored because response was set above.
10656		// If it fails, this function gets "jqXHR", "status", "error"
10657		} ).always( callback && function( jqXHR, status ) {
10658			self.each( function() {
10659				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10660			} );
10661		} );
10662	}
10663
10664	return this;
10665};
10666
10667
10668
10669
10670// Attach a bunch of functions for handling common AJAX events
10671jQuery.each( [
10672	"ajaxStart",
10673	"ajaxStop",
10674	"ajaxComplete",
10675	"ajaxError",
10676	"ajaxSuccess",
10677	"ajaxSend"
10678], function( i, type ) {
10679	jQuery.fn[ type ] = function( fn ) {
10680		return this.on( type, fn );
10681	};
10682} );
10683
10684
10685
10686
10687jQuery.expr.filters.animated = function( elem ) {
10688	return jQuery.grep( jQuery.timers, function( fn ) {
10689		return elem === fn.elem;
10690	} ).length;
10691};
10692
10693
10694
10695
10696
10697/**
10698 * Gets a window from an element
10699 */
10700function getWindow( elem ) {
10701	return jQuery.isWindow( elem ) ?
10702		elem :
10703		elem.nodeType === 9 ?
10704			elem.defaultView || elem.parentWindow :
10705			false;
10706}
10707
10708jQuery.offset = {
10709	setOffset: function( elem, options, i ) {
10710		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10711			position = jQuery.css( elem, "position" ),
10712			curElem = jQuery( elem ),
10713			props = {};
10714
10715		// set position first, in-case top/left are set even on static elem
10716		if ( position === "static" ) {
10717			elem.style.position = "relative";
10718		}
10719
10720		curOffset = curElem.offset();
10721		curCSSTop = jQuery.css( elem, "top" );
10722		curCSSLeft = jQuery.css( elem, "left" );
10723		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10724			jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;
10725
10726		// need to be able to calculate position if either top or left
10727		// is auto and position is either absolute or fixed
10728		if ( calculatePosition ) {
10729			curPosition = curElem.position();
10730			curTop = curPosition.top;
10731			curLeft = curPosition.left;
10732		} else {
10733			curTop = parseFloat( curCSSTop ) || 0;
10734			curLeft = parseFloat( curCSSLeft ) || 0;
10735		}
10736
10737		if ( jQuery.isFunction( options ) ) {
10738
10739			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10740			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10741		}
10742
10743		if ( options.top != null ) {
10744			props.top = ( options.top - curOffset.top ) + curTop;
10745		}
10746		if ( options.left != null ) {
10747			props.left = ( options.left - curOffset.left ) + curLeft;
10748		}
10749
10750		if ( "using" in options ) {
10751			options.using.call( elem, props );
10752		} else {
10753			curElem.css( props );
10754		}
10755	}
10756};
10757
10758jQuery.fn.extend( {
10759	offset: function( options ) {
10760		if ( arguments.length ) {
10761			return options === undefined ?
10762				this :
10763				this.each( function( i ) {
10764					jQuery.offset.setOffset( this, options, i );
10765				} );
10766		}
10767
10768		var docElem, win,
10769			box = { top: 0, left: 0 },
10770			elem = this[ 0 ],
10771			doc = elem && elem.ownerDocument;
10772
10773		if ( !doc ) {
10774			return;
10775		}
10776
10777		docElem = doc.documentElement;
10778
10779		// Make sure it's not a disconnected DOM node
10780		if ( !jQuery.contains( docElem, elem ) ) {
10781			return box;
10782		}
10783
10784		// If we don't have gBCR, just use 0,0 rather than error
10785		// BlackBerry 5, iOS 3 (original iPhone)
10786		if ( typeof elem.getBoundingClientRect !== "undefined" ) {
10787			box = elem.getBoundingClientRect();
10788		}
10789		win = getWindow( doc );
10790		return {
10791			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
10792			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
10793		};
10794	},
10795
10796	position: function() {
10797		if ( !this[ 0 ] ) {
10798			return;
10799		}
10800
10801		var offsetParent, offset,
10802			parentOffset = { top: 0, left: 0 },
10803			elem = this[ 0 ];
10804
10805		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10806		// because it is its only offset parent
10807		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10808
10809			// we assume that getBoundingClientRect is available when computed position is fixed
10810			offset = elem.getBoundingClientRect();
10811		} else {
10812
10813			// Get *real* offsetParent
10814			offsetParent = this.offsetParent();
10815
10816			// Get correct offsets
10817			offset = this.offset();
10818			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
10819				parentOffset = offsetParent.offset();
10820			}
10821
10822			// Add offsetParent borders
10823			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
10824			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
10825		}
10826
10827		// Subtract parent offsets and element margins
10828		// note: when an element has margin: auto the offsetLeft and marginLeft
10829		// are the same in Safari causing offset.left to incorrectly be 0
10830		return {
10831			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10832			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10833		};
10834	},
10835
10836	offsetParent: function() {
10837		return this.map( function() {
10838			var offsetParent = this.offsetParent;
10839
10840			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
10841				jQuery.css( offsetParent, "position" ) === "static" ) ) {
10842				offsetParent = offsetParent.offsetParent;
10843			}
10844			return offsetParent || documentElement;
10845		} );
10846	}
10847} );
10848
10849// Create scrollLeft and scrollTop methods
10850jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10851	var top = /Y/.test( prop );
10852
10853	jQuery.fn[ method ] = function( val ) {
10854		return access( this, function( elem, method, val ) {
10855			var win = getWindow( elem );
10856
10857			if ( val === undefined ) {
10858				return win ? ( prop in win ) ? win[ prop ] :
10859					win.document.documentElement[ method ] :
10860					elem[ method ];
10861			}
10862
10863			if ( win ) {
10864				win.scrollTo(
10865					!top ? val : jQuery( win ).scrollLeft(),
10866					top ? val : jQuery( win ).scrollTop()
10867				);
10868
10869			} else {
10870				elem[ method ] = val;
10871			}
10872		}, method, val, arguments.length, null );
10873	};
10874} );
10875
10876// Support: Safari<7-8+, Chrome<37-44+
10877// Add the top/left cssHooks using jQuery.fn.position
10878// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10879// getComputedStyle returns percent when specified for top/left/bottom/right
10880// rather than make the css module depend on the offset module, we just check for it here
10881jQuery.each( [ "top", "left" ], function( i, prop ) {
10882	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10883		function( elem, computed ) {
10884			if ( computed ) {
10885				computed = curCSS( elem, prop );
10886
10887				// if curCSS returns percentage, fallback to offset
10888				return rnumnonpx.test( computed ) ?
10889					jQuery( elem ).position()[ prop ] + "px" :
10890					computed;
10891			}
10892		}
10893	);
10894} );
10895
10896
10897// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10898jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10899	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10900	function( defaultExtra, funcName ) {
10901
10902		// margin is only for outerHeight, outerWidth
10903		jQuery.fn[ funcName ] = function( margin, value ) {
10904			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10905				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10906
10907			return access( this, function( elem, type, value ) {
10908				var doc;
10909
10910				if ( jQuery.isWindow( elem ) ) {
10911
10912					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
10913					// isn't a whole lot we can do. See pull request at this URL for discussion:
10914					// https://github.com/jquery/jquery/pull/764
10915					return elem.document.documentElement[ "client" + name ];
10916				}
10917
10918				// Get document width or height
10919				if ( elem.nodeType === 9 ) {
10920					doc = elem.documentElement;
10921
10922					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10923					// whichever is greatest
10924					// unfortunately, this causes bug #3838 in IE6/8 only,
10925					// but there is currently no good, small way to fix it.
10926					return Math.max(
10927						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10928						elem.body[ "offset" + name ], doc[ "offset" + name ],
10929						doc[ "client" + name ]
10930					);
10931				}
10932
10933				return value === undefined ?
10934
10935					// Get width or height on the element, requesting but not forcing parseFloat
10936					jQuery.css( elem, type, extra ) :
10937
10938					// Set width or height on the element
10939					jQuery.style( elem, type, value, extra );
10940			}, type, chainable ? margin : undefined, chainable, null );
10941		};
10942	} );
10943} );
10944
10945
10946jQuery.fn.extend( {
10947
10948	bind: function( types, data, fn ) {
10949		return this.on( types, null, data, fn );
10950	},
10951	unbind: function( types, fn ) {
10952		return this.off( types, null, fn );
10953	},
10954
10955	delegate: function( selector, types, data, fn ) {
10956		return this.on( types, selector, data, fn );
10957	},
10958	undelegate: function( selector, types, fn ) {
10959
10960		// ( namespace ) or ( selector, types [, fn] )
10961		return arguments.length === 1 ?
10962			this.off( selector, "**" ) :
10963			this.off( types, selector || "**", fn );
10964	}
10965} );
10966
10967// The number of elements contained in the matched element set
10968jQuery.fn.size = function() {
10969	return this.length;
10970};
10971
10972jQuery.fn.andSelf = jQuery.fn.addBack;
10973
10974
10975
10976
10977// Register as a named AMD module, since jQuery can be concatenated with other
10978// files that may use define, but not via a proper concatenation script that
10979// understands anonymous AMD modules. A named AMD is safest and most robust
10980// way to register. Lowercase jquery is used because AMD module names are
10981// derived from file names, and jQuery is normally delivered in a lowercase
10982// file name. Do this after creating the global so that if an AMD module wants
10983// to call noConflict to hide this version of jQuery, it will work.
10984
10985// Note that for maximum portability, libraries that are not jQuery should
10986// declare themselves as anonymous modules, and avoid setting a global if an
10987// AMD loader is present. jQuery is a special case. For more information, see
10988// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10989
10990if ( typeof define === "function" && define.amd ) {
10991	define( "jquery", [], function() {
10992		return jQuery;
10993	} );
10994}
10995
10996
10997
10998var
10999
11000	// Map over jQuery in case of overwrite
11001	_jQuery = window.jQuery,
11002
11003	// Map over the $ in case of overwrite
11004	_$ = window.$;
11005
11006jQuery.noConflict = function( deep ) {
11007	if ( window.$ === jQuery ) {
11008		window.$ = _$;
11009	}
11010
11011	if ( deep && window.jQuery === jQuery ) {
11012		window.jQuery = _jQuery;
11013	}
11014
11015	return jQuery;
11016};
11017
11018// Expose jQuery and $ identifiers, even in
11019// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
11020// and CommonJS for browser emulators (#13566)
11021if ( !noGlobal ) {
11022	window.jQuery = window.$ = jQuery;
11023}
11024
11025return jQuery;
11026}));
11027
11028
11029/**
11030 * For jQuery versions less than 3.5.0, this replaces the jQuery.htmlPrefilter()
11031 * function with one that fixes these security vulnerabilities while also
11032 * retaining the pre-3.5.0 behavior where it's safe to do so.
11033 * - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11022
11034 * - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11023
11035 */
11036(function (jQuery) {
11037
11038	// No backport is needed if we're already on jQuery 3.5 or higher.
11039	var versionParts = jQuery.fn.jquery.split('.');
11040	var majorVersion = parseInt(versionParts[0]);
11041	var minorVersion = parseInt(versionParts[1]);
11042	if ( (majorVersion > 3) || (majorVersion === 3 && minorVersion >= 5) ) {
11043		return;
11044	}
11045
11046	// Prior to jQuery 3.5, jQuery converted XHTML-style self-closing tags to
11047	// their XML equivalent: e.g., "<div />" to "<div></div>". This is
11048	// problematic for several reasons, including that it's vulnerable to XSS
11049	// attacks. However, since this was jQuery's behavior for many years, many
11050	// Joomla extnesions jQuery plugins may be relying on it. Therefore, we
11051	// preserve that behavior, but for a limited set of tags only, that we believe
11052	// to not be vulnerable. This is the set of HTML tags that satisfy all of the
11053	// following conditions:
11054	// - In DOMPurify's list of HTML tags. If an HTML tag isn't safe enough to
11055	//   appear in that list, then we don't want to mess with it here either.
11056	//   @see https://github.com/cure53/DOMPurify/blob/2.0.11/dist/purify.js#L128
11057	// - A normal element (not a void, template, text, or foreign element).
11058	//   @see https://html.spec.whatwg.org/multipage/syntax.html#elements-2
11059	// - An element that is still defined by the current HTML specification
11060	//   (not a deprecated element), because we do not want to rely on how
11061	//   browsers parse deprecated elements.
11062	//   @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element
11063	// - Not 'html', 'head', or 'body', because this pseudo-XHTML expansion is
11064	//   designed for fragments, not entire documents.
11065	// - Not 'colgroup', because due to an idiosyncrasy of jQuery's original
11066	//   regular expression, it didn't match on colgroup, and we don't want to
11067	//   introduce a behavior change for that.
11068	var selfClosingTagsToReplace = [
11069		'a', 'abbr', 'address', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo',
11070		'blockquote', 'button', 'canvas', 'caption', 'cite', 'code', 'data',
11071		'datalist', 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em',
11072		'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3',
11073		'h4', 'h5', 'h6', 'header', 'hgroup', 'i', 'ins', 'kbd', 'label', 'legend',
11074		'li', 'main', 'map', 'mark', 'menu', 'meter', 'nav', 'ol', 'optgroup',
11075		'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt',
11076		'ruby', 's', 'samp', 'section', 'select', 'small', 'source', 'span',
11077		'strong', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th',
11078		'thead', 'time', 'tr', 'u', 'ul', 'var', 'video'
11079	];
11080
11081	// Define regular expressions for <TAG/> and <TAG ATTRIBUTES/>. Doing this as
11082	// two expressions makes it easier to target <a/> without also targeting
11083	// every tag that starts with "a".
11084	var xhtmlRegExpGroup = '(' + selfClosingTagsToReplace.join('|') + ')';
11085	var whitespace = '[\\x20\\t\\r\\n\\f]';
11086	var rxhtmlTagWithoutSpaceOrAttributes = new RegExp('<' + xhtmlRegExpGroup + '\\/>', 'gi');
11087	var rxhtmlTagWithSpaceAndMaybeAttributes = new RegExp('<' + xhtmlRegExpGroup + '(' + whitespace + '[^>]*)\\/>', 'gi');
11088
11089	// jQuery 3.5 also fixed a vulnerability for when </select> appears within
11090	// an <option> or <optgroup>, but it did that in local code that we can't
11091	// backport directly. Instead, we filter such cases out. To do so, we need to
11092	// determine when jQuery would otherwise invoke the vulnerable code, which it
11093	// uses this regular expression to determine.
11094	// @see https://github.com/jquery/jquery/blob/3.4.1/dist/jquery.js#L4716
11095	var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
11096
11097	jQuery.extend({
11098		htmlPrefilter: function (html) {
11099			// This is how jQuery determines the first tag in the HTML.
11100			// @see https://github.com/jquery/jquery/blob/3.4.1/dist/jquery.js#L4815
11101			var tag = ( rtagName.exec( html ) || [ "", "" ] )[ 1 ].toLowerCase();
11102
11103			// It is not valid HTML for <option> or <optgroup> to have <select> as
11104			// either a descendant or sibling, and attempts to inject one can cause
11105			// XSS on jQuery versions before 3.5. Since this is invalid HTML and a
11106			// possible XSS attack, reject the entire string.
11107			// @see https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11023
11108			if ((tag === 'option' || tag === 'optgroup') && html.match(/<\/?select/i)) {
11109				html = '';
11110			}
11111
11112			// Retain jQuery 3.4's conversion of pseudo-XHTML, but for only the
11113			// tags in the `selfClosingTagsToReplace` list defined above.
11114			// @see https://github.com/jquery/jquery/blob/3.4.1/dist/jquery.js#L5979
11115			// @see https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11022
11116			html = html.replace(rxhtmlTagWithoutSpaceOrAttributes, "<$1></$1>");
11117			html = html.replace(rxhtmlTagWithSpaceAndMaybeAttributes, "<$1$2></$1>");
11118
11119			return html;
11120		}
11121	});
11122
11123})(jQuery);
11124
11125/*jquery-noconflict.js*/
11126jQuery.noConflict();
11127
11128/*jquery-migrate.js*/
11129/*!
11130 * jQuery Migrate - v1.4.1 - 2016-05-19
11131 * Copyright jQuery Foundation and other contributors
11132 */
11133(function( jQuery, window, undefined ) {
11134// See http://bugs.jquery.com/ticket/13335
11135// "use strict";
11136
11137
11138jQuery.migrateVersion = "1.4.1";
11139
11140
11141var warnedAbout = {};
11142
11143// List of warnings already given; public read only
11144jQuery.migrateWarnings = [];
11145
11146// Set to true to prevent console output; migrateWarnings still maintained
11147// jQuery.migrateMute = false;
11148
11149// Show a message on the console so devs know we're active
11150if ( window.console && window.console.log ) {
11151	window.console.log( "JQMIGRATE: Migrate is installed" +
11152		( jQuery.migrateMute ? "" : " with logging active" ) +
11153		", version " + jQuery.migrateVersion );
11154}
11155
11156// Set to false to disable traces that appear with warnings
11157if ( jQuery.migrateTrace === undefined ) {
11158	jQuery.migrateTrace = true;
11159}
11160
11161// Forget any warnings we've already given; public
11162jQuery.migrateReset = function() {
11163	warnedAbout = {};
11164	jQuery.migrateWarnings.length = 0;
11165};
11166
11167function migrateWarn( msg) {
11168	var console = window.console;
11169	if ( !warnedAbout[ msg ] ) {
11170		warnedAbout[ msg ] = true;
11171		jQuery.migrateWarnings.push( msg );
11172		if ( console && console.warn && !jQuery.migrateMute ) {
11173			console.warn( "JQMIGRATE: " + msg );
11174			if ( jQuery.migrateTrace && console.trace ) {
11175				console.trace();
11176			}
11177		}
11178	}
11179}
11180
11181function migrateWarnProp( obj, prop, value, msg ) {
11182	if ( Object.defineProperty ) {
11183		// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
11184		// allow property to be overwritten in case some other plugin wants it
11185		try {
11186			Object.defineProperty( obj, prop, {
11187				configurable: true,
11188				enumerable: true,
11189				get: function() {
11190					migrateWarn( msg );
11191					return value;
11192				},
11193				set: function( newValue ) {
11194					migrateWarn( msg );
11195					value = newValue;
11196				}
11197			});
11198			return;
11199		} catch( err ) {
11200			// IE8 is a dope about Object.defineProperty, can't warn there
11201		}
11202	}
11203
11204	// Non-ES5 (or broken) browser; just set the property
11205	jQuery._definePropertyBroken = true;
11206	obj[ prop ] = value;
11207}
11208
11209if ( document.compatMode === "BackCompat" ) {
11210	// jQuery has never supported or tested Quirks Mode
11211	migrateWarn( "jQuery is not compatible with Quirks Mode" );
11212}
11213
11214
11215var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
11216	oldAttr = jQuery.attr,
11217	valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
11218		function() { return null; },
11219	valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
11220		function() { return undefined; },
11221	rnoType = /^(?:input|button)$/i,
11222	rnoAttrNodeType = /^[238]$/,
11223	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
11224	ruseDefault = /^(?:checked|selected)$/i;
11225
11226// jQuery.attrFn
11227migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
11228
11229jQuery.attr = function( elem, name, value, pass ) {
11230	var lowerName = name.toLowerCase(),
11231		nType = elem && elem.nodeType;
11232
11233	if ( pass ) {
11234		// Since pass is used internally, we only warn for new jQuery
11235		// versions where there isn't a pass arg in the formal params
11236		if ( oldAttr.length < 4 ) {
11237			migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
11238		}
11239		if ( elem && !rnoAttrNodeType.test( nType ) &&
11240			(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
11241			return jQuery( elem )[ name ]( value );
11242		}
11243	}
11244
11245	// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
11246	// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
11247	if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
11248		migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
11249	}
11250
11251	// Restore boolHook for boolean property/attribute synchronization
11252	if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
11253		jQuery.attrHooks[ lowerName ] = {
11254			get: function( elem, name ) {
11255				// Align boolean attributes with corresponding properties
11256				// Fall back to attribute presence where some booleans are not supported
11257				var attrNode,
11258					property = jQuery.prop( elem, name );
11259				return property === true || typeof property !== "boolean" &&
11260					( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
11261
11262					name.toLowerCase() :
11263					undefined;
11264			},
11265			set: function( elem, value, name ) {
11266				var propName;
11267				if ( value === false ) {
11268					// Remove boolean attributes when set to false
11269					jQuery.removeAttr( elem, name );
11270				} else {
11271					// value is true since we know at this point it's type boolean and not false
11272					// Set boolean attributes to the same name and set the DOM property
11273					propName = jQuery.propFix[ name ] || name;
11274					if ( propName in elem ) {
11275						// Only set the IDL specifically if it already exists on the element
11276						elem[ propName ] = true;
11277					}
11278
11279					elem.setAttribute( name, name.toLowerCase() );
11280				}
11281				return name;
11282			}
11283		};
11284
11285		// Warn only for attributes that can remain distinct from their properties post-1.9
11286		if ( ruseDefault.test( lowerName ) ) {
11287			migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
11288		}
11289	}
11290
11291	return oldAttr.call( jQuery, elem, name, value );
11292};
11293
11294// attrHooks: value
11295jQuery.attrHooks.value = {
11296	get: function( elem, name ) {
11297		var nodeName = ( elem.nodeName || "" ).toLowerCase();
11298		if ( nodeName === "button" ) {
11299			return valueAttrGet.apply( this, arguments );
11300		}
11301		if ( nodeName !== "input" && nodeName !== "option" ) {
11302			migrateWarn("jQuery.fn.attr('value') no longer gets properties");
11303		}
11304		return name in elem ?
11305			elem.value :
11306			null;
11307	},
11308	set: function( elem, value ) {
11309		var nodeName = ( elem.nodeName || "" ).toLowerCase();
11310		if ( nodeName === "button" ) {
11311			return valueAttrSet.apply( this, arguments );
11312		}
11313		if ( nodeName !== "input" && nodeName !== "option" ) {
11314			migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
11315		}
11316		// Does not return so that setAttribute is also used
11317		elem.value = value;
11318	}
11319};
11320
11321
11322var matched, browser,
11323	oldInit = jQuery.fn.init,
11324	oldFind = jQuery.find,
11325	oldParseJSON = jQuery.parseJSON,
11326	rspaceAngle = /^\s*</,
11327	rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
11328	rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
11329	// Note: XSS check is done below after string is trimmed
11330	rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
11331
11332// $(html) "looks like html" rule change
11333jQuery.fn.init = function( selector, context, rootjQuery ) {
11334	var match, ret;
11335
11336	if ( selector && typeof selector === "string" ) {
11337		if ( !jQuery.isPlainObject( context ) &&
11338				(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
11339
11340			// This is an HTML string according to the "old" rules; is it still?
11341			if ( !rspaceAngle.test( selector ) ) {
11342				migrateWarn("$(html) HTML strings must start with '<' character");
11343			}
11344			if ( match[ 3 ] ) {
11345				migrateWarn("$(html) HTML text after last tag is ignored");
11346			}
11347
11348			// Consistently reject any HTML-like string starting with a hash (gh-9521)
11349			// Note that this may break jQuery 1.6.x code that otherwise would work.
11350			if ( match[ 0 ].charAt( 0 ) === "#" ) {
11351				migrateWarn("HTML string cannot start with a '#' character");
11352				jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
11353			}
11354
11355			// Now process using loose rules; let pre-1.8 play too
11356			// Is this a jQuery context? parseHTML expects a DOM element (#178)
11357			if ( context && context.context && context.context.nodeType ) {
11358				context = context.context;
11359			}
11360
11361			if ( jQuery.parseHTML ) {
11362				return oldInit.call( this,
11363						jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
11364							context || document, true ), context, rootjQuery );
11365			}
11366		}
11367	}
11368
11369	ret = oldInit.apply( this, arguments );
11370
11371	// Fill in selector and context properties so .live() works
11372	if ( selector && selector.selector !== undefined ) {
11373		// A jQuery object, copy its properties
11374		ret.selector = selector.selector;
11375		ret.context = selector.context;
11376
11377	} else {
11378		ret.selector = typeof selector === "string" ? selector : "";
11379		if ( selector ) {
11380			ret.context = selector.nodeType? selector : context || document;
11381		}
11382	}
11383
11384	return ret;
11385};
11386jQuery.fn.init.prototype = jQuery.fn;
11387
11388jQuery.find = function( selector ) {
11389	var args = Array.prototype.slice.call( arguments );
11390
11391	// Support: PhantomJS 1.x
11392	// String#match fails to match when used with a //g RegExp, only on some strings
11393	if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
11394
11395		// The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
11396		// First see if qS thinks it's a valid selector, if so avoid a false positive
11397		try {
11398			document.querySelector( selector );
11399		} catch ( err1 ) {
11400
11401			// Didn't *look* valid to qSA, warn and try quoting what we think is the value
11402			selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
11403				return "[" + attr + op + "\"" + value + "\"]";
11404			} );
11405
11406			// If the regexp *may* have created an invalid selector, don't update it
11407			// Note that there may be false alarms if selector uses jQuery extensions
11408			try {
11409				document.querySelector( selector );
11410				migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
11411				args[ 0 ] = selector;
11412			} catch ( err2 ) {
11413				migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
11414			}
11415		}
11416	}
11417
11418	return oldFind.apply( this, args );
11419};
11420
11421// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
11422var findProp;
11423for ( findProp in oldFind ) {
11424	if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
11425		jQuery.find[ findProp ] = oldFind[ findProp ];
11426	}
11427}
11428
11429// Let $.parseJSON(falsy_value) return null
11430jQuery.parseJSON = function( json ) {
11431	if ( !json ) {
11432		migrateWarn("jQuery.parseJSON requires a valid JSON string");
11433		return null;
11434	}
11435	return oldParseJSON.apply( this, arguments );
11436};
11437
11438jQuery.uaMatch = function( ua ) {
11439	ua = ua.toLowerCase();
11440
11441	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
11442		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
11443		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
11444		/(msie) ([\w.]+)/.exec( ua ) ||
11445		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
11446		[];
11447
11448	return {
11449		browser: match[ 1 ] || "",
11450		version: match[ 2 ] || "0"
11451	};
11452};
11453
11454// Don't clobber any existing jQuery.browser in case it's different
11455if ( !jQuery.browser ) {
11456	matched = jQuery.uaMatch( navigator.userAgent );
11457	browser = {};
11458
11459	if ( matched.browser ) {
11460		browser[ matched.browser ] = true;
11461		browser.version = matched.version;
11462	}
11463
11464	// Chrome is Webkit, but Webkit is also Safari.
11465	if ( browser.chrome ) {
11466		browser.webkit = true;
11467	} else if ( browser.webkit ) {
11468		browser.safari = true;
11469	}
11470
11471	jQuery.browser = browser;
11472}
11473
11474// Warn if the code tries to get jQuery.browser
11475migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
11476
11477// jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
11478jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
11479migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
11480migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
11481
11482jQuery.sub = function() {
11483	function jQuerySub( selector, context ) {
11484		return new jQuerySub.fn.init( selector, context );
11485	}
11486	jQuery.extend( true, jQuerySub, this );
11487	jQuerySub.superclass = this;
11488	jQuerySub.fn = jQuerySub.prototype = this();
11489	jQuerySub.fn.constructor = jQuerySub;
11490	jQuerySub.sub = this.sub;
11491	jQuerySub.fn.init = function init( selector, context ) {
11492		var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
11493		return instance instanceof jQuerySub ?
11494			instance :
11495			jQuerySub( instance );
11496	};
11497	jQuerySub.fn.init.prototype = jQuerySub.fn;
11498	var rootjQuerySub = jQuerySub(document);
11499	migrateWarn( "jQuery.sub() is deprecated" );
11500	return jQuerySub;
11501};
11502
11503// The number of elements contained in the matched element set
11504jQuery.fn.size = function() {
11505	migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
11506	return this.length;
11507};
11508
11509
11510var internalSwapCall = false;
11511
11512// If this version of jQuery has .swap(), don't false-alarm on internal uses
11513if ( jQuery.swap ) {
11514	jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
11515		var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
11516
11517		if ( oldHook ) {
11518			jQuery.cssHooks[ name ].get = function() {
11519				var ret;
11520
11521				internalSwapCall = true;
11522				ret = oldHook.apply( this, arguments );
11523				internalSwapCall = false;
11524				return ret;
11525			};
11526		}
11527	});
11528}
11529
11530jQuery.swap = function( elem, options, callback, args ) {
11531	var ret, name,
11532		old = {};
11533
11534	if ( !internalSwapCall ) {
11535		migrateWarn( "jQuery.swap() is undocumented and deprecated" );
11536	}
11537
11538	// Remember the old values, and insert the new ones
11539	for ( name in options ) {
11540		old[ name ] = elem.style[ name ];
11541		elem.style[ name ] = options[ name ];
11542	}
11543
11544	ret = callback.apply( elem, args || [] );
11545
11546	// Revert the old values
11547	for ( name in options ) {
11548		elem.style[ name ] = old[ name ];
11549	}
11550
11551	return ret;
11552};
11553
11554
11555// Ensure that $.ajax gets the new parseJSON defined in core.js
11556jQuery.ajaxSetup({
11557	converters: {
11558		"text json": jQuery.parseJSON
11559	}
11560});
11561
11562
11563var oldFnData = jQuery.fn.data;
11564
11565jQuery.fn.data = function( name ) {
11566	var ret, evt,
11567		elem = this[0];
11568
11569	// Handles 1.7 which has this behavior and 1.8 which doesn't
11570	if ( elem && name === "events" && arguments.length === 1 ) {
11571		ret = jQuery.data( elem, name );
11572		evt = jQuery._data( elem, name );
11573		if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
11574			migrateWarn("Use of jQuery.fn.data('events') is deprecated");
11575			return evt;
11576		}
11577	}
11578	return oldFnData.apply( this, arguments );
11579};
11580
11581
11582var rscriptType = /\/(java|ecma)script/i;
11583
11584// Since jQuery.clean is used internally on older versions, we only shim if it's missing
11585if ( !jQuery.clean ) {
11586	jQuery.clean = function( elems, context, fragment, scripts ) {
11587		// Set context per 1.8 logic
11588		context = context || document;
11589		context = !context.nodeType && context[0] || context;
11590		context = context.ownerDocument || context;
11591
11592		migrateWarn("jQuery.clean() is deprecated");
11593
11594		var i, elem, handleScript, jsTags,
11595			ret = [];
11596
11597		jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
11598
11599		// Complex logic lifted directly from jQuery 1.8
11600		if ( fragment ) {
11601			// Special handling of each script element
11602			handleScript = function( elem ) {
11603				// Check if we consider it executable
11604				if ( !elem.type || rscriptType.test( elem.type ) ) {
11605					// Detach the script and store it in the scripts array (if provided) or the fragment
11606					// Return truthy to indicate that it has been handled
11607					return scripts ?
11608						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
11609						fragment.appendChild( elem );
11610				}
11611			};
11612
11613			for ( i = 0; (elem = ret[i]) != null; i++ ) {
11614				// Check if we're done after handling an executable script
11615				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
11616					// Append to fragment and handle embedded scripts
11617					fragment.appendChild( elem );
11618					if ( typeof elem.getElementsByTagName !== "undefined" ) {
11619						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
11620						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
11621
11622						// Splice the scripts into ret after their former ancestor and advance our index beyond them
11623						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
11624						i += jsTags.length;
11625					}
11626				}
11627			}
11628		}
11629
11630		return ret;
11631	};
11632}
11633
11634var eventAdd = jQuery.event.add,
11635	eventRemove = jQuery.event.remove,
11636	eventTrigger = jQuery.event.trigger,
11637	oldToggle = jQuery.fn.toggle,
11638	oldLive = jQuery.fn.live,
11639	oldDie = jQuery.fn.die,
11640	oldLoad = jQuery.fn.load,
11641	ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
11642	rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
11643	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
11644	hoverHack = function( events ) {
11645		if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
11646			return events;
11647		}
11648		if ( rhoverHack.test( events ) ) {
11649			migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
11650		}
11651		return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
11652	};
11653
11654// Event props removed in 1.9, put them back if needed; no practical way to warn them
11655if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
11656	jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
11657}
11658
11659// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
11660if ( jQuery.event.dispatch ) {
11661	migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
11662}
11663
11664// Support for 'hover' pseudo-event and ajax event warnings
11665jQuery.event.add = function( elem, types, handler, data, selector ){
11666	if ( elem !== document && rajaxEvent.test( types ) ) {
11667		migrateWarn( "AJAX events should be attached to document: " + types );
11668	}
11669	eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
11670};
11671jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
11672	eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
11673};
11674
11675jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
11676
11677	jQuery.fn[ name ] = function() {
11678		var args = Array.prototype.slice.call( arguments, 0 );
11679
11680		// If this is an ajax load() the first arg should be the string URL;
11681		// technically this could also be the "Anything" arg of the event .load()
11682		// which just goes to show why this dumb signature has been deprecated!
11683		// jQuery custom builds that exclude the Ajax module justifiably die here.
11684		if ( name === "load" && typeof args[ 0 ] === "string" ) {
11685			return oldLoad.apply( this, args );
11686		}
11687
11688		migrateWarn( "jQuery.fn." + name + "() is deprecated" );
11689
11690		args.splice( 0, 0, name );
11691		if ( arguments.length ) {
11692			return this.bind.apply( this, args );
11693		}
11694
11695		// Use .triggerHandler here because:
11696		// - load and unload events don't need to bubble, only applied to window or image
11697		// - error event should not bubble to window, although it does pre-1.7
11698		// See http://bugs.jquery.com/ticket/11820
11699		this.triggerHandler.apply( this, args );
11700		return this;
11701	};
11702
11703});
11704
11705jQuery.fn.toggle = function( fn, fn2 ) {
11706
11707	// Don't mess with animation or css toggles
11708	if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
11709		return oldToggle.apply( this, arguments );
11710	}
11711	migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
11712
11713	// Save reference to arguments for access in closure
11714	var args = arguments,
11715		guid = fn.guid || jQuery.guid++,
11716		i = 0,
11717		toggler = function( event ) {
11718			// Figure out which function to execute
11719			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
11720			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
11721
11722			// Make sure that clicks stop
11723			event.preventDefault();
11724
11725			// and execute the function
11726			return args[ lastToggle ].apply( this, arguments ) || false;
11727		};
11728
11729	// link all the functions, so any of them can unbind this click handler
11730	toggler.guid = guid;
11731	while ( i < args.length ) {
11732		args[ i++ ].guid = guid;
11733	}
11734
11735	return this.click( toggler );
11736};
11737
11738jQuery.fn.live = function( types, data, fn ) {
11739	migrateWarn("jQuery.fn.live() is deprecated");
11740	if ( oldLive ) {
11741		return oldLive.apply( this, arguments );
11742	}
11743	jQuery( this.context ).on( types, this.selector, data, fn );
11744	return this;
11745};
11746
11747jQuery.fn.die = function( types, fn ) {
11748	migrateWarn("jQuery.fn.die() is deprecated");
11749	if ( oldDie ) {
11750		return oldDie.apply( this, arguments );
11751	}
11752	jQuery( this.context ).off( types, this.selector || "**", fn );
11753	return this;
11754};
11755
11756// Turn global events into document-triggered events
11757jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
11758	if ( !elem && !rajaxEvent.test( event ) ) {
11759		migrateWarn( "Global events are undocumented and deprecated" );
11760	}
11761	return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
11762};
11763jQuery.each( ajaxEvents.split("|"),
11764	function( _, name ) {
11765		jQuery.event.special[ name ] = {
11766			setup: function() {
11767				var elem = this;
11768
11769				// The document needs no shimming; must be !== for oldIE
11770				if ( elem !== document ) {
11771					jQuery.event.add( document, name + "." + jQuery.guid, function() {
11772						jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
11773					});
11774					jQuery._data( this, name, jQuery.guid++ );
11775				}
11776				return false;
11777			},
11778			teardown: function() {
11779				if ( this !== document ) {
11780					jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
11781				}
11782				return false;
11783			}
11784		};
11785	}
11786);
11787
11788jQuery.event.special.ready = {
11789	setup: function() {
11790		if ( this === document ) {
11791			migrateWarn( "'ready' event is deprecated" );
11792		}
11793	}
11794};
11795
11796var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
11797	oldFnFind = jQuery.fn.find;
11798
11799jQuery.fn.andSelf = function() {
11800	migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
11801	return oldSelf.apply( this, arguments );
11802};
11803
11804jQuery.fn.find = function( selector ) {
11805	var ret = oldFnFind.apply( this, arguments );
11806	ret.context = this.context;
11807	ret.selector = this.selector ? this.selector + " " + selector : selector;
11808	return ret;
11809};
11810
11811
11812// jQuery 1.6 did not support Callbacks, do not warn there
11813if ( jQuery.Callbacks ) {
11814
11815	var oldDeferred = jQuery.Deferred,
11816		tuples = [
11817			// action, add listener, callbacks, .then handlers, final state
11818			[ "resolve", "done", jQuery.Callbacks("once memory"),
11819				jQuery.Callbacks("once memory"), "resolved" ],
11820			[ "reject", "fail", jQuery.Callbacks("once memory"),
11821				jQuery.Callbacks("once memory"), "rejected" ],
11822			[ "notify", "progress", jQuery.Callbacks("memory"),
11823				jQuery.Callbacks("memory") ]
11824		];
11825
11826	jQuery.Deferred = function( func ) {
11827		var deferred = oldDeferred(),
11828			promise = deferred.promise();
11829
11830		deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
11831			var fns = arguments;
11832
11833			migrateWarn( "deferred.pipe() is deprecated" );
11834
11835			return jQuery.Deferred(function( newDefer ) {
11836				jQuery.each( tuples, function( i, tuple ) {
11837					var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
11838					// deferred.done(function() { bind to newDefer or newDefer.resolve })
11839					// deferred.fail(function() { bind to newDefer or newDefer.reject })
11840					// deferred.progress(function() { bind to newDefer or newDefer.notify })
11841					deferred[ tuple[1] ](function() {
11842						var returned = fn && fn.apply( this, arguments );
11843						if ( returned && jQuery.isFunction( returned.promise ) ) {
11844							returned.promise()
11845								.done( newDefer.resolve )
11846								.fail( newDefer.reject )
11847								.progress( newDefer.notify );
11848						} else {
11849							newDefer[ tuple[ 0 ] + "With" ](
11850								this === promise ? newDefer.promise() : this,
11851								fn ? [ returned ] : arguments
11852							);
11853						}
11854					});
11855				});
11856				fns = null;
11857			}).promise();
11858
11859		};
11860
11861		deferred.isResolved = function() {
11862			migrateWarn( "deferred.isResolved is deprecated" );
11863			return deferred.state() === "resolved";
11864		};
11865
11866		deferred.isRejected = function() {
11867			migrateWarn( "deferred.isRejected is deprecated" );
11868			return deferred.state() === "rejected";
11869		};
11870
11871		if ( func ) {
11872			func.call( deferred, deferred );
11873		}
11874
11875		return deferred;
11876	};
11877
11878}
11879
11880})( jQuery, window );
11881
11882jQuery(document).ready(function(){var mySwiper=undefined;function initSwiper(){var screenWidth=jQuery(window).outerWidth();if((screenWidth<901)&&(mySwiper===undefined)){mySwiper=new Swiper('.js-catalog-slider',{slidesPerView:2,spaceBetween:10,observer:!0,observeParents:!0,observeSlideChildren:!0,breakpoints:{320:{spaceBetween:10,slidesPerView:1},480:{spaceBetween:10,slidesPerView:2}},navigation:{nextEl:'.js-catalog-slider-next',prevEl:'.js-catalog-slider-prev',}})}else if((screenWidth>901)&&(mySwiper!==undefined)){mySwiper.destroy();mySwiper=undefined}}
11883initSwiper();jQuery(window).resize(function(){initSwiper()})});jQuery.noConflict();jQuery(document).ready(function(){jQuery(document).on("click",'[data-toggle="lightbox"]',function(event){event.preventDefault();jQuery(this).ekkoLightbox({alwaysShowClose:!0})});jQuery('.photo-slider-buttons').show();jQuery('.video-slider-buttons').hide();jQuery('.audio-slider-buttons').hide();jQuery(".main-sites-slide").click(function(e){var id=jQuery(this).attr('data-id');jQuery.post("/libs/themesites.php",{id:id}).done(function(data){jQuery.cookie("tsites"+id,id,{expires:0.032})})});if(jQuery('.js-main-banner-slider .swiper-slide').length>1){var mainSlider=new Swiper('.js-main-banner-slider',{navigation:{nextEl:'.js-main-banner-next',prevEl:'.js-main-banner-prev',},pagination:{el:'.js-main-banner-pagination',type:'bullets',clickable:!0},autoplay:{delay:5000,}})}
11884var i=-1;jQuery('.main-banner-scroll').hover(function(){i=i*(-1);if(i==1){jQuery(this).animate({scrollTop:jQuery(this).css("height")},"slow")}
11885if(i==-1){jQuery(this).animate({scrollTop:0},"slow")}});
11885if(jQuery('.js-main-soon-slider1 .swiper-slide').length>1){jQuery('.js-main-soon-slider-buttons1').addClass('active');var mainPosterSlider=new Swiper('.js-main-soon-slider1',{slidesPerView:7,preloadImages:!1,lazy:!0,spaceBetween:24,navigation:{nextEl:'.js-main-soon-next1',prevEl:'.js-main-soon-prev1',},breakpoints:{1200:{slidesPerView:7,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},}})}
11886if(jQuery('.js-main-soon-slider .swiper-slide').length>4){jQuery('.js-main-soon-slider-buttons').addClass('active');var mainPosterSlider=new Swiper('.js-main-soon-slider',{slidesPerView:1,preloadImages:!1,lazy:!0,spaceBetween:24,navigation:{nextEl:'.js-main-soon-next',prevEl:'.js-main-soon-prev',},breakpoints:{1200:{slidesPerView:8,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},}})}
11887if(jQuery('.js-main-sites-slider .swiper-slide').length>4){jQuery('.js-main-sites-slider-buttons').addClass('active');var mainPosterSlider=new Swiper('.js-main-sites-slider',{slidesPerView:1,preloadImages:!1,lazy:!0,spaceBetween:24,navigation:{nextEl:'.js-main-sites-next',prevEl:'.js-main-sites-prev',},breakpoints:{1200:{slidesPerView:7,spaceBetween:20},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},}})}
11888var mainPhotoSlider=new Swiper('.js-main-multimedia-slider',{spaceBetween:24,navigation:{nextEl:'.js-main-photo-next',prevEl:'.js-main-photo-prev',},breakpoints:{1200:{slidesPerView:5,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},320:{slidesPerView:1,spaceBetween:20}}});if(jQuery('.js-main-multimedia-vid-slider .swiper-slide').length>3){var mainVideoSlider=new Swiper('.js-main-multimedia-vid-slider',{spaceBetween:24,navigation:{nextEl:'.js-main-video-next',prevEl:'.js-main-video-prev',},breakpoints:{1200:{slidesPerView:5,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},320:{slidesPerView:1,spaceBetween:20}}})}
11889if(jQuery('.js-main-multimedia-audio-slider .swiper-slide').length>3){var mainAudioSlider=new Swiper('.js-main-multimedia-audio-slider',{spaceBetween:24,navigation:{nextEl:'.js-main-audio-next',prevEl:'.js-main-audio-prev',},breakpoints:{1200:{slidesPerView:5,spaceBetween:20},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},320:{slidesPerView:1,spaceBetween:20}}})}
11890if(jQuery('.js-main-partners-slider .swiper-slide').length>4){jQuery('.js-main-partners-slider-buttons').addClass('active');var mainPosterSlider=new Swiper('.js-main-partners-slider',{slidesPerView:4,spaceBetween:24,navigation:{nextEl:'.js-main-partners-next',prevEl:'.js-main-partners-prev',}})}
11891if(jQuery('.main-articles').length>0){let $el,newWidth,magicLine=jQuery(".main-articles-link-line"),currentBtnWidth=jQuery(".main-articles-link-item.active-js"),leftPos=currentBtnWidth.position().left;jQuery(document).ready(function(){setTimeout(function(){magicLine.width(currentBtnWidth[0].offsetWidth).css("left",currentBtnWidth.position().left)},1)});jQuery('body').on('click','.main-articles-link-item',function(){let tabIndex=jQuery(this).index();$el=jQuery(this);leftPos=$el.position().left;newWidth=$el.innerWidth();magicLine.animate({left:leftPos,width:newWidth},200);jQuery(this).parent().find('button').removeClass('active-js');jQuery(this).addClass('active-js');jQuery(this).parent().parent().children().eq(1).children().removeClass('active-js');jQuery(this).parent().parent().children().eq(1).children().eq(tabIndex).addClass('active-js')});jQuery(window).resize(function(){let $elResize=jQuery('.main-articles-link-item.active-js');let leftPosResize=$elResize.position().left;let newWidthResize=$elResize.innerWidth();let magicLineResize=jQuery(".main-articles-link-line");magicLineResize.animate({left:leftPosResize,width:newWidthResize},0)})}
11892if(jQuery('.main-multimedia').length>0){let $el,newWidth,magicLine=jQuery(".main-multimedia-link-line"),currentBtnWidth=jQuery(".main-multimedia-link-item.active-js"),leftPos=currentBtnWidth.position().left;jQuery(document).ready(function(){setTimeout(function(){magicLine.width(currentBtnWidth[0].offsetWidth).css("left",currentBtnWidth.position().left)},1)});jQuery('body').on('click','.main-multimedia-link-item',function(){let tabIndex=jQuery(this).index();$el=jQuery(this);leftPos=$el.position().left;newWidth=$el.innerWidth();magicLine.animate({left:leftPos,width:newWidth},200);jQuery(this).parent().find('button').removeClass('active-js');jQuery(this).addClass('active-js');jQuery(this).parent().parent().children().eq(1).children().removeClass('active-js');jQuery(this).parent().parent().children().eq(1).children().eq(tabIndex).addClass('active-js');
11892if(mainVideoSlider!==undefined){mainVideoSlider.update()}
11893if(mainAudioSlider!==undefined){mainAudioSlider.update()}});jQuery('body').on('click','.link-photo',function(){jQuery('.photo-slider-buttons').show();jQuery('.video-slider-buttons').hide();jQuery('.audio-slider-buttons').hide()});jQuery('body').on('click','.link-video',function(){jQuery('.photo-slider-buttons').hide();jQuery('.video-slider-buttons').show();jQuery('.audio-slider-buttons').hide()});jQuery('body').on('click','.link-audio',function(){jQuery('.photo-slider-buttons').hide();jQuery('.video-slider-buttons').hide();jQuery('.audio-slider-buttons').show()});jQuery(window).resize(function(){let $elResize=jQuery('.main-multimedia-link-item.active-js');let leftPosResize=$elResize.position().left;let newWidthResize=$elResize.innerWidth();let magicLineResize=jQuery(".main-multimedia-link-line");magicLineResize.animate({left:leftPosResize,width:newWidthResize},0)})}})
11894/*caption-uncompressed.js*/
11895/**
11896 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
11897 * @license     GNU General Public License version 2 or later; see LICENSE.txt
11898 */
11899
11900/**
11901 * JCaption javascript behavior
11902 *
11903 * Used for displaying image captions
11904 *
11905 * @package     Joomla
11906 * @since       1.5
11907 * @version  1.0
11908 */
11909var JCaption = function(_selector) {
11910    var $, selector,
11911    
11912    initialize = function(_selector) {
11913        $ = jQuery.noConflict();
11914        selector = _selector;
11915        $(selector).each(function(index, el) {
11916            createCaption(el);
11917        })
11918    },
11919    
11920    createCaption = function(element) {
11921        var $el = $(element), 
11922        caption = $el.attr('title'),
11923        width = $el.attr("width") || element.width,
11924        align = $el.attr("align") || $el.css("float") || element.style.styleFloat || "none",
11925        $p = $('<p/>', {
11926            "text" : caption,
11927            "class" : selector.replace('.', '_')
11928        }),
11929        $container = $('<div/>', {
11930            "class" : selector.replace('.', '_') + " " + align,
11931            "css" : {
11932                "float" : align,
11933                "width" : width
11934            }
11935        });
11936        $el.before($container);
11937        $container.append($el);
11938        if (caption !== "") {
11939            $container.append($p);
11940        }
11941    }
11942    initialize(_selector);
11943}
11944
11945/*js.cookie.min.js*/
11946/*!
11947 * JavaScript Cookie v2.2.1
11948 * https://github.com/js-cookie/js-cookie
11949 *
11950 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
11951 * Released under the MIT license
11952 */
11953;(function(b){var d;if(typeof define==="function"&&define.amd){define(b);d=true}if(typeof exports==="object"){module.exports=b();d=true}if(!d){var a=window.Cookies;var c=window.Cookies=b();c.noConflict=function(){window.Cookies=a;return c}}}(function(){function c(){var g=0;var d={};for(;g<arguments.length;g++){var e=arguments[g];for(var f in e){d[f]=e[f]}}return d}function a(d){return d.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}function b(f){function e(){}function g(k,m,i){if(typeof document==="undefined"){return}i=c({path:"/"},e.defaults,i);if(typeof i.expires==="number"){i.expires=new Date(new Date()*1+i.expires*86400000)}i.expires=i.expires?i.expires.toUTCString():"";try{var h=JSON.stringify(m);if(/^[\{\[]/.test(h)){m=h}}catch(n){}m=f.write?f.write(m,k):encodeURIComponent(String(m)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent);k=encodeURIComponent(String(k)).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var l="";for(var j in i){if(!i[j]){continue}l+="; "+j;if(i[j]===true){continue}l+="="+i[j].split(";")[0]}return(document.cookie=k+"="+m+l)}function d(o,q){if(typeof document==="undefined"){return}var k={};var p=document.cookie?document.cookie.split("; "):[];var m=0;for(;m<p.length;m++){var l=p[m].split("=");var j=l.slice(1).join("=");if(!q&&j.charAt(0)==='"'){j=j.slice(1,-1)}try{var h=a(l[0]);j=(f.read||f)(j,h)||a(j);if(q){try{j=JSON.parse(j)}catch(n){}}k[h]=j;if(o===h){break}}catch(n){}}return o?k[o]:k}e.set=g;e.get=function(h){return d(h,false)};e.getJSON=function(h){return d(h,true)};e.remove=function(i,h){g(i,"",c(h,{expires:-1}))};e.defaults={};e.withConverter=b;return e}return b(function(){})}));
11954jQuery(document).ready(function($){$.bvi({'bvi_target':'.bvi-open',"bvi_theme":"white","bvi_font":"arial","bvi_font_size":16,"bvi_letter_spacing":"normal","bvi_line_height":"normal","bvi_images":!0,"bvi_reload":!1,"bvi_fixed":!1,"bvi_tts":!0,"bvi_flash_iframe":!0,"bvi_hide":!1})})
11955/*swiped-events.min.js*/
11956/*!
11957 * swiped-events.js - v1.1.0
11958 * Pure JavaScript swipe events
11959 * https://github.com/john-doherty/swiped-events
11960 * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element
11961 * @author John Doherty <www.johndoherty.info>
11962 * @license MIT
11963 */
11964!function(t,e){"use strict";"function"!=typeof t.CustomEvent&&(t.CustomEvent=function(t,n){n=n||{bubbles:!1,cancelable:!1,detail:void 0};var u=e.createEvent("CustomEvent");return u.initCustomEvent(t,n.bubbles,n.cancelable,n.detail),u},t.CustomEvent.prototype=t.Event.prototype),e.addEventListener("touchstart",function(t){if("true"===t.target.getAttribute("data-swipe-ignore"))return;o=t.target,l=Date.now(),n=t.touches[0].clientX,u=t.touches[0].clientY,a=0,i=0},!1),e.addEventListener("touchmove",function(t){if(!n||!u)return;var e=t.touches[0].clientX,l=t.touches[0].clientY;a=n-e,i=u-l},!1),e.addEventListener("touchend",function(t){if(o!==t.target)return;var e=parseInt(o.getAttribute("data-swipe-threshold")||"20",10),s=parseInt(o.getAttribute("data-swipe-timeout")||"500",10),r=Date.now()-l,c="";Math.abs(a)>Math.abs(i)?Math.abs(a)>e&&r<s&&(c=a>0?"swiped-left":"swiped-right"):Math.abs(i)>e&&r<s&&(c=i>0?"swiped-up":"swiped-down");""!==c&&o.dispatchEvent(new CustomEvent(c,{bubbles:!0,cancelable:!0}));n=null,u=null,l=null},!1);var n=null,u=null,a=null,i=null,l=null,o=null}(window,document);
11965/*bootstrap.min.js*/
11966/*!
11967  * Bootstrap v4.0.0 (https://getbootstrap.com)
11968  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
11969  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11970  */
11971!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function r(){return(r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}e=e&&e.hasOwnProperty("default")?e.default:e,n=n&&n.hasOwnProperty("default")?n.default:n;var o,a,l,h,c,u,f,d,_,g,p,m,v,E,T,y,C,I,A,b,D,S,w,N,O,k,P=function(t){var e=!1;function n(e){var n=this,s=!1;return t(this).one(i.TRANSITION_END,function(){s=!0}),setTimeout(function(){s||i.triggerTransitionEnd(n)},e),this}var i={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n,i=e.getAttribute("data-target");i&&"#"!==i||(i=e.getAttribute("href")||""),"#"===i.charAt(0)&&(n=i,i=n="function"==typeof t.escapeSelector?t.escapeSelector(n).substr(1):n.replace(/(:|\.|\[|\]|,|=|@)/g,"\\$1"));try{return t(document).find(i).length>0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-sli
11971de], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method n
11971amed "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s<i.length;s++){var r=i[s],o=P.getSelectorFromElement(r);null!==o&&t(o).filter(e).length>0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s<this._triggerArray.length;s++){var r=this._triggerArray[s],o=P.getSelectorFromElement(r);if(null!==o)t(o).hasClass(c)||t(r).addClass(d).attr("aria-expanded",!1)}this.setTransitioning(!0);var a=function(){e.setTransitioning(!1),t(e._element).removeClass(f).addClass(u).trigger(h.HIDDEN)};this._element.style[i]="",P.supportsTransitionEnd()?t(this._element).one(P.TRANSITION_END,a).emulateTransitionEnd(600):a()}}},o.setTransitioning=function(t){this._isTransitioning=t},o.dispose=function(){t.removeData(this._element,n),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},o._getConfig=function(t){return(t=r({},a,t)).toggle=Boolean(t.toggle),P.typeCheckConfig(e,t,l),t},o._getDimension=function(){return t(this._element).hasClass(_)?_:g},o._getParent=function(){var e=this,n=null;P.isElement(this._config.parent)?(n=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(n=this._config.parent[0])):n=t(this._config.parent)[0];var s='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(s).each(function(t,n){e._addAriaAndCollapsedClass(i._getTargetFromElement(n),[n])}),n},o._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(c);n.length>0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method n
11971amed "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s<n.length;s++){var r=a._getParentFromElement(n[s]),o=t(n[s]).data(i),l={relatedTarget:n[s]};if(o){var h=o._menu;if(t(r).hasClass(f)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&t.contains(r,e.target))){var u=t.Event(c.HIDE,l);t(r).trigger(u),u.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),n[s].setAttribute("aria-expanded","fal
11971se"),t(h).removeClass(f),t(r).removeClass(f).trigger(t.Event(c.HIDDEN,l)))}}}},a._getParentFromElement=function(e){var n,i=P.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},a._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||t(e.target).closest(y).length)):h.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!t(this).hasClass(u))){var n=a._getParentFromElement(this),i=t(n).hasClass(f);if((i||27===e.which&&32===e.which)&&(!i||27!==e.which&&32!==e.which)){var s=t(n).find(I).get();if(0!==s.length){var r=s.indexOf(e.target);38===e.which&&r>0&&r--,40===e.which&&r<s.length-1&&r++,r<0&&(r=0),s[r].focus()}}else{if(27===e.which){var o=t(n).find(E)[0];t(o).trigger("focus")}t(this).trigger("click")}}},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return O}},{key:"DefaultType",get:function(){return k}}]),a}();return t(document).on(c.KEYDOWN_DATA_API,E,L._dataApiKeydownHandler).on(c.KEYDOWN_DATA_API,y,L._dataApiKeydownHandler).on(c.CLICK_DATA_API+" "+c.KEYUP_DATA_API,L._clearMenus).on(c.CLICK_DATA_API,E,function(e){e.preventDefault(),e.stopPropagation(),L._jQueryInterface.call(t(this),"toggle")}).on(c.CLICK_DATA_API,T,function(t){t.stopPropagation()}),t.fn[e]=L._jQueryInterface,t.fn[e].Constructor=L,t.fn[e].noConflict=function(){return t.fn[e]=l,L._jQueryInterface},L}(e),M=function(t){var e="modal",n="bs.modal",i="."+n,o=t.fn.modal,a={backdrop:!0,keyboard:!0,focus:!0,show:!0},l={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},h={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,FOCUSIN:"focusin"+i,RESIZE:"resize"+i,CLICK_DISMISS:"click.dismiss"+i,KEYDOWN_DISMISS:"keydown.dismiss"+i,MOUSEUP_DISMISS:"mouseup.dismiss"+i,MOUSEDOWN_DISMISS:"mousedown.dismiss"+i,CLICK_DATA_API:"click"+i+".data-api"},c="modal-scrollbar-measure",u="modal-backdrop",f="modal-open",d="fade",_="show",g={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",STICKY_CONTENT:".sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},p=function(){function o(e,n){this._config=this._getConfig(n),this._element=e,this._dialog=t(e).find(g.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}var p=o.prototype;return p.toggle=function(t){return this._isShown?this.hide():this.show(t)},p.show=function(e){var n=this;if(!this._isTransitioning&&!this._isShown){P.supportsTransitionEnd()&&t(this._element).hasClass(d)&&(this._isTransitioning=!0);var i=t.Event(h.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),t(document.body).addClass(f),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(h.CLICK_DISMISS,g.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(h.MOUSEDOWN_DISMISS,function(){t(n._element).one(h.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},p.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=t.Event(h.HIDE);if(t(this._element).trigger(i),this._isShown&&!i.isDefaultPrevented()){this._isShown=!1;var s=P.supportsTransitionEnd()&&t(this._element).hasClass(d);s&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),t(document).off(h.FOCUSIN),t(this._element).removeClass(_),t(this._element).off(h.CLICK_DISMISS),t(this._dialog).off(h.MOUSEDOWN_DISMISS),s?t(this._element).one(P.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal()}}},p.dispose=function(){t.removeData(this._element,n),t(window,document,this._element,this._backdrop).off(i),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},p.handleUpdate=function(){this._adjustDialog()},p._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},p._showElement=function(e){var n=this,i=P.supportsTransitionEnd()&&t(this._element).hasClass(d);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&P.reflow(this._element),t(this._element).addClass(_),this._config.focus&&this._enforceFocus();var s=t.Event(h.SHOWN,{relatedTarget:e}),r=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(s)};i?t(this._dialog).one(P.TRANSITION_END,r).emulateTransitionEnd(300):r()},p._enforceFocus=function(){var e=this;t(document).off(h.FOCUSIN).on(h.FOCUSIN,function(n){document!==n.target&&e._element!==n.target&&0===t(e._element).has(n.target).length&&e._element.focus()})},p._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(h.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(h.KEYDOWN_DISMISS)},p._setResizeEvent=function(){var e=this;this._isShown?t(window).on(h.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(h.RESIZE)},p._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(f),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(h.HIDDEN)})},p._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},p._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(d)?d:"";if(this._isShown&&this._config.backdrop){var s=P.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=u,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(h.CLICK_DISMISS,function(t){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),s&&P.reflow(this._backdrop),t(this._backdrop).addClass(_),!e)return;if(!s)return void e();t(this._backdrop).one(P.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(_);var r=function(){n._removeBackdrop(),e&&e()};P.supportsTransitionEnd()&&t(this._element).hasClass(d)?t(this._backdrop).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r()}else e&&e()},p._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},p._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(g.FIXED_CONTENT).each(function(n,i){var s=t(i)[0].style.paddingRight,r=t(i).css("padding-right");t(i).data("padding-right",s).css("padding-right",parseFloat(r)+e._scrollbarWidth+"px")}),t(g.STICKY_CONTENT).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)-e._scrollbarWidth+"px")}),t(g.NAVBAR_TOGGLER).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)+e._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=t("body").css("padding-right");t("body").data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},p._resetScrollbar=function(){t(g.FIXED_CONTENT).each(function(e,n){var i=t(n).data("padding-right");"undefined"!=typeof i&&t(n).css("padding-right",i).removeData("padding-right")}),t(g.STICKY_CONTENT+", "+g.NAVBAR_TOGGLER).each(function(e,n){var i=t(n).data("margin-right");"undefined"!=typeof i&&t(n).css("margin-right",i).removeData("margin-right")});var e=t("body").data("padding-right");"undefined"!=typeof e&&t("body").css("padding-right",e).removeData("padding-right")},p._getScrollbarWidth=function(){var t=document.createElement("div");t.className=c,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(e,i){return this.each(function(){var s=t(this).data(n),a=r({},o.Default,t(this).data(),"object"==typeof e&&e);if(s||(s=new o(this,a),t(this).data(n,s)),"string"==typeof e){if("undefined"==typeof s[e])throw new TypeError('No method n
11971amed "'+e+'"');s[e](i)}else a.show&&s.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(h.CLICK_DATA_API,g.DATA_TOGGLE,function(e){var i,s=this,o=P.getSelectorFromElement(this);o&&(i=t(o)[0]);var a=t(i).data(n)?"toggle":r({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var l=t(i).one(h.SHOW,function(e){e.isDefaultPrevented()||l.one(h.HIDDEN,function(){t(s).is(":visible")&&s.focus()})});p._jQueryInterface.call(t(i),a,this)}),t.fn.modal=p._jQueryInterface,t.fn.modal.Constructor=p,t.fn.modal.noConflict=function(){return t.fn.modal=o,p._jQueryInterface},p}(e),U=function(t){var e="tooltip",i="bs.tooltip",o="."+i,a=t.fn[e],l=new RegExp("(^|\\s)bs-tooltip\\S+","g"),h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"},c={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},u={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v}
11971,preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method n
11971amed "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}
11971).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t<this._offsets[s+1])&&this._activate(this._targets[s])}}},g._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(c)?(i.closest(f.DROPDOWN).find(f.DROPDOWN_TOGGLE).addClass(u),i.addClass(u)):(i.addClass(u),i.parents(f.NAV_LIST_GROUP).prev(f.NAV_LINKS+", "+f.LIST_ITEMS).addClass(u),i.parents(f.NAV_LIST_GROUP).prev(f.NAV_ITEMS).children(f.NAV_LINKS).addClass(u)),t(this._scrollElement).trigger(h.ACTIVATE,{relatedTarget:e})},g._clear=function(){t(this._selector).filter(f.ACTIVE).removeClass(u)},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n);if(i||(i=new o(this,"object"==typeof e&&e),t(this).data(n,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(window).on(h.LOAD_DATA_API,function(){for(var e=t.makeArray(t(f.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);g._jQueryInterface.call(i,i.data())}}),t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),V=function(t){var e="bs.tab",n="."+e,i=t.fn.tab,r={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,CLICK_DATA_API:"click.bs.tab.data-api"},o="dropdown-menu",a="active",l="disabled",h="fade",c="show",u=".dropdown",f=".nav, .list-group",d=".active",_="> li > .active",g='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',p=".dropdown-toggle",m="> .dropdown-menu .active",v=function(){function n(t){this._element=t}var i=n.prototype;return i.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(a)||t(this._element).hasClass(l))){var n,i,s=t(this._element).closest(f)[0],o=P.getSelectorFromElement(this._element);if(s){var h="UL"===s.nodeName?_:d;i=(i=t.makeArray(t(s).find(h)))[i.length-1]}var c=t.Event(r.HIDE,{relatedTarget:this._element}),u=t.Event(r.SHOW,{relatedTarget:i});if(i&&t(i).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){o&&(n=t(o)[0]),this._activate(this._element,s);var g=function(){var n=t.Event(r.HIDDEN,{relatedTarget:e._element}),s=t.Event(r.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(s)};n?this._activate(n,n.parentNode,g):g()}}},i.dispose=function(){t.removeData(this._element,e),this._element=null},i._activate=function(e,n,i){var s=this,r=("UL"===n.nodeName?t(n).find(_):t(n).children(d))[0],o=i&&P.supportsTransitionEnd()&&r&&t(r).hasClass(h),a=function(){return s._transitionComplete(e,r,i)};r&&o?t(r).one(P.TRANSITION_END,a).emulateTransitionEnd(150):a()},i._transitionComplete=function(e,n,i){if(n){t(n).removeClass(c+" "+a);var s=t(n.parentNode).find(m)[0];s&&t(s).removeClass(a),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(t(e).addClass(a),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),P.reflow(e),t(e).addClass(c),e.parentNode&&t(e.parentNode).hasClass(o)){var r=t(e).closest(u)[0];r&&t(r).find(p).addClass(a),e.setAttribute("aria-expanded",!0)}i&&i()},n._jQueryInterface=function(i){return this.each(function(){var s=t(this),r=s.data(e);if(r||(r=new n(this),s.data(e,r)),"string"==typeof i){if("undefined"==typeof r[i])throw new TypeError('No method n
11971amed "'+i+'"');r[i]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),n}();return t(document).on(r.CLICK_DATA_API,g,function(e){e.preventDefault(),v._jQueryInterface.call(t(this),"show")}),t.fn.tab=v._jQueryInterface,t.fn.tab.Constructor=v,t.fn.tab.noConflict=function(){return t.fn.tab=i,v._jQueryInterface},v}(e);!function(t){if("undefined"==typeof t)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})});
11972//# sourceMappingURL=bootstrap.min.js.map
11973(function($){"use strict";var initPalettes=function(){var $plmodal=$('.t4-palettes-modal');if(!$plmodal.parent().is('.themeConfigModal'))$plmodal.appendTo($('.themeConfigModal'));var $plEdit=$('.pattern.active'),$data=$plEdit.data(),$data_color={};$plmodal.find('.config_pattern').find('.t4-pattern').each(function(){$(this).parents('.controls').find('li').removeClass('active');var data=$(this).data();var attrName=$(this).data('attrname'),$value="";if(attrName!='title'){$data_color[attrName]=$data[attrName];$value=$data[attrName];if(!$value)$value="#FFF";$(this).val($value);$(this).spectrum("set",$value)}
11974if(attrName=='title')$(this).val($data[attrName]);$(this).data('val',$data[attrName])});if(typeof $data_color=='object'){Object.keys($data_color).forEach(function(cls,index){initPalettePreview(cls,$data_color)})}
11975$('.error-name-exist').hide();$('.error-title-null').hide();$plmodal.show()}
11976var generatedPalettes=function(trigger){var colorPattern={},$pattern;if(trigger){$pattern='.pattern'}else{$pattern='.pattern.active'}
11977$('.group_palette').find($pattern).not('.pattern-clone').each(function(index){var dataColorPt=$(this).data();colorPattern[dataColorPt.class]=dataColorPt});return colorPattern}
11978var validationData=function(){var allPalette=generatedPalettes(!0);var $return=!0;if(!$('.t4-pattern.title').val()){$('.error-title-null').show();$return=!1}else{$('.error-title-null').hide();var title=$('.t4-pattern.title').val();var $cls=title.replace(/\s+/g,"_").toLowerCase();Object.keys(allPalette).forEach(function(cls,idx){if(cls==$cls||allPalette[cls].title==title){$('.error-name-exist').show();$return=!1}})}
11979return $return}
11980var updateToJson=function(trigger){var AllData=generatedPalettes(!0);$('#typelist_theme_styles_palettes').val(JSON.stringify(AllData));$('#typelist_theme_styles_palettes').trigger('change');if(trigger){doSave()}}
11981var doSave=function(trigger){var dataSave=generatedPalettes(trigger);var url=location.pathname+'?option=com_ajax&plugin=t4&format=json&t4do=Palettes&id='+tempId;$.post(url,{task:'save',all:trigger,value:dataSave}).then(function(response){if(response.ok){T4Admin.Messages(T4Admin.langs.palettesUpdated,'message')}else{T4Admin.Messages(response.error,'error')}})}
11982var initPalettePreview=function(name,data){if(name=='background_color'){$('.pattern-preview').css({background:data.background_color})}else{$('.pattern-preview .'+name).data(name,data[name]);$('.pattern-preview .'+name).css({color:data[name]});if(name.match(/_hover/)){$('.pattern-preview .'+name.replace(/_hover/,"")).data(name,data[name]);$('.pattern-preview .'+name.replace(/_hover/,"")).hover(function(){var colorArr=$(this).data();$(this).css("color",colorArr[name])},function(){var colorArr=$(this).data();$(this).css("color",colorArr[name.replace(/_hover/,"")])})}}}
11983var doRemove=function(el){var $message='colorPalettes'+$(el).data('tooltip'),action=$(el).data('action'),plEl=$(el).closest('.pattern'),plName=plEl.data('class'),plDel=$(el).parents('li');var url=location.pathname+'?option=com_ajax&plugin=t4&format=json&t4do=Palettes&id='+tempId;$.post(url,{task:'remove',name:plName}).then(function(response){if(response.ok){var resData=response.data;var resDataColor=response.datacolor;if(action=='remove'){plEl.remove()}else{console.log(plEl)
11984var plObj=plEl.find('li');plObj.each(function(){var elClass=$(this).find('span').attr('class');
11984if(elClass){plEl.data(elClass,resDataColor[elClass]);if(!resDataColor[elClass])resDataColor[elClass]='';$(this).find('span').css({'background':resDataColor[elClass]})}});plDel.addClass('hidden')}
11985updateToJson();T4Admin.Messages(T4Admin.langs[$message],'message')}else{T4Admin.Messages(response.error,'error')}})}
11986$(document).ready(function(){var createPalette=function(data){let clone=data.clone();let dataColor=data.data();clone.removeClass('pattern-clone');clone.removeClass('hidden');$('.t4-palettes-modal').find('.config_pattern').find('input.t4-pattern').each(function(){var name=$(this).data('attrname'),val=$(this).val();if(name=='title'){if(clone.data('class')==''){var $classes=val.replace(/\s+/g,"_").toLowerCase();clone.data('class',$classes)}
11987clone.find('.pattern-title').text(val)}else{clone.find('span.'+name).css({background:val})}
11988clone.data(name,val)});clone.appendTo($('.pattern-list'));var action_del=clone.find('.pt-color-del');if(action_del.is(":hidden")){action_del.parents('li').removeClass('hidden')}}
11989$(document).on('click','.pt-color-edit',function(e){e.preventDefault();var paletteEdit=$(this).closest('.pattern');$('.pattern.active').removeClass('active');paletteEdit.addClass('active');$('.t4-palettes-modal').data('action','edit');initPalettes()});$(document).on('change','.t4-pattern',function(e){var $data=$(this).data(),attrName=$data.attrname,$val=$data.val,$color=$(this).val();var data_color={}
11990data_color[attrName]=$color;initPalettePreview(attrName,data_color)});$(document).on('click','.pt-color-create',function(e){e.preventDefault();var palettes=$('.pattern-list.t4-theme-palettes');var $parentColor=$(this).parents('.add-more-palettes').find('.pattern').clone(!0);var action_del=$parentColor.find('.pt-color-del');if(action_del.is(":hidden")){action_del.parents('li').removeClass('hidden')}
11991action_del.parents('li').html('<a class="pt-color-del" href="#" data-tooltip="Delete" data-action="remove"><i class="fal fa-trash-alt fa-fw"></i></a>');$('.pattern.active').removeClass('active');$parentColor.addClass('hidden active clone');$parentColor.data('class','');$parentColor.appendTo(palettes);$('.t4-palettes-modal').data('action','create');initPalettes()});$(document).on('click','.pt-color-clone',function(e){e.preventDefault();var $parentColor=$(this).closest('.pattern'),$patternClone=$parentColor.clone(!0),$data=$patternClone.data();var $val=$(this).val(),$name_palette=[];$('.pattern-list').find('.pattern').each(function(){$name_palette.push($(this).data('title'))});$patternClone.removeClass($data.class);var random='',newTitle='',title=$data.title;for(var i=0;i<100;i++){random=' copy '+i;if(i==0)random=' copy';newTitle=title+random;if($name_palette.indexOf(newTitle)==-1){break}}
11992$patternClone.addClass($data.class+random.replace(/\s/g,'_'));$patternClone.addClass('clone');$patternClone.data('class','');$patternClone.data('status','loc');$patternClone.find('.pattern-title').text(newTitle);$patternClone.data('title',newTitle);var action_del=$patternClone.find('.pt-color-del');if(action_del.is(":hidden")){action_del.parents('li').removeClass('hidden')}
11993action_del.parents('li').html('<a class="pt-color-del" href="#" data-tooltip="Delete"  data-action="remove"><i class="fal fa-trash-alt fa-fw"></i></a>');$patternClone.insertAfter($parentColor);$patternClone.find('.pt-color-edit').trigger('click');$('.t4-palettes-modal').data('action','clone')});$('body').on('click','.t4-patterns-apply',function(e){e.preventDefault();var $plmodal=$('.t4-palettes-modal');if(!validationData()&&$plmodal.data('action')=='create'){return!1}
11994var savetofile=!1;var patternActive=$('.pattern.active');if(patternActive.hasClass('clone')){patternActive.removeClass('clone');savetofile=!0}
11995console.log($plmodal.data('action'))
11996if(patternActive.hasClass('hidden')){patternActive.removeClass('hidden');patternActive.removeClass('pattern-clone')}
11997var status=patternActive.data('status');if(['ovr','org'].indexOf(status)>-1){patternActive.data('status','ovr')}
11998$plmodal.find('.config_pattern').find('input.t4-pattern').each(function(){var name=$(this).data('attrname'),val=$(this).val();if(name=='title'){if(patternActive.data('class')==''){var $classes=val.replace(/\s+/g,"_").toLowerCase();patternActive.data('class',$classes)}
11999patternActive.find('.pattern-title').text(val)}else{patternActive.find('span.'+name).css({background:val})}
12000patternActive.data(name,val)});$(this).closest('.t4-palettes-modal').hide();updateToJson(savetofile)});$('body').on('click','.t4-patterns-cancel, .action-t4-modal-close',function(e){$(this).closest('.t4-palettes-modal').hide();var $pattern=$('.pattern.active'),dataClass=$pattern.data('class');$('.t4-palettes-modal').data('action','');if($pattern.hasClass('clone')){$pattern.remove();$(document).find('.pattern[data-class="'+dataClass+'"]').addClass('active')}});$('body').on('click','.pt-color-del',function(e){e.stopPropagation();e.preventDefault();var that=this;var $langs='colorPalettesConfirm'+$(this).data('tooltip');T4Admin.Confirm(T4Admin.langs[$langs],function(ans){if(ans){doRemove(that)}else{return!1}},'')});$(document).on('click','.pattern-actions-list',function(e){e.stopPropagation()})})})(jQuery);jQuery(document).ready(function(){jQuery(document).on("scroll",onScroll);onepageNavLinks=jQuery('.onepage .t4-navbar .nav-link');function onScroll(event){var scrollPos=jQuery(document).scrollTop();onepageNavLinks.each(function(){var currLink=jQuery(this);var refElement=jQuery(currLink.attr("href"));if(refElement.position().top<=scrollPos){onepageNavLinks.removeClass("active");currLink.addClass("active")}else{currLink.removeClass("active")}})}})
12001document.addEventListener('DOMContentLoaded',function(){document.getElementById('CheckPDNlc').addEventListener('change',function(){var alertDiv=document.getElementById('LcAllert');if(this.checked){alertDiv.classList.remove('alert-danger');alertDiv.classList.add('alert-primary')}else{alertDiv.classList.remove('alert-primary');alertDiv.classList.add('alert-danger')}});document.getElementById('CheckPDNlc').checked=!1}
12001);jQuery(document).ready(function($){$(window).ready(function(){if("IntersectionObserver" in window&&"IntersectionObserverEntry" in window&&"intersectionRatio" in window.IntersectionObserverEntry.prototype){var options={root:null,rootMargin:'0px',threshold:0};var sections=document.querySelectorAll(".t4-section");var maxIdx=0;var sticky=document.querySelectorAll(".t4-sticky");function isValid(el){return el.offsetTop<window.innerHeight&&el.offsetTop+el.offsetHeight<window.innerHeight+200}
12002function doChange(changes,observer){changes.forEach(function(change){var clientRect=change.boundingClientRect,target=change.target;if(clientRect.top<=-clientRect.height){document.body.setAttribute('data-top-'+target.id,'over');document.body.classList.add('top-away')}else{document.body.setAttribute('data-top-'+target.id,'under');document.body.classList.remove('top-away')}})}
12003var observer=new IntersectionObserver(doChange,options);for(var i=0;i<sections.length;i++){var el=sections[i];if(isValid(el)){el.idx=i;observer.observe(el)}else{maxIdx=i-1;break}}
12004var top=0;var zindex=300;for(var i=0;i<sticky.length;i++){var elSk=sticky[i];top+=elSk.offsetHeight;if(typeof sticky[i+1]!='undefined'){$(elSk).css({'z-index':zindex});zindex-=1;$(sticky[i+1]).css({top:top,'z-index':zindex})}}
12005var options2={root:null,rootMargin:'0px',threshold:0};function doChange2(changes){var clientRect=changes[0].boundingClientRect;if(clientRect.top<=-100){document.body.classList.add('not-at-top')}else{document.body.classList.remove('not-at-top')}}
12006var observer2=new IntersectionObserver(doChange2,options2);var anchorEl=$('<a name="top-anchor">').prependTo('.t4-content-inner');if(anchorEl.get(0))observer2.observe(anchorEl.get(0))}});$(document).on('click','a[href^="#"]',function(event){event.preventDefault();if($(this).data('slide'))return;if(['tab'].indexOf($(this).data('toggle'))>-1)return;if(!$($.attr(this,'href')).length)return;$('.js-offcanvas-close').trigger('click');$('html, body').animate({scrollTop:$($.attr(this,'href')).offset().top},500)});$('a.dropdown-toggle').on('click',function(e){if($(this).parent('.nav-titem.dropdown.animating').length)$(this).parent('.nav-titem.dropdown.animating').removeClass('animating');if($(this).next().is(':visible')){location.href=this.href;return}
12007if(!$(this).next().hasClass('show')){$(this).parents('.dropdown-menu').first().find('.show').removeClass('show')}
12008var $subMenu=$(this).next('.dropdown-menu');$subMenu.toggleClass('show');return});$('li.nav-item.dropdown').on('hidden.bs.dropdown',function(e){$(this).find('.show').removeClass('show')});$('body').on('click','#back-to-top',function(){$('body,html,.t4-content').animate({scrollTop:0},500);return!1});$(document).find('.t4-content').scroll(function(event){var scroll=$('.t4-content').scrollTop();localStorage.setItem("page_scroll",scroll)})});(function($){$(document).ready(function(){var bootstrapLoaded=(typeof $().carousel=='function');var mootoolsLoaded=(typeof MooTools!='undefined');if(bootstrapLoaded&&mootoolsLoaded){Element.implement({hide:function(){return this},show:function(v){return this},slide:function(v){return this}})}});function refreshCurrentPage(){var page=window.location.href;var cur=localStorage.getItem('page');if(cur==page){return!0}
12009return!1}
12010window.onload=function(){var check=refreshCurrentPage();localStorage.setItem("page",window.location.href);if(document.getElementsByClassName("t4-content").length){if(check){var match=localStorage.getItem("page_scroll");document.getElementsByClassName("t4-content")[0].scrollTop=match}else{document.getElementsByClassName("t4-content")[0].scrollTop=0}}}})(jQuery)

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.