PageSourceSearch

https://oklahomaagritourism.com/js/app.js?1

js oklahomaagritourism.com collected 2026-10-02 10:46:28 UTC 313,720 bytes, 11,314 lines download raw bytes

1(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2(function (global){
3; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) {
4/*! Fixedfixed: a CSS position:fixed qualifier. (c)2012 @scottjehl, Filament Group, Inc. Dual license: MIT and/or GPLv2 */
5(function( w, undefined ){
6	
7	var htmlclass = "fixed-supported",
8		el = w.document.createElement( "div" ),
9		ua = w.navigator.userAgent,
10		docEl = w.document.documentElement;
11	
12	// fix the test element
13	el.style.position = "fixed";
14	el.style.top = 0;
15
16	// support test
17	function checkFixed(){
18
19		var scroll = "scrollTop" in w.document.body ? w.document.body.scrollTop : docEl.scrollTop;
20
21		// only run test if there's a scroll we can compare
22		if( scroll !== undefined && scroll > 0 && w.document.body ){
23			
24			w.document.body.insertBefore( el, w.document.body.firstChild );
25
26			if( !el.getBoundingClientRect || el.getBoundingClientRect().top !== 0 ){
27				// Fixed is not working or can't be tested
28				docEl.className = docEl.className.replace( htmlclass, "" );
29			}
30
31			// remove the test element
32			w.document.body.removeChild( el );
33				
34			// unbind the handlers
35			if( w.removeEventListener ){
36				w.removeEventListener( "scroll", checkFixed, false );
37			}
38			else{
39				w.detachEvent( "onscroll", checkFixed );
40			}
41		}		
42	}
43		
44	// if a particular UA is known to return false results with this feature test, try and avoid that UA here.
45	if(
46		// Android 2.1, 2.2, 2.5, and 2.6 Webkit
47		!( ua.match( /Android 2\.[1256]/ ) && ua.indexOf( "AppleWebKit") > -1 ) ||
48		// Opera Mobile less than version 11.0 (7458)
49		!( ua.match( /Opera Mobi\/([0-9]+)/ ) && RegExp.$1 < 7458 ) ||
50		// Opera Mini
51		!( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
52		// Firefox Mobile less than version 6
53		!( ua.match( /Fennec\/([0-9]+)/ ) && RegExp.$1 < 6 )
54		// If necessary, add the other untestable browsers here...
55	){
56		//add the HTML class for now.
57		docEl.className += " " + htmlclass;
58		
59		// bind to scroll event so we can test and potentially degrade
60		if( w.addEventListener ){
61			w.addEventListener( "scroll", checkFixed, false );
62		}
63		else{
64			w.attachEvent( "onscroll", checkFixed );
65		}
66	}
67
68	w.FixedFixed = checkFixed;
69}( this ));
70; browserify_shim__define__module__export__(typeof FixedFixed != "undefined" ? FixedFixed : window.FixedFixed);
71
72}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; });
73
74}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
75},{}],2:[function(require,module,exports){
76(function (global){
77; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) {
78;(function( win, $ ) {
79
80	function featureTest( property, value, noPrefixes ) {
81		// Thanks Modernizr! https://github.com/phistuck/Modernizr/commit/3fb7217f5f8274e2f11fe6cfeda7cfaf9948a1f5
82		var prop = property + ':',
83			el = document.createElement( 'test' ),
84			mStyle = el.style;
85
86		if( !noPrefixes ) {
87			mStyle.cssText = prop + [ '-webkit-', '-moz-', '-ms-', '-o-', '' ].join( value + ';' + prop ) + value + ';';
88		} else {
89			mStyle.cssText = prop + value;
90		}
91		return mStyle[ property ].indexOf( value ) !== -1;
92	}
93
94	function getPx( unit ) {
95		return parseInt( unit, 10 ) || 0;
96	}
97
98	var uniqueIdCounter = 0;
99
100	var S = {
101		classes: {
102			plugin: 'fixedsticky',
103			active: 'fixedsticky-on',
104			inactive: 'fixedsticky-off',
105			clone: 'fixedsticky-dummy',
106			withoutFixedFixed: 'fixedsticky-withoutfixedfixed'
107		},
108		keys: {
109			offset: 'fixedStickyOffset',
110			position: 'fixedStickyPosition',
111			id: 'fixedStickyId'
112		},
113		tests: {
114			sticky: featureTest( 'position', 'sticky' ),
115			fixed: featureTest( 'position', 'fixed', true )
116		},
117		// Thanks jQuery!
118		getScrollTop: function() {
119			var prop = 'pageYOffset',
120				method = 'scrollTop';
121			return win ? (prop in win) ? win[ prop ] :
122				win.document.documentElement[ method ] :
123				win.document.body[ method ];
124		},
125		bypass: function() {
126			// Check native sticky, check fixed and if fixed-fixed is also included on the page and is supported
127			return ( S.tests.sticky && !S.optOut ) ||
128				!S.tests.fixed ||
129				win.FixedFixed && !$( win.document.documentElement ).hasClass( 'fixed-supported' );
130		},
131		update: function( el ) {
132			if( !el.offsetWidth ) { return; }
133
134			var $el = $( el ),
135				height = $el.outerHeight(),
136				initialOffset = $el.data( S.keys.offset ),
137				scroll = S.getScrollTop(),
138				isAlreadyOn = $el.is( '.' + S.classes.active ),
139				toggle = function( turnOn ) {
140					$el[ turnOn ? 'addClass' : 'removeClass' ]( S.classes.active )
141						[ !turnOn ? 'addClass' : 'removeClass' ]( S.classes.inactive );
142				},
143				viewportHeight = $( window ).height(),
144				position = $el.data( S.keys.position ),
145				skipSettingToFixed,
146				elTop,
147				elBottom,
148				$parent = $el.parent(),
149				parentOffset = $parent.offset().top,
150				parentHeight = $parent.outerHeight();
151
152			if( initialOffset === undefined ) {
153				initialOffset = $el.offset().top;
154				$el.data( S.keys.offset, initialOffset );
155				$el.after( $( '<div>' ).addClass( S.classes.clone ).height( height ) );
156			}
157
158			if( !position ) {
159				// Some browsers require fixed/absolute to report accurate top/left values.
160				skipSettingToFixed = $el.css( 'top' ) !== 'auto' || $el.css( 'bottom' ) !== 'auto';
161
162				if( !skipSettingToFixed ) {
163					$el.css( 'position', 'fixed' );
164				}
165
166				position = {
167					top: $el.css( 'top' ) !== 'auto',
168					bottom: $el.css( 'bottom' ) !== 'auto'
169				};
170
171				if( !skipSettingToFixed ) {
172					$el.css( 'position', '' );
173				}
174
175				$el.data( S.keys.position, position );
176			}
177
178			function isFixedToTop() {
179				var offsetTop = scroll + elTop;
180
181				// Initial Offset Top
182				return initialOffset < offsetTop &&
183					// Container Bottom
184					offsetTop + height <= parentOffset + parentHeight;
185			}
186
187			function isFixedToBottom() {
188				// Initial Offset Top + Height
189				return initialOffset + ( height || 0 ) > scroll + viewportHeight - elBottom &&
190					// Container Top
191					scroll + viewportHeight - elBottom >= parentOffset + ( height || 0 );
192			}
193
194			elTop = getPx( $el.css( 'top' ) );
195			elBottom = getPx( $el.css( 'bottom' ) );
196
197			if( position.top && isFixedToTop() || position.bottom && isFixedToBottom() ) {
198				if( !isAlreadyOn ) {
199					toggle( true );
200				}
201			} else {
202				if( isAlreadyOn ) {
203					toggle( false );
204				}
205			}
206		},
207		destroy: function( el ) {
208			var $el = $( el );
209			if (S.bypass()) {
210				return $el;
211			}
212
213			return $el.each(function() {
214				var $this = $( this );
215				var id = $this.data( S.keys.id );
216				$( win ).unbind( '.fixedsticky' + id );
217
218				$this
219					.removeData( [ S.keys.offset, S.keys.position, S.keys.id ] )
220					.removeClass( S.classes.active )
221					.removeClass( S.classes.inactive )
222					.next( '.' + S.classes.clone ).remove();
223			});
224		},
225		init: function( el ) {
226			var $el = $( el );
227
228			if( S.bypass() ) {
229				return $el;
230			}
231
232			return $el.each(function() {
233				var _this = this;
234				var id = uniqueIdCounter++;
235				$( this ).data( S.keys.id, id );
236
237				$( win ).bind( 'scroll.fixedsticky' + id, function() {
238					S.update( _this );
239				}).trigger( 'scroll.fixedsticky' + id );
240
241				$( win ).bind( 'resize.fixedsticky' + id , function() {
242					if( $el.is( '.' + S.classes.active ) ) {
243						S.update( _this );
244					}
245				});
246			});
247		}
248	};
249
250	win.FixedSticky = S;
251
252	// Plugin
253	$.fn.fixedsticky = function( method ) {
254		if ( typeof S[ method ] === 'function') {
255			return S[ method ].call( S, this);
256		} else if ( typeof method === 'object' || ! method ) {
257			return S.init.call( S, this );
258		} else {
259			throw new Error( 'Method `' +  method + '` does not exist on jQuery.fixedsticky' );
260		}
261	};
262
263	// Add fallback when fixed-fixed is not available.
264	if( !win.FixedFixed ) {
265		$( win.document.documentElement ).addClass( S.classes.withoutFixedFixed );
266	}
267
268})( window, jQuery );
269
270; browserify_shim__define__module__export__(typeof FixedSticky != "undefined" ? FixedSticky : window.FixedSticky);
271
272}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; });
273
274}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
275},{}],3:[function(require,module,exports){
276(function (global){
277; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) {
278/*!
279 * jQuery JavaScript Library v3.2.1
280 * https://jquery.com/
281 *
282 * Includes Sizzle.js
283 * https://sizzlejs.com/
284 *
285 * Copyright JS Foundation and other contributors
286 * Released under the MIT license
287 * https://jquery.org/license
288 *
289 * Date: 2017-03-20T18:59Z
290 */
291( function( global, factory ) {
292
293	"use strict";
294
295	if ( typeof module === "object" && typeof module.exports === "object" ) {
296
297		// For CommonJS and CommonJS-like environments where a proper `window`
298		// is present, execute the factory and get jQuery.
299		// For environments that do not have a `window` with a `document`
300		// (such as Node.js), expose a factory as module.exports.
301		// This accentuates the need for the creation of a real `window`.
302		// e.g. var jQuery = require("jquery")(window);
303		// See ticket #14549 for more info.
304		module.exports = global.document ?
305			factory( global, true ) :
306			function( w ) {
307				if ( !w.document ) {
308					throw new Error( "jQuery requires a window with a document" );
309				}
310				return factory( w );
311			};
312	} else {
313		factory( global );
314	}
315
316// Pass this if window is not defined yet
317} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
318
319// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
320// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
321// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), str
vendor: 11,277 bytes, lines 321-808
321ict mode should be common
322// enough that all such attempts are guarded in a try block.
323"use strict";
324
325var arr = [];
326
327var document = window.document;
328
329var getProto = Object.getPrototypeOf;
330
331var slice = arr.slice;
332
333var concat = arr.concat;
334
335var push = arr.push;
336
337var indexOf = arr.indexOf;
338
339var class2type = {};
340
341var toString = class2type.toString;
342
343var hasOwn = class2type.hasOwnProperty;
344
345var fnToString = hasOwn.toString;
346
347var ObjectFunctionString = fnToString.call( Object );
348
349var support = {};
350
351
352
353	function DOMEval( code, doc ) {
354		doc = doc || document;
355
356		var script = doc.createElement( "script" );
357
358		script.text = code;
359		doc.head.appendChild( script ).parentNode.removeChild( script );
360	}
361/* global Symbol */
362// Defining this global in .eslintrc.json would create a danger of using the global
363// unguarded in another place, it seems safer to define global only for this module
364
365
366
367var
368	version = "3.2.1",
369
370	// Define a local copy of jQuery
371	jQuery = function( selector, context ) {
372
373		// The jQuery object is actually just the init constructor 'enhanced'
374		// Need init if jQuery is called (just allow error to be thrown if not included)
375		return new jQuery.fn.init( selector, context );
376	},
377
378	// Support: Android <=4.0 only
379	// Make sure we trim BOM and NBSP
380	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
381
382	// Matches dashed string for camelizing
383	rmsPrefix = /^-ms-/,
384	rdashAlpha = /-([a-z])/g,
385
386	// Used by jQuery.camelCase as callback to replace()
387	fcamelCase = function( all, letter ) {
388		return letter.toUpperCase();
389	};
390
391jQuery.fn = jQuery.prototype = {
392
393	// The current version of jQuery being used
394	jquery: version,
395
396	constructor: jQuery,
397
398	// The default length of a jQuery object is 0
399	length: 0,
400
401	toArray: function() {
402		return slice.call( this );
403	},
404
405	// Get the Nth element in the matched element set OR
406	// Get the whole matched element set as a clean array
407	get: function( num ) {
408
409		// Return all the elements in a clean array
410		if ( num == null ) {
411			return slice.call( this );
412		}
413
414		// Return just the one element from the set
415		return num < 0 ? this[ num + this.length ] : this[ num ];
416	},
417
418	// Take an array of elements and push it onto the stack
419	// (returning the new matched element set)
420	pushStack: function( elems ) {
421
422		// Build a new jQuery matched element set
423		var ret = jQuery.merge( this.constructor(), elems );
424
425		// Add the old object onto the stack (as a reference)
426		ret.prevObject = this;
427
428		// Return the newly-formed element set
429		return ret;
430	},
431
432	// Execute a callback for every element in the matched set.
433	each: function( callback ) {
434		return jQuery.each( this, callback );
435	},
436
437	map: function( callback ) {
438		return this.pushStack( jQuery.map( this, function( elem, i ) {
439			return callback.call( elem, i, elem );
440		} ) );
441	},
442
443	slice: function() {
444		return this.pushStack( slice.apply( this, arguments ) );
445	},
446
447	first: function() {
448		return this.eq( 0 );
449	},
450
451	last: function() {
452		return this.eq( -1 );
453	},
454
455	eq: function( i ) {
456		var len = this.length,
457			j = +i + ( i < 0 ? len : 0 );
458		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
459	},
460
461	end: function() {
462		return this.prevObject || this.constructor();
463	},
464
465	// For internal use only.
466	// Behaves like an Array's method, not like a jQuery method.
467	push: push,
468	sort: arr.sort,
469	splice: arr.splice
470};
471
472jQuery.extend = jQuery.fn.extend = function() {
473	var options, name, src, copy, copyIsArray, clone,
474		target = arguments[ 0 ] || {},
475		i = 1,
476		length = arguments.length,
477		deep = false;
478
479	// Handle a deep copy situation
480	if ( typeof target === "boolean" ) {
481		deep = target;
482
483		// Skip the boolean and the target
484		target = arguments[ i ] || {};
485		i++;
486	}
487
488	// Handle case when target is a string or something (possible in deep copy)
489	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
490		target = {};
491	}
492
493	// Extend jQuery itself if only one argument is passed
494	if ( i === length ) {
495		target = this;
496		i--;
497	}
498
499	for ( ; i < length; i++ ) {
500
501		// Only deal with non-null/undefined values
502		if ( ( options = arguments[ i ] ) != null ) {
503
504			// Extend the base object
505			for ( name in options ) {
506				src = target[ name ];
507				copy = options[ name ];
508
509				// Prevent never-ending loop
510				if ( target === copy ) {
511					continue;
512				}
513
514				// Recurse if we're merging plain objects or arrays
515				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
516					( copyIsArray = Array.isArray( copy ) ) ) ) {
517
518					if ( copyIsArray ) {
519						copyIsArray = false;
520						clone = src && Array.isArray( src ) ? src : [];
521
522					} else {
523						clone = src && jQuery.isPlainObject( src ) ? src : {};
524					}
525
526					// Never move original objects, clone them
527					target[ name ] = jQuery.extend( deep, clone, copy );
528
529				// Don't bring in undefined values
530				} else if ( copy !== undefined ) {
531					target[ name ] = copy;
532				}
533			}
534		}
535	}
536
537	// Return the modified object
538	return target;
539};
540
541jQuery.extend( {
542
543	// Unique for each copy of jQuery on the page
544	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
545
546	// Assume jQuery is ready without the ready module
547	isReady: true,
548
549	error: function( msg ) {
550		throw new Error( msg );
551	},
552
553	noop: function() {},
554
555	isFunction: function( obj ) {
556		return jQuery.type( obj ) === "function";
557	},
558
559	isWindow: function( obj ) {
560		return obj != null && obj === obj.window;
561	},
562
563	isNumeric: function( obj ) {
564
565		// As of jQuery 3.0, isNumeric is limited to
566		// strings and numbers (primitives or objects)
567		// that can be coerced to finite numbers (gh-2662)
568		var type = jQuery.type( obj );
569		return ( type === "number" || type === "string" ) &&
570
571			// parseFloat NaNs numeric-cast false positives ("")
572			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
573			// subtraction forces infinities to NaN
574			!isNaN( obj - parseFloat( obj ) );
575	},
576
577	isPlainObject: function( obj ) {
578		var proto, Ctor;
579
580		// Detect obvious negatives
581		// Use toString instead of jQuery.type to catch host objects
582		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
583			return false;
584		}
585
586		proto = getProto( obj );
587
588		// Objects with no prototype (e.g., `Object.create( null )`) are plain
589		if ( !proto ) {
590			return true;
591		}
592
593		// Objects with prototype are plain iff they were constructed by a global Object function
594		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
595		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
596	},
597
598	isEmptyObject: function( obj ) {
599
600		/* eslint-disable no-unused-vars */
601		// See https://github.com/eslint/eslint/issues/6125
602		var name;
603
604		for ( name in obj ) {
605			return false;
606		}
607		return true;
608	},
609
610	type: function( obj ) {
611		if ( obj == null ) {
612			return obj + "";
613		}
614
615		// Support: Android <=2.3 only (functionish RegExp)
616		return typeof obj === "object" || typeof obj === "function" ?
617			class2type[ toString.call( obj ) ] || "object" :
618			typeof obj;
619	},
620
621	// Evaluates a script in a global context
622	globalEval: function( code ) {
623		DOMEval( code );
624	},
625
626	// Convert dashed to camelCase; used by the css and data modules
627	// Support: IE <=9 - 11, Edge 12 - 13
628	// Microsoft forgot to hump their vendor prefix (#9572)
629	camelCase: function( string ) {
630		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
631	},
632
633	each: function( obj, callback ) {
634		var length, i = 0;
635
636		if ( isArrayLike( obj ) ) {
637			length = obj.length;
638			for ( ; i < length; i++ ) {
639				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
640					break;
641				}
642			}
643		} else {
644			for ( i in obj ) {
645				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
646					break;
647				}
648			}
649		}
650
651		return obj;
652	},
653
654	// Support: Android <=4.0 only
655	trim: function( text ) {
656		return text == null ?
657			"" :
658			( text + "" ).replace( rtrim, "" );
659	},
660
661	// results is for internal usage only
662	makeArray: function( arr, results ) {
663		var ret = results || [];
664
665		if ( arr != null ) {
666			if ( isArrayLike( Object( arr ) ) ) {
667				jQuery.merge( ret,
668					typeof arr === "string" ?
669					[ arr ] : arr
670				);
671			} else {
672				push.call( ret, arr );
673			}
674		}
675
676		return ret;
677	},
678
679	inArray: function( elem, arr, i ) {
680		return arr == null ? -1 : indexOf.call( arr, elem, i );
681	},
682
683	// Support: Android <=4.0 only, PhantomJS 1 only
684	// push.apply(_, arraylike) throws on ancient WebKit
685	merge: function( first, second ) {
686		var len = +second.length,
687			j = 0,
688			i = first.length;
689
690		for ( ; j < len; j++ ) {
691			first[ i++ ] = second[ j ];
692		}
693
694		first.length = i;
695
696		return first;
697	},
698
699	grep: function( elems, callback, invert ) {
700		var callbackInverse,
701			matches = [],
702			i = 0,
703			length = elems.length,
704			callbackExpect = !invert;
705
706		// Go through the array, only saving the items
707		// that pass the validator function
708		for ( ; i < length; i++ ) {
709			callbackInverse = !callback( elems[ i ], i );
710			if ( callbackInverse !== callbackExpect ) {
711				matches.push( elems[ i ] );
712			}
713		}
714
715		return matches;
716	},
717
718	// arg is for internal usage only
719	map: function( elems, callback, arg ) {
720		var length, value,
721			i = 0,
722			ret = [];
723
724		// Go through the array, translating each of the items to their new values
725		if ( isArrayLike( elems ) ) {
726			length = elems.length;
727			for ( ; i < length; i++ ) {
728				value = callback( elems[ i ], i, arg );
729
730				if ( value != null ) {
731					ret.push( value );
732				}
733			}
734
735		// Go through every key on the object,
736		} else {
737			for ( i in elems ) {
738				value = callback( elems[ i ], i, arg );
739
740				if ( value != null ) {
741					ret.push( value );
742				}
743			}
744		}
745
746		// Flatten any nested arrays
747		return concat.apply( [], ret );
748	},
749
750	// A global GUID counter for objects
751	guid: 1,
752
753	// Bind a function to a context, optionally partially applying any
754	// arguments.
755	proxy: function( fn, context ) {
756		var tmp, args, proxy;
757
758		if ( typeof context === "string" ) {
759			tmp = fn[ context ];
760			context = fn;
761			fn = tmp;
762		}
763
764		// Quick check to determine if target is callable, in the spec
765		// this throws a TypeError, but we will just return undefined.
766		if ( !jQuery.isFunction( fn ) ) {
767			return undefined;
768		}
769
770		// Simulated bind
771		args = slice.call( arguments, 2 );
772		proxy = function() {
773			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
774		};
775
776		// Set the guid of unique handler to the same of original handler, so it can be removed
777		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
778
779		return proxy;
780	},
781
782	now: Date.now,
783
784	// jQuery.support is not used in Core but other projects attach their
785	// properties to it so it needs to exist.
786	support: support
787} );
788
789if ( typeof Symbol === "function" ) {
790	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
791}
792
793// Populate the class2type map
794jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
795function( i, name ) {
796	class2type[ "[object " + name + "]" ] = name.toLowerCase();
797} );
798
799function isArrayLike( obj ) {
800
801	// Support: real iOS 8.2 only (not reproducible in simulator)
802	// `in` check used to prevent JIT error (gh-2145)
803	// hasOwn isn't used here due to false negatives
804	// regarding Nodelist length in IE
805	var length = !!obj && "length" in obj && obj.length,
806		type = jQuery.type( obj );
807
808	if ( type === "function" || jQuery.
vendor: 31,442 bytes, lines 808-1905
808isWindow( obj ) ) {
809		return false;
810	}
811
812	return type === "array" || length === 0 ||
813		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
814}
815var Sizzle =
816/*!
817 * Sizzle CSS Selector Engine v2.3.3
818 * https://sizzlejs.com/
819 *
820 * Copyright jQuery Foundation and other contributors
821 * Released under the MIT license
822 * http://jquery.org/license
823 *
824 * Date: 2016-08-08
825 */
826(function( window ) {
827
828var i,
829	support,
830	Expr,
831	getText,
832	isXML,
833	tokenize,
834	compile,
835	select,
836	outermostContext,
837	sortInput,
838	hasDuplicate,
839
840	// Local document vars
841	setDocument,
842	document,
843	docElem,
844	documentIsHTML,
845	rbuggyQSA,
846	rbuggyMatches,
847	matches,
848	contains,
849
850	// Instance-specific data
851	expando = "sizzle" + 1 * new Date(),
852	preferredDoc = window.document,
853	dirruns = 0,
854	done = 0,
855	classCache = createCache(),
856	tokenCache = createCache(),
857	compilerCache = createCache(),
858	sortOrder = function( a, b ) {
859		if ( a === b ) {
860			hasDuplicate = true;
861		}
862		return 0;
863	},
864
865	// Instance methods
866	hasOwn = ({}).hasOwnProperty,
867	arr = [],
868	pop = arr.pop,
869	push_native = arr.push,
870	push = arr.push,
871	slice = arr.slice,
872	// Use a stripped-down indexOf as it's faster than native
873	// https://jsperf.com/thor-indexof-vs-for/5
874	indexOf = function( list, elem ) {
875		var i = 0,
876			len = list.length;
877		for ( ; i < len; i++ ) {
878			if ( list[i] === elem ) {
879				return i;
880			}
881		}
882		return -1;
883	},
884
885	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
886
887	// Regular expressions
888
889	// http://www.w3.org/TR/css3-selectors/#whitespace
890	whitespace = "[\\x20\\t\\r\\n\\f]",
891
892	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
893	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
894
895	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
896	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
897		// Operator (capture 2)
898		"*([*^$|!~]?=)" + whitespace +
899		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
900		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
901		"*\\]",
902
903	pseudos = ":(" + identifier + ")(?:\\((" +
904		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
905		// 1. quoted (capture 3; capture 4 or capture 5)
906		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
907		// 2. simple (capture 6)
908		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
909		// 3. anything else (capture 2)
910		".*" +
911		")\\)|)",
912
913	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
914	rwhitespace = new RegExp( whitespace + "+", "g" ),
915	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
916
917	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
918	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
919
920	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
921
922	rpseudo = new RegExp( pseudos ),
923	ridentifier = new RegExp( "^" + identifier + "$" ),
924
925	matchExpr = {
926		"ID": new RegExp( "^#(" + identifier + ")" ),
927		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
928		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
929		"ATTR": new RegExp( "^" + attributes ),
930		"PSEUDO": new RegExp( "^" + pseudos ),
931		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
932			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
933			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
934		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
935		// For use in libraries implementing .is()
936		// We use this for POS matching in `select`
937		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
938			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
939	},
940
941	rinputs = /^(?:input|select|textarea|button)$/i,
942	rheader = /^h\d$/i,
943
944	rnative = /^[^{]+\{\s*\[native \w/,
945
946	// Easily-parseable/retrievable ID or TAG or CLASS selectors
947	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
948
949	rsibling = /[+~]/,
950
951	// CSS escapes
952	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
953	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
954	funescape = function( _, escaped, escapedWhitespace ) {
955		var high = "0x" + escaped - 0x10000;
956		// NaN means non-codepoint
957		// Support: Firefox<24
958		// Workaround erroneous numeric interpretation of +"0x"
959		return high !== high || escapedWhitespace ?
960			escaped :
961			high < 0 ?
962				// BMP codepoint
963				String.fromCharCode( high + 0x10000 ) :
964				// Supplemental Plane codepoint (surrogate pair)
965				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
966	},
967
968	// CSS string/identifier serialization
969	// https://drafts.csswg.org/cssom/#common-serializing-idioms
970	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
971	fcssescape = function( ch, asCodePoint ) {
972		if ( asCodePoint ) {
973
974			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
975			if ( ch === "\0" ) {
976				return "\uFFFD";
977			}
978
979			// Control characters and (dependent upon position) numbers get escaped as code points
980			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
981		}
982
983		// Other potentially-special ASCII characters get backslash-escaped
984		return "\\" + ch;
985	},
986
987	// Used for iframes
988	// See setDocument()
989	// Removing the function wrapper causes a "Permission Denied"
990	// error in IE
991	unloadHandler = function() {
992		setDocument();
993	},
994
995	disabledAncestor = addCombinator(
996		function( elem ) {
997			return elem.disabled === true && ("form" in elem || "label" in elem);
998		},
999		{ dir: "parentNode", next: "legend" }
1000	);
1001
1002// Optimize for push.apply( _, NodeList )
1003try {
1004	push.apply(
1005		(arr = slice.call( preferredDoc.childNodes )),
1006		preferredDoc.childNodes
1007	);
1008	// Support: Android<4.0
1009	// Detect silently failing push.apply
1010	arr[ preferredDoc.childNodes.length ].nodeType;
1011} catch ( e ) {
1012	push = { apply: arr.length ?
1013
1014		// Leverage slice if possible
1015		function( target, els ) {
1016			push_native.apply( target, slice.call(els) );
1017		} :
1018
1019		// Support: IE<9
1020		// Otherwise append directly
1021		function( target, els ) {
1022			var j = target.length,
1023				i = 0;
1024			// Can't trust NodeList.length
1025			while ( (target[j++] = els[i++]) ) {}
1026			target.length = j - 1;
1027		}
1028	};
1029}
1030
1031function Sizzle( selector, context, results, seed ) {
1032	var m, i, elem, nid, match, groups, newSelector,
1033		newContext = context && context.ownerDocument,
1034
1035		// nodeType defaults to 9, since context defaults to document
1036		nodeType = context ? context.nodeType : 9;
1037
1038	results = results || [];
1039
1040	// Return early from calls with invalid selector or context
1041	if ( typeof selector !== "string" || !selector ||
1042		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
1043
1044		return results;
1045	}
1046
1047	// Try to shortcut find operations (as opposed to filters) in HTML documents
1048	if ( !seed ) {
1049
1050		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
1051			setDocument( context );
1052		}
1053		context = context || document;
1054
1055		if ( documentIsHTML ) {
1056
1057			// If the selector is sufficiently simple, try using a "get*By*" DOM method
1058			// (excepting DocumentFragment context, where the methods don't exist)
1059			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
1060
1061				// ID selector
1062				if ( (m = match[1]) ) {
1063
1064					// Document context
1065					if ( nodeType === 9 ) {
1066						if ( (elem = context.getElementById( m )) ) {
1067
1068							// Support: IE, Opera, Webkit
1069							// TODO: identify versions
1070							// getElementById can match elements by name instead of ID
1071							if ( elem.id === m ) {
1072								results.push( elem );
1073								return results;
1074							}
1075						} else {
1076							return results;
1077						}
1078
1079					// Element context
1080					} else {
1081
1082						// Support: IE, Opera, Webkit
1083						// TODO: identify versions
1084						// getElementById can match elements by name instead of ID
1085						if ( newContext && (elem = newContext.getElementById( m )) &&
1086							contains( context, elem ) &&
1087							elem.id === m ) {
1088
1089							results.push( elem );
1090							return results;
1091						}
1092					}
1093
1094				// Type selector
1095				} else if ( match[2] ) {
1096					push.apply( results, context.getElementsByTagName( selector ) );
1097					return results;
1098
1099				// Class selector
1100				} else if ( (m = match[3]) && support.getElementsByClassName &&
1101					context.getElementsByClassName ) {
1102
1103					push.apply( results, context.getElementsByClassName( m ) );
1104					return results;
1105				}
1106			}
1107
1108			// Take advantage of querySelectorAll
1109			if ( support.qsa &&
1110				!compilerCache[ selector + " " ] &&
1111				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
1112
1113				if ( nodeType !== 1 ) {
1114					newContext = context;
1115					newSelector = selector;
1116
1117				// qSA looks outside Element context, which is not what we want
1118				// Thanks to Andrew Dupont for this workaround technique
1119				// Support: IE <=8
1120				// Exclude object elements
1121				} else if ( context.nodeName.toLowerCase() !== "object" ) {
1122
1123					// Capture the context ID, setting it first if necessary
1124					if ( (nid = context.getAttribute( "id" )) ) {
1125						nid = nid.replace( rcssescape, fcssescape );
1126					} else {
1127						context.setAttribute( "id", (nid = expando) );
1128					}
1129
1130					// Prefix every selector in the list
1131					groups = tokenize( selector );
1132					i = groups.length;
1133					while ( i-- ) {
1134						groups[i] = "#" + nid + " " + toSelector( groups[i] );
1135					}
1136					newSelector = groups.join( "," );
1137
1138					// Expand context for sibling selectors
1139					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
1140						context;
1141				}
1142
1143				if ( newSelector ) {
1144					try {
1145						push.apply( results,
1146							newContext.querySelectorAll( newSelector )
1147						);
1148						return results;
1149					} catch ( qsaError ) {
1150					} finally {
1151						if ( nid === expando ) {
1152							context.removeAttribute( "id" );
1153						}
1154					}
1155				}
1156			}
1157		}
1158	}
1159
1160	// All others
1161	return select( selector.replace( rtrim, "$1" ), context, results, seed );
1162}
1163
1164/**
1165 * Create key-value caches of limited size
1166 * @returns {function(string, object)} Returns the Object data after storing it on itself with
1167 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
1168 *	deleting the oldest entry
1169 */
1170function createCache() {
1171	var keys = [];
1172
1173	function cache( key, value ) {
1174		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
1175		if ( keys.push( key + " " ) > Expr.cacheLength ) {
1176			// Only keep the most recent entries
1177			delete cache[ keys.shift() ];
1178		}
1179		return (cache[ key + " " ] = value);
1180	}
1181	return cache;
1182}
1183
1184/**
1185 * Mark a function for special use by Sizzle
1186 * @param {Function} fn The function to mark
1187 */
1188function markFunction( fn ) {
1189	fn[ expando ] = true;
1190	return fn;
1191}
1192
1193/**
1194 * Support testing using an element
1195 * @param {Function} fn Passed the created element and returns a boolean result
1196 */
1197function assert( fn ) {
1198	var el = document.createElement("fieldset");
1199
1200	try {
1201		return !!fn( el );
1202	} catch (e) {
1203		return false;
1204	} finally {
1205		// Remove from its parent by default
1206		if ( el.parentNode ) {
1207			el.parentNode.removeChild( el );
1208		}
1209		// release memory in IE
1210		el = null;
1211	}
1212}
1213
1214/**
1215 * Adds the same handler for all of the specified attrs
1216 * @param {String} attrs Pipe-separated list of attributes
1217 * @param {Function} handler The method that will be applied
1218 */
1219function addHandle( attrs, handler ) {
1220	var arr = attrs.split("|"),
1221		i = arr.length;
1222
1223	while ( i-- ) {
1224		Expr.attrHandle[ arr[i] ] = handler;
1225	}
1226}
1227
1228/**
1229 * Checks document order of two siblings
1230 * @param {Element} a
1231 * @param {Element} b
1232 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1233 */
1234function siblingCheck( a, b ) {
1235	var cur = b && a,
1236		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
1237			a.sourceIndex - b.sourceIndex;
1238
1239	// Use IE sourceIndex if available on both nodes
1240	if ( diff ) {
1241		return diff;
1242	}
1243
1244	// Check if b follows a
1245	if ( cur ) {
1246		while ( (cur = cur.nextSibling) ) {
1247			if ( cur === b ) {
1248				return -1;
1249			}
1250		}
1251	}
1252
1253	return a ? 1 : -1;
1254}
1255
1256/**
1257 * Returns a function to use in pseudos for input types
1258 * @param {String} type
1259 */
1260function createInputPseudo( type ) {
1261	return function( elem ) {
1262		var name = elem.nodeName.toLowerCase();
1263		return name === "input" && elem.type === type;
1264	};
1265}
1266
1267/**
1268 * Returns a function to use in pseudos for buttons
1269 * @param {String} type
1270 */
1271function createButtonPseudo( type ) {
1272	return function( elem ) {
1273		var name = elem.nodeName.toLowerCase();
1274		return (name === "input" || name === "button") && elem.type === type;
1275	};
1276}
1277
1278/**
1279 * Returns a function to use in pseudos for :enabled/:disabled
1280 * @param {Boolean} disabled true for :disabled; false for :enabled
1281 */
1282function createDisabledPseudo( disabled ) {
1283
1284	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1285	return function( elem ) {
1286
1287		// Only certain elements can match :enabled or :disabled
1288		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1289		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1290		if ( "form" in elem ) {
1291
1292			// Check for inherited disabledness on relevant non-disabled elements:
1293			// * listed form-associated elements in a disabled fieldset
1294			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1295			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1296			// * option elements in a disabled optgroup
1297			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1298			// All such elements have a "form" property.
1299			if ( elem.parentNode && elem.disabled === false ) {
1300
1301				// Option elements defer to a parent optgroup if present
1302				if ( "label" in elem ) {
1303					if ( "label" in elem.parentNode ) {
1304						return elem.parentNode.disabled === disabled;
1305					} else {
1306						return elem.disabled === disabled;
1307					}
1308				}
1309
1310				// Support: IE 6 - 11
1311				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1312				return elem.isDisabled === disabled ||
1313
1314					// Where there is no isDisabled, check manually
1315					/* jshint -W018 */
1316					elem.isDisabled !== !disabled &&
1317						disabledAncestor( elem ) === disabled;
1318			}
1319
1320			return elem.disabled === disabled;
1321
1322		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1323		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1324		// even exist on them, let alone have a boolean value.
1325		} else if ( "label" in elem ) {
1326			return elem.disabled === disabled;
1327		}
1328
1329		// Remaining elements are neither :enabled nor :disabled
1330		return false;
1331	};
1332}
1333
1334/**
1335 * Returns a function to use in pseudos for positionals
1336 * @param {Function} fn
1337 */
1338function createPositionalPseudo( fn ) {
1339	return markFunction(function( argument ) {
1340		argument = +argument;
1341		return markFunction(function( seed, matches ) {
1342			var j,
1343				matchIndexes = fn( [], seed.length, argument ),
1344				i = matchIndexes.length;
1345
1346			// Match elements found at the specified indexes
1347			while ( i-- ) {
1348				if ( seed[ (j = matchIndexes[i]) ] ) {
1349					seed[j] = !(matches[j] = seed[j]);
1350				}
1351			}
1352		});
1353	});
1354}
1355
1356/**
1357 * Checks a node for validity as a Sizzle context
1358 * @param {Element|Object=} context
1359 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1360 */
1361function testContext( context ) {
1362	return context && typeof context.getElementsByTagName !== "undefined" && context;
1363}
1364
1365// Expose support vars for convenience
1366support = Sizzle.support = {};
1367
1368/**
1369 * Detects XML nodes
1370 * @param {Element|Object} elem An element or a document
1371 * @returns {Boolean} True iff elem is a non-HTML XML node
1372 */
1373isXML = Sizzle.isXML = function( elem ) {
1374	// documentElement is verified for cases where it doesn't yet exist
1375	// (such as loading iframes in IE - #4833)
1376	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1377	return documentElement ? documentElement.nodeName !== "HTML" : false;
1378};
1379
1380/**
1381 * Sets document-related variables once based on the current document
1382 * @param {Element|Object} [doc] An element or document object to use to set the document
1383 * @returns {Object} Returns the current document
1384 */
1385setDocument = Sizzle.setDocument = function( node ) {
1386	var hasCompare, subWindow,
1387		doc = node ? node.ownerDocument || node : preferredDoc;
1388
1389	// Return early if doc is invalid or already selected
1390	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1391		return document;
1392	}
1393
1394	// Update global variables
1395	document = doc;
1396	docElem = document.documentElement;
1397	documentIsHTML = !isXML( document );
1398
1399	// Support: IE 9-11, Edge
1400	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1401	if ( preferredDoc !== document &&
1402		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1403
1404		// Support: IE 11, Edge
1405		if ( subWindow.addEventListener ) {
1406			subWindow.addEventListener( "unload", unloadHandler, false );
1407
1408		// Support: IE 9 - 10 only
1409		} else if ( subWindow.attachEvent ) {
1410			subWindow.attachEvent( "onunload", unloadHandler );
1411		}
1412	}
1413
1414	/* Attributes
1415	---------------------------------------------------------------------- */
1416
1417	// Support: IE<8
1418	// Verify that getAttribute really returns attributes and not properties
1419	// (excepting IE8 booleans)
1420	support.attributes = assert(function( el ) {
1421		el.className = "i";
1422		return !el.getAttribute("className");
1423	});
1424
1425	/* getElement(s)By*
1426	---------------------------------------------------------------------- */
1427
1428	// Check if getElementsByTagName("*") returns only elements
1429	support.getElementsByTagName = assert(function( el ) {
1430		el.appendChild( document.createComment("") );
1431		return !el.getElementsByTagName("*").length;
1432	});
1433
1434	// Support: IE<9
1435	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1436
1437	// Support: IE<10
1438	// Check if getElementById returns elements by name
1439	// The broken getElementById methods don't pick up programmatically-set names,
1440	// so use a roundabout getElementsByName test
1441	support.getById = assert(function( el ) {
1442		docElem.appendChild( el ).id = expando;
1443		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1444	});
1445
1446	// ID filter and find
1447	if ( support.getById ) {
1448		Expr.filter["ID"] = function( id ) {
1449			var attrId = id.replace( runescape, funescape );
1450			return function( elem ) {
1451				return elem.getAttribute("id") === attrId;
1452			};
1453		};
1454		Expr.find["ID"] = function( id, context ) {
1455			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1456				var elem = context.getElementById( id );
1457				return elem ? [ elem ] : [];
1458			}
1459		};
1460	} else {
1461		Expr.filter["ID"] =  function( id ) {
1462			var attrId = id.replace( runescape, funescape );
1463			return function( elem ) {
1464				var node = typeof elem.getAttributeNode !== "undefined" &&
1465					elem.getAttributeNode("id");
1466				return node && node.value === attrId;
1467			};
1468		};
1469
1470		// Support: IE 6 - 7 only
1471		// getElementById is not reliable as a find shortcut
1472		Expr.find["ID"] = function( id, context ) {
1473			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1474				var node, i, elems,
1475					elem = context.getElementById( id );
1476
1477				if ( elem ) {
1478
1479					// Verify the id attribute
1480					node = elem.getAttributeNode("id");
1481					if ( node && node.value === id ) {
1482						return [ elem ];
1483					}
1484
1485					// Fall back on getElementsByName
1486					elems = context.getElementsByName( id );
1487					i = 0;
1488					while ( (elem = elems[i++]) ) {
1489						node = elem.getAttributeNode("id");
1490						if ( node && node.value === id ) {
1491							return [ elem ];
1492						}
1493					}
1494				}
1495
1496				return [];
1497			}
1498		};
1499	}
1500
1501	// Tag
1502	Expr.find["TAG"] = support.getElementsByTagName ?
1503		function( tag, context ) {
1504			if ( typeof context.getElementsByTagName !== "undefined" ) {
1505				return context.getElementsByTagName( tag );
1506
1507			// DocumentFragment nodes don't have gEBTN
1508			} else if ( support.qsa ) {
1509				return context.querySelectorAll( tag );
1510			}
1511		} :
1512
1513		function( tag, context ) {
1514			var elem,
1515				tmp = [],
1516				i = 0,
1517				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1518				results = context.getElementsByTagName( tag );
1519
1520			// Filter out possible comments
1521			if ( tag === "*" ) {
1522				while ( (elem = results[i++]) ) {
1523					if ( elem.nodeType === 1 ) {
1524						tmp.push( elem );
1525					}
1526				}
1527
1528				return tmp;
1529			}
1530			return results;
1531		};
1532
1533	// Class
1534	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1535		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1536			return context.getElementsByClassName( className );
1537		}
1538	};
1539
1540	/* QSA/matchesSelector
1541	---------------------------------------------------------------------- */
1542
1543	// QSA and matchesSelector support
1544
1545	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1546	rbuggyMatches = [];
1547
1548	// qSa(:focus) reports false when true (Chrome 21)
1549	// We allow this because of a bug in IE8/9 that throws an error
1550	// whenever `document.activeElement` is accessed on an iframe
1551	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1552	// See https://bugs.jquery.com/ticket/13378
1553	rbuggyQSA = [];
1554
1555	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1556		// Build QSA regex
1557		// Regex strategy adopted from Diego Perini
1558		assert(function( el ) {
1559			// Select is set to empty string on purpose
1560			// This is to test IE's treatment of not explicitly
1561			// setting a boolean content attribute,
1562			// since its presence should be enough
1563			// https://bugs.jquery.com/ticket/12359
1564			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1565				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1566				"<option selected=''></option></select>";
1567
1568			// Support: IE8, Opera 11-12.16
1569			// Nothing should be selected when empty strings follow ^= or $= or *=
1570			// The test attribute must be unknown in Opera but "safe" for WinRT
1571			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1572			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1573				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1574			}
1575
1576			// Support: IE8
1577			// Boolean attributes and "value" are not treated correctly
1578			if ( !el.querySelectorAll("[selected]").length ) {
1579				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1580			}
1581
1582			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1583			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1584				rbuggyQSA.push("~=");
1585			}
1586
1587			// Webkit/Opera - :checked should return selected option elements
1588			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1589			// IE8 throws error here and will not see later tests
1590			if ( !el.querySelectorAll(":checked").length ) {
1591				rbuggyQSA.push(":checked");
1592			}
1593
1594			// Support: Safari 8+, iOS 8+
1595			// https://bugs.webkit.org/show_bug.cgi?id=136851
1596			// In-page `selector#id sibling-combinator selector` fails
1597			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1598				rbuggyQSA.push(".#.+[+~]");
1599			}
1600		});
1601
1602		assert(function( el ) {
1603			el.innerHTML = "<a href='' disabled='disabled'></a>" +
1604				"<select disabled='disabled'><option/></select>";
1605
1606			// Support: Windows 8 Native Apps
1607			// The type and name attributes are restricted during .innerHTML assignment
1608			var input = document.createElement("input");
1609			input.setAttribute( "type", "hidden" );
1610			el.appendChild( input ).setAttribute( "name", "D" );
1611
1612			// Support: IE8
1613			// Enforce case-sensitivity of name attribute
1614			if ( el.querySelectorAll("[name=d]").length ) {
1615				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1616			}
1617
1618			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1619			// IE8 throws error here and will not see later tests
1620			if ( el.querySelectorAll(":enabled").length !== 2 ) {
1621				rbuggyQSA.push( ":enabled", ":disabled" );
1622			}
1623
1624			// Support: IE9-11+
1625			// IE's :disabled selector does not pick up the children of disabled fieldsets
1626			docElem.appendChild( el ).disabled = true;
1627			if ( el.querySelectorAll(":disabled").length !== 2 ) {
1628				rbuggyQSA.push( ":enabled", ":disabled" );
1629			}
1630
1631			// Opera 10-11 does not throw on post-comma invalid pseudos
1632			el.querySelectorAll("*,:x");
1633			rbuggyQSA.push(",.*:");
1634		});
1635	}
1636
1637	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1638		docElem.webkitMatchesSelector ||
1639		docElem.mozMatchesSelector ||
1640		docElem.oMatchesSelector ||
1641		docElem.msMatchesSelector) )) ) {
1642
1643		assert(function( el ) {
1644			// Check to see if it's possible to do matchesSelector
1645			// on a disconnected node (IE 9)
1646			support.disconnectedMatch = matches.call( el, "*" );
1647
1648			// This should fail with an exception
1649			// Gecko does not error, returns false instead
1650			matches.call( el, "[s!='']:x" );
1651			rbuggyMatches.push( "!=", pseudos );
1652		});
1653	}
1654
1655	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1656	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1657
1658	/* Contains
1659	---------------------------------------------------------------------- */
1660	hasCompare = rnative.test( docElem.compareDocumentPosition );
1661
1662	// Element contains another
1663	// Purposefully self-exclusive
1664	// As in, an element does not contain itself
1665	contains = hasCompare || rnative.test( docElem.contains ) ?
1666		function( a, b ) {
1667			var adown = a.nodeType === 9 ? a.documentElement : a,
1668				bup = b && b.parentNode;
1669			return a === bup || !!( bup && bup.nodeType === 1 && (
1670				adown.contains ?
1671					adown.contains( bup ) :
1672					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1673			));
1674		} :
1675		function( a, b ) {
1676			if ( b ) {
1677				while ( (b = b.parentNode) ) {
1678					if ( b === a ) {
1679						return true;
1680					}
1681				}
1682			}
1683			return false;
1684		};
1685
1686	/* Sorting
1687	---------------------------------------------------------------------- */
1688
1689	// Document order sorting
1690	sortOrder = hasCompare ?
1691	function( a, b ) {
1692
1693		// Flag for duplicate removal
1694		if ( a === b ) {
1695			hasDuplicate = true;
1696			return 0;
1697		}
1698
1699		// Sort on method existence if only one input has compareDocumentPosition
1700		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1701		if ( compare ) {
1702			return compare;
1703		}
1704
1705		// Calculate position if both inputs belong to the same document
1706		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1707			a.compareDocumentPosition( b ) :
1708
1709			// Otherwise we know they are disconnected
1710			1;
1711
1712		// Disconnected nodes
1713		if ( compare & 1 ||
1714			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1715
1716			// Choose the first element that is related to our preferred document
1717			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1718				return -1;
1719			}
1720			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1721				return 1;
1722			}
1723
1724			// Maintain original order
1725			return sortInput ?
1726				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1727				0;
1728		}
1729
1730		return compare & 4 ? -1 : 1;
1731	} :
1732	function( a, b ) {
1733		// Exit early if the nodes are identical
1734		if ( a === b ) {
1735			hasDuplicate = true;
1736			return 0;
1737		}
1738
1739		var cur,
1740			i = 0,
1741			aup = a.parentNode,
1742			bup = b.parentNode,
1743			ap = [ a ],
1744			bp = [ b ];
1745
1746		// Parentless nodes are either documents or disconnected
1747		if ( !aup || !bup ) {
1748			return a === document ? -1 :
1749				b === document ? 1 :
1750				aup ? -1 :
1751				bup ? 1 :
1752				sortInput ?
1753				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1754				0;
1755
1756		// If the nodes are siblings, we can do a quick check
1757		} else if ( aup === bup ) {
1758			return siblingCheck( a, b );
1759		}
1760
1761		// Otherwise we need full lists of their ancestors for comparison
1762		cur = a;
1763		while ( (cur = cur.parentNode) ) {
1764			ap.unshift( cur );
1765		}
1766		cur = b;
1767		while ( (cur = cur.parentNode) ) {
1768			bp.unshift( cur );
1769		}
1770
1771		// Walk down the tree looking for a discrepancy
1772		while ( ap[i] === bp[i] ) {
1773			i++;
1774		}
1775
1776		return i ?
1777			// Do a sibling check if the nodes have a common ancestor
1778			siblingCheck( ap[i], bp[i] ) :
1779
1780			// Otherwise nodes in our document sort first
1781			ap[i] === preferredDoc ? -1 :
1782			bp[i] === preferredDoc ? 1 :
1783			0;
1784	};
1785
1786	return document;
1787};
1788
1789Sizzle.matches = function( expr, elements ) {
1790	return Sizzle( expr, null, null, elements );
1791};
1792
1793Sizzle.matchesSelector = function( elem, expr ) {
1794	// Set document vars if needed
1795	if ( ( elem.ownerDocument || elem ) !== document ) {
1796		setDocument( elem );
1797	}
1798
1799	// Make sure that attribute selectors are quoted
1800	expr = expr.replace( rattributeQuotes, "='$1']" );
1801
1802	if ( support.matchesSelector && documentIsHTML &&
1803		!compilerCache[ expr + " " ] &&
1804		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1805		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1806
1807		try {
1808			var ret = matches.call( elem, expr );
1809
1810			// IE 9's matchesSelector returns false on disconnected nodes
1811			if ( ret || support.disconnectedMatch ||
1812					// As well, disconnected nodes are said to be in a document
1813					// fragment in IE 9
1814					elem.document && elem.document.nodeType !== 11 ) {
1815				return ret;
1816			}
1817		} catch (e) {}
1818	}
1819
1820	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1821};
1822
1823Sizzle.contains = function( context, elem ) {
1824	// Set document vars if needed
1825	if ( ( context.ownerDocument || context ) !== document ) {
1826		setDocument( context );
1827	}
1828	return contains( context, elem );
1829};
1830
1831Sizzle.attr = function( elem, name ) {
1832	// Set document vars if needed
1833	if ( ( elem.ownerDocument || elem ) !== document ) {
1834		setDocument( elem );
1835	}
1836
1837	var fn = Expr.attrHandle[ name.toLowerCase() ],
1838		// Don't get fooled by Object.prototype properties (jQuery #13807)
1839		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1840			fn( elem, name, !documentIsHTML ) :
1841			undefined;
1842
1843	return val !== undefined ?
1844		val :
1845		support.attributes || !documentIsHTML ?
1846			elem.getAttribute( name ) :
1847			(val = elem.getAttributeNode(name)) && val.specified ?
1848				val.value :
1849				null;
1850};
1851
1852Sizzle.escape = function( sel ) {
1853	return (sel + "").replace( rcssescape, fcssescape );
1854};
1855
1856Sizzle.error = function( msg ) {
1857	throw new Error( "Syntax error, unrecognized expression: " + msg );
1858};
1859
1860/**
1861 * Document sorting and removing duplicates
1862 * @param {ArrayLike} results
1863 */
1864Sizzle.uniqueSort = function( results ) {
1865	var elem,
1866		duplicates = [],
1867		j = 0,
1868		i = 0;
1869
1870	// Unless we *know* we can detect duplicates, assume their presence
1871	hasDuplicate = !support.detectDuplicates;
1872	sortInput = !support.sortStable && results.slice( 0 );
1873	results.sort( sortOrder );
1874
1875	if ( hasDuplicate ) {
1876		while ( (elem = results[i++]) ) {
1877			if ( elem === results[ i ] ) {
1878				j = duplicates.push( i );
1879			}
1880		}
1881		while ( j-- ) {
1882			results.splice( duplicates[ j ], 1 );
1883		}
1884	}
1885
1886	// Clear input after sorting to release objects
1887	// See https://github.com/jquery/sizzle/pull/225
1888	sortInput = null;
1889
1890	return results;
1891};
1892
1893/**
1894 * Utility function for retrieving the text value of an array of DOM nodes
1895 * @param {Array|Element} elem
1896 */
1897getText = Sizzle.getText = function( elem ) {
1898	var node,
1899		ret = "",
1900		i = 0,
1901		nodeType = elem.nodeType;
1902
1903	if ( !nodeType ) {
1904		// If no nodeType, this is expected to be an array
1905		while ( (node = elem[i++]) ) {
vendor: 11,976 bytes, lines 1906-2304
1906			// Do not traverse comment nodes
1907			ret += getText( node );
1908		}
1909	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1910		// Use textContent for elements
1911		// innerText usage removed for consistency of new lines (jQuery #11153)
1912		if ( typeof elem.textContent === "string" ) {
1913			return elem.textContent;
1914		} else {
1915			// Traverse its children
1916			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1917				ret += getText( elem );
1918			}
1919		}
1920	} else if ( nodeType === 3 || nodeType === 4 ) {
1921		return elem.nodeValue;
1922	}
1923	// Do not include comment or processing instruction nodes
1924
1925	return ret;
1926};
1927
1928Expr = Sizzle.selectors = {
1929
1930	// Can be adjusted by the user
1931	cacheLength: 50,
1932
1933	createPseudo: markFunction,
1934
1935	match: matchExpr,
1936
1937	attrHandle: {},
1938
1939	find: {},
1940
1941	relative: {
1942		">": { dir: "parentNode", first: true },
1943		" ": { dir: "parentNode" },
1944		"+": { dir: "previousSibling", first: true },
1945		"~": { dir: "previousSibling" }
1946	},
1947
1948	preFilter: {
1949		"ATTR": function( match ) {
1950			match[1] = match[1].replace( runescape, funescape );
1951
1952			// Move the given value to match[3] whether quoted or unquoted
1953			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1954
1955			if ( match[2] === "~=" ) {
1956				match[3] = " " + match[3] + " ";
1957			}
1958
1959			return match.slice( 0, 4 );
1960		},
1961
1962		"CHILD": function( match ) {
1963			/* matches from matchExpr["CHILD"]
1964				1 type (only|nth|...)
1965				2 what (child|of-type)
1966				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1967				4 xn-component of xn+y argument ([+-]?\d*n|)
1968				5 sign of xn-component
1969				6 x of xn-component
1970				7 sign of y-component
1971				8 y of y-component
1972			*/
1973			match[1] = match[1].toLowerCase();
1974
1975			if ( match[1].slice( 0, 3 ) === "nth" ) {
1976				// nth-* requires argument
1977				if ( !match[3] ) {
1978					Sizzle.error( match[0] );
1979				}
1980
1981				// numeric x and y parameters for Expr.filter.CHILD
1982				// remember that false/true cast respectively to 0/1
1983				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1984				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1985
1986			// other types prohibit arguments
1987			} else if ( match[3] ) {
1988				Sizzle.error( match[0] );
1989			}
1990
1991			return match;
1992		},
1993
1994		"PSEUDO": function( match ) {
1995			var excess,
1996				unquoted = !match[6] && match[2];
1997
1998			if ( matchExpr["CHILD"].test( match[0] ) ) {
1999				return null;
2000			}
2001
2002			// Accept quoted arguments as-is
2003			if ( match[3] ) {
2004				match[2] = match[4] || match[5] || "";
2005
2006			// Strip excess characters from unquoted arguments
2007			} else if ( unquoted && rpseudo.test( unquoted ) &&
2008				// Get excess from tokenize (recursively)
2009				(excess = tokenize( unquoted, true )) &&
2010				// advance to the next closing parenthesis
2011				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
2012
2013				// excess is a negative index
2014				match[0] = match[0].slice( 0, excess );
2015				match[2] = unquoted.slice( 0, excess );
2016			}
2017
2018			// Return only captures needed by the pseudo filter method (type and argument)
2019			return match.slice( 0, 3 );
2020		}
2021	},
2022
2023	filter: {
2024
2025		"TAG": function( nodeNameSelector ) {
2026			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
2027			return nodeNameSelector === "*" ?
2028				function() { return true; } :
2029				function( elem ) {
2030					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
2031				};
2032		},
2033
2034		"CLASS": function( className ) {
2035			var pattern = classCache[ className + " " ];
2036
2037			return pattern ||
2038				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
2039				classCache( className, function( elem ) {
2040					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
2041				});
2042		},
2043
2044		"ATTR": function( name, operator, check ) {
2045			return function( elem ) {
2046				var result = Sizzle.attr( elem, name );
2047
2048				if ( result == null ) {
2049					return operator === "!=";
2050				}
2051				if ( !operator ) {
2052					return true;
2053				}
2054
2055				result += "";
2056
2057				return operator === "=" ? result === check :
2058					operator === "!=" ? result !== check :
2059					operator === "^=" ? check && result.indexOf( check ) === 0 :
2060					operator === "*=" ? check && result.indexOf( check ) > -1 :
2061					operator === "$=" ? check && result.slice( -check.length ) === check :
2062					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
2063					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
2064					false;
2065			};
2066		},
2067
2068		"CHILD": function( type, what, argument, first, last ) {
2069			var simple = type.slice( 0, 3 ) !== "nth",
2070				forward = type.slice( -4 ) !== "last",
2071				ofType = what === "of-type";
2072
2073			return first === 1 && last === 0 ?
2074
2075				// Shortcut for :nth-*(n)
2076				function( elem ) {
2077					return !!elem.parentNode;
2078				} :
2079
2080				function( elem, context, xml ) {
2081					var cache, uniqueCache, outerCache, node, nodeIndex, start,
2082						dir = simple !== forward ? "nextSibling" : "previousSibling",
2083						parent = elem.parentNode,
2084						name = ofType && elem.nodeName.toLowerCase(),
2085						useCache = !xml && !ofType,
2086						diff = false;
2087
2088					if ( parent ) {
2089
2090						// :(first|last|only)-(child|of-type)
2091						if ( simple ) {
2092							while ( dir ) {
2093								node = elem;
2094								while ( (node = node[ dir ]) ) {
2095									if ( ofType ?
2096										node.nodeName.toLowerCase() === name :
2097										node.nodeType === 1 ) {
2098
2099										return false;
2100									}
2101								}
2102								// Reverse direction for :only-* (if we haven't yet done so)
2103								start = dir = type === "only" && !start && "nextSibling";
2104							}
2105							return true;
2106						}
2107
2108						start = [ forward ? parent.firstChild : parent.lastChild ];
2109
2110						// non-xml :nth-child(...) stores cache data on `parent`
2111						if ( forward && useCache ) {
2112
2113							// Seek `elem` from a previously-cached index
2114
2115							// ...in a gzip-friendly way
2116							node = parent;
2117							outerCache = node[ expando ] || (node[ expando ] = {});
2118
2119							// Support: IE <9 only
2120							// Defend against cloned attroperties (jQuery gh-1709)
2121							uniqueCache = outerCache[ node.uniqueID ] ||
2122								(outerCache[ node.uniqueID ] = {});
2123
2124							cache = uniqueCache[ type ] || [];
2125							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2126							diff = nodeIndex && cache[ 2 ];
2127							node = nodeIndex && parent.childNodes[ nodeIndex ];
2128
2129							while ( (node = ++nodeIndex && node && node[ dir ] ||
2130
2131								// Fallback to seeking `elem` from the start
2132								(diff = nodeIndex = 0) || start.pop()) ) {
2133
2134								// When found, cache indexes on `parent` and break
2135								if ( node.nodeType === 1 && ++diff && node === elem ) {
2136									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
2137									break;
2138								}
2139							}
2140
2141						} else {
2142							// Use previously-cached element index if available
2143							if ( useCache ) {
2144								// ...in a gzip-friendly way
2145								node = elem;
2146								outerCache = node[ expando ] || (node[ expando ] = {});
2147
2148								// Support: IE <9 only
2149								// Defend against cloned attroperties (jQuery gh-1709)
2150								uniqueCache = outerCache[ node.uniqueID ] ||
2151									(outerCache[ node.uniqueID ] = {});
2152
2153								cache = uniqueCache[ type ] || [];
2154								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2155								diff = nodeIndex;
2156							}
2157
2158							// xml :nth-child(...)
2159							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
2160							if ( diff === false ) {
2161								// Use the same loop as above to seek `elem` from the start
2162								while ( (node = ++nodeIndex && node && node[ dir ] ||
2163									(diff = nodeIndex = 0) || start.pop()) ) {
2164
2165									if ( ( ofType ?
2166										node.nodeName.toLowerCase() === name :
2167										node.nodeType === 1 ) &&
2168										++diff ) {
2169
2170										// Cache the index of each encountered element
2171										if ( useCache ) {
2172											outerCache = node[ expando ] || (node[ expando ] = {});
2173
2174											// Support: IE <9 only
2175											// Defend against cloned attroperties (jQuery gh-1709)
2176											uniqueCache = outerCache[ node.uniqueID ] ||
2177												(outerCache[ node.uniqueID ] = {});
2178
2179											uniqueCache[ type ] = [ dirruns, diff ];
2180										}
2181
2182										if ( node === elem ) {
2183											break;
2184										}
2185									}
2186								}
2187							}
2188						}
2189
2190						// Incorporate the offset, then check against cycle size
2191						diff -= last;
2192						return diff === first || ( diff % first === 0 && diff / first >= 0 );
2193					}
2194				};
2195		},
2196
2197		"PSEUDO": function( pseudo, argument ) {
2198			// pseudo-class names are case-insensitive
2199			// http://www.w3.org/TR/selectors/#pseudo-classes
2200			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2201			// Remember that setFilters inherits from pseudos
2202			var args,
2203				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2204					Sizzle.error( "unsupported pseudo: " + pseudo );
2205
2206			// The user may use createPseudo to indicate that
2207			// arguments are needed to create the filter function
2208			// just as Sizzle does
2209			if ( fn[ expando ] ) {
2210				return fn( argument );
2211			}
2212
2213			// But maintain support for old signatures
2214			if ( fn.length > 1 ) {
2215				args = [ pseudo, pseudo, "", argument ];
2216				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2217					markFunction(function( seed, matches ) {
2218						var idx,
2219							matched = fn( seed, argument ),
2220							i = matched.length;
2221						while ( i-- ) {
2222							idx = indexOf( seed, matched[i] );
2223							seed[ idx ] = !( matches[ idx ] = matched[i] );
2224						}
2225					}) :
2226					function( elem ) {
2227						return fn( elem, 0, args );
2228					};
2229			}
2230
2231			return fn;
2232		}
2233	},
2234
2235	pseudos: {
2236		// Potentially complex pseudos
2237		"not": markFunction(function( selector ) {
2238			// Trim the selector passed to compile
2239			// to avoid treating leading and trailing
2240			// spaces as combinators
2241			var input = [],
2242				results = [],
2243				matcher = compile( selector.replace( rtrim, "$1" ) );
2244
2245			return matcher[ expando ] ?
2246				markFunction(function( seed, matches, context, xml ) {
2247					var elem,
2248						unmatched = matcher( seed, null, xml, [] ),
2249						i = seed.length;
2250
2251					// Match elements unmatched by `matcher`
2252					while ( i-- ) {
2253						if ( (elem = unmatched[i]) ) {
2254							seed[i] = !(matches[i] = elem);
2255						}
2256					}
2257				}) :
2258				function( elem, context, xml ) {
2259					input[0] = elem;
2260					matcher( input, null, xml, results );
2261					// Don't keep the element (issue #299)
2262					input[0] = null;
2263					return !results.pop();
2264				};
2265		}),
2266
2267		"has": markFunction(function( selector ) {
2268			return function( elem ) {
2269				return Sizzle( selector, elem ).length > 0;
2270			};
2271		}),
2272
2273		"contains": markFunction(function( text ) {
2274			text = text.replace( runescape, funescape );
2275			return function( elem ) {
2276				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2277			};
2278		}),
2279
2280		// "Whether an element is represented by a :lang() selector
2281		// is based solely on the element's language value
2282		// being equal to the identifier C,
2283		// or beginning with the identifier C immediately followed by "-".
2284		// The matching of C against the element's language value is performed case-insensitively.
2285		// The identifier C does not have to be a valid language name."
2286		// http://www.w3.org/TR/selectors/#lang-pseudo
2287		"lang": markFunction( function( lang ) {
2288			// lang value must be a valid identifier
2289			if ( !ridentifier.test(lang || "") ) {
2290				Sizzle.error( "unsupported lang: " + lang );
2291			}
2292			lang = lang.replace( runescape, funescape ).toLowerCase();
2293			return function( elem ) {
2294				var elemLang;
2295				do {
2296					if ( (elemLang = documentIsHTML ?
2297						elem.lang :
2298						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2299
2300						elemLang = elemLang.toLowerCase();
2301						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2302					}
2303				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2304				return false;
vendor: 22,724 bytes, lines 2305-3127
2305			};
2306		}),
2307
2308		// Miscellaneous
2309		"target": function( elem ) {
2310			var hash = window.location && window.location.hash;
2311			return hash && hash.slice( 1 ) === elem.id;
2312		},
2313
2314		"root": function( elem ) {
2315			return elem === docElem;
2316		},
2317
2318		"focus": function( elem ) {
2319			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2320		},
2321
2322		// Boolean properties
2323		"enabled": createDisabledPseudo( false ),
2324		"disabled": createDisabledPseudo( true ),
2325
2326		"checked": function( elem ) {
2327			// In CSS3, :checked should return both checked and selected elements
2328			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2329			var nodeName = elem.nodeName.toLowerCase();
2330			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2331		},
2332
2333		"selected": function( elem ) {
2334			// Accessing this property makes selected-by-default
2335			// options in Safari work properly
2336			if ( elem.parentNode ) {
2337				elem.parentNode.selectedIndex;
2338			}
2339
2340			return elem.selected === true;
2341		},
2342
2343		// Contents
2344		"empty": function( elem ) {
2345			// http://www.w3.org/TR/selectors/#empty-pseudo
2346			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2347			//   but not by others (comment: 8; processing instruction: 7; etc.)
2348			// nodeType < 6 works because attributes (2) do not appear as children
2349			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2350				if ( elem.nodeType < 6 ) {
2351					return false;
2352				}
2353			}
2354			return true;
2355		},
2356
2357		"parent": function( elem ) {
2358			return !Expr.pseudos["empty"]( elem );
2359		},
2360
2361		// Element/input types
2362		"header": function( elem ) {
2363			return rheader.test( elem.nodeName );
2364		},
2365
2366		"input": function( elem ) {
2367			return rinputs.test( elem.nodeName );
2368		},
2369
2370		"button": function( elem ) {
2371			var name = elem.nodeName.toLowerCase();
2372			return name === "input" && elem.type === "button" || name === "button";
2373		},
2374
2375		"text": function( elem ) {
2376			var attr;
2377			return elem.nodeName.toLowerCase() === "input" &&
2378				elem.type === "text" &&
2379
2380				// Support: IE<8
2381				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2382				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2383		},
2384
2385		// Position-in-collection
2386		"first": createPositionalPseudo(function() {
2387			return [ 0 ];
2388		}),
2389
2390		"last": createPositionalPseudo(function( matchIndexes, length ) {
2391			return [ length - 1 ];
2392		}),
2393
2394		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2395			return [ argument < 0 ? argument + length : argument ];
2396		}),
2397
2398		"even": createPositionalPseudo(function( matchIndexes, length ) {
2399			var i = 0;
2400			for ( ; i < length; i += 2 ) {
2401				matchIndexes.push( i );
2402			}
2403			return matchIndexes;
2404		}),
2405
2406		"odd": createPositionalPseudo(function( matchIndexes, length ) {
2407			var i = 1;
2408			for ( ; i < length; i += 2 ) {
2409				matchIndexes.push( i );
2410			}
2411			return matchIndexes;
2412		}),
2413
2414		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2415			var i = argument < 0 ? argument + length : argument;
2416			for ( ; --i >= 0; ) {
2417				matchIndexes.push( i );
2418			}
2419			return matchIndexes;
2420		}),
2421
2422		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2423			var i = argument < 0 ? argument + length : argument;
2424			for ( ; ++i < length; ) {
2425				matchIndexes.push( i );
2426			}
2427			return matchIndexes;
2428		})
2429	}
2430};
2431
2432Expr.pseudos["nth"] = Expr.pseudos["eq"];
2433
2434// Add button/input type pseudos
2435for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2436	Expr.pseudos[ i ] = createInputPseudo( i );
2437}
2438for ( i in { submit: true, reset: true } ) {
2439	Expr.pseudos[ i ] = createButtonPseudo( i );
2440}
2441
2442// Easy API for creating new setFilters
2443function setFilters() {}
2444setFilters.prototype = Expr.filters = Expr.pseudos;
2445Expr.setFilters = new setFilters();
2446
2447tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2448	var matched, match, tokens, type,
2449		soFar, groups, preFilters,
2450		cached = tokenCache[ selector + " " ];
2451
2452	if ( cached ) {
2453		return parseOnly ? 0 : cached.slice( 0 );
2454	}
2455
2456	soFar = selector;
2457	groups = [];
2458	preFilters = Expr.preFilter;
2459
2460	while ( soFar ) {
2461
2462		// Comma and first run
2463		if ( !matched || (match = rcomma.exec( soFar )) ) {
2464			if ( match ) {
2465				// Don't consume trailing commas as valid
2466				soFar = soFar.slice( match[0].length ) || soFar;
2467			}
2468			groups.push( (tokens = []) );
2469		}
2470
2471		matched = false;
2472
2473		// Combinators
2474		if ( (match = rcombinators.exec( soFar )) ) {
2475			matched = match.shift();
2476			tokens.push({
2477				value: matched,
2478				// Cast descendant combinators to space
2479				type: match[0].replace( rtrim, " " )
2480			});
2481			soFar = soFar.slice( matched.length );
2482		}
2483
2484		// Filters
2485		for ( type in Expr.filter ) {
2486			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2487				(match = preFilters[ type ]( match ))) ) {
2488				matched = match.shift();
2489				tokens.push({
2490					value: matched,
2491					type: type,
2492					matches: match
2493				});
2494				soFar = soFar.slice( matched.length );
2495			}
2496		}
2497
2498		if ( !matched ) {
2499			break;
2500		}
2501	}
2502
2503	// Return the length of the invalid excess
2504	// if we're just parsing
2505	// Otherwise, throw an error or return tokens
2506	return parseOnly ?
2507		soFar.length :
2508		soFar ?
2509			Sizzle.error( selector ) :
2510			// Cache the tokens
2511			tokenCache( selector, groups ).slice( 0 );
2512};
2513
2514function toSelector( tokens ) {
2515	var i = 0,
2516		len = tokens.length,
2517		selector = "";
2518	for ( ; i < len; i++ ) {
2519		selector += tokens[i].value;
2520	}
2521	return selector;
2522}
2523
2524function addCombinator( matcher, combinator, base ) {
2525	var dir = combinator.dir,
2526		skip = combinator.next,
2527		key = skip || dir,
2528		checkNonElements = base && key === "parentNode",
2529		doneName = done++;
2530
2531	return combinator.first ?
2532		// Check against closest ancestor/preceding element
2533		function( elem, context, xml ) {
2534			while ( (elem = elem[ dir ]) ) {
2535				if ( elem.nodeType === 1 || checkNonElements ) {
2536					return matcher( elem, context, xml );
2537				}
2538			}
2539			return false;
2540		} :
2541
2542		// Check against all ancestor/preceding elements
2543		function( elem, context, xml ) {
2544			var oldCache, uniqueCache, outerCache,
2545				newCache = [ dirruns, doneName ];
2546
2547			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2548			if ( xml ) {
2549				while ( (elem = elem[ dir ]) ) {
2550					if ( elem.nodeType === 1 || checkNonElements ) {
2551						if ( matcher( elem, context, xml ) ) {
2552							return true;
2553						}
2554					}
2555				}
2556			} else {
2557				while ( (elem = elem[ dir ]) ) {
2558					if ( elem.nodeType === 1 || checkNonElements ) {
2559						outerCache = elem[ expando ] || (elem[ expando ] = {});
2560
2561						// Support: IE <9 only
2562						// Defend against cloned attroperties (jQuery gh-1709)
2563						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2564
2565						if ( skip && skip === elem.nodeName.toLowerCase() ) {
2566							elem = elem[ dir ] || elem;
2567						} else if ( (oldCache = uniqueCache[ key ]) &&
2568							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2569
2570							// Assign to newCache so results back-propagate to previous elements
2571							return (newCache[ 2 ] = oldCache[ 2 ]);
2572						} else {
2573							// Reuse newcache so results back-propagate to previous elements
2574							uniqueCache[ key ] = newCache;
2575
2576							// A match means we're done; a fail means we have to keep checking
2577							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2578								return true;
2579							}
2580						}
2581					}
2582				}
2583			}
2584			return false;
2585		};
2586}
2587
2588function elementMatcher( matchers ) {
2589	return matchers.length > 1 ?
2590		function( elem, context, xml ) {
2591			var i = matchers.length;
2592			while ( i-- ) {
2593				if ( !matchers[i]( elem, context, xml ) ) {
2594					return false;
2595				}
2596			}
2597			return true;
2598		} :
2599		matchers[0];
2600}
2601
2602function multipleContexts( selector, contexts, results ) {
2603	var i = 0,
2604		len = contexts.length;
2605	for ( ; i < len; i++ ) {
2606		Sizzle( selector, contexts[i], results );
2607	}
2608	return results;
2609}
2610
2611function condense( unmatched, map, filter, context, xml ) {
2612	var elem,
2613		newUnmatched = [],
2614		i = 0,
2615		len = unmatched.length,
2616		mapped = map != null;
2617
2618	for ( ; i < len; i++ ) {
2619		if ( (elem = unmatched[i]) ) {
2620			if ( !filter || filter( elem, context, xml ) ) {
2621				newUnmatched.push( elem );
2622				if ( mapped ) {
2623					map.push( i );
2624				}
2625			}
2626		}
2627	}
2628
2629	return newUnmatched;
2630}
2631
2632function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2633	if ( postFilter && !postFilter[ expando ] ) {
2634		postFilter = setMatcher( postFilter );
2635	}
2636	if ( postFinder && !postFinder[ expando ] ) {
2637		postFinder = setMatcher( postFinder, postSelector );
2638	}
2639	return markFunction(function( seed, results, context, xml ) {
2640		var temp, i, elem,
2641			preMap = [],
2642			postMap = [],
2643			preexisting = results.length,
2644
2645			// Get initial elements from seed or context
2646			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2647
2648			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2649			matcherIn = preFilter && ( seed || !selector ) ?
2650				condense( elems, preMap, preFilter, context, xml ) :
2651				elems,
2652
2653			matcherOut = matcher ?
2654				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2655				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2656
2657					// ...intermediate processing is necessary
2658					[] :
2659
2660					// ...otherwise use results directly
2661					results :
2662				matcherIn;
2663
2664		// Find primary matches
2665		if ( matcher ) {
2666			matcher( matcherIn, matcherOut, context, xml );
2667		}
2668
2669		// Apply postFilter
2670		if ( postFilter ) {
2671			temp = condense( matcherOut, postMap );
2672			postFilter( temp, [], context, xml );
2673
2674			// Un-match failing elements by moving them back to matcherIn
2675			i = temp.length;
2676			while ( i-- ) {
2677				if ( (elem = temp[i]) ) {
2678					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2679				}
2680			}
2681		}
2682
2683		if ( seed ) {
2684			if ( postFinder || preFilter ) {
2685				if ( postFinder ) {
2686					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2687					temp = [];
2688					i = matcherOut.length;
2689					while ( i-- ) {
2690						if ( (elem = matcherOut[i]) ) {
2691							// Restore matcherIn since elem is not yet a final match
2692							temp.push( (matcherIn[i] = elem) );
2693						}
2694					}
2695					postFinder( null, (matcherOut = []), temp, xml );
2696				}
2697
2698				// Move matched elements from seed to results to keep them synchronized
2699				i = matcherOut.length;
2700				while ( i-- ) {
2701					if ( (elem = matcherOut[i]) &&
2702						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2703
2704						seed[temp] = !(results[temp] = elem);
2705					}
2706				}
2707			}
2708
2709		// Add elements to results, through postFinder if defined
2710		} else {
2711			matcherOut = condense(
2712				matcherOut === results ?
2713					matcherOut.splice( preexisting, matcherOut.length ) :
2714					matcherOut
2715			);
2716			if ( postFinder ) {
2717				postFinder( null, results, matcherOut, xml );
2718			} else {
2719				push.apply( results, matcherOut );
2720			}
2721		}
2722	});
2723}
2724
2725function matcherFromTokens( tokens ) {
2726	var checkContext, matcher, j,
2727		len = tokens.length,
2728		leadingRelative = Expr.relative[ tokens[0].type ],
2729		implicitRelative = leadingRelative || Expr.relative[" "],
2730		i = leadingRelative ? 1 : 0,
2731
2732		// The foundational matcher ensures that elements are reachable from top-level context(s)
2733		matchContext = addCombinator( function( elem ) {
2734			return elem === checkContext;
2735		}, implicitRelative, true ),
2736		matchAnyContext = addCombinator( function( elem ) {
2737			return indexOf( checkContext, elem ) > -1;
2738		}, implicitRelative, true ),
2739		matchers = [ function( elem, context, xml ) {
2740			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2741				(checkContext = context).nodeType ?
2742					matchContext( elem, context, xml ) :
2743					matchAnyContext( elem, context, xml ) );
2744			// Avoid hanging onto element (issue #299)
2745			checkContext = null;
2746			return ret;
2747		} ];
2748
2749	for ( ; i < len; i++ ) {
2750		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2751			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2752		} else {
2753			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2754
2755			// Return special upon seeing a positional matcher
2756			if ( matcher[ expando ] ) {
2757				// Find the next relative operator (if any) for proper handling
2758				j = ++i;
2759				for ( ; j < len; j++ ) {
2760					if ( Expr.relative[ tokens[j].type ] ) {
2761						break;
2762					}
2763				}
2764				return setMatcher(
2765					i > 1 && elementMatcher( matchers ),
2766					i > 1 && toSelector(
2767						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2768						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2769					).replace( rtrim, "$1" ),
2770					matcher,
2771					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2772					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2773					j < len && toSelector( tokens )
2774				);
2775			}
2776			matchers.push( matcher );
2777		}
2778	}
2779
2780	return elementMatcher( matchers );
2781}
2782
2783function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2784	var bySet = setMatchers.length > 0,
2785		byElement = elementMatchers.length > 0,
2786		superMatcher = function( seed, context, xml, results, outermost ) {
2787			var elem, j, matcher,
2788				matchedCount = 0,
2789				i = "0",
2790				unmatched = seed && [],
2791				setMatched = [],
2792				contextBackup = outermostContext,
2793				// We must always have either seed elements or outermost context
2794				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2795				// Use integer dirruns iff this is the outermost matcher
2796				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2797				len = elems.length;
2798
2799			if ( outermost ) {
2800				outermostContext = context === document || context || outermost;
2801			}
2802
2803			// Add elements passing elementMatchers directly to results
2804			// Support: IE<9, Safari
2805			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2806			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2807				if ( byElement && elem ) {
2808					j = 0;
2809					if ( !context && elem.ownerDocument !== document ) {
2810						setDocument( elem );
2811						xml = !documentIsHTML;
2812					}
2813					while ( (matcher = elementMatchers[j++]) ) {
2814						if ( matcher( elem, context || document, xml) ) {
2815							results.push( elem );
2816							break;
2817						}
2818					}
2819					if ( outermost ) {
2820						dirruns = dirrunsUnique;
2821					}
2822				}
2823
2824				// Track unmatched elements for set filters
2825				if ( bySet ) {
2826					// They will have gone through all possible matchers
2827					if ( (elem = !matcher && elem) ) {
2828						matchedCount--;
2829					}
2830
2831					// Lengthen the array for every element, matched or not
2832					if ( seed ) {
2833						unmatched.push( elem );
2834					}
2835				}
2836			}
2837
2838			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2839			// makes the latter nonnegative.
2840			matchedCount += i;
2841
2842			// Apply set filters to unmatched elements
2843			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2844			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2845			// no element matchers and no seed.
2846			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2847			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2848			// numerically zero.
2849			if ( bySet && i !== matchedCount ) {
2850				j = 0;
2851				while ( (matcher = setMatchers[j++]) ) {
2852					matcher( unmatched, setMatched, context, xml );
2853				}
2854
2855				if ( seed ) {
2856					// Reintegrate element matches to eliminate the need for sorting
2857					if ( matchedCount > 0 ) {
2858						while ( i-- ) {
2859							if ( !(unmatched[i] || setMatched[i]) ) {
2860								setMatched[i] = pop.call( results );
2861							}
2862						}
2863					}
2864
2865					// Discard index placeholder values to get only actual matches
2866					setMatched = condense( setMatched );
2867				}
2868
2869				// Add matches to results
2870				push.apply( results, setMatched );
2871
2872				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2873				if ( outermost && !seed && setMatched.length > 0 &&
2874					( matchedCount + setMatchers.length ) > 1 ) {
2875
2876					Sizzle.uniqueSort( results );
2877				}
2878			}
2879
2880			// Override manipulation of globals by nested matchers
2881			if ( outermost ) {
2882				dirruns = dirrunsUnique;
2883				outermostContext = contextBackup;
2884			}
2885
2886			return unmatched;
2887		};
2888
2889	return bySet ?
2890		markFunction( superMatcher ) :
2891		superMatcher;
2892}
2893
2894compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2895	var i,
2896		setMatchers = [],
2897		elementMatchers = [],
2898		cached = compilerCache[ selector + " " ];
2899
2900	if ( !cached ) {
2901		// Generate a function of recursive functions that can be used to check each element
2902		if ( !match ) {
2903			match = tokenize( selector );
2904		}
2905		i = match.length;
2906		while ( i-- ) {
2907			cached = matcherFromTokens( match[i] );
2908			if ( cached[ expando ] ) {
2909				setMatchers.push( cached );
2910			} else {
2911				elementMatchers.push( cached );
2912			}
2913		}
2914
2915		// Cache the compiled function
2916		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2917
2918		// Save selector and tokenization
2919		cached.selector = selector;
2920	}
2921	return cached;
2922};
2923
2924/**
2925 * A low-level selection function that works with Sizzle's compiled
2926 *  selector functions
2927 * @param {String|Function} selector A selector or a pre-compiled
2928 *  selector function built with Sizzle.compile
2929 * @param {Element} context
2930 * @param {Array} [results]
2931 * @param {Array} [seed] A set of elements to match against
2932 */
2933select = Sizzle.select = function( selector, context, results, seed ) {
2934	var i, tokens, token, type, find,
2935		compiled = typeof selector === "function" && selector,
2936		match = !seed && tokenize( (selector = compiled.selector || selector) );
2937
2938	results = results || [];
2939
2940	// Try to minimize operations if there is only one selector in the list and no seed
2941	// (the latter of which guarantees us context)
2942	if ( match.length === 1 ) {
2943
2944		// Reduce context if the leading compound selector is an ID
2945		tokens = match[0] = match[0].slice( 0 );
2946		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2947				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2948
2949			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2950			if ( !context ) {
2951				return results;
2952
2953			// Precompiled matchers will still verify ancestry, so step up a level
2954			} else if ( compiled ) {
2955				context = context.parentNode;
2956			}
2957
2958			selector = selector.slice( tokens.shift().value.length );
2959		}
2960
2961		// Fetch a seed set for right-to-left matching
2962		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2963		while ( i-- ) {
2964			token = tokens[i];
2965
2966			// Abort if we hit a combinator
2967			if ( Expr.relative[ (type = token.type) ] ) {
2968				break;
2969			}
2970			if ( (find = Expr.find[ type ]) ) {
2971				// Search, expanding context for leading sibling combinators
2972				if ( (seed = find(
2973					token.matches[0].replace( runescape, funescape ),
2974					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2975				)) ) {
2976
2977					// If seed is empty or no tokens remain, we can return early
2978					tokens.splice( i, 1 );
2979					selector = seed.length && toSelector( tokens );
2980					if ( !selector ) {
2981						push.apply( results, seed );
2982						return results;
2983					}
2984
2985					break;
2986				}
2987			}
2988		}
2989	}
2990
2991	// Compile and execute a filtering function if one is not provided
2992	// Provide `match` to avoid retokenization if we modified the selector above
2993	( compiled || compile( selector, match ) )(
2994		seed,
2995		context,
2996		!documentIsHTML,
2997		results,
2998		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2999	);
3000	return results;
3001};
3002
3003// One-time assignments
3004
3005// Sort stability
3006support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
3007
3008// Support: Chrome 14-35+
3009// Always assume duplicates if they aren't passed to the comparison function
3010support.detectDuplicates = !!hasDuplicate;
3011
3012// Initialize against the default document
3013setDocument();
3014
3015// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
3016// Detached nodes confoundingly follow *each other*
3017support.sortDetached = assert(function( el ) {
3018	// Should return 1, but returns 4 (following)
3019	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
3020});
3021
3022// Support: IE<8
3023// Prevent attribute/property "interpolation"
3024// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
3025if ( !assert(function( el ) {
3026	el.innerHTML = "<a href='#'></a>";
3027	return el.firstChild.getAttribute("href") === "#" ;
3028}) ) {
3029	addHandle( "type|href|height|width", function( elem, name, isXML ) {
3030		if ( !isXML ) {
3031			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
3032		}
3033	});
3034}
3035
3036// Support: IE<9
3037// Use defaultValue in place of getAttribute("value")
3038if ( !support.attributes || !assert(function( el ) {
3039	el.innerHTML = "<input/>";
3040	el.firstChild.setAttribute( "value", "" );
3041	return el.firstChild.getAttribute( "value" ) === "";
3042}) ) {
3043	addHandle( "value", function( elem, name, isXML ) {
3044		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
3045			return elem.defaultValue;
3046		}
3047	});
3048}
3049
3050// Support: IE<9
3051// Use getAttributeNode to fetch booleans when getAttribute lies
3052if ( !assert(function( el ) {
3053	return el.getAttribute("disabled") == null;
3054}) ) {
3055	addHandle( booleans, function( elem, name, isXML ) {
3056		var val;
3057		if ( !isXML ) {
3058			return elem[ name ] === true ? name.toLowerCase() :
3059					(val = elem.getAttributeNode( name )) && val.specified ?
3060					val.value :
3061				null;
3062		}
3063	});
3064}
3065
3066return Sizzle;
3067
3068})( window );
3069
3070
3071
3072jQuery.find = Sizzle;
3073jQuery.expr = Sizzle.selectors;
3074
3075// Deprecated
3076jQuery.expr[ ":" ] = jQuery.expr.pseudos;
3077jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
3078jQuery.text = Sizzle.getText;
3079jQuery.isXMLDoc = Sizzle.isXML;
3080jQuery.contains = Sizzle.contains;
3081jQuery.escapeSelector = Sizzle.escape;
3082
3083
3084
3085
3086var dir = function( elem, dir, until ) {
3087	var matched = [],
3088		truncate = until !== undefined;
3089
3090	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
3091		if ( elem.nodeType === 1 ) {
3092			if ( truncate && jQuery( elem ).is( until ) ) {
3093				break;
3094			}
3095			matched.push( elem );
3096		}
3097	}
3098	return matched;
3099};
3100
3101
3102var siblings = function( n, elem ) {
3103	var matched = [];
3104
3105	for ( ; n; n = n.nextSibling ) {
3106		if ( n.nodeType === 1 && n !== elem ) {
3107			matched.push( n );
3108		}
3109	}
3110
3111	return matched;
3112};
3113
3114
3115var rneedsContext = jQuery.expr.match.needsContext;
3116
3117
3118
3119function nodeName( elem, name ) {
3120
3121  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3122
3123};
3124var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3125
3126
3127
3128var risSimple = /^.[^:#\[\.,]*$/;
3129
3130// Implement the identical functionality for filter and not
3131function winnow( elements, qualifier, not ) {
3132	if ( jQuery.isFunction( qualifier ) ) {
3133		return jQuery.grep( elements, function( elem, i ) {
3134			return !!qualifier.call( elem, i, elem ) !== not;
3135		} );
3136	}
3137
3138	// Single element
3139	if ( qualifier.nodeType ) {
3140		return jQuery.grep( elements, function( elem ) {
3141			return ( elem === qualifier ) !== not;
3142		} );
3143	}
3144
3145	// Arraylike of elements (jQuery, arguments, Array)
3146	if ( typeof qualifier !== "string" ) {
3147		return jQuery.grep( elements, function( elem ) {
3148			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
3149		} );
3150	}
3151
3152	// Simple selector that can be filtered directly, removing non-Elements
3153	if ( risSimple.test( qualifier ) ) {
3154		return jQuery.filter( qualifier, elements, not );
3155	}
3156
3157	// Complex selector, compare the two sets, removing non-Elements
3158	qualifier = jQuery.filter( qualifier, elements );
3159	return jQuery.grep( elements, function( elem ) {
3160		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
3161	} );
3162}
3163
3164jQuery.filter = function( expr, elems, not ) {
3165	var elem = elems[ 0 ];
3166
3167	if ( not ) {
3168		expr = ":not(" + expr + ")";
3169	}
3170
3171	if ( elems.length === 1 && elem.nodeType === 1 ) {
3172		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
3173	}
3174
3175	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
3176		return elem.nodeType === 1;
vendor: 4,831 bytes, lines 3177-3372
3177	} ) );
3178};
3179
3180jQuery.fn.extend( {
3181	find: function( selector ) {
3182		var i, ret,
3183			len = this.length,
3184			self = this;
3185
3186		if ( typeof selector !== "string" ) {
3187			return this.pushStack( jQuery( selector ).filter( function() {
3188				for ( i = 0; i < len; i++ ) {
3189					if ( jQuery.contains( self[ i ], this ) ) {
3190						return true;
3191					}
3192				}
3193			} ) );
3194		}
3195
3196		ret = this.pushStack( [] );
3197
3198		for ( i = 0; i < len; i++ ) {
3199			jQuery.find( selector, self[ i ], ret );
3200		}
3201
3202		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
3203	},
3204	filter: function( selector ) {
3205		return this.pushStack( winnow( this, selector || [], false ) );
3206	},
3207	not: function( selector ) {
3208		return this.pushStack( winnow( this, selector || [], true ) );
3209	},
3210	is: function( selector ) {
3211		return !!winnow(
3212			this,
3213
3214			// If this is a positional/relative selector, check membership in the returned set
3215			// so $("p:first").is("p:last") won't return true for a doc with two "p".
3216			typeof selector === "string" && rneedsContext.test( selector ) ?
3217				jQuery( selector ) :
3218				selector || [],
3219			false
3220		).length;
3221	}
3222} );
3223
3224
3225// Initialize a jQuery object
3226
3227
3228// A central reference to the root jQuery(document)
3229var rootjQuery,
3230
3231	// A simple way to check for HTML strings
3232	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3233	// Strict HTML recognition (#11290: must start with <)
3234	// Shortcut simple #id case for speed
3235	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3236
3237	init = jQuery.fn.init = function( selector, context, root ) {
3238		var match, elem;
3239
3240		// HANDLE: $(""), $(null), $(undefined), $(false)
3241		if ( !selector ) {
3242			return this;
3243		}
3244
3245		// Method init() accepts an alternate rootjQuery
3246		// so migrate can support jQuery.sub (gh-2101)
3247		root = root || rootjQuery;
3248
3249		// Handle HTML strings
3250		if ( typeof selector === "string" ) {
3251			if ( selector[ 0 ] === "<" &&
3252				selector[ selector.length - 1 ] === ">" &&
3253				selector.length >= 3 ) {
3254
3255				// Assume that strings that start and end with <> are HTML and skip the regex check
3256				match = [ null, selector, null ];
3257
3258			} else {
3259				match = rquickExpr.exec( selector );
3260			}
3261
3262			// Match html or make sure no context is specified for #id
3263			if ( match && ( match[ 1 ] || !context ) ) {
3264
3265				// HANDLE: $(html) -> $(array)
3266				if ( match[ 1 ] ) {
3267					context = context instanceof jQuery ? context[ 0 ] : context;
3268
3269					// Option to run scripts is true for back-compat
3270					// Intentionally let the error be thrown if parseHTML is not present
3271					jQuery.merge( this, jQuery.parseHTML(
3272						match[ 1 ],
3273						context && context.nodeType ? context.ownerDocument || context : document,
3274						true
3275					) );
3276
3277					// HANDLE: $(html, props)
3278					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3279						for ( match in context ) {
3280
3281							// Properties of context are called as methods if possible
3282							if ( jQuery.isFunction( this[ match ] ) ) {
3283								this[ match ]( context[ match ] );
3284
3285							// ...and otherwise set as attributes
3286							} else {
3287								this.attr( match, context[ match ] );
3288							}
3289						}
3290					}
3291
3292					return this;
3293
3294				// HANDLE: $(#id)
3295				} else {
3296					elem = document.getElementById( match[ 2 ] );
3297
3298					if ( elem ) {
3299
3300						// Inject the element directly into the jQuery object
3301						this[ 0 ] = elem;
3302						this.length = 1;
3303					}
3304					return this;
3305				}
3306
3307			// HANDLE: $(expr, $(...))
3308			} else if ( !context || context.jquery ) {
3309				return ( context || root ).find( selector );
3310
3311			// HANDLE: $(expr, context)
3312			// (which is just equivalent to: $(context).find(expr)
3313			} else {
3314				return this.constructor( context ).find( selector );
3315			}
3316
3317		// HANDLE: $(DOMElement)
3318		} else if ( selector.nodeType ) {
3319			this[ 0 ] = selector;
3320			this.length = 1;
3321			return this;
3322
3323		// HANDLE: $(function)
3324		// Shortcut for document ready
3325		} else if ( jQuery.isFunction( selector ) ) {
3326			return root.ready !== undefined ?
3327				root.ready( selector ) :
3328
3329				// Execute immediately if ready is not present
3330				selector( jQuery );
3331		}
3332
3333		return jQuery.makeArray( selector, this );
3334	};
3335
3336// Give the init function the jQuery prototype for later instantiation
3337init.prototype = jQuery.fn;
3338
3339// Initialize central reference
3340rootjQuery = jQuery( document );
3341
3342
3343var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3344
3345	// Methods guaranteed to produce a unique set when starting from a unique set
3346	guaranteedUnique = {
3347		children: true,
3348		contents: true,
3349		next: true,
3350		prev: true
3351	};
3352
3353jQuery.fn.extend( {
3354	has: function( target ) {
3355		var targets = jQuery( target, this ),
3356			l = targets.length;
3357
3358		return this.filter( function() {
3359			var i = 0;
3360			for ( ; i < l; i++ ) {
3361				if ( jQuery.contains( this, targets[ i ] ) ) {
3362					return true;
3363				}
3364			}
3365		} );
3366	},
3367
3368	closest: function( selectors, context ) {
3369		var cur,
3370			i = 0,
3371			l = this.length,
3372			matched = [],
vendor: 6,797 bytes, lines 3373-3640
3373			targets = typeof selectors !== "string" && jQuery( selectors );
3374
3375		// Positional selectors never match, since there's no _selection_ context
3376		if ( !rneedsContext.test( selectors ) ) {
3377			for ( ; i < l; i++ ) {
3378				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3379
3380					// Always skip document fragments
3381					if ( cur.nodeType < 11 && ( targets ?
3382						targets.index( cur ) > -1 :
3383
3384						// Don't pass non-elements to Sizzle
3385						cur.nodeType === 1 &&
3386							jQuery.find.matchesSelector( cur, selectors ) ) ) {
3387
3388						matched.push( cur );
3389						break;
3390					}
3391				}
3392			}
3393		}
3394
3395		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3396	},
3397
3398	// Determine the position of an element within the set
3399	index: function( elem ) {
3400
3401		// No argument, return index in parent
3402		if ( !elem ) {
3403			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3404		}
3405
3406		// Index in selector
3407		if ( typeof elem === "string" ) {
3408			return indexOf.call( jQuery( elem ), this[ 0 ] );
3409		}
3410
3411		// Locate the position of the desired element
3412		return indexOf.call( this,
3413
3414			// If it receives a jQuery object, the first element is used
3415			elem.jquery ? elem[ 0 ] : elem
3416		);
3417	},
3418
3419	add: function( selector, context ) {
3420		return this.pushStack(
3421			jQuery.uniqueSort(
3422				jQuery.merge( this.get(), jQuery( selector, context ) )
3423			)
3424		);
3425	},
3426
3427	addBack: function( selector ) {
3428		return this.add( selector == null ?
3429			this.prevObject : this.prevObject.filter( selector )
3430		);
3431	}
3432} );
3433
3434function sibling( cur, dir ) {
3435	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3436	return cur;
3437}
3438
3439jQuery.each( {
3440	parent: function( elem ) {
3441		var parent = elem.parentNode;
3442		return parent && parent.nodeType !== 11 ? parent : null;
3443	},
3444	parents: function( elem ) {
3445		return dir( elem, "parentNode" );
3446	},
3447	parentsUntil: function( elem, i, until ) {
3448		return dir( elem, "parentNode", until );
3449	},
3450	next: function( elem ) {
3451		return sibling( elem, "nextSibling" );
3452	},
3453	prev: function( elem ) {
3454		return sibling( elem, "previousSibling" );
3455	},
3456	nextAll: function( elem ) {
3457		return dir( elem, "nextSibling" );
3458	},
3459	prevAll: function( elem ) {
3460		return dir( elem, "previousSibling" );
3461	},
3462	nextUntil: function( elem, i, until ) {
3463		return dir( elem, "nextSibling", until );
3464	},
3465	prevUntil: function( elem, i, until ) {
3466		return dir( elem, "previousSibling", until );
3467	},
3468	siblings: function( elem ) {
3469		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3470	},
3471	children: function( elem ) {
3472		return siblings( elem.firstChild );
3473	},
3474	contents: function( elem ) {
3475        if ( nodeName( elem, "iframe" ) ) {
3476            return elem.contentDocument;
3477        }
3478
3479        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3480        // Treat the template element as a regular one in browsers that
3481        // don't support it.
3482        if ( nodeName( elem, "template" ) ) {
3483            elem = elem.content || elem;
3484        }
3485
3486        return jQuery.merge( [], elem.childNodes );
3487	}
3488}, function( name, fn ) {
3489	jQuery.fn[ name ] = function( until, selector ) {
3490		var matched = jQuery.map( this, fn, until );
3491
3492		if ( name.slice( -5 ) !== "Until" ) {
3493			selector = until;
3494		}
3495
3496		if ( selector && typeof selector === "string" ) {
3497			matched = jQuery.filter( selector, matched );
3498		}
3499
3500		if ( this.length > 1 ) {
3501
3502			// Remove duplicates
3503			if ( !guaranteedUnique[ name ] ) {
3504				jQuery.uniqueSort( matched );
3505			}
3506
3507			// Reverse order for parents* and prev-derivatives
3508			if ( rparentsprev.test( name ) ) {
3509				matched.reverse();
3510			}
3511		}
3512
3513		return this.pushStack( matched );
3514	};
3515} );
3516var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3517
3518
3519
3520// Convert String-formatted options into Object-formatted ones
3521function createOptions( options ) {
3522	var object = {};
3523	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3524		object[ flag ] = true;
3525	} );
3526	return object;
3527}
3528
3529/*
3530 * Create a callback list using the following parameters:
3531 *
3532 *	options: an optional list of space-separated options that will change how
3533 *			the callback list behaves or a more traditional option object
3534 *
3535 * By default a callback list will act like an event callback list and can be
3536 * "fired" multiple times.
3537 *
3538 * Possible options:
3539 *
3540 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3541 *
3542 *	memory:			will keep track of previous values and will call any callback added
3543 *					after the list has been fired right away with the latest "memorized"
3544 *					values (like a Deferred)
3545 *
3546 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3547 *
3548 *	stopOnFalse:	interrupt callings when a callback returns false
3549 *
3550 */
3551jQuery.Callbacks = function( options ) {
3552
3553	// Convert options from String-formatted to Object-formatted if needed
3554	// (we check in cache first)
3555	options = typeof options === "string" ?
3556		createOptions( options ) :
3557		jQuery.extend( {}, options );
3558
3559	var // Flag to know if list is currently firing
3560		firing,
3561
3562		// Last fire value for non-forgettable lists
3563		memory,
3564
3565		// Flag to know if list was already fired
3566		fired,
3567
3568		// Flag to prevent firing
3569		locked,
3570
3571		// Actual callback list
3572		list = [],
3573
3574		// Queue of execution data for repeatable lists
3575		queue = [],
3576
3577		// Index of currently firing callback (modified by add/remove as needed)
3578		firingIndex = -1,
3579
3580		// Fire callbacks
3581		fire = function() {
3582
3583			// Enforce single-firing
3584			locked = locked || options.once;
3585
3586			// Execute callbacks for all pending executions,
3587			// respecting firingIndex overrides and runtime changes
3588			fired = firing = true;
3589			for ( ; queue.length; firingIndex = -1 ) {
3590				memory = queue.shift();
3591				while ( ++firingIndex < list.length ) {
3592
3593					// Run callback and check for early termination
3594					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3595						options.stopOnFalse ) {
3596
3597						// Jump to end and forget the data so .add doesn't re-fire
3598						firingIndex = list.length;
3599						memory = false;
3600					}
3601				}
3602			}
3603
3604			// Forget the data if we're done with it
3605			if ( !options.memory ) {
3606				memory = false;
3607			}
3608
3609			firing = false;
3610
3611			// Clean up if we're done firing for good
3612			if ( locked ) {
3613
3614				// Keep an empty list if we have data for future add calls
3615				if ( memory ) {
3616					list = [];
3617
3618				// Otherwise, this object is spent
3619				} else {
3620					list = "";
3621				}
3622			}
3623		},
3624
3625		// Actual Callbacks object
3626		self = {
3627
3628			// Add a callback or a collection of callbacks to the list
3629			add: function() {
3630				if ( list ) {
3631
3632					// If we have memory from a past run, we should fire after adding
3633					if ( memory && !firing ) {
3634						firingIndex = list.length - 1;
3635						queue.push( memory );
3636					}
3637
3638					( function add( args ) {
3639						jQuery.each( args, function( _, arg ) {
3640							if ( 
vendor: 3,423 bytes, lines 3640-3782
3640jQuery.isFunction( arg ) ) {
3641								if ( !options.unique || !self.has( arg ) ) {
3642									list.push( arg );
3643								}
3644							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
3645
3646								// Inspect recursively
3647								add( arg );
3648							}
3649						} );
3650					} )( arguments );
3651
3652					if ( memory && !firing ) {
3653						fire();
3654					}
3655				}
3656				return this;
3657			},
3658
3659			// Remove a callback from the list
3660			remove: function() {
3661				jQuery.each( arguments, function( _, arg ) {
3662					var index;
3663					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3664						list.splice( index, 1 );
3665
3666						// Handle firing indexes
3667						if ( index <= firingIndex ) {
3668							firingIndex--;
3669						}
3670					}
3671				} );
3672				return this;
3673			},
3674
3675			// Check if a given callback is in the list.
3676			// If no argument is given, return whether or not list has callbacks attached.
3677			has: function( fn ) {
3678				return fn ?
3679					jQuery.inArray( fn, list ) > -1 :
3680					list.length > 0;
3681			},
3682
3683			// Remove all callbacks from the list
3684			empty: function() {
3685				if ( list ) {
3686					list = [];
3687				}
3688				return this;
3689			},
3690
3691			// Disable .fire and .add
3692			// Abort any current/pending executions
3693			// Clear all callbacks and values
3694			disable: function() {
3695				locked = queue = [];
3696				list = memory = "";
3697				return this;
3698			},
3699			disabled: function() {
3700				return !list;
3701			},
3702
3703			// Disable .fire
3704			// Also disable .add unless we have memory (since it would have no effect)
3705			// Abort any pending executions
3706			lock: function() {
3707				locked = queue = [];
3708				if ( !memory && !firing ) {
3709					list = memory = "";
3710				}
3711				return this;
3712			},
3713			locked: function() {
3714				return !!locked;
3715			},
3716
3717			// Call all callbacks with the given context and arguments
3718			fireWith: function( context, args ) {
3719				if ( !locked ) {
3720					args = args || [];
3721					args = [ context, args.slice ? args.slice() : args ];
3722					queue.push( args );
3723					if ( !firing ) {
3724						fire();
3725					}
3726				}
3727				return this;
3728			},
3729
3730			// Call all the callbacks with the given arguments
3731			fire: function() {
3732				self.fireWith( this, arguments );
3733				return this;
3734			},
3735
3736			// To know if the callbacks have already been called at least once
3737			fired: function() {
3738				return !!fired;
3739			}
3740		};
3741
3742	return self;
3743};
3744
3745
3746function Identity( v ) {
3747	return v;
3748}
3749function Thrower( ex ) {
3750	throw ex;
3751}
3752
3753function adoptValue( value, resolve, reject, noValue ) {
3754	var method;
3755
3756	try {
3757
3758		// Check for promise aspect first to privilege synchronous behavior
3759		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
3760			method.call( value ).done( resolve ).fail( reject );
3761
3762		// Other thenables
3763		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
3764			method.call( value, resolve, reject );
3765
3766		// Other non-thenables
3767		} else {
3768
3769			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3770			// * false: [ value ].slice( 0 ) => resolve( value )
3771			// * true: [ value ].slice( 1 ) => resolve()
3772			resolve.apply( undefined, [ value ].slice( noValue ) );
3773		}
3774
3775	// For Promises/A+, convert exceptions into rejections
3776	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3777	// Deferred#then to conditionally suppress rejection.
3778	} catch ( value ) {
3779
3780		// Support: Android 4.0 only
3781		// Strict mode functions invoked without .call/.apply get global-object context
3782		reject.apply( undefined, [ value ]
vendor: 9,153 bytes, lines 3782-4107
3782 );
3783	}
3784}
3785
3786jQuery.extend( {
3787
3788	Deferred: function( func ) {
3789		var tuples = [
3790
3791				// action, add listener, callbacks,
3792				// ... .then handlers, argument index, [final state]
3793				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3794					jQuery.Callbacks( "memory" ), 2 ],
3795				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3796					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3797				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3798					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3799			],
3800			state = "pending",
3801			promise = {
3802				state: function() {
3803					return state;
3804				},
3805				always: function() {
3806					deferred.done( arguments ).fail( arguments );
3807					return this;
3808				},
3809				"catch": function( fn ) {
3810					return promise.then( null, fn );
3811				},
3812
3813				// Keep pipe for back-compat
3814				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3815					var fns = arguments;
3816
3817					return jQuery.Deferred( function( newDefer ) {
3818						jQuery.each( tuples, function( i, tuple ) {
3819
3820							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3821							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3822
3823							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3824							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3825							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3826							deferred[ tuple[ 1 ] ]( function() {
3827								var returned = fn && fn.apply( this, arguments );
3828								if ( returned && jQuery.isFunction( returned.promise ) ) {
3829									returned.promise()
3830										.progress( newDefer.notify )
3831										.done( newDefer.resolve )
3832										.fail( newDefer.reject );
3833								} else {
3834									newDefer[ tuple[ 0 ] + "With" ](
3835										this,
3836										fn ? [ returned ] : arguments
3837									);
3838								}
3839							} );
3840						} );
3841						fns = null;
3842					} ).promise();
3843				},
3844				then: function( onFulfilled, onRejected, onProgress ) {
3845					var maxDepth = 0;
3846					function resolve( depth, deferred, handler, special ) {
3847						return function() {
3848							var that = this,
3849								args = arguments,
3850								mightThrow = function() {
3851									var returned, then;
3852
3853									// Support: Promises/A+ section 2.3.3.3.3
3854									// https://promisesaplus.com/#point-59
3855									// Ignore double-resolution attempts
3856									if ( depth < maxDepth ) {
3857										return;
3858									}
3859
3860									returned = handler.apply( that, args );
3861
3862									// Support: Promises/A+ section 2.3.1
3863									// https://promisesaplus.com/#point-48
3864									if ( returned === deferred.promise() ) {
3865										throw new TypeError( "Thenable self-resolution" );
3866									}
3867
3868									// Support: Promises/A+ sections 2.3.3.1, 3.5
3869									// https://promisesaplus.com/#point-54
3870									// https://promisesaplus.com/#point-75
3871									// Retrieve `then` only once
3872									then = returned &&
3873
3874										// Support: Promises/A+ section 2.3.4
3875										// https://promisesaplus.com/#point-64
3876										// Only check objects and functions for thenability
3877										( typeof returned === "object" ||
3878											typeof returned === "function" ) &&
3879										returned.then;
3880
3881									// Handle a returned thenable
3882									if ( jQuery.isFunction( then ) ) {
3883
3884										// Special processors (notify) just wait for resolution
3885										if ( special ) {
3886											then.call(
3887												returned,
3888												resolve( maxDepth, deferred, Identity, special ),
3889												resolve( maxDepth, deferred, Thrower, special )
3890											);
3891
3892										// Normal processors (resolve) also hook into progress
3893										} else {
3894
3895											// ...and disregard older resolution values
3896											maxDepth++;
3897
3898											then.call(
3899												returned,
3900												resolve( maxDepth, deferred, Identity, special ),
3901												resolve( maxDepth, deferred, Thrower, special ),
3902												resolve( maxDepth, deferred, Identity,
3903													deferred.notifyWith )
3904											);
3905										}
3906
3907									// Handle all other returned values
3908									} else {
3909
3910										// Only substitute handlers pass on context
3911										// and multiple values (non-spec behavior)
3912										if ( handler !== Identity ) {
3913											that = undefined;
3914											args = [ returned ];
3915										}
3916
3917										// Process the value(s)
3918										// Default process is resolve
3919										( special || deferred.resolveWith )( that, args );
3920									}
3921								},
3922
3923								// Only normal processors (resolve) catch and reject exceptions
3924								process = special ?
3925									mightThrow :
3926									function() {
3927										try {
3928											mightThrow();
3929										} catch ( e ) {
3930
3931											if ( jQuery.Deferred.exceptionHook ) {
3932												jQuery.Deferred.exceptionHook( e,
3933													process.stackTrace );
3934											}
3935
3936											// Support: Promises/A+ section 2.3.3.3.4.1
3937											// https://promisesaplus.com/#point-61
3938											// Ignore post-resolution exceptions
3939											if ( depth + 1 >= maxDepth ) {
3940
3941												// Only substitute handlers pass on context
3942												// and multiple values (non-spec behavior)
3943												if ( handler !== Thrower ) {
3944													that = undefined;
3945													args = [ e ];
3946												}
3947
3948												deferred.rejectWith( that, args );
3949											}
3950										}
3951									};
3952
3953							// Support: Promises/A+ section 2.3.3.3.1
3954							// https://promisesaplus.com/#point-57
3955							// Re-resolve promises immediately to dodge false rejection from
3956							// subsequent errors
3957							if ( depth ) {
3958								process();
3959							} else {
3960
3961								// Call an optional hook to record the stack, in case of exception
3962								// since it's otherwise lost when execution goes async
3963								if ( jQuery.Deferred.getStackHook ) {
3964									process.stackTrace = jQuery.Deferred.getStackHook();
3965								}
3966								window.setTimeout( process );
3967							}
3968						};
3969					}
3970
3971					return jQuery.Deferred( function( newDefer ) {
3972
3973						// progress_handlers.add( ... )
3974						tuples[ 0 ][ 3 ].add(
3975							resolve(
3976								0,
3977								newDefer,
3978								jQuery.isFunction( onProgress ) ?
3979									onProgress :
3980									Identity,
3981								newDefer.notifyWith
3982							)
3983						);
3984
3985						// fulfilled_handlers.add( ... )
3986						tuples[ 1 ][ 3 ].add(
3987							resolve(
3988								0,
3989								newDefer,
3990								jQuery.isFunction( onFulfilled ) ?
3991									onFulfilled :
3992									Identity
3993							)
3994						);
3995
3996						// rejected_handlers.add( ... )
3997						tuples[ 2 ][ 3 ].add(
3998							resolve(
3999								0,
4000								newDefer,
4001								jQuery.isFunction( onRejected ) ?
4002									onRejected :
4003									Thrower
4004							)
4005						);
4006					} ).promise();
4007				},
4008
4009				// Get a promise for this deferred
4010				// If obj is provided, the promise aspect is added to the object
4011				promise: function( obj ) {
4012					return obj != null ? jQuery.extend( obj, promise ) : promise;
4013				}
4014			},
4015			deferred = {};
4016
4017		// Add list-specific methods
4018		jQuery.each( tuples, function( i, tuple ) {
4019			var list = tuple[ 2 ],
4020				stateString = tuple[ 5 ];
4021
4022			// promise.progress = list.add
4023			// promise.done = list.add
4024			// promise.fail = list.add
4025			promise[ tuple[ 1 ] ] = list.add;
4026
4027			// Handle state
4028			if ( stateString ) {
4029				list.add(
4030					function() {
4031
4032						// state = "resolved" (i.e., fulfilled)
4033						// state = "rejected"
4034						state = stateString;
4035					},
4036
4037					// rejected_callbacks.disable
4038					// fulfilled_callbacks.disable
4039					tuples[ 3 - i ][ 2 ].disable,
4040
4041					// progress_callbacks.lock
4042					tuples[ 0 ][ 2 ].lock
4043				);
4044			}
4045
4046			// progress_handlers.fire
4047			// fulfilled_handlers.fire
4048			// rejected_handlers.fire
4049			list.add( tuple[ 3 ].fire );
4050
4051			// deferred.notify = function() { deferred.notifyWith(...) }
4052			// deferred.resolve = function() { deferred.resolveWith(...) }
4053			// deferred.reject = function() { deferred.rejectWith(...) }
4054			deferred[ tuple[ 0 ] ] = function() {
4055				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
4056				return this;
4057			};
4058
4059			// deferred.notifyWith = list.fireWith
4060			// deferred.resolveWith = list.fireWith
4061			// deferred.rejectWith = list.fireWith
4062			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
4063		} );
4064
4065		// Make the deferred a promise
4066		promise.promise( deferred );
4067
4068		// Call given func if any
4069		if ( func ) {
4070			func.call( deferred, deferred );
4071		}
4072
4073		// All done!
4074		return deferred;
4075	},
4076
4077	// Deferred helper
4078	when: function( singleValue ) {
4079		var
4080
4081			// count of uncompleted subordinates
4082			remaining = arguments.length,
4083
4084			// count of unprocessed arguments
4085			i = remaining,
4086
4087			// subordinate fulfillment data
4088			resolveContexts = Array( i ),
4089			resolveValues = slice.call( arguments ),
4090
4091			// the master Deferred
4092			master = jQuery.Deferred(),
4093
4094			// subordinate callback factory
4095			updateFunc = function( i ) {
4096				return function( value ) {
4097					resolveContexts[ i ] = this;
4098					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
4099					if ( !( --remaining ) ) {
4100						master.resolveWith( resolveContexts, resolveValues );
4101					}
4102				};
4103			};
4104
4105		// Single- and empty arguments are adopted like Promise.resolve
4106		if ( remaining <= 1 ) {
4107			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject
vendor: 2,079 bytes, lines 4107-4195
4107,
4108				!remaining );
4109
4110			// Use .then() to unwrap secondary thenables (cf. gh-3000)
4111			if ( master.state() === "pending" ||
4112				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4113
4114				return master.then();
4115			}
4116		}
4117
4118		// Multiple arguments are aggregated like Promise.all array elements
4119		while ( i-- ) {
4120			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
4121		}
4122
4123		return master.promise();
4124	}
4125} );
4126
4127
4128// These usually indicate a programmer mistake during development,
4129// warn about them ASAP rather than swallowing them by default.
4130var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4131
4132jQuery.Deferred.exceptionHook = function( error, stack ) {
4133
4134	// Support: IE 8 - 9 only
4135	// Console exists when dev tools are open, which can happen at any time
4136	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4137		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
4138	}
4139};
4140
4141
4142
4143
4144jQuery.readyException = function( error ) {
4145	window.setTimeout( function() {
4146		throw error;
4147	} );
4148};
4149
4150
4151
4152
4153// The deferred used on DOM ready
4154var readyList = jQuery.Deferred();
4155
4156jQuery.fn.ready = function( fn ) {
4157
4158	readyList
4159		.then( fn )
4160
4161		// Wrap jQuery.readyException in a function so that the lookup
4162		// happens at the time of error handling instead of callback
4163		// registration.
4164		.catch( function( error ) {
4165			jQuery.readyException( error );
4166		} );
4167
4168	return this;
4169};
4170
4171jQuery.extend( {
4172
4173	// Is the DOM ready to be used? Set to true once it occurs.
4174	isReady: false,
4175
4176	// A counter to track how many items to wait for before
4177	// the ready event fires. See #6781
4178	readyWait: 1,
4179
4180	// Handle when the DOM is ready
4181	ready: function( wait ) {
4182
4183		// Abort if there are pending holds or we're already ready
4184		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
4185			return;
4186		}
4187
4188		// Remember that the DOM is ready
4189		jQuery.isReady = true;
4190
4191		// If a normal DOM Ready event fired, decrement, and wait if need be
4192		if ( wait !== true && --jQuery.readyWait > 0 ) {
4193			return;
4194		}
4195
vendor: 4,098 bytes, lines 4196-4377
4196		// If there are functions bound, to execute
4197		readyList.resolveWith( document, [ jQuery ] );
4198	}
4199} );
4200
4201jQuery.ready.then = readyList.then;
4202
4203// The ready event handler and self cleanup method
4204function completed() {
4205	document.removeEventListener( "DOMContentLoaded", completed );
4206	window.removeEventListener( "load", completed );
4207	jQuery.ready();
4208}
4209
4210// Catch cases where $(document).ready() is called
4211// after the browser event has already occurred.
4212// Support: IE <=9 - 10 only
4213// Older IE sometimes signals "interactive" too soon
4214if ( document.readyState === "complete" ||
4215	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
4216
4217	// Handle it asynchronously to allow scripts the opportunity to delay ready
4218	window.setTimeout( jQuery.ready );
4219
4220} else {
4221
4222	// Use the handy event callback
4223	document.addEventListener( "DOMContentLoaded", completed );
4224
4225	// A fallback to window.onload, that will always work
4226	window.addEventListener( "load", completed );
4227}
4228
4229
4230
4231
4232// Multifunctional method to get and set values of a collection
4233// The value/s can optionally be executed if it's a function
4234var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4235	var i = 0,
4236		len = elems.length,
4237		bulk = key == null;
4238
4239	// Sets many values
4240	if ( jQuery.type( key ) === "object" ) {
4241		chainable = true;
4242		for ( i in key ) {
4243			access( elems, fn, i, key[ i ], true, emptyGet, raw );
4244		}
4245
4246	// Sets one value
4247	} else if ( value !== undefined ) {
4248		chainable = true;
4249
4250		if ( !jQuery.isFunction( value ) ) {
4251			raw = true;
4252		}
4253
4254		if ( bulk ) {
4255
4256			// Bulk operations run against the entire set
4257			if ( raw ) {
4258				fn.call( elems, value );
4259				fn = null;
4260
4261			// ...except when executing function values
4262			} else {
4263				bulk = fn;
4264				fn = function( elem, key, value ) {
4265					return bulk.call( jQuery( elem ), value );
4266				};
4267			}
4268		}
4269
4270		if ( fn ) {
4271			for ( ; i < len; i++ ) {
4272				fn(
4273					elems[ i ], key, raw ?
4274					value :
4275					value.call( elems[ i ], i, fn( elems[ i ], key ) )
4276				);
4277			}
4278		}
4279	}
4280
4281	if ( chainable ) {
4282		return elems;
4283	}
4284
4285	// Gets
4286	if ( bulk ) {
4287		return fn.call( elems );
4288	}
4289
4290	return len ? fn( elems[ 0 ], key ) : emptyGet;
4291};
4292var acceptData = function( owner ) {
4293
4294	// Accepts only:
4295	//  - Node
4296	//    - Node.ELEMENT_NODE
4297	//    - Node.DOCUMENT_NODE
4298	//  - Object
4299	//    - Any
4300	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4301};
4302
4303
4304
4305
4306function Data() {
4307	this.expando = jQuery.expando + Data.uid++;
4308}
4309
4310Data.uid = 1;
4311
4312Data.prototype = {
4313
4314	cache: function( owner ) {
4315
4316		// Check if the owner object already has a cache
4317		var value = owner[ this.expando ];
4318
4319		// If not, create one
4320		if ( !value ) {
4321			value = {};
4322
4323			// We can accept data for non-element nodes in modern browsers,
4324			// but we should not, see #8335.
4325			// Always return an empty object.
4326			if ( acceptData( owner ) ) {
4327
4328				// If it is a node unlikely to be stringify-ed or looped over
4329				// use plain assignment
4330				if ( owner.nodeType ) {
4331					owner[ this.expando ] = value;
4332
4333				// Otherwise secure it in a non-enumerable property
4334				// configurable must be true to allow the property to be
4335				// deleted when data is removed
4336				} else {
4337					Object.defineProperty( owner, this.expando, {
4338						value: value,
4339						configurable: true
4340					} );
4341				}
4342			}
4343		}
4344
4345		return value;
4346	},
4347	set: function( owner, data, value ) {
4348		var prop,
4349			cache = this.cache( owner );
4350
4351		// Handle: [ owner, key, value ] args
4352		// Always use camelCase key (gh-2257)
4353		if ( typeof data === "string" ) {
4354			cache[ jQuery.camelCase( data ) ] = value;
4355
4356		// Handle: [ owner, { properties } ] args
4357		} else {
4358
4359			// Copy the properties one-by-one to the cache object
4360			for ( prop in data ) {
4361				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
4362			}
4363		}
4364		return cache;
4365	},
4366	get: function( owner, key ) {
4367		return key === undefined ?
4368			this.cache( owner ) :
4369
4370			// Always use camelCase key (gh-2257)
4371			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
4372	},
4373	access: function( owner, key, value ) {
4374
4375		// In cases where either:
4376		//
4377		//   1. No key was specified
vendor: 4,593 bytes, lines 4378-4561
4378		//   2. A string key was specified, but no value provided
4379		//
4380		// Take the "read" path and allow the get method to determine
4381		// which value to return, respectively either:
4382		//
4383		//   1. The entire cache object
4384		//   2. The data stored at the key
4385		//
4386		if ( key === undefined ||
4387				( ( key && typeof key === "string" ) && value === undefined ) ) {
4388
4389			return this.get( owner, key );
4390		}
4391
4392		// When the key is not a string, or both a key and value
4393		// are specified, set or extend (existing objects) with either:
4394		//
4395		//   1. An object of properties
4396		//   2. A key and value
4397		//
4398		this.set( owner, key, value );
4399
4400		// Since the "set" path can have two possible entry points
4401		// return the expected data based on which path was taken[*]
4402		return value !== undefined ? value : key;
4403	},
4404	remove: function( owner, key ) {
4405		var i,
4406			cache = owner[ this.expando ];
4407
4408		if ( cache === undefined ) {
4409			return;
4410		}
4411
4412		if ( key !== undefined ) {
4413
4414			// Support array or space separated string of keys
4415			if ( Array.isArray( key ) ) {
4416
4417				// If key is an array of keys...
4418				// We always set camelCase keys, so remove that.
4419				key = key.map( jQuery.camelCase );
4420			} else {
4421				key = jQuery.camelCase( key );
4422
4423				// If a key with the spaces exists, use it.
4424				// Otherwise, create an array by matching non-whitespace
4425				key = key in cache ?
4426					[ key ] :
4427					( key.match( rnothtmlwhite ) || [] );
4428			}
4429
4430			i = key.length;
4431
4432			while ( i-- ) {
4433				delete cache[ key[ i ] ];
4434			}
4435		}
4436
4437		// Remove the expando if there's no more data
4438		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4439
4440			// Support: Chrome <=35 - 45
4441			// Webkit & Blink performance suffers when deleting properties
4442			// from DOM nodes, so set to undefined instead
4443			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4444			if ( owner.nodeType ) {
4445				owner[ this.expando ] = undefined;
4446			} else {
4447				delete owner[ this.expando ];
4448			}
4449		}
4450	},
4451	hasData: function( owner ) {
4452		var cache = owner[ this.expando ];
4453		return cache !== undefined && !jQuery.isEmptyObject( cache );
4454	}
4455};
4456var dataPriv = new Data();
4457
4458var dataUser = new Data();
4459
4460
4461
4462//	Implementation Summary
4463//
4464//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4465//	2. Improve the module's maintainability by reducing the storage
4466//		paths to a single mechanism.
4467//	3. Use the same single mechanism to support "private" and "user" data.
4468//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4469//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4470//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4471
4472var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4473	rmultiDash = /[A-Z]/g;
4474
4475function getData( data ) {
4476	if ( data === "true" ) {
4477		return true;
4478	}
4479
4480	if ( data === "false" ) {
4481		return false;
4482	}
4483
4484	if ( data === "null" ) {
4485		return null;
4486	}
4487
4488	// Only convert to a number if it doesn't change the string
4489	if ( data === +data + "" ) {
4490		return +data;
4491	}
4492
4493	if ( rbrace.test( data ) ) {
4494		return JSON.parse( data );
4495	}
4496
4497	return data;
4498}
4499
4500function dataAttr( elem, key, data ) {
4501	var name;
4502
4503	// If nothing was found internally, try to fetch any
4504	// data from the HTML5 data-* attribute
4505	if ( data === undefined && elem.nodeType === 1 ) {
4506		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4507		data = elem.getAttribute( name );
4508
4509		if ( typeof data === "string" ) {
4510			try {
4511				data = getData( data );
4512			} catch ( e ) {}
4513
4514			// Make sure we set the data so it isn't changed later
4515			dataUser.set( elem, key, data );
4516		} else {
4517			data = undefined;
4518		}
4519	}
4520	return data;
4521}
4522
4523jQuery.extend( {
4524	hasData: function( elem ) {
4525		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4526	},
4527
4528	data: function( elem, name, data ) {
4529		return dataUser.access( elem, name, data );
4530	},
4531
4532	removeData: function( elem, name ) {
4533		dataUser.remove( elem, name );
4534	},
4535
4536	// TODO: Now that all calls to _data and _removeData have been replaced
4537	// with direct calls to dataPriv methods, these can be deprecated.
4538	_data: function( elem, name, data ) {
4539		return dataPriv.access( elem, name, data );
4540	},
4541
4542	_removeData: function( elem, name ) {
4543		dataPriv.remove( elem, name );
4544	}
4545} );
4546
4547jQuery.fn.extend( {
4548	data: function( key, value ) {
4549		var i, name, data,
4550			elem = this[ 0 ],
4551			attrs = elem && elem.attributes;
4552
4553		// Gets all values
4554		if ( key === undefined ) {
4555			if ( this.length ) {
4556				data = dataUser.get( elem );
4557
4558				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4559					i = attrs.length;
4560					while ( i-- ) {
4561
vendor: 7,789 bytes, lines 4562-4884
4562						// Support: IE 11 only
4563						// The attrs elements can be null (#14894)
4564						if ( attrs[ i ] ) {
4565							name = attrs[ i ].name;
4566							if ( name.indexOf( "data-" ) === 0 ) {
4567								name = jQuery.camelCase( name.slice( 5 ) );
4568								dataAttr( elem, name, data[ name ] );
4569							}
4570						}
4571					}
4572					dataPriv.set( elem, "hasDataAttrs", true );
4573				}
4574			}
4575
4576			return data;
4577		}
4578
4579		// Sets multiple values
4580		if ( typeof key === "object" ) {
4581			return this.each( function() {
4582				dataUser.set( this, key );
4583			} );
4584		}
4585
4586		return access( this, function( value ) {
4587			var data;
4588
4589			// The calling jQuery object (element matches) is not empty
4590			// (and therefore has an element appears at this[ 0 ]) and the
4591			// `value` parameter was not undefined. An empty jQuery object
4592			// will result in `undefined` for elem = this[ 0 ] which will
4593			// throw an exception if an attempt to read a data cache is made.
4594			if ( elem && value === undefined ) {
4595
4596				// Attempt to get data from the cache
4597				// The key will always be camelCased in Data
4598				data = dataUser.get( elem, key );
4599				if ( data !== undefined ) {
4600					return data;
4601				}
4602
4603				// Attempt to "discover" the data in
4604				// HTML5 custom data-* attrs
4605				data = dataAttr( elem, key );
4606				if ( data !== undefined ) {
4607					return data;
4608				}
4609
4610				// We tried really hard, but the data doesn't exist.
4611				return;
4612			}
4613
4614			// Set the data...
4615			this.each( function() {
4616
4617				// We always store the camelCased key
4618				dataUser.set( this, key, value );
4619			} );
4620		}, null, value, arguments.length > 1, null, true );
4621	},
4622
4623	removeData: function( key ) {
4624		return this.each( function() {
4625			dataUser.remove( this, key );
4626		} );
4627	}
4628} );
4629
4630
4631jQuery.extend( {
4632	queue: function( elem, type, data ) {
4633		var queue;
4634
4635		if ( elem ) {
4636			type = ( type || "fx" ) + "queue";
4637			queue = dataPriv.get( elem, type );
4638
4639			// Speed up dequeue by getting out quickly if this is just a lookup
4640			if ( data ) {
4641				if ( !queue || Array.isArray( data ) ) {
4642					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4643				} else {
4644					queue.push( data );
4645				}
4646			}
4647			return queue || [];
4648		}
4649	},
4650
4651	dequeue: function( elem, type ) {
4652		type = type || "fx";
4653
4654		var queue = jQuery.queue( elem, type ),
4655			startLength = queue.length,
4656			fn = queue.shift(),
4657			hooks = jQuery._queueHooks( elem, type ),
4658			next = function() {
4659				jQuery.dequeue( elem, type );
4660			};
4661
4662		// If the fx queue is dequeued, always remove the progress sentinel
4663		if ( fn === "inprogress" ) {
4664			fn = queue.shift();
4665			startLength--;
4666		}
4667
4668		if ( fn ) {
4669
4670			// Add a progress sentinel to prevent the fx queue from being
4671			// automatically dequeued
4672			if ( type === "fx" ) {
4673				queue.unshift( "inprogress" );
4674			}
4675
4676			// Clear up the last queue stop function
4677			delete hooks.stop;
4678			fn.call( elem, next, hooks );
4679		}
4680
4681		if ( !startLength && hooks ) {
4682			hooks.empty.fire();
4683		}
4684	},
4685
4686	// Not public - generate a queueHooks object, or return the current one
4687	_queueHooks: function( elem, type ) {
4688		var key = type + "queueHooks";
4689		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4690			empty: jQuery.Callbacks( "once memory" ).add( function() {
4691				dataPriv.remove( elem, [ type + "queue", key ] );
4692			} )
4693		} );
4694	}
4695} );
4696
4697jQuery.fn.extend( {
4698	queue: function( type, data ) {
4699		var setter = 2;
4700
4701		if ( typeof type !== "string" ) {
4702			data = type;
4703			type = "fx";
4704			setter--;
4705		}
4706
4707		if ( arguments.length < setter ) {
4708			return jQuery.queue( this[ 0 ], type );
4709		}
4710
4711		return data === undefined ?
4712			this :
4713			this.each( function() {
4714				var queue = jQuery.queue( this, type, data );
4715
4716				// Ensure a hooks for this queue
4717				jQuery._queueHooks( this, type );
4718
4719				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4720					jQuery.dequeue( this, type );
4721				}
4722			} );
4723	},
4724	dequeue: function( type ) {
4725		return this.each( function() {
4726			jQuery.dequeue( this, type );
4727		} );
4728	},
4729	clearQueue: function( type ) {
4730		return this.queue( type || "fx", [] );
4731	},
4732
4733	// Get a promise resolved when queues of a certain type
4734	// are emptied (fx is the type by default)
4735	promise: function( type, obj ) {
4736		var tmp,
4737			count = 1,
4738			defer = jQuery.Deferred(),
4739			elements = this,
4740			i = this.length,
4741			resolve = function() {
4742				if ( !( --count ) ) {
4743					defer.resolveWith( elements, [ elements ] );
4744				}
4745			};
4746
4747		if ( typeof type !== "string" ) {
4748			obj = type;
4749			type = undefined;
4750		}
4751		type = type || "fx";
4752
4753		while ( i-- ) {
4754			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4755			if ( tmp && tmp.empty ) {
4756				count++;
4757				tmp.empty.add( resolve );
4758			}
4759		}
4760		resolve();
4761		return defer.promise( obj );
4762	}
4763} );
4764var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4765
4766var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4767
4768
4769var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4770
4771var isHiddenWithinTree = function( elem, el ) {
4772
4773		// isHiddenWithinTree might be called from jQuery#filter function;
4774		// in that case, element will be second argument
4775		elem = el || elem;
4776
4777		// Inline style trumps all
4778		return elem.style.display === "none" ||
4779			elem.style.display === "" &&
4780
4781			// Otherwise, check computed style
4782			// Support: Firefox <=43 - 45
4783			// Disconnected elements can have computed display: none, so first confirm that elem is
4784			// in the document.
4785			jQuery.contains( elem.ownerDocument, elem ) &&
4786
4787			jQuery.css( elem, "display" ) === "none";
4788	};
4789
4790var swap = function( elem, options, callback, args ) {
4791	var ret, name,
4792		old = {};
4793
4794	// Remember the old values, and insert the new ones
4795	for ( name in options ) {
4796		old[ name ] = elem.style[ name ];
4797		elem.style[ name ] = options[ name ];
4798	}
4799
4800	ret = callback.apply( elem, args || [] );
4801
4802	// Revert the old values
4803	for ( name in options ) {
4804		elem.style[ name ] = old[ name ];
4805	}
4806
4807	return ret;
4808};
4809
4810
4811
4812
4813function adjustCSS( elem, prop, valueParts, tween ) {
4814	var adjusted,
4815		scale = 1,
4816		maxIterations = 20,
4817		currentValue = tween ?
4818			function() {
4819				return tween.cur();
4820			} :
4821			function() {
4822				return jQuery.css( elem, prop, "" );
4823			},
4824		initial = currentValue(),
4825		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4826
4827		// Starting value computation is required for potential unit mismatches
4828		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4829			rcssNum.exec( jQuery.css( elem, prop ) );
4830
4831	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4832
4833		// Trust units reported by jQuery.css
4834		unit = unit || initialInUnit[ 3 ];
4835
4836		// Make sure we update the tween properties later on
4837		valueParts = valueParts || [];
4838
4839		// Iteratively approximate from a nonzero starting point
4840		initialInUnit = +initial || 1;
4841
4842		do {
4843
4844			// If previous iteration zeroed out, double until we get *something*.
4845			// Use string for doubling so we don't accidentally see scale as unchanged below
4846			scale = scale || ".5";
4847
4848			// Adjust and apply
4849			initialInUnit = initialInUnit / scale;
4850			jQuery.style( elem, prop, initialInUnit + unit );
4851
4852		// Update scale, tolerating zero or NaN from tween.cur()
4853		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
4854		} while (
4855			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
4856		);
4857	}
4858
4859	if ( valueParts ) {
4860		initialInUnit = +initialInUnit || +initial || 0;
4861
4862		// Apply relative offset (+=/-=) if specified
4863		adjusted = valueParts[ 1 ] ?
4864			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4865			+valueParts[ 2 ];
4866		if ( tween ) {
4867			tween.unit = unit;
4868			tween.start = initialInUnit;
4869			tween.end = adjusted;
4870		}
4871	}
4872	return adjusted;
4873}
4874
4875
4876var defaultDisplayMap = {};
4877
4878function getDefaultDisplay( elem ) {
4879	var temp,
4880		doc = elem.ownerDocument,
4881		nodeName = elem.nodeName,
4882		display = defaultDisplayMap[ nodeName ];
4883
4884	if ( display ) {
vendor: 4,001 bytes, lines 4885-5056
4885		return display;
4886	}
4887
4888	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4889	display = jQuery.css( temp, "display" );
4890
4891	temp.parentNode.removeChild( temp );
4892
4893	if ( display === "none" ) {
4894		display = "block";
4895	}
4896	defaultDisplayMap[ nodeName ] = display;
4897
4898	return display;
4899}
4900
4901function showHide( elements, show ) {
4902	var display, elem,
4903		values = [],
4904		index = 0,
4905		length = elements.length;
4906
4907	// Determine new display value for elements that need to change
4908	for ( ; index < length; index++ ) {
4909		elem = elements[ index ];
4910		if ( !elem.style ) {
4911			continue;
4912		}
4913
4914		display = elem.style.display;
4915		if ( show ) {
4916
4917			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4918			// check is required in this first loop unless we have a nonempty display value (either
4919			// inline or about-to-be-restored)
4920			if ( display === "none" ) {
4921				values[ index ] = dataPriv.get( elem, "display" ) || null;
4922				if ( !values[ index ] ) {
4923					elem.style.display = "";
4924				}
4925			}
4926			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4927				values[ index ] = getDefaultDisplay( elem );
4928			}
4929		} else {
4930			if ( display !== "none" ) {
4931				values[ index ] = "none";
4932
4933				// Remember what we're overwriting
4934				dataPriv.set( elem, "display", display );
4935			}
4936		}
4937	}
4938
4939	// Set the display of the elements in a second loop to avoid constant reflow
4940	for ( index = 0; index < length; index++ ) {
4941		if ( values[ index ] != null ) {
4942			elements[ index ].style.display = values[ index ];
4943		}
4944	}
4945
4946	return elements;
4947}
4948
4949jQuery.fn.extend( {
4950	show: function() {
4951		return showHide( this, true );
4952	},
4953	hide: function() {
4954		return showHide( this );
4955	},
4956	toggle: function( state ) {
4957		if ( typeof state === "boolean" ) {
4958			return state ? this.show() : this.hide();
4959		}
4960
4961		return this.each( function() {
4962			if ( isHiddenWithinTree( this ) ) {
4963				jQuery( this ).show();
4964			} else {
4965				jQuery( this ).hide();
4966			}
4967		} );
4968	}
4969} );
4970var rcheckableType = ( /^(?:checkbox|radio)$/i );
4971
4972var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4973
4974var rscriptType = ( /^$|\/(?:java|ecma)script/i );
4975
4976
4977
4978// We have to close these tags to support XHTML (#13200)
4979var wrapMap = {
4980
4981	// Support: IE <=9 only
4982	option: [ 1, "<select multiple='multiple'>", "</select>" ],
4983
4984	// XHTML parsers do not magically insert elements in the
4985	// same way that tag soup parsers do. So we cannot shorten
4986	// this by omitting <tbody> or other required elements.
4987	thead: [ 1, "<table>", "</table>" ],
4988	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4989	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4990	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4991
4992	_default: [ 0, "", "" ]
4993};
4994
4995// Support: IE <=9 only
4996wrapMap.optgroup = wrapMap.option;
4997
4998wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4999wrapMap.th = wrapMap.td;
5000
5001
5002function getAll( context, tag ) {
5003
5004	// Support: IE <=9 - 11 only
5005	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
5006	var ret;
5007
5008	if ( typeof context.getElementsByTagName !== "undefined" ) {
5009		ret = context.getElementsByTagName( tag || "*" );
5010
5011	} else if ( typeof context.querySelectorAll !== "undefined" ) {
5012		ret = context.querySelectorAll( tag || "*" );
5013
5014	} else {
5015		ret = [];
5016	}
5017
5018	if ( tag === undefined || tag && nodeName( context, tag ) ) {
5019		return jQuery.merge( [ context ], ret );
5020	}
5021
5022	return ret;
5023}
5024
5025
5026// Mark scripts as having already been evaluated
5027function setGlobalEval( elems, refElements ) {
5028	var i = 0,
5029		l = elems.length;
5030
5031	for ( ; i < l; i++ ) {
5032		dataPriv.set(
5033			elems[ i ],
5034			"globalEval",
5035			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
5036		);
5037	}
5038}
5039
5040
5041var rhtml = /<|&#?\w+;/;
5042
5043function buildFragment( elems, context, scripts, selection, ignored ) {
5044	var elem, tmp, tag, wrap, contains, j,
5045		fragment = context.createDocumentFragment(),
5046		nodes = [],
5047		i = 0,
5048		l = elems.length;
5049
5050	for ( ; i < l; i++ ) {
5051		elem = elems[ i ];
5052
5053		if ( elem || elem === 0 ) {
5054
5055			// Add nodes directly
5056			if ( jQuery.t
vendor: 14,415 bytes, lines 5056-5566
5056ype( elem ) === "object" ) {
5057
5058				// Support: Android <=4.0 only, PhantomJS 1 only
5059				// push.apply(_, arraylike) throws on ancient WebKit
5060				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5061
5062			// Convert non-html into a text node
5063			} else if ( !rhtml.test( elem ) ) {
5064				nodes.push( context.createTextNode( elem ) );
5065
5066			// Convert html into DOM nodes
5067			} else {
5068				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
5069
5070				// Deserialize a standard representation
5071				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
5072				wrap = wrapMap[ tag ] || wrapMap._default;
5073				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
5074
5075				// Descend through wrappers to the right content
5076				j = wrap[ 0 ];
5077				while ( j-- ) {
5078					tmp = tmp.lastChild;
5079				}
5080
5081				// Support: Android <=4.0 only, PhantomJS 1 only
5082				// push.apply(_, arraylike) throws on ancient WebKit
5083				jQuery.merge( nodes, tmp.childNodes );
5084
5085				// Remember the top-level container
5086				tmp = fragment.firstChild;
5087
5088				// Ensure the created nodes are orphaned (#12392)
5089				tmp.textContent = "";
5090			}
5091		}
5092	}
5093
5094	// Remove wrapper from fragment
5095	fragment.textContent = "";
5096
5097	i = 0;
5098	while ( ( elem = nodes[ i++ ] ) ) {
5099
5100		// Skip elements already in the context collection (trac-4087)
5101		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
5102			if ( ignored ) {
5103				ignored.push( elem );
5104			}
5105			continue;
5106		}
5107
5108		contains = jQuery.contains( elem.ownerDocument, elem );
5109
5110		// Append to fragment
5111		tmp = getAll( fragment.appendChild( elem ), "script" );
5112
5113		// Preserve script evaluation history
5114		if ( contains ) {
5115			setGlobalEval( tmp );
5116		}
5117
5118		// Capture executables
5119		if ( scripts ) {
5120			j = 0;
5121			while ( ( elem = tmp[ j++ ] ) ) {
5122				if ( rscriptType.test( elem.type || "" ) ) {
5123					scripts.push( elem );
5124				}
5125			}
5126		}
5127	}
5128
5129	return fragment;
5130}
5131
5132
5133( function() {
5134	var fragment = document.createDocumentFragment(),
5135		div = fragment.appendChild( document.createElement( "div" ) ),
5136		input = document.createElement( "input" );
5137
5138	// Support: Android 4.0 - 4.3 only
5139	// Check state lost if the name is set (#11217)
5140	// Support: Windows Web Apps (WWA)
5141	// `name` and `type` must use .setAttribute for WWA (#14901)
5142	input.setAttribute( "type", "radio" );
5143	input.setAttribute( "checked", "checked" );
5144	input.setAttribute( "name", "t" );
5145
5146	div.appendChild( input );
5147
5148	// Support: Android <=4.1 only
5149	// Older WebKit doesn't clone checked state correctly in fragments
5150	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
5151
5152	// Support: IE <=11 only
5153	// Make sure textarea (and checkbox) defaultValue is properly cloned
5154	div.innerHTML = "<textarea>x</textarea>";
5155	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
5156} )();
5157var documentElement = document.documentElement;
5158
5159
5160
5161var
5162	rkeyEvent = /^key/,
5163	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
5164	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5165
5166function returnTrue() {
5167	return true;
5168}
5169
5170function returnFalse() {
5171	return false;
5172}
5173
5174// Support: IE <=9 only
5175// See #13393 for more info
5176function safeActiveElement() {
5177	try {
5178		return document.activeElement;
5179	} catch ( err ) { }
5180}
5181
5182function on( elem, types, selector, data, fn, one ) {
5183	var origFn, type;
5184
5185	// Types can be a map of types/handlers
5186	if ( typeof types === "object" ) {
5187
5188		// ( types-Object, selector, data )
5189		if ( typeof selector !== "string" ) {
5190
5191			// ( types-Object, data )
5192			data = data || selector;
5193			selector = undefined;
5194		}
5195		for ( type in types ) {
5196			on( elem, type, selector, data, types[ type ], one );
5197		}
5198		return elem;
5199	}
5200
5201	if ( data == null && fn == null ) {
5202
5203		// ( types, fn )
5204		fn = selector;
5205		data = selector = undefined;
5206	} else if ( fn == null ) {
5207		if ( typeof selector === "string" ) {
5208
5209			// ( types, selector, fn )
5210			fn = data;
5211			data = undefined;
5212		} else {
5213
5214			// ( types, data, fn )
5215			fn = data;
5216			data = selector;
5217			selector = undefined;
5218		}
5219	}
5220	if ( fn === false ) {
5221		fn = returnFalse;
5222	} else if ( !fn ) {
5223		return elem;
5224	}
5225
5226	if ( one === 1 ) {
5227		origFn = fn;
5228		fn = function( event ) {
5229
5230			// Can use an empty set, since event contains the info
5231			jQuery().off( event );
5232			return origFn.apply( this, arguments );
5233		};
5234
5235		// Use same guid so caller can remove using origFn
5236		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5237	}
5238	return elem.each( function() {
5239		jQuery.event.add( this, types, fn, data, selector );
5240	} );
5241}
5242
5243/*
5244 * Helper functions for managing events -- not part of the public interface.
5245 * Props to Dean Edwards' addEvent library for many of the ideas.
5246 */
5247jQuery.event = {
5248
5249	global: {},
5250
5251	add: function( elem, types, handler, data, selector ) {
5252
5253		var handleObjIn, eventHandle, tmp,
5254			events, t, handleObj,
5255			special, handlers, type, namespaces, origType,
5256			elemData = dataPriv.get( elem );
5257
5258		// Don't attach events to noData or text/comment nodes (but allow plain objects)
5259		if ( !elemData ) {
5260			return;
5261		}
5262
5263		// Caller can pass in an object of custom data in lieu of the handler
5264		if ( handler.handler ) {
5265			handleObjIn = handler;
5266			handler = handleObjIn.handler;
5267			selector = handleObjIn.selector;
5268		}
5269
5270		// Ensure that invalid selectors throw exceptions at attach time
5271		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
5272		if ( selector ) {
5273			jQuery.find.matchesSelector( documentElement, selector );
5274		}
5275
5276		// Make sure that the handler has a unique ID, used to find/remove it later
5277		if ( !handler.guid ) {
5278			handler.guid = jQuery.guid++;
5279		}
5280
5281		// Init the element's event structure and main handler, if this is the first
5282		if ( !( events = elemData.events ) ) {
5283			events = elemData.events = {};
5284		}
5285		if ( !( eventHandle = elemData.handle ) ) {
5286			eventHandle = elemData.handle = function( e ) {
5287
5288				// Discard the second event of a jQuery.event.trigger() and
5289				// when an event is called after a page has unloaded
5290				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5291					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5292			};
5293		}
5294
5295		// Handle multiple events separated by a space
5296		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5297		t = types.length;
5298		while ( t-- ) {
5299			tmp = rtypenamespace.exec( types[ t ] ) || [];
5300			type = origType = tmp[ 1 ];
5301			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5302
5303			// There *must* be a type, no attaching namespace-only handlers
5304			if ( !type ) {
5305				continue;
5306			}
5307
5308			// If event changes its type, use the special event handlers for the changed type
5309			special = jQuery.event.special[ type ] || {};
5310
5311			// If selector defined, determine special event api type, otherwise given type
5312			type = ( selector ? special.delegateType : special.bindType ) || type;
5313
5314			// Update special based on newly reset type
5315			special = jQuery.event.special[ type ] || {};
5316
5317			// handleObj is passed to all event handlers
5318			handleObj = jQuery.extend( {
5319				type: type,
5320				origType: origType,
5321				data: data,
5322				handler: handler,
5323				guid: handler.guid,
5324				selector: selector,
5325				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5326				namespace: namespaces.join( "." )
5327			}, handleObjIn );
5328
5329			// Init the event handler queue if we're the first
5330			if ( !( handlers = events[ type ] ) ) {
5331				handlers = events[ type ] = [];
5332				handlers.delegateCount = 0;
5333
5334				// Only use addEventListener if the special events handler returns false
5335				if ( !special.setup ||
5336					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5337
5338					if ( elem.addEventListener ) {
5339						elem.addEventListener( type, eventHandle );
5340					}
5341				}
5342			}
5343
5344			if ( special.add ) {
5345				special.add.call( elem, handleObj );
5346
5347				if ( !handleObj.handler.guid ) {
5348					handleObj.handler.guid = handler.guid;
5349				}
5350			}
5351
5352			// Add to the element's handler list, delegates in front
5353			if ( selector ) {
5354				handlers.splice( handlers.delegateCount++, 0, handleObj );
5355			} else {
5356				handlers.push( handleObj );
5357			}
5358
5359			// Keep track of which events have ever been used, for event optimization
5360			jQuery.event.global[ type ] = true;
5361		}
5362
5363	},
5364
5365	// Detach an event or set of events from an element
5366	remove: function( elem, types, handler, selector, mappedTypes ) {
5367
5368		var j, origCount, tmp,
5369			events, t, handleObj,
5370			special, handlers, type, namespaces, origType,
5371			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5372
5373		if ( !elemData || !( events = elemData.events ) ) {
5374			return;
5375		}
5376
5377		// Once for each type.namespace in types; type may be omitted
5378		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5379		t = types.length;
5380		while ( t-- ) {
5381			tmp = rtypenamespace.exec( types[ t ] ) || [];
5382			type = origType = tmp[ 1 ];
5383			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5384
5385			// Unbind all events (on this namespace, if provided) for the element
5386			if ( !type ) {
5387				for ( type in events ) {
5388					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5389				}
5390				continue;
5391			}
5392
5393			special = jQuery.event.special[ type ] || {};
5394			type = ( selector ? special.delegateType : special.bindType ) || type;
5395			handlers = events[ type ] || [];
5396			tmp = tmp[ 2 ] &&
5397				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5398
5399			// Remove matching events
5400			origCount = j = handlers.length;
5401			while ( j-- ) {
5402				handleObj = handlers[ j ];
5403
5404				if ( ( mappedTypes || origType === handleObj.origType ) &&
5405					( !handler || handler.guid === handleObj.guid ) &&
5406					( !tmp || tmp.test( handleObj.namespace ) ) &&
5407					( !selector || selector === handleObj.selector ||
5408						selector === "**" && handleObj.selector ) ) {
5409					handlers.splice( j, 1 );
5410
5411					if ( handleObj.selector ) {
5412						handlers.delegateCount--;
5413					}
5414					if ( special.remove ) {
5415						special.remove.call( elem, handleObj );
5416					}
5417				}
5418			}
5419
5420			// Remove generic event handler if we removed something and no more handlers exist
5421			// (avoids potential for endless recursion during removal of special event handlers)
5422			if ( origCount && !handlers.length ) {
5423				if ( !special.teardown ||
5424					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5425
5426					jQuery.removeEvent( elem, type, elemData.handle );
5427				}
5428
5429				delete events[ type ];
5430			}
5431		}
5432
5433		// Remove data and the expando if it's no longer used
5434		if ( jQuery.isEmptyObject( events ) ) {
5435			dataPriv.remove( elem, "handle events" );
5436		}
5437	},
5438
5439	dispatch: function( nativeEvent ) {
5440
5441		// Make a writable jQuery.Event from the native event object
5442		var event = jQuery.event.fix( nativeEvent );
5443
5444		var i, j, ret, matched, handleObj, handlerQueue,
5445			args = new Array( arguments.length ),
5446			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5447			special = jQuery.event.special[ event.type ] || {};
5448
5449		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5450		args[ 0 ] = event;
5451
5452		for ( i = 1; i < arguments.length; i++ ) {
5453			args[ i ] = arguments[ i ];
5454		}
5455
5456		event.delegateTarget = this;
5457
5458		// Call the preDispatch hook for the mapped type, and let it bail if desired
5459		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5460			return;
5461		}
5462
5463		// Determine handlers
5464		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5465
5466		// Run delegates first; they may want to stop propagation beneath us
5467		i = 0;
5468		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5469			event.currentTarget = matched.elem;
5470
5471			j = 0;
5472			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5473				!event.isImmediatePropagationStopped() ) {
5474
5475				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
5476				// a subset or equal to those in the bound event (both can have no namespace).
5477				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5478
5479					event.handleObj = handleObj;
5480					event.data = handleObj.data;
5481
5482					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5483						handleObj.handler ).apply( matched.elem, args );
5484
5485					if ( ret !== undefined ) {
5486						if ( ( event.result = ret ) === false ) {
5487							event.preventDefault();
5488							event.stopPropagation();
5489						}
5490					}
5491				}
5492			}
5493		}
5494
5495		// Call the postDispatch hook for the mapped type
5496		if ( special.postDispatch ) {
5497			special.postDispatch.call( this, event );
5498		}
5499
5500		return event.result;
5501	},
5502
5503	handlers: function( event, handlers ) {
5504		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5505			handlerQueue = [],
5506			delegateCount = handlers.delegateCount,
5507			cur = event.target;
5508
5509		// Find delegate handlers
5510		if ( delegateCount &&
5511
5512			// Support: IE <=9
5513			// Black-hole SVG <use> instance trees (trac-13180)
5514			cur.nodeType &&
5515
5516			// Support: Firefox <=42
5517			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5518			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5519			// Support: IE 11 only
5520			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5521			!( event.type === "click" && event.button >= 1 ) ) {
5522
5523			for ( ; cur !== this; cur = cur.parentNode || this ) {
5524
5525				// Don't check non-elements (#13208)
5526				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5527				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5528					matchedHandlers = [];
5529					matchedSelectors = {};
5530					for ( i = 0; i < delegateCount; i++ ) {
5531						handleObj = handlers[ i ];
5532
5533						// Don't conflict with Object.prototype properties (#13203)
5534						sel = handleObj.selector + " ";
5535
5536						if ( matchedSelectors[ sel ] === undefined ) {
5537							matchedSelectors[ sel ] = handleObj.needsContext ?
5538								jQuery( sel, this ).index( cur ) > -1 :
5539								jQuery.find( sel, this, null, [ cur ] ).length;
5540						}
5541						if ( matchedSelectors[ sel ] ) {
5542							matchedHandlers.push( handleObj );
5543						}
5544					}
5545					if ( matchedHandlers.length ) {
5546						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5547					}
5548				}
5549			}
5550		}
5551
5552		// Add the remaining (directly-bound) handlers
5553		cur = this;
5554		if ( delegateCount < handlers.length ) {
5555			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5556		}
5557
5558		return handlerQueue;
5559	},
5560
5561	addProp: function( name, hook ) {
5562		Object.defineProperty( jQuery.Event.prototype, name, {
5563			enumerable: true,
5564			configurable: true,
5565
5566			get: 
vendor: 8,400 bytes, lines 5566-5915
5566jQuery.isFunction( hook ) ?
5567				function() {
5568					if ( this.originalEvent ) {
5569							return hook( this.originalEvent );
5570					}
5571				} :
5572				function() {
5573					if ( this.originalEvent ) {
5574							return this.originalEvent[ name ];
5575					}
5576				},
5577
5578			set: function( value ) {
5579				Object.defineProperty( this, name, {
5580					enumerable: true,
5581					configurable: true,
5582					writable: true,
5583					value: value
5584				} );
5585			}
5586		} );
5587	},
5588
5589	fix: function( originalEvent ) {
5590		return originalEvent[ jQuery.expando ] ?
5591			originalEvent :
5592			new jQuery.Event( originalEvent );
5593	},
5594
5595	special: {
5596		load: {
5597
5598			// Prevent triggered image.load events from bubbling to window.load
5599			noBubble: true
5600		},
5601		focus: {
5602
5603			// Fire native event if possible so blur/focus sequence is correct
5604			trigger: function() {
5605				if ( this !== safeActiveElement() && this.focus ) {
5606					this.focus();
5607					return false;
5608				}
5609			},
5610			delegateType: "focusin"
5611		},
5612		blur: {
5613			trigger: function() {
5614				if ( this === safeActiveElement() && this.blur ) {
5615					this.blur();
5616					return false;
5617				}
5618			},
5619			delegateType: "focusout"
5620		},
5621		click: {
5622
5623			// For checkbox, fire native event so checked state will be right
5624			trigger: function() {
5625				if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5626					this.click();
5627					return false;
5628				}
5629			},
5630
5631			// For cross-browser consistency, don't fire native .click() on links
5632			_default: function( event ) {
5633				return nodeName( event.target, "a" );
5634			}
5635		},
5636
5637		beforeunload: {
5638			postDispatch: function( event ) {
5639
5640				// Support: Firefox 20+
5641				// Firefox doesn't alert if the returnValue field is not set.
5642				if ( event.result !== undefined && event.originalEvent ) {
5643					event.originalEvent.returnValue = event.result;
5644				}
5645			}
5646		}
5647	}
5648};
5649
5650jQuery.removeEvent = function( elem, type, handle ) {
5651
5652	// This "if" is needed for plain objects
5653	if ( elem.removeEventListener ) {
5654		elem.removeEventListener( type, handle );
5655	}
5656};
5657
5658jQuery.Event = function( src, props ) {
5659
5660	// Allow instantiation without the 'new' keyword
5661	if ( !( this instanceof jQuery.Event ) ) {
5662		return new jQuery.Event( src, props );
5663	}
5664
5665	// Event object
5666	if ( src && src.type ) {
5667		this.originalEvent = src;
5668		this.type = src.type;
5669
5670		// Events bubbling up the document may have been marked as prevented
5671		// by a handler lower down the tree; reflect the correct value.
5672		this.isDefaultPrevented = src.defaultPrevented ||
5673				src.defaultPrevented === undefined &&
5674
5675				// Support: Android <=2.3 only
5676				src.returnValue === false ?
5677			returnTrue :
5678			returnFalse;
5679
5680		// Create target properties
5681		// Support: Safari <=6 - 7 only
5682		// Target should not be a text node (#504, #13143)
5683		this.target = ( src.target && src.target.nodeType === 3 ) ?
5684			src.target.parentNode :
5685			src.target;
5686
5687		this.currentTarget = src.currentTarget;
5688		this.relatedTarget = src.relatedTarget;
5689
5690	// Event type
5691	} else {
5692		this.type = src;
5693	}
5694
5695	// Put explicitly provided properties onto the event object
5696	if ( props ) {
5697		jQuery.extend( this, props );
5698	}
5699
5700	// Create a timestamp if incoming event doesn't have one
5701	this.timeStamp = src && src.timeStamp || jQuery.now();
5702
5703	// Mark it as fixed
5704	this[ jQuery.expando ] = true;
5705};
5706
5707// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5708// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5709jQuery.Event.prototype = {
5710	constructor: jQuery.Event,
5711	isDefaultPrevented: returnFalse,
5712	isPropagationStopped: returnFalse,
5713	isImmediatePropagationStopped: returnFalse,
5714	isSimulated: false,
5715
5716	preventDefault: function() {
5717		var e = this.originalEvent;
5718
5719		this.isDefaultPrevented = returnTrue;
5720
5721		if ( e && !this.isSimulated ) {
5722			e.preventDefault();
5723		}
5724	},
5725	stopPropagation: function() {
5726		var e = this.originalEvent;
5727
5728		this.isPropagationStopped = returnTrue;
5729
5730		if ( e && !this.isSimulated ) {
5731			e.stopPropagation();
5732		}
5733	},
5734	stopImmediatePropagation: function() {
5735		var e = this.originalEvent;
5736
5737		this.isImmediatePropagationStopped = returnTrue;
5738
5739		if ( e && !this.isSimulated ) {
5740			e.stopImmediatePropagation();
5741		}
5742
5743		this.stopPropagation();
5744	}
5745};
5746
5747// Includes all common event props including KeyEvent and MouseEvent specific props
5748jQuery.each( {
5749	altKey: true,
5750	bubbles: true,
5751	cancelable: true,
5752	changedTouches: true,
5753	ctrlKey: true,
5754	detail: true,
5755	eventPhase: true,
5756	metaKey: true,
5757	pageX: true,
5758	pageY: true,
5759	shiftKey: true,
5760	view: true,
5761	"char": true,
5762	charCode: true,
5763	key: true,
5764	keyCode: true,
5765	button: true,
5766	buttons: true,
5767	clientX: true,
5768	clientY: true,
5769	offsetX: true,
5770	offsetY: true,
5771	pointerId: true,
5772	pointerType: true,
5773	screenX: true,
5774	screenY: true,
5775	targetTouches: true,
5776	toElement: true,
5777	touches: true,
5778
5779	which: function( event ) {
5780		var button = event.button;
5781
5782		// Add which for key events
5783		if ( event.which == null && rkeyEvent.test( event.type ) ) {
5784			return event.charCode != null ? event.charCode : event.keyCode;
5785		}
5786
5787		// Add which for click: 1 === left; 2 === middle; 3 === right
5788		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5789			if ( button & 1 ) {
5790				return 1;
5791			}
5792
5793			if ( button & 2 ) {
5794				return 3;
5795			}
5796
5797			if ( button & 4 ) {
5798				return 2;
5799			}
5800
5801			return 0;
5802		}
5803
5804		return event.which;
5805	}
5806}, jQuery.event.addProp );
5807
5808// Create mouseenter/leave events using mouseover/out and event-time checks
5809// so that event delegation works in jQuery.
5810// Do the same for pointerenter/pointerleave and pointerover/pointerout
5811//
5812// Support: Safari 7 only
5813// Safari sends mouseenter too often; see:
5814// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5815// for the description of the bug (it existed in older Chrome versions as well).
5816jQuery.each( {
5817	mouseenter: "mouseover",
5818	mouseleave: "mouseout",
5819	pointerenter: "pointerover",
5820	pointerleave: "pointerout"
5821}, function( orig, fix ) {
5822	jQuery.event.special[ orig ] = {
5823		delegateType: fix,
5824		bindType: fix,
5825
5826		handle: function( event ) {
5827			var ret,
5828				target = this,
5829				related = event.relatedTarget,
5830				handleObj = event.handleObj;
5831
5832			// For mouseenter/leave call the handler if related is outside the target.
5833			// NB: No relatedTarget if the mouse left/entered the browser window
5834			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5835				event.type = handleObj.origType;
5836				ret = handleObj.handler.apply( this, arguments );
5837				event.type = fix;
5838			}
5839			return ret;
5840		}
5841	};
5842} );
5843
5844jQuery.fn.extend( {
5845
5846	on: function( types, selector, data, fn ) {
5847		return on( this, types, selector, data, fn );
5848	},
5849	one: function( types, selector, data, fn ) {
5850		return on( this, types, selector, data, fn, 1 );
5851	},
5852	off: function( types, selector, fn ) {
5853		var handleObj, type;
5854		if ( types && types.preventDefault && types.handleObj ) {
5855
5856			// ( event )  dispatched jQuery.Event
5857			handleObj = types.handleObj;
5858			jQuery( types.delegateTarget ).off(
5859				handleObj.namespace ?
5860					handleObj.origType + "." + handleObj.namespace :
5861					handleObj.origType,
5862				handleObj.selector,
5863				handleObj.handler
5864			);
5865			return this;
5866		}
5867		if ( typeof types === "object" ) {
5868
5869			// ( types-object [, selector] )
5870			for ( type in types ) {
5871				this.off( type, selector, types[ type ] );
5872			}
5873			return this;
5874		}
5875		if ( selector === false || typeof selector === "function" ) {
5876
5877			// ( types [, fn] )
5878			fn = selector;
5879			selector = undefined;
5880		}
5881		if ( fn === false ) {
5882			fn = returnFalse;
5883		}
5884		return this.each( function() {
5885			jQuery.event.remove( this, types, fn, selector );
5886		} );
5887	}
5888} );
5889
5890
5891var
5892
5893	/* eslint-disable max-len */
5894
5895	// See https://github.com/eslint/eslint/issues/3229
5896	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5897
5898	/* eslint-enable */
5899
5900	// Support: IE <=10 - 11, Edge 12 - 13
5901	// In IE/Edge using regex groups here causes severe slowdowns.
5902	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5903	rnoInnerhtml = /<script|<style|<link/i,
5904
5905	// checked="checked" or checked
5906	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5907	rscriptTypeMasked = /^true\/(.*)/,
5908	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5909
5910// Prefer a tbody over its parent table for containing new rows
5911function manipulationTarget( elem, content ) {
5912	if ( nodeName( elem, "table" ) &&
5913		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5914
5915		return jQuery( ">tbody", elem
vendor: 6,531 bytes, lines 5915-6163
5915 )[ 0 ] || elem;
5916	}
5917
5918	return elem;
5919}
5920
5921// Replace/restore the type attribute of script elements for safe DOM manipulation
5922function disableScript( elem ) {
5923	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5924	return elem;
5925}
5926function restoreScript( elem ) {
5927	var match = rscriptTypeMasked.exec( elem.type );
5928
5929	if ( match ) {
5930		elem.type = match[ 1 ];
5931	} else {
5932		elem.removeAttribute( "type" );
5933	}
5934
5935	return elem;
5936}
5937
5938function cloneCopyEvent( src, dest ) {
5939	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5940
5941	if ( dest.nodeType !== 1 ) {
5942		return;
5943	}
5944
5945	// 1. Copy private data: events, handlers, etc.
5946	if ( dataPriv.hasData( src ) ) {
5947		pdataOld = dataPriv.access( src );
5948		pdataCur = dataPriv.set( dest, pdataOld );
5949		events = pdataOld.events;
5950
5951		if ( events ) {
5952			delete pdataCur.handle;
5953			pdataCur.events = {};
5954
5955			for ( type in events ) {
5956				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5957					jQuery.event.add( dest, type, events[ type ][ i ] );
5958				}
5959			}
5960		}
5961	}
5962
5963	// 2. Copy user data
5964	if ( dataUser.hasData( src ) ) {
5965		udataOld = dataUser.access( src );
5966		udataCur = jQuery.extend( {}, udataOld );
5967
5968		dataUser.set( dest, udataCur );
5969	}
5970}
5971
5972// Fix IE bugs, see support tests
5973function fixInput( src, dest ) {
5974	var nodeName = dest.nodeName.toLowerCase();
5975
5976	// Fails to persist the checked state of a cloned checkbox or radio button.
5977	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5978		dest.checked = src.checked;
5979
5980	// Fails to return the selected option to the default selected state when cloning options
5981	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5982		dest.defaultValue = src.defaultValue;
5983	}
5984}
5985
5986function domManip( collection, args, callback, ignored ) {
5987
5988	// Flatten any nested arrays
5989	args = concat.apply( [], args );
5990
5991	var fragment, first, scripts, hasScripts, node, doc,
5992		i = 0,
5993		l = collection.length,
5994		iNoClone = l - 1,
5995		value = args[ 0 ],
5996		isFunction = jQuery.isFunction( value );
5997
5998	// We can't cloneNode fragments that contain checked, in WebKit
5999	if ( isFunction ||
6000			( l > 1 && typeof value === "string" &&
6001				!support.checkClone && rchecked.test( value ) ) ) {
6002		return collection.each( function( index ) {
6003			var self = collection.eq( index );
6004			if ( isFunction ) {
6005				args[ 0 ] = value.call( this, index, self.html() );
6006			}
6007			domManip( self, args, callback, ignored );
6008		} );
6009	}
6010
6011	if ( l ) {
6012		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
6013		first = fragment.firstChild;
6014
6015		if ( fragment.childNodes.length === 1 ) {
6016			fragment = first;
6017		}
6018
6019		// Require either new content or an interest in ignored elements to invoke the callback
6020		if ( first || ignored ) {
6021			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6022			hasScripts = scripts.length;
6023
6024			// Use the original fragment for the last item
6025			// instead of the first because it can end up
6026			// being emptied incorrectly in certain situations (#8070).
6027			for ( ; i < l; i++ ) {
6028				node = fragment;
6029
6030				if ( i !== iNoClone ) {
6031					node = jQuery.clone( node, true, true );
6032
6033					// Keep references to cloned scripts for later restoration
6034					if ( hasScripts ) {
6035
6036						// Support: Android <=4.0 only, PhantomJS 1 only
6037						// push.apply(_, arraylike) throws on ancient WebKit
6038						jQuery.merge( scripts, getAll( node, "script" ) );
6039					}
6040				}
6041
6042				callback.call( collection[ i ], node, i );
6043			}
6044
6045			if ( hasScripts ) {
6046				doc = scripts[ scripts.length - 1 ].ownerDocument;
6047
6048				// Reenable scripts
6049				jQuery.map( scripts, restoreScript );
6050
6051				// Evaluate executable scripts on first document insertion
6052				for ( i = 0; i < hasScripts; i++ ) {
6053					node = scripts[ i ];
6054					if ( rscriptType.test( node.type || "" ) &&
6055						!dataPriv.access( node, "globalEval" ) &&
6056						jQuery.contains( doc, node ) ) {
6057
6058						if ( node.src ) {
6059
6060							// Optional AJAX dependency, but won't run scripts if not present
6061							if ( jQuery._evalUrl ) {
6062								jQuery._evalUrl( node.src );
6063							}
6064						} else {
6065							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
6066						}
6067					}
6068				}
6069			}
6070		}
6071	}
6072
6073	return collection;
6074}
6075
6076function remove( elem, selector, keepData ) {
6077	var node,
6078		nodes = selector ? jQuery.filter( selector, elem ) : elem,
6079		i = 0;
6080
6081	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
6082		if ( !keepData && node.nodeType === 1 ) {
6083			jQuery.cleanData( getAll( node ) );
6084		}
6085
6086		if ( node.parentNode ) {
6087			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
6088				setGlobalEval( getAll( node, "script" ) );
6089			}
6090			node.parentNode.removeChild( node );
6091		}
6092	}
6093
6094	return elem;
6095}
6096
6097jQuery.extend( {
6098	htmlPrefilter: function( html ) {
6099		return html.replace( rxhtmlTag, "<$1></$2>" );
6100	},
6101
6102	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6103		var i, l, srcElements, destElements,
6104			clone = elem.cloneNode( true ),
6105			inPage = jQuery.contains( elem.ownerDocument, elem );
6106
6107		// Fix IE cloning issues
6108		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6109				!jQuery.isXMLDoc( elem ) ) {
6110
6111			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
6112			destElements = getAll( clone );
6113			srcElements = getAll( elem );
6114
6115			for ( i = 0, l = srcElements.length; i < l; i++ ) {
6116				fixInput( srcElements[ i ], destElements[ i ] );
6117			}
6118		}
6119
6120		// Copy the events from the original to the clone
6121		if ( dataAndEvents ) {
6122			if ( deepDataAndEvents ) {
6123				srcElements = srcElements || getAll( elem );
6124				destElements = destElements || getAll( clone );
6125
6126				for ( i = 0, l = srcElements.length; i < l; i++ ) {
6127					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6128				}
6129			} else {
6130				cloneCopyEvent( elem, clone );
6131			}
6132		}
6133
6134		// Preserve script evaluation history
6135		destElements = getAll( clone, "script" );
6136		if ( destElements.length > 0 ) {
6137			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6138		}
6139
6140		// Return the cloned set
6141		return clone;
6142	},
6143
6144	cleanData: function( elems ) {
6145		var data, elem, type,
6146			special = jQuery.event.special,
6147			i = 0;
6148
6149		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6150			if ( acceptData( elem ) ) {
6151				if ( ( data = elem[ dataPriv.expando ] ) ) {
6152					if ( data.events ) {
6153						for ( type in data.events ) {
6154							if ( special[ type ] ) {
6155								jQuery.event.remove( elem, type );
6156
6157							// This is a shortcut to avoid jQuery.event.remove's overhead
6158							} else {
6159								jQuery.removeEvent( elem, type, data.handle );
6160							}
6161						}
6162					}
6163
vendor: 1,119 bytes, lines 6164-6208
6164					// Support: Chrome <=35 - 45+
6165					// Assign undefined instead of using delete, see Data#remove
6166					elem[ dataPriv.expando ] = undefined;
6167				}
6168				if ( elem[ dataUser.expando ] ) {
6169
6170					// Support: Chrome <=35 - 45+
6171					// Assign undefined instead of using delete, see Data#remove
6172					elem[ dataUser.expando ] = undefined;
6173				}
6174			}
6175		}
6176	}
6177} );
6178
6179jQuery.fn.extend( {
6180	detach: function( selector ) {
6181		return remove( this, selector, true );
6182	},
6183
6184	remove: function( selector ) {
6185		return remove( this, selector );
6186	},
6187
6188	text: function( value ) {
6189		return access( this, function( value ) {
6190			return value === undefined ?
6191				jQuery.text( this ) :
6192				this.empty().each( function() {
6193					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6194						this.textContent = value;
6195					}
6196				} );
6197		}, null, value, arguments.length );
6198	},
6199
6200	append: function() {
6201		return domManip( this, arguments, function( elem ) {
6202			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6203				var target = manipulationTarget( this, elem );
6204				target.appendChild( elem );
6205			}
6206		} );
6207	},
6208
vendor: 6,076 bytes, lines 6209-6444
6209	prepend: function() {
6210		return domManip( this, arguments, function( elem ) {
6211			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6212				var target = manipulationTarget( this, elem );
6213				target.insertBefore( elem, target.firstChild );
6214			}
6215		} );
6216	},
6217
6218	before: function() {
6219		return domManip( this, arguments, function( elem ) {
6220			if ( this.parentNode ) {
6221				this.parentNode.insertBefore( elem, this );
6222			}
6223		} );
6224	},
6225
6226	after: function() {
6227		return domManip( this, arguments, function( elem ) {
6228			if ( this.parentNode ) {
6229				this.parentNode.insertBefore( elem, this.nextSibling );
6230			}
6231		} );
6232	},
6233
6234	empty: function() {
6235		var elem,
6236			i = 0;
6237
6238		for ( ; ( elem = this[ i ] ) != null; i++ ) {
6239			if ( elem.nodeType === 1 ) {
6240
6241				// Prevent memory leaks
6242				jQuery.cleanData( getAll( elem, false ) );
6243
6244				// Remove any remaining nodes
6245				elem.textContent = "";
6246			}
6247		}
6248
6249		return this;
6250	},
6251
6252	clone: function( dataAndEvents, deepDataAndEvents ) {
6253		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6254		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6255
6256		return this.map( function() {
6257			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6258		} );
6259	},
6260
6261	html: function( value ) {
6262		return access( this, function( value ) {
6263			var elem = this[ 0 ] || {},
6264				i = 0,
6265				l = this.length;
6266
6267			if ( value === undefined && elem.nodeType === 1 ) {
6268				return elem.innerHTML;
6269			}
6270
6271			// See if we can take a shortcut and just use innerHTML
6272			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6273				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6274
6275				value = jQuery.htmlPrefilter( value );
6276
6277				try {
6278					for ( ; i < l; i++ ) {
6279						elem = this[ i ] || {};
6280
6281						// Remove element nodes and prevent memory leaks
6282						if ( elem.nodeType === 1 ) {
6283							jQuery.cleanData( getAll( elem, false ) );
6284							elem.innerHTML = value;
6285						}
6286					}
6287
6288					elem = 0;
6289
6290				// If using innerHTML throws an exception, use the fallback method
6291				} catch ( e ) {}
6292			}
6293
6294			if ( elem ) {
6295				this.empty().append( value );
6296			}
6297		}, null, value, arguments.length );
6298	},
6299
6300	replaceWith: function() {
6301		var ignored = [];
6302
6303		// Make the changes, replacing each non-ignored context element with the new content
6304		return domManip( this, arguments, function( elem ) {
6305			var parent = this.parentNode;
6306
6307			if ( jQuery.inArray( this, ignored ) < 0 ) {
6308				jQuery.cleanData( getAll( this ) );
6309				if ( parent ) {
6310					parent.replaceChild( elem, this );
6311				}
6312			}
6313
6314		// Force callback invocation
6315		}, ignored );
6316	}
6317} );
6318
6319jQuery.each( {
6320	appendTo: "append",
6321	prependTo: "prepend",
6322	insertBefore: "before",
6323	insertAfter: "after",
6324	replaceAll: "replaceWith"
6325}, function( name, original ) {
6326	jQuery.fn[ name ] = function( selector ) {
6327		var elems,
6328			ret = [],
6329			insert = jQuery( selector ),
6330			last = insert.length - 1,
6331			i = 0;
6332
6333		for ( ; i <= last; i++ ) {
6334			elems = i === last ? this : this.clone( true );
6335			jQuery( insert[ i ] )[ original ]( elems );
6336
6337			// Support: Android <=4.0 only, PhantomJS 1 only
6338			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6339			push.apply( ret, elems.get() );
6340		}
6341
6342		return this.pushStack( ret );
6343	};
6344} );
6345var rmargin = ( /^margin/ );
6346
6347var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6348
6349var getStyles = function( elem ) {
6350
6351		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6352		// IE throws on elements created in popups
6353		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6354		var view = elem.ownerDocument.defaultView;
6355
6356		if ( !view || !view.opener ) {
6357			view = window;
6358		}
6359
6360		return view.getComputedStyle( elem );
6361	};
6362
6363
6364
6365( function() {
6366
6367	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6368	// so they're executed at the same time to save the second computation.
6369	function computeStyleTests() {
6370
6371		// This is a singleton, we need to execute it only once
6372		if ( !div ) {
6373			return;
6374		}
6375
6376		div.style.cssText =
6377			"box-sizing:border-box;" +
6378			"position:relative;display:block;" +
6379			"margin:auto;border:1px;padding:1px;" +
6380			"top:1%;width:50%";
6381		div.innerHTML = "";
6382		documentElement.appendChild( container );
6383
6384		var divStyle = window.getComputedStyle( div );
6385		pixelPositionVal = divStyle.top !== "1%";
6386
6387		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6388		reliableMarginLeftVal = divStyle.marginLeft === "2px";
6389		boxSizingReliableVal = divStyle.width === "4px";
6390
6391		// Support: Android 4.0 - 4.3 only
6392		// Some styles come back with percentage values, even though they shouldn't
6393		div.style.marginRight = "50%";
6394		pixelMarginRightVal = divStyle.marginRight === "4px";
6395
6396		documentElement.removeChild( container );
6397
6398		// Nullify the div so it wouldn't be stored in the memory and
6399		// it will also be a sign that checks already performed
6400		div = null;
6401	}
6402
6403	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
6404		container = document.createElement( "div" ),
6405		div = document.createElement( "div" );
6406
6407	// Finish early in limited (non-browser) environments
6408	if ( !div.style ) {
6409		return;
6410	}
6411
6412	// Support: IE <=9 - 11 only
6413	// Style of cloned element affects source element cloned (#8908)
6414	div.style.backgroundClip = "content-box";
6415	div.cloneNode( true ).style.backgroundClip = "";
6416	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6417
6418	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
6419		"padding:0;margin-top:1px;position:absolute";
6420	container.appendChild( div );
6421
6422	jQuery.extend( support, {
6423		pixelPosition: function() {
6424			computeStyleTests();
6425			return pixelPositionVal;
6426		},
6427		boxSizingReliable: function() {
6428			computeStyleTests();
6429			return boxSizingReliableVal;
6430		},
6431		pixelMarginRight: function() {
6432			computeStyleTests();
6433			return pixelMarginRightVal;
6434		},
6435		reliableMarginLeft: function() {
6436			computeStyleTests();
6437			return reliableMarginLeftVal;
6438		}
6439	} );
6440} )();
6441
6442
6443function curCSS( elem, name, computed ) {
6444	var width, minWidth, maxWidth, ret,
vendor: 8,366 bytes, lines 6445-6750
6445
6446		// Support: Firefox 51+
6447		// Retrieving style before computed somehow
6448		// fixes an issue with getting wrong values
6449		// on detached elements
6450		style = elem.style;
6451
6452	computed = computed || getStyles( elem );
6453
6454	// getPropertyValue is needed for:
6455	//   .css('filter') (IE 9 only, #12537)
6456	//   .css('--customProperty) (#3144)
6457	if ( computed ) {
6458		ret = computed.getPropertyValue( name ) || computed[ name ];
6459
6460		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6461			ret = jQuery.style( elem, name );
6462		}
6463
6464		// A tribute to the "awesome hack by Dean Edwards"
6465		// Android Browser returns percentage for some values,
6466		// but width seems to be reliably pixels.
6467		// This is against the CSSOM draft spec:
6468		// https://drafts.csswg.org/cssom/#resolved-values
6469		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6470
6471			// Remember the original values
6472			width = style.width;
6473			minWidth = style.minWidth;
6474			maxWidth = style.maxWidth;
6475
6476			// Put in the new values to get a computed value out
6477			style.minWidth = style.maxWidth = style.width = ret;
6478			ret = computed.width;
6479
6480			// Revert the changed values
6481			style.width = width;
6482			style.minWidth = minWidth;
6483			style.maxWidth = maxWidth;
6484		}
6485	}
6486
6487	return ret !== undefined ?
6488
6489		// Support: IE <=9 - 11 only
6490		// IE returns zIndex value as an integer.
6491		ret + "" :
6492		ret;
6493}
6494
6495
6496function addGetHookIf( conditionFn, hookFn ) {
6497
6498	// Define the hook, we'll check on the first run if it's really needed.
6499	return {
6500		get: function() {
6501			if ( conditionFn() ) {
6502
6503				// Hook not needed (or it's not possible to use it due
6504				// to missing dependency), remove it.
6505				delete this.get;
6506				return;
6507			}
6508
6509			// Hook needed; redefine it so that the support test is not executed again.
6510			return ( this.get = hookFn ).apply( this, arguments );
6511		}
6512	};
6513}
6514
6515
6516var
6517
6518	// Swappable if display is none or starts with table
6519	// except "table", "table-cell", or "table-caption"
6520	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6521	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6522	rcustomProp = /^--/,
6523	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6524	cssNormalTransform = {
6525		letterSpacing: "0",
6526		fontWeight: "400"
6527	},
6528
6529	cssPrefixes = [ "Webkit", "Moz", "ms" ],
6530	emptyStyle = document.createElement( "div" ).style;
6531
6532// Return a css property mapped to a potentially vendor prefixed property
6533function vendorPropName( name ) {
6534
6535	// Shortcut for names that are not vendor prefixed
6536	if ( name in emptyStyle ) {
6537		return name;
6538	}
6539
6540	// Check for vendor prefixed names
6541	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6542		i = cssPrefixes.length;
6543
6544	while ( i-- ) {
6545		name = cssPrefixes[ i ] + capName;
6546		if ( name in emptyStyle ) {
6547			return name;
6548		}
6549	}
6550}
6551
6552// Return a property mapped along what jQuery.cssProps suggests or to
6553// a vendor prefixed property.
6554function finalPropName( name ) {
6555	var ret = jQuery.cssProps[ name ];
6556	if ( !ret ) {
6557		ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6558	}
6559	return ret;
6560}
6561
6562function setPositiveNumber( elem, value, subtract ) {
6563
6564	// Any relative (+/-) values have already been
6565	// normalized at this point
6566	var matches = rcssNum.exec( value );
6567	return matches ?
6568
6569		// Guard against undefined "subtract", e.g., when used as in cssHooks
6570		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6571		value;
6572}
6573
6574function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6575	var i,
6576		val = 0;
6577
6578	// If we already have the right measurement, avoid augmentation
6579	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
6580		i = 4;
6581
6582	// Otherwise initialize for horizontal or vertical properties
6583	} else {
6584		i = name === "width" ? 1 : 0;
6585	}
6586
6587	for ( ; i < 4; i += 2 ) {
6588
6589		// Both box models exclude margin, so add it if we want it
6590		if ( extra === "margin" ) {
6591			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6592		}
6593
6594		if ( isBorderBox ) {
6595
6596			// border-box includes padding, so remove it if we want content
6597			if ( extra === "content" ) {
6598				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6599			}
6600
6601			// At this point, extra isn't border nor margin, so remove border
6602			if ( extra !== "margin" ) {
6603				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6604			}
6605		} else {
6606
6607			// At this point, extra isn't content, so add padding
6608			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6609
6610			// At this point, extra isn't content nor padding, so add border
6611			if ( extra !== "padding" ) {
6612				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6613			}
6614		}
6615	}
6616
6617	return val;
6618}
6619
6620function getWidthOrHeight( elem, name, extra ) {
6621
6622	// Start with computed style
6623	var valueIsBorderBox,
6624		styles = getStyles( elem ),
6625		val = curCSS( elem, name, styles ),
6626		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6627
6628	// Computed unit is not pixels. Stop here and return.
6629	if ( rnumnonpx.test( val ) ) {
6630		return val;
6631	}
6632
6633	// Check for style in case a browser which returns unreliable values
6634	// for getComputedStyle silently falls back to the reliable elem.style
6635	valueIsBorderBox = isBorderBox &&
6636		( support.boxSizingReliable() || val === elem.style[ name ] );
6637
6638	// Fall back to offsetWidth/Height when value is "auto"
6639	// This happens for inline elements with no explicit setting (gh-3571)
6640	if ( val === "auto" ) {
6641		val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
6642	}
6643
6644	// Normalize "", auto, and prepare for extra
6645	val = parseFloat( val ) || 0;
6646
6647	// Use the active box-sizing model to add/subtract irrelevant styles
6648	return ( val +
6649		augmentWidthOrHeight(
6650			elem,
6651			name,
6652			extra || ( isBorderBox ? "border" : "content" ),
6653			valueIsBorderBox,
6654			styles
6655		)
6656	) + "px";
6657}
6658
6659jQuery.extend( {
6660
6661	// Add in style property hooks for overriding the default
6662	// behavior of getting and setting a style property
6663	cssHooks: {
6664		opacity: {
6665			get: function( elem, computed ) {
6666				if ( computed ) {
6667
6668					// We should always get a number back from opacity
6669					var ret = curCSS( elem, "opacity" );
6670					return ret === "" ? "1" : ret;
6671				}
6672			}
6673		}
6674	},
6675
6676	// Don't automatically add "px" to these possibly-unitless properties
6677	cssNumber: {
6678		"animationIterationCount": true,
6679		"columnCount": true,
6680		"fillOpacity": true,
6681		"flexGrow": true,
6682		"flexShrink": true,
6683		"fontWeight": true,
6684		"lineHeight": true,
6685		"opacity": true,
6686		"order": true,
6687		"orphans": true,
6688		"widows": true,
6689		"zIndex": true,
6690		"zoom": true
6691	},
6692
6693	// Add in properties whose names you wish to fix before
6694	// setting or getting the value
6695	cssProps: {
6696		"float": "cssFloat"
6697	},
6698
6699	// Get and set the style property on a DOM Node
6700	style: function( elem, name, value, extra ) {
6701
6702		// Don't set styles on text and comment nodes
6703		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6704			return;
6705		}
6706
6707		// Make sure that we're working with the right name
6708		var ret, type, hooks,
6709			origName = jQuery.camelCase( name ),
6710			isCustomProp = rcustomProp.test( name ),
6711			style = elem.style;
6712
6713		// Make sure that we're working with the right name. We don't
6714		// want to query the value if it is a CSS custom property
6715		// since they are user-defined.
6716		if ( !isCustomProp ) {
6717			name = finalPropName( origName );
6718		}
6719
6720		// Gets hook for the prefixed version, then unprefixed version
6721		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6722
6723		// Check if we're setting a value
6724		if ( value !== undefined ) {
6725			type = typeof value;
6726
6727			// Convert "+=" or "-=" to relative numbers (#7345)
6728			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6729				value = adjustCSS( elem, name, ret );
6730
6731				// Fixes bug #9237
6732				type = "number";
6733			}
6734
6735			// Make sure that null and NaN values aren't set (#7116)
6736			if ( value == null || value !== value ) {
6737				return;
6738			}
6739
6740			// If a number was passed in, add the unit (except for certain CSS properties)
6741			if ( type === "number" ) {
6742				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6743			}
6744
6745			// background-* props affect original clone's values
6746			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6747				style[ name ] = "inherit";
6748			}
6749
6750			// If a hook was provided, use that value, otherwise just set the specified value
vendor: 4,779 bytes, lines 6751-6933
6751			if ( !hooks || !( "set" in hooks ) ||
6752				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6753
6754				if ( isCustomProp ) {
6755					style.setProperty( name, value );
6756				} else {
6757					style[ name ] = value;
6758				}
6759			}
6760
6761		} else {
6762
6763			// If a hook was provided get the non-computed value from there
6764			if ( hooks && "get" in hooks &&
6765				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6766
6767				return ret;
6768			}
6769
6770			// Otherwise just get the value from the style object
6771			return style[ name ];
6772		}
6773	},
6774
6775	css: function( elem, name, extra, styles ) {
6776		var val, num, hooks,
6777			origName = jQuery.camelCase( name ),
6778			isCustomProp = rcustomProp.test( name );
6779
6780		// Make sure that we're working with the right name. We don't
6781		// want to modify the value if it is a CSS custom property
6782		// since they are user-defined.
6783		if ( !isCustomProp ) {
6784			name = finalPropName( origName );
6785		}
6786
6787		// Try prefixed name followed by the unprefixed name
6788		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6789
6790		// If a hook was provided get the computed value from there
6791		if ( hooks && "get" in hooks ) {
6792			val = hooks.get( elem, true, extra );
6793		}
6794
6795		// Otherwise, if a way to get the computed value exists, use that
6796		if ( val === undefined ) {
6797			val = curCSS( elem, name, styles );
6798		}
6799
6800		// Convert "normal" to computed value
6801		if ( val === "normal" && name in cssNormalTransform ) {
6802			val = cssNormalTransform[ name ];
6803		}
6804
6805		// Make numeric if forced or a qualifier was provided and val looks numeric
6806		if ( extra === "" || extra ) {
6807			num = parseFloat( val );
6808			return extra === true || isFinite( num ) ? num || 0 : val;
6809		}
6810
6811		return val;
6812	}
6813} );
6814
6815jQuery.each( [ "height", "width" ], function( i, name ) {
6816	jQuery.cssHooks[ name ] = {
6817		get: function( elem, computed, extra ) {
6818			if ( computed ) {
6819
6820				// Certain elements can have dimension info if we invisibly show them
6821				// but it must have a current display style that would benefit
6822				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6823
6824					// Support: Safari 8+
6825					// Table columns in Safari have non-zero offsetWidth & zero
6826					// getBoundingClientRect().width unless display is changed.
6827					// Support: IE <=11 only
6828					// Running getBoundingClientRect on a disconnected node
6829					// in IE throws an error.
6830					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6831						swap( elem, cssShow, function() {
6832							return getWidthOrHeight( elem, name, extra );
6833						} ) :
6834						getWidthOrHeight( elem, name, extra );
6835			}
6836		},
6837
6838		set: function( elem, value, extra ) {
6839			var matches,
6840				styles = extra && getStyles( elem ),
6841				subtract = extra && augmentWidthOrHeight(
6842					elem,
6843					name,
6844					extra,
6845					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6846					styles
6847				);
6848
6849			// Convert to pixels if value adjustment is needed
6850			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6851				( matches[ 3 ] || "px" ) !== "px" ) {
6852
6853				elem.style[ name ] = value;
6854				value = jQuery.css( elem, name );
6855			}
6856
6857			return setPositiveNumber( elem, value, subtract );
6858		}
6859	};
6860} );
6861
6862jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6863	function( elem, computed ) {
6864		if ( computed ) {
6865			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6866				elem.getBoundingClientRect().left -
6867					swap( elem, { marginLeft: 0 }, function() {
6868						return elem.getBoundingClientRect().left;
6869					} )
6870				) + "px";
6871		}
6872	}
6873);
6874
6875// These hooks are used by animate to expand properties
6876jQuery.each( {
6877	margin: "",
6878	padding: "",
6879	border: "Width"
6880}, function( prefix, suffix ) {
6881	jQuery.cssHooks[ prefix + suffix ] = {
6882		expand: function( value ) {
6883			var i = 0,
6884				expanded = {},
6885
6886				// Assumes a single number if not a string
6887				parts = typeof value === "string" ? value.split( " " ) : [ value ];
6888
6889			for ( ; i < 4; i++ ) {
6890				expanded[ prefix + cssExpand[ i ] + suffix ] =
6891					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6892			}
6893
6894			return expanded;
6895		}
6896	};
6897
6898	if ( !rmargin.test( prefix ) ) {
6899		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6900	}
6901} );
6902
6903jQuery.fn.extend( {
6904	css: function( name, value ) {
6905		return access( this, function( elem, name, value ) {
6906			var styles, len,
6907				map = {},
6908				i = 0;
6909
6910			if ( Array.isArray( name ) ) {
6911				styles = getStyles( elem );
6912				len = name.length;
6913
6914				for ( ; i < len; i++ ) {
6915					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6916				}
6917
6918				return map;
6919			}
6920
6921			return value !== undefined ?
6922				jQuery.style( elem, name, value ) :
6923				jQuery.css( elem, name );
6924		}, name, value, arguments.length > 1 );
6925	}
6926} );
6927
6928
6929function Tween( elem, options, prop, end, easing ) {
6930	return new Tween.prototype.init( elem, options, prop, end, easing );
6931}
6932jQuery.Tween = Tween;
6933
vendor: 6,216 bytes, lines 6934-7172
6934Tween.prototype = {
6935	constructor: Tween,
6936	init: function( elem, options, prop, end, easing, unit ) {
6937		this.elem = elem;
6938		this.prop = prop;
6939		this.easing = easing || jQuery.easing._default;
6940		this.options = options;
6941		this.start = this.now = this.cur();
6942		this.end = end;
6943		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6944	},
6945	cur: function() {
6946		var hooks = Tween.propHooks[ this.prop ];
6947
6948		return hooks && hooks.get ?
6949			hooks.get( this ) :
6950			Tween.propHooks._default.get( this );
6951	},
6952	run: function( percent ) {
6953		var eased,
6954			hooks = Tween.propHooks[ this.prop ];
6955
6956		if ( this.options.duration ) {
6957			this.pos = eased = jQuery.easing[ this.easing ](
6958				percent, this.options.duration * percent, 0, 1, this.options.duration
6959			);
6960		} else {
6961			this.pos = eased = percent;
6962		}
6963		this.now = ( this.end - this.start ) * eased + this.start;
6964
6965		if ( this.options.step ) {
6966			this.options.step.call( this.elem, this.now, this );
6967		}
6968
6969		if ( hooks && hooks.set ) {
6970			hooks.set( this );
6971		} else {
6972			Tween.propHooks._default.set( this );
6973		}
6974		return this;
6975	}
6976};
6977
6978Tween.prototype.init.prototype = Tween.prototype;
6979
6980Tween.propHooks = {
6981	_default: {
6982		get: function( tween ) {
6983			var result;
6984
6985			// Use a property on the element directly when it is not a DOM element,
6986			// or when there is no matching style property that exists.
6987			if ( tween.elem.nodeType !== 1 ||
6988				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
6989				return tween.elem[ tween.prop ];
6990			}
6991
6992			// Passing an empty string as a 3rd parameter to .css will automatically
6993			// attempt a parseFloat and fallback to a string if the parse fails.
6994			// Simple values such as "10px" are parsed to Float;
6995			// complex values such as "rotate(1rad)" are returned as-is.
6996			result = jQuery.css( tween.elem, tween.prop, "" );
6997
6998			// Empty strings, null, undefined and "auto" are converted to 0.
6999			return !result || result === "auto" ? 0 : result;
7000		},
7001		set: function( tween ) {
7002
7003			// Use step hook for back compat.
7004			// Use cssHook if its there.
7005			// Use .style if available and use plain properties where available.
7006			if ( jQuery.fx.step[ tween.prop ] ) {
7007				jQuery.fx.step[ tween.prop ]( tween );
7008			} else if ( tween.elem.nodeType === 1 &&
7009				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
7010					jQuery.cssHooks[ tween.prop ] ) ) {
7011				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7012			} else {
7013				tween.elem[ tween.prop ] = tween.now;
7014			}
7015		}
7016	}
7017};
7018
7019// Support: IE <=9 only
7020// Panic based approach to setting things on disconnected nodes
7021Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7022	set: function( tween ) {
7023		if ( tween.elem.nodeType && tween.elem.parentNode ) {
7024			tween.elem[ tween.prop ] = tween.now;
7025		}
7026	}
7027};
7028
7029jQuery.easing = {
7030	linear: function( p ) {
7031		return p;
7032	},
7033	swing: function( p ) {
7034		return 0.5 - Math.cos( p * Math.PI ) / 2;
7035	},
7036	_default: "swing"
7037};
7038
7039jQuery.fx = Tween.prototype.init;
7040
7041// Back compat <1.8 extension point
7042jQuery.fx.step = {};
7043
7044
7045
7046
7047var
7048	fxNow, inProgress,
7049	rfxtypes = /^(?:toggle|show|hide)$/,
7050	rrun = /queueHooks$/;
7051
7052function schedule() {
7053	if ( inProgress ) {
7054		if ( document.hidden === false && window.requestAnimationFrame ) {
7055			window.requestAnimationFrame( schedule );
7056		} else {
7057			window.setTimeout( schedule, jQuery.fx.interval );
7058		}
7059
7060		jQuery.fx.tick();
7061	}
7062}
7063
7064// Animations created synchronously will run synchronously
7065function createFxNow() {
7066	window.setTimeout( function() {
7067		fxNow = undefined;
7068	} );
7069	return ( fxNow = jQuery.now() );
7070}
7071
7072// Generate parameters to create a standard animation
7073function genFx( type, includeWidth ) {
7074	var which,
7075		i = 0,
7076		attrs = { height: type };
7077
7078	// If we include width, step value is 1 to do all cssExpand values,
7079	// otherwise step value is 2 to skip over Left and Right
7080	includeWidth = includeWidth ? 1 : 0;
7081	for ( ; i < 4; i += 2 - includeWidth ) {
7082		which = cssExpand[ i ];
7083		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7084	}
7085
7086	if ( includeWidth ) {
7087		attrs.opacity = attrs.width = type;
7088	}
7089
7090	return attrs;
7091}
7092
7093function createTween( value, prop, animation ) {
7094	var tween,
7095		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7096		index = 0,
7097		length = collection.length;
7098	for ( ; index < length; index++ ) {
7099		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7100
7101			// We're done with this property
7102			return tween;
7103		}
7104	}
7105}
7106
7107function defaultPrefilter( elem, props, opts ) {
7108	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7109		isBox = "width" in props || "height" in props,
7110		anim = this,
7111		orig = {},
7112		style = elem.style,
7113		hidden = elem.nodeType && isHiddenWithinTree( elem ),
7114		dataShow = dataPriv.get( elem, "fxshow" );
7115
7116	// Queue-skipping animations hijack the fx hooks
7117	if ( !opts.queue ) {
7118		hooks = jQuery._queueHooks( elem, "fx" );
7119		if ( hooks.unqueued == null ) {
7120			hooks.unqueued = 0;
7121			oldfire = hooks.empty.fire;
7122			hooks.empty.fire = function() {
7123				if ( !hooks.unqueued ) {
7124					oldfire();
7125				}
7126			};
7127		}
7128		hooks.unqueued++;
7129
7130		anim.always( function() {
7131
7132			// Ensure the complete handler is called before this completes
7133			anim.always( function() {
7134				hooks.unqueued--;
7135				if ( !jQuery.queue( elem, "fx" ).length ) {
7136					hooks.empty.fire();
7137				}
7138			} );
7139		} );
7140	}
7141
7142	// Detect show/hide animations
7143	for ( prop in props ) {
7144		value = props[ prop ];
7145		if ( rfxtypes.test( value ) ) {
7146			delete props[ prop ];
7147			toggle = toggle || value === "toggle";
7148			if ( value === ( hidden ? "hide" : "show" ) ) {
7149
7150				// Pretend to be hidden if this is a "show" and
7151				// there is still data from a stopped show/hide
7152				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7153					hidden = true;
7154
7155				// Ignore all other no-op show/hide data
7156				} else {
7157					continue;
7158				}
7159			}
7160			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7161		}
7162	}
7163
7164	// Bail out if this is a no-op like .hide().hide()
7165	propTween = !jQuery.isEmptyObject( props );
7166	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7167		return;
7168	}
7169
7170	// Restrict "overflow" and "display" styles during box animations
7171	if ( isBox && elem.nodeType === 1 ) {
7172
vendor: 4,173 bytes, lines 7173-7331
7173		// Support: IE <=9 - 11, Edge 12 - 13
7174		// Record all 3 overflow attributes because IE does not infer the shorthand
7175		// from identically-valued overflowX and overflowY
7176		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7177
7178		// Identify a display type, preferring old show/hide data over the CSS cascade
7179		restoreDisplay = dataShow && dataShow.display;
7180		if ( restoreDisplay == null ) {
7181			restoreDisplay = dataPriv.get( elem, "display" );
7182		}
7183		display = jQuery.css( elem, "display" );
7184		if ( display === "none" ) {
7185			if ( restoreDisplay ) {
7186				display = restoreDisplay;
7187			} else {
7188
7189				// Get nonempty value(s) by temporarily forcing visibility
7190				showHide( [ elem ], true );
7191				restoreDisplay = elem.style.display || restoreDisplay;
7192				display = jQuery.css( elem, "display" );
7193				showHide( [ elem ] );
7194			}
7195		}
7196
7197		// Animate inline elements as inline-block
7198		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7199			if ( jQuery.css( elem, "float" ) === "none" ) {
7200
7201				// Restore the original display value at the end of pure show/hide animations
7202				if ( !propTween ) {
7203					anim.done( function() {
7204						style.display = restoreDisplay;
7205					} );
7206					if ( restoreDisplay == null ) {
7207						display = style.display;
7208						restoreDisplay = display === "none" ? "" : display;
7209					}
7210				}
7211				style.display = "inline-block";
7212			}
7213		}
7214	}
7215
7216	if ( opts.overflow ) {
7217		style.overflow = "hidden";
7218		anim.always( function() {
7219			style.overflow = opts.overflow[ 0 ];
7220			style.overflowX = opts.overflow[ 1 ];
7221			style.overflowY = opts.overflow[ 2 ];
7222		} );
7223	}
7224
7225	// Implement show/hide animations
7226	propTween = false;
7227	for ( prop in orig ) {
7228
7229		// General show/hide setup for this element animation
7230		if ( !propTween ) {
7231			if ( dataShow ) {
7232				if ( "hidden" in dataShow ) {
7233					hidden = dataShow.hidden;
7234				}
7235			} else {
7236				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7237			}
7238
7239			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7240			if ( toggle ) {
7241				dataShow.hidden = !hidden;
7242			}
7243
7244			// Show elements before animating them
7245			if ( hidden ) {
7246				showHide( [ elem ], true );
7247			}
7248
7249			/* eslint-disable no-loop-func */
7250
7251			anim.done( function() {
7252
7253			/* eslint-enable no-loop-func */
7254
7255				// The final step of a "hide" animation is actually hiding the element
7256				if ( !hidden ) {
7257					showHide( [ elem ] );
7258				}
7259				dataPriv.remove( elem, "fxshow" );
7260				for ( prop in orig ) {
7261					jQuery.style( elem, prop, orig[ prop ] );
7262				}
7263			} );
7264		}
7265
7266		// Per-property setup
7267		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7268		if ( !( prop in dataShow ) ) {
7269			dataShow[ prop ] = propTween.start;
7270			if ( hidden ) {
7271				propTween.end = propTween.start;
7272				propTween.start = 0;
7273			}
7274		}
7275	}
7276}
7277
7278function propFilter( props, specialEasing ) {
7279	var index, name, easing, value, hooks;
7280
7281	// camelCase, specialEasing and expand cssHook pass
7282	for ( index in props ) {
7283		name = jQuery.camelCase( index );
7284		easing = specialEasing[ name ];
7285		value = props[ index ];
7286		if ( Array.isArray( value ) ) {
7287			easing = value[ 1 ];
7288			value = props[ index ] = value[ 0 ];
7289		}
7290
7291		if ( index !== name ) {
7292			props[ name ] = value;
7293			delete props[ index ];
7294		}
7295
7296		hooks = jQuery.cssHooks[ name ];
7297		if ( hooks && "expand" in hooks ) {
7298			value = hooks.expand( value );
7299			delete props[ name ];
7300
7301			// Not quite $.extend, this won't overwrite existing keys.
7302			// Reusing 'index' because we have the correct "name"
7303			for ( index in value ) {
7304				if ( !( index in props ) ) {
7305					props[ index ] = value[ index ];
7306					specialEasing[ index ] = easing;
7307				}
7308			}
7309		} else {
7310			specialEasing[ name ] = easing;
7311		}
7312	}
7313}
7314
7315function Animation( elem, properties, options ) {
7316	var result,
7317		stopped,
7318		index = 0,
7319		length = Animation.prefilters.length,
7320		deferred = jQuery.Deferred().always( function() {
7321
7322			// Don't match elem in the :animated selector
7323			delete tick.elem;
7324		} ),
7325		tick = function() {
7326			if ( stopped ) {
7327				return false;
7328			}
7329			var currentTime = fxNow || createFxNow(),
7330				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7331
vendor: 6,686 bytes, lines 7332-7591
7332				// Support: Android 2.3 only
7333				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7334				temp = remaining / animation.duration || 0,
7335				percent = 1 - temp,
7336				index = 0,
7337				length = animation.tweens.length;
7338
7339			for ( ; index < length; index++ ) {
7340				animation.tweens[ index ].run( percent );
7341			}
7342
7343			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7344
7345			// If there's more to do, yield
7346			if ( percent < 1 && length ) {
7347				return remaining;
7348			}
7349
7350			// If this was an empty animation, synthesize a final progress notification
7351			if ( !length ) {
7352				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7353			}
7354
7355			// Resolve the animation and report its conclusion
7356			deferred.resolveWith( elem, [ animation ] );
7357			return false;
7358		},
7359		animation = deferred.promise( {
7360			elem: elem,
7361			props: jQuery.extend( {}, properties ),
7362			opts: jQuery.extend( true, {
7363				specialEasing: {},
7364				easing: jQuery.easing._default
7365			}, options ),
7366			originalProperties: properties,
7367			originalOptions: options,
7368			startTime: fxNow || createFxNow(),
7369			duration: options.duration,
7370			tweens: [],
7371			createTween: function( prop, end ) {
7372				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7373						animation.opts.specialEasing[ prop ] || animation.opts.easing );
7374				animation.tweens.push( tween );
7375				return tween;
7376			},
7377			stop: function( gotoEnd ) {
7378				var index = 0,
7379
7380					// If we are going to the end, we want to run all the tweens
7381					// otherwise we skip this part
7382					length = gotoEnd ? animation.tweens.length : 0;
7383				if ( stopped ) {
7384					return this;
7385				}
7386				stopped = true;
7387				for ( ; index < length; index++ ) {
7388					animation.tweens[ index ].run( 1 );
7389				}
7390
7391				// Resolve when we played the last frame; otherwise, reject
7392				if ( gotoEnd ) {
7393					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7394					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7395				} else {
7396					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7397				}
7398				return this;
7399			}
7400		} ),
7401		props = animation.props;
7402
7403	propFilter( props, animation.opts.specialEasing );
7404
7405	for ( ; index < length; index++ ) {
7406		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7407		if ( result ) {
7408			if ( jQuery.isFunction( result.stop ) ) {
7409				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7410					jQuery.proxy( result.stop, result );
7411			}
7412			return result;
7413		}
7414	}
7415
7416	jQuery.map( props, createTween, animation );
7417
7418	if ( jQuery.isFunction( animation.opts.start ) ) {
7419		animation.opts.start.call( elem, animation );
7420	}
7421
7422	// Attach callbacks from options
7423	animation
7424		.progress( animation.opts.progress )
7425		.done( animation.opts.done, animation.opts.complete )
7426		.fail( animation.opts.fail )
7427		.always( animation.opts.always );
7428
7429	jQuery.fx.timer(
7430		jQuery.extend( tick, {
7431			elem: elem,
7432			anim: animation,
7433			queue: animation.opts.queue
7434		} )
7435	);
7436
7437	return animation;
7438}
7439
7440jQuery.Animation = jQuery.extend( Animation, {
7441
7442	tweeners: {
7443		"*": [ function( prop, value ) {
7444			var tween = this.createTween( prop, value );
7445			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7446			return tween;
7447		} ]
7448	},
7449
7450	tweener: function( props, callback ) {
7451		if ( jQuery.isFunction( props ) ) {
7452			callback = props;
7453			props = [ "*" ];
7454		} else {
7455			props = props.match( rnothtmlwhite );
7456		}
7457
7458		var prop,
7459			index = 0,
7460			length = props.length;
7461
7462		for ( ; index < length; index++ ) {
7463			prop = props[ index ];
7464			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7465			Animation.tweeners[ prop ].unshift( callback );
7466		}
7467	},
7468
7469	prefilters: [ defaultPrefilter ],
7470
7471	prefilter: function( callback, prepend ) {
7472		if ( prepend ) {
7473			Animation.prefilters.unshift( callback );
7474		} else {
7475			Animation.prefilters.push( callback );
7476		}
7477	}
7478} );
7479
7480jQuery.speed = function( speed, easing, fn ) {
7481	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7482		complete: fn || !fn && easing ||
7483			jQuery.isFunction( speed ) && speed,
7484		duration: speed,
7485		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7486	};
7487
7488	// Go to the end state if fx are off
7489	if ( jQuery.fx.off ) {
7490		opt.duration = 0;
7491
7492	} else {
7493		if ( typeof opt.duration !== "number" ) {
7494			if ( opt.duration in jQuery.fx.speeds ) {
7495				opt.duration = jQuery.fx.speeds[ opt.duration ];
7496
7497			} else {
7498				opt.duration = jQuery.fx.speeds._default;
7499			}
7500		}
7501	}
7502
7503	// Normalize opt.queue - true/undefined/null -> "fx"
7504	if ( opt.queue == null || opt.queue === true ) {
7505		opt.queue = "fx";
7506	}
7507
7508	// Queueing
7509	opt.old = opt.complete;
7510
7511	opt.complete = function() {
7512		if ( jQuery.isFunction( opt.old ) ) {
7513			opt.old.call( this );
7514		}
7515
7516		if ( opt.queue ) {
7517			jQuery.dequeue( this, opt.queue );
7518		}
7519	};
7520
7521	return opt;
7522};
7523
7524jQuery.fn.extend( {
7525	fadeTo: function( speed, to, easing, callback ) {
7526
7527		// Show any hidden elements after setting opacity to 0
7528		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7529
7530			// Animate to the value specified
7531			.end().animate( { opacity: to }, speed, easing, callback );
7532	},
7533	animate: function( prop, speed, easing, callback ) {
7534		var empty = jQuery.isEmptyObject( prop ),
7535			optall = jQuery.speed( speed, easing, callback ),
7536			doAnimation = function() {
7537
7538				// Operate on a copy of prop so per-property easing won't be lost
7539				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7540
7541				// Empty animations, or finishing resolves immediately
7542				if ( empty || dataPriv.get( this, "finish" ) ) {
7543					anim.stop( true );
7544				}
7545			};
7546			doAnimation.finish = doAnimation;
7547
7548		return empty || optall.queue === false ?
7549			this.each( doAnimation ) :
7550			this.queue( optall.queue, doAnimation );
7551	},
7552	stop: function( type, clearQueue, gotoEnd ) {
7553		var stopQueue = function( hooks ) {
7554			var stop = hooks.stop;
7555			delete hooks.stop;
7556			stop( gotoEnd );
7557		};
7558
7559		if ( typeof type !== "string" ) {
7560			gotoEnd = clearQueue;
7561			clearQueue = type;
7562			type = undefined;
7563		}
7564		if ( clearQueue && type !== false ) {
7565			this.queue( type || "fx", [] );
7566		}
7567
7568		return this.each( function() {
7569			var dequeue = true,
7570				index = type != null && type + "queueHooks",
7571				timers = jQuery.timers,
7572				data = dataPriv.get( this );
7573
7574			if ( index ) {
7575				if ( data[ index ] && data[ index ].stop ) {
7576					stopQueue( data[ index ] );
7577				}
7578			} else {
7579				for ( index in data ) {
7580					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7581						stopQueue( data[ index ] );
7582					}
7583				}
7584			}
7585
7586			for ( index = timers.length; index--; ) {
7587				if ( timers[ index ].elem === this &&
7588					( type == null || timers[ index ].queue === type ) ) {
7589
7590					timers[ index ].anim.stop( gotoEnd );
7591					dequeue = false;
vendor: 2,199 bytes, lines 7592-7676
7592					timers.splice( index, 1 );
7593				}
7594			}
7595
7596			// Start the next in the queue if the last step wasn't forced.
7597			// Timers currently will call their complete callbacks, which
7598			// will dequeue but only if they were gotoEnd.
7599			if ( dequeue || !gotoEnd ) {
7600				jQuery.dequeue( this, type );
7601			}
7602		} );
7603	},
7604	finish: function( type ) {
7605		if ( type !== false ) {
7606			type = type || "fx";
7607		}
7608		return this.each( function() {
7609			var index,
7610				data = dataPriv.get( this ),
7611				queue = data[ type + "queue" ],
7612				hooks = data[ type + "queueHooks" ],
7613				timers = jQuery.timers,
7614				length = queue ? queue.length : 0;
7615
7616			// Enable finishing flag on private data
7617			data.finish = true;
7618
7619			// Empty the queue first
7620			jQuery.queue( this, type, [] );
7621
7622			if ( hooks && hooks.stop ) {
7623				hooks.stop.call( this, true );
7624			}
7625
7626			// Look for any active animations, and finish them
7627			for ( index = timers.length; index--; ) {
7628				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7629					timers[ index ].anim.stop( true );
7630					timers.splice( index, 1 );
7631				}
7632			}
7633
7634			// Look for any animations in the old queue and finish them
7635			for ( index = 0; index < length; index++ ) {
7636				if ( queue[ index ] && queue[ index ].finish ) {
7637					queue[ index ].finish.call( this );
7638				}
7639			}
7640
7641			// Turn off finishing flag
7642			delete data.finish;
7643		} );
7644	}
7645} );
7646
7647jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7648	var cssFn = jQuery.fn[ name ];
7649	jQuery.fn[ name ] = function( speed, easing, callback ) {
7650		return speed == null || typeof speed === "boolean" ?
7651			cssFn.apply( this, arguments ) :
7652			this.animate( genFx( name, true ), speed, easing, callback );
7653	};
7654} );
7655
7656// Generate shortcuts for custom animations
7657jQuery.each( {
7658	slideDown: genFx( "show" ),
7659	slideUp: genFx( "hide" ),
7660	slideToggle: genFx( "toggle" ),
7661	fadeIn: { opacity: "show" },
7662	fadeOut: { opacity: "hide" },
7663	fadeToggle: { opacity: "toggle" }
7664}, function( name, props ) {
7665	jQuery.fn[ name ] = function( speed, easing, callback ) {
7666		return this.animate( props, speed, easing, callback );
7667	};
7668} );
7669
7670jQuery.timers = [];
7671jQuery.fx.tick = function() {
7672	var timer,
7673		i = 0,
7674		timers = jQuery.timers;
7675
7676	fxNow = jQuery
vendor: 7,814 bytes, lines 7676-8029
7676.now();
7677
7678	for ( ; i < timers.length; i++ ) {
7679		timer = timers[ i ];
7680
7681		// Run the timer and safely remove it when done (allowing for external removal)
7682		if ( !timer() && timers[ i ] === timer ) {
7683			timers.splice( i--, 1 );
7684		}
7685	}
7686
7687	if ( !timers.length ) {
7688		jQuery.fx.stop();
7689	}
7690	fxNow = undefined;
7691};
7692
7693jQuery.fx.timer = function( timer ) {
7694	jQuery.timers.push( timer );
7695	jQuery.fx.start();
7696};
7697
7698jQuery.fx.interval = 13;
7699jQuery.fx.start = function() {
7700	if ( inProgress ) {
7701		return;
7702	}
7703
7704	inProgress = true;
7705	schedule();
7706};
7707
7708jQuery.fx.stop = function() {
7709	inProgress = null;
7710};
7711
7712jQuery.fx.speeds = {
7713	slow: 600,
7714	fast: 200,
7715
7716	// Default speed
7717	_default: 400
7718};
7719
7720
7721// Based off of the plugin by Clint Helfers, with permission.
7722// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7723jQuery.fn.delay = function( time, type ) {
7724	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7725	type = type || "fx";
7726
7727	return this.queue( type, function( next, hooks ) {
7728		var timeout = window.setTimeout( next, time );
7729		hooks.stop = function() {
7730			window.clearTimeout( timeout );
7731		};
7732	} );
7733};
7734
7735
7736( function() {
7737	var input = document.createElement( "input" ),
7738		select = document.createElement( "select" ),
7739		opt = select.appendChild( document.createElement( "option" ) );
7740
7741	input.type = "checkbox";
7742
7743	// Support: Android <=4.3 only
7744	// Default value for a checkbox should be "on"
7745	support.checkOn = input.value !== "";
7746
7747	// Support: IE <=11 only
7748	// Must access selectedIndex to make default options select
7749	support.optSelected = opt.selected;
7750
7751	// Support: IE <=11 only
7752	// An input loses its value after becoming a radio
7753	input = document.createElement( "input" );
7754	input.value = "t";
7755	input.type = "radio";
7756	support.radioValue = input.value === "t";
7757} )();
7758
7759
7760var boolHook,
7761	attrHandle = jQuery.expr.attrHandle;
7762
7763jQuery.fn.extend( {
7764	attr: function( name, value ) {
7765		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7766	},
7767
7768	removeAttr: function( name ) {
7769		return this.each( function() {
7770			jQuery.removeAttr( this, name );
7771		} );
7772	}
7773} );
7774
7775jQuery.extend( {
7776	attr: function( elem, name, value ) {
7777		var ret, hooks,
7778			nType = elem.nodeType;
7779
7780		// Don't get/set attributes on text, comment and attribute nodes
7781		if ( nType === 3 || nType === 8 || nType === 2 ) {
7782			return;
7783		}
7784
7785		// Fallback to prop when attributes are not supported
7786		if ( typeof elem.getAttribute === "undefined" ) {
7787			return jQuery.prop( elem, name, value );
7788		}
7789
7790		// Attribute hooks are determined by the lowercase version
7791		// Grab necessary hook if one is defined
7792		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7793			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7794				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7795		}
7796
7797		if ( value !== undefined ) {
7798			if ( value === null ) {
7799				jQuery.removeAttr( elem, name );
7800				return;
7801			}
7802
7803			if ( hooks && "set" in hooks &&
7804				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7805				return ret;
7806			}
7807
7808			elem.setAttribute( name, value + "" );
7809			return value;
7810		}
7811
7812		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7813			return ret;
7814		}
7815
7816		ret = jQuery.find.attr( elem, name );
7817
7818		// Non-existent attributes return null, we normalize to undefined
7819		return ret == null ? undefined : ret;
7820	},
7821
7822	attrHooks: {
7823		type: {
7824			set: function( elem, value ) {
7825				if ( !support.radioValue && value === "radio" &&
7826					nodeName( elem, "input" ) ) {
7827					var val = elem.value;
7828					elem.setAttribute( "type", value );
7829					if ( val ) {
7830						elem.value = val;
7831					}
7832					return value;
7833				}
7834			}
7835		}
7836	},
7837
7838	removeAttr: function( elem, value ) {
7839		var name,
7840			i = 0,
7841
7842			// Attribute names can contain non-HTML whitespace characters
7843			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7844			attrNames = value && value.match( rnothtmlwhite );
7845
7846		if ( attrNames && elem.nodeType === 1 ) {
7847			while ( ( name = attrNames[ i++ ] ) ) {
7848				elem.removeAttribute( name );
7849			}
7850		}
7851	}
7852} );
7853
7854// Hooks for boolean attributes
7855boolHook = {
7856	set: function( elem, value, name ) {
7857		if ( value === false ) {
7858
7859			// Remove boolean attributes when set to false
7860			jQuery.removeAttr( elem, name );
7861		} else {
7862			elem.setAttribute( name, name );
7863		}
7864		return name;
7865	}
7866};
7867
7868jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7869	var getter = attrHandle[ name ] || jQuery.find.attr;
7870
7871	attrHandle[ name ] = function( elem, name, isXML ) {
7872		var ret, handle,
7873			lowercaseName = name.toLowerCase();
7874
7875		if ( !isXML ) {
7876
7877			// Avoid an infinite loop by temporarily removing this function from the getter
7878			handle = attrHandle[ lowercaseName ];
7879			attrHandle[ lowercaseName ] = ret;
7880			ret = getter( elem, name, isXML ) != null ?
7881				lowercaseName :
7882				null;
7883			attrHandle[ lowercaseName ] = handle;
7884		}
7885		return ret;
7886	};
7887} );
7888
7889
7890
7891
7892var rfocusable = /^(?:input|select|textarea|button)$/i,
7893	rclickable = /^(?:a|area)$/i;
7894
7895jQuery.fn.extend( {
7896	prop: function( name, value ) {
7897		return access( this, jQuery.prop, name, value, arguments.length > 1 );
7898	},
7899
7900	removeProp: function( name ) {
7901		return this.each( function() {
7902			delete this[ jQuery.propFix[ name ] || name ];
7903		} );
7904	}
7905} );
7906
7907jQuery.extend( {
7908	prop: function( elem, name, value ) {
7909		var ret, hooks,
7910			nType = elem.nodeType;
7911
7912		// Don't get/set properties on text, comment and attribute nodes
7913		if ( nType === 3 || nType === 8 || nType === 2 ) {
7914			return;
7915		}
7916
7917		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7918
7919			// Fix name and attach hooks
7920			name = jQuery.propFix[ name ] || name;
7921			hooks = jQuery.propHooks[ name ];
7922		}
7923
7924		if ( value !== undefined ) {
7925			if ( hooks && "set" in hooks &&
7926				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7927				return ret;
7928			}
7929
7930			return ( elem[ name ] = value );
7931		}
7932
7933		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7934			return ret;
7935		}
7936
7937		return elem[ name ];
7938	},
7939
7940	propHooks: {
7941		tabIndex: {
7942			get: function( elem ) {
7943
7944				// Support: IE <=9 - 11 only
7945				// elem.tabIndex doesn't always return the
7946				// correct value when it hasn't been explicitly set
7947				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7948				// Use proper attribute retrieval(#12072)
7949				var tabindex = jQuery.find.attr( elem, "tabindex" );
7950
7951				if ( tabindex ) {
7952					return parseInt( tabindex, 10 );
7953				}
7954
7955				if (
7956					rfocusable.test( elem.nodeName ) ||
7957					rclickable.test( elem.nodeName ) &&
7958					elem.href
7959				) {
7960					return 0;
7961				}
7962
7963				return -1;
7964			}
7965		}
7966	},
7967
7968	propFix: {
7969		"for": "htmlFor",
7970		"class": "className"
7971	}
7972} );
7973
7974// Support: IE <=11 only
7975// Accessing the selectedIndex property
7976// forces the browser to respect setting selected
7977// on the option
7978// The getter ensures a default option is selected
7979// when in an optgroup
7980// eslint rule "no-unused-expressions" is disabled for this code
7981// since it considers such accessions noop
7982if ( !support.optSelected ) {
7983	jQuery.propHooks.selected = {
7984		get: function( elem ) {
7985
7986			/* eslint no-unused-expressions: "off" */
7987
7988			var parent = elem.parentNode;
7989			if ( parent && parent.parentNode ) {
7990				parent.parentNode.selectedIndex;
7991			}
7992			return null;
7993		},
7994		set: function( elem ) {
7995
7996			/* eslint no-unused-expressions: "off" */
7997
7998			var parent = elem.parentNode;
7999			if ( parent ) {
8000				parent.selectedIndex;
8001
8002				if ( parent.parentNode ) {
8003					parent.parentNode.selectedIndex;
8004				}
8005			}
8006		}
8007	};
8008}
8009
8010jQuery.each( [
8011	"tabIndex",
8012	"readOnly",
8013	"maxLength",
8014	"cellSpacing",
8015	"cellPadding",
8016	"rowSpan",
8017	"colSpan",
8018	"useMap",
8019	"frameBorder",
8020	"contentEditable"
8021], function() {
8022	jQuery.propFix[ this.toLowerCase() ] = this;
8023} );
8024
8025
8026
8027
8028	// Strip and collapse whitespace according to HTML spec
8029	// https://
vendor: 4,260 bytes, lines 8029-8195
8029html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
8030	function stripAndCollapse( value ) {
8031		var tokens = value.match( rnothtmlwhite ) || [];
8032		return tokens.join( " " );
8033	}
8034
8035
8036function getClass( elem ) {
8037	return elem.getAttribute && elem.getAttribute( "class" ) || "";
8038}
8039
8040jQuery.fn.extend( {
8041	addClass: function( value ) {
8042		var classes, elem, cur, curValue, clazz, j, finalValue,
8043			i = 0;
8044
8045		if ( jQuery.isFunction( value ) ) {
8046			return this.each( function( j ) {
8047				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8048			} );
8049		}
8050
8051		if ( typeof value === "string" && value ) {
8052			classes = value.match( rnothtmlwhite ) || [];
8053
8054			while ( ( elem = this[ i++ ] ) ) {
8055				curValue = getClass( elem );
8056				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8057
8058				if ( cur ) {
8059					j = 0;
8060					while ( ( clazz = classes[ j++ ] ) ) {
8061						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8062							cur += clazz + " ";
8063						}
8064					}
8065
8066					// Only assign if different to avoid unneeded rendering.
8067					finalValue = stripAndCollapse( cur );
8068					if ( curValue !== finalValue ) {
8069						elem.setAttribute( "class", finalValue );
8070					}
8071				}
8072			}
8073		}
8074
8075		return this;
8076	},
8077
8078	removeClass: function( value ) {
8079		var classes, elem, cur, curValue, clazz, j, finalValue,
8080			i = 0;
8081
8082		if ( jQuery.isFunction( value ) ) {
8083			return this.each( function( j ) {
8084				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8085			} );
8086		}
8087
8088		if ( !arguments.length ) {
8089			return this.attr( "class", "" );
8090		}
8091
8092		if ( typeof value === "string" && value ) {
8093			classes = value.match( rnothtmlwhite ) || [];
8094
8095			while ( ( elem = this[ i++ ] ) ) {
8096				curValue = getClass( elem );
8097
8098				// This expression is here for better compressibility (see addClass)
8099				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8100
8101				if ( cur ) {
8102					j = 0;
8103					while ( ( clazz = classes[ j++ ] ) ) {
8104
8105						// Remove *all* instances
8106						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8107							cur = cur.replace( " " + clazz + " ", " " );
8108						}
8109					}
8110
8111					// Only assign if different to avoid unneeded rendering.
8112					finalValue = stripAndCollapse( cur );
8113					if ( curValue !== finalValue ) {
8114						elem.setAttribute( "class", finalValue );
8115					}
8116				}
8117			}
8118		}
8119
8120		return this;
8121	},
8122
8123	toggleClass: function( value, stateVal ) {
8124		var type = typeof value;
8125
8126		if ( typeof stateVal === "boolean" && type === "string" ) {
8127			return stateVal ? this.addClass( value ) : this.removeClass( value );
8128		}
8129
8130		if ( jQuery.isFunction( value ) ) {
8131			return this.each( function( i ) {
8132				jQuery( this ).toggleClass(
8133					value.call( this, i, getClass( this ), stateVal ),
8134					stateVal
8135				);
8136			} );
8137		}
8138
8139		return this.each( function() {
8140			var className, i, self, classNames;
8141
8142			if ( type === "string" ) {
8143
8144				// Toggle individual class names
8145				i = 0;
8146				self = jQuery( this );
8147				classNames = value.match( rnothtmlwhite ) || [];
8148
8149				while ( ( className = classNames[ i++ ] ) ) {
8150
8151					// Check each className given, space separated list
8152					if ( self.hasClass( className ) ) {
8153						self.removeClass( className );
8154					} else {
8155						self.addClass( className );
8156					}
8157				}
8158
8159			// Toggle whole class name
8160			} else if ( value === undefined || type === "boolean" ) {
8161				className = getClass( this );
8162				if ( className ) {
8163
8164					// Store className if set
8165					dataPriv.set( this, "__className__", className );
8166				}
8167
8168				// If the element has a class name or if we're passed `false`,
8169				// then remove the whole classname (if there was one, the above saved it).
8170				// Otherwise bring back whatever was previously saved (if anything),
8171				// falling back to the empty string if nothing was stored.
8172				if ( this.setAttribute ) {
8173					this.setAttribute( "class",
8174						className || value === false ?
8175						"" :
8176						dataPriv.get( this, "__className__" ) || ""
8177					);
8178				}
8179			}
8180		} );
8181	},
8182
8183	hasClass: function( selector ) {
8184		var className, elem,
8185			i = 0;
8186
8187		className = " " + selector + " ";
8188		while ( ( elem = this[ i++ ] ) ) {
8189			if ( elem.nodeType === 1 &&
8190				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8191					return true;
8192			}
8193		}
8194
8195		return false;
vendor: 1,377 bytes, lines 8196-8265
8196	}
8197} );
8198
8199
8200
8201
8202var rreturn = /\r/g;
8203
8204jQuery.fn.extend( {
8205	val: function( value ) {
8206		var hooks, ret, isFunction,
8207			elem = this[ 0 ];
8208
8209		if ( !arguments.length ) {
8210			if ( elem ) {
8211				hooks = jQuery.valHooks[ elem.type ] ||
8212					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8213
8214				if ( hooks &&
8215					"get" in hooks &&
8216					( ret = hooks.get( elem, "value" ) ) !== undefined
8217				) {
8218					return ret;
8219				}
8220
8221				ret = elem.value;
8222
8223				// Handle most common string cases
8224				if ( typeof ret === "string" ) {
8225					return ret.replace( rreturn, "" );
8226				}
8227
8228				// Handle cases where value is null/undef or number
8229				return ret == null ? "" : ret;
8230			}
8231
8232			return;
8233		}
8234
8235		isFunction = jQuery.isFunction( value );
8236
8237		return this.each( function( i ) {
8238			var val;
8239
8240			if ( this.nodeType !== 1 ) {
8241				return;
8242			}
8243
8244			if ( isFunction ) {
8245				val = value.call( this, i, jQuery( this ).val() );
8246			} else {
8247				val = value;
8248			}
8249
8250			// Treat null/undefined as ""; convert numbers to string
8251			if ( val == null ) {
8252				val = "";
8253
8254			} else if ( typeof val === "number" ) {
8255				val += "";
8256
8257			} else if ( Array.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: 8,160 bytes, lines 8266-8584
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
8278				var val = jQuery.find.attr( elem, "value" );
8279				return val != null ?
8280					val :
8281
8282					// Support: IE <=10 - 11 only
8283					// option.text throws exceptions (#14686, #14858)
8284					// Strip and collapse whitespace
8285					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8286					stripAndCollapse( jQuery.text( elem ) );
8287			}
8288		},
8289		select: {
8290			get: function( elem ) {
8291				var value, option, i,
8292					options = elem.options,
8293					index = elem.selectedIndex,
8294					one = elem.type === "select-one",
8295					values = one ? null : [],
8296					max = one ? index + 1 : options.length;
8297
8298				if ( index < 0 ) {
8299					i = max;
8300
8301				} else {
8302					i = one ? index : 0;
8303				}
8304
8305				// Loop through all the selected options
8306				for ( ; i < max; i++ ) {
8307					option = options[ i ];
8308
8309					// Support: IE <=9 only
8310					// IE8-9 doesn't update selected after form reset (#2551)
8311					if ( ( option.selected || i === index ) &&
8312
8313							// Don't return options that are disabled or in a disabled optgroup
8314							!option.disabled &&
8315							( !option.parentNode.disabled ||
8316								!nodeName( option.parentNode, "optgroup" ) ) ) {
8317
8318						// Get the specific value for the option
8319						value = jQuery( option ).val();
8320
8321						// We don't need an array for one selects
8322						if ( one ) {
8323							return value;
8324						}
8325
8326						// Multi-Selects return an array
8327						values.push( value );
8328					}
8329				}
8330
8331				return values;
8332			},
8333
8334			set: function( elem, value ) {
8335				var optionSet, option,
8336					options = elem.options,
8337					values = jQuery.makeArray( value ),
8338					i = options.length;
8339
8340				while ( i-- ) {
8341					option = options[ i ];
8342
8343					/* eslint-disable no-cond-assign */
8344
8345					if ( option.selected =
8346						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8347					) {
8348						optionSet = true;
8349					}
8350
8351					/* eslint-enable no-cond-assign */
8352				}
8353
8354				// Force browsers to behave consistently when non-matching value is set
8355				if ( !optionSet ) {
8356					elem.selectedIndex = -1;
8357				}
8358				return values;
8359			}
8360		}
8361	}
8362} );
8363
8364// Radios and checkboxes getter/setter
8365jQuery.each( [ "radio", "checkbox" ], function() {
8366	jQuery.valHooks[ this ] = {
8367		set: function( elem, value ) {
8368			if ( Array.isArray( value ) ) {
8369				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8370			}
8371		}
8372	};
8373	if ( !support.checkOn ) {
8374		jQuery.valHooks[ this ].get = function( elem ) {
8375			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8376		};
8377	}
8378} );
8379
8380
8381
8382
8383// Return jQuery for attributes-only inclusion
8384
8385
8386var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
8387
8388jQuery.extend( jQuery.event, {
8389
8390	trigger: function( event, data, elem, onlyHandlers ) {
8391
8392		var i, cur, tmp, bubbleType, ontype, handle, special,
8393			eventPath = [ elem || document ],
8394			type = hasOwn.call( event, "type" ) ? event.type : event,
8395			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8396
8397		cur = tmp = elem = elem || document;
8398
8399		// Don't do events on text and comment nodes
8400		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8401			return;
8402		}
8403
8404		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8405		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8406			return;
8407		}
8408
8409		if ( type.indexOf( "." ) > -1 ) {
8410
8411			// Namespaced trigger; create a regexp to match event type in handle()
8412			namespaces = type.split( "." );
8413			type = namespaces.shift();
8414			namespaces.sort();
8415		}
8416		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8417
8418		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8419		event = event[ jQuery.expando ] ?
8420			event :
8421			new jQuery.Event( type, typeof event === "object" && event );
8422
8423		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8424		event.isTrigger = onlyHandlers ? 2 : 3;
8425		event.namespace = namespaces.join( "." );
8426		event.rnamespace = event.namespace ?
8427			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8428			null;
8429
8430		// Clean up the event in case it is being reused
8431		event.result = undefined;
8432		if ( !event.target ) {
8433			event.target = elem;
8434		}
8435
8436		// Clone any incoming data and prepend the event, creating the handler arg list
8437		data = data == null ?
8438			[ event ] :
8439			jQuery.makeArray( data, [ event ] );
8440
8441		// Allow special events to draw outside the lines
8442		special = jQuery.event.special[ type ] || {};
8443		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8444			return;
8445		}
8446
8447		// Determine event propagation path in advance, per W3C events spec (#9951)
8448		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8449		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
8450
8451			bubbleType = special.delegateType || type;
8452			if ( !rfocusMorph.test( bubbleType + type ) ) {
8453				cur = cur.parentNode;
8454			}
8455			for ( ; cur; cur = cur.parentNode ) {
8456				eventPath.push( cur );
8457				tmp = cur;
8458			}
8459
8460			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8461			if ( tmp === ( elem.ownerDocument || document ) ) {
8462				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8463			}
8464		}
8465
8466		// Fire handlers on the event path
8467		i = 0;
8468		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8469
8470			event.type = i > 1 ?
8471				bubbleType :
8472				special.bindType || type;
8473
8474			// jQuery handler
8475			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8476				dataPriv.get( cur, "handle" );
8477			if ( handle ) {
8478				handle.apply( cur, data );
8479			}
8480
8481			// Native handler
8482			handle = ontype && cur[ ontype ];
8483			if ( handle && handle.apply && acceptData( cur ) ) {
8484				event.result = handle.apply( cur, data );
8485				if ( event.result === false ) {
8486					event.preventDefault();
8487				}
8488			}
8489		}
8490		event.type = type;
8491
8492		// If nobody prevented the default action, do it now
8493		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8494
8495			if ( ( !special._default ||
8496				special._default.apply( eventPath.pop(), data ) === false ) &&
8497				acceptData( elem ) ) {
8498
8499				// Call a native DOM method on the target with the same name as the event.
8500				// Don't do default actions on window, that's where global variables be (#6170)
8501				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
8502
8503					// Don't re-trigger an onFOO event when we call its FOO() method
8504					tmp = elem[ ontype ];
8505
8506					if ( tmp ) {
8507						elem[ ontype ] = null;
8508					}
8509
8510					// Prevent re-triggering of the same event, since we already bubbled it above
8511					jQuery.event.triggered = type;
8512					elem[ type ]();
8513					jQuery.event.triggered = undefined;
8514
8515					if ( tmp ) {
8516						elem[ ontype ] = tmp;
8517					}
8518				}
8519			}
8520		}
8521
8522		return event.result;
8523	},
8524
8525	// Piggyback on a donor event to simulate a different one
8526	// Used only for `focus(in | out)` events
8527	simulate: function( type, elem, event ) {
8528		var e = jQuery.extend(
8529			new jQuery.Event(),
8530			event,
8531			{
8532				type: type,
8533				isSimulated: true
8534			}
8535		);
8536
8537		jQuery.event.trigger( e, null, elem );
8538	}
8539
8540} );
8541
8542jQuery.fn.extend( {
8543
8544	trigger: function( type, data ) {
8545		return this.each( function() {
8546			jQuery.event.trigger( type, data, this );
8547		} );
8548	},
8549	triggerHandler: function( type, data ) {
8550		var elem = this[ 0 ];
8551		if ( elem ) {
8552			return jQuery.event.trigger( type, data, elem, true );
8553		}
8554	}
8555} );
8556
8557
8558jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
8559	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8560	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
8561	function( i, name ) {
8562
8563	// Handle event binding
8564	jQuery.fn[ name ] = function( data, fn ) {
8565		return arguments.length > 0 ?
8566			this.on( name, null, data, fn ) :
8567			this.trigger( name );
8568	};
8569} );
8570
8571jQuery.fn.extend( {
8572	hover: function( fnOver, fnOut ) {
8573		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8574	}
8575} );
8576
8577
8578
8579
8580support.focusin = "onfocusin" in window;
8581
8582
8583// Support: Firefox <=44
8584// Firefox doesn't have focus(in | out) events
vendor: 4,174 bytes, lines 8585-8748
8585// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8586//
8587// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8588// focus(in | out) events fire after focus & blur events,
8589// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8590// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8591if ( !support.focusin ) {
8592	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8593
8594		// Attach a single capturing handler on the document while someone wants focusin/focusout
8595		var handler = function( event ) {
8596			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8597		};
8598
8599		jQuery.event.special[ fix ] = {
8600			setup: function() {
8601				var doc = this.ownerDocument || this,
8602					attaches = dataPriv.access( doc, fix );
8603
8604				if ( !attaches ) {
8605					doc.addEventListener( orig, handler, true );
8606				}
8607				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8608			},
8609			teardown: function() {
8610				var doc = this.ownerDocument || this,
8611					attaches = dataPriv.access( doc, fix ) - 1;
8612
8613				if ( !attaches ) {
8614					doc.removeEventListener( orig, handler, true );
8615					dataPriv.remove( doc, fix );
8616
8617				} else {
8618					dataPriv.access( doc, fix, attaches );
8619				}
8620			}
8621		};
8622	} );
8623}
8624var location = window.location;
8625
8626var nonce = jQuery.now();
8627
8628var rquery = ( /\?/ );
8629
8630
8631
8632// Cross-browser xml parsing
8633jQuery.parseXML = function( data ) {
8634	var xml;
8635	if ( !data || typeof data !== "string" ) {
8636		return null;
8637	}
8638
8639	// Support: IE 9 - 11 only
8640	// IE throws on parseFromString with invalid input.
8641	try {
8642		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8643	} catch ( e ) {
8644		xml = undefined;
8645	}
8646
8647	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8648		jQuery.error( "Invalid XML: " + data );
8649	}
8650	return xml;
8651};
8652
8653
8654var
8655	rbracket = /\[\]$/,
8656	rCRLF = /\r?\n/g,
8657	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8658	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8659
8660function buildParams( prefix, obj, traditional, add ) {
8661	var name;
8662
8663	if ( Array.isArray( obj ) ) {
8664
8665		// Serialize array item.
8666		jQuery.each( obj, function( i, v ) {
8667			if ( traditional || rbracket.test( prefix ) ) {
8668
8669				// Treat each array item as a scalar.
8670				add( prefix, v );
8671
8672			} else {
8673
8674				// Item is non-scalar (array or object), encode its numeric index.
8675				buildParams(
8676					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8677					v,
8678					traditional,
8679					add
8680				);
8681			}
8682		} );
8683
8684	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
8685
8686		// Serialize object item.
8687		for ( name in obj ) {
8688			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8689		}
8690
8691	} else {
8692
8693		// Serialize scalar item.
8694		add( prefix, obj );
8695	}
8696}
8697
8698// Serialize an array of form elements or a set of
8699// key/values into a query string
8700jQuery.param = function( a, traditional ) {
8701	var prefix,
8702		s = [],
8703		add = function( key, valueOrFunction ) {
8704
8705			// If value is a function, invoke it and use its return value
8706			var value = jQuery.isFunction( valueOrFunction ) ?
8707				valueOrFunction() :
8708				valueOrFunction;
8709
8710			s[ s.length ] = encodeURIComponent( key ) + "=" +
8711				encodeURIComponent( value == null ? "" : value );
8712		};
8713
8714	// If an array was passed in, assume that it is an array of form elements.
8715	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8716
8717		// Serialize the form elements
8718		jQuery.each( a, function() {
8719			add( this.name, this.value );
8720		} );
8721
8722	} else {
8723
8724		// If traditional, encode the "old" way (the way 1.3.2 or older
8725		// did it), otherwise encode params recursively.
8726		for ( prefix in a ) {
8727			buildParams( prefix, a[ prefix ], traditional, add );
8728		}
8729	}
8730
8731	// Return the resulting serialization
8732	return s.join( "&" );
8733};
8734
8735jQuery.fn.extend( {
8736	serialize: function() {
8737		return jQuery.param( this.serializeArray() );
8738	},
8739	serializeArray: function() {
8740		return this.map( function() {
8741
8742			// Can add propHook for "elements" to filter or add form elements
8743			var elements = jQuery.prop( this, "elements" );
8744			return elements ? jQuery.makeArray( elements ) : this;
8745		} )
8746		.filter( function() {
8747			var type = this.type;
8748
vendor: 4,939 bytes, lines 8749-8921
8749			// Use .is( ":disabled" ) so that fieldset[disabled] works
8750			return this.name && !jQuery( this ).is( ":disabled" ) &&
8751				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8752				( this.checked || !rcheckableType.test( type ) );
8753		} )
8754		.map( function( i, elem ) {
8755			var val = jQuery( this ).val();
8756
8757			if ( val == null ) {
8758				return null;
8759			}
8760
8761			if ( Array.isArray( val ) ) {
8762				return jQuery.map( val, function( val ) {
8763					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8764				} );
8765			}
8766
8767			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8768		} ).get();
8769	}
8770} );
8771
8772
8773var
8774	r20 = /%20/g,
8775	rhash = /#.*$/,
8776	rantiCache = /([?&])_=[^&]*/,
8777	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8778
8779	// #7653, #8125, #8152: local protocol detection
8780	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8781	rnoContent = /^(?:GET|HEAD)$/,
8782	rprotocol = /^\/\//,
8783
8784	/* Prefilters
8785	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8786	 * 2) These are called:
8787	 *    - BEFORE asking for a transport
8788	 *    - AFTER param serialization (s.data is a string if s.processData is true)
8789	 * 3) key is the dataType
8790	 * 4) the catchall symbol "*" can be used
8791	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8792	 */
8793	prefilters = {},
8794
8795	/* Transports bindings
8796	 * 1) key is the dataType
8797	 * 2) the catchall symbol "*" can be used
8798	 * 3) selection will start with transport dataType and THEN go to "*" if needed
8799	 */
8800	transports = {},
8801
8802	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8803	allTypes = "*/".concat( "*" ),
8804
8805	// Anchor tag for parsing the document origin
8806	originAnchor = document.createElement( "a" );
8807	originAnchor.href = location.href;
8808
8809// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8810function addToPrefiltersOrTransports( structure ) {
8811
8812	// dataTypeExpression is optional and defaults to "*"
8813	return function( dataTypeExpression, func ) {
8814
8815		if ( typeof dataTypeExpression !== "string" ) {
8816			func = dataTypeExpression;
8817			dataTypeExpression = "*";
8818		}
8819
8820		var dataType,
8821			i = 0,
8822			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8823
8824		if ( jQuery.isFunction( func ) ) {
8825
8826			// For each dataType in the dataTypeExpression
8827			while ( ( dataType = dataTypes[ i++ ] ) ) {
8828
8829				// Prepend if requested
8830				if ( dataType[ 0 ] === "+" ) {
8831					dataType = dataType.slice( 1 ) || "*";
8832					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8833
8834				// Otherwise append
8835				} else {
8836					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8837				}
8838			}
8839		}
8840	};
8841}
8842
8843// Base inspection function for prefilters and transports
8844function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8845
8846	var inspected = {},
8847		seekingTransport = ( structure === transports );
8848
8849	function inspect( dataType ) {
8850		var selected;
8851		inspected[ dataType ] = true;
8852		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8853			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8854			if ( typeof dataTypeOrTransport === "string" &&
8855				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8856
8857				options.dataTypes.unshift( dataTypeOrTransport );
8858				inspect( dataTypeOrTransport );
8859				return false;
8860			} else if ( seekingTransport ) {
8861				return !( selected = dataTypeOrTransport );
8862			}
8863		} );
8864		return selected;
8865	}
8866
8867	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8868}
8869
8870// A special extend for ajax options
8871// that takes "flat" options (not to be deep extended)
8872// Fixes #9887
8873function ajaxExtend( target, src ) {
8874	var key, deep,
8875		flatOptions = jQuery.ajaxSettings.flatOptions || {};
8876
8877	for ( key in src ) {
8878		if ( src[ key ] !== undefined ) {
8879			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8880		}
8881	}
8882	if ( deep ) {
8883		jQuery.extend( true, target, deep );
8884	}
8885
8886	return target;
8887}
8888
8889/* Handles responses to an ajax request:
8890 * - finds the right dataType (mediates between content-type and expected dataType)
8891 * - returns the corresponding response
8892 */
8893function ajaxHandleResponses( s, jqXHR, responses ) {
8894
8895	var ct, type, finalDataType, firstDataType,
8896		contents = s.contents,
8897		dataTypes = s.dataTypes;
8898
8899	// Remove auto dataType and get content-type in the process
8900	while ( dataTypes[ 0 ] === "*" ) {
8901		dataTypes.shift();
8902		if ( ct === undefined ) {
8903			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8904		}
8905	}
8906
8907	// Check if we're dealing with a known content-type
8908	if ( ct ) {
8909		for ( type in contents ) {
8910			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8911				dataTypes.unshift( type );
8912				break;
8913			}
8914		}
8915	}
8916
8917	// Check to see if we have a response for the expected dataType
8918	if ( dataTypes[ 0 ] in responses ) {
8919		finalDataType = dataTypes[ 0 ];
8920	} else {
8921
vendor: 18,932 bytes, lines 8922-9679
8922		// Try convertible dataTypes
8923		for ( type in responses ) {
8924			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8925				finalDataType = type;
8926				break;
8927			}
8928			if ( !firstDataType ) {
8929				firstDataType = type;
8930			}
8931		}
8932
8933		// Or just use first one
8934		finalDataType = finalDataType || firstDataType;
8935	}
8936
8937	// If we found a dataType
8938	// We add the dataType to the list if needed
8939	// and return the corresponding response
8940	if ( finalDataType ) {
8941		if ( finalDataType !== dataTypes[ 0 ] ) {
8942			dataTypes.unshift( finalDataType );
8943		}
8944		return responses[ finalDataType ];
8945	}
8946}
8947
8948/* Chain conversions given the request and the original response
8949 * Also sets the responseXXX fields on the jqXHR instance
8950 */
8951function ajaxConvert( s, response, jqXHR, isSuccess ) {
8952	var conv2, current, conv, tmp, prev,
8953		converters = {},
8954
8955		// Work with a copy of dataTypes in case we need to modify it for conversion
8956		dataTypes = s.dataTypes.slice();
8957
8958	// Create converters map with lowercased keys
8959	if ( dataTypes[ 1 ] ) {
8960		for ( conv in s.converters ) {
8961			converters[ conv.toLowerCase() ] = s.converters[ conv ];
8962		}
8963	}
8964
8965	current = dataTypes.shift();
8966
8967	// Convert to each sequential dataType
8968	while ( current ) {
8969
8970		if ( s.responseFields[ current ] ) {
8971			jqXHR[ s.responseFields[ current ] ] = response;
8972		}
8973
8974		// Apply the dataFilter if provided
8975		if ( !prev && isSuccess && s.dataFilter ) {
8976			response = s.dataFilter( response, s.dataType );
8977		}
8978
8979		prev = current;
8980		current = dataTypes.shift();
8981
8982		if ( current ) {
8983
8984			// There's only work to do if current dataType is non-auto
8985			if ( current === "*" ) {
8986
8987				current = prev;
8988
8989			// Convert response if prev dataType is non-auto and differs from current
8990			} else if ( prev !== "*" && prev !== current ) {
8991
8992				// Seek a direct converter
8993				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8994
8995				// If none found, seek a pair
8996				if ( !conv ) {
8997					for ( conv2 in converters ) {
8998
8999						// If conv2 outputs current
9000						tmp = conv2.split( " " );
9001						if ( tmp[ 1 ] === current ) {
9002
9003							// If prev can be converted to accepted input
9004							conv = converters[ prev + " " + tmp[ 0 ] ] ||
9005								converters[ "* " + tmp[ 0 ] ];
9006							if ( conv ) {
9007
9008								// Condense equivalence converters
9009								if ( conv === true ) {
9010									conv = converters[ conv2 ];
9011
9012								// Otherwise, insert the intermediate dataType
9013								} else if ( converters[ conv2 ] !== true ) {
9014									current = tmp[ 0 ];
9015									dataTypes.unshift( tmp[ 1 ] );
9016								}
9017								break;
9018							}
9019						}
9020					}
9021				}
9022
9023				// Apply converter (if not an equivalence)
9024				if ( conv !== true ) {
9025
9026					// Unless errors are allowed to bubble, catch and return them
9027					if ( conv && s.throws ) {
9028						response = conv( response );
9029					} else {
9030						try {
9031							response = conv( response );
9032						} catch ( e ) {
9033							return {
9034								state: "parsererror",
9035								error: conv ? e : "No conversion from " + prev + " to " + current
9036							};
9037						}
9038					}
9039				}
9040			}
9041		}
9042	}
9043
9044	return { state: "success", data: response };
9045}
9046
9047jQuery.extend( {
9048
9049	// Counter for holding the number of active queries
9050	active: 0,
9051
9052	// Last-Modified header cache for next request
9053	lastModified: {},
9054	etag: {},
9055
9056	ajaxSettings: {
9057		url: location.href,
9058		type: "GET",
9059		isLocal: rlocalProtocol.test( location.protocol ),
9060		global: true,
9061		processData: true,
9062		async: true,
9063		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9064
9065		/*
9066		timeout: 0,
9067		data: null,
9068		dataType: null,
9069		username: null,
9070		password: null,
9071		cache: null,
9072		throws: false,
9073		traditional: false,
9074		headers: {},
9075		*/
9076
9077		accepts: {
9078			"*": allTypes,
9079			text: "text/plain",
9080			html: "text/html",
9081			xml: "application/xml, text/xml",
9082			json: "application/json, text/javascript"
9083		},
9084
9085		contents: {
9086			xml: /\bxml\b/,
9087			html: /\bhtml/,
9088			json: /\bjson\b/
9089		},
9090
9091		responseFields: {
9092			xml: "responseXML",
9093			text: "responseText",
9094			json: "responseJSON"
9095		},
9096
9097		// Data converters
9098		// Keys separate source (or catchall "*") and destination types with a single space
9099		converters: {
9100
9101			// Convert anything to text
9102			"* text": String,
9103
9104			// Text to html (true = no transformation)
9105			"text html": true,
9106
9107			// Evaluate text as a json expression
9108			"text json": JSON.parse,
9109
9110			// Parse text as xml
9111			"text xml": jQuery.parseXML
9112		},
9113
9114		// For options that shouldn't be deep extended:
9115		// you can add your own custom options here if
9116		// and when you create one that shouldn't be
9117		// deep extended (see ajaxExtend)
9118		flatOptions: {
9119			url: true,
9120			context: true
9121		}
9122	},
9123
9124	// Creates a full fledged settings object into target
9125	// with both ajaxSettings and settings fields.
9126	// If target is omitted, writes into ajaxSettings.
9127	ajaxSetup: function( target, settings ) {
9128		return settings ?
9129
9130			// Building a settings object
9131			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9132
9133			// Extending ajaxSettings
9134			ajaxExtend( jQuery.ajaxSettings, target );
9135	},
9136
9137	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9138	ajaxTransport: addToPrefiltersOrTransports( transports ),
9139
9140	// Main method
9141	ajax: function( url, options ) {
9142
9143		// If url is an object, simulate pre-1.5 signature
9144		if ( typeof url === "object" ) {
9145			options = url;
9146			url = undefined;
9147		}
9148
9149		// Force options to be an object
9150		options = options || {};
9151
9152		var transport,
9153
9154			// URL without anti-cache param
9155			cacheURL,
9156
9157			// Response headers
9158			responseHeadersString,
9159			responseHeaders,
9160
9161			// timeout handle
9162			timeoutTimer,
9163
9164			// Url cleanup var
9165			urlAnchor,
9166
9167			// Request state (becomes false upon send and true upon completion)
9168			completed,
9169
9170			// To know if global events are to be dispatched
9171			fireGlobals,
9172
9173			// Loop variable
9174			i,
9175
9176			// uncached part of the url
9177			uncached,
9178
9179			// Create the final options object
9180			s = jQuery.ajaxSetup( {}, options ),
9181
9182			// Callbacks context
9183			callbackContext = s.context || s,
9184
9185			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9186			globalEventContext = s.context &&
9187				( callbackContext.nodeType || callbackContext.jquery ) ?
9188					jQuery( callbackContext ) :
9189					jQuery.event,
9190
9191			// Deferreds
9192			deferred = jQuery.Deferred(),
9193			completeDeferred = jQuery.Callbacks( "once memory" ),
9194
9195			// Status-dependent callbacks
9196			statusCode = s.statusCode || {},
9197
9198			// Headers (they are sent all at once)
9199			requestHeaders = {},
9200			requestHeadersNames = {},
9201
9202			// Default abort message
9203			strAbort = "canceled",
9204
9205			// Fake xhr
9206			jqXHR = {
9207				readyState: 0,
9208
9209				// Builds headers hashtable if needed
9210				getResponseHeader: function( key ) {
9211					var match;
9212					if ( completed ) {
9213						if ( !responseHeaders ) {
9214							responseHeaders = {};
9215							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9216								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9217							}
9218						}
9219						match = responseHeaders[ key.toLowerCase() ];
9220					}
9221					return match == null ? null : match;
9222				},
9223
9224				// Raw string
9225				getAllResponseHeaders: function() {
9226					return completed ? responseHeadersString : null;
9227				},
9228
9229				// Caches the header
9230				setRequestHeader: function( name, value ) {
9231					if ( completed == null ) {
9232						name = requestHeadersNames[ name.toLowerCase() ] =
9233							requestHeadersNames[ name.toLowerCase() ] || name;
9234						requestHeaders[ name ] = value;
9235					}
9236					return this;
9237				},
9238
9239				// Overrides response content-type header
9240				overrideMimeType: function( type ) {
9241					if ( completed == null ) {
9242						s.mimeType = type;
9243					}
9244					return this;
9245				},
9246
9247				// Status-dependent callbacks
9248				statusCode: function( map ) {
9249					var code;
9250					if ( map ) {
9251						if ( completed ) {
9252
9253							// Execute the appropriate callbacks
9254							jqXHR.always( map[ jqXHR.status ] );
9255						} else {
9256
9257							// Lazy-add the new callbacks in a way that preserves old ones
9258							for ( code in map ) {
9259								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9260							}
9261						}
9262					}
9263					return this;
9264				},
9265
9266				// Cancel the request
9267				abort: function( statusText ) {
9268					var finalText = statusText || strAbort;
9269					if ( transport ) {
9270						transport.abort( finalText );
9271					}
9272					done( 0, finalText );
9273					return this;
9274				}
9275			};
9276
9277		// Attach deferreds
9278		deferred.promise( jqXHR );
9279
9280		// Add protocol if not provided (prefilters might expect it)
9281		// Handle falsy url in the settings object (#10093: consistency with old signature)
9282		// We also use the url parameter if available
9283		s.url = ( ( url || s.url || location.href ) + "" )
9284			.replace( rprotocol, location.protocol + "//" );
9285
9286		// Alias method option to type as per ticket #12004
9287		s.type = options.method || options.type || s.method || s.type;
9288
9289		// Extract dataTypes list
9290		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9291
9292		// A cross-domain request is in order when the origin doesn't match the current origin.
9293		if ( s.crossDomain == null ) {
9294			urlAnchor = document.createElement( "a" );
9295
9296			// Support: IE <=8 - 11, Edge 12 - 13
9297			// IE throws exception on accessing the href property if url is malformed,
9298			// e.g. http://example.com:80x/
9299			try {
9300				urlAnchor.href = s.url;
9301
9302				// Support: IE <=8 - 11 only
9303				// Anchor's host property isn't correctly set when s.url is relative
9304				urlAnchor.href = urlAnchor.href;
9305				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9306					urlAnchor.protocol + "//" + urlAnchor.host;
9307			} catch ( e ) {
9308
9309				// If there is an error parsing the URL, assume it is crossDomain,
9310				// it can be rejected by the transport if it is invalid
9311				s.crossDomain = true;
9312			}
9313		}
9314
9315		// Convert data if not already a string
9316		if ( s.data && s.processData && typeof s.data !== "string" ) {
9317			s.data = jQuery.param( s.data, s.traditional );
9318		}
9319
9320		// Apply prefilters
9321		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9322
9323		// If request was aborted inside a prefilter, stop there
9324		if ( completed ) {
9325			return jqXHR;
9326		}
9327
9328		// We can fire global events as of now if asked to
9329		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9330		fireGlobals = jQuery.event && s.global;
9331
9332		// Watch for a new set of requests
9333		if ( fireGlobals && jQuery.active++ === 0 ) {
9334			jQuery.event.trigger( "ajaxStart" );
9335		}
9336
9337		// Uppercase the type
9338		s.type = s.type.toUpperCase();
9339
9340		// Determine if request has content
9341		s.hasContent = !rnoContent.test( s.type );
9342
9343		// Save the URL in case we're toying with the If-Modified-Since
9344		// and/or If-None-Match header later on
9345		// Remove hash to simplify url manipulation
9346		cacheURL = s.url.replace( rhash, "" );
9347
9348		// More options handling for requests with no content
9349		if ( !s.hasContent ) {
9350
9351			// Remember the hash so we can put it back
9352			uncached = s.url.slice( cacheURL.length );
9353
9354			// If data is available, append data to url
9355			if ( s.data ) {
9356				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9357
9358				// #9682: remove data so that it's not used in an eventual retry
9359				delete s.data;
9360			}
9361
9362			// Add or update anti-cache param if needed
9363			if ( s.cache === false ) {
9364				cacheURL = cacheURL.replace( rantiCache, "$1" );
9365				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9366			}
9367
9368			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9369			s.url = cacheURL + uncached;
9370
9371		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9372		} else if ( s.data && s.processData &&
9373			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9374			s.data = s.data.replace( r20, "+" );
9375		}
9376
9377		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9378		if ( s.ifModified ) {
9379			if ( jQuery.lastModified[ cacheURL ] ) {
9380				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9381			}
9382			if ( jQuery.etag[ cacheURL ] ) {
9383				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9384			}
9385		}
9386
9387		// Set the correct header, if data is being sent
9388		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9389			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9390		}
9391
9392		// Set the Accepts header for the server, depending on the dataType
9393		jqXHR.setRequestHeader(
9394			"Accept",
9395			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9396				s.accepts[ s.dataTypes[ 0 ] ] +
9397					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9398				s.accepts[ "*" ]
9399		);
9400
9401		// Check for headers option
9402		for ( i in s.headers ) {
9403			jqXHR.setRequestHeader( i, s.headers[ i ] );
9404		}
9405
9406		// Allow custom headers/mimetypes and early abort
9407		if ( s.beforeSend &&
9408			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9409
9410			// Abort if not done already and return
9411			return jqXHR.abort();
9412		}
9413
9414		// Aborting is no longer a cancellation
9415		strAbort = "abort";
9416
9417		// Install callbacks on deferreds
9418		completeDeferred.add( s.complete );
9419		jqXHR.done( s.success );
9420		jqXHR.fail( s.error );
9421
9422		// Get transport
9423		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9424
9425		// If no transport, we auto-abort
9426		if ( !transport ) {
9427			done( -1, "No Transport" );
9428		} else {
9429			jqXHR.readyState = 1;
9430
9431			// Send global event
9432			if ( fireGlobals ) {
9433				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9434			}
9435
9436			// If request was aborted inside ajaxSend, stop there
9437			if ( completed ) {
9438				return jqXHR;
9439			}
9440
9441			// Timeout
9442			if ( s.async && s.timeout > 0 ) {
9443				timeoutTimer = window.setTimeout( function() {
9444					jqXHR.abort( "timeout" );
9445				}, s.timeout );
9446			}
9447
9448			try {
9449				completed = false;
9450				transport.send( requestHeaders, done );
9451			} catch ( e ) {
9452
9453				// Rethrow post-completion exceptions
9454				if ( completed ) {
9455					throw e;
9456				}
9457
9458				// Propagate others as results
9459				done( -1, e );
9460			}
9461		}
9462
9463		// Callback for when everything is done
9464		function done( status, nativeStatusText, responses, headers ) {
9465			var isSuccess, success, error, response, modified,
9466				statusText = nativeStatusText;
9467
9468			// Ignore repeat invocations
9469			if ( completed ) {
9470				return;
9471			}
9472
9473			completed = true;
9474
9475			// Clear timeout if it exists
9476			if ( timeoutTimer ) {
9477				window.clearTimeout( timeoutTimer );
9478			}
9479
9480			// Dereference transport for early garbage collection
9481			// (no matter how long the jqXHR object will be used)
9482			transport = undefined;
9483
9484			// Cache response headers
9485			responseHeadersString = headers || "";
9486
9487			// Set readyState
9488			jqXHR.readyState = status > 0 ? 4 : 0;
9489
9490			// Determine if successful
9491			isSuccess = status >= 200 && status < 300 || status === 304;
9492
9493			// Get response data
9494			if ( responses ) {
9495				response = ajaxHandleResponses( s, jqXHR, responses );
9496			}
9497
9498			// Convert no matter what (that way responseXXX fields are always set)
9499			response = ajaxConvert( s, response, jqXHR, isSuccess );
9500
9501			// If successful, handle type chaining
9502			if ( isSuccess ) {
9503
9504				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9505				if ( s.ifModified ) {
9506					modified = jqXHR.getResponseHeader( "Last-Modified" );
9507					if ( modified ) {
9508						jQuery.lastModified[ cacheURL ] = modified;
9509					}
9510					modified = jqXHR.getResponseHeader( "etag" );
9511					if ( modified ) {
9512						jQuery.etag[ cacheURL ] = modified;
9513					}
9514				}
9515
9516				// if no content
9517				if ( status === 204 || s.type === "HEAD" ) {
9518					statusText = "nocontent";
9519
9520				// if not modified
9521				} else if ( status === 304 ) {
9522					statusText = "notmodified";
9523
9524				// If we have data, let's convert it
9525				} else {
9526					statusText = response.state;
9527					success = response.data;
9528					error = response.error;
9529					isSuccess = !error;
9530				}
9531			} else {
9532
9533				// Extract error from statusText and normalize for non-aborts
9534				error = statusText;
9535				if ( status || !statusText ) {
9536					statusText = "error";
9537					if ( status < 0 ) {
9538						status = 0;
9539					}
9540				}
9541			}
9542
9543			// Set data for the fake xhr object
9544			jqXHR.status = status;
9545			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9546
9547			// Success/Error
9548			if ( isSuccess ) {
9549				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9550			} else {
9551				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9552			}
9553
9554			// Status-dependent callbacks
9555			jqXHR.statusCode( statusCode );
9556			statusCode = undefined;
9557
9558			if ( fireGlobals ) {
9559				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9560					[ jqXHR, s, isSuccess ? success : error ] );
9561			}
9562
9563			// Complete
9564			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9565
9566			if ( fireGlobals ) {
9567				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9568
9569				// Handle the global AJAX counter
9570				if ( !( --jQuery.active ) ) {
9571					jQuery.event.trigger( "ajaxStop" );
9572				}
9573			}
9574		}
9575
9576		return jqXHR;
9577	},
9578
9579	getJSON: function( url, data, callback ) {
9580		return jQuery.get( url, data, callback, "json" );
9581	},
9582
9583	getScript: function( url, callback ) {
9584		return jQuery.get( url, undefined, callback, "script" );
9585	}
9586} );
9587
9588jQuery.each( [ "get", "post" ], function( i, method ) {
9589	jQuery[ method ] = function( url, data, callback, type ) {
9590
9591		// Shift arguments if data argument was omitted
9592		if ( jQuery.isFunction( data ) ) {
9593			type = type || callback;
9594			callback = data;
9595			data = undefined;
9596		}
9597
9598		// The url can be an options object (which then must have .url)
9599		return jQuery.ajax( jQuery.extend( {
9600			url: url,
9601			type: method,
9602			dataType: type,
9603			data: data,
9604			success: callback
9605		}, jQuery.isPlainObject( url ) && url ) );
9606	};
9607} );
9608
9609
9610jQuery._evalUrl = function( url ) {
9611	return jQuery.ajax( {
9612		url: url,
9613
9614		// Make this explicit, since user can override this through ajaxSetup (#11264)
9615		type: "GET",
9616		dataType: "script",
9617		cache: true,
9618		async: false,
9619		global: false,
9620		"throws": true
9621	} );
9622};
9623
9624
9625jQuery.fn.extend( {
9626	wrapAll: function( html ) {
9627		var wrap;
9628
9629		if ( this[ 0 ] ) {
9630			if ( jQuery.isFunction( html ) ) {
9631				html = html.call( this[ 0 ] );
9632			}
9633
9634			// The elements to wrap the target around
9635			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9636
9637			if ( this[ 0 ].parentNode ) {
9638				wrap.insertBefore( this[ 0 ] );
9639			}
9640
9641			wrap.map( function() {
9642				var elem = this;
9643
9644				while ( elem.firstElementChild ) {
9645					elem = elem.firstElementChild;
9646				}
9647
9648				return elem;
9649			} ).append( this );
9650		}
9651
9652		return this;
9653	},
9654
9655	wrapInner: function( html ) {
9656		if ( jQuery.isFunction( html ) ) {
9657			return this.each( function( i ) {
9658				jQuery( this ).wrapInner( html.call( this, i ) );
9659			} );
9660		}
9661
9662		return this.each( function() {
9663			var self = jQuery( this ),
9664				contents = self.contents();
9665
9666			if ( contents.length ) {
9667				contents.wrapAll( html );
9668
9669			} else {
9670				self.append( html );
9671			}
9672		} );
9673	},
9674
9675	wrap: function( html ) {
9676		var isFunction = jQuery.isFunction( html );
9677
9678		return this.each( function( i ) {
9679			jQuery( this ).wrapAll( i
vendor: 2,399 bytes, lines 9679-9771
9679sFunction ? html.call( this, i ) : html );
9680		} );
9681	},
9682
9683	unwrap: function( selector ) {
9684		this.parent( selector ).not( "body" ).each( function() {
9685			jQuery( this ).replaceWith( this.childNodes );
9686		} );
9687		return this;
9688	}
9689} );
9690
9691
9692jQuery.expr.pseudos.hidden = function( elem ) {
9693	return !jQuery.expr.pseudos.visible( elem );
9694};
9695jQuery.expr.pseudos.visible = function( elem ) {
9696	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9697};
9698
9699
9700
9701
9702jQuery.ajaxSettings.xhr = function() {
9703	try {
9704		return new window.XMLHttpRequest();
9705	} catch ( e ) {}
9706};
9707
9708var xhrSuccessStatus = {
9709
9710		// File protocol always yields status code 0, assume 200
9711		0: 200,
9712
9713		// Support: IE <=9 only
9714		// #1450: sometimes IE returns 1223 when it should be 204
9715		1223: 204
9716	},
9717	xhrSupported = jQuery.ajaxSettings.xhr();
9718
9719support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9720support.ajax = xhrSupported = !!xhrSupported;
9721
9722jQuery.ajaxTransport( function( options ) {
9723	var callback, errorCallback;
9724
9725	// Cross domain only allowed if supported through XMLHttpRequest
9726	if ( support.cors || xhrSupported && !options.crossDomain ) {
9727		return {
9728			send: function( headers, complete ) {
9729				var i,
9730					xhr = options.xhr();
9731
9732				xhr.open(
9733					options.type,
9734					options.url,
9735					options.async,
9736					options.username,
9737					options.password
9738				);
9739
9740				// Apply custom fields if provided
9741				if ( options.xhrFields ) {
9742					for ( i in options.xhrFields ) {
9743						xhr[ i ] = options.xhrFields[ i ];
9744					}
9745				}
9746
9747				// Override mime type if needed
9748				if ( options.mimeType && xhr.overrideMimeType ) {
9749					xhr.overrideMimeType( options.mimeType );
9750				}
9751
9752				// X-Requested-With header
9753				// For cross-domain requests, seeing as conditions for a preflight are
9754				// akin to a jigsaw puzzle, we simply never set it to be sure.
9755				// (it can always be set on a per-request basis or even using ajaxSetup)
9756				// For same-domain requests, won't change header if already provided.
9757				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9758					headers[ "X-Requested-With" ] = "XMLHttpRequest";
9759				}
9760
9761				// Set headers
9762				for ( i in headers ) {
9763					xhr.setRequestHeader( i, headers[ i ] );
9764				}
9765
9766				// Callback
9767				callback = function( type ) {
9768					return function() {
9769						if ( callback ) {
9770							callback = errorCallback = xhr.onload =
9771								xhr.onerror = xhr.onabort = xhr.on
vendor: 5,102 bytes, lines 9771-9976
9771readystatechange = null;
9772
9773							if ( type === "abort" ) {
9774								xhr.abort();
9775							} else if ( type === "error" ) {
9776
9777								// Support: IE <=9 only
9778								// On a manual native abort, IE9 throws
9779								// errors on any property access that is not readyState
9780								if ( typeof xhr.status !== "number" ) {
9781									complete( 0, "error" );
9782								} else {
9783									complete(
9784
9785										// File: protocol always yields status 0; see #8605, #14207
9786										xhr.status,
9787										xhr.statusText
9788									);
9789								}
9790							} else {
9791								complete(
9792									xhrSuccessStatus[ xhr.status ] || xhr.status,
9793									xhr.statusText,
9794
9795									// Support: IE <=9 only
9796									// IE9 has no XHR2 but throws on binary (trac-11426)
9797									// For XHR2 non-text, let the caller handle it (gh-2498)
9798									( xhr.responseType || "text" ) !== "text"  ||
9799									typeof xhr.responseText !== "string" ?
9800										{ binary: xhr.response } :
9801										{ text: xhr.responseText },
9802									xhr.getAllResponseHeaders()
9803								);
9804							}
9805						}
9806					};
9807				};
9808
9809				// Listen to events
9810				xhr.onload = callback();
9811				errorCallback = xhr.onerror = callback( "error" );
9812
9813				// Support: IE 9 only
9814				// Use onreadystatechange to replace onabort
9815				// to handle uncaught aborts
9816				if ( xhr.onabort !== undefined ) {
9817					xhr.onabort = errorCallback;
9818				} else {
9819					xhr.onreadystatechange = function() {
9820
9821						// Check readyState before timeout as it changes
9822						if ( xhr.readyState === 4 ) {
9823
9824							// Allow onerror to be called first,
9825							// but that will not handle a native abort
9826							// Also, save errorCallback to a variable
9827							// as xhr.onerror cannot be accessed
9828							window.setTimeout( function() {
9829								if ( callback ) {
9830									errorCallback();
9831								}
9832							} );
9833						}
9834					};
9835				}
9836
9837				// Create the abort callback
9838				callback = callback( "abort" );
9839
9840				try {
9841
9842					// Do send the request (this may raise an exception)
9843					xhr.send( options.hasContent && options.data || null );
9844				} catch ( e ) {
9845
9846					// #14683: Only rethrow if this hasn't been notified as an error yet
9847					if ( callback ) {
9848						throw e;
9849					}
9850				}
9851			},
9852
9853			abort: function() {
9854				if ( callback ) {
9855					callback();
9856				}
9857			}
9858		};
9859	}
9860} );
9861
9862
9863
9864
9865// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9866jQuery.ajaxPrefilter( function( s ) {
9867	if ( s.crossDomain ) {
9868		s.contents.script = false;
9869	}
9870} );
9871
9872// Install script dataType
9873jQuery.ajaxSetup( {
9874	accepts: {
9875		script: "text/javascript, application/javascript, " +
9876			"application/ecmascript, application/x-ecmascript"
9877	},
9878	contents: {
9879		script: /\b(?:java|ecma)script\b/
9880	},
9881	converters: {
9882		"text script": function( text ) {
9883			jQuery.globalEval( text );
9884			return text;
9885		}
9886	}
9887} );
9888
9889// Handle cache's special case and crossDomain
9890jQuery.ajaxPrefilter( "script", function( s ) {
9891	if ( s.cache === undefined ) {
9892		s.cache = false;
9893	}
9894	if ( s.crossDomain ) {
9895		s.type = "GET";
9896	}
9897} );
9898
9899// Bind script tag hack transport
9900jQuery.ajaxTransport( "script", function( s ) {
9901
9902	// This transport only deals with cross domain requests
9903	if ( s.crossDomain ) {
9904		var script, callback;
9905		return {
9906			send: function( _, complete ) {
9907				script = jQuery( "<script>" ).prop( {
9908					charset: s.scriptCharset,
9909					src: s.url
9910				} ).on(
9911					"load error",
9912					callback = function( evt ) {
9913						script.remove();
9914						callback = null;
9915						if ( evt ) {
9916							complete( evt.type === "error" ? 404 : 200, evt.type );
9917						}
9918					}
9919				);
9920
9921				// Use native DOM manipulation to avoid our domManip AJAX trickery
9922				document.head.appendChild( script[ 0 ] );
9923			},
9924			abort: function() {
9925				if ( callback ) {
9926					callback();
9927				}
9928			}
9929		};
9930	}
9931} );
9932
9933
9934
9935
9936var oldCallbacks = [],
9937	rjsonp = /(=)\?(?=&|$)|\?\?/;
9938
9939// Default jsonp settings
9940jQuery.ajaxSetup( {
9941	jsonp: "callback",
9942	jsonpCallback: function() {
9943		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9944		this[ callback ] = true;
9945		return callback;
9946	}
9947} );
9948
9949// Detect, normalize options and install callbacks for jsonp requests
9950jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9951
9952	var callbackName, overwritten, responseContainer,
9953		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9954			"url" :
9955			typeof s.data === "string" &&
9956				( s.contentType || "" )
9957					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
9958				rjsonp.test( s.data ) && "data"
9959		);
9960
9961	// Handle iff the expected data type is "jsonp" or we have a parameter to set
9962	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9963
9964		// Get callback name, remembering preexisting value associated with it
9965		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
9966			s.jsonpCallback() :
9967			s.jsonpCallback;
9968
9969		// Insert callback into url or form data
9970		if ( jsonProp ) {
9971			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9972		} else if ( s.jsonp !== false ) {
9973			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9974		}
9975
9976		// Use data converter to retrieve json after script execution
vendor: 2,994 bytes, lines 9977-10086
9977		s.converters[ "script json" ] = function() {
9978			if ( !responseContainer ) {
9979				jQuery.error( callbackName + " was not called" );
9980			}
9981			return responseContainer[ 0 ];
9982		};
9983
9984		// Force json dataType
9985		s.dataTypes[ 0 ] = "json";
9986
9987		// Install callback
9988		overwritten = window[ callbackName ];
9989		window[ callbackName ] = function() {
9990			responseContainer = arguments;
9991		};
9992
9993		// Clean-up function (fires after converters)
9994		jqXHR.always( function() {
9995
9996			// If previous value didn't exist - remove it
9997			if ( overwritten === undefined ) {
9998				jQuery( window ).removeProp( callbackName );
9999
10000			// Otherwise restore preexisting value
10001			} else {
10002				window[ callbackName ] = overwritten;
10003			}
10004
10005			// Save back as free
10006			if ( s[ callbackName ] ) {
10007
10008				// Make sure that re-using the options doesn't screw things around
10009				s.jsonpCallback = originalSettings.jsonpCallback;
10010
10011				// Save the callback name for future use
10012				oldCallbacks.push( callbackName );
10013			}
10014
10015			// Call if it was a function and we have a response
10016			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
10017				overwritten( responseContainer[ 0 ] );
10018			}
10019
10020			responseContainer = overwritten = undefined;
10021		} );
10022
10023		// Delegate to script
10024		return "script";
10025	}
10026} );
10027
10028
10029
10030
10031// Support: Safari 8 only
10032// In Safari 8 documents created via document.implementation.createHTMLDocument
10033// collapse sibling forms: the second one becomes a child of the first one.
10034// Because of that, this security measure has to be disabled in Safari 8.
10035// https://bugs.webkit.org/show_bug.cgi?id=137337
10036support.createHTMLDocument = ( function() {
10037	var body = document.implementation.createHTMLDocument( "" ).body;
10038	body.innerHTML = "<form></form><form></form>";
10039	return body.childNodes.length === 2;
10040} )();
10041
10042
10043// Argument "data" should be string of html
10044// context (optional): If specified, the fragment will be created in this context,
10045// defaults to document
10046// keepScripts (optional): If true, will include scripts passed in the html string
10047jQuery.parseHTML = function( data, context, keepScripts ) {
10048	if ( typeof data !== "string" ) {
10049		return [];
10050	}
10051	if ( typeof context === "boolean" ) {
10052		keepScripts = context;
10053		context = false;
10054	}
10055
10056	var base, parsed, scripts;
10057
10058	if ( !context ) {
10059
10060		// Stop scripts or inline event handlers from being executed immediately
10061		// by using document.implementation
10062		if ( support.createHTMLDocument ) {
10063			context = document.implementation.createHTMLDocument( "" );
10064
10065			// Set the base href for the created document
10066			// so any parsed elements with URLs
10067			// are based on the document's URL (gh-2965)
10068			base = context.createElement( "base" );
10069			base.href = document.location.href;
10070			context.head.appendChild( base );
10071		} else {
10072			context = document;
10073		}
10074	}
10075
10076	parsed = rsingleTag.exec( data );
10077	scripts = !keepScripts && [];
10078
10079	// Single tag
10080	if ( parsed ) {
10081		return [ context.createElement( parsed[ 1 ] ) ];
10082	}
10083
10084	parsed = buildFragment( [ data ], context, scripts );
10085
10086	if ( scripts && scripts.length ) {
vendor: 4,095 bytes, lines 10087-10257
10087		jQuery( scripts ).remove();
10088	}
10089
10090	return jQuery.merge( [], parsed.childNodes );
10091};
10092
10093
10094/**
10095 * Load a url into a page
10096 */
10097jQuery.fn.load = function( url, params, callback ) {
10098	var selector, type, response,
10099		self = this,
10100		off = url.indexOf( " " );
10101
10102	if ( off > -1 ) {
10103		selector = stripAndCollapse( url.slice( off ) );
10104		url = url.slice( 0, off );
10105	}
10106
10107	// If it's a function
10108	if ( jQuery.isFunction( params ) ) {
10109
10110		// We assume that it's the callback
10111		callback = params;
10112		params = undefined;
10113
10114	// Otherwise, build a param string
10115	} else if ( params && typeof params === "object" ) {
10116		type = "POST";
10117	}
10118
10119	// If we have elements to modify, make the request
10120	if ( self.length > 0 ) {
10121		jQuery.ajax( {
10122			url: url,
10123
10124			// If "type" variable is undefined, then "GET" method will be used.
10125			// Make value of this field explicit since
10126			// user can override it through ajaxSetup method
10127			type: type || "GET",
10128			dataType: "html",
10129			data: params
10130		} ).done( function( responseText ) {
10131
10132			// Save response for use in complete callback
10133			response = arguments;
10134
10135			self.html( selector ?
10136
10137				// If a selector was specified, locate the right elements in a dummy div
10138				// Exclude scripts to avoid IE 'Permission Denied' errors
10139				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10140
10141				// Otherwise use the full result
10142				responseText );
10143
10144		// If the request succeeds, this function gets "data", "status", "jqXHR"
10145		// but they are ignored because response was set above.
10146		// If it fails, this function gets "jqXHR", "status", "error"
10147		} ).always( callback && function( jqXHR, status ) {
10148			self.each( function() {
10149				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10150			} );
10151		} );
10152	}
10153
10154	return this;
10155};
10156
10157
10158
10159
10160// Attach a bunch of functions for handling common AJAX events
10161jQuery.each( [
10162	"ajaxStart",
10163	"ajaxStop",
10164	"ajaxComplete",
10165	"ajaxError",
10166	"ajaxSuccess",
10167	"ajaxSend"
10168], function( i, type ) {
10169	jQuery.fn[ type ] = function( fn ) {
10170		return this.on( type, fn );
10171	};
10172} );
10173
10174
10175
10176
10177jQuery.expr.pseudos.animated = function( elem ) {
10178	return jQuery.grep( jQuery.timers, function( fn ) {
10179		return elem === fn.elem;
10180	} ).length;
10181};
10182
10183
10184
10185
10186jQuery.offset = {
10187	setOffset: function( elem, options, i ) {
10188		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10189			position = jQuery.css( elem, "position" ),
10190			curElem = jQuery( elem ),
10191			props = {};
10192
10193		// Set position first, in-case top/left are set even on static elem
10194		if ( position === "static" ) {
10195			elem.style.position = "relative";
10196		}
10197
10198		curOffset = curElem.offset();
10199		curCSSTop = jQuery.css( elem, "top" );
10200		curCSSLeft = jQuery.css( elem, "left" );
10201		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10202			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10203
10204		// Need to be able to calculate position if either
10205		// top or left is auto and position is either absolute or fixed
10206		if ( calculatePosition ) {
10207			curPosition = curElem.position();
10208			curTop = curPosition.top;
10209			curLeft = curPosition.left;
10210
10211		} else {
10212			curTop = parseFloat( curCSSTop ) || 0;
10213			curLeft = parseFloat( curCSSLeft ) || 0;
10214		}
10215
10216		if ( jQuery.isFunction( options ) ) {
10217
10218			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10219			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10220		}
10221
10222		if ( options.top != null ) {
10223			props.top = ( options.top - curOffset.top ) + curTop;
10224		}
10225		if ( options.left != null ) {
10226			props.left = ( options.left - curOffset.left ) + curLeft;
10227		}
10228
10229		if ( "using" in options ) {
10230			options.using.call( elem, props );
10231
10232		} else {
10233			curElem.css( props );
10234		}
10235	}
10236};
10237
10238jQuery.fn.extend( {
10239	offset: function( options ) {
10240
10241		// Preserve chaining for setter
10242		if ( arguments.length ) {
10243			return options === undefined ?
10244				this :
10245				this.each( function( i ) {
10246					jQuery.offset.setOffset( this, options, i );
10247				} );
10248		}
10249
10250		var doc, docElem, rect, win,
10251			elem = this[ 0 ];
10252
10253		if ( !elem ) {
10254			return;
10255		}
10256
10257		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
vendor: 4,119 bytes, lines 10258-10396
10258		// Support: IE <=11 only
10259		// Running getBoundingClientRect on a
10260		// disconnected node in IE throws an error
10261		if ( !elem.getClientRects().length ) {
10262			return { top: 0, left: 0 };
10263		}
10264
10265		rect = elem.getBoundingClientRect();
10266
10267		doc = elem.ownerDocument;
10268		docElem = doc.documentElement;
10269		win = doc.defaultView;
10270
10271		return {
10272			top: rect.top + win.pageYOffset - docElem.clientTop,
10273			left: rect.left + win.pageXOffset - docElem.clientLeft
10274		};
10275	},
10276
10277	position: function() {
10278		if ( !this[ 0 ] ) {
10279			return;
10280		}
10281
10282		var offsetParent, offset,
10283			elem = this[ 0 ],
10284			parentOffset = { top: 0, left: 0 };
10285
10286		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10287		// because it is its only offset parent
10288		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10289
10290			// Assume getBoundingClientRect is there when computed position is fixed
10291			offset = elem.getBoundingClientRect();
10292
10293		} else {
10294
10295			// Get *real* offsetParent
10296			offsetParent = this.offsetParent();
10297
10298			// Get correct offsets
10299			offset = this.offset();
10300			if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
10301				parentOffset = offsetParent.offset();
10302			}
10303
10304			// Add offsetParent borders
10305			parentOffset = {
10306				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
10307				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
10308			};
10309		}
10310
10311		// Subtract parent offsets and element margins
10312		return {
10313			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10314			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10315		};
10316	},
10317
10318	// This method will return documentElement in the following cases:
10319	// 1) For the element inside the iframe without offsetParent, this method will return
10320	//    documentElement of the parent window
10321	// 2) For the hidden or detached element
10322	// 3) For body or html element, i.e. in case of the html node - it will return itself
10323	//
10324	// but those exceptions were never presented as a real life use-cases
10325	// and might be considered as more preferable results.
10326	//
10327	// This logic, however, is not guaranteed and can change at any point in the future
10328	offsetParent: function() {
10329		return this.map( function() {
10330			var offsetParent = this.offsetParent;
10331
10332			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10333				offsetParent = offsetParent.offsetParent;
10334			}
10335
10336			return offsetParent || documentElement;
10337		} );
10338	}
10339} );
10340
10341// Create scrollLeft and scrollTop methods
10342jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10343	var top = "pageYOffset" === prop;
10344
10345	jQuery.fn[ method ] = function( val ) {
10346		return access( this, function( elem, method, val ) {
10347
10348			// Coalesce documents and windows
10349			var win;
10350			if ( jQuery.isWindow( elem ) ) {
10351				win = elem;
10352			} else if ( elem.nodeType === 9 ) {
10353				win = elem.defaultView;
10354			}
10355
10356			if ( val === undefined ) {
10357				return win ? win[ prop ] : elem[ method ];
10358			}
10359
10360			if ( win ) {
10361				win.scrollTo(
10362					!top ? val : win.pageXOffset,
10363					top ? val : win.pageYOffset
10364				);
10365
10366			} else {
10367				elem[ method ] = val;
10368			}
10369		}, method, val, arguments.length );
10370	};
10371} );
10372
10373// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10374// Add the top/left cssHooks using jQuery.fn.position
10375// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10376// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10377// getComputedStyle returns percent when specified for top/left/bottom/right;
10378// rather than make the css module depend on the offset module, just check for it here
10379jQuery.each( [ "top", "left" ], function( i, prop ) {
10380	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10381		function( elem, computed ) {
10382			if ( computed ) {
10383				computed = curCSS( elem, prop );
10384
10385				// If curCSS returns percentage, fallback to offset
10386				return rnumnonpx.test( computed ) ?
10387					jQuery( elem ).position()[ prop ] + "px" :
10388					computed;
10389			}
10390		}
10391	);
10392} );
10393
10394
10395// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10396jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10397	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10398		function( defaultExtra, funcName ) {
10399
10400		// Margin is only for outerHeight, outerWidth
10401		jQuery.fn[ funcName ] = function( margin, value ) {
10402			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10403				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10404
10405			return access( this, function( elem, type, value ) {
10406				var doc;
10407
10408				if ( jQuery.isWindow( elem ) ) {
10409
10410					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10411					return funcName.indexOf( "outer" ) === 0 ?
10412						elem[ "inner" + name ] :
10413						elem.document.documentElement[ "client" + name ];
10414				}
10415
10416				// Get document width or height
10417				if ( elem.nodeType === 9 ) {
10418					doc = elem.documentElement;
10419
10420					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10421					// whichever is greatest
10422					return Math.max(
10423						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10424						elem.body[ "offset" + name ], doc[ "offset" + name ],
10425						doc[ "client" + name ]
10426					);
10427				}
10428
10429				return value === undefined ?
10430
10431					// Get width or height on the element, requesting but not forcing parseFloat
10432					jQuery.css( elem, type, extra ) :
10433
10434					// Set width or height on the element
10435					jQuery.style( elem, type, value, extra );
10436			}, type, chainable ? margin : undefined, chainable );
10437		};
10438	} );
10439} );
10440
10441
10442jQuery.fn.extend( {
10443
10444	bind: function( types, data, fn ) {
10445		return this.on( types, null, data, fn );
10446	},
10447	unbind: function( types, fn ) {
10448		return this.off( types, null, fn );
10449	},
10450
10451	delegate: function( selector, types, data, fn ) {
10452		return this.on( types, selector, data, fn );
10453	},
10454	undelegate: function( selector, types, fn ) {
10455
10456		// ( namespace ) or ( selector, types [, fn] )
10457		return arguments.length === 1 ?
10458			this.off( selector, "**" ) :
10459			this.off( types, selector || "**", fn );
10460	}
10461} );
10462
10463jQuery.holdReady = function( hold ) {
10464	if ( hold ) {
10465		jQuery.readyWait++;
10466	} else {
10467		jQuery.ready( true );
10468	}
10469};
10470jQuery.isArray = Array.isArray;
10471jQuery.parseJSON = JSON.parse;
10472jQuery.nodeName = nodeName;
10473
10474
10475
10476
10477// Register as a named AMD module, since jQuery can be concatenated with other
10478// files that may use define, but not via a proper concatenation script that
10479// understands anonymous AMD modules. A named AMD is safest and most robust
10480// way to register. Lowercase jquery is used because AMD module names are
10481// derived from file names, and jQuery is normally delivered in a lowercase
10482// file name. Do this after creating the global so that if an AMD module wants
10483// to call noConflict to hide this version of jQuery, it will work.
10484
10485// Note that for maximum portability, libraries that are not jQuery should
10486// declare themselves as anonymous modules, and avoid setting a global if an
10487// AMD loader is present. jQuery is a special case. For more information, see
10488// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10489
10490if ( typeof define === "function" && define.amd ) {
10491	define( "jquery", [], function() {
10492		return jQuery;
10493	} );
10494}
10495
10496
10497
10498
10499var
10500
10501	// Map over jQuery in case of overwrite
10502	_jQuery = window.jQuery,
10503
10504	// Map over the $ in case of overwrite
10505	_$ = window.$;
10506
10507jQuery.noConflict = function( deep ) {
10508	if ( window.$ === jQuery ) {
10509		window.$ = _$;
10510	}
10511
10512	if ( deep && window.jQuery === jQuery ) {
10513		window.jQuery = _jQuery;
10514	}
10515
10516	return jQuery;
10517};
10518
10519// Expose jQuery and $ identifiers, even in AMD
10520// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10521// and CommonJS for browser emulators (#13566)
10522if ( !noGlobal ) {
10523	window.jQuery = window.$ = jQuery;
10524}
10525
10526
10527
10528
10529return jQuery;
10530} );
10531
10532; browserify_shim__define__module__export__(typeof $ != "undefined" ? $ : window.$);
10533
10534}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; });
10535
10536}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
10537},{}],4:[function(require,module,exports){
10538(function(root, factory) {
10539
10540	if (root === null) {
10541		throw new Error('Google-maps package can be used only in browser');
10542	}
10543
10544	if (typeof define === 'function' && define.amd) {
10545		define(factory);
10546	} else if (typeof exports === 'object') {
10547		module.exports = factory();
10548	} else {
10549		root.GoogleMapsLoader = factory();
10550	}
10551
10552})(typeof window !== 'undefined' ? window : null, function() {
10553
10554
10555	'use strict';
10556
10557
10558	var googleVersion = '3.18';
10559
10560	var script = null;
10561
10562	var google = null;
10563
10564	var loading = false;
10565
10566	var callbacks = [];
10567
10568	var onLoadEvents = [];
10569
10570	var originalCreateLoaderMethod = null;
10571
10572
10573	var GoogleMapsLoader = {};
10574
10575
10576	GoogleMapsLoader.URL = 'https://maps.googleapis.com/maps/api/js';
10577
10578	GoogleMapsLoader.KEY = null;
10579
10580	GoogleMapsLoader.LIBRARIES = [];
10581
10582	GoogleMapsLoader.CLIENT = null;
10583
10584	GoogleMapsLoader.CHANNEL = null;
10585
10586	GoogleMapsLoader.SENSOR = null;
10587
10588	GoogleMapsLoader.VERSION = googleVersion;
10589
10590	GoogleMapsLoader.WINDOW_CALLBACK_NAME = '__google_maps_api_provider_initializator__';
10591
10592
10593	GoogleMapsLoader._googleMockApiObject = {};
10594
10595
10596	GoogleMapsLoader.load = function(fn) {
10597		if (google === null) {
10598			if (loading === true) {
10599				if (fn) {
10600					callbacks.push(fn);
10601				}
10602			} else {
10603				loading = true;
10604
10605				window[GoogleMapsLoader.WINDOW_CALLBACK_NAME] = function() {
10606					ready(fn);
10607				};
10608
10609				GoogleMapsLoader.createLoader();
10610			}
10611		} else if (fn) {
10612			fn(google);
10613		}
10614
10615		var promiseError = function() {
10616			throw new Error('Using promises is not supported anymore. Please take a look in new documentation and use callback instead.');
10617		};
10618
10619		return {
10620			then: promiseError,
10621			catch: promiseError,
10622			fail: promiseError
10623		};
10624	};
10625
10626
10627	GoogleMapsLoader.createLoader = function() {
10628		script = document.createElement('script');
10629		script.type = 'text/javascript';
10630		script.src = GoogleMapsLoader.createUrl();
10631
10632		document.body.appendChild(script);
10633	};
10634
10635
10636	GoogleMapsLoader.isLoaded = function() {
10637		return google !== null;
10638	};
10639
10640
10641	GoogleMapsLoader.createUrl = function() {
10642		var url = GoogleMapsLoader.URL;
10643
10644		url += '?callback=' + GoogleMapsLoader.WINDOW_CALLBACK_NAME;
10645
10646		url += '&sensor=' + ((GoogleMapsLoader.SENSOR === true || GoogleMapsLoader.SENSOR === 'true') ? 'true' : 'false');
10647
10648		if (GoogleMapsLoader.KEY) {
10649			url += '&key=' + GoogleMapsLoader.KEY;
10650		}
10651
10652		if (GoogleMapsLoader.LIBRARIES.length > 0) {
10653			url += '&libraries=' + GoogleMapsLoader.LIBRARIES.join(',');
10654		}
10655
10656		if (GoogleMapsLoader.CLIENT) {
10657			url += '&client=' + GoogleMapsLoader.CLIENT + '&v=' + GoogleMapsLoader.VERSION;
10658		}
10659
10660		if (GoogleMapsLoader.CHANNEL) {
10661			url += '&channel=' + GoogleMapsLoader.CHANNEL;
10662		}
10663
10664		return url;
10665	};
10666
10667
10668	GoogleMapsLoader.release = function(fn) {
10669		var release = function() {
10670			GoogleMapsLoader.KEY = null;
10671			GoogleMapsLoader.LIBRARIES = [];
10672			GoogleMapsLoader.CLIENT = null;
10673			GoogleMapsLoader.SENSOR = false;
10674			GoogleMapsLoader.VERSION = googleVersion;
10675
10676			google = null;
10677			loading = false;
10678			callbacks = [];
10679			onLoadEvents = [];
10680
10681			if (typeof window.google !== 'undefined') {
10682				delete window.google;
10683			}
10684
10685			if (typeof window[GoogleMapsLoader.WINDOW_CALLBACK_NAME] !== 'undefined') {
10686				delete window[GoogleMapsLoader.WINDOW_CALLBACK_NAME];
10687			}
10688
10689			if (originalCreateLoaderMethod !== null) {
10690				GoogleMapsLoader.createLoader = originalCreateLoaderMethod;
10691				originalCreateLoaderMethod = null;
10692			}
10693
10694			if (script !== null) {
10695				script.parentElement.removeChild(script);
10696				script = null;
10697			}
10698
10699			fn();
10700		};
10701
10702		if (loading) {
10703			GoogleMapsLoader.load(function() {
10704				release();
10705			});
10706		} else {
10707			release();
10708		}
10709	};
10710
10711
10712	GoogleMapsLoader.onLoad = function(fn) {
10713		onLoadEvents.push(fn);
10714	};
10715
10716
10717	GoogleMapsLoader.makeMock = function() {
10718		originalCreateLoaderMethod = GoogleMapsLoader.createLoader;
10719
10720		GoogleMapsLoader.createLoader = function() {
10721			window.google = GoogleMapsLoader._googleMockApiObject;
10722			window[GoogleMapsLoader.WINDOW_CALLBACK_NAME]();
10723		};
10724	};
10725
10726
10727	var ready = function(fn) {
10728		var i;
10729
10730		loading = false;
10731
10732		if (google === null) {
10733			google = window.google;
10734		}
10735
10736		for (i = 0; i < onLoadEvents.length; i++) {
10737			onLoadEvents[i](google);
10738		}
10739
10740		if (fn) {
10741			fn(google);
10742		}
10743
10744		for (i = 0; i < callbacks.length; i++) {
10745			callbacks[i](google);
10746		}
10747
10748		callbacks = [];
10749	};
10750
10751
10752	return GoogleMapsLoader;
10753
10754});
10755
10756},{}],5:[function(require,module,exports){
10757/*!
10758 * SVGInjector v2.0.36 - Fast, caching, dynamic inline SVG DOM injection library
10759 * https://github.com/flobacher/SVGInjector2
10760 * forked from:
10761 * https://github.com/iconic/SVGInjector
10762 *
10763 * Copyright (c) 2015 flobacher <[email protected]>
10764 * @license MIT
10765 *
10766 * original Copyright (c) 2014 Waybury <[email protected]>
10767 * @license MIT
10768 */
10769!function(e,t){"use strict";var n=function(){function n(e){n.instanceCounter++,this.init(e)}var r,s,i,l,a,o,c,u,f,p,d,m,g,v,h,y,b,S,A,C,x,N,k,w,j,E,I,T,G,V="http://www.w3.org/2000/svg",F="http://www.w3.org/1999/xlink",O="sprite",L=O+"--",q=[O],M="icon";return i=[],n.instanceCounter=0,n.prototype.init=function(n){n=n||{},r={},o={},o.isLocal="file:"===e.location.protocol,o.hasSvgSupport=t.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1"),s={count:0,elements:[]},l={},a={},a.evalScripts=n.evalScripts||"always",a.pngFallback=n.pngFallback||!1,a.onlyInject
10769VisiblePart=n.onlyInjectVisiblePart||!0,a.keepStylesClass="undefined"==typeof n.keepStylesClass?"":n.keepStylesClass,a.spriteClassName="undefined"==typeof n.spriteClassName?O:n.spriteClassName,a.spriteClassIdName="undefined"==typeof n.spriteClassIdName?L:n.spriteClassIdName,a.removeStylesClass="undefined"==typeof n.removeStylesClass?M:n.removeStylesClass,a.removeAllStyles="undefined"!=typeof n.removeAllStyles&&n.removeAllStyles,a.fallbackClassName="undefined"==typeof n.fallbackClassName?q:n.fallbackClassName,a.prefixStyleTags="undefined"==typeof n.prefixStyleTags||n.prefixStyleTags,a.spritesheetURL="undefined"!=typeof n.spritesheetURL&&""!==n.spritesheetURL&&n.spritesheetURL,a.prefixFragIdClass=a.spriteClassIdName,a.forceFallbacks="undefined"!=typeof n.forceFallbacks&&n.forceFallbacks,a.forceFallbacks&&(o.hasSvgSupport=!1),x(t.querySelector("html"),"no-svg",o.hasSvgSupport),o.hasSvgSupport&&"undefined"==typeof n.removeStylesClass&&C(a.removeStylesClass)},n.prototype.inject=function(e,t,n){if(void 0!==e.length){var r=0,s=this;I.call(e,function(i){s.injectElement(i,function(s){n&&"function"==typeof n&&n(s),t&&e.length===++r&&t(r)})})}else e?this.injectElement(e,function(r){n&&"function"==typeof n&&n(r),t&&t(1),e=null}):t&&t(0)},n.prototype.injectElement=function(e,t){var n,r=e.getAttribute("data-src")||e.getAttribute("src");if(!r){if(!a.spritesheetURL)return;if(n=h(e),""===n)return;r=a.spritesheetURL+"#"+n}e.setAttribute("data-src",r);var i=r.split("#");1===i.length&&i.push("");var l;if(!/\.svg/i.test(r))return void t("Attempted to inject a file with a non-svg extension: "+r);if(!o.hasSvgSupport){var f=e.getAttribute("data-fallback")||e.getAttribute("data-png");return void(f?(e.setAttribute("src",f),t(null)):a.pngFallback?(i.length>1&&i[1]?(l=i[1]+".png",j(a.fallbackClassName)?c(e,i[1],a.fallbackClassName):w(a.fallbackClassName)?a.fallbackClassName(e,i[1]):"string"==typeof a.fallbackClassName?E(e,a.fallbackClassName):e.setAttribute("src",a.pngFallback+"/"+l)):(l=r.split("/").pop().replace(".svg",".png"),e.setAttribute("src",a.pngFallback+"/"+l)),t(null)):t("This browser does not support SVG and no PNG fallback was defined."))}j(a.fallbackClassName)&&u(e,i[1],a.fallbackClassName),s.elements.indexOf(e)===-1&&(s.elements.push(e),A(t,r,e))},n.prototype.getEnv=function(){return o},n.prototype.getConfig=function(){return a},c=function(e,t,n){var r="undefined"==typeof n?q:n.slice(0);I.call(r,function(e,n){r[n]=e.replace("%s",t)}),E(e,r)},u=function(e,t,n){n="undefined"==typeof n?q.slice(0):n.slice(0);var r,s,i=e.getAttribute("class");"undefined"!=typeof i&&null!==i&&(s=i.split(" "),s&&(I.call(n,function(e){e=e.replace("%s",t),r=s.indexOf(e),r>=0&&(s[r]="")}),e.setAttribute("class",k(s.join(" ")))))},p=function(e,t,n,r){var s=0;return e.textContent=e.textContent.replace(/url\(('|")*#.+('|")*(?=\))/g,function(e){return s++,e+"-"+t}),s},f=function(e,t){var n,r,s,i,l,a,o,c,u,f,p,d,m,g,v,h,y=[{def:"linearGradient",attrs:["fill","stroke"]},{def:"radialGradient",attrs:["fill","stroke"]},{def:"clipPath",attrs:["clip-path"]},{def:"mask",attrs:["mask"]},{def:"filter",attrs:["filter"]},{def:"color-profile",attrs:["color-profile"]},{def:"cursor",attrs:["cursor"]},{def:"marker",attrs:["marker","marker-start","marker-mid","marker-end"]}];I.call(y,function(y){for(r=e.querySelectorAll(y.def+"[id]"),i=0,s=r.length;i<s;i++){for(n=r[i].id+"-"+t,c=y.attrs,f=0,u=c.length;f<u;f++)for(l=e.querySelectorAll("["+c[f]+'="url(#'+r[i].id+')"]'),o=0,a=l.length;o<a;o++)l[o].setAttribute(c[f],"url(#"+n+")");for(p=e.querySelectorAll("[*|href]"),g=[],m=0,d=p.length;m<d;m++)p[m].getAttributeNS(F,"href").toString()==="#"+r[i].id&&g.push(p[m]);for(h=0,v=g.length;h<v;h++)g[h].setAttributeNS(F,"href","#"+n);r[i].id=n}})},d=function(e,t,n){var r;"undefined"==typeof n&&(n=["id","viewBox"]);for(var s=0;s<e.attributes.length;s++)r=e.attributes.item(s),n.indexOf(r.name)<0&&t.setAttribute(r.name,r.value)},m=function(e){var n=t.createElementNS(V,"svg");return I.call(e.childNodes,function(e){n.appendChild(e.cloneNode(!0))}),d(e,n),n},g=function(e,t,n){var r,s,i,l,a,o,c=n.getAttribute("data-src").split("#"),u=e.textContent,f="",p=function(e,t,n){n[t]="."+i+" "+e};if(c.length>1)s=c[1],i=s+"-"+t,r=new RegExp("\\."+s+" ","g"),e.textContent=u.replace(r,"."+i+" ");else{for(l=c[0].split("/"),i=l[l.length-1].replace(".svg","")+"-"+t,r=new RegExp("([\\s\\S]*?){([\\s\\S]*?)}","g");null!==(a=r.exec(u));){o=a[1].trim().split(", "),o.forEach(p);var d=o.join(", ")+"{"+a[2]+"}\n";f+=d}e.textContent=f}n.setAttribute("class",n.getAttribute("class")+" "+i)},v=function(e){var t=e.getAttribute("class");return t?t.trim().split(" "):[]},h=function(e){var t=v(e),n="";return I.call(t,function(e){e.indexOf(a.spriteClassIdName)>=0&&(n=e.replace(a.spriteClassIdName,""))}),n},y=function(e,t,n){var r,s,i,l,a,o,c,u=!1,f=null;if(void 0===n)return t.cloneNode(!0);if(r=t.getElementById(n)){if(l=r.getAttribute("viewBox"),i=l.split(" "),r instanceof SVGSymbolElement)s=m(r),u=!0;
10769else if(r instanceof SVGViewElement){if(f=null,e.onlyInjectVisiblePart){var p='*[width="'+i[2]+'"][height="'+i[3]+'"]';a={},0===Math.abs(parseInt(i[0]))?p+=":not([x])":(a.x=i[0],p+='[x="'+i[0]+'"]'),0===Math.abs(parseInt(i[1]))?p+=":not([y])":(a.y=i[1],p+='[y="'+i[1]+'"]'),c=t.querySelectorAll(p),c.length>1,f=c[0]}if(f&&f instanceof SVGSVGElement){s=f.cloneNode(!0);for(var d in a)"width"!==d&&"height"!==d&&s.removeAttribute(d)}else if(f&&f instanceof SVGUseElement){var g=t.getElementById(f.getAttributeNS(F,"href").substr(1));s=m(g),l=g.getAttribute("viewBox"),i=l.split(" "),u=!0}else u=!0,s=t.cloneNode(!0)}u&&(s.setAttribute("viewBox",i.join(" ")),s.setAttribute("width",i[2]+"px"),s.setAttribute("height",i[3]+"px")),s.setAttribute("xmlns",V),s.setAttribute("xmlns:xlink",F),o=v(s);var h=e.prefixFragIdClass+n;return o.indexOf(h)<0&&(o.push(h),s.setAttribute("class",o.join(" "))),s}},b=function(e,t,n,r){i[e]=i[e]||[],i[e].push({callback:n,fragmentId:t,element:r,name:name})},S=function(e){for(var t,n=0,r=i[e].length;n<r;n++)!function(n){setTimeout(function(){t=i[e][n],N(e,t.fragmentId,t.callback,t.element,t.name)},0)}(n)},A=function(t,n,s){var i,l,a,c,u;if(i=n.split("#"),l=i[0],a=2===i.length?i[1]:void 0,"undefined"!=typeof a&&(u=l.split("/"),c=u[u.length-1].replace(".svg","")),void 0!==r[l])r[l]instanceof SVGSVGElement?N(l,a,t,s,c):b(l,a,t,s,c);else{if(!e.XMLHttpRequest)return t("Browser does not support XMLHttpRequest"),!1;r[l]={},b(l,a,t,s,c);var f=new XMLHttpRequest;f.onreadystatechange=function(){if(4===f.readyState){if(404===f.status||null===f.responseXML)return t("Unable to load SVG file: "+l),!1;if(!(200===f.status||o.isLocal&&0===f.status))return t("There was a problem injecting the SVG: "+f.status+" "+f.statusText),!1;if(f.responseXML instanceof Document)r[l]=f.responseXML.documentElement;else if(DOMParser&&DOMParser instanceof Function){var e;try{var s=new DOMParser;e=s.parseFromString(f.responseText,"text/xml")}catch(t){e=void 0}if(!e||e.getElementsByTagName("parsererror").length)return t("Unable to parse SVG file: "+n),!1;r[l]=e.documentElement}S(l)}},f.open("GET",l),f.overrideMimeType&&f.overrideMimeType("text/xml"),f.send()}},C=function(e){var n="svg."+e+" {fill: currentColor;}",r=t.head||t.getElementsByTagName("head")[0],s=t.createElement("style");s.type="text/css",s.styleSheet?s.styleSheet.cssText=n:s.appendChild(t.createTextNode(n)),r.appendChild(s)},x=function(e,t,n){n?e.className.replace(t,""):e.className+=" "+t},N=function(t,n,i,o,c){var u,m,h,b;if(u=y(a,r[t],n),"undefined"==typeof u||"string"==typeof u)return i(u),!1;u.setAttribute("role","img"),I.call(u.children||[],function(e){e instanceof SVGDefsElement||e instanceof SVGTitleElement||e instanceof SVGDescElement||e.setAttribute("role","presentation")}),b=o.getAttribute("aria-hidden")||u.getAttribute("aria-hidden"),h=T("desc",u,o,n,c,!b),m=T("title",u,o,n,c,!b),b?u.setAttribute("aria-hidden","true"):u.setAttribute("aria-labelledby",m+" "+h),d(o,u,["class"]);var S=[].concat(u.getAttribute("class")||[],"injected-svg",o.getAttribute("class")||[]).join(" ");u.setAttribute("class",k(S)),f(u,s.count,c),u.removeAttribute("xmlns:a");for(var A,C,x=u.querySelectorAll("script"),N=[],w=0,j=x.length;w<j;w++)C=x[w].getAttribute("type"),C&&"application/ecmascript"!==C&&"application/javascript"!==C||(A=x[w].innerText||x[w].textContent,N.push(A),u.removeChild(x[w]));if(N.length>0&&("always"===a.evalScripts||"once"===a.evalScripts&&!l[t])){for(var E=0,G=N.length;E<G;E++)new Function(N[E])(e);l[t]=!0}var V=u.querySelectorAll("style");I.call(V,function(e){var t=v(u),n=!0;(t.indexOf(a.removeStylesClass)>=0||a.removeAllStyles)&&t.indexOf(a.keepStylesClass)<0?e.parentNode.removeChild(e):(p(e,s.count,u,c)>0&&(n=!1),a.prefixStyleTags&&(g(e,s.count,u,c),n=!1),n&&(e.textContent+=""))}),o.parentNode.replaceChild(u,o),delete s.elements[s.elements.indexOf(o)],s.count++,i(u)},k=function(e){e=e.split(" ");for(var t={},n=e.length,r=[];n--;)t.hasOwnProperty(e[n])||(t[e[n]]=1,r.unshift(e[n]));return r.join(" ")},w=function(e){return!!(e&&e.constructor&&e.call&&e.apply)},j=function(e){return"[object Array]"===Object.prototype.toString.call(e)},E=function(e,t){var n=e.getAttribute("class");n=n?n:"",j(t)&&(t=t.join(" ")),t=n+" "+t,e.setAttribute("class",k(t))},I=Array.prototype.forEach||function(e,t){if(void 0===this||null===this||"function"!=typeof e)throw new TypeError;var n,r=this.length>>>0;for(n=0;n<r;++n)n in this&&e.call(t,this[n],n,this)},T=function(e,t,n,r,i){var l,a=r?r+"-":"";return a+=e+"-"+s.count,l=n.querySelector(e),l?G(e,t,l.textContent,a,t.firstChild):(l=t.querySelector(e),l?l.setAttribute("id",a):i?G(e,t,r,a,t.firstChild):a=""),a},G=function(e,n,r,s,i){var l,a=n.querySelector(e);return a&&a.parentNode.removeChild(a),l=t.createElementNS(V,e),l.a
10769ppendChild(t.createTextNode(r)),l.setAttribute("id",s),n.insertBefore(l,i),l},n}();"object"==typeof angular?angular.module("svginjector",[]).provider("svgInjectorOptions",function(){var e={};return{set:function(t){e=t},$get:function(){return e}}}).factory("svgInjectorFactory",["svgInjectorOptions",function(e){return new n(e)}]).directive("svg",["svgInjectorFactory",function(e){var t=e.getConfig();return{restrict:"E",link:function(n,r,s){s.class&&s.class.indexOf(t.spriteClassIdName)>=0?s.$observe("class",function(){e.inject(r[0])}):(s.dataSrc||s.src)&&e.inject(r[0])}}}]):"object"==typeof module&&"object"==typeof module.exports?module.exports=n:"function"==typeof define&&define.amd?define(function(){return n}):"object"==typeof e&&(e.SVGInjector=n)}(window,document);
10770//# sourceMappingURL=./dist/svg-injector.map.js
10771},{}],6:[function(require,module,exports){
10772// Make this the only JS file you include in the body
10773// Include external libs with 'require' calls
10774
10775require('jquery');
10776var SVGInjector = require('svg-injector-2');
10777// require('underscore');
10778
10779// Gives 'console' polyfills to browsers that don't use 'console'
10780require('./lib/console-support.js');
10781
10782// Tracks outbound-link activity through Google Analytics
10783require('./lib/outbound.js');
10784
10785var CF = require('./lib/contact_form.js');
10786
10787require('./lib/menu.js');
10788
10789require('./lib/maps.js');
10790
10791require('./lib/django-csrf.js');
10792
10793require('./lib/favorites.js');
10794
10795// require('./lib/social-share.js');
10796
10797require('./lib/facebook-share.js');
10798
10799require('./lib/request_animation_frame_polyfill.js');
10800
10801//TODO Get slick working with browserify
10802//var sliders = require("./lib/sliders.js");
10803//sliders.init();
10804
10805$(document).ready(function(){
10806	new SVGInjector().inject($('img[src$=".svg"].svg_replace'));
10807
10808	$('input, textarea').blur(function(e) {
10809		var inpt = $(e.target);
10810		if (e.target.value.trim() === '') {
10811			inpt.removeClass('input--filled');
10812		} else {
10813			inpt.addClass('input--filled');
10814		}
10815	});
10816	CF($('.contact_form'));
10817
10818    var filter_list = $('.category_nav__filter_list');
10819    var filter_toggle = $('.open-filter-list');
10820    filter_list.slideUp();
10821    filter_toggle.click(function() {filter_list.slideToggle(); filter_toggle.toggleClass('button--white--active');});
10822
10823});
10824$(function() {
10825    if (location.hash != "") {
10826        $('body,html').animate({
10827            scrollTop: $(location.hash).offset().top
10828        }, 1000)
10829    }
10830    $('a[href^="#"]').on('click', function(e) {
10831        e.preventDefault();
10832        var hash = e.target.href.split('#')[1];
10833        if (hash.length > 1) {
10834            $('body,html').animate({
10835                scrollTop: $('#' + hash).offset().top
10836            }, 1000)
10837        }
10838    })
10839});
10840},{"./lib/console-support.js":7,"./lib/contact_form.js":8,"./lib/django-csrf.js":9,"./lib/facebook-share.js":10,"./lib/favorites.js":11,"./lib/maps.js":12,"./lib/menu.js":13,"./lib/outbound.js":14,"./lib/request_animation_frame_polyfill.js":15,"jquery":3,"svg-injector-2":5}],7:[function(require,module,exports){
10841// Avoid `console` errors in browsers that lack a console.
10842(function() {
10843  var method;
10844  var noop = function () {};
10845  var methods = [
10846    'assert', 'clear', 'count', 'debug', 'dir', 'dirxml',
10847    'error',
10848    'exception', 'group', 'groupCollapsed',
10849    'groupEnd', 'info', 'log',
10850    'markTimeline', 'profile', 'profileEnd',
10851    'table', 'time', 'timeEnd',
10852    'timeline', 'timelineEnd',
10853    'timeStamp', 'trace', 'warn'
10854  ];
10855  var length = methods.length;
10856  var console = (window.console = window.console || {});
10857
10858  while (length--) {
10859    method = methods[length];
10860
10861    // Only stub undefined methods.
10862    if (!console[method]) {
10863      console[method] = noop;
10864    }
10865  }
10866}());
10867
10868},{}],8:[function(require,module,exports){
10869var CF = function(form) {
10870	CF.form = form;
10871	$('.open-contact-form').click(CF.open_form);
10872	$('.close-contact-form').click(CF.close_form);
10873    var form_elem = CF.form.find('form');
10874    $('#contactForm').submit(function(ev) {
10875        // Prevent the form from actually submitting
10876        ev.preventDefault();
10877
10878        // Get the post data
10879        var data = $(this).serialize();
10880 		data['userEmail'] = data['fromEmail'];
10881        // Send it to the server
10882        $.ajax({
10883            url: '/',  
10884            data: data, 
10885            type: 'POST', 
10886            success: function(response) {
10887                if (response.success) {
10888                    form_elem.html('<p>' + "Your message has been sent. If a reply is necessary, we'll be in touch soon." + '</p>')
10889                } else {
10890                    // response.error will be an object containing any validation errors that occurred, indexed by field name
10891                    // e.g. response.error.fromName => ['From Name is required']
10892                    alert('An error occurred. Please try again.');
10893                }
10894            }
10895        });
10896    });
10897
10898
10899    // form_elem.find(':submit').click(function(e) {
10900    //     var buttonvalue = $(e.target).val();
10901    //     var values = form_elem.serialize();
10902    //     values = values + '&contact_submit=' + buttonvalue;
10903    //     e.preventDefault();
10904    //     $.post(form_elem.attr('action'), values)
10905    //         .done(function(xhr, textStatus) {
10906    //             form_elem.html('<p>' + xhr.messages[0] + '</p>')
10907    //         })
10908    //         .fail(function(xhr, textStatus) {
10909    //             resp = JSON.parse(xhr.responseText);
10910    //             $('[id^=errors_]').empty();
10911    //             for(key in resp.messages.errors) {
10912    //                 var field = $('[for=id_' + key + ']');
10913    //                 var errors_list = $('#errors_' + key);
10914    //                 if (!errors_list.length > 0) {
10915    //                     errors_list = $('<ul id="errors_' + key + '" />');
10916    //                 }
10917    //                 errors_list.append($('<li>' + resp.messages.errors[key] + '</li>')[0]);
10918    //                 errors_list.insertAfter(field);
10919    //             }
10920    //         });
10921    // })
10922};
10923CF.set_focus = function() {
10924	if (arguments.length = 1) {
10925		// a specific target was provided
10926		$(arguments[0]).focus()
10927	} else {
10928		// form has just opened
10929		CF.form.find('input:first-of-type').focus();
10930	}
10931};
10932CF.open_form = function(event) {
10933	CF.last_focus = event.target;
10934	CF.form.removeClass('hidden');
10935    $('html, body').animate({
10936        scrollTop: $(CF.form).offset().top
10937    }, 500);
10938	CF.form.attr('aria-hidden', 'false');
10939	CF.set_focus();
10940};
10941CF.close_form = function() {
10942	CF.form.addClass('hidden');
10943	CF.form.attr('aria-hidden', 'true');
10944	CF.set_focus(CF.last_focus);
10945};
10946
10947module.exports = CF;
10948
10949
10950},{}],9:[function(require,module,exports){
10951function getCookie(name) {
10952    var cookieValue = null;
10953    if (document.cookie && document.cookie != '') {
10954        var cookies = document.cookie.split(';');
10955        for (var i = 0; i < cookies.length; i++) {
10956            var cookie = jQuery.trim(cookies[i]);
10957            // Does this cookie string begin with the name we want?
10958            if (cookie.substring(0, name.length + 1) == (name + '=')) {
10959                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
10960                break;
10961            }
10962        }
10963    }
10964    return cookieValue;
10965}
10966var csrftoken = getCookie('csrftoken');
10967
10968function csrfSafeMethod(method) {
10969    // these HTTP methods do not require CSRF protection
10970    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
10971}
10972$.ajaxSetup({
10973    beforeSend: function(xhr, settings) {
10974        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
10975            xhr.setRequestHeader("X-CSRFToken", csrftoken);
10976        }
10977    }
10978});
10979
10980},{}],10:[function(require,module,exports){
10981window.fbAsyncInit = function() {
10982    FB.init({
10983        appId: '245652388911288',
10984        version: 'v2.9'
10985    });
10986    var url = document.location.href;
10987    $('.facebook_share').click(function (event) {
10988        FB.ui({
10989            method: 'share',
10990            href: url
10991        }, function (response) {});
10992    });
10993};
10994},{}],11:[function(require,module,exports){
10995$(document).ready(function() {
10996    var api_url = 'http://api.oklahomaagritourism.com/api';
10997    $('.favorites_toggle').each(function (i, e) {
10998        $(e).click(function (event) {
10999            var button = $(event.target);
11000            var producer_id = button.closest('.activities__item').data('id');
11001            var post_url = api_url + '/favorites/';
11002            if (button.hasClass('favorited')) {
11003                //remove favorite
11004                $.ajax({
11005                    url: post_url,
11006                    method: 'DELETE',
11007                    data: {
11008                        'producer_id': producer_id,
11009                        'session_id': window.craftSessionId
11010                    }
11011                }).done(function() {
11012                    button.removeClass('favorited');
11013                })
11014            } else {
11015                $.post(post_url, {
11016                        'producer_id': producer_id,
11017                        'session_id': window.craftSessionId
11018                    }).done(function() {
11019                    button.addClass('favorited');
11020                })
11021            }
11022        })
11023    });
11024    $('.favorites_remove').each(function(i, e) {
11025        $(e).click(function(event) {
11026            var producer_id = $(event.target).closest('.producer_list__item').data('id');
11027            var post_url = api_url + '/favorites/';
11028            $.ajax({
11029                url: post_url,
11030                method: 'DELETE',
11031                    data: {
11032                        'producer_id': producer_id,
11033                        'session_id': window.craftSessionId
11034                    }
11035            }).done(function() { 
11036                location.reload();
11037            })
11038        })
11039    });
11040    $('.producer_favorites_toggle').each(function(i, e) {
11041        $(e).click(function(event) {
11042            var button = $(event.target);
11043            var producer_id = $(button).data('id');
11044            var post_url = api_url + '/favorites/';
11045            if (button.hasClass('favorited')) {
11046                //remove favorite
11047                $.ajax({
11048                    url: post_url,
11049                    method: 'DELETE',
11050                    data: {
11051                        'producer_id': producer_id,
11052                        'session_id': window.craftSessionId
11053                    }
11054                }).done(function() {
11055                    button.removeClass('favorited');
11056                    button.text('Add to My Favorites');
11057                })
11058            } else {
11059                $.post(post_url,{
11060                        'producer_id': producer_id,
11061                        'session_id': window.craftSessionId
11062                    }).done(function() {
11063                    button.addClass('favorited');
11064                    button.text('Remove from My Favorites');
11065                })
11066            }
11067        })
11068    })
11069});
11070},{}],12:[function(require,module,exports){
11071
11072require('FixedFixed');
11073require('FixedSticky');
11074FixedSticky.tests.sticky = false;
11075var GoogleMapsLoader = require('google-maps');
11076function getInfoWindowContent(activity) {
11077    return "<h1>" + activity['name'] + "</h1><a href='/producer/" + activity['url'] + "'>View Producer Details</a>";
11078}
11079$(document).ready(function() {
11080    if (document.getElementById('map')) {
11081        GoogleMapsLoader.KEY = 'AIzaSyAiiOzVPuSPsMSFMskvDjJiKtrJUKNzD-8';
11082        GoogleMapsLoader.SENSOR = false;
11083        GoogleMapsLoader.LIBRARIES = [];
11084        GoogleMapsLoader.load(function(google) {
11085
11086            var icon = {
11087                url: '//api.oklahomaagritourism.com/static/producers/images/map_highlight.png',
11088                size: new google.maps.Size(40,49),
11089                origin: new google.maps.Point(0,0),
11090                anchor: new google.maps.Point(20,49)
11091            };
11092            var activity_items = [];
11093            $.map($('.activities__item').not('.map_hidden'), function(activity__item) {
11094                var act = $(activity__item);
11095                activity_items.push({
11096                    'lat': act.data('lat'),
11097                    'lon': act.data('lon'),
11098                    'name': act.data('name'),
11099                    'url': act.data('url')
11100                });
11101            });
11102            var map = new google.maps.Map(document.getElementById('map'), {
11103                'scrollwheel': false,
11104                'streetViewControl': false
11105                //'draggable': false
11106            });
11107
11108            var infoWindow = new google.maps.InfoWindow();
11109            var map_bounds = new google.maps.LatLngBounds();
11110            for (var key in activity_items) {
11111                var position = new google.maps.LatLng(activity_items[key]['lat'], activity_items[key]['lon']);
11112                map_bounds.extend(position);
11113                var marker = new google.maps.Marker({
11114                    'position': position,
11115                    'map': map,
11116                    'title': activity_items[key]['name'],
11117                    'icon': icon
11118                });
11119                google.maps.event.addListener(marker, 'click', (function (marker, key) {
11120                    return function () {
11121                        infoWindow.setContent(getInfoWindowContent(activity_items[key]));
11122                        infoWindow.open(map, marker);
11123                    }
11124                })(marker, key));
11125            }
11126            map.fitBounds(map_bounds);
11127            google.maps.event.addDomListener(window, 'resize', function () {
11128                map.fitBounds(map_bounds);
11129            });
11130        });
11131    }
11132    if (document.getElementById('favorites_map')) {
11133
11134        $('.fixedsticky').each(function(i, e) {
11135            var elem = $(e);
11136            elem.css(
11137                {'width': elem.parent().width()}
11138            );
11139        }).fixedsticky();
11140
11141        resize_map = function(previous_width) {
11142            var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
11143            if (typeof previous_width === 'undefined') {
11144                previous_width = width;
11145            }
11146            if (width != previous_width) {
11147                $('.fixedsticky').each(function(i, e) {
11148                    var elem = $(e);
11149                    var new_value = elem.parent().width();
11150                    elem.css(
11151                        {'width': new_value, 'height': new_value}
11152                    );
11153                })
11154            }
11155            window.requestAnimationFrame(function() {
11156                resize_map(width);
11157            })
11158        };
11159        window.requestAnimationFrame(resize_map);
11160        GoogleMapsLoader.KEY = 'AIzaSyAiiOzVPuSPsMSFMskvDjJiKtrJUKNzD-8';
11161        GoogleMapsLoader.SENSOR = false;
11162        GoogleMapsLoader.LIBRARIES = [];
11163        GoogleMapsLoader.load(function(google) {
11164            var activity_items = [];
11165            $.map($('.producer_list__item').not('.map_hidden'), function(activity__item) {
11166                var act = $(activity__item);
11167                activity_items.push({
11168                    'elem': act,
11169                    'lat': act.data('lat'),
11170                    'lon': act.data('lon'),
11171                    'name': act.data('name'),
11172                    'url': '/producer' + act.data('url'),
11173                    'hidden': act.hasClass('map_hidden')
11174                });
11175            });
11176            if (activity_items.length) {
11177                var map = new google.maps.Map(document.getElementById('favorites_map'), {
11178                    'scrollwheel': false,
11179                    'streetViewControl': false,
11180                    'draggable': false
11181                });
11182
11183
11184                var standard_icon = {
11185                    url: '//api.oklahomaagritourism.com/static/producers/images/map_standard.png',
11186                    size: new google.maps.Size(40,49),
11187                    origin: new google.maps.Point(0,0),
11188                    anchor: new google.maps.Point(20,49)
11189                };
11190                var highlight_icon = {
11191                    url: '//api.oklahomaagritourism.com/static/producers/images/map_highlight.png',
11192                    size: new google.maps.Size(40,49),
11193                    origin: new google.maps.Point(0,0),
11194                    anchor: new google.maps.Point(20,49)
11195                };
11196                //var infoWindow = new google.maps.InfoWindow();
11197                var map_bounds = new google.maps.LatLngBounds();
11198
11199                for (var g=0; g< activity_items.length;g++) {
11200                    if (activity_items[g]['lat'] && activity_items[g]['lon']) {
11201                        var position = new google.maps.LatLng(activity_items[g]['lat'], activity_items[g]['lon']);
11202                        map_bounds.extend(position);
11203                        var marker = new google.maps.Marker({
11204                            'position': position,
11205                            'map': map,
11206                            'title': activity_items[g]['name'],
11207                            'icon': standard_icon
11208                        });
11209                        activity_items[g]['marker'] = marker;
11210                        activity_items[g]['elem'].on('mouseover', {marker: marker}, function (e) {
11211                            map.panTo(e.data.marker.position);
11212                            e.data.marker.setIcon(highlight_icon);
11213                            e.data.marker.setZIndex(google.maps.Marker.MAX_ZINDEX + 1);
11214                        }).on('mouseout', {marker: marker}, function (e) {
11215                            e.data.marker.setIcon(standard_icon);
11216                            e.data.marker.setZIndex(1);
11217                        }).on('mouseleave', function (e) {
11218                            //map.fitBounds(map_bounds);
11219                            map.panTo(map_bounds.getCenter());
11220                        });
11221                    }
11222                }
11223                map.fitBounds(map_bounds);
11224                google.maps.event.addDomListener(window, 'resize', function () {
11225                    map.fitBounds(map_bounds);
11226                });
11227            }
11228        });
11229    }
11230});
11231},{"FixedFixed":1,"FixedSticky":2,"google-maps":4}],13:[function(require,module,exports){
11232$(function() {
11233    var toggle = $('.menu_toggle');
11234    var menu = toggle.next('.nav_container');
11235    toggle.on('click', function() {
11236        toggle.toggleClass('open');
11237        menu.toggleClass('visible');
11238    });
11239    $('.nav__nav_item--has_children > a, .nav__nav_item--has_children > .nav__toggle').on('click', function(e) {
11240        $(this).parent().toggleClass('open');
11241        $(this).next('.nav--secondary').toggleClass('open');
11242    })
11243});
11244},{}],14:[function(require,module,exports){
11245function _gaLt(event){
11246  var el = event.srcElement || event.target;
11247
11248  /* Loop up the DOM tree through parent elements if clicked element is not a link (eg: an image inside a link) */
11249  while(el && (typeof el.tagName == 'undefined' || el.tagName.toLowerCase() != 'a' || !el.href)){
11250    el = el.parentNode;
11251  }
11252
11253  if(el && el.href){
11254    if(el.href.indexOf(location.host) == -1){ /* external link */
11255      /* HitCallback function to either open link in either same or new window */
11256      var hitBack = function(link, target){
11257        target ? window.open(link, target) : window.location.href = link;
11258      };
11259      /* link */
11260      var link = el.href;
11261      /* Is target set and not _(self|parent|top)? */
11262      var target = (el.target && !el.target.match(/^_(self|parent|top)$/i)) ? el.target : false;
11263      /* send event with callback */
11264      ga(
11265          "send", "event", "Outgoing Links", link,
11266          document.location.pathname + document.location.search,
11267          {"hitCallback": hitBack(link, target)}
11268        );
11269
11270      /* Prevent standard click */
11271      event.preventDefault ? event.preventDefault() : event.returnValue = !1;
11272    }
11273
11274  }
11275}
11276
11277/* Attach the event to all clicks in the document after page has loaded */
11278var w = window;
11279w.addEventListener ? w.addEventListener("load",function(){document.body.addEventListener("click",_gaLt,!1)},!1)
11280: w.attachEvent && w.attachEvent("onload",function(){document.body.attachEvent("onclick",_gaLt)});
11281
11282},{}],15:[function(require,module,exports){
11283//// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
11284//// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
11285//
11286//// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
11287//
11288//// MIT license
11289//
11290//(function() {
11291//    var lastTime = 0;
11292//    var vendors = ['ms', 'moz', 'webkit', 'o'];
11293//    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
11294//        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
11295//        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
11296//                                   || window[vendors[x]+'CancelRequestAnimationFrame'];
11297//    }
11298//
11299//    if (!window.requestAnimationFrame)
11300//        window.requestAnimationFrame = function(callback, element) {
11301//            var currTime = new Date().getTime();
11302//            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
11303//            var id = window.setTimeout(function() { callback(currTime + timeToCall); },
11304//              timeToCall);
11305//            lastTime = currTime + timeToCall;
11306//            return id;
11307//        };
11308//
11309//    if (!window.cancelAnimationFrame)
11310//        window.cancelAnimationFrame = function(id) {
11311//            clearTimeout(id);
11312//        };
11313//}());
11314},{}]},{},[6]);

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.