New Upstream Snapshot - lightbox2.js

Ready changes

Summary

Merged new upstream version: 2.11.3+git20200706.1.56b06ac+dfsg (was: 2.11.3+dfsg).

Resulting package

Built on 2023-01-11T10:11 (took 3m0s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots libjs-lightbox2

Diff

diff --git a/debian/changelog b/debian/changelog
index c3ee8ac..58bfc1f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+lightbox2.js (2.11.3+git20200706.1.56b06ac+dfsg-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Wed, 11 Jan 2023 10:10:05 -0000
+
 lightbox2.js (2.11.3+dfsg-3) unstable; urgency=medium
 
   * Team upload
diff --git a/dist/css/lightbox.css b/dist/css/lightbox.css
new file mode 100644
index 0000000..b3b0beb
--- /dev/null
+++ b/dist/css/lightbox.css
@@ -0,0 +1,204 @@
+body.lb-disable-scrolling {
+  overflow: hidden;
+}
+
+.lightboxOverlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 9999;
+  background-color: black;
+  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
+  opacity: 0.8;
+  display: none;
+}
+
+.lightbox {
+  position: absolute;
+  left: 0;
+  width: 100%;
+  z-index: 10000;
+  text-align: center;
+  line-height: 0;
+  font-weight: normal;
+  outline: none;
+}
+
+.lightbox .lb-image {
+  display: block;
+  height: auto;
+  max-width: inherit;
+  max-height: none;
+  border-radius: 3px;
+
+  /* Image border */
+  border: 4px solid white;
+}
+
+.lightbox a img {
+  border: none;
+}
+
+.lb-outerContainer {
+  position: relative;
+  *zoom: 1;
+  width: 250px;
+  height: 250px;
+  margin: 0 auto;
+  border-radius: 4px;
+
+  /* Background color behind image.
+     This is visible during transitions. */
+  background-color: white;
+}
+
+.lb-outerContainer:after {
+  content: "";
+  display: table;
+  clear: both;
+}
+
+.lb-loader {
+  position: absolute;
+  top: 43%;
+  left: 0;
+  height: 25%;
+  width: 100%;
+  text-align: center;
+  line-height: 0;
+}
+
+.lb-cancel {
+  display: block;
+  width: 32px;
+  height: 32px;
+  margin: 0 auto;
+  background: url(../images/loading.gif) no-repeat;
+}
+
+.lb-nav {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: 100%;
+  z-index: 10;
+}
+
+.lb-container > .nav {
+  left: 0;
+}
+
+.lb-nav a {
+  outline: none;
+  background-image: url('data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');
+}
+
+.lb-prev, .lb-next {
+  height: 100%;
+  cursor: pointer;
+  display: block;
+}
+
+.lb-nav a.lb-prev {
+  width: 34%;
+  left: 0;
+  float: left;
+  background: url(../images/prev.png) left 48% no-repeat;
+  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
+  opacity: 0;
+  -webkit-transition: opacity 0.6s;
+  -moz-transition: opacity 0.6s;
+  -o-transition: opacity 0.6s;
+  transition: opacity 0.6s;
+}
+
+.lb-nav a.lb-prev:hover {
+  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+  opacity: 1;
+}
+
+.lb-nav a.lb-next {
+  width: 64%;
+  right: 0;
+  float: right;
+  background: url(../images/next.png) right 48% no-repeat;
+  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
+  opacity: 0;
+  -webkit-transition: opacity 0.6s;
+  -moz-transition: opacity 0.6s;
+  -o-transition: opacity 0.6s;
+  transition: opacity 0.6s;
+}
+
+.lb-nav a.lb-next:hover {
+  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+  opacity: 1;
+}
+
+.lb-dataContainer {
+  margin: 0 auto;
+  padding-top: 5px;
+  *zoom: 1;
+  width: 100%;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+
+.lb-dataContainer:after {
+  content: "";
+  display: table;
+  clear: both;
+}
+
+.lb-data {
+  padding: 0 4px;
+  color: #ccc;
+}
+
+.lb-data .lb-details {
+  width: 85%;
+  float: left;
+  text-align: left;
+  line-height: 1.1em;
+}
+
+.lb-data .lb-caption {
+  font-size: 13px;
+  font-weight: bold;
+  line-height: 1em;
+}
+
+.lb-data .lb-caption a {
+  color: #4ae;
+}
+
+.lb-data .lb-number {
+  display: block;
+  clear: left;
+  padding-bottom: 1em;
+  font-size: 12px;
+  color: #999999;
+}
+
+.lb-data .lb-close {
+  display: block;
+  float: right;
+  width: 30px;
+  height: 30px;
+  background: url(../images/close.png) top right no-repeat;
+  text-align: right;
+  outline: none;
+  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
+  opacity: 0.7;
+  -webkit-transition: opacity 0.2s;
+  -moz-transition: opacity 0.2s;
+  -o-transition: opacity 0.2s;
+  transition: opacity 0.2s;
+}
+
+.lb-data .lb-close:hover {
+  cursor: pointer;
+  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+  opacity: 1;
+}
diff --git a/dist/css/lightbox.min.css b/dist/css/lightbox.min.css
new file mode 100644
index 0000000..adbaa83
--- /dev/null
+++ b/dist/css/lightbox.min.css
@@ -0,0 +1 @@
+.lb-loader,.lightbox{text-align:center;line-height:0;position:absolute;left:0}body.lb-disable-scrolling{overflow:hidden}.lightboxOverlay{position:absolute;top:0;left:0;z-index:9999;background-color:#000;filter:alpha(Opacity=80);opacity:.8;display:none}.lightbox{width:100%;z-index:10000;font-weight:400;outline:0}.lightbox .lb-image{display:block;height:auto;max-width:inherit;max-height:none;border-radius:3px;border:4px solid #fff}.lightbox a img{border:none}.lb-outerContainer{position:relative;width:250px;height:250px;margin:0 auto;border-radius:4px;background-color:#fff}.lb-outerContainer:after{content:"";display:table;clear:both}.lb-loader{top:43%;height:25%;width:100%}.lb-cancel{display:block;width:32px;height:32px;margin:0 auto;background:url(../images/loading.gif) no-repeat}.lb-nav{position:absolute;top:0;left:0;height:100%;width:100%;z-index:10}.lb-container>.nav{left:0}.lb-nav a{outline:0;background-image:url(data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==)}.lb-next,.lb-prev{height:100%;cursor:pointer;display:block}.lb-nav a.lb-prev{width:34%;left:0;float:left;background:url(../images/prev.png) left 48% no-repeat;filter:alpha(Opacity=0);opacity:0;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;-o-transition:opacity .6s;transition:opacity .6s}.lb-nav a.lb-prev:hover{filter:alpha(Opacity=100);opacity:1}.lb-nav a.lb-next{width:64%;right:0;float:right;background:url(../images/next.png) right 48% no-repeat;filter:alpha(Opacity=0);opacity:0;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;-o-transition:opacity .6s;transition:opacity .6s}.lb-nav a.lb-next:hover{filter:alpha(Opacity=100);opacity:1}.lb-dataContainer{margin:0 auto;padding-top:5px;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.lb-dataContainer:after{content:"";display:table;clear:both}.lb-data{padding:0 4px;color:#ccc}.lb-data .lb-details{width:85%;float:left;text-align:left;line-height:1.1em}.lb-data .lb-caption{font-size:13px;font-weight:700;line-height:1em}.lb-data .lb-caption a{color:#4ae}.lb-data .lb-number{display:block;clear:left;padding-bottom:1em;font-size:12px;color:#999}.lb-data .lb-close{display:block;float:right;width:30px;height:30px;background:url(../images/close.png) top right no-repeat;text-align:right;outline:0;filter:alpha(Opacity=70);opacity:.7;-webkit-transition:opacity .2s;-moz-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.lb-data .lb-close:hover{cursor:pointer;filter:alpha(Opacity=100);opacity:1}
\ No newline at end of file
diff --git a/dist/images/close.png b/dist/images/close.png
new file mode 100644
index 0000000..20baa1d
Binary files /dev/null and b/dist/images/close.png differ
diff --git a/dist/images/loading.gif b/dist/images/loading.gif
new file mode 100644
index 0000000..5087c2a
Binary files /dev/null and b/dist/images/loading.gif differ
diff --git a/dist/images/next.png b/dist/images/next.png
new file mode 100644
index 0000000..08365ac
Binary files /dev/null and b/dist/images/next.png differ
diff --git a/dist/images/prev.png b/dist/images/prev.png
new file mode 100644
index 0000000..329fa98
Binary files /dev/null and b/dist/images/prev.png differ
diff --git a/dist/js/lightbox-plus-jquery.js b/dist/js/lightbox-plus-jquery.js
new file mode 100644
index 0000000..61d7c97
--- /dev/null
+++ b/dist/js/lightbox-plus-jquery.js
@@ -0,0 +1,11153 @@
+/*!
+ * jQuery JavaScript Library v3.4.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2019-05-01T21:04Z
+ */
+( function( global, factory ) {
+
+	"use strict";
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+      // Support: Chrome <=57, Firefox <=52
+      // In some browsers, typeof returns "function" for HTML <object> elements
+      // (i.e., `typeof document.createElement( "object" ) === "function"`).
+      // We don't want to classify *any* DOM node as a function.
+      return typeof obj === "function" && typeof obj.nodeType !== "number";
+  };
+
+
+var isWindow = function isWindow( obj ) {
+		return obj != null && obj === obj.window;
+	};
+
+
+
+
+	var preservedScriptAttributes = {
+		type: true,
+		src: true,
+		nonce: true,
+		noModule: true
+	};
+
+	function DOMEval( code, node, doc ) {
+		doc = doc || document;
+
+		var i, val,
+			script = doc.createElement( "script" );
+
+		script.text = code;
+		if ( node ) {
+			for ( i in preservedScriptAttributes ) {
+
+				// Support: Firefox 64+, Edge 18+
+				// Some browsers don't support the "nonce" property on scripts.
+				// On the other hand, just using `getAttribute` is not enough as
+				// the `nonce` attribute is reset to an empty string whenever it
+				// becomes browsing-context connected.
+				// See https://github.com/whatwg/html/issues/2369
+				// See https://html.spec.whatwg.org/#nonce-attributes
+				// The `node.getAttribute` check was added for the sake of
+				// `jQuery.globalEval` so that it can fake a nonce-containing node
+				// via an object.
+				val = node[ i ] || node.getAttribute && node.getAttribute( i );
+				if ( val ) {
+					script.setAttribute( i, val );
+				}
+			}
+		}
+		doc.head.appendChild( script ).parentNode.removeChild( script );
+	}
+
+
+function toType( obj ) {
+	if ( obj == null ) {
+		return obj + "";
+	}
+
+	// Support: Android <=2.3 only (functionish RegExp)
+	return typeof obj === "object" || typeof obj === "function" ?
+		class2type[ toString.call( obj ) ] || "object" :
+		typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+	version = "3.4.1",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// Support: Android <=4.0 only
+	// Make sure we trim BOM and NBSP
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+
+		// Return all the elements in a clean array
+		if ( num == null ) {
+			return slice.call( this );
+		}
+
+		// Return just the one element from the set
+		return num < 0 ? this[ num + this.length ] : this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: arr.sort,
+	splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// Skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !isFunction( target ) ) {
+		target = {};
+	}
+
+	// Extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the base object
+			for ( name in options ) {
+				copy = options[ name ];
+
+				// Prevent Object.prototype pollution
+				// Prevent never-ending loop
+				if ( name === "__proto__" || target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
+					src = target[ name ];
+
+					// Ensure proper type for the source value
+					if ( copyIsArray && !Array.isArray( src ) ) {
+						clone = [];
+					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+						clone = {};
+					} else {
+						clone = src;
+					}
+					copyIsArray = false;
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	isPlainObject: function( obj ) {
+		var proto, Ctor;
+
+		// Detect obvious negatives
+		// Use toString instead of jQuery.type to catch host objects
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+			return false;
+		}
+
+		proto = getProto( obj );
+
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
+		if ( !proto ) {
+			return true;
+		}
+
+		// Objects with prototype are plain iff they were constructed by a global Object function
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	// Evaluates a script in a global context
+	globalEval: function( code, options ) {
+		DOMEval( code, { nonce: options && options.nonce } );
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Support: Android <=4.0 only
+	trim: function( text ) {
+		return text == null ?
+			"" :
+			( text + "" ).replace( rtrim, "" );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
+	},
+
+	// Support: Android <=4.0 only, PhantomJS 1 only
+	// push.apply(_, arraylike) throws on ancient WebKit
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		for ( ; j < len; j++ ) {
+			first[ i++ ] = second[ j ];
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+	// Support: real iOS 8.2 only (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = toType( obj );
+
+	if ( isFunction( obj ) || isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.4
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2019-04-08
+ */
+(function( window ) {
+
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	nonnativeSelectorCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf as it's faster than native
+	// https://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+		"*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+	rdescend = new RegExp( whitespace + "|>" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rhtml = /HTML$/i,
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+
+	// CSS escapes
+	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+	funescape = function( _, escaped, escapedWhitespace ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		// Support: Firefox<24
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			high < 0 ?
+				// BMP codepoint
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// CSS string/identifier serialization
+	// https://drafts.csswg.org/cssom/#common-serializing-idioms
+	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+	fcssescape = function( ch, asCodePoint ) {
+		if ( asCodePoint ) {
+
+			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+			if ( ch === "\0" ) {
+				return "\uFFFD";
+			}
+
+			// Control characters and (dependent upon position) numbers get escaped as code points
+			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+		}
+
+		// Other potentially-special ASCII characters get backslash-escaped
+		return "\\" + ch;
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	},
+
+	inDisabledFieldset = addCombinator(
+		function( elem ) {
+			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+		},
+		{ dir: "parentNode", next: "legend" }
+	);
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		(arr = slice.call( preferredDoc.childNodes )),
+		preferredDoc.childNodes
+	);
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			push_native.apply( target, slice.call(els) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+			// Can't trust NodeList.length
+			while ( (target[j++] = els[i++]) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+
+		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+			setDocument( context );
+		}
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+				// ID selector
+				if ( (m = match[1]) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( (elem = context.getElementById( m )) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && (elem = newContext.getElementById( m )) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[2] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( (m = match[3]) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!nonnativeSelectorCache[ selector + " " ] &&
+				(!rbuggyQSA || !rbuggyQSA.test( selector )) &&
+
+				// Support: IE 8 only
+				// Exclude object elements
+				(nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
+
+				newSelector = selector;
+				newContext = context;
+
+				// qSA considers elements outside a scoping root when evaluating child or
+				// descendant combinators, which is not what we want.
+				// In such cases, we work around the behavior by prefixing every selector in the
+				// list with an ID selector referencing the scope context.
+				// Thanks to Andrew Dupont for this technique.
+				if ( nodeType === 1 && rdescend.test( selector ) ) {
+
+					// Capture the context ID, setting it first if necessary
+					if ( (nid = context.getAttribute( "id" )) ) {
+						nid = nid.replace( rcssescape, fcssescape );
+					} else {
+						context.setAttribute( "id", (nid = expando) );
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = "#" + nid + " " + toSelector( groups[i] );
+					}
+					newSelector = groups.join( "," );
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+				}
+
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch ( qsaError ) {
+					nonnativeSelectorCache( selector, true );
+				} finally {
+					if ( nid === expando ) {
+						context.removeAttribute( "id" );
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key + " " ] = value);
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+	var el = document.createElement("fieldset");
+
+	try {
+		return !!fn( el );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( el.parentNode ) {
+			el.parentNode.removeChild( el );
+		}
+		// release memory in IE
+		el = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split("|"),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[i] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			a.sourceIndex - b.sourceIndex;
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+	return function( elem ) {
+
+		// Only certain elements can match :enabled or :disabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+		if ( "form" in elem ) {
+
+			// Check for inherited disabledness on relevant non-disabled elements:
+			// * listed form-associated elements in a disabled fieldset
+			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+			// * option elements in a disabled optgroup
+			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+			// All such elements have a "form" property.
+			if ( elem.parentNode && elem.disabled === false ) {
+
+				// Option elements defer to a parent optgroup if present
+				if ( "label" in elem ) {
+					if ( "label" in elem.parentNode ) {
+						return elem.parentNode.disabled === disabled;
+					} else {
+						return elem.disabled === disabled;
+					}
+				}
+
+				// Support: IE 6 - 11
+				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
+				return elem.isDisabled === disabled ||
+
+					// Where there is no isDisabled, check manually
+					/* jshint -W018 */
+					elem.isDisabled !== !disabled &&
+						inDisabledFieldset( elem ) === disabled;
+			}
+
+			return elem.disabled === disabled;
+
+		// Try to winnow out elements that can't be disabled before trusting the disabled property.
+		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+		// even exist on them, let alone have a boolean value.
+		} else if ( "label" in elem ) {
+			return elem.disabled === disabled;
+		}
+
+		// Remaining elements are neither :enabled nor :disabled
+		return false;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	var namespace = elem.namespaceURI,
+		docElem = (elem.ownerDocument || elem).documentElement;
+
+	// Support: IE <=8
+	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+	// https://bugs.jquery.com/ticket/4833
+	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, subWindow,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9-11, Edge
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	if ( preferredDoc !== document &&
+		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+		// Support: IE 11, Edge
+		if ( subWindow.addEventListener ) {
+			subWindow.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( subWindow.attachEvent ) {
+			subWindow.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert(function( el ) {
+		el.className = "i";
+		return !el.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( el ) {
+		el.appendChild( document.createComment("") );
+		return !el.getElementsByTagName("*").length;
+	});
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programmatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( el ) {
+		docElem.appendChild( el ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	});
+
+	// ID filter and find
+	if ( support.getById ) {
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var elem = context.getElementById( id );
+				return elem ? [ elem ] : [];
+			}
+		};
+	} else {
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+
+		// Support: IE 6 - 7 only
+		// getElementById is not reliable as a find shortcut
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var node, i, elems,
+					elem = context.getElementById( id );
+
+				if ( elem ) {
+
+					// Verify the id attribute
+					node = elem.getAttributeNode("id");
+					if ( node && node.value === id ) {
+						return [ elem ];
+					}
+
+					// Fall back on getElementsByName
+					elems = context.getElementsByName( id );
+					i = 0;
+					while ( (elem = elems[i++]) ) {
+						node = elem.getAttributeNode("id");
+						if ( node && node.value === id ) {
+							return [ elem ];
+						}
+					}
+				}
+
+				return [];
+			}
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See https://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( el ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// https://bugs.jquery.com/ticket/12359
+			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !el.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push("~=");
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !el.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibling-combinator selector` fails
+			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push(".#.+[+~]");
+			}
+		});
+
+		assert(function( el ) {
+			el.innerHTML = "<a href='' disabled='disabled'></a>" +
+				"<select disabled='disabled'><option/></select>";
+
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			el.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( el.querySelectorAll("[name=d]").length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( el.querySelectorAll(":enabled").length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Support: IE9-11+
+			// IE's :disabled selector does not pick up the children of disabled fieldsets
+			docElem.appendChild( el ).disabled = true;
+			if ( el.querySelectorAll(":disabled").length !== 2 ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			el.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( el ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( el, "*" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( el, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+			// Choose the first element that is related to our preferred document
+			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+				return -1;
+			}
+			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+			return a === document ? -1 :
+				b === document ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!nonnativeSelectorCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch (e) {
+			nonnativeSelectorCache( expr, true );
+		}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.escape = function( sel ) {
+	return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( (elem = results[i++]) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		while ( (node = elem[i++]) ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[6] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] ) {
+				match[2] = match[4] || match[5] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() { return true; } :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || (node[ expando ] = {});
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								(outerCache[ node.uniqueID ] = {});
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+							// Use previously-cached element index if available
+							if ( useCache ) {
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || (node[ expando ] = {});
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									(outerCache[ node.uniqueID ] = {});
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+								// Use the same loop as above to seek `elem` from the start
+								while ( (node = ++nodeIndex && node && node[ dir ] ||
+									(diff = nodeIndex = 0) || start.pop()) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] || (node[ expando ] = {});
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												(outerCache[ node.uniqueID ] = {});
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					// Don't keep the element (issue #299)
+					input[0] = null;
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifier
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": createDisabledPseudo( false ),
+		"disabled": createDisabledPseudo( true ),
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ?
+				argument + length :
+				argument > length ?
+					length :
+					argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( (tokens = []) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push({
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			});
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push({
+					value: matched,
+					type: type,
+					matches: match
+				});
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		skip = combinator.next,
+		key = skip || dir,
+		checkNonElements = base && key === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+			return false;
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+						if ( skip && skip === elem.nodeName.toLowerCase() ) {
+							elem = elem[ dir ] || elem;
+						} else if ( (oldCache = uniqueCache[ key ]) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return (newCache[ 2 ] = oldCache[ 2 ]);
+						} else {
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ key ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			return false;
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+				len = elems.length;
+
+			if ( outermost ) {
+				outermostContext = context === document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					if ( !context && elem.ownerDocument !== document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context || document, xml) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[0] = match[0].slice( 0 );
+		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[i];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ (type = token.type) ] ) {
+				break;
+			}
+			if ( (find = Expr.find[ type ]) ) {
+				// Search, expanding context for leading sibling combinators
+				if ( (seed = find(
+					token.matches[0].replace( runescape, funescape ),
+					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+				)) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+	// Should return 1, but returns 4 (following)
+	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+	el.innerHTML = "<a href='#'></a>";
+	return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	});
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+	el.innerHTML = "<input/>";
+	el.firstChild.setAttribute( "value", "" );
+	return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+	addHandle( "value", function( elem, name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	});
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+	return el.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+					(val = elem.getAttributeNode( name )) && val.specified ?
+					val.value :
+				null;
+		}
+	});
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+	}
+
+	// Single element
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+	}
+
+	// Arraylike of elements (jQuery, arguments, Array)
+	if ( typeof qualifier !== "string" ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+		} );
+	}
+
+	// Filtered directly for both simple and complex selectors
+	return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	if ( elems.length === 1 && elem.nodeType === 1 ) {
+		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+	}
+
+	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+		return elem.nodeType === 1;
+	} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i, ret,
+			len = this.length,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		ret = this.pushStack( [] );
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	// Shortcut simple #id case for speed
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Method init() accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector[ 0 ] === "<" &&
+				selector[ selector.length - 1 ] === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// Option to run scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					if ( elem ) {
+
+						// Inject the element directly into the jQuery object
+						this[ 0 ] = elem;
+						this.length = 1;
+					}
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( isFunction( selector ) ) {
+			return root.ready !== undefined ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// Methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var targets = jQuery( target, this ),
+			l = targets.length;
+
+		return this.filter( function() {
+			var i = 0;
+			for ( ; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			targets = typeof selectors !== "string" && jQuery( selectors );
+
+		// Positional selectors never match, since there's no _selection_ context
+		if ( !rneedsContext.test( selectors ) ) {
+			for ( ; i < l; i++ ) {
+				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+					// Always skip document fragments
+					if ( cur.nodeType < 11 && ( targets ?
+						targets.index( cur ) > -1 :
+
+						// Don't pass non-elements to Sizzle
+						cur.nodeType === 1 &&
+							jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+						matched.push( cur );
+						break;
+					}
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within the set
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// Index in selector
+		if ( typeof elem === "string" ) {
+			return indexOf.call( jQuery( elem ), this[ 0 ] );
+		}
+
+		// Locate the position of the desired element
+		return indexOf.call( this,
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem
+		);
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+		if ( typeof elem.contentDocument !== "undefined" ) {
+			return elem.contentDocument;
+		}
+
+		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+		// Treat the template element as a regular one in browsers that
+		// don't support it.
+		if ( nodeName( elem, "template" ) ) {
+			elem = elem.content || elem;
+		}
+
+		return jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var matched = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			matched = jQuery.filter( selector, matched );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				jQuery.uniqueSort( matched );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				matched.reverse();
+			}
+		}
+
+		return this.pushStack( matched );
+	};
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = locked || options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = queue = [];
+				if ( !memory && !firing ) {
+					list = memory = "";
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+function Identity( v ) {
+	return v;
+}
+function Thrower( ex ) {
+	throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+	var method;
+
+	try {
+
+		// Check for promise aspect first to privilege synchronous behavior
+		if ( value && isFunction( ( method = value.promise ) ) ) {
+			method.call( value ).done( resolve ).fail( reject );
+
+		// Other thenables
+		} else if ( value && isFunction( ( method = value.then ) ) ) {
+			method.call( value, resolve, reject );
+
+		// Other non-thenables
+		} else {
+
+			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+			// * false: [ value ].slice( 0 ) => resolve( value )
+			// * true: [ value ].slice( 1 ) => resolve()
+			resolve.apply( undefined, [ value ].slice( noValue ) );
+		}
+
+	// For Promises/A+, convert exceptions into rejections
+	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+	// Deferred#then to conditionally suppress rejection.
+	} catch ( value ) {
+
+		// Support: Android 4.0 only
+		// Strict mode functions invoked without .call/.apply get global-object context
+		reject.apply( undefined, [ value ] );
+	}
+}
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, callbacks,
+				// ... .then handlers, argument index, [final state]
+				[ "notify", "progress", jQuery.Callbacks( "memory" ),
+					jQuery.Callbacks( "memory" ), 2 ],
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
+					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				"catch": function( fn ) {
+					return promise.then( null, fn );
+				},
+
+				// Keep pipe for back-compat
+				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+
+							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
+							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+							// deferred.progress(function() { bind to newDefer or newDefer.notify })
+							// deferred.done(function() { bind to newDefer or newDefer.resolve })
+							// deferred.fail(function() { bind to newDefer or newDefer.reject })
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+				then: function( onFulfilled, onRejected, onProgress ) {
+					var maxDepth = 0;
+					function resolve( depth, deferred, handler, special ) {
+						return function() {
+							var that = this,
+								args = arguments,
+								mightThrow = function() {
+									var returned, then;
+
+									// Support: Promises/A+ section 2.3.3.3.3
+									// https://promisesaplus.com/#point-59
+									// Ignore double-resolution attempts
+									if ( depth < maxDepth ) {
+										return;
+									}
+
+									returned = handler.apply( that, args );
+
+									// Support: Promises/A+ section 2.3.1
+									// https://promisesaplus.com/#point-48
+									if ( returned === deferred.promise() ) {
+										throw new TypeError( "Thenable self-resolution" );
+									}
+
+									// Support: Promises/A+ sections 2.3.3.1, 3.5
+									// https://promisesaplus.com/#point-54
+									// https://promisesaplus.com/#point-75
+									// Retrieve `then` only once
+									then = returned &&
+
+										// Support: Promises/A+ section 2.3.4
+										// https://promisesaplus.com/#point-64
+										// Only check objects and functions for thenability
+										( typeof returned === "object" ||
+											typeof returned === "function" ) &&
+										returned.then;
+
+									// Handle a returned thenable
+									if ( isFunction( then ) ) {
+
+										// Special processors (notify) just wait for resolution
+										if ( special ) {
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special )
+											);
+
+										// Normal processors (resolve) also hook into progress
+										} else {
+
+											// ...and disregard older resolution values
+											maxDepth++;
+
+											then.call(
+												returned,
+												resolve( maxDepth, deferred, Identity, special ),
+												resolve( maxDepth, deferred, Thrower, special ),
+												resolve( maxDepth, deferred, Identity,
+													deferred.notifyWith )
+											);
+										}
+
+									// Handle all other returned values
+									} else {
+
+										// Only substitute handlers pass on context
+										// and multiple values (non-spec behavior)
+										if ( handler !== Identity ) {
+											that = undefined;
+											args = [ returned ];
+										}
+
+										// Process the value(s)
+										// Default process is resolve
+										( special || deferred.resolveWith )( that, args );
+									}
+								},
+
+								// Only normal processors (resolve) catch and reject exceptions
+								process = special ?
+									mightThrow :
+									function() {
+										try {
+											mightThrow();
+										} catch ( e ) {
+
+											if ( jQuery.Deferred.exceptionHook ) {
+												jQuery.Deferred.exceptionHook( e,
+													process.stackTrace );
+											}
+
+											// Support: Promises/A+ section 2.3.3.3.4.1
+											// https://promisesaplus.com/#point-61
+											// Ignore post-resolution exceptions
+											if ( depth + 1 >= maxDepth ) {
+
+												// Only substitute handlers pass on context
+												// and multiple values (non-spec behavior)
+												if ( handler !== Thrower ) {
+													that = undefined;
+													args = [ e ];
+												}
+
+												deferred.rejectWith( that, args );
+											}
+										}
+									};
+
+							// Support: Promises/A+ section 2.3.3.3.1
+							// https://promisesaplus.com/#point-57
+							// Re-resolve promises immediately to dodge false rejection from
+							// subsequent errors
+							if ( depth ) {
+								process();
+							} else {
+
+								// Call an optional hook to record the stack, in case of exception
+								// since it's otherwise lost when execution goes async
+								if ( jQuery.Deferred.getStackHook ) {
+									process.stackTrace = jQuery.Deferred.getStackHook();
+								}
+								window.setTimeout( process );
+							}
+						};
+					}
+
+					return jQuery.Deferred( function( newDefer ) {
+
+						// progress_handlers.add( ... )
+						tuples[ 0 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onProgress ) ?
+									onProgress :
+									Identity,
+								newDefer.notifyWith
+							)
+						);
+
+						// fulfilled_handlers.add( ... )
+						tuples[ 1 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onFulfilled ) ?
+									onFulfilled :
+									Identity
+							)
+						);
+
+						// rejected_handlers.add( ... )
+						tuples[ 2 ][ 3 ].add(
+							resolve(
+								0,
+								newDefer,
+								isFunction( onRejected ) ?
+									onRejected :
+									Thrower
+							)
+						);
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 5 ];
+
+			// promise.progress = list.add
+			// promise.done = list.add
+			// promise.fail = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(
+					function() {
+
+						// state = "resolved" (i.e., fulfilled)
+						// state = "rejected"
+						state = stateString;
+					},
+
+					// rejected_callbacks.disable
+					// fulfilled_callbacks.disable
+					tuples[ 3 - i ][ 2 ].disable,
+
+					// rejected_handlers.disable
+					// fulfilled_handlers.disable
+					tuples[ 3 - i ][ 3 ].disable,
+
+					// progress_callbacks.lock
+					tuples[ 0 ][ 2 ].lock,
+
+					// progress_handlers.lock
+					tuples[ 0 ][ 3 ].lock
+				);
+			}
+
+			// progress_handlers.fire
+			// fulfilled_handlers.fire
+			// rejected_handlers.fire
+			list.add( tuple[ 3 ].fire );
+
+			// deferred.notify = function() { deferred.notifyWith(...) }
+			// deferred.resolve = function() { deferred.resolveWith(...) }
+			// deferred.reject = function() { deferred.rejectWith(...) }
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+				return this;
+			};
+
+			// deferred.notifyWith = list.fireWith
+			// deferred.resolveWith = list.fireWith
+			// deferred.rejectWith = list.fireWith
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( singleValue ) {
+		var
+
+			// count of uncompleted subordinates
+			remaining = arguments.length,
+
+			// count of unprocessed arguments
+			i = remaining,
+
+			// subordinate fulfillment data
+			resolveContexts = Array( i ),
+			resolveValues = slice.call( arguments ),
+
+			// the master Deferred
+			master = jQuery.Deferred(),
+
+			// subordinate callback factory
+			updateFunc = function( i ) {
+				return function( value ) {
+					resolveContexts[ i ] = this;
+					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( !( --remaining ) ) {
+						master.resolveWith( resolveContexts, resolveValues );
+					}
+				};
+			};
+
+		// Single- and empty arguments are adopted like Promise.resolve
+		if ( remaining <= 1 ) {
+			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+				!remaining );
+
+			// Use .then() to unwrap secondary thenables (cf. gh-3000)
+			if ( master.state() === "pending" ||
+				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+				return master.then();
+			}
+		}
+
+		// Multiple arguments are aggregated like Promise.all array elements
+		while ( i-- ) {
+			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+		}
+
+		return master.promise();
+	}
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+	// Support: IE 8 - 9 only
+	// Console exists when dev tools are open, which can happen at any time
+	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+	}
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+	window.setTimeout( function() {
+		throw error;
+	} );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+	readyList
+		.then( fn )
+
+		// Wrap jQuery.readyException in a function so that the lookup
+		// happens at the time of error handling instead of callback
+		// registration.
+		.catch( function( error ) {
+			jQuery.readyException( error );
+		} );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+	}
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+	document.removeEventListener( "DOMContentLoaded", completed );
+	window.removeEventListener( "load", completed );
+	jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+	// Handle it asynchronously to allow scripts the opportunity to delay ready
+	window.setTimeout( jQuery.ready );
+
+} else {
+
+	// Use the handy event callback
+	document.addEventListener( "DOMContentLoaded", completed );
+
+	// A fallback to window.onload, that will always work
+	window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		len = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( toType( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < len; i++ ) {
+				fn(
+					elems[ i ], key, raw ?
+					value :
+					value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	if ( chainable ) {
+		return elems;
+	}
+
+	// Gets
+	if ( bulk ) {
+		return fn.call( elems );
+	}
+
+	return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( all, letter ) {
+	return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+	// Accepts only:
+	//  - Node
+	//    - Node.ELEMENT_NODE
+	//    - Node.DOCUMENT_NODE
+	//  - Object
+	//    - Any
+	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+	this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+	cache: function( owner ) {
+
+		// Check if the owner object already has a cache
+		var value = owner[ this.expando ];
+
+		// If not, create one
+		if ( !value ) {
+			value = {};
+
+			// We can accept data for non-element nodes in modern browsers,
+			// but we should not, see #8335.
+			// Always return an empty object.
+			if ( acceptData( owner ) ) {
+
+				// If it is a node unlikely to be stringify-ed or looped over
+				// use plain assignment
+				if ( owner.nodeType ) {
+					owner[ this.expando ] = value;
+
+				// Otherwise secure it in a non-enumerable property
+				// configurable must be true to allow the property to be
+				// deleted when data is removed
+				} else {
+					Object.defineProperty( owner, this.expando, {
+						value: value,
+						configurable: true
+					} );
+				}
+			}
+		}
+
+		return value;
+	},
+	set: function( owner, data, value ) {
+		var prop,
+			cache = this.cache( owner );
+
+		// Handle: [ owner, key, value ] args
+		// Always use camelCase key (gh-2257)
+		if ( typeof data === "string" ) {
+			cache[ camelCase( data ) ] = value;
+
+		// Handle: [ owner, { properties } ] args
+		} else {
+
+			// Copy the properties one-by-one to the cache object
+			for ( prop in data ) {
+				cache[ camelCase( prop ) ] = data[ prop ];
+			}
+		}
+		return cache;
+	},
+	get: function( owner, key ) {
+		return key === undefined ?
+			this.cache( owner ) :
+
+			// Always use camelCase key (gh-2257)
+			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+	},
+	access: function( owner, key, value ) {
+
+		// In cases where either:
+		//
+		//   1. No key was specified
+		//   2. A string key was specified, but no value provided
+		//
+		// Take the "read" path and allow the get method to determine
+		// which value to return, respectively either:
+		//
+		//   1. The entire cache object
+		//   2. The data stored at the key
+		//
+		if ( key === undefined ||
+				( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+			return this.get( owner, key );
+		}
+
+		// When the key is not a string, or both a key and value
+		// are specified, set or extend (existing objects) with either:
+		//
+		//   1. An object of properties
+		//   2. A key and value
+		//
+		this.set( owner, key, value );
+
+		// Since the "set" path can have two possible entry points
+		// return the expected data based on which path was taken[*]
+		return value !== undefined ? value : key;
+	},
+	remove: function( owner, key ) {
+		var i,
+			cache = owner[ this.expando ];
+
+		if ( cache === undefined ) {
+			return;
+		}
+
+		if ( key !== undefined ) {
+
+			// Support array or space separated string of keys
+			if ( Array.isArray( key ) ) {
+
+				// If key is an array of keys...
+				// We always set camelCase keys, so remove that.
+				key = key.map( camelCase );
+			} else {
+				key = camelCase( key );
+
+				// If a key with the spaces exists, use it.
+				// Otherwise, create an array by matching non-whitespace
+				key = key in cache ?
+					[ key ] :
+					( key.match( rnothtmlwhite ) || [] );
+			}
+
+			i = key.length;
+
+			while ( i-- ) {
+				delete cache[ key[ i ] ];
+			}
+		}
+
+		// Remove the expando if there's no more data
+		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+			// Support: Chrome <=35 - 45
+			// Webkit & Blink performance suffers when deleting properties
+			// from DOM nodes, so set to undefined instead
+			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+			if ( owner.nodeType ) {
+				owner[ this.expando ] = undefined;
+			} else {
+				delete owner[ this.expando ];
+			}
+		}
+	},
+	hasData: function( owner ) {
+		var cache = owner[ this.expando ];
+		return cache !== undefined && !jQuery.isEmptyObject( cache );
+	}
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+//	Implementation Summary
+//
+//	1. Enforce API surface and semantic compatibility with 1.9.x branch
+//	2. Improve the module's maintainability by reducing the storage
+//		paths to a single mechanism.
+//	3. Use the same single mechanism to support "private" and "user" data.
+//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//	5. Avoid exposing implementation details on user objects (eg. expando properties)
+//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+	if ( data === "true" ) {
+		return true;
+	}
+
+	if ( data === "false" ) {
+		return false;
+	}
+
+	if ( data === "null" ) {
+		return null;
+	}
+
+	// Only convert to a number if it doesn't change the string
+	if ( data === +data + "" ) {
+		return +data;
+	}
+
+	if ( rbrace.test( data ) ) {
+		return JSON.parse( data );
+	}
+
+	return data;
+}
+
+function dataAttr( elem, key, data ) {
+	var name;
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = getData( data );
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			dataUser.set( elem, key, data );
+		} else {
+			data = undefined;
+		}
+	}
+	return data;
+}
+
+jQuery.extend( {
+	hasData: function( elem ) {
+		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return dataUser.access( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		dataUser.remove( elem, name );
+	},
+
+	// TODO: Now that all calls to _data and _removeData have been replaced
+	// with direct calls to dataPriv methods, these can be deprecated.
+	_data: function( elem, name, data ) {
+		return dataPriv.access( elem, name, data );
+	},
+
+	_removeData: function( elem, name ) {
+		dataPriv.remove( elem, name );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = dataUser.get( elem );
+
+				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE 11 only
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					dataPriv.set( elem, "hasDataAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				dataUser.set( this, key );
+			} );
+		}
+
+		return access( this, function( value ) {
+			var data;
+
+			// The calling jQuery object (element matches) is not empty
+			// (and therefore has an element appears at this[ 0 ]) and the
+			// `value` parameter was not undefined. An empty jQuery object
+			// will result in `undefined` for elem = this[ 0 ] which will
+			// throw an exception if an attempt to read a data cache is made.
+			if ( elem && value === undefined ) {
+
+				// Attempt to get data from the cache
+				// The key will always be camelCased in Data
+				data = dataUser.get( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// Attempt to "discover" the data in
+				// HTML5 custom data-* attrs
+				data = dataAttr( elem, key );
+				if ( data !== undefined ) {
+					return data;
+				}
+
+				// We tried really hard, but the data doesn't exist.
+				return;
+			}
+
+			// Set the data...
+			this.each( function() {
+
+				// We always store the camelCased key
+				dataUser.set( this, key, value );
+			} );
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			dataUser.remove( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = dataPriv.get( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || Array.isArray( data ) ) {
+					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// Clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// Not public - generate a queueHooks object, or return the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				dataPriv.remove( elem, [ type + "queue", key ] );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// Ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+	var isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem );
+		},
+		composed = { composed: true };
+
+	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+	// Check attachment across shadow DOM boundaries when possible (gh-3504)
+	// Support: iOS 10.0-10.2 only
+	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+	// leading to errors. We need to check for `getRootNode`.
+	if ( documentElement.getRootNode ) {
+		isAttached = function( elem ) {
+			return jQuery.contains( elem.ownerDocument, elem ) ||
+				elem.getRootNode( composed ) === elem.ownerDocument;
+		};
+	}
+var isHiddenWithinTree = function( elem, el ) {
+
+		// isHiddenWithinTree might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+
+		// Inline style trumps all
+		return elem.style.display === "none" ||
+			elem.style.display === "" &&
+
+			// Otherwise, check computed style
+			// Support: Firefox <=43 - 45
+			// Disconnected elements can have computed display: none, so first confirm that elem is
+			// in the document.
+			isAttached( elem ) &&
+
+			jQuery.css( elem, "display" ) === "none";
+	};
+
+var swap = function( elem, options, callback, args ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.apply( elem, args || [] );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted, scale,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() {
+				return tween.cur();
+			} :
+			function() {
+				return jQuery.css( elem, prop, "" );
+			},
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = elem.nodeType &&
+			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Support: Firefox <=54
+		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+		initial = initial / 2;
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		while ( maxIterations-- ) {
+
+			// Evaluate and update our best guess (doubling guesses that zero out).
+			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+			jQuery.style( elem, prop, initialInUnit + unit );
+			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+				maxIterations = 0;
+			}
+			initialInUnit = initialInUnit / scale;
+
+		}
+
+		initialInUnit = initialInUnit * 2;
+		jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+	var temp,
+		doc = elem.ownerDocument,
+		nodeName = elem.nodeName,
+		display = defaultDisplayMap[ nodeName ];
+
+	if ( display ) {
+		return display;
+	}
+
+	temp = doc.body.appendChild( doc.createElement( nodeName ) );
+	display = jQuery.css( temp, "display" );
+
+	temp.parentNode.removeChild( temp );
+
+	if ( display === "none" ) {
+		display = "block";
+	}
+	defaultDisplayMap[ nodeName ] = display;
+
+	return display;
+}
+
+function showHide( elements, show ) {
+	var display, elem,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	// Determine new display value for elements that need to change
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		display = elem.style.display;
+		if ( show ) {
+
+			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+			// check is required in this first loop unless we have a nonempty display value (either
+			// inline or about-to-be-restored)
+			if ( display === "none" ) {
+				values[ index ] = dataPriv.get( elem, "display" ) || null;
+				if ( !values[ index ] ) {
+					elem.style.display = "";
+				}
+			}
+			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+				values[ index ] = getDefaultDisplay( elem );
+			}
+		} else {
+			if ( display !== "none" ) {
+				values[ index ] = "none";
+
+				// Remember what we're overwriting
+				dataPriv.set( elem, "display", display );
+			}
+		}
+	}
+
+	// Set the display of the elements in a second loop to avoid constant reflow
+	for ( index = 0; index < length; index++ ) {
+		if ( values[ index ] != null ) {
+			elements[ index ].style.display = values[ index ];
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend( {
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHiddenWithinTree( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+	// Support: IE <=9 only
+	option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+	// XHTML parsers do not magically insert elements in the
+	// same way that tag soup parsers do. So we cannot shorten
+	// this by omitting <tbody> or other required elements.
+	thead: [ 1, "<table>", "</table>" ],
+	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+	_default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+	// Support: IE <=9 - 11 only
+	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
+	var ret;
+
+	if ( typeof context.getElementsByTagName !== "undefined" ) {
+		ret = context.getElementsByTagName( tag || "*" );
+
+	} else if ( typeof context.querySelectorAll !== "undefined" ) {
+		ret = context.querySelectorAll( tag || "*" );
+
+	} else {
+		ret = [];
+	}
+
+	if ( tag === undefined || tag && nodeName( context, tag ) ) {
+		return jQuery.merge( [ context ], ret );
+	}
+
+	return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		dataPriv.set(
+			elems[ i ],
+			"globalEval",
+			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var elem, tmp, tag, wrap, attached, j,
+		fragment = context.createDocumentFragment(),
+		nodes = [],
+		i = 0,
+		l = elems.length;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( toType( elem ) === "object" ) {
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Support: Android <=4.0 only, PhantomJS 1 only
+				// push.apply(_, arraylike) throws on ancient WebKit
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Remember the top-level container
+				tmp = fragment.firstChild;
+
+				// Ensure the created nodes are orphaned (#12392)
+				tmp.textContent = "";
+			}
+		}
+	}
+
+	// Remove wrapper from fragment
+	fragment.textContent = "";
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+			continue;
+		}
+
+		attached = isAttached( elem );
+
+		// Append to fragment
+		tmp = getAll( fragment.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( attached ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	return fragment;
+}
+
+
+( function() {
+	var fragment = document.createDocumentFragment(),
+		div = fragment.appendChild( document.createElement( "div" ) ),
+		input = document.createElement( "input" );
+
+	// Support: Android 4.0 - 4.3 only
+	// Check state lost if the name is set (#11217)
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Android <=4.1 only
+	// Older WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE <=11 only
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+
+
+var
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+	return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var handleObjIn, eventHandle, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.get( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Ensure that invalid selectors throw exceptions at attach time
+		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
+		if ( selector ) {
+			jQuery.find.matchesSelector( documentElement, selector );
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = {};
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+			};
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var j, origCount, tmp,
+			events, t, handleObj,
+			special, handlers, type, namespaces, origType,
+			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove data and the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			dataPriv.remove( elem, "handle events" );
+		}
+	},
+
+	dispatch: function( nativeEvent ) {
+
+		// Make a writable jQuery.Event from the native event object
+		var event = jQuery.event.fix( nativeEvent );
+
+		var i, j, ret, matched, handleObj, handlerQueue,
+			args = new Array( arguments.length ),
+			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+
+		for ( i = 1; i < arguments.length; i++ ) {
+			args[ i ] = arguments[ i ];
+		}
+
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// If the event is namespaced, then each handler is only invoked if it is
+				// specially universal or its namespaces are a superset of the event's.
+				if ( !event.rnamespace || handleObj.namespace === false ||
+					event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, handleObj, sel, matchedHandlers, matchedSelectors,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		if ( delegateCount &&
+
+			// Support: IE <=9
+			// Black-hole SVG <use> instance trees (trac-13180)
+			cur.nodeType &&
+
+			// Support: Firefox <=42
+			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+			// Support: IE 11 only
+			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+			!( event.type === "click" && event.button >= 1 ) ) {
+
+			for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+					matchedHandlers = [];
+					matchedSelectors = {};
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matchedSelectors[ sel ] === undefined ) {
+							matchedSelectors[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matchedSelectors[ sel ] ) {
+							matchedHandlers.push( handleObj );
+						}
+					}
+					if ( matchedHandlers.length ) {
+						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		cur = this;
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	addProp: function( name, hook ) {
+		Object.defineProperty( jQuery.Event.prototype, name, {
+			enumerable: true,
+			configurable: true,
+
+			get: isFunction( hook ) ?
+				function() {
+					if ( this.originalEvent ) {
+							return hook( this.originalEvent );
+					}
+				} :
+				function() {
+					if ( this.originalEvent ) {
+							return this.originalEvent[ name ];
+					}
+				},
+
+			set: function( value ) {
+				Object.defineProperty( this, name, {
+					enumerable: true,
+					configurable: true,
+					writable: true,
+					value: value
+				} );
+			}
+		} );
+	},
+
+	fix: function( originalEvent ) {
+		return originalEvent[ jQuery.expando ] ?
+			originalEvent :
+			new jQuery.Event( originalEvent );
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		click: {
+
+			// Utilize native event to ensure correct state for checkable inputs
+			setup: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Claim the first handler
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					// dataPriv.set( el, "click", ... )
+					leverageNative( el, "click", returnTrue );
+				}
+
+				// Return false to allow normal processing in the caller
+				return false;
+			},
+			trigger: function( data ) {
+
+				// For mutual compressibility with _default, replace `this` access with a local var.
+				// `|| data` is dead code meant only to preserve the variable through minification.
+				var el = this || data;
+
+				// Force setup before triggering a click
+				if ( rcheckableType.test( el.type ) &&
+					el.click && nodeName( el, "input" ) ) {
+
+					leverageNative( el, "click" );
+				}
+
+				// Return non-false to allow normal event-path propagation
+				return true;
+			},
+
+			// For cross-browser consistency, suppress native .click() on links
+			// Also prevent it if we're currently inside a leveraged native-event stack
+			_default: function( event ) {
+				var target = event.target;
+				return rcheckableType.test( target.type ) &&
+					target.click && nodeName( target, "input" ) &&
+					dataPriv.get( target, "click" ) ||
+					nodeName( target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	}
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+	if ( !expectSync ) {
+		if ( dataPriv.get( el, type ) === undefined ) {
+			jQuery.event.add( el, type, returnTrue );
+		}
+		return;
+	}
+
+	// Register the controller as a special universal handler for all event namespaces
+	dataPriv.set( el, type, false );
+	jQuery.event.add( el, type, {
+		namespace: false,
+		handler: function( event ) {
+			var notAsync, result,
+				saved = dataPriv.get( this, type );
+
+			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+				// Interrupt processing of the outer synthetic .trigger()ed event
+				// Saved data should be false in such cases, but might be a leftover capture object
+				// from an async native handler (gh-4350)
+				if ( !saved.length ) {
+
+					// Store arguments for use when handling the inner native event
+					// There will always be at least one argument (an event object), so this array
+					// will not be confused with a leftover capture object.
+					saved = slice.call( arguments );
+					dataPriv.set( this, type, saved );
+
+					// Trigger the native event and capture its result
+					// Support: IE <=9 - 11+
+					// focus() and blur() are asynchronous
+					notAsync = expectSync( this, type );
+					this[ type ]();
+					result = dataPriv.get( this, type );
+					if ( saved !== result || notAsync ) {
+						dataPriv.set( this, type, false );
+					} else {
+						result = {};
+					}
+					if ( saved !== result ) {
+
+						// Cancel the outer synthetic event
+						event.stopImmediatePropagation();
+						event.preventDefault();
+						return result.value;
+					}
+
+				// If this is an inner synthetic event for an event with a bubbling surrogate
+				// (focus or blur), assume that the surrogate already propagated from triggering the
+				// native event and prevent that from happening again here.
+				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
+				// less bad than duplication.
+				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+					event.stopPropagation();
+				}
+
+			// If this is a native event triggered above, everything is now in order
+			// Fire an inner synthetic event with the original arguments
+			} else if ( saved.length ) {
+
+				// ...and capture the result
+				dataPriv.set( this, type, {
+					value: jQuery.event.trigger(
+
+						// Support: IE <=9 - 11+
+						// Extend with the prototype to reset the above stopImmediatePropagation()
+						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+						saved.slice( 1 ),
+						this
+					)
+				} );
+
+				// Abort handling of the native event
+				event.stopImmediatePropagation();
+			}
+		}
+	} );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+	// This "if" is needed for plain objects
+	if ( elem.removeEventListener ) {
+		elem.removeEventListener( type, handle );
+	}
+};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: Android <=2.3 only
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+		// Create target properties
+		// Support: Safari <=6 - 7 only
+		// Target should not be a text node (#504, #13143)
+		this.target = ( src.target && src.target.nodeType === 3 ) ?
+			src.target.parentNode :
+			src.target;
+
+		this.currentTarget = src.currentTarget;
+		this.relatedTarget = src.relatedTarget;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || Date.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+	isSimulated: false,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.preventDefault();
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopPropagation();
+		}
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && !this.isSimulated ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+	altKey: true,
+	bubbles: true,
+	cancelable: true,
+	changedTouches: true,
+	ctrlKey: true,
+	detail: true,
+	eventPhase: true,
+	metaKey: true,
+	pageX: true,
+	pageY: true,
+	shiftKey: true,
+	view: true,
+	"char": true,
+	code: true,
+	charCode: true,
+	key: true,
+	keyCode: true,
+	button: true,
+	buttons: true,
+	clientX: true,
+	clientY: true,
+	offsetX: true,
+	offsetY: true,
+	pointerId: true,
+	pointerType: true,
+	screenX: true,
+	screenY: true,
+	targetTouches: true,
+	toElement: true,
+	touches: true,
+
+	which: function( event ) {
+		var button = event.button;
+
+		// Add which for key events
+		if ( event.which == null && rkeyEvent.test( event.type ) ) {
+			return event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+			if ( button & 1 ) {
+				return 1;
+			}
+
+			if ( button & 2 ) {
+				return 3;
+			}
+
+			if ( button & 4 ) {
+				return 2;
+			}
+
+			return 0;
+		}
+
+		return event.which;
+	}
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+	jQuery.event.special[ type ] = {
+
+		// Utilize native event if possible so blur/focus sequence is correct
+		setup: function() {
+
+			// Claim the first handler
+			// dataPriv.set( this, "focus", ... )
+			// dataPriv.set( this, "blur", ... )
+			leverageNative( this, type, expectSync );
+
+			// Return false to allow normal processing in the caller
+			return false;
+		},
+		trigger: function() {
+
+			// Force setup before trigger
+			leverageNative( this, type );
+
+			// Return non-false to allow normal event-path propagation
+			return true;
+		},
+
+		delegateType: delegateType
+	};
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	}
+} );
+
+
+var
+
+	/* eslint-disable max-len */
+
+	// See https://github.com/eslint/eslint/issues/3229
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+	/* eslint-enable */
+
+	// Support: IE <=10 - 11, Edge 12 - 13 only
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+	if ( nodeName( elem, "table" ) &&
+		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
+	}
+
+	return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+		elem.type = elem.type.slice( 5 );
+	} else {
+		elem.removeAttribute( "type" );
+	}
+
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// 1. Copy private data: events, handlers, etc.
+	if ( dataPriv.hasData( src ) ) {
+		pdataOld = dataPriv.access( src );
+		pdataCur = dataPriv.set( dest, pdataOld );
+		events = pdataOld.events;
+
+		if ( events ) {
+			delete pdataCur.handle;
+			pdataCur.events = {};
+
+			for ( type in events ) {
+				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type, events[ type ][ i ] );
+				}
+			}
+		}
+	}
+
+	// 2. Copy user data
+	if ( dataUser.hasData( src ) ) {
+		udataOld = dataUser.access( src );
+		udataCur = jQuery.extend( {}, udataOld );
+
+		dataUser.set( dest, udataCur );
+	}
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// Fails to persist the checked state of a cloned checkbox or radio button.
+	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		dest.checked = src.checked;
+
+	// Fails to return the selected option to the default selected state when cloning options
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = concat.apply( [], args );
+
+	var fragment, first, scripts, hasScripts, node, doc,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		valueIsFunction = isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( valueIsFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( valueIsFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android <=4.0 only, PhantomJS 1 only
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!dataPriv.access( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl && !node.noModule ) {
+								jQuery._evalUrl( node.src, {
+									nonce: node.nonce || node.getAttribute( "nonce" )
+								} );
+							}
+						} else {
+							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		nodes = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && isAttached( node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html.replace( rxhtmlTag, "<$1></$2>" );
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var i, l, srcElements, destElements,
+			clone = elem.cloneNode( true ),
+			inPage = isAttached( elem );
+
+		// Fix IE cloning issues
+		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+				!jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			for ( i = 0, l = srcElements.length; i < l; i++ ) {
+				fixInput( srcElements[ i ], destElements[ i ] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0, l = srcElements.length; i < l; i++ ) {
+					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems ) {
+		var data, elem, type,
+			special = jQuery.event.special,
+			i = 0;
+
+		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+			if ( acceptData( elem ) ) {
+				if ( ( data = elem[ dataPriv.expando ] ) ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataPriv.expando ] = undefined;
+				}
+				if ( elem[ dataUser.expando ] ) {
+
+					// Support: Chrome <=35 - 45+
+					// Assign undefined instead of using delete, see Data#remove
+					elem[ dataUser.expando ] = undefined;
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().each( function() {
+					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+						this.textContent = value;
+					}
+				} );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+			if ( elem.nodeType === 1 ) {
+
+				// Prevent memory leaks
+				jQuery.cleanData( getAll( elem, false ) );
+
+				// Remove any remaining nodes
+				elem.textContent = "";
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined && elem.nodeType === 1 ) {
+				return elem.innerHTML;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+						elem = this[ i ] || {};
+
+						// Remove element nodes and prevent memory leaks
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1,
+			i = 0;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Support: Android <=4.0 only, PhantomJS 1 only
+			// .get() because push.apply(_, arraylike) throws on ancient WebKit
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
+
+
+( function() {
+
+	// Executing both pixelPosition & boxSizingReliable tests require only one layout
+	// so they're executed at the same time to save the second computation.
+	function computeStyleTests() {
+
+		// This is a singleton, we need to execute it only once
+		if ( !div ) {
+			return;
+		}
+
+		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+			"margin-top:1px;padding:0;border:0";
+		div.style.cssText =
+			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"width:60%;top:1%";
+		documentElement.appendChild( container ).appendChild( div );
+
+		var divStyle = window.getComputedStyle( div );
+		pixelPositionVal = divStyle.top !== "1%";
+
+		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
+
+		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+		// Some styles come back with percentage values, even though they shouldn't
+		div.style.right = "60%";
+		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+		// Support: IE 9 - 11 only
+		// Detect misreporting of content dimensions for box-sizing:border-box elements
+		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+		// Support: IE 9 only
+		// Detect overflow:scroll screwiness (gh-3699)
+		// Support: Chrome <=64
+		// Don't get tricked when zoom affects offsetWidth (gh-4029)
+		div.style.position = "absolute";
+		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
+
+		documentElement.removeChild( container );
+
+		// Nullify the div so it wouldn't be stored in the memory and
+		// it will also be a sign that checks already performed
+		div = null;
+	}
+
+	function roundPixelMeasures( measure ) {
+		return Math.round( parseFloat( measure ) );
+	}
+
+	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+		reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	// Support: IE <=9 - 11 only
+	// Style of cloned element affects source element cloned (#8908)
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	jQuery.extend( support, {
+		boxSizingReliable: function() {
+			computeStyleTests();
+			return boxSizingReliableVal;
+		},
+		pixelBoxStyles: function() {
+			computeStyleTests();
+			return pixelBoxStylesVal;
+		},
+		pixelPosition: function() {
+			computeStyleTests();
+			return pixelPositionVal;
+		},
+		reliableMarginLeft: function() {
+			computeStyleTests();
+			return reliableMarginLeftVal;
+		},
+		scrollboxSize: function() {
+			computeStyleTests();
+			return scrollboxSizeVal;
+		}
+	} );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+	var width, minWidth, maxWidth, ret,
+
+		// Support: Firefox 51+
+		// Retrieving style before computed somehow
+		// fixes an issue with getting wrong values
+		// on detached elements
+		style = elem.style;
+
+	computed = computed || getStyles( elem );
+
+	// getPropertyValue is needed for:
+	//   .css('filter') (IE 9 only, #12537)
+	//   .css('--customProperty) (#3144)
+	if ( computed ) {
+		ret = computed.getPropertyValue( name ) || computed[ name ];
+
+		if ( ret === "" && !isAttached( elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// Android Browser returns percentage for some values,
+		// but width seems to be reliably pixels.
+		// This is against the CSSOM draft spec:
+		// https://drafts.csswg.org/cssom/#resolved-values
+		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
+
+			// Remember the original values
+			width = style.width;
+			minWidth = style.minWidth;
+			maxWidth = style.maxWidth;
+
+			// Put in the new values to get a computed value out
+			style.minWidth = style.maxWidth = style.width = ret;
+			ret = computed.width;
+
+			// Revert the changed values
+			style.width = width;
+			style.minWidth = minWidth;
+			style.maxWidth = maxWidth;
+		}
+	}
+
+	return ret !== undefined ?
+
+		// Support: IE <=9 - 11 only
+		// IE returns zIndex value as an integer.
+		ret + "" :
+		ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var cssPrefixes = [ "Webkit", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style,
+	vendorProps = {};
+
+// Return a vendor-prefixed property or undefined
+function vendorPropName( name ) {
+
+	// Check for vendor prefixed names
+	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
+function finalPropName( name ) {
+	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
+
+	if ( final ) {
+		return final;
+	}
+	if ( name in emptyStyle ) {
+		return name;
+	}
+	return vendorProps[ name ] = vendorPropName( name ) || name;
+}
+
+
+var
+
+	// Swappable if display is none or starts with table
+	// except "table", "table-cell", or "table-caption"
+	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rcustomProp = /^--/,
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	};
+
+function setPositiveNumber( elem, value, subtract ) {
+
+	// Any relative (+/-) values have already been
+	// normalized at this point
+	var matches = rcssNum.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+		value;
+}
+
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+	var i = dimension === "width" ? 1 : 0,
+		extra = 0,
+		delta = 0;
+
+	// Adjustment may not be necessary
+	if ( box === ( isBorderBox ? "border" : "content" ) ) {
+		return 0;
+	}
+
+	for ( ; i < 4; i += 2 ) {
+
+		// Both box models exclude margin
+		if ( box === "margin" ) {
+			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
+		}
+
+		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+		if ( !isBorderBox ) {
+
+			// Add padding
+			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// For "border" or "margin", add border
+			if ( box !== "padding" ) {
+				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+			// But still keep track of it otherwise
+			} else {
+				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+
+		// If we get here with a border-box (content + padding + border), we're seeking "content" or
+		// "padding" or "margin"
+		} else {
+
+			// For "content", subtract padding
+			if ( box === "content" ) {
+				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// For "content" or "padding", subtract border
+			if ( box !== "margin" ) {
+				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	// Account for positive content-box scroll gutter when requested by providing computedVal
+	if ( !isBorderBox && computedVal >= 0 ) {
+
+		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+		// Assuming integer scroll gutter, subtract the rest and round down
+		delta += Math.max( 0, Math.ceil(
+			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+			computedVal -
+			delta -
+			extra -
+			0.5
+
+		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
+		// Use an explicit zero to avoid NaN (gh-3964)
+		) ) || 0;
+	}
+
+	return delta;
+}
+
+function getWidthOrHeight( elem, dimension, extra ) {
+
+	// Start with computed style
+	var styles = getStyles( elem ),
+
+		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
+		// Fake content-box until we know it's needed to know the true value.
+		boxSizingNeeded = !support.boxSizingReliable() || extra,
+		isBorderBox = boxSizingNeeded &&
+			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+		valueIsBorderBox = isBorderBox,
+
+		val = curCSS( elem, dimension, styles ),
+		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
+
+	// Support: Firefox <=54
+	// Return a confounding non-pixel value or feign ignorance, as appropriate.
+	if ( rnumnonpx.test( val ) ) {
+		if ( !extra ) {
+			return val;
+		}
+		val = "auto";
+	}
+
+
+	// Fall back to offsetWidth/offsetHeight when value is "auto"
+	// This happens for inline elements with no explicit setting (gh-3571)
+	// Support: Android <=4.1 - 4.3 only
+	// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+	// Support: IE 9-11 only
+	// Also use offsetWidth/offsetHeight for when box sizing is unreliable
+	// We use getClientRects() to check for hidden/disconnected.
+	// In those cases, the computed value can be trusted to be border-box
+	if ( ( !support.boxSizingReliable() && isBorderBox ||
+		val === "auto" ||
+		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+		elem.getClientRects().length ) {
+
+		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
+		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
+		// retrieved value as a content box dimension.
+		valueIsBorderBox = offsetProp in elem;
+		if ( valueIsBorderBox ) {
+			val = elem[ offsetProp ];
+		}
+	}
+
+	// Normalize "" and auto
+	val = parseFloat( val ) || 0;
+
+	// Adjust for the element's box model
+	return ( val +
+		boxModelAdjustment(
+			elem,
+			dimension,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles,
+
+			// Provide the current computed size to request scroll gutter calculation (gh-3589)
+			val
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"gridArea": true,
+		"gridColumn": true,
+		"gridColumnEnd": true,
+		"gridColumnStart": true,
+		"gridRow": true,
+		"gridRowEnd": true,
+		"gridRowStart": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name ),
+			style = elem.style;
+
+		// Make sure that we're working with the right name. We don't
+		// want to query the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Gets hook for the prefixed version, then unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set (#7116)
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
+			// "px" to a few hardcoded values.
+			if ( type === "number" && !isCustomProp ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// background-* props affect original clone's values
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				if ( isCustomProp ) {
+					style.setProperty( name, value );
+				} else {
+					style[ name ] = value;
+				}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var val, num, hooks,
+			origName = camelCase( name ),
+			isCustomProp = rcustomProp.test( name );
+
+		// Make sure that we're working with the right name. We don't
+		// want to modify the value if it is a CSS custom property
+		// since they are user-defined.
+		if ( !isCustomProp ) {
+			name = finalPropName( origName );
+		}
+
+		// Try prefixed name followed by the unprefixed name
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		// Convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Make numeric if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( i, dimension ) {
+	jQuery.cssHooks[ dimension ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// Certain elements can have dimension info if we invisibly show them
+				// but it must have a current display style that would benefit
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+					// Support: Safari 8+
+					// Table columns in Safari have non-zero offsetWidth & zero
+					// getBoundingClientRect().width unless display is changed.
+					// Support: IE <=11 only
+					// Running getBoundingClientRect on a disconnected node
+					// in IE throws an error.
+					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+						swap( elem, cssShow, function() {
+							return getWidthOrHeight( elem, dimension, extra );
+						} ) :
+						getWidthOrHeight( elem, dimension, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var matches,
+				styles = getStyles( elem ),
+
+				// Only read styles.position if the test has a chance to fail
+				// to avoid forcing a reflow.
+				scrollboxSizeBuggy = !support.scrollboxSize() &&
+					styles.position === "absolute",
+
+				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
+				boxSizingNeeded = scrollboxSizeBuggy || extra,
+				isBorderBox = boxSizingNeeded &&
+					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+				subtract = extra ?
+					boxModelAdjustment(
+						elem,
+						dimension,
+						extra,
+						isBorderBox,
+						styles
+					) :
+					0;
+
+			// Account for unreliable border-box dimensions by comparing offset* to computed and
+			// faking a content-box to get border and padding (gh-3699)
+			if ( isBorderBox && scrollboxSizeBuggy ) {
+				subtract -= Math.ceil(
+					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+					parseFloat( styles[ dimension ] ) -
+					boxModelAdjustment( elem, dimension, "border", false, styles ) -
+					0.5
+				);
+			}
+
+			// Convert to pixels if value adjustment is needed
+			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+				( matches[ 3 ] || "px" ) !== "px" ) {
+
+				elem.style[ dimension ] = value;
+				value = jQuery.css( elem, dimension );
+			}
+
+			return setPositiveNumber( elem, value, subtract );
+		}
+	};
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+				elem.getBoundingClientRect().left -
+					swap( elem, { marginLeft: 0 }, function() {
+						return elem.getBoundingClientRect().left;
+					} )
+				) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// Assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( prefix !== "margin" ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( Array.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	}
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || jQuery.easing._default;
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			// Use a property on the element directly when it is not a DOM element,
+			// or when there is no matching style property that exists.
+			if ( tween.elem.nodeType !== 1 ||
+				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// Passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails.
+			// Simple values such as "10px" are parsed to Float;
+			// complex values such as "rotate(1rad)" are returned as-is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+
+			// Use step hook for back compat.
+			// Use cssHook if its there.
+			// Use .style if available and use plain properties where available.
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.nodeType === 1 && (
+					jQuery.cssHooks[ tween.prop ] ||
+					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	},
+	_default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, inProgress,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rrun = /queueHooks$/;
+
+function schedule() {
+	if ( inProgress ) {
+		if ( document.hidden === false && window.requestAnimationFrame ) {
+			window.requestAnimationFrame( schedule );
+		} else {
+			window.setTimeout( schedule, jQuery.fx.interval );
+		}
+
+		jQuery.fx.tick();
+	}
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	window.setTimeout( function() {
+		fxNow = undefined;
+	} );
+	return ( fxNow = Date.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		i = 0,
+		attrs = { height: type };
+
+	// If we include width, step value is 1 to do all cssExpand values,
+	// otherwise step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+			// We're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+		isBox = "width" in props || "height" in props,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHiddenWithinTree( elem ),
+		dataShow = dataPriv.get( elem, "fxshow" );
+
+	// Queue-skipping animations hijack the fx hooks
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always( function() {
+
+			// Ensure the complete handler is called before this completes
+			anim.always( function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			} );
+		} );
+	}
+
+	// Detect show/hide animations
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.test( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// Pretend to be hidden if this is a "show" and
+				// there is still data from a stopped show/hide
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+
+				// Ignore all other no-op show/hide data
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	// Bail out if this is a no-op like .hide().hide()
+	propTween = !jQuery.isEmptyObject( props );
+	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+		return;
+	}
+
+	// Restrict "overflow" and "display" styles during box animations
+	if ( isBox && elem.nodeType === 1 ) {
+
+		// Support: IE <=9 - 11, Edge 12 - 15
+		// Record all 3 overflow attributes because IE does not infer the shorthand
+		// from identically-valued overflowX and overflowY and Edge just mirrors
+		// the overflowX value there.
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Identify a display type, preferring old show/hide data over the CSS cascade
+		restoreDisplay = dataShow && dataShow.display;
+		if ( restoreDisplay == null ) {
+			restoreDisplay = dataPriv.get( elem, "display" );
+		}
+		display = jQuery.css( elem, "display" );
+		if ( display === "none" ) {
+			if ( restoreDisplay ) {
+				display = restoreDisplay;
+			} else {
+
+				// Get nonempty value(s) by temporarily forcing visibility
+				showHide( [ elem ], true );
+				restoreDisplay = elem.style.display || restoreDisplay;
+				display = jQuery.css( elem, "display" );
+				showHide( [ elem ] );
+			}
+		}
+
+		// Animate inline elements as inline-block
+		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+			if ( jQuery.css( elem, "float" ) === "none" ) {
+
+				// Restore the original display value at the end of pure show/hide animations
+				if ( !propTween ) {
+					anim.done( function() {
+						style.display = restoreDisplay;
+					} );
+					if ( restoreDisplay == null ) {
+						display = style.display;
+						restoreDisplay = display === "none" ? "" : display;
+					}
+				}
+				style.display = "inline-block";
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		anim.always( function() {
+			style.overflow = opts.overflow[ 0 ];
+			style.overflowX = opts.overflow[ 1 ];
+			style.overflowY = opts.overflow[ 2 ];
+		} );
+	}
+
+	// Implement show/hide animations
+	propTween = false;
+	for ( prop in orig ) {
+
+		// General show/hide setup for this element animation
+		if ( !propTween ) {
+			if ( dataShow ) {
+				if ( "hidden" in dataShow ) {
+					hidden = dataShow.hidden;
+				}
+			} else {
+				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+			}
+
+			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+			if ( toggle ) {
+				dataShow.hidden = !hidden;
+			}
+
+			// Show elements before animating them
+			if ( hidden ) {
+				showHide( [ elem ], true );
+			}
+
+			/* eslint-disable no-loop-func */
+
+			anim.done( function() {
+
+			/* eslint-enable no-loop-func */
+
+				// The final step of a "hide" animation is actually hiding the element
+				if ( !hidden ) {
+					showHide( [ elem ] );
+				}
+				dataPriv.remove( elem, "fxshow" );
+				for ( prop in orig ) {
+					jQuery.style( elem, prop, orig[ prop ] );
+				}
+			} );
+		}
+
+		// Per-property setup
+		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+		if ( !( prop in dataShow ) ) {
+			dataShow[ prop ] = propTween.start;
+			if ( hidden ) {
+				propTween.end = propTween.start;
+				propTween.start = 0;
+			}
+		}
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( Array.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// Not quite $.extend, this won't overwrite existing keys.
+			// Reusing 'index' because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = Animation.prefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+
+			// Don't match elem in the :animated selector
+			delete tick.elem;
+		} ),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+				// Support: Android 2.3 only
+				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+			// If there's more to do, yield
+			if ( percent < 1 && length ) {
+				return remaining;
+			}
+
+			// If this was an empty animation, synthesize a final progress notification
+			if ( !length ) {
+				deferred.notifyWith( elem, [ animation, 1, 0 ] );
+			}
+
+			// Resolve the animation and report its conclusion
+			deferred.resolveWith( elem, [ animation ] );
+			return false;
+		},
+		animation = deferred.promise( {
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, {
+				specialEasing: {},
+				easing: jQuery.easing._default
+			}, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+
+					// If we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// Resolve when we played the last frame; otherwise, reject
+				if ( gotoEnd ) {
+					deferred.notifyWith( elem, [ animation, 1, 0 ] );
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		} ),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length; index++ ) {
+		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			if ( isFunction( result.stop ) ) {
+				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+					result.stop.bind( result );
+			}
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	// Attach callbacks from options
+	animation
+		.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		} )
+	);
+
+	return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweeners: {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value );
+			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+			return tween;
+		} ]
+	},
+
+	tweener: function( props, callback ) {
+		if ( isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.match( rnothtmlwhite );
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length; index++ ) {
+			prop = props[ index ];
+			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+			Animation.tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilters: [ defaultPrefilter ],
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			Animation.prefilters.unshift( callback );
+		} else {
+			Animation.prefilters.push( callback );
+		}
+	}
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !isFunction( easing ) && easing
+	};
+
+	// Go to the end state if fx are off
+	if ( jQuery.fx.off ) {
+		opt.duration = 0;
+
+	} else {
+		if ( typeof opt.duration !== "number" ) {
+			if ( opt.duration in jQuery.fx.speeds ) {
+				opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+			} else {
+				opt.duration = jQuery.fx.speeds._default;
+			}
+		}
+	}
+
+	// Normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend( {
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// Show any hidden elements after setting opacity to 0
+		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+			// Animate to the value specified
+			.end().animate( { opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || dataPriv.get( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+			doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each( function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = dataPriv.get( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this &&
+					( type == null || timers[ index ].queue === type ) ) {
+
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Start the next in the queue if the last step wasn't forced.
+			// Timers currently will call their complete callbacks, which
+			// will dequeue but only if they were gotoEnd.
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		} );
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each( function() {
+			var index,
+				data = dataPriv.get( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// Enable finishing flag on private data
+			data.finish = true;
+
+			// Empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// Look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// Look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// Turn off finishing flag
+			delete data.finish;
+		} );
+	}
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+	slideDown: genFx( "show" ),
+	slideUp: genFx( "hide" ),
+	slideToggle: genFx( "toggle" ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		i = 0,
+		timers = jQuery.timers;
+
+	fxNow = Date.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+
+		// Run the timer and safely remove it when done (allowing for external removal)
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+	if ( inProgress ) {
+		return;
+	}
+
+	inProgress = true;
+	schedule();
+};
+
+jQuery.fx.stop = function() {
+	inProgress = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var input = document.createElement( "input" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	input.type = "checkbox";
+
+	// Support: Android <=4.3 only
+	// Default value for a checkbox should be "on"
+	support.checkOn = input.value !== "";
+
+	// Support: IE <=11 only
+	// Must access selectedIndex to make default options select
+	support.optSelected = opt.selected;
+
+	// Support: IE <=11 only
+	// An input loses its value after becoming a radio
+	input = document.createElement( "input" );
+	input.value = "t";
+	input.type = "radio";
+	support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+	attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// Attribute hooks are determined by the lowercase version
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					nodeName( elem, "input" ) ) {
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name,
+			i = 0,
+
+			// Attribute names can contain non-HTML whitespace characters
+			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+			attrNames = value && value.match( rnothtmlwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				elem.removeAttribute( name );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			elem.setAttribute( name, name );
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	attrHandle[ name ] = function( elem, name, isXML ) {
+		var ret, handle,
+			lowercaseName = name.toLowerCase();
+
+		if ( !isXML ) {
+
+			// Avoid an infinite loop by temporarily removing this function from the getter
+			handle = attrHandle[ lowercaseName ];
+			attrHandle[ lowercaseName ] = ret;
+			ret = getter( elem, name, isXML ) != null ?
+				lowercaseName :
+				null;
+			attrHandle[ lowercaseName ] = handle;
+		}
+		return ret;
+	};
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		return this.each( function() {
+			delete this[ jQuery.propFix[ name ] || name ];
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// Support: IE <=9 - 11 only
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				if ( tabindex ) {
+					return parseInt( tabindex, 10 );
+				}
+
+				if (
+					rfocusable.test( elem.nodeName ) ||
+					rclickable.test( elem.nodeName ) &&
+					elem.href
+				) {
+					return 0;
+				}
+
+				return -1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent && parent.parentNode ) {
+				parent.parentNode.selectedIndex;
+			}
+			return null;
+		},
+		set: function( elem ) {
+
+			/* eslint no-unused-expressions: "off" */
+
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+	// Strip and collapse whitespace according to HTML spec
+	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+	function stripAndCollapse( value ) {
+		var tokens = value.match( rnothtmlwhite ) || [];
+		return tokens.join( " " );
+	}
+
+
+function getClass( elem ) {
+	return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+function classesToArray( value ) {
+	if ( Array.isArray( value ) ) {
+		return value;
+	}
+	if ( typeof value === "string" ) {
+		return value.match( rnothtmlwhite ) || [];
+	}
+	return [];
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		classes = classesToArray( value );
+
+		if ( classes.length ) {
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = stripAndCollapse( cur );
+					if ( curValue !== finalValue ) {
+						elem.setAttribute( "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isValidValue = type === "string" || Array.isArray( value );
+
+		if ( typeof stateVal === "boolean" && isValidValue ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( isValidValue ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = classesToArray( value );
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// Store className if set
+					dataPriv.set( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed `false`,
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				if ( this.setAttribute ) {
+					this.setAttribute( "class",
+						className || value === false ?
+						"" :
+						dataPriv.get( this, "__className__" ) || ""
+					);
+				}
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+					return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, valueIsFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				// Handle most common string cases
+				if ( typeof ret === "string" ) {
+					return ret.replace( rreturn, "" );
+				}
+
+				// Handle cases where value is null/undef or number
+				return ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		valueIsFunction = isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( valueIsFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+
+			} else if ( typeof val === "number" ) {
+				val += "";
+
+			} else if ( Array.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE <=10 - 11 only
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					stripAndCollapse( jQuery.text( elem ) );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option, i,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one",
+					values = one ? null : [],
+					max = one ? index + 1 : options.length;
+
+				if ( index < 0 ) {
+					i = max;
+
+				} else {
+					i = one ? index : 0;
+				}
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Support: IE <=9 only
+					// IE8-9 doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							!option.disabled &&
+							( !option.parentNode.disabled ||
+								!nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					/* eslint-disable no-cond-assign */
+
+					if ( option.selected =
+						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+					) {
+						optionSet = true;
+					}
+
+					/* eslint-enable no-cond-assign */
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( Array.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	stopPropagationCallback = function( e ) {
+		e.stopPropagation();
+	};
+
+jQuery.extend( jQuery.event, {
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+
+		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = lastElement = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+			lastElement = cur;
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
+				dataPriv.get( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( ( !special._default ||
+				special._default.apply( eventPath.pop(), data ) === false ) &&
+				acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name as the event.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.addEventListener( type, stopPropagationCallback );
+					}
+
+					elem[ type ]();
+
+					if ( event.isPropagationStopped() ) {
+						lastElement.removeEventListener( type, stopPropagationCallback );
+					}
+
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	// Used only for `focus(in | out)` events
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+	}
+
+} );
+
+jQuery.fn.extend( {
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				var doc = this.ownerDocument || this,
+					attaches = dataPriv.access( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this,
+					attaches = dataPriv.access( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					dataPriv.remove( doc, fix );
+
+				} else {
+					dataPriv.access( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+var location = window.location;
+
+var nonce = Date.now();
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+
+	// Support: IE 9 - 11 only
+	// IE throws on parseFromString with invalid input.
+	try {
+		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+	} catch ( e ) {
+		xml = undefined;
+	}
+
+	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+		jQuery.error( "Invalid XML: " + data );
+	}
+	return xml;
+};
+
+
+var
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( Array.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && toType( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, valueOrFunction ) {
+
+			// If value is a function, invoke it and use its return value
+			var value = isFunction( valueOrFunction ) ?
+				valueOrFunction() :
+				valueOrFunction;
+
+			s[ s.length ] = encodeURIComponent( key ) + "=" +
+				encodeURIComponent( value == null ? "" : value );
+		};
+
+	if ( a == null ) {
+		return "";
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} )
+		.filter( function() {
+			var type = this.type;
+
+			// Use .is( ":disabled" ) so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} )
+		.map( function( i, elem ) {
+			var val = jQuery( this ).val();
+
+			if ( val == null ) {
+				return null;
+			}
+
+			if ( Array.isArray( val ) ) {
+				return jQuery.map( val, function( val ) {
+					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+				} );
+			}
+
+			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+var
+	r20 = /%20/g,
+	rhash = /#.*$/,
+	rantiCache = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat( "*" ),
+
+	// Anchor tag for parsing the document origin
+	originAnchor = document.createElement( "a" );
+	originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+		if ( isFunction( func ) ) {
+
+			// For each dataType in the dataTypeExpression
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+				// Prepend if requested
+				if ( dataType[ 0 ] === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+				// Otherwise append
+				} else {
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" &&
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		} );
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s.throws ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return {
+								state: "parsererror",
+								error: conv ? e : "No conversion from " + prev + " to " + current
+							};
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: location.href,
+		type: "GET",
+		isLocal: rlocalProtocol.test( location.protocol ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			text: "text/plain",
+			html: "text/html",
+			xml: "application/xml, text/xml",
+			json: "application/json, text/javascript"
+		},
+
+		contents: {
+			xml: /\bxml\b/,
+			html: /\bhtml/,
+			json: /\bjson\b/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText",
+			json: "responseJSON"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": JSON.parse,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var transport,
+
+			// URL without anti-cache param
+			cacheURL,
+
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+
+			// timeout handle
+			timeoutTimer,
+
+			// Url cleanup var
+			urlAnchor,
+
+			// Request state (becomes false upon send and true upon completion)
+			completed,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			// Loop variable
+			i,
+
+			// uncached part of the url
+			uncached,
+
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+
+			// Callbacks context
+			callbackContext = s.context || s,
+
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context &&
+				( callbackContext.nodeType || callbackContext.jquery ) ?
+					jQuery( callbackContext ) :
+					jQuery.event,
+
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+
+			// Default abort message
+			strAbort = "canceled",
+
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( completed ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
+									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
+										.concat( match[ 2 ] );
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() + " " ];
+					}
+					return match == null ? null : match.join( ", " );
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return completed ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( completed == null ) {
+						name = requestHeadersNames[ name.toLowerCase() ] =
+							requestHeadersNames[ name.toLowerCase() ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( completed == null ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( completed ) {
+
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						} else {
+
+							// Lazy-add the new callbacks in a way that preserves old ones
+							for ( code in map ) {
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+
+		// Add protocol if not provided (prefilters might expect it)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || location.href ) + "" )
+			.replace( rprotocol, location.protocol + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+		// A cross-domain request is in order when the origin doesn't match the current origin.
+		if ( s.crossDomain == null ) {
+			urlAnchor = document.createElement( "a" );
+
+			// Support: IE <=8 - 11, Edge 12 - 15
+			// IE throws exception on accessing the href property if url is malformed,
+			// e.g. http://example.com:80x/
+			try {
+				urlAnchor.href = s.url;
+
+				// Support: IE <=8 - 11 only
+				// Anchor's host property isn't correctly set when s.url is relative
+				urlAnchor.href = urlAnchor.href;
+				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+					urlAnchor.protocol + "//" + urlAnchor.host;
+			} catch ( e ) {
+
+				// If there is an error parsing the URL, assume it is crossDomain,
+				// it can be rejected by the transport if it is invalid
+				s.crossDomain = true;
+			}
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( completed ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		// Remove hash to simplify url manipulation
+		cacheURL = s.url.replace( rhash, "" );
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// Remember the hash so we can put it back
+			uncached = s.url.slice( cacheURL.length );
+
+			// If data is available and should be processed, append data to url
+			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
+				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add or update anti-cache param if needed
+			if ( s.cache === false ) {
+				cacheURL = cacheURL.replace( rantiCache, "$1" );
+				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
+			}
+
+			// Put hash and anti-cache on the URL that will be requested (gh-1732)
+			s.url = cacheURL + uncached;
+
+		// Change '%20' to '+' if this is encoded form body content (gh-2658)
+		} else if ( s.data && s.processData &&
+			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+			s.data = s.data.replace( r20, "+" );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+				s.accepts[ s.dataTypes[ 0 ] ] +
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &&
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// Aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		completeDeferred.add( s.complete );
+		jqXHR.done( s.success );
+		jqXHR.fail( s.error );
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+
+			// If request was aborted inside ajaxSend, stop there
+			if ( completed ) {
+				return jqXHR;
+			}
+
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = window.setTimeout( function() {
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				completed = false;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+
+				// Rethrow post-completion exceptions
+				if ( completed ) {
+					throw e;
+				}
+
+				// Propagate others as results
+				done( -1, e );
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Ignore repeat invocations
+			if ( completed ) {
+				return;
+			}
+
+			completed = true;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				window.clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader( "etag" );
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+
+				// Extract error from statusText and normalize for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+
+		// Shift arguments if data argument was omitted
+		if ( isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		// The url can be an options object (which then must have .url)
+		return jQuery.ajax( jQuery.extend( {
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		}, jQuery.isPlainObject( url ) && url ) );
+	};
+} );
+
+
+jQuery._evalUrl = function( url, options ) {
+	return jQuery.ajax( {
+		url: url,
+
+		// Make this explicit, since user can override this through ajaxSetup (#11264)
+		type: "GET",
+		dataType: "script",
+		cache: true,
+		async: false,
+		global: false,
+
+		// Only evaluate the response if it is successful (gh-4126)
+		// dataFilter is not invoked for failure responses, so using it instead
+		// of the default converter is kludgy but it works.
+		converters: {
+			"text script": function() {}
+		},
+		dataFilter: function( response ) {
+			jQuery.globalEval( response, options );
+		}
+	} );
+};
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		var wrap;
+
+		if ( this[ 0 ] ) {
+			if ( isFunction( html ) ) {
+				html = html.call( this[ 0 ] );
+			}
+
+			// The elements to wrap the target around
+			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstElementChild ) {
+					elem = elem.firstElementChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var htmlIsFunction = isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function( selector ) {
+		this.parent( selector ).not( "body" ).each( function() {
+			jQuery( this ).replaceWith( this.childNodes );
+		} );
+		return this;
+	}
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+	return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+		// File protocol always yields status code 0, assume 200
+		0: 200,
+
+		// Support: IE <=9 only
+		// #1450: sometimes IE returns 1223 when it should be 204
+		1223: 204
+	},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+	var callback, errorCallback;
+
+	// Cross domain only allowed if supported through XMLHttpRequest
+	if ( support.cors || xhrSupported && !options.crossDomain ) {
+		return {
+			send: function( headers, complete ) {
+				var i,
+					xhr = options.xhr();
+
+				xhr.open(
+					options.type,
+					options.url,
+					options.async,
+					options.username,
+					options.password
+				);
+
+				// Apply custom fields if provided
+				if ( options.xhrFields ) {
+					for ( i in options.xhrFields ) {
+						xhr[ i ] = options.xhrFields[ i ];
+					}
+				}
+
+				// Override mime type if needed
+				if ( options.mimeType && xhr.overrideMimeType ) {
+					xhr.overrideMimeType( options.mimeType );
+				}
+
+				// X-Requested-With header
+				// For cross-domain requests, seeing as conditions for a preflight are
+				// akin to a jigsaw puzzle, we simply never set it to be sure.
+				// (it can always be set on a per-request basis or even using ajaxSetup)
+				// For same-domain requests, won't change header if already provided.
+				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+					headers[ "X-Requested-With" ] = "XMLHttpRequest";
+				}
+
+				// Set headers
+				for ( i in headers ) {
+					xhr.setRequestHeader( i, headers[ i ] );
+				}
+
+				// Callback
+				callback = function( type ) {
+					return function() {
+						if ( callback ) {
+							callback = errorCallback = xhr.onload =
+								xhr.onerror = xhr.onabort = xhr.ontimeout =
+									xhr.onreadystatechange = null;
+
+							if ( type === "abort" ) {
+								xhr.abort();
+							} else if ( type === "error" ) {
+
+								// Support: IE <=9 only
+								// On a manual native abort, IE9 throws
+								// errors on any property access that is not readyState
+								if ( typeof xhr.status !== "number" ) {
+									complete( 0, "error" );
+								} else {
+									complete(
+
+										// File: protocol always yields status 0; see #8605, #14207
+										xhr.status,
+										xhr.statusText
+									);
+								}
+							} else {
+								complete(
+									xhrSuccessStatus[ xhr.status ] || xhr.status,
+									xhr.statusText,
+
+									// Support: IE <=9 only
+									// IE9 has no XHR2 but throws on binary (trac-11426)
+									// For XHR2 non-text, let the caller handle it (gh-2498)
+									( xhr.responseType || "text" ) !== "text"  ||
+									typeof xhr.responseText !== "string" ?
+										{ binary: xhr.response } :
+										{ text: xhr.responseText },
+									xhr.getAllResponseHeaders()
+								);
+							}
+						}
+					};
+				};
+
+				// Listen to events
+				xhr.onload = callback();
+				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
+
+				// Support: IE 9 only
+				// Use onreadystatechange to replace onabort
+				// to handle uncaught aborts
+				if ( xhr.onabort !== undefined ) {
+					xhr.onabort = errorCallback;
+				} else {
+					xhr.onreadystatechange = function() {
+
+						// Check readyState before timeout as it changes
+						if ( xhr.readyState === 4 ) {
+
+							// Allow onerror to be called first,
+							// but that will not handle a native abort
+							// Also, save errorCallback to a variable
+							// as xhr.onerror cannot be accessed
+							window.setTimeout( function() {
+								if ( callback ) {
+									errorCallback();
+								}
+							} );
+						}
+					};
+				}
+
+				// Create the abort callback
+				callback = callback( "abort" );
+
+				try {
+
+					// Do send the request (this may raise an exception)
+					xhr.send( options.hasContent && options.data || null );
+				} catch ( e ) {
+
+					// #14683: Only rethrow if this hasn't been notified as an error yet
+					if ( callback ) {
+						throw e;
+					}
+				}
+			},
+
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+	if ( s.crossDomain ) {
+		s.contents.script = false;
+	}
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+	accepts: {
+		script: "text/javascript, application/javascript, " +
+			"application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /\b(?:java|ecma)script\b/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+	// This transport only deals with cross domain or forced-by-attrs requests
+	if ( s.crossDomain || s.scriptAttrs ) {
+		var script, callback;
+		return {
+			send: function( _, complete ) {
+				script = jQuery( "<script>" )
+					.attr( s.scriptAttrs || {} )
+					.prop( { charset: s.scriptCharset, src: s.url } )
+					.on( "load error", callback = function( evt ) {
+						script.remove();
+						callback = null;
+						if ( evt ) {
+							complete( evt.type === "error" ? 404 : 200, evt.type );
+						}
+					} );
+
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				document.head.appendChild( script[ 0 ] );
+			},
+			abort: function() {
+				if ( callback ) {
+					callback();
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" &&
+				( s.contentType || "" )
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+				rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters[ "script json" ] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// Force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always( function() {
+
+			// If previous value didn't exist - remove it
+			if ( overwritten === undefined ) {
+				jQuery( window ).removeProp( callbackName );
+
+			// Otherwise restore preexisting value
+			} else {
+				window[ callbackName ] = overwritten;
+			}
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+
+				// Make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// Save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		} );
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+	var body = document.implementation.createHTMLDocument( "" ).body;
+	body.innerHTML = "<form></form><form></form>";
+	return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( typeof data !== "string" ) {
+		return [];
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+
+	var base, parsed, scripts;
+
+	if ( !context ) {
+
+		// Stop scripts or inline event handlers from being executed immediately
+		// by using document.implementation
+		if ( support.createHTMLDocument ) {
+			context = document.implementation.createHTMLDocument( "" );
+
+			// Set the base href for the created document
+			// so any parsed elements with URLs
+			// are based on the document's URL (gh-2965)
+			base = context.createElement( "base" );
+			base.href = document.location.href;
+			context.head.appendChild( base );
+		} else {
+			context = document;
+		}
+	}
+
+	parsed = rsingleTag.exec( data );
+	scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	var selector, type, response,
+		self = this,
+		off = url.indexOf( " " );
+
+	if ( off > -1 ) {
+		selector = stripAndCollapse( url.slice( off ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax( {
+			url: url,
+
+			// If "type" variable is undefined, then "GET" method will be used.
+			// Make value of this field explicit since
+			// user can override it through ajaxSetup method
+			type: type || "GET",
+			dataType: "html",
+			data: params
+		} ).done( function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
+		// but they are ignored because response was set above.
+		// If it fails, this function gets "jqXHR", "status", "error"
+		} ).always( callback && function( jqXHR, status ) {
+			self.each( function() {
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+			} );
+		} );
+	}
+
+	return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [
+	"ajaxStart",
+	"ajaxStop",
+	"ajaxComplete",
+	"ajaxError",
+	"ajaxSuccess",
+	"ajaxSend"
+], function( i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+} );
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+	return jQuery.grep( jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	} ).length;
+};
+
+
+
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// Set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+		// Need to be able to calculate position if either
+		// top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+
+	// offset() relates an element's border box to the document origin
+	offset: function( options ) {
+
+		// Preserve chaining for setter
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var rect, win,
+			elem = this[ 0 ];
+
+		if ( !elem ) {
+			return;
+		}
+
+		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+		// Support: IE <=11 only
+		// Running getBoundingClientRect on a
+		// disconnected node in IE throws an error
+		if ( !elem.getClientRects().length ) {
+			return { top: 0, left: 0 };
+		}
+
+		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
+		rect = elem.getBoundingClientRect();
+		win = elem.ownerDocument.defaultView;
+		return {
+			top: rect.top + win.pageYOffset,
+			left: rect.left + win.pageXOffset
+		};
+	},
+
+	// position() relates an element's margin box to its offset parent's padding box
+	// This corresponds to the behavior of CSS absolute positioning
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset, doc,
+			elem = this[ 0 ],
+			parentOffset = { top: 0, left: 0 };
+
+		// position:fixed elements are offset from the viewport, which itself always has zero offset
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// Assume position:fixed implies availability of getBoundingClientRect
+			offset = elem.getBoundingClientRect();
+
+		} else {
+			offset = this.offset();
+
+			// Account for the *real* offset parent, which can be the document or its root element
+			// when a statically positioned element is identified
+			doc = elem.ownerDocument;
+			offsetParent = elem.offsetParent || doc.documentElement;
+			while ( offsetParent &&
+				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+				jQuery.css( offsetParent, "position" ) === "static" ) {
+
+				offsetParent = offsetParent.parentNode;
+			}
+			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
+
+				// Incorporate borders into its offset, since they are outside its content origin
+				parentOffset = jQuery( offsetParent ).offset();
+				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+			}
+		}
+
+		// Subtract parent offsets and element margins
+		return {
+			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	// This method will return documentElement in the following cases:
+	// 1) For the element inside the iframe without offsetParent, this method will return
+	//    documentElement of the parent window
+	// 2) For the hidden or detached element
+	// 3) For body or html element, i.e. in case of the html node - it will return itself
+	//
+	// but those exceptions were never presented as a real life use-cases
+	// and might be considered as more preferable results.
+	//
+	// This logic, however, is not guaranteed and can change at any point in the future
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = "pageYOffset" === prop;
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+
+			// Coalesce documents and windows
+			var win;
+			if ( isWindow( elem ) ) {
+				win = elem;
+			} else if ( elem.nodeType === 9 ) {
+				win = elem.defaultView;
+			}
+
+			if ( val === undefined ) {
+				return win ? win[ prop ] : elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : win.pageXOffset,
+					top ? val : win.pageYOffset
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length );
+	};
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// If curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+		function( defaultExtra, funcName ) {
+
+		// Margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( isWindow( elem ) ) {
+
+					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+					return funcName.indexOf( "outer" ) === 0 ?
+						elem[ "inner" + name ] :
+						elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable );
+		};
+	} );
+} );
+
+
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
+	function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+} );
+
+jQuery.fn.extend( {
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	}
+} );
+
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+	var tmp, args, proxy;
+
+	if ( typeof context === "string" ) {
+		tmp = fn[ context ];
+		context = fn;
+		fn = tmp;
+	}
+
+	// Quick check to determine if target is callable, in the spec
+	// this throws a TypeError, but we will just return undefined.
+	if ( !isFunction( fn ) ) {
+		return undefined;
+	}
+
+	// Simulated bind
+	args = slice.call( arguments, 2 );
+	proxy = function() {
+		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+	};
+
+	// Set the guid of unique handler to the same of original handler, so it can be removed
+	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+	return proxy;
+};
+
+jQuery.holdReady = function( hold ) {
+	if ( hold ) {
+		jQuery.readyWait++;
+	} else {
+		jQuery.ready( true );
+	}
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+	// As of jQuery 3.0, isNumeric is limited to
+	// strings and numbers (primitives or objects)
+	// that can be coerced to finite numbers (gh-2662)
+	var type = jQuery.type( obj );
+	return ( type === "number" || type === "string" ) &&
+
+		// parseFloat NaNs numeric-cast false positives ("")
+		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+		// subtraction forces infinities to NaN
+		!isNaN( obj - parseFloat( obj ) );
+};
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	} );
+}
+
+
+
+
+var
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( !noGlobal ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
+
+/*!
+ * Lightbox v2.11.2
+ * by Lokesh Dhakar
+ *
+ * More info:
+ * http://lokeshdhakar.com/projects/lightbox2/
+ *
+ * Copyright Lokesh Dhakar
+ * Released under the MIT license
+ * https://github.com/lokesh/lightbox2/blob/master/LICENSE
+ *
+ * @preserve
+ */
+
+// Uses Node, AMD or browser globals to create a module.
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['jquery'], factory);
+    } else if (typeof exports === 'object') {
+        // Node. Does not work with strict CommonJS, but
+        // only CommonJS-like environments that support module.exports,
+        // like Node.
+        module.exports = factory(require('jquery'));
+    } else {
+        // Browser globals (root is window)
+        root.lightbox = factory(root.jQuery);
+    }
+}(this, function ($) {
+
+  function Lightbox(options) {
+    this.album = [];
+    this.currentImageIndex = void 0;
+    this.init();
+
+    // options
+    this.options = $.extend({}, this.constructor.defaults);
+    this.option(options);
+  }
+
+  // Descriptions of all options available on the demo site:
+  // http://lokeshdhakar.com/projects/lightbox2/index.html#options
+  Lightbox.defaults = {
+    albumLabel: 'Image %1 of %2',
+    alwaysShowNavOnTouchDevices: false,
+    fadeDuration: 600,
+    fitImagesInViewport: true,
+    imageFadeDuration: 600,
+    // maxWidth: 800,
+    // maxHeight: 600,
+    positionFromTop: 50,
+    resizeDuration: 700,
+    showImageNumberLabel: true,
+    wrapAround: false,
+    disableScrolling: false,
+    /*
+    Sanitize Title
+    If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
+    This will free you to add html tags, such as links, in the caption.
+
+    If the caption data is user submitted or from some other untrusted source, then set this to true
+    to prevent xss and other injection attacks.
+     */
+    sanitizeTitle: false
+  };
+
+  Lightbox.prototype.option = function(options) {
+    $.extend(this.options, options);
+  };
+
+  Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
+    return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
+  };
+
+  Lightbox.prototype.init = function() {
+    var self = this;
+    // Both enable and build methods require the body tag to be in the DOM.
+    $(document).ready(function() {
+      self.enable();
+      self.build();
+    });
+  };
+
+  // Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
+  // that contain 'lightbox'. When these are clicked, start lightbox.
+  Lightbox.prototype.enable = function() {
+    var self = this;
+    $('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
+      self.start($(event.currentTarget));
+      return false;
+    });
+  };
+
+  // Build html for the lightbox and the overlay.
+  // Attach event handlers to the new DOM elements. click click click
+  Lightbox.prototype.build = function() {
+    if ($('#lightbox').length > 0) {
+        return;
+    }
+
+    var self = this;
+
+    // The two root notes generated, #lightboxOverlay and #lightbox are given
+    // tabindex attrs so they are focusable. We attach our keyboard event
+    // listeners to these two elements, and not the document. Clicking anywhere
+    // while Lightbox is opened will keep the focus on or inside one of these
+    // two elements.
+    //
+    // We do this so we can prevent propogation of the Esc keypress when
+    // Lightbox is open. This prevents it from intefering with other components
+    // on the page below.
+    //
+    // Github issue: https://github.com/lokesh/lightbox2/issues/663
+    $('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
+
+    // Cache jQuery objects
+    this.$lightbox       = $('#lightbox');
+    this.$overlay        = $('#lightboxOverlay');
+    this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
+    this.$container      = this.$lightbox.find('.lb-container');
+    this.$image          = this.$lightbox.find('.lb-image');
+    this.$nav            = this.$lightbox.find('.lb-nav');
+
+    // Store css values for future lookup
+    this.containerPadding = {
+      top: parseInt(this.$container.css('padding-top'), 10),
+      right: parseInt(this.$container.css('padding-right'), 10),
+      bottom: parseInt(this.$container.css('padding-bottom'), 10),
+      left: parseInt(this.$container.css('padding-left'), 10)
+    };
+
+    this.imageBorderWidth = {
+      top: parseInt(this.$image.css('border-top-width'), 10),
+      right: parseInt(this.$image.css('border-right-width'), 10),
+      bottom: parseInt(this.$image.css('border-bottom-width'), 10),
+      left: parseInt(this.$image.css('border-left-width'), 10)
+    };
+
+    // Attach event handlers to the newly minted DOM elements
+    this.$overlay.hide().on('click', function() {
+      self.end();
+      return false;
+    });
+
+    this.$lightbox.hide().on('click', function(event) {
+      if ($(event.target).attr('id') === 'lightbox') {
+        self.end();
+      }
+    });
+
+    this.$outerContainer.on('click', function(event) {
+      if ($(event.target).attr('id') === 'lightbox') {
+        self.end();
+      }
+      return false;
+    });
+
+    this.$lightbox.find('.lb-prev').on('click', function() {
+      if (self.currentImageIndex === 0) {
+        self.changeImage(self.album.length - 1);
+      } else {
+        self.changeImage(self.currentImageIndex - 1);
+      }
+      return false;
+    });
+
+    this.$lightbox.find('.lb-next').on('click', function() {
+      if (self.currentImageIndex === self.album.length - 1) {
+        self.changeImage(0);
+      } else {
+        self.changeImage(self.currentImageIndex + 1);
+      }
+      return false;
+    });
+
+    /*
+      Show context menu for image on right-click
+
+      There is a div containing the navigation that spans the entire image and lives above of it. If
+      you right-click, you are right clicking this div and not the image. This prevents users from
+      saving the image or using other context menu actions with the image.
+
+      To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
+      set pointer-events to none on the nav div. This is so that the upcoming right-click event on
+      the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
+      we set the pointer events back to auto for the nav div so it can capture hover and left-click
+      events as usual.
+     */
+    this.$nav.on('mousedown', function(event) {
+      if (event.which === 3) {
+        self.$nav.css('pointer-events', 'none');
+
+        self.$lightbox.one('contextmenu', function() {
+          setTimeout(function() {
+              this.$nav.css('pointer-events', 'auto');
+          }.bind(self), 0);
+        });
+      }
+    });
+
+
+    this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
+      self.end();
+      return false;
+    });
+  };
+
+  // Show overlay and lightbox. If the image is part of a set, add siblings to album array.
+  Lightbox.prototype.start = function($link) {
+    var self    = this;
+    var $window = $(window);
+
+    $window.on('resize', $.proxy(this.sizeOverlay, this));
+
+    this.sizeOverlay();
+
+    this.album = [];
+    var imageNumber = 0;
+
+    function addToAlbum($link) {
+      self.album.push({
+        alt: $link.attr('data-alt'),
+        link: $link.attr('href'),
+        title: $link.attr('data-title') || $link.attr('title')
+      });
+    }
+
+    // Support both data-lightbox attribute and rel attribute implementations
+    var dataLightboxValue = $link.attr('data-lightbox');
+    var $links;
+
+    if (dataLightboxValue) {
+      $links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
+      for (var i = 0; i < $links.length; i = ++i) {
+        addToAlbum($($links[i]));
+        if ($links[i] === $link[0]) {
+          imageNumber = i;
+        }
+      }
+    } else {
+      if ($link.attr('rel') === 'lightbox') {
+        // If image is not part of a set
+        addToAlbum($link);
+      } else {
+        // If image is part of a set
+        $links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
+        for (var j = 0; j < $links.length; j = ++j) {
+          addToAlbum($($links[j]));
+          if ($links[j] === $link[0]) {
+            imageNumber = j;
+          }
+        }
+      }
+    }
+
+    // Position Lightbox
+    var top  = $window.scrollTop() + this.options.positionFromTop;
+    var left = $window.scrollLeft();
+    this.$lightbox.css({
+      top: top + 'px',
+      left: left + 'px'
+    }).fadeIn(this.options.fadeDuration);
+
+    // Disable scrolling of the page while open
+    if (this.options.disableScrolling) {
+      $('body').addClass('lb-disable-scrolling');
+    }
+
+    this.changeImage(imageNumber);
+  };
+
+  // Hide most UI elements in preparation for the animated resizing of the lightbox.
+  Lightbox.prototype.changeImage = function(imageNumber) {
+    var self = this;
+    var filename = this.album[imageNumber].link;
+    var filetype = filename.split('.').slice(-1)[0];
+    var $image = this.$lightbox.find('.lb-image');
+
+    // Disable keyboard nav during transitions
+    this.disableKeyboardNav();
+
+    // Show loading state
+    this.$overlay.fadeIn(this.options.fadeDuration);
+    $('.lb-loader').fadeIn('slow');
+    this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
+    this.$outerContainer.addClass('animating');
+
+    // When image to show is preloaded, we send the width and height to sizeContainer()
+    var preloader = new Image();
+    preloader.onload = function() {
+      var $preloader;
+      var imageHeight;
+      var imageWidth;
+      var maxImageHeight;
+      var maxImageWidth;
+      var windowHeight;
+      var windowWidth;
+
+      $image.attr({
+        'alt': self.album[imageNumber].alt,
+        'src': filename
+      });
+
+      $preloader = $(preloader);
+
+      $image.width(preloader.width);
+      $image.height(preloader.height);
+      windowWidth = $(window).width();
+      windowHeight = $(window).height();
+
+      // Calculate the max image dimensions for the current viewport.
+      // Take into account the border around the image and an additional 10px gutter on each side.
+      maxImageWidth  = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;
+      maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - self.options.positionFromTop - 70;
+
+      /*
+      Since many SVGs have small intrinsic dimensions, but they support scaling
+      up without quality loss because of their vector format, max out their
+      size.
+      */
+      if (filetype === 'svg') {
+        $image.width(maxImageWidth);
+        $image.height(maxImageHeight);
+      }
+
+      // Fit image inside the viewport.
+      if (self.options.fitImagesInViewport) {
+
+        // Check if image size is larger then maxWidth|maxHeight in settings
+        if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
+          maxImageWidth = self.options.maxWidth;
+        }
+        if (self.options.maxHeight && self.options.maxHeight < maxImageHeight) {
+          maxImageHeight = self.options.maxHeight;
+        }
+
+      } else {
+        maxImageWidth = self.options.maxWidth || preloader.width || maxImageWidth;
+        maxImageHeight = self.options.maxHeight || preloader.height || maxImageHeight;
+      }
+
+      // Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
+      // option than we need to size down while maintaining the aspect ratio.
+      if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
+        if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
+          imageWidth  = maxImageWidth;
+          imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
+          $image.width(imageWidth);
+          $image.height(imageHeight);
+        } else {
+          imageHeight = maxImageHeight;
+          imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
+          $image.width(imageWidth);
+          $image.height(imageHeight);
+        }
+      }
+      self.sizeContainer($image.width(), $image.height());
+    };
+
+    // Preload image before showing
+    preloader.src = this.album[imageNumber].link;
+    this.currentImageIndex = imageNumber;
+  };
+
+  // Stretch overlay to fit the viewport
+  Lightbox.prototype.sizeOverlay = function() {
+    var self = this;
+    /*
+    We use a setTimeout 0 to pause JS execution and let the rendering catch-up.
+    Why do this? If the `disableScrolling` option is set to true, a class is added to the body
+    tag that disables scrolling and hides the scrollbar. We want to make sure the scrollbar is
+    hidden before we measure the document width, as the presence of the scrollbar will affect the
+    number.
+    */
+    setTimeout(function() {
+      self.$overlay
+        .width($(document).width())
+        .height($(document).height());
+
+    }, 0);
+  };
+
+  // Animate the size of the lightbox to fit the image we are showing
+  // This method also shows the the image.
+  Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
+    var self = this;
+
+    var oldWidth  = this.$outerContainer.outerWidth();
+    var oldHeight = this.$outerContainer.outerHeight();
+    var newWidth  = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
+    var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
+
+    function postResize() {
+      self.$lightbox.find('.lb-dataContainer').width(newWidth);
+      self.$lightbox.find('.lb-prevLink').height(newHeight);
+      self.$lightbox.find('.lb-nextLink').height(newHeight);
+
+      // Set focus on one of the two root nodes so keyboard events are captured.
+      self.$overlay.focus();
+
+      self.showImage();
+    }
+
+    if (oldWidth !== newWidth || oldHeight !== newHeight) {
+      this.$outerContainer.animate({
+        width: newWidth,
+        height: newHeight
+      }, this.options.resizeDuration, 'swing', function() {
+        postResize();
+      });
+    } else {
+      postResize();
+    }
+  };
+
+  // Display the image and its details and begin preload neighboring images.
+  Lightbox.prototype.showImage = function() {
+    this.$lightbox.find('.lb-loader').stop(true).hide();
+    this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
+
+    this.updateNav();
+    this.updateDetails();
+    this.preloadNeighboringImages();
+    this.enableKeyboardNav();
+  };
+
+  // Display previous and next navigation if appropriate.
+  Lightbox.prototype.updateNav = function() {
+    // Check to see if the browser supports touch events. If so, we take the conservative approach
+    // and assume that mouse hover events are not supported and always show prev/next navigation
+    // arrows in image sets.
+    var alwaysShowNav = false;
+    try {
+      document.createEvent('TouchEvent');
+      alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
+    } catch (e) {}
+
+    this.$lightbox.find('.lb-nav').show();
+
+    if (this.album.length > 1) {
+      if (this.options.wrapAround) {
+        if (alwaysShowNav) {
+          this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
+        }
+        this.$lightbox.find('.lb-prev, .lb-next').show();
+      } else {
+        if (this.currentImageIndex > 0) {
+          this.$lightbox.find('.lb-prev').show();
+          if (alwaysShowNav) {
+            this.$lightbox.find('.lb-prev').css('opacity', '1');
+          }
+        }
+        if (this.currentImageIndex < this.album.length - 1) {
+          this.$lightbox.find('.lb-next').show();
+          if (alwaysShowNav) {
+            this.$lightbox.find('.lb-next').css('opacity', '1');
+          }
+        }
+      }
+    }
+  };
+
+  // Display caption, image number, and closing button.
+  Lightbox.prototype.updateDetails = function() {
+    var self = this;
+
+    // Enable anchor clicks in the injected caption html.
+    // Thanks Nate Wright for the fix. @https://github.com/NateWr
+    if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
+      this.album[this.currentImageIndex].title !== '') {
+      var $caption = this.$lightbox.find('.lb-caption');
+      if (this.options.sanitizeTitle) {
+        $caption.text(this.album[this.currentImageIndex].title);
+      } else {
+        $caption.html(this.album[this.currentImageIndex].title);
+      }
+      $caption.fadeIn('fast');
+    }
+
+    if (this.album.length > 1 && this.options.showImageNumberLabel) {
+      var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
+      this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
+    } else {
+      this.$lightbox.find('.lb-number').hide();
+    }
+
+    this.$outerContainer.removeClass('animating');
+
+    this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
+      return self.sizeOverlay();
+    });
+  };
+
+  // Preload previous and next images in set.
+  Lightbox.prototype.preloadNeighboringImages = function() {
+    if (this.album.length > this.currentImageIndex + 1) {
+      var preloadNext = new Image();
+      preloadNext.src = this.album[this.currentImageIndex + 1].link;
+    }
+    if (this.currentImageIndex > 0) {
+      var preloadPrev = new Image();
+      preloadPrev.src = this.album[this.currentImageIndex - 1].link;
+    }
+  };
+
+  Lightbox.prototype.enableKeyboardNav = function() {
+    this.$lightbox.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
+    this.$overlay.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
+  };
+
+  Lightbox.prototype.disableKeyboardNav = function() {
+    this.$lightbox.off('.keyboard');
+    this.$overlay.off('.keyboard');
+  };
+
+  Lightbox.prototype.keyboardAction = function(event) {
+    var KEYCODE_ESC        = 27;
+    var KEYCODE_LEFTARROW  = 37;
+    var KEYCODE_RIGHTARROW = 39;
+
+    var keycode = event.keyCode;
+    if (keycode === KEYCODE_ESC) {
+      // Prevent bubbling so as to not affect other components on the page.
+      event.stopPropagation();
+      this.end();
+    } else if (keycode === KEYCODE_LEFTARROW) {
+      if (this.currentImageIndex !== 0) {
+        this.changeImage(this.currentImageIndex - 1);
+      } else if (this.options.wrapAround && this.album.length > 1) {
+        this.changeImage(this.album.length - 1);
+      }
+    } else if (keycode === KEYCODE_RIGHTARROW) {
+      if (this.currentImageIndex !== this.album.length - 1) {
+        this.changeImage(this.currentImageIndex + 1);
+      } else if (this.options.wrapAround && this.album.length > 1) {
+        this.changeImage(0);
+      }
+    }
+  };
+
+  // Closing time. :-(
+  Lightbox.prototype.end = function() {
+    this.disableKeyboardNav();
+    $(window).off('resize', this.sizeOverlay);
+    this.$lightbox.fadeOut(this.options.fadeDuration);
+    this.$overlay.fadeOut(this.options.fadeDuration);
+
+    if (this.options.disableScrolling) {
+      $('body').removeClass('lb-disable-scrolling');
+    }
+  };
+
+  return new Lightbox();
+}));
diff --git a/dist/js/lightbox-plus-jquery.min.js b/dist/js/lightbox-plus-jquery.min.js
new file mode 100644
index 0000000..8fad982
--- /dev/null
+++ b/dist/js/lightbox-plus-jquery.min.js
@@ -0,0 +1,38 @@
+/*!
+ * jQuery JavaScript Library v3.4.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2019-05-01T21:04Z
+ */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";function c(a,b,c){c=c||ia;var d,e,f=c.createElement("script");if(f.text=a,b)for(d in wa)(e=b[d]||b.getAttribute&&b.getAttribute(d))&&f.setAttribute(d,e);c.head.appendChild(f).parentNode.removeChild(f)}function d(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?oa[pa.call(a)]||"object":typeof a}function e(a){var b=!!a&&"length"in a&&a.length,c=d(a);return!ua(a)&&!va(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}function f(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}function g(a,b,c){return ua(b)?ya.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?ya.grep(a,function(a){return a===b!==c}):"string"!=typeof b?ya.grep(a,function(a){return na.call(b,a)>-1!==c}):ya.filter(b,a,c)}function h(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function i(a){var b={};return ya.each(a.match(Ja)||[],function(a,c){b[c]=!0}),b}function j(a){return a}function k(a){throw a}function l(a,b,c,d){var e;try{a&&ua(e=a.promise)?e.call(a).done(b).fail(c):a&&ua(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}function m(){ia.removeEventListener("DOMContentLoaded",m),a.removeEventListener("load",m),ya.ready()}function n(a,b){return b.toUpperCase()}function o(a){return a.replace(Na,"ms-").replace(Oa,n)}function p(){this.expando=ya.expando+p.uid++}function q(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Sa.test(a)?JSON.parse(a):a)}function r(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Ta,"-$&").toLowerCase(),"string"==typeof(c=a.getAttribute(d))){try{c=q(c)}catch(a){}Ra.set(a,b,c)}else c=void 0;return c}function s(a,b,c,d){var e,f,g=20,h=d?function(){return d.cur()}:function(){return ya.css(a,b,"")},i=h(),j=c&&c[3]||(ya.cssNumber[b]?"":"px"),k=a.nodeType&&(ya.cssNumber[b]||"px"!==j&&+i)&&Va.exec(ya.css(a,b));if(k&&k[3]!==j){for(i/=2,j=j||k[3],k=+i||1;g--;)ya.style(a,b,k+j),(1-f)*(1-(f=h()/i||.5))<=0&&(g=0),k/=f;k*=2,ya.style(a,b,k+j),c=c||[]}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}function t(a){var b,c=a.ownerDocument,d=a.nodeName,e=ab[d];return e||(b=c.body.appendChild(c.createElement(d)),e=ya.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ab[d]=e,e)}function u(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=Qa.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&$a(d)&&(e[f]=t(d))):"none"!==c&&(e[f]="none",Qa.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}function v(a,b){var c;return c=void 0!==a.getElementsByTagName?a.getElementsByTagName(b||"*"):void 0!==a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&f(a,b)?ya.merge([a],c):c}function w(a,b){for(var c=0,d=a.length;c<d;c++)Qa.set(a[c],"globalEval",!b||Qa.get(b[c],"globalEval"))}function x(a,b,c,e,f){for(var g,h,i,j,k,l,m=b.createDocumentFragment(),n=[],o=0,p=a.length;o<p;o++)if((g=a[o])||0===g)if("object"===d(g))ya.merge(n,g.nodeType?[g]:g);else if(fb.test(g)){for(h=h||m.appendChild(b.createElement("div")),i=(cb.exec(g)||["",""])[1].toLowerCase(),j=eb[i]||eb._default,h.innerHTML=j[1]+ya.htmlPrefilter(g)+j[2],l=j[0];l--;)h=h.lastChild;ya.merge(n,h.childNodes),h=m.firstChild,h.textContent=""}else n.push(b.createTextNode(g));for(m.textContent="",o=0;g=n[o++];)if(e&&ya.inArray(g,e)>-1)f&&f.push(g);else if(k=Ya(g),h=v(m.appendChild(g),"script"),k&&w(h),c)for(l=0;g=h[l++];)db.test(g.type||"")&&c.push(g);return m}function y(){return!0}function z(){return!1}function A(a,b){return a===B()==("focus"===b)}function B(){try{return ia.activeElement}catch(a){}}function C(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)C(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),!1===e)e=z;else if(!e)return a;return 1===f&&(g=e,e=function(a){return ya().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=ya.guid++)),a.each(function(){ya.event.add(this,b,e,d,c)})}function D(a,b,c){if(!c)return void(void 0===Qa.get(a,b)&&ya.event.add(a,b,y));Qa.set(a,b,!1),ya.event.add(a,b,{namespace:!1,handler:function(a){var d,e,f=Qa.get(this,b);if(1&a.isTrigger&&this[b]){if(f.length)(ya.event.special[b]||{}).delegateType&&a.stopPropagation();else if(f=ka.call(arguments),Qa.set(this,b,f),d=c(this,b),this[b](),e=Qa.get(this,b),f!==e||d?Qa.set(this,b,!1):e={},f!==e)return a.stopImmediatePropagation(),a.preventDefault(),e.value}else f.length&&(Qa.set(this,b,{value:ya.event.trigger(ya.extend(f[0],ya.Event.prototype),f.slice(1),this)}),a.stopImmediatePropagation())}})}function E(a,b){return f(a,"table")&&f(11!==b.nodeType?b:b.firstChild,"tr")?ya(a).children("tbody")[0]||a:a}function F(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function G(a){return"true/"===(a.type||"").slice(0,5)?a.type=a.type.slice(5):a.removeAttribute("type"),a}function H(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(Qa.hasData(a)&&(f=Qa.access(a),g=Qa.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)ya.event.add(b,e,j[e][c])}Ra.hasData(a)&&(h=Ra.access(a),i=ya.extend({},h),Ra.set(b,i))}}function I(a,b){var c=b.nodeName.toLowerCase();"input"===c&&bb.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function J(a,b,d,e){b=la.apply([],b);var f,g,h,i,j,k,l=0,m=a.length,n=m-1,o=b[0],p=ua(o);if(p||m>1&&"string"==typeof o&&!ta.checkClone&&lb.test(o))return a.each(function(c){var f=a.eq(c);p&&(b[0]=o.call(this,c,f.html())),J(f,b,d,e)});if(m&&(f=x(b,a[0].ownerDocument,!1,a,e),g=f.firstChild,1===f.childNodes.length&&(f=g),g||e)){for(h=ya.map(v(f,"script"),F),i=h.length;l<m;l++)j=f,l!==n&&(j=ya.clone(j,!0,!0),i&&ya.merge(h,v(j,"script"))),d.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,ya.map(h,G),l=0;l<i;l++)j=h[l],db.test(j.type||"")&&!Qa.access(j,"globalEval")&&ya.contains(k,j)&&(j.src&&"module"!==(j.type||"").toLowerCase()?ya._evalUrl&&!j.noModule&&ya._evalUrl(j.src,{nonce:j.nonce||j.getAttribute("nonce")}):c(j.textContent.replace(mb,""),j,k))}return a}function K(a,b,c){for(var d,e=b?ya.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||ya.cleanData(v(d)),d.parentNode&&(c&&Ya(d)&&w(v(d,"script")),d.parentNode.removeChild(d));return a}function L(a,b,c){var d,e,f,g,h=a.style;return c=c||ob(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||Ya(a)||(g=ya.style(a,b)),!ta.pixelBoxStyles()&&nb.test(g)&&pb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function M(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function N(a){for(var b=a[0].toUpperCase()+a.slice(1),c=qb.length;c--;)if((a=qb[c]+b)in rb)return a}function O(a){var b=ya.cssProps[a]||sb[a];return b||(a in rb?a:sb[a]=N(a)||a)}function P(a,b,c){var d=Va.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Q(a,b,c,d,e,f){var g="width"===b?1:0,h=0,i=0;if(c===(d?"border":"content"))return 0;for(;g<4;g+=2)"margin"===c&&(i+=ya.css(a,c+Wa[g],!0,e)),d?("content"===c&&(i-=ya.css(a,"padding"+Wa[g],!0,e)),"margin"!==c&&(i-=ya.css(a,"border"+Wa[g]+"Width",!0,e))):(i+=ya.css(a,"padding"+Wa[g],!0,e),"padding"!==c?i+=ya.css(a,"border"+Wa[g]+"Width",!0,e):h+=ya.css(a,"border"+Wa[g]+"Width",!0,e));return!d&&f>=0&&(i+=Math.max(0,Math.ceil(a["offset"+b[0].toUpperCase()+b.slice(1)]-f-i-h-.5))||0),i}function R(a,b,c){var d=ob(a),e=!ta.boxSizingReliable()||c,f=e&&"border-box"===ya.css(a,"boxSizing",!1,d),g=f,h=L(a,b,d),i="offset"+b[0].toUpperCase()+b.slice(1);if(nb.test(h)){if(!c)return h;h="auto"}return(!ta.boxSizingReliable()&&f||"auto"===h||!parseFloat(h)&&"inline"===ya.css(a,"display",!1,d))&&a.getClientRects().length&&(f="border-box"===ya.css(a,"boxSizing",!1,d),(g=i in a)&&(h=a[i])),(h=parseFloat(h)||0)+Q(a,b,c||(f?"border":"content"),g,d,h)+"px"}function S(a,b,c,d,e){return new S.prototype.init(a,b,c,d,e)}function T(){yb&&(!1===ia.hidden&&a.requestAnimationFrame?a.requestAnimationFrame(T):a.setTimeout(T,ya.fx.interval),ya.fx.tick())}function U(){return a.setTimeout(function(){xb=void 0}),xb=Date.now()}function V(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=Wa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function W(a,b,c){for(var d,e=(Z.tweeners[b]||[]).concat(Z.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function X(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&$a(a),q=Qa.get(a,"fxshow");c.queue||(g=ya._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,ya.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],zb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||ya.style(a,d)}if((i=!ya.isEmptyObject(b))||!ya.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=Qa.get(a,"display")),k=ya.css(a,"display"),"none"===k&&(j?k=j:(u([a],!0),j=a.style.display||j,k=ya.css(a,"display"),u([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===ya.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=Qa.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&u([a],!0),m.done(function(){p||u([a]),Qa.remove(a,"fxshow");for(d in n)ya.style(a,d,n[d])})),i=W(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function Y(a,b){var c,d,e,f,g;for(c in a)if(d=o(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),(g=ya.cssHooks[d])&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Z(a,b,c){var d,e,f=0,g=Z.prefilters.length,h=ya.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=xb||U(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:ya.extend({},b),opts:ya.extend(!0,{specialEasing:{},easing:ya.easing._default},c),originalProperties:b,originalOptions:c,startTime:xb||U(),duration:c.duration,tweens:[],createTween:function(b,c){var d=ya.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Y(k,j.opts.specialEasing);f<g;f++)if(d=Z.prefilters[f].call(j,a,k,j.opts))return ua(d.stop)&&(ya._queueHooks(j.elem,j.opts.queue).stop=d.stop.bind(d)),d;return ya.map(k,W,j),ua(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),ya.fx.timer(ya.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}function $(a){return(a.match(Ja)||[]).join(" ")}function _(a){return a.getAttribute&&a.getAttribute("class")||""}function aa(a){return Array.isArray(a)?a:"string"==typeof a?a.match(Ja)||[]:[]}function ba(a,b,c,e){var f;if(Array.isArray(b))ya.each(b,function(b,d){c||Lb.test(a)?e(a,d):ba(a+"["+("object"==typeof d&&null!=d?b:"")+"]",d,c,e)});else if(c||"object"!==d(b))e(a,b);else for(f in b)ba(a+"["+f+"]",b[f],c,e)}function ca(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(Ja)||[];if(ua(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function da(a,b,c,d){function e(h){var i;return f[h]=!0,ya.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===Xb;return e(b.dataTypes[0])||!f["*"]&&e("*")}function ea(a,b){var c,d,e=ya.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&ya.extend(!0,a,d),a}function fa(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function ga(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(!(g=j[i+" "+f]||j["* "+f]))for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){!0===g?g=j[e]:!0!==j[e]&&(f=h[0],k.unshift(h[1]));break}if(!0!==g)if(g&&a.throws)b=g(b);else try{b=g(b)}catch(a){return{state:"parsererror",error:g?a:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}var ha=[],ia=a.document,ja=Object.getPrototypeOf,ka=ha.slice,la=ha.concat,ma=ha.push,na=ha.indexOf,oa={},pa=oa.toString,qa=oa.hasOwnProperty,ra=qa.toString,sa=ra.call(Object),ta={},ua=function(a){return"function"==typeof a&&"number"!=typeof a.nodeType},va=function(a){return null!=a&&a===a.window},wa={type:!0,src:!0,nonce:!0,noModule:!0},xa="3.4.1",ya=function(a,b){return new ya.fn.init(a,b)},za=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;ya.fn=ya.prototype={jquery:xa,constructor:ya,length:0,toArray:function(){return ka.call(this)},get:function(a){return null==a?ka.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=ya.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return ya.each(this,a)},map:function(a){return this.pushStack(ya.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(ka.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:ma,sort:ha.sort,splice:ha.splice},ya.extend=ya.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||ua(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)d=a[b],"__proto__"!==b&&g!==d&&(j&&d&&(ya.isPlainObject(d)||(e=Array.isArray(d)))?(c=g[b],f=e&&!Array.isArray(c)?[]:e||ya.isPlainObject(c)?c:{},e=!1,g[b]=ya.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},ya.extend({expando:"jQuery"+(xa+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==pa.call(a))&&(!(b=ja(a))||"function"==typeof(c=qa.call(b,"constructor")&&b.constructor)&&ra.call(c)===sa)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},globalEval:function(a,b){c(a,{nonce:b&&b.nonce})},each:function(a,b){var c,d=0;if(e(a))for(c=a.length;d<c&&!1!==b.call(a[d],d,a[d]);d++);else for(d in a)if(!1===b.call(a[d],d,a[d]))break;return a},trim:function(a){return null==a?"":(a+"").replace(za,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(e(Object(a))?ya.merge(c,"string"==typeof a?[a]:a):ma.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:na.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d=[],e=0,f=a.length,g=!c;e<f;e++)!b(a[e],e)!==g&&d.push(a[e]);return d},map:function(a,b,c){var d,f,g=0,h=[];if(e(a))for(d=a.length;g<d;g++)null!=(f=b(a[g],g,c))&&h.push(f);else for(g in a)null!=(f=b(a[g],g,c))&&h.push(f);return la.apply([],h)},guid:1,support:ta}),"function"==typeof Symbol&&(ya.fn[Symbol.iterator]=ha[Symbol.iterator]),ya.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){oa["[object "+b+"]"]=b.toLowerCase()});var Aa=/*!
+ * Sizzle CSS Selector Engine v2.3.4
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2019-04-08
+ */
+function(a){function b(a,b,c,d){var e,f,g,h,i,j,k,m=b&&b.ownerDocument,o=b?b.nodeType:9;if(c=c||[],"string"!=typeof a||!a||1!==o&&9!==o&&11!==o)return c;if(!d&&((b?b.ownerDocument||b:P)!==H&&G(b),b=b||H,J)){if(11!==o&&(i=ta.exec(a)))if(e=i[1]){if(9===o){if(!(g=b.getElementById(e)))return c;if(g.id===e)return c.push(g),c}else if(m&&(g=m.getElementById(e))&&N(b,g)&&g.id===e)return c.push(g),c}else{if(i[2])return _.apply(c,b.getElementsByTagName(a)),c;if((e=i[3])&&w.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(e)),c}if(w.qsa&&!V[a+" "]&&(!K||!K.test(a))&&(1!==o||"object"!==b.nodeName.toLowerCase())){if(k=a,m=b,1===o&&la.test(a)){for((h=b.getAttribute("id"))?h=h.replace(xa,ya):b.setAttribute("id",h=O),j=A(a),f=j.length;f--;)j[f]="#"+h+" "+n(j[f]);k=j.join(","),m=ua.test(a)&&l(b.parentNode)||b}try{return _.apply(c,m.querySelectorAll(k)),c}catch(b){V(a,!0)}finally{h===O&&b.removeAttribute("id")}}}return C(a.replace(ia,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>x.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[O]=!0,a}function e(a){var b=H.createElement("fieldset");try{return!!a(b)}catch(a){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=c.length;d--;)x.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){return"input"===b.nodeName.toLowerCase()&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return function(b){return"form"in b?b.parentNode&&!1===b.disabled?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&Aa(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function k(a){return d(function(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function l(a){return a&&void 0!==a.getElementsByTagName&&a}function m(){}function n(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function o(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=R++;return b.first?function(b,c,e){for(;b=b[d];)if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[Q,h];if(i){for(;b=b[d];)if((1===b.nodeType||g)&&a(b,c,i))return!0}else for(;b=b[d];)if(1===b.nodeType||g)if(l=b[O]||(b[O]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===Q&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function p(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function q(a,c,d){for(var e=0,f=c.length;e<f;e++)b(a,c[e],d);return d}function r(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function s(a,b,c,e,f,g){return e&&!e[O]&&(e=s(e)),f&&!f[O]&&(f=s(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=d||q(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?p:r(p,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=r(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?ba(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=r(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function t(a){for(var b,c,d,e=a.length,f=x.relative[a[0].type],g=f||x.relative[" "],h=f?1:0,i=o(function(a){return a===b},g,!0),j=o(function(a){return ba(b,a)>-1},g,!0),k=[function(a,c,d){var e=!f&&(d||c!==D)||((b=c).nodeType?i(a,c,d):j(a,c,d));return b=null,e}];h<e;h++)if(c=x.relative[a[h].type])k=[o(p(k),c)];else{if(c=x.filter[a[h].type].apply(null,a[h].matches),c[O]){for(d=++h;d<e&&!x.relative[a[d].type];d++);return s(h>1&&p(k),h>1&&n(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ia,"$1"),c,h<d&&t(a.slice(h,d)),d<e&&t(a=a.slice(d)),d<e&&n(a))}k.push(c)}return p(k)}function u(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],q=[],s=D,t=d||f&&x.find.TAG("*",j),u=Q+=null==s?1:Math.random()||.1,v=t.length;for(j&&(D=g===H||g||j);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0,g||k.ownerDocument===H||(G(k),h=!J);m=a[l++];)if(m(k,g||H,h)){i.push(k);break}j&&(Q=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,q,g,h);if(d){if(n>0)for(;o--;)p[o]||q[o]||(q[o]=Z.call(i));q=r(q)}_.apply(i,q),j&&!d&&q.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(Q=u,D=s),p};return e?d(g):g}var v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O="sizzle"+1*new Date,P=a.document,Q=0,R=0,S=c(),T=c(),U=c(),V=c(),W=function(a,b){return a===b&&(F=!0),0},X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,aa=Y.slice,ba=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},ca="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",da="[\\x20\\t\\r\\n\\f]",ea="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",fa="\\["+da+"*("+ea+")(?:"+da+"*([*^$|!~]?=)"+da+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ea+"))|)"+da+"*\\]",ga=":("+ea+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+fa+")*)|.*)\\)|)",ha=new RegExp(da+"+","g"),ia=new RegExp("^"+da+"+|((?:^|[^\\\\])(?:\\\\.)*)"+da+"+$","g"),ja=new RegExp("^"+da+"*,"+da+"*"),ka=new RegExp("^"+da+"*([>+~]|"+da+")"+da+"*"),la=new RegExp(da+"|>"),ma=new RegExp(ga),na=new RegExp("^"+ea+"$"),oa={ID:new RegExp("^#("+ea+")"),CLASS:new RegExp("^\\.("+ea+")"),TAG:new RegExp("^("+ea+"|[*])"),ATTR:new RegExp("^"+fa),PSEUDO:new RegExp("^"+ga),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+da+"*(even|odd|(([+-]|)(\\d*)n|)"+da+"*(?:([+-]|)"+da+"*(\\d+)|))"+da+"*\\)|)","i"),bool:new RegExp("^(?:"+ca+")$","i"),needsContext:new RegExp("^"+da+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+da+"*((?:-\\d)?\\d*)"+da+"*\\)|)(?=[^-]|$)","i")},pa=/HTML$/i,qa=/^(?:input|select|textarea|button)$/i,ra=/^h\d$/i,sa=/^[^{]+\{\s*\[native \w/,ta=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ua=/[+~]/,va=new RegExp("\\\\([\\da-f]{1,6}"+da+"?|("+da+")|.)","ig"),wa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},xa=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ya=function(a,b){return b?"\0"===a?"�":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},za=function(){G()},Aa=o(function(a){return!0===a.disabled&&"fieldset"===a.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{_.apply(Y=aa.call(P.childNodes),P.childNodes),Y[P.childNodes.length].nodeType}catch(a){_={apply:Y.length?function(a,b){$.apply(a,aa.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}w=b.support={},z=b.isXML=function(a){var b=a.namespaceURI,c=(a.ownerDocument||a).documentElement;return!pa.test(b||c&&c.nodeName||"HTML")},G=b.setDocument=function(a){var b,c,d=a?a.ownerDocument||a:P;return d!==H&&9===d.nodeType&&d.documentElement?(H=d,I=H.documentElement,J=!z(H),P!==H&&(c=H.defaultView)&&c.top!==c&&(c.addEventListener?c.addEventListener("unload",za,!1):c.attachEvent&&c.attachEvent("onunload",za)),w.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),w.getElementsByTagName=e(function(a){return a.appendChild(H.createComment("")),!a.getElementsByTagName("*").length}),w.getElementsByClassName=sa.test(H.getElementsByClassName),w.getById=e(function(a){return I.appendChild(a).id=O,!H.getElementsByName||!H.getElementsByName(O).length}),w.getById?(x.filter.ID=function(a){var b=a.replace(va,wa);return function(a){return a.getAttribute("id")===b}},x.find.ID=function(a,b){if(void 0!==b.getElementById&&J){var c=b.getElementById(a);return c?[c]:[]}}):(x.filter.ID=function(a){var b=a.replace(va,wa);return function(a){var c=void 0!==a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},x.find.ID=function(a,b){if(void 0!==b.getElementById&&J){var c,d,e,f=b.getElementById(a);if(f){if((c=f.getAttributeNode("id"))&&c.value===a)return[f];for(e=b.getElementsByName(a),d=0;f=e[d++];)if((c=f.getAttributeNode("id"))&&c.value===a)return[f]}return[]}}),x.find.TAG=w.getElementsByTagName?function(a,b){return void 0!==b.getElementsByTagName?b.getElementsByTagName(a):w.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},x.find.CLASS=w.getElementsByClassName&&function(a,b){if(void 0!==b.getElementsByClassName&&J)return b.getElementsByClassName(a)},L=[],K=[],(w.qsa=sa.test(H.querySelectorAll))&&(e(function(a){I.appendChild(a).innerHTML="<a id='"+O+"'></a><select id='"+O+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&K.push("[*^$]="+da+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||K.push("\\["+da+"*(?:value|"+ca+")"),a.querySelectorAll("[id~="+O+"-]").length||K.push("~="),a.querySelectorAll(":checked").length||K.push(":checked"),a.querySelectorAll("a#"+O+"+*").length||K.push(".#.+[+~]")}),e(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=H.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&K.push("name"+da+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&K.push(":enabled",":disabled"),I.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&K.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),K.push(",.*:")})),(w.matchesSelector=sa.test(M=I.matches||I.webkitMatchesSelector||I.mozMatchesSelector||I.oMatchesSelector||I.msMatchesSelector))&&e(function(a){w.disconnectedMatch=M.call(a,"*"),M.call(a,"[s!='']:x"),L.push("!=",ga)}),K=K.length&&new RegExp(K.join("|")),L=L.length&&new RegExp(L.join("|")),b=sa.test(I.compareDocumentPosition),N=b||sa.test(I.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},W=b?function(a,b){if(a===b)return F=!0,0;var c=!a.compareDocumentPosition-!b.compareDocumentPosition;return c||(c=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&c||!w.sortDetached&&b.compareDocumentPosition(a)===c?a===H||a.ownerDocument===P&&N(P,a)?-1:b===H||b.ownerDocument===P&&N(P,b)?1:E?ba(E,a)-ba(E,b):0:4&c?-1:1)}:function(a,b){if(a===b)return F=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===H?-1:b===H?1:e?-1:f?1:E?ba(E,a)-ba(E,b):0;if(e===f)return g(a,b);for(c=a;c=c.parentNode;)h.unshift(c);for(c=b;c=c.parentNode;)i.unshift(c);for(;h[d]===i[d];)d++;return d?g(h[d],i[d]):h[d]===P?-1:i[d]===P?1:0},H):H},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==H&&G(a),w.matchesSelector&&J&&!V[c+" "]&&(!L||!L.test(c))&&(!K||!K.test(c)))try{var d=M.call(a,c);if(d||w.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(a){V(c,!0)}return b(c,H,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==H&&G(a),N(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==H&&G(a);var c=x.attrHandle[b.toLowerCase()],d=c&&X.call(x.attrHandle,b.toLowerCase())?c(a,b,!J):void 0;return void 0!==d?d:w.attributes||!J?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null},b.escape=function(a){return(a+"").replace(xa,ya)},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(F=!w.detectDuplicates,E=!w.sortStable&&a.slice(0),a.sort(W),F){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return E=null,a},y=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=y(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=y(b);return c},x=b.selectors={cacheLength:50,createPseudo:d,match:oa,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(va,wa),a[3]=(a[3]||a[4]||a[5]||"").replace(va,wa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return oa.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&ma.test(c)&&(b=A(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(va,wa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=S[a+" "];return b||(b=new RegExp("(^|"+da+")"+a+"("+da+"|$)"))&&S(a,function(a){return b.test("string"==typeof a.className&&a.className||void 0!==a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:!c||(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f.replace(ha," ")+" ").indexOf(d)>-1:"|="===c&&(f===d||f.slice(0,d.length+1)===d+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){for(;p;){for(m=b;m=m[p];)if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(m=q,l=m[O]||(m[O]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===Q&&j[1],t=n&&j[2],m=n&&q.childNodes[n];m=++n&&m&&m[p]||(t=n=0)||o.pop();)if(1===m.nodeType&&++t&&m===b){k[a]=[Q,n,t];break}}else if(s&&(m=b,l=m[O]||(m[O]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===Q&&j[1],t=n),!1===t)for(;(m=++n&&m&&m[p]||(t=n=0)||o.pop())&&((h?m.nodeName.toLowerCase()!==r:1!==m.nodeType)||!++t||(s&&(l=m[O]||(m[O]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[Q,t]),m!==b)););return(t-=e)===d||t%d==0&&t/d>=0}}},PSEUDO:function(a,c){var e,f=x.pseudos[a]||x.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);return f[O]?f(c):f.length>1?(e=[a,a,"",c],x.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=ba(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=B(a.replace(ia,"$1"));return e[O]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),b[0]=null,!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return a=a.replace(va,wa),function(b){return(b.textContent||y(b)).indexOf(a)>-1}}),lang:d(function(a){return na.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(va,wa).toLowerCase(),function(b){var c;do{if(c=J?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return(c=c.toLowerCase())===a||0===c.indexOf(a+"-")}while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===I},focus:function(a){return a===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:j(!1),disabled:j(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,!0===a.selected},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!x.pseudos.empty(a)},header:function(a){return ra.test(a.nodeName)},input:function(a){return qa.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:k(function(){return[0]}),last:k(function(a,b){return[b-1]}),eq:k(function(a,b,c){return[c<0?c+b:c]}),even:k(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:k(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:k(function(a,b,c){for(var d=c<0?c+b:c>b?b:c;--d>=0;)a.push(d);return a}),gt:k(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},x.pseudos.nth=x.pseudos.eq;for(v in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})x.pseudos[v]=h(v);for(v in{submit:!0,reset:!0})x.pseudos[v]=i(v);return m.prototype=x.filters=x.pseudos,x.setFilters=new m,A=b.tokenize=function(a,c){var d,e,f,g,h,i,j,k=T[a+" "];if(k)return c?0:k.slice(0);for(h=a,i=[],j=x.preFilter;h;){d&&!(e=ja.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),d=!1,(e=ka.exec(h))&&(d=e.shift(),f.push({value:d,type:e[0].replace(ia," ")}),h=h.slice(d.length));for(g in x.filter)!(e=oa[g].exec(h))||j[g]&&!(e=j[g](e))||(d=e.shift(),f.push({value:d,type:g,matches:e}),h=h.slice(d.length));if(!d)break}return c?h.length:h?b.error(a):T(a,i).slice(0)},B=b.compile=function(a,b){var c,d=[],e=[],f=U[a+" "];if(!f){for(b||(b=A(a)),c=b.length;c--;)f=t(b[c]),f[O]?d.push(f):e.push(f);f=U(a,u(e,d)),f.selector=a}return f},C=b.select=function(a,b,c,d){var e,f,g,h,i,j="function"==typeof a&&a,k=!d&&A(a=j.selector||a);if(c=c||[],1===k.length){if(f=k[0]=k[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&9===b.nodeType&&J&&x.relative[f[1].type]){if(!(b=(x.find.ID(g.matches[0].replace(va,wa),b)||[])[0]))return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=oa.needsContext.test(a)?0:f.length;e--&&(g=f[e],!x.relative[h=g.type]);)if((i=x.find[h])&&(d=i(g.matches[0].replace(va,wa),ua.test(f[0].type)&&l(b.parentNode)||b))){if(f.splice(e,1),!(a=d.length&&n(f)))return _.apply(c,d),c;break}}return(j||B(a,k))(d,b,!J,c,!b||ua.test(a)&&l(b.parentNode)||b),c},w.sortStable=O.split("").sort(W).join("")===O,w.detectDuplicates=!!F,G(),w.sortDetached=e(function(a){return 1&a.compareDocumentPosition(H.createElement("fieldset"))}),e(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),w.attributes&&e(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(ca,function(a,b,c){var d;if(!c)return!0===a[b]?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);ya.find=Aa,ya.expr=Aa.selectors,ya.expr[":"]=ya.expr.pseudos,ya.uniqueSort=ya.unique=Aa.uniqueSort,ya.text=Aa.getText,ya.isXMLDoc=Aa.isXML,ya.contains=Aa.contains,ya.escapeSelector=Aa.escape;var Ba=function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&ya(a).is(c))break;d.push(a)}return d},Ca=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},Da=ya.expr.match.needsContext,Ea=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;ya.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?ya.find.matchesSelector(d,a)?[d]:[]:ya.find.matches(a,ya.grep(b,function(a){return 1===a.nodeType}))},ya.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(ya(a).filter(function(){for(b=0;b<d;b++)if(ya.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)ya.find(a,e[b],c);return d>1?ya.uniqueSort(c):c},filter:function(a){return this.pushStack(g(this,a||[],!1))},not:function(a){return this.pushStack(g(this,a||[],!0))},is:function(a){return!!g(this,"string"==typeof a&&Da.test(a)?ya(a):a||[],!1).length}});var Fa,Ga=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ya.fn.init=function(a,b,c){var d,e;if(!a)return this;if(c=c||Fa,"string"==typeof a){if(!(d="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:Ga.exec(a))||!d[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(d[1]){if(b=b instanceof ya?b[0]:b,ya.merge(this,ya.parseHTML(d[1],b&&b.nodeType?b.ownerDocument||b:ia,!0)),Ea.test(d[1])&&ya.isPlainObject(b))for(d in b)ua(this[d])?this[d](b[d]):this.attr(d,b[d]);return this}return e=ia.getElementById(d[2]),e&&(this[0]=e,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):ua(a)?void 0!==c.ready?c.ready(a):a(ya):ya.makeArray(a,this)}).prototype=ya.fn,Fa=ya(ia);var Ha=/^(?:parents|prev(?:Until|All))/,Ia={children:!0,contents:!0,next:!0,prev:!0};ya.fn.extend({has:function(a){var b=ya(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(ya.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&ya(a);if(!Da.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&ya.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?ya.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?na.call(ya(a),this[0]):na.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(ya.uniqueSort(ya.merge(this.get(),ya(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),ya.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return Ba(a,"parentNode")},parentsUntil:function(a,b,c){return Ba(a,"parentNode",c)},next:function(a){return h(a,"nextSibling")},prev:function(a){return h(a,"previousSibling")},nextAll:function(a){return Ba(a,"nextSibling")},prevAll:function(a){return Ba(a,"previousSibling")},nextUntil:function(a,b,c){return Ba(a,"nextSibling",c)},prevUntil:function(a,b,c){return Ba(a,"previousSibling",c)},siblings:function(a){return Ca((a.parentNode||{}).firstChild,a)},children:function(a){return Ca(a.firstChild)},contents:function(a){return void 0!==a.contentDocument?a.contentDocument:(f(a,"template")&&(a=a.content||a),ya.merge([],a.childNodes))}},function(a,b){ya.fn[a]=function(c,d){var e=ya.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=ya.filter(d,e)),this.length>1&&(Ia[a]||ya.uniqueSort(e),Ha.test(a)&&e.reverse()),this.pushStack(e)}});var Ja=/[^\x20\t\r\n\f]+/g;ya.Callbacks=function(a){a="string"==typeof a?i(a):ya.extend({},a);var b,c,e,f,g=[],h=[],j=-1,k=function(){for(f=f||a.once,e=b=!0;h.length;j=-1)for(c=h.shift();++j<g.length;)!1===g[j].apply(c[0],c[1])&&a.stopOnFalse&&(j=g.length,c=!1);a.memory||(c=!1),b=!1,f&&(g=c?[]:"")},l={add:function(){return g&&(c&&!b&&(j=g.length-1,h.push(c)),function b(c){ya.each(c,function(c,e){ua(e)?a.unique&&l.has(e)||g.push(e):e&&e.length&&"string"!==d(e)&&b(e)})}(arguments),c&&!b&&k()),this},remove:function(){return ya.each(arguments,function(a,b){for(var c;(c=ya.inArray(b,g,c))>-1;)g.splice(c,1),c<=j&&j--}),this},has:function(a){return a?ya.inArray(a,g)>-1:g.length>0},empty:function(){return g&&(g=[]),this},disable:function(){return f=h=[],g=c="",this},disabled:function(){return!g},lock:function(){return f=h=[],c||b||(g=c=""),this},locked:function(){return!!f},fireWith:function(a,c){return f||(c=c||[],c=[a,c.slice?c.slice():c],h.push(c),b||k()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!e}};return l},ya.extend({Deferred:function(b){var c=[["notify","progress",ya.Callbacks("memory"),ya.Callbacks("memory"),2],["resolve","done",ya.Callbacks("once memory"),ya.Callbacks("once memory"),0,"resolved"],["reject","fail",ya.Callbacks("once memory"),ya.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},catch:function(a){return e.then(null,a)},pipe:function(){var a=arguments;return ya.Deferred(function(b){ya.each(c,function(c,d){var e=ua(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&ua(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){function f(b,c,d,e){return function(){var h=this,i=arguments,l=function(){var a,l;if(!(b<g)){if((a=d.apply(h,i))===c.promise())throw new TypeError("Thenable self-resolution");l=a&&("object"==typeof a||"function"==typeof a)&&a.then,ua(l)?e?l.call(a,f(g,c,j,e),f(g,c,k,e)):(g++,l.call(a,f(g,c,j,e),f(g,c,k,e),f(g,c,j,c.notifyWith))):(d!==j&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},m=e?l:function(){try{l()}catch(a){ya.Deferred.exceptionHook&&ya.Deferred.exceptionHook(a,m.stackTrace),b+1>=g&&(d!==k&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?m():(ya.Deferred.getStackHook&&(m.stackTrace=ya.Deferred.getStackHook()),a.setTimeout(m))}}var g=0;return ya.Deferred(function(a){c[0][3].add(f(0,a,ua(e)?e:j,a.notifyWith)),c[1][3].add(f(0,a,ua(b)?b:j)),c[2][3].add(f(0,a,ua(d)?d:k))}).promise()},promise:function(a){return null!=a?ya.extend(a,e):e}},f={};return ya.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[3-a][3].disable,c[0][2].lock,c[0][3].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=ka.call(arguments),f=ya.Deferred(),g=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?ka.call(arguments):c,--b||f.resolveWith(d,e)}};if(b<=1&&(l(a,f.done(g(c)).resolve,f.reject,!b),"pending"===f.state()||ua(e[c]&&e[c].then)))return f.then();for(;c--;)l(e[c],g(c),f.reject);return f.promise()}});var Ka=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ya.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Ka.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},ya.readyException=function(b){a.setTimeout(function(){throw b})};var La=ya.Deferred();ya.fn.ready=function(a){return La.then(a).catch(function(a){ya.readyException(a)}),this},ya.extend({isReady:!1,readyWait:1,ready:function(a){(!0===a?--ya.readyWait:ya.isReady)||(ya.isReady=!0,!0!==a&&--ya.readyWait>0||La.resolveWith(ia,[ya]))}}),ya.ready.then=La.then,"complete"===ia.readyState||"loading"!==ia.readyState&&!ia.documentElement.doScroll?a.setTimeout(ya.ready):(ia.addEventListener("DOMContentLoaded",m),a.addEventListener("load",m));var Ma=function(a,b,c,e,f,g,h){var i=0,j=a.length,k=null==c;if("object"===d(c)){f=!0;for(i in c)Ma(a,b,i,c[i],!0,g,h)}else if(void 0!==e&&(f=!0,ua(e)||(h=!0),k&&(h?(b.call(a,e),b=null):(k=b,b=function(a,b,c){return k.call(ya(a),c)})),b))for(;i<j;i++)b(a[i],c,h?e:e.call(a[i],i,b(a[i],c)));return f?a:k?b.call(a):j?b(a[0],c):g},Na=/^-ms-/,Oa=/-([a-z])/g,Pa=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};p.uid=1,p.prototype={cache:function(a){var b=a[this.expando];return b||(b={},Pa(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[o(b)]=c;else for(d in b)e[o(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][o(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(o):(b=o(b),b=b in d?[b]:b.match(Ja)||[]),c=b.length;for(;c--;)delete d[b[c]]}(void 0===b||ya.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!ya.isEmptyObject(b)}};var Qa=new p,Ra=new p,Sa=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Ta=/[A-Z]/g;ya.extend({hasData:function(a){return Ra.hasData(a)||Qa.hasData(a)},data:function(a,b,c){return Ra.access(a,b,c)},removeData:function(a,b){Ra.remove(a,b)},_data:function(a,b,c){return Qa.access(a,b,c)},_removeData:function(a,b){Qa.remove(a,b)}}),ya.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=Ra.get(f),1===f.nodeType&&!Qa.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=o(d.slice(5)),r(f,d,e[d])));Qa.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){Ra.set(this,a)}):Ma(this,function(b){var c;if(f&&void 0===b){if(void 0!==(c=Ra.get(f,a)))return c;if(void 0!==(c=r(f,a)))return c}else this.each(function(){Ra.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){Ra.remove(this,a)})}}),ya.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=Qa.get(a,b),c&&(!d||Array.isArray(c)?d=Qa.access(a,b,ya.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=ya.queue(a,b),d=c.length,e=c.shift(),f=ya._queueHooks(a,b),g=function(){ya.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return Qa.get(a,c)||Qa.access(a,c,{empty:ya.Callbacks("once memory").add(function(){Qa.remove(a,[b+"queue",c])})})}}),ya.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?ya.queue(this[0],a):void 0===b?this:this.each(function(){var c=ya.queue(this,a,b);ya._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&ya.dequeue(this,a)})},dequeue:function(a){return this.each(function(){ya.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=ya.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};for("string"!=typeof a&&(b=a,a=void 0),a=a||"fx";g--;)(c=Qa.get(f[g],a+"queueHooks"))&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Ua=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Va=new RegExp("^(?:([+-])=|)("+Ua+")([a-z%]*)$","i"),Wa=["Top","Right","Bottom","Left"],Xa=ia.documentElement,Ya=function(a){return ya.contains(a.ownerDocument,a)},Za={composed:!0};Xa.getRootNode&&(Ya=function(a){return ya.contains(a.ownerDocument,a)||a.getRootNode(Za)===a.ownerDocument});var $a=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&Ya(a)&&"none"===ya.css(a,"display")},_a=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},ab={};ya.fn.extend({show:function(){return u(this,!0)},hide:function(){return u(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){$a(this)?ya(this).show():ya(this).hide()})}});var bb=/^(?:checkbox|radio)$/i,cb=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,db=/^$|^module$|\/(?:java|ecma)script/i,eb={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};eb.optgroup=eb.option,eb.tbody=eb.tfoot=eb.colgroup=eb.caption=eb.thead,eb.th=eb.td;var fb=/<|&#?\w+;/;!function(){var a=ia.createDocumentFragment(),b=a.appendChild(ia.createElement("div")),c=ia.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),ta.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",ta.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var gb=/^key/,hb=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ib=/^([^.]*)(?:\.(.+)|)/;ya.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=Qa.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),e&&ya.find.matchesSelector(Xa,e),c.guid||(c.guid=ya.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return void 0!==ya&&ya.event.triggered!==b.type?ya.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(Ja)||[""],j=b.length;j--;)h=ib.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=ya.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=ya.event.special[n]||{},k=ya.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&ya.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&!1!==l.setup.call(a,d,o,g)||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),ya.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=Qa.hasData(a)&&Qa.get(a);if(q&&(i=q.events)){for(b=(b||"").match(Ja)||[""],j=b.length;j--;)if(h=ib.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=ya.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&!1!==l.teardown.call(a,o,q.handle)||ya.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)ya.event.remove(a,n+b[j],c,d,!0);ya.isEmptyObject(i)&&Qa.remove(a,"handle events")}},dispatch:function(a){var b,c,d,e,f,g,h=ya.event.fix(a),i=new Array(arguments.length),j=(Qa.get(this,"events")||{})[h.type]||[],k=ya.event.special[h.type]||{};for(i[0]=h,b=1;b<arguments.length;b++)i[b]=arguments[b];if(h.delegateTarget=this,!k.preDispatch||!1!==k.preDispatch.call(this,h)){for(g=ya.event.handlers.call(this,h,j),b=0;(e=g[b++])&&!h.isPropagationStopped();)for(h.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!h.isImmediatePropagationStopped();)h.rnamespace&&!1!==f.namespace&&!h.rnamespace.test(f.namespace)||(h.handleObj=f,h.data=f.data,void 0!==(d=((ya.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,i))&&!1===(h.result=d)&&(h.preventDefault(),h.stopPropagation()));return k.postDispatch&&k.postDispatch.call(this,h),h.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||!0!==j.disabled)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?ya(e,this).index(j)>-1:ya.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(ya.Event.prototype,a,{enumerable:!0,configurable:!0,get:ua(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[ya.expando]?a:new ya.Event(a)},special:{load:{noBubble:!0},click:{setup:function(a){var b=this||a;return bb.test(b.type)&&b.click&&f(b,"input")&&D(b,"click",y),!1},trigger:function(a){var b=this||a;return bb.test(b.type)&&b.click&&f(b,"input")&&D(b,"click"),!0},_default:function(a){var b=a.target;return bb.test(b.type)&&b.click&&f(b,"input")&&Qa.get(b,"click")||f(b,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},ya.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},ya.Event=function(a,b){if(!(this instanceof ya.Event))return new ya.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&!1===a.returnValue?y:z,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&ya.extend(this,b),this.timeStamp=a&&a.timeStamp||Date.now(),this[ya.expando]=!0},ya.Event.prototype={constructor:ya.Event,isDefaultPrevented:z,isPropagationStopped:z,isImmediatePropagationStopped:z,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=y,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=y,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=y,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},ya.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&gb.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&hb.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},ya.event.addProp),ya.each({focus:"focusin",blur:"focusout"},function(a,b){ya.event.special[a]={setup:function(){return D(this,a,A),!1},trigger:function(){return D(this,a),!0},delegateType:b}}),ya.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){ya.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||ya.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),ya.fn.extend({on:function(a,b,c,d){return C(this,a,b,c,d)},one:function(a,b,c,d){return C(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,ya(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return!1!==b&&"function"!=typeof b||(c=b,b=void 0),!1===c&&(c=z),this.each(function(){ya.event.remove(this,a,c,b)})}});var jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,kb=/<script|<style|<link/i,lb=/checked\s*(?:[^=]|=\s*.checked.)/i,mb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;ya.extend({htmlPrefilter:function(a){return a.replace(jb,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=Ya(a);if(!(ta.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||ya.isXMLDoc(a)))for(g=v(h),f=v(a),d=0,e=f.length;d<e;d++)I(f[d],g[d]);if(b)if(c)for(f=f||v(a),g=g||v(h),d=0,e=f.length;d<e;d++)H(f[d],g[d]);else H(a,h);return g=v(h,"script"),g.length>0&&w(g,!i&&v(a,"script")),h},cleanData:function(a){for(var b,c,d,e=ya.event.special,f=0;void 0!==(c=a[f]);f++)if(Pa(c)){if(b=c[Qa.expando]){if(b.events)for(d in b.events)e[d]?ya.event.remove(c,d):ya.removeEvent(c,d,b.handle);c[Qa.expando]=void 0}c[Ra.expando]&&(c[Ra.expando]=void 0)}}}),ya.fn.extend({detach:function(a){return K(this,a,!0)},remove:function(a){return K(this,a)},text:function(a){return Ma(this,function(a){return void 0===a?ya.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return J(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){E(this,a).appendChild(a)}})},prepend:function(){return J(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=E(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return J(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return J(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(ya.cleanData(v(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return ya.clone(this,a,b)})},html:function(a){return Ma(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!kb.test(a)&&!eb[(cb.exec(a)||["",""])[1].toLowerCase()]){a=ya.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(ya.cleanData(v(b,!1)),b.innerHTML=a);b=0}catch(a){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return J(this,arguments,function(b){var c=this.parentNode;ya.inArray(this,a)<0&&(ya.cleanData(v(this)),c&&c.replaceChild(b,this))},a)}}),ya.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){ya.fn[a]=function(a){for(var c,d=[],e=ya(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),ya(e[g])[b](c),ma.apply(d,c.get());return this.pushStack(d)}});var nb=new RegExp("^("+Ua+")(?!px)[a-z%]+$","i"),ob=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},pb=new RegExp(Wa.join("|"),"i");!function(){function b(){if(j){i.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",j.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",Xa.appendChild(i).appendChild(j);var b=a.getComputedStyle(j);d="1%"!==b.top,h=12===c(b.marginLeft),j.style.right="60%",g=36===c(b.right),e=36===c(b.width),j.style.position="absolute",f=12===c(j.offsetWidth/3),Xa.removeChild(i),j=null}}function c(a){return Math.round(parseFloat(a))}var d,e,f,g,h,i=ia.createElement("div"),j=ia.createElement("div");j.style&&(j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",ta.clearCloneStyle="content-box"===j.style.backgroundClip,ya.extend(ta,{boxSizingReliable:function(){return b(),e},pixelBoxStyles:function(){return b(),g},pixelPosition:function(){return b(),d},reliableMarginLeft:function(){return b(),h},scrollboxSize:function(){return b(),f}}))}();var qb=["Webkit","Moz","ms"],rb=ia.createElement("div").style,sb={},tb=/^(none|table(?!-c[ea]).+)/,ub=/^--/,vb={position:"absolute",visibility:"hidden",display:"block"},wb={letterSpacing:"0",fontWeight:"400"};ya.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=L(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=o(b),i=ub.test(b),j=a.style;if(i||(b=O(h)),g=ya.cssHooks[b]||ya.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b];f=typeof c,"string"===f&&(e=Va.exec(c))&&e[1]&&(c=s(a,b,e),f="number"),null!=c&&c===c&&("number"!==f||i||(c+=e&&e[3]||(ya.cssNumber[h]?"":"px")),ta.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c))}},css:function(a,b,c,d){var e,f,g,h=o(b);return ub.test(b)||(b=O(h)),g=ya.cssHooks[b]||ya.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=L(a,b,d)),"normal"===e&&b in wb&&(e=wb[b]),""===c||c?(f=parseFloat(e),!0===c||isFinite(f)?f||0:e):e}}),ya.each(["height","width"],function(a,b){ya.cssHooks[b]={get:function(a,c,d){if(c)return!tb.test(ya.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?R(a,b,d):_a(a,vb,function(){return R(a,b,d)})},set:function(a,c,d){var e,f=ob(a),g=!ta.scrollboxSize()&&"absolute"===f.position,h=g||d,i=h&&"border-box"===ya.css(a,"boxSizing",!1,f),j=d?Q(a,b,d,i,f):0;return i&&g&&(j-=Math.ceil(a["offset"+b[0].toUpperCase()+b.slice(1)]-parseFloat(f[b])-Q(a,b,"border",!1,f)-.5)),j&&(e=Va.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=ya.css(a,b)),P(a,c,j)}}}),ya.cssHooks.marginLeft=M(ta.reliableMarginLeft,function(a,b){if(b)return(parseFloat(L(a,"marginLeft"))||a.getBoundingClientRect().left-_a(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),ya.each({margin:"",padding:"",border:"Width"},function(a,b){ya.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+Wa[d]+b]=f[d]||f[d-2]||f[0];return e}},"margin"!==a&&(ya.cssHooks[a+b].set=P)}),ya.fn.extend({css:function(a,b){return Ma(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=ob(a),e=b.length;g<e;g++)f[b[g]]=ya.css(a,b[g],!1,d);return f}return void 0!==c?ya.style(a,b,c):ya.css(a,b)},a,b,arguments.length>1)}}),ya.Tween=S,S.prototype={constructor:S,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||ya.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(ya.cssNumber[c]?"":"px")},cur:function(){var a=S.propHooks[this.prop];return a&&a.get?a.get(this):S.propHooks._default.get(this)},run:function(a){var b,c=S.propHooks[this.prop];return this.options.duration?this.pos=b=ya.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):S.propHooks._default.set(this),this}},S.prototype.init.prototype=S.prototype,S.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=ya.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){ya.fx.step[a.prop]?ya.fx.step[a.prop](a):1!==a.elem.nodeType||!ya.cssHooks[a.prop]&&null==a.elem.style[O(a.prop)]?a.elem[a.prop]=a.now:ya.style(a.elem,a.prop,a.now+a.unit)}}},S.propHooks.scrollTop=S.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},ya.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},ya.fx=S.prototype.init,ya.fx.step={};var xb,yb,zb=/^(?:toggle|show|hide)$/,Ab=/queueHooks$/;ya.Animation=ya.extend(Z,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return s(c.elem,a,Va.exec(b),c),c}]},tweener:function(a,b){ua(a)?(b=a,a=["*"]):a=a.match(Ja);for(var c,d=0,e=a.length;d<e;d++)c=a[d],Z.tweeners[c]=Z.tweeners[c]||[],Z.tweeners[c].unshift(b)},prefilters:[X],prefilter:function(a,b){b?Z.prefilters.unshift(a):Z.prefilters.push(a)}}),ya.speed=function(a,b,c){var d=a&&"object"==typeof a?ya.extend({},a):{complete:c||!c&&b||ua(a)&&a,duration:a,easing:c&&b||b&&!ua(b)&&b};return ya.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in ya.fx.speeds?d.duration=ya.fx.speeds[d.duration]:d.duration=ya.fx.speeds._default),null!=d.queue&&!0!==d.queue||(d.queue="fx"),d.old=d.complete,d.complete=function(){ua(d.old)&&d.old.call(this),d.queue&&ya.dequeue(this,d.queue)},d},ya.fn.extend({fadeTo:function(a,b,c,d){return this.filter($a).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=ya.isEmptyObject(a),f=ya.speed(b,c,d),g=function(){var b=Z(this,ya.extend({},a),f);(e||Qa.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||!1===f.queue?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&!1!==a&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=ya.timers,g=Qa.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||ya.dequeue(this,a)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var b,c=Qa.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=ya.timers,g=d?d.length:0;for(c.finish=!0,ya.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),ya.each(["toggle","show","hide"],function(a,b){var c=ya.fn[b];ya.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(V(b,!0),a,d,e)}}),ya.each({slideDown:V("show"),slideUp:V("hide"),slideToggle:V("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){ya.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),ya.timers=[],ya.fx.tick=function(){var a,b=0,c=ya.timers;for(xb=Date.now();b<c.length;b++)(a=c[b])()||c[b]!==a||c.splice(b--,1);c.length||ya.fx.stop(),xb=void 0},ya.fx.timer=function(a){ya.timers.push(a),ya.fx.start()},ya.fx.interval=13,ya.fx.start=function(){yb||(yb=!0,T())},ya.fx.stop=function(){yb=null},ya.fx.speeds={slow:600,fast:200,_default:400},ya.fn.delay=function(b,c){return b=ya.fx?ya.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=ia.createElement("input"),b=ia.createElement("select"),c=b.appendChild(ia.createElement("option"));a.type="checkbox",ta.checkOn=""!==a.value,ta.optSelected=c.selected,a=ia.createElement("input"),a.value="t",a.type="radio",ta.radioValue="t"===a.value}();var Bb,Cb=ya.expr.attrHandle;ya.fn.extend({attr:function(a,b){return Ma(this,ya.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){ya.removeAttr(this,a)})}}),ya.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return void 0===a.getAttribute?ya.prop(a,b,c):(1===f&&ya.isXMLDoc(a)||(e=ya.attrHooks[b.toLowerCase()]||(ya.expr.match.bool.test(b)?Bb:void 0)),void 0!==c?null===c?void ya.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=ya.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!ta.radioValue&&"radio"===b&&f(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(Ja);if(e&&1===a.nodeType)for(;c=e[d++];)a.removeAttribute(c)}}),Bb={set:function(a,b,c){return!1===b?ya.removeAttr(a,c):a.setAttribute(c,c),c}},ya.each(ya.expr.match.bool.source.match(/\w+/g),function(a,b){var c=Cb[b]||ya.find.attr;Cb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=Cb[g],Cb[g]=e,e=null!=c(a,b,d)?g:null,Cb[g]=f),e}});var Db=/^(?:input|select|textarea|button)$/i,Eb=/^(?:a|area)$/i;ya.fn.extend({prop:function(a,b){return Ma(this,ya.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[ya.propFix[a]||a]})}}),ya.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&ya.isXMLDoc(a)||(b=ya.propFix[b]||b,e=ya.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=ya.find.attr(a,"tabindex");return b?parseInt(b,10):Db.test(a.nodeName)||Eb.test(a.nodeName)&&a.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),ta.optSelected||(ya.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),ya.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ya.propFix[this.toLowerCase()]=this}),ya.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(ua(a))return this.each(function(b){ya(this).addClass(a.call(this,b,_(this)))});if(b=aa(a),b.length)for(;c=this[i++];)if(e=_(c),d=1===c.nodeType&&" "+$(e)+" "){for(g=0;f=b[g++];)d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=$(d),e!==h&&c.setAttribute("class",h)}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(ua(a))return this.each(function(b){ya(this).removeClass(a.call(this,b,_(this)))});if(!arguments.length)return this.attr("class","");if(b=aa(a),b.length)for(;c=this[i++];)if(e=_(c),d=1===c.nodeType&&" "+$(e)+" "){for(g=0;f=b[g++];)for(;d.indexOf(" "+f+" ")>-1;)d=d.replace(" "+f+" "," ");h=$(d),e!==h&&c.setAttribute("class",h)}return this},toggleClass:function(a,b){var c=typeof a,d="string"===c||Array.isArray(a);return"boolean"==typeof b&&d?b?this.addClass(a):this.removeClass(a):ua(a)?this.each(function(c){ya(this).toggleClass(a.call(this,c,_(this),b),b)}):this.each(function(){var b,e,f,g;if(d)for(e=0,f=ya(this),g=aa(a);b=g[e++];)f.hasClass(b)?f.removeClass(b):f.addClass(b);else void 0!==a&&"boolean"!==c||(b=_(this),b&&Qa.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||!1===a?"":Qa.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;for(b=" "+a+" ";c=this[d++];)if(1===c.nodeType&&(" "+$(_(c))+" ").indexOf(b)>-1)return!0;return!1}});var Fb=/\r/g;ya.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=ua(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,ya(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=ya.map(e,function(a){return null==a?"":a+""})),(b=ya.valHooks[this.type]||ya.valHooks[this.nodeName.toLowerCase()])&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return(b=ya.valHooks[e.type]||ya.valHooks[e.nodeName.toLowerCase()])&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(Fb,""):null==c?"":c)}}}),ya.extend({valHooks:{option:{get:function(a){var b=ya.find.attr(a,"value");return null!=b?b:$(ya.text(a))}},select:{get:function(a){var b,c,d,e=a.options,g=a.selectedIndex,h="select-one"===a.type,i=h?null:[],j=h?g+1:e.length;for(d=g<0?j:h?g:0;d<j;d++)if(c=e[d],(c.selected||d===g)&&!c.disabled&&(!c.parentNode.disabled||!f(c.parentNode,"optgroup"))){if(b=ya(c).val(),h)return b;i.push(b)}return i},set:function(a,b){for(var c,d,e=a.options,f=ya.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=ya.inArray(ya.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),ya.each(["radio","checkbox"],function(){ya.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=ya.inArray(ya(a).val(),b)>-1}},ta.checkOn||(ya.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),ta.focusin="onfocusin"in a;var Gb=/^(?:focusinfocus|focusoutblur)$/,Hb=function(a){a.stopPropagation()};ya.extend(ya.event,{trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m,n=[d||ia],o=qa.call(b,"type")?b.type:b,p=qa.call(b,"namespace")?b.namespace.split("."):[];if(g=m=h=d=d||ia,3!==d.nodeType&&8!==d.nodeType&&!Gb.test(o+ya.event.triggered)&&(o.indexOf(".")>-1&&(p=o.split("."),o=p.shift(),p.sort()),j=o.indexOf(":")<0&&"on"+o,b=b[ya.expando]?b:new ya.Event(o,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=p.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:ya.makeArray(c,[b]),l=ya.event.special[o]||{},e||!l.trigger||!1!==l.trigger.apply(d,c))){if(!e&&!l.noBubble&&!va(d)){for(i=l.delegateType||o,Gb.test(i+o)||(g=g.parentNode);g;g=g.parentNode)n.push(g),h=g;h===(d.ownerDocument||ia)&&n.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=n[f++])&&!b.isPropagationStopped();)m=g,b.type=f>1?i:l.bindType||o,k=(Qa.get(g,"events")||{})[b.type]&&Qa.get(g,"handle"),k&&k.apply(g,c),(k=j&&g[j])&&k.apply&&Pa(g)&&(b.result=k.apply(g,c),!1===b.result&&b.preventDefault());return b.type=o,e||b.isDefaultPrevented()||l._default&&!1!==l._default.apply(n.pop(),c)||!Pa(d)||j&&ua(d[o])&&!va(d)&&(h=d[j],h&&(d[j]=null),ya.event.triggered=o,b.isPropagationStopped()&&m.addEventListener(o,Hb),d[o](),b.isPropagationStopped()&&m.removeEventListener(o,Hb),ya.event.triggered=void 0,h&&(d[j]=h)),b.result}},simulate:function(a,b,c){var d=ya.extend(new ya.Event,c,{type:a,isSimulated:!0});ya.event.trigger(d,null,b)}}),ya.fn.extend({trigger:function(a,b){return this.each(function(){ya.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return ya.event.trigger(a,b,c,!0)}}),ta.focusin||ya.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){ya.event.simulate(b,a.target,ya.event.fix(a))};ya.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=Qa.access(d,b);e||d.addEventListener(a,c,!0),Qa.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=Qa.access(d,b)-1;e?Qa.access(d,b,e):(d.removeEventListener(a,c,!0),Qa.remove(d,b))}}});var Ib=a.location,Jb=Date.now(),Kb=/\?/;ya.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(a){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||ya.error("Invalid XML: "+b),c};var Lb=/\[\]$/,Mb=/\r?\n/g,Nb=/^(?:submit|button|image|reset|file)$/i,Ob=/^(?:input|select|textarea|keygen)/i;ya.param=function(a,b){var c,d=[],e=function(a,b){var c=ua(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(null==a)return"";if(Array.isArray(a)||a.jquery&&!ya.isPlainObject(a))ya.each(a,function(){e(this.name,this.value)});else for(c in a)ba(c,a[c],b,e);return d.join("&")},ya.fn.extend({serialize:function(){return ya.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=ya.prop(this,"elements");return a?ya.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!ya(this).is(":disabled")&&Ob.test(this.nodeName)&&!Nb.test(a)&&(this.checked||!bb.test(a))}).map(function(a,b){var c=ya(this).val();return null==c?null:Array.isArray(c)?ya.map(c,function(a){return{name:b.name,value:a.replace(Mb,"\r\n")}}):{name:b.name,value:c.replace(Mb,"\r\n")}}).get()}});var Pb=/%20/g,Qb=/#.*$/,Rb=/([?&])_=[^&]*/,Sb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Tb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ub=/^(?:GET|HEAD)$/,Vb=/^\/\//,Wb={},Xb={},Yb="*/".concat("*"),Zb=ia.createElement("a");Zb.href=Ib.href,ya.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ib.href,type:"GET",isLocal:Tb.test(Ib.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Yb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ya.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?ea(ea(a,ya.ajaxSettings),b):ea(ya.ajaxSettings,a)},ajaxPrefilter:ca(Wb),ajaxTransport:ca(Xb),ajax:function(b,c){function d(b,c,d,h){var j,m,n,u,v,w=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(u=fa(o,x,d)),u=ga(o,u,x,j),j?(o.ifModified&&(v=x.getResponseHeader("Last-Modified"),v&&(ya.lastModified[f]=v),(v=x.getResponseHeader("etag"))&&(ya.etag[f]=v)),204===b||"HEAD"===o.type?w="nocontent":304===b?w="notmodified":(w=u.state,m=u.data,n=u.error,j=!n)):(n=w,!b&&w||(w="error",b<0&&(b=0))),x.status=b,x.statusText=(c||w)+"",j?r.resolveWith(p,[m,w,x]):r.rejectWith(p,[x,w,n]),x.statusCode(t),t=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[x,o,j?m:n]),s.fireWith(p,[x,w]),l&&(q.trigger("ajaxComplete",[x,o]),--ya.active||ya.event.trigger("ajaxStop")))}"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=ya.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?ya(p):ya.event,r=ya.Deferred(),s=ya.Callbacks("once memory"),t=o.statusCode||{},u={},v={},w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h)for(h={};b=Sb.exec(g);)h[b[1].toLowerCase()+" "]=(h[b[1].toLowerCase()+" "]||[]).concat(b[2]);b=h[a.toLowerCase()+" "]}return null==b?null:b.join(", ")},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=v[a.toLowerCase()]=v[a.toLowerCase()]||a,u[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)x.always(a[x.status]);else for(b in a)t[b]=[t[b],a[b]];return this},abort:function(a){var b=a||w;return e&&e.abort(b),d(0,b),this}};if(r.promise(x),o.url=((b||o.url||Ib.href)+"").replace(Vb,Ib.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(Ja)||[""],null==o.crossDomain){j=ia.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Zb.protocol+"//"+Zb.host!=j.protocol+"//"+j.host}catch(a){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=ya.param(o.data,o.traditional)),da(Wb,o,c,x),k)return x;l=ya.event&&o.global,l&&0==ya.active++&&ya.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Ub.test(o.type),f=o.url.replace(Qb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Pb,"+")):(n=o.url.slice(f.length),o.data&&(o.processData||"string"==typeof o.data)&&(f+=(Kb.test(f)?"&":"?")+o.data,delete o.data),!1===o.cache&&(f=f.replace(Rb,"$1"),n=(Kb.test(f)?"&":"?")+"_="+Jb+++n),o.url=f+n),o.ifModified&&(ya.lastModified[f]&&x.setRequestHeader("If-Modified-Since",ya.lastModified[f]),ya.etag[f]&&x.setRequestHeader("If-None-Match",ya.etag[f])),(o.data&&o.hasContent&&!1!==o.contentType||c.contentType)&&x.setRequestHeader("Content-Type",o.contentType),x.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Yb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)x.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(!1===o.beforeSend.call(p,x,o)||k))return x.abort();if(w="abort",s.add(o.complete),x.done(o.success),x.fail(o.error),e=da(Xb,o,c,x)){if(x.readyState=1,l&&q.trigger("ajaxSend",[x,o]),k)return x;o.async&&o.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},o.timeout));try{k=!1,e.send(u,d)}catch(a){if(k)throw a;d(-1,a)}}else d(-1,"No Transport");return x},getJSON:function(a,b,c){return ya.get(a,b,c,"json")},getScript:function(a,b){return ya.get(a,void 0,b,"script")}}),ya.each(["get","post"],function(a,b){ya[b]=function(a,c,d,e){return ua(c)&&(e=e||d,d=c,c=void 0),ya.ajax(ya.extend({url:a,type:b,dataType:e,data:c,success:d},ya.isPlainObject(a)&&a))}}),ya._evalUrl=function(a,b){return ya.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(a){ya.globalEval(a,b)}})},ya.fn.extend({wrapAll:function(a){var b;return this[0]&&(ua(a)&&(a=a.call(this[0])),b=ya(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return ua(a)?this.each(function(b){ya(this).wrapInner(a.call(this,b))}):this.each(function(){var b=ya(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=ua(a);return this.each(function(c){ya(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){ya(this).replaceWith(this.childNodes)}),this}}),ya.expr.pseudos.hidden=function(a){return!ya.expr.pseudos.visible(a)},ya.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},ya.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(a){}};var $b={0:200,1223:204},_b=ya.ajaxSettings.xhr();ta.cors=!!_b&&"withCredentials"in _b,ta.ajax=_b=!!_b,ya.ajaxTransport(function(b){var c,d;if(ta.cors||_b&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.ontimeout=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f($b[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=h.ontimeout=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(a){if(c)throw a}},abort:function(){c&&c()}}}),ya.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),ya.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return ya.globalEval(a),a}}}),ya.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),ya.ajaxTransport("script",function(a){if(a.crossDomain||a.scriptAttrs){var b,c;return{send:function(d,e){b=ya("<script>").attr(a.scriptAttrs||{}).prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),ia.head.appendChild(b[0])},abort:function(){c&&c()}}}});var ac=[],bc=/(=)\?(?=&|$)|\?\?/;ya.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ac.pop()||ya.expando+"_"+Jb++;return this[a]=!0,a}}),ya.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=!1!==b.jsonp&&(bc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bc.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=ua(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bc,"$1"+e):!1!==b.jsonp&&(b.url+=(Kb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||ya.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?ya(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ac.push(e)),g&&ua(f)&&f(g[0]),g=f=void 0}),"script"}),ta.createHTMLDocument=function(){var a=ia.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),ya.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var d,e,f;return b||(ta.createHTMLDocument?(b=ia.implementation.createHTMLDocument(""),d=b.createElement("base"),d.href=ia.location.href,b.head.appendChild(d)):b=ia),e=Ea.exec(a),f=!c&&[],e?[b.createElement(e[1])]:(e=x([a],b,f),f&&f.length&&ya(f).remove(),ya.merge([],e.childNodes))},ya.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=$(a.slice(h)),a=a.slice(0,h)),ua(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&ya.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?ya("<div>").append(ya.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},ya.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){ya.fn[b]=function(a){return this.on(b,a)}}),ya.expr.pseudos.animated=function(a){return ya.grep(ya.timers,function(b){return a===b.elem}).length},ya.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=ya.css(a,"position"),l=ya(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=ya.css(a,"top"),i=ya.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),ua(b)&&(b=b.call(a,c,ya.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},ya.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){ya.offset.setOffset(this,a,b)});var b,c,d=this[0];if(d)return d.getClientRects().length?(b=d.getBoundingClientRect(),c=d.ownerDocument.defaultView,{top:b.top+c.pageYOffset,left:b.left+c.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c,d=this[0],e={top:0,left:0};if("fixed"===ya.css(d,"position"))b=d.getBoundingClientRect();else{for(b=this.offset(),c=d.ownerDocument,a=d.offsetParent||c.documentElement;a&&(a===c.body||a===c.documentElement)&&"static"===ya.css(a,"position");)a=a.parentNode;a&&a!==d&&1===a.nodeType&&(e=ya(a).offset(),e.top+=ya.css(a,"borderTopWidth",!0),e.left+=ya.css(a,"borderLeftWidth",!0))}return{top:b.top-e.top-ya.css(d,"marginTop",!0),left:b.left-e.left-ya.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent;a&&"static"===ya.css(a,"position");)a=a.offsetParent;return a||Xa})}}),ya.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;ya.fn[a]=function(d){return Ma(this,function(a,d,e){var f;if(va(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e)return f?f[b]:a[d];f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e},a,d,arguments.length)}}),ya.each(["top","left"],function(a,b){ya.cssHooks[b]=M(ta.pixelPosition,function(a,c){if(c)return c=L(a,b),nb.test(c)?ya(a).position()[b]+"px":c})}),ya.each({Height:"height",Width:"width"},function(a,b){ya.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){ya.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(!0===e||!0===f?"margin":"border");return Ma(this,function(b,c,e){var f;return va(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?ya.css(b,c,h):ya.style(b,c,e,h)},b,g?e:void 0,g)}})}),ya.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){ya.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),ya.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),ya.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),ya.proxy=function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),ua(a))return d=ka.call(arguments,2),e=function(){return a.apply(b||this,d.concat(ka.call(arguments)))},e.guid=a.guid=a.guid||ya.guid++,e},ya.holdReady=function(a){a?ya.readyWait++:ya.ready(!0)},ya.isArray=Array.isArray,ya.parseJSON=JSON.parse,ya.nodeName=f,ya.isFunction=ua,ya.isWindow=va,ya.camelCase=o,ya.type=d,ya.now=Date.now,ya.isNumeric=function(a){var b=ya.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ya});var cc=a.jQuery,dc=a.$;return ya.noConflict=function(b){return a.$===ya&&(a.$=dc),b&&a.jQuery===ya&&(a.jQuery=cc),ya},b||(a.jQuery=a.$=ya),ya}),/*!
+ * Lightbox v2.11.2
+ * by Lokesh Dhakar
+ *
+ * More info:
+ * http://lokeshdhakar.com/projects/lightbox2/
+ *
+ * Copyright Lokesh Dhakar
+ * Released under the MIT license
+ * https://github.com/lokesh/lightbox2/blob/master/LICENSE
+ *
+ * @preserve
+ */
+function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.lightbox=b(a.jQuery)}(this,function(a){function b(b){this.album=[],this.currentImageIndex=void 0,this.init(),this.options=a.extend({},this.constructor.defaults),this.option(b)}return b.defaults={albumLabel:"Image %1 of %2",alwaysShowNavOnTouchDevices:!1,fadeDuration:600,fitImagesInViewport:!0,imageFadeDuration:600,positionFromTop:50,resizeDuration:700,showImageNumberLabel:!0,wrapAround:!1,disableScrolling:!1,sanitizeTitle:!1},b.prototype.option=function(b){a.extend(this.options,b)},b.prototype.imageCountLabel=function(a,b){return this.options.albumLabel.replace(/%1/g,a).replace(/%2/g,b)},b.prototype.init=function(){var b=this;a(document).ready(function(){b.enable(),b.build()})},b.prototype.enable=function(){var b=this;a("body").on("click","a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]",function(c){return b.start(a(c.currentTarget)),!1})},b.prototype.build=function(){if(!(a("#lightbox").length>0)){var b=this;a('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo(a("body")),this.$lightbox=a("#lightbox"),this.$overlay=a("#lightboxOverlay"),this.$outerContainer=this.$lightbox.find(".lb-outerContainer"),this.$container=this.$lightbox.find(".lb-container"),this.$image=this.$lightbox.find(".lb-image"),this.$nav=this.$lightbox.find(".lb-nav"),this.containerPadding={top:parseInt(this.$container.css("padding-top"),10),right:parseInt(this.$container.css("padding-right"),10),bottom:parseInt(this.$container.css("padding-bottom"),10),left:parseInt(this.$container.css("padding-left"),10)},this.imageBorderWidth={top:parseInt(this.$image.css("border-top-width"),10),right:parseInt(this.$image.css("border-right-width"),10),bottom:parseInt(this.$image.css("border-bottom-width"),10),left:parseInt(this.$image.css("border-left-width"),10)},this.$overlay.hide().on("click",function(){return b.end(),!1}),this.$lightbox.hide().on("click",function(c){"lightbox"===a(c.target).attr("id")&&b.end()}),this.$outerContainer.on("click",function(c){return"lightbox"===a(c.target).attr("id")&&b.end(),!1}),this.$lightbox.find(".lb-prev").on("click",function(){return 0===b.currentImageIndex?b.changeImage(b.album.length-1):b.changeImage(b.currentImageIndex-1),!1}),this.$lightbox.find(".lb-next").on("click",function(){return b.currentImageIndex===b.album.length-1?b.changeImage(0):b.changeImage(b.currentImageIndex+1),!1}),this.$nav.on("mousedown",function(a){3===a.which&&(b.$nav.css("pointer-events","none"),b.$lightbox.one("contextmenu",function(){setTimeout(function(){this.$nav.css("pointer-events","auto")}.bind(b),0)}))}),this.$lightbox.find(".lb-loader, .lb-close").on("click",function(){return b.end(),!1})}},b.prototype.start=function(b){function c(a){d.album.push({alt:a.attr("data-alt"),link:a.attr("href"),title:a.attr("data-title")||a.attr("title")})}var d=this,e=a(window);e.on("resize",a.proxy(this.sizeOverlay,this)),this.sizeOverlay(),this.album=[];var f,g=0,h=b.attr("data-lightbox");if(h){f=a(b.prop("tagName")+'[data-lightbox="'+h+'"]');for(var i=0;i<f.length;i=++i)c(a(f[i])),f[i]===b[0]&&(g=i)}else if("lightbox"===b.attr("rel"))c(b);else{f=a(b.prop("tagName")+'[rel="'+b.attr("rel")+'"]');for(var j=0;j<f.length;j=++j)c(a(f[j])),f[j]===b[0]&&(g=j)}var k=e.scrollTop()+this.options.positionFromTop,l=e.scrollLeft();this.$lightbox.css({top:k+"px",left:l+"px"}).fadeIn(this.options.fadeDuration),this.options.disableScrolling&&a("body").addClass("lb-disable-scrolling"),this.changeImage(g)},b.prototype.changeImage=function(b){var c=this,d=this.album[b].link,e=d.split(".").slice(-1)[0],f=this.$lightbox.find(".lb-image");this.disableKeyboardNav(),this.$overlay.fadeIn(this.options.fadeDuration),a(".lb-loader").fadeIn("slow"),this.$lightbox.find(".lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption").hide(),this.$outerContainer.addClass("animating");var g=new Image;g.onload=function(){var h,i,j,k,l,m;f.attr({alt:c.album[b].alt,src:d}),a(g),f.width(g.width),f.height(g.height),m=a(window).width(),l=a(window).height(),k=m-c.containerPadding.left-c.containerPadding.right-c.imageBorderWidth.left-c.imageBorderWidth.right-20,j=l-c.containerPadding.top-c.containerPadding.bottom-c.imageBorderWidth.top-c.imageBorderWidth.bottom-c.options.positionFromTop-70,"svg"===e&&(f.width(k),f.height(j)),c.options.fitImagesInViewport?(c.options.maxWidth&&c.options.maxWidth<k&&(k=c.options.maxWidth),c.options.maxHeight&&c.options.maxHeight<j&&(j=c.options.maxHeight)):(k=c.options.maxWidth||g.width||k,j=c.options.maxHeight||g.height||j),(g.width>k||g.height>j)&&(g.width/k>g.height/j?(i=k,h=parseInt(g.height/(g.width/i),10),f.width(i),f.height(h)):(h=j,i=parseInt(g.width/(g.height/h),10),f.width(i),f.height(h))),c.sizeContainer(f.width(),f.height())},g.src=this.album[b].link,this.currentImageIndex=b},b.prototype.sizeOverlay=function(){var b=this;setTimeout(function(){b.$overlay.width(a(document).width()).height(a(document).height())},0)},b.prototype.sizeContainer=function(a,b){function c(){d.$lightbox.find(".lb-dataContainer").width(g),d.$lightbox.find(".lb-prevLink").height(h),d.$lightbox.find(".lb-nextLink").height(h),d.$overlay.focus(),d.showImage()}var d=this,e=this.$outerContainer.outerWidth(),f=this.$outerContainer.outerHeight(),g=a+this.containerPadding.left+this.containerPadding.right+this.imageBorderWidth.left+this.imageBorderWidth.right,h=b+this.containerPadding.top+this.containerPadding.bottom+this.imageBorderWidth.top+this.imageBorderWidth.bottom;e!==g||f!==h?this.$outerContainer.animate({width:g,height:h},this.options.resizeDuration,"swing",function(){c()}):c()},b.prototype.showImage=function(){this.$lightbox.find(".lb-loader").stop(!0).hide(),this.$lightbox.find(".lb-image").fadeIn(this.options.imageFadeDuration),this.updateNav(),this.updateDetails(),this.preloadNeighboringImages(),this.enableKeyboardNav()},b.prototype.updateNav=function(){var a=!1;try{document.createEvent("TouchEvent"),a=!!this.options.alwaysShowNavOnTouchDevices}catch(a){}this.$lightbox.find(".lb-nav").show(),this.album.length>1&&(this.options.wrapAround?(a&&this.$lightbox.find(".lb-prev, .lb-next").css("opacity","1"),this.$lightbox.find(".lb-prev, .lb-next").show()):(this.currentImageIndex>0&&(this.$lightbox.find(".lb-prev").show(),a&&this.$lightbox.find(".lb-prev").css("opacity","1")),this.currentImageIndex<this.album.length-1&&(this.$lightbox.find(".lb-next").show(),a&&this.$lightbox.find(".lb-next").css("opacity","1"))))},b.prototype.updateDetails=function(){var a=this;if(void 0!==this.album[this.currentImageIndex].title&&""!==this.album[this.currentImageIndex].title){var b=this.$lightbox.find(".lb-caption");this.options.sanitizeTitle?b.text(this.album[this.currentImageIndex].title):b.html(this.album[this.currentImageIndex].title),b.fadeIn("fast")}if(this.album.length>1&&this.options.showImageNumberLabel){var c=this.imageCountLabel(this.currentImageIndex+1,this.album.length);this.$lightbox.find(".lb-number").text(c).fadeIn("fast")}else this.$lightbox.find(".lb-number").hide();this.$outerContainer.removeClass("animating"),this.$lightbox.find(".lb-dataContainer").fadeIn(this.options.resizeDuration,function(){return a.sizeOverlay()})},b.prototype.preloadNeighboringImages=function(){if(this.album.length>this.currentImageIndex+1){(new Image).src=this.album[this.currentImageIndex+1].link}if(this.currentImageIndex>0){(new Image).src=this.album[this.currentImageIndex-1].link}},b.prototype.enableKeyboardNav=function(){this.$lightbox.on("keyup.keyboard",a.proxy(this.keyboardAction,this)),this.$overlay.on("keyup.keyboard",a.proxy(this.keyboardAction,this))},b.prototype.disableKeyboardNav=function(){this.$lightbox.off(".keyboard"),this.$overlay.off(".keyboard")},b.prototype.keyboardAction=function(a){var b=a.keyCode;27===b?(a.stopPropagation(),this.end()):37===b?0!==this.currentImageIndex?this.changeImage(this.currentImageIndex-1):this.options.wrapAround&&this.album.length>1&&this.changeImage(this.album.length-1):39===b&&(this.currentImageIndex!==this.album.length-1?this.changeImage(this.currentImageIndex+1):this.options.wrapAround&&this.album.length>1&&this.changeImage(0))},b.prototype.end=function(){this.disableKeyboardNav(),a(window).off("resize",this.sizeOverlay),this.$lightbox.fadeOut(this.options.fadeDuration),this.$overlay.fadeOut(this.options.fadeDuration),this.options.disableScrolling&&a("body").removeClass("lb-disable-scrolling")},new b});
+//# sourceMappingURL=lightbox-plus-jquery.min.map
\ No newline at end of file
diff --git a/dist/js/lightbox-plus-jquery.min.map b/dist/js/lightbox-plus-jquery.min.map
new file mode 100644
index 0000000..b667af4
--- /dev/null
+++ b/dist/js/lightbox-plus-jquery.min.map
@@ -0,0 +1 @@
+{"version":3,"sources":["lightbox-plus-jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","DOMEval","code","node","doc","i","val","script","createElement","text","preservedScriptAttributes","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","obj","class2type","toString","call","isArrayLike","length","type","isFunction","isWindow","nodeName","elem","name","toLowerCase","winnow","elements","qualifier","not","jQuery","grep","nodeType","indexOf","filter","sibling","cur","dir","createOptions","options","object","each","match","rnothtmlwhite","_","flag","Identity","v","Thrower","ex","adoptValue","value","resolve","reject","noValue","method","promise","done","fail","then","apply","undefined","slice","completed","removeEventListener","ready","fcamelCase","all","letter","toUpperCase","camelCase","string","replace","rmsPrefix","rdashAlpha","Data","expando","uid","getData","data","rbrace","test","JSON","parse","dataAttr","key","rmultiDash","e","dataUser","set","adjustCSS","prop","valueParts","tween","adjusted","scale","maxIterations","currentValue","css","initial","unit","cssNumber","initialInUnit","rcssNum","exec","style","start","end","getDefaultDisplay","temp","ownerDocument","display","defaultDisplayMap","body","showHide","show","values","index","dataPriv","get","isHiddenWithinTree","getAll","context","tag","ret","getElementsByTagName","querySelectorAll","merge","setGlobalEval","elems","refElements","l","buildFragment","scripts","selection","ignored","tmp","wrap","attached","j","fragment","createDocumentFragment","nodes","rhtml","rtagName","wrapMap","_default","innerHTML","htmlPrefilter","lastChild","childNodes","firstChild","textContent","push","createTextNode","inArray","isAttached","rscriptType","returnTrue","returnFalse","expectSync","safeActiveElement","activeElement","err","on","types","selector","fn","one","origFn","event","off","arguments","guid","add","leverageNative","el","namespace","handler","notAsync","result","saved","isTrigger","special","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","extend","Event","prototype","manipulationTarget","content","children","disableScript","restoreScript","removeAttribute","cloneCopyEvent","src","dest","pdataOld","pdataCur","udataOld","udataCur","events","hasData","access","handle","fixInput","rcheckableType","checked","defaultValue","domManip","collection","args","callback","concat","first","hasScripts","iNoClone","valueIsFunction","support","checkClone","rchecked","self","eq","html","map","clone","contains","_evalUrl","noModule","nonce","rcleanScript","remove","keepData","cleanData","curCSS","computed","width","minWidth","maxWidth","getStyles","getPropertyValue","pixelBoxStyles","rnumnonpx","rboxStyle","addGetHookIf","conditionFn","hookFn","vendorPropName","capName","cssPrefixes","emptyStyle","finalPropName","final","cssProps","vendorProps","setPositiveNumber","subtract","matches","Math","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","cssExpand","ceil","getWidthOrHeight","boxSizingNeeded","boxSizingReliable","valueIsBorderBox","offsetProp","parseFloat","getClientRects","Tween","easing","init","schedule","inProgress","hidden","requestAnimationFrame","setTimeout","fx","interval","tick","createFxNow","fxNow","Date","now","genFx","includeWidth","which","attrs","height","opacity","createTween","animation","Animation","tweeners","defaultPrefilter","props","opts","toggle","hooks","oldfire","propTween","restoreDisplay","isBox","anim","orig","dataShow","queue","_queueHooks","unqueued","empty","fire","always","rfxtypes","isEmptyObject","overflow","overflowX","overflowY","propFilter","specialEasing","Array","isArray","cssHooks","expand","properties","stopped","prefilters","deferred","Deferred","currentTime","remaining","startTime","duration","percent","tweens","run","notifyWith","resolveWith","originalProperties","originalOptions","stop","gotoEnd","rejectWith","bind","progress","complete","timer","stripAndCollapse","join","getClass","classesToArray","buildParams","prefix","traditional","rbracket","addToPrefiltersOrTransports","structure","dataTypeExpression","func","dataType","dataTypes","unshift","inspectPrefiltersOrTransports","jqXHR","inspect","selected","inspected","prefilterOrFactory","dataTypeOrTransport","seekingTransport","transports","ajaxExtend","target","deep","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","ct","finalDataType","firstDataType","contents","shift","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","prev","responseFields","dataFilter","split","throws","state","error","arr","getProto","Object","getPrototypeOf","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","version","rtrim","jquery","constructor","toArray","num","pushStack","prevObject","last","len","sort","splice","copy","copyIsArray","isPlainObject","random","isReady","msg","noop","proto","Ctor","globalEval","trim","makeArray","results","second","invert","callbackExpect","arg","Symbol","iterator","Sizzle","seed","m","nid","groups","newSelector","newContext","preferredDoc","setDocument","documentIsHTML","rquickExpr","getElementById","id","getElementsByClassName","qsa","nonnativeSelectorCache","rbuggyQSA","rdescend","rcssescape","fcssescape","tokenize","toSelector","rsibling","testContext","qsaError","select","createCache","cache","keys","Expr","cacheLength","markFunction","assert","addHandle","attrHandle","siblingCheck","a","b","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","disabled","isDisabled","inDisabledFieldset","createPositionalPseudo","argument","matchIndexes","setFilters","tokens","addCombinator","matcher","combinator","base","skip","next","checkNonElements","doneName","xml","oldCache","uniqueCache","outerCache","newCache","dirruns","uniqueID","elementMatcher","matchers","multipleContexts","contexts","condense","unmatched","newUnmatched","mapped","setMatcher","preFilter","postFilter","postFinder","postSelector","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","find","dirrunsUnique","pop","uniqueSort","getText","isXML","compile","sortInput","hasDuplicate","docElem","rbuggyMatches","classCache","tokenCache","compilerCache","sortOrder","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","runescape","funescape","escaped","escapedWhitespace","high","String","fromCharCode","ch","asCodePoint","charCodeAt","unloadHandler","els","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","attrId","getAttributeNode","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","expr","attr","specified","escape","sel","duplicates","detectDuplicates","sortStable","nodeValue","selectors","createPseudo",">"," ","+","~","excess","unquoted","nodeNameSelector","pattern","operator","check","what","simple","forward","ofType","nodeIndex","parent","useCache","pseudo","idx","matched","has","lang","elemLang","hash","location","root","focus","hasFocus","href","tabIndex","enabled","selectedIndex","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","soFar","preFilters","cached","token","compiled","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","rootjQuery","parseHTML","rparentsprev","guaranteedUnique","targets","closest","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","reverse","Callbacks","firing","memory","fired","locked","firingIndex","once","stopOnFalse","disable","lock","fireWith","tuples","catch","pipe","fns","newDefer","tuple","returned","notify","onFulfilled","onRejected","onProgress","depth","that","mightThrow","maxDepth","TypeError","process","exceptionHook","stackTrace","getStackHook","stateString","when","singleValue","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","readyWait","wait","readyState","doScroll","chainable","emptyGet","raw","bulk","acceptData","owner","defineProperty","configurable","removeData","_data","_removeData","dequeue","startLength","setter","clearQueue","count","defer","pnum","source","composed","getRootNode","swap","old","hide","option","thead","col","tr","td","optgroup","tbody","tfoot","colgroup","caption","th","div","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","handleObjIn","eventHandle","t","handleObj","handlers","namespaces","origType","elemData","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","blur","mouseenter","mouseleave","pointerenter","pointerleave","related","rxhtmlTag","rnoInnerhtml","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","opener","getComputedStyle","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","backgroundClip","clearCloneStyle","pixelPosition","reliableMarginLeft","scrollboxSize","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","suffix","expanded","parts","propHooks","eased","pos","step","scrollTop","scrollLeft","linear","p","swing","cos","PI","rrun","*","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","removeProp","propFix","tabindex","parseInt","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rCRLF","rsubmitterTypes","rsubmittable","param","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rlocalProtocol","rnoContent","rprotocol","allTypes","originAnchor","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","status","nativeStatusText","headers","success","modified","statusText","timeoutTimer","transport","responseHeadersString","ifModified","cacheURL","callbackContext","statusCode","fireGlobals","globalEventContext","completeDeferred","responseHeaders","urlAnchor","uncached","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","overrideMimeType","abort","finalText","crossDomain","host","hasContent","beforeSend","send","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","hover","fnOver","fnOut","unbind","delegate","undelegate","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","define","amd","_jQuery","_$","$","noConflict","require","lightbox","Lightbox","album","currentImageIndex","defaults","albumLabel","alwaysShowNavOnTouchDevices","fadeDuration","fitImagesInViewport","imageFadeDuration","positionFromTop","resizeDuration","showImageNumberLabel","wrapAround","disableScrolling","sanitizeTitle","imageCountLabel","currentImageNum","totalImages","enable","build","$lightbox","$overlay","$outerContainer","$container","$image","$nav","containerPadding","bottom","imageBorderWidth","changeImage","$link","addToAlbum","alt","link","title","$window","sizeOverlay","$links","imageNumber","dataLightboxValue","filename","filetype","disableKeyboardNav","preloader","Image","imageHeight","imageWidth","maxImageHeight","maxImageWidth","windowHeight","windowWidth","maxHeight","sizeContainer","postResize","newWidth","newHeight","showImage","oldWidth","outerWidth","oldHeight","outerHeight","updateNav","updateDetails","preloadNeighboringImages","enableKeyboardNav","alwaysShowNav","createEvent","$caption","labelText","keyboardAction","keycode"],"mappings":"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","file":"lightbox-plus-jquery.min.js"}
\ No newline at end of file
diff --git a/dist/js/lightbox.js b/dist/js/lightbox.js
new file mode 100644
index 0000000..aa97e73
--- /dev/null
+++ b/dist/js/lightbox.js
@@ -0,0 +1,554 @@
+/*!
+ * Lightbox v2.11.2
+ * by Lokesh Dhakar
+ *
+ * More info:
+ * http://lokeshdhakar.com/projects/lightbox2/
+ *
+ * Copyright Lokesh Dhakar
+ * Released under the MIT license
+ * https://github.com/lokesh/lightbox2/blob/master/LICENSE
+ *
+ * @preserve
+ */
+
+// Uses Node, AMD or browser globals to create a module.
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['jquery'], factory);
+    } else if (typeof exports === 'object') {
+        // Node. Does not work with strict CommonJS, but
+        // only CommonJS-like environments that support module.exports,
+        // like Node.
+        module.exports = factory(require('jquery'));
+    } else {
+        // Browser globals (root is window)
+        root.lightbox = factory(root.jQuery);
+    }
+}(this, function ($) {
+
+  function Lightbox(options) {
+    this.album = [];
+    this.currentImageIndex = void 0;
+    this.init();
+
+    // options
+    this.options = $.extend({}, this.constructor.defaults);
+    this.option(options);
+  }
+
+  // Descriptions of all options available on the demo site:
+  // http://lokeshdhakar.com/projects/lightbox2/index.html#options
+  Lightbox.defaults = {
+    albumLabel: 'Image %1 of %2',
+    alwaysShowNavOnTouchDevices: false,
+    fadeDuration: 600,
+    fitImagesInViewport: true,
+    imageFadeDuration: 600,
+    // maxWidth: 800,
+    // maxHeight: 600,
+    positionFromTop: 50,
+    resizeDuration: 700,
+    showImageNumberLabel: true,
+    wrapAround: false,
+    disableScrolling: false,
+    /*
+    Sanitize Title
+    If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
+    This will free you to add html tags, such as links, in the caption.
+
+    If the caption data is user submitted or from some other untrusted source, then set this to true
+    to prevent xss and other injection attacks.
+     */
+    sanitizeTitle: false
+  };
+
+  Lightbox.prototype.option = function(options) {
+    $.extend(this.options, options);
+  };
+
+  Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
+    return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
+  };
+
+  Lightbox.prototype.init = function() {
+    var self = this;
+    // Both enable and build methods require the body tag to be in the DOM.
+    $(document).ready(function() {
+      self.enable();
+      self.build();
+    });
+  };
+
+  // Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
+  // that contain 'lightbox'. When these are clicked, start lightbox.
+  Lightbox.prototype.enable = function() {
+    var self = this;
+    $('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
+      self.start($(event.currentTarget));
+      return false;
+    });
+  };
+
+  // Build html for the lightbox and the overlay.
+  // Attach event handlers to the new DOM elements. click click click
+  Lightbox.prototype.build = function() {
+    if ($('#lightbox').length > 0) {
+        return;
+    }
+
+    var self = this;
+
+    // The two root notes generated, #lightboxOverlay and #lightbox are given
+    // tabindex attrs so they are focusable. We attach our keyboard event
+    // listeners to these two elements, and not the document. Clicking anywhere
+    // while Lightbox is opened will keep the focus on or inside one of these
+    // two elements.
+    //
+    // We do this so we can prevent propogation of the Esc keypress when
+    // Lightbox is open. This prevents it from intefering with other components
+    // on the page below.
+    //
+    // Github issue: https://github.com/lokesh/lightbox2/issues/663
+    $('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
+
+    // Cache jQuery objects
+    this.$lightbox       = $('#lightbox');
+    this.$overlay        = $('#lightboxOverlay');
+    this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
+    this.$container      = this.$lightbox.find('.lb-container');
+    this.$image          = this.$lightbox.find('.lb-image');
+    this.$nav            = this.$lightbox.find('.lb-nav');
+
+    // Store css values for future lookup
+    this.containerPadding = {
+      top: parseInt(this.$container.css('padding-top'), 10),
+      right: parseInt(this.$container.css('padding-right'), 10),
+      bottom: parseInt(this.$container.css('padding-bottom'), 10),
+      left: parseInt(this.$container.css('padding-left'), 10)
+    };
+
+    this.imageBorderWidth = {
+      top: parseInt(this.$image.css('border-top-width'), 10),
+      right: parseInt(this.$image.css('border-right-width'), 10),
+      bottom: parseInt(this.$image.css('border-bottom-width'), 10),
+      left: parseInt(this.$image.css('border-left-width'), 10)
+    };
+
+    // Attach event handlers to the newly minted DOM elements
+    this.$overlay.hide().on('click', function() {
+      self.end();
+      return false;
+    });
+
+    this.$lightbox.hide().on('click', function(event) {
+      if ($(event.target).attr('id') === 'lightbox') {
+        self.end();
+      }
+    });
+
+    this.$outerContainer.on('click', function(event) {
+      if ($(event.target).attr('id') === 'lightbox') {
+        self.end();
+      }
+      return false;
+    });
+
+    this.$lightbox.find('.lb-prev').on('click', function() {
+      if (self.currentImageIndex === 0) {
+        self.changeImage(self.album.length - 1);
+      } else {
+        self.changeImage(self.currentImageIndex - 1);
+      }
+      return false;
+    });
+
+    this.$lightbox.find('.lb-next').on('click', function() {
+      if (self.currentImageIndex === self.album.length - 1) {
+        self.changeImage(0);
+      } else {
+        self.changeImage(self.currentImageIndex + 1);
+      }
+      return false;
+    });
+
+    /*
+      Show context menu for image on right-click
+
+      There is a div containing the navigation that spans the entire image and lives above of it. If
+      you right-click, you are right clicking this div and not the image. This prevents users from
+      saving the image or using other context menu actions with the image.
+
+      To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
+      set pointer-events to none on the nav div. This is so that the upcoming right-click event on
+      the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
+      we set the pointer events back to auto for the nav div so it can capture hover and left-click
+      events as usual.
+     */
+    this.$nav.on('mousedown', function(event) {
+      if (event.which === 3) {
+        self.$nav.css('pointer-events', 'none');
+
+        self.$lightbox.one('contextmenu', function() {
+          setTimeout(function() {
+              this.$nav.css('pointer-events', 'auto');
+          }.bind(self), 0);
+        });
+      }
+    });
+
+
+    this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
+      self.end();
+      return false;
+    });
+  };
+
+  // Show overlay and lightbox. If the image is part of a set, add siblings to album array.
+  Lightbox.prototype.start = function($link) {
+    var self    = this;
+    var $window = $(window);
+
+    $window.on('resize', $.proxy(this.sizeOverlay, this));
+
+    this.sizeOverlay();
+
+    this.album = [];
+    var imageNumber = 0;
+
+    function addToAlbum($link) {
+      self.album.push({
+        alt: $link.attr('data-alt'),
+        link: $link.attr('href'),
+        title: $link.attr('data-title') || $link.attr('title')
+      });
+    }
+
+    // Support both data-lightbox attribute and rel attribute implementations
+    var dataLightboxValue = $link.attr('data-lightbox');
+    var $links;
+
+    if (dataLightboxValue) {
+      $links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
+      for (var i = 0; i < $links.length; i = ++i) {
+        addToAlbum($($links[i]));
+        if ($links[i] === $link[0]) {
+          imageNumber = i;
+        }
+      }
+    } else {
+      if ($link.attr('rel') === 'lightbox') {
+        // If image is not part of a set
+        addToAlbum($link);
+      } else {
+        // If image is part of a set
+        $links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
+        for (var j = 0; j < $links.length; j = ++j) {
+          addToAlbum($($links[j]));
+          if ($links[j] === $link[0]) {
+            imageNumber = j;
+          }
+        }
+      }
+    }
+
+    // Position Lightbox
+    var top  = $window.scrollTop() + this.options.positionFromTop;
+    var left = $window.scrollLeft();
+    this.$lightbox.css({
+      top: top + 'px',
+      left: left + 'px'
+    }).fadeIn(this.options.fadeDuration);
+
+    // Disable scrolling of the page while open
+    if (this.options.disableScrolling) {
+      $('body').addClass('lb-disable-scrolling');
+    }
+
+    this.changeImage(imageNumber);
+  };
+
+  // Hide most UI elements in preparation for the animated resizing of the lightbox.
+  Lightbox.prototype.changeImage = function(imageNumber) {
+    var self = this;
+    var filename = this.album[imageNumber].link;
+    var filetype = filename.split('.').slice(-1)[0];
+    var $image = this.$lightbox.find('.lb-image');
+
+    // Disable keyboard nav during transitions
+    this.disableKeyboardNav();
+
+    // Show loading state
+    this.$overlay.fadeIn(this.options.fadeDuration);
+    $('.lb-loader').fadeIn('slow');
+    this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
+    this.$outerContainer.addClass('animating');
+
+    // When image to show is preloaded, we send the width and height to sizeContainer()
+    var preloader = new Image();
+    preloader.onload = function() {
+      var $preloader;
+      var imageHeight;
+      var imageWidth;
+      var maxImageHeight;
+      var maxImageWidth;
+      var windowHeight;
+      var windowWidth;
+
+      $image.attr({
+        'alt': self.album[imageNumber].alt,
+        'src': filename
+      });
+
+      $preloader = $(preloader);
+
+      $image.width(preloader.width);
+      $image.height(preloader.height);
+      windowWidth = $(window).width();
+      windowHeight = $(window).height();
+
+      // Calculate the max image dimensions for the current viewport.
+      // Take into account the border around the image and an additional 10px gutter on each side.
+      maxImageWidth  = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;
+      maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - self.options.positionFromTop - 70;
+
+      /*
+      Since many SVGs have small intrinsic dimensions, but they support scaling
+      up without quality loss because of their vector format, max out their
+      size.
+      */
+      if (filetype === 'svg') {
+        $image.width(maxImageWidth);
+        $image.height(maxImageHeight);
+      }
+
+      // Fit image inside the viewport.
+      if (self.options.fitImagesInViewport) {
+
+        // Check if image size is larger then maxWidth|maxHeight in settings
+        if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
+          maxImageWidth = self.options.maxWidth;
+        }
+        if (self.options.maxHeight && self.options.maxHeight < maxImageHeight) {
+          maxImageHeight = self.options.maxHeight;
+        }
+
+      } else {
+        maxImageWidth = self.options.maxWidth || preloader.width || maxImageWidth;
+        maxImageHeight = self.options.maxHeight || preloader.height || maxImageHeight;
+      }
+
+      // Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
+      // option than we need to size down while maintaining the aspect ratio.
+      if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
+        if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
+          imageWidth  = maxImageWidth;
+          imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
+          $image.width(imageWidth);
+          $image.height(imageHeight);
+        } else {
+          imageHeight = maxImageHeight;
+          imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
+          $image.width(imageWidth);
+          $image.height(imageHeight);
+        }
+      }
+      self.sizeContainer($image.width(), $image.height());
+    };
+
+    // Preload image before showing
+    preloader.src = this.album[imageNumber].link;
+    this.currentImageIndex = imageNumber;
+  };
+
+  // Stretch overlay to fit the viewport
+  Lightbox.prototype.sizeOverlay = function() {
+    var self = this;
+    /*
+    We use a setTimeout 0 to pause JS execution and let the rendering catch-up.
+    Why do this? If the `disableScrolling` option is set to true, a class is added to the body
+    tag that disables scrolling and hides the scrollbar. We want to make sure the scrollbar is
+    hidden before we measure the document width, as the presence of the scrollbar will affect the
+    number.
+    */
+    setTimeout(function() {
+      self.$overlay
+        .width($(document).width())
+        .height($(document).height());
+
+    }, 0);
+  };
+
+  // Animate the size of the lightbox to fit the image we are showing
+  // This method also shows the the image.
+  Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
+    var self = this;
+
+    var oldWidth  = this.$outerContainer.outerWidth();
+    var oldHeight = this.$outerContainer.outerHeight();
+    var newWidth  = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
+    var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
+
+    function postResize() {
+      self.$lightbox.find('.lb-dataContainer').width(newWidth);
+      self.$lightbox.find('.lb-prevLink').height(newHeight);
+      self.$lightbox.find('.lb-nextLink').height(newHeight);
+
+      // Set focus on one of the two root nodes so keyboard events are captured.
+      self.$overlay.focus();
+
+      self.showImage();
+    }
+
+    if (oldWidth !== newWidth || oldHeight !== newHeight) {
+      this.$outerContainer.animate({
+        width: newWidth,
+        height: newHeight
+      }, this.options.resizeDuration, 'swing', function() {
+        postResize();
+      });
+    } else {
+      postResize();
+    }
+  };
+
+  // Display the image and its details and begin preload neighboring images.
+  Lightbox.prototype.showImage = function() {
+    this.$lightbox.find('.lb-loader').stop(true).hide();
+    this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
+
+    this.updateNav();
+    this.updateDetails();
+    this.preloadNeighboringImages();
+    this.enableKeyboardNav();
+  };
+
+  // Display previous and next navigation if appropriate.
+  Lightbox.prototype.updateNav = function() {
+    // Check to see if the browser supports touch events. If so, we take the conservative approach
+    // and assume that mouse hover events are not supported and always show prev/next navigation
+    // arrows in image sets.
+    var alwaysShowNav = false;
+    try {
+      document.createEvent('TouchEvent');
+      alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
+    } catch (e) {}
+
+    this.$lightbox.find('.lb-nav').show();
+
+    if (this.album.length > 1) {
+      if (this.options.wrapAround) {
+        if (alwaysShowNav) {
+          this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
+        }
+        this.$lightbox.find('.lb-prev, .lb-next').show();
+      } else {
+        if (this.currentImageIndex > 0) {
+          this.$lightbox.find('.lb-prev').show();
+          if (alwaysShowNav) {
+            this.$lightbox.find('.lb-prev').css('opacity', '1');
+          }
+        }
+        if (this.currentImageIndex < this.album.length - 1) {
+          this.$lightbox.find('.lb-next').show();
+          if (alwaysShowNav) {
+            this.$lightbox.find('.lb-next').css('opacity', '1');
+          }
+        }
+      }
+    }
+  };
+
+  // Display caption, image number, and closing button.
+  Lightbox.prototype.updateDetails = function() {
+    var self = this;
+
+    // Enable anchor clicks in the injected caption html.
+    // Thanks Nate Wright for the fix. @https://github.com/NateWr
+    if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
+      this.album[this.currentImageIndex].title !== '') {
+      var $caption = this.$lightbox.find('.lb-caption');
+      if (this.options.sanitizeTitle) {
+        $caption.text(this.album[this.currentImageIndex].title);
+      } else {
+        $caption.html(this.album[this.currentImageIndex].title);
+      }
+      $caption.fadeIn('fast');
+    }
+
+    if (this.album.length > 1 && this.options.showImageNumberLabel) {
+      var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
+      this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
+    } else {
+      this.$lightbox.find('.lb-number').hide();
+    }
+
+    this.$outerContainer.removeClass('animating');
+
+    this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
+      return self.sizeOverlay();
+    });
+  };
+
+  // Preload previous and next images in set.
+  Lightbox.prototype.preloadNeighboringImages = function() {
+    if (this.album.length > this.currentImageIndex + 1) {
+      var preloadNext = new Image();
+      preloadNext.src = this.album[this.currentImageIndex + 1].link;
+    }
+    if (this.currentImageIndex > 0) {
+      var preloadPrev = new Image();
+      preloadPrev.src = this.album[this.currentImageIndex - 1].link;
+    }
+  };
+
+  Lightbox.prototype.enableKeyboardNav = function() {
+    this.$lightbox.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
+    this.$overlay.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
+  };
+
+  Lightbox.prototype.disableKeyboardNav = function() {
+    this.$lightbox.off('.keyboard');
+    this.$overlay.off('.keyboard');
+  };
+
+  Lightbox.prototype.keyboardAction = function(event) {
+    var KEYCODE_ESC        = 27;
+    var KEYCODE_LEFTARROW  = 37;
+    var KEYCODE_RIGHTARROW = 39;
+
+    var keycode = event.keyCode;
+    if (keycode === KEYCODE_ESC) {
+      // Prevent bubbling so as to not affect other components on the page.
+      event.stopPropagation();
+      this.end();
+    } else if (keycode === KEYCODE_LEFTARROW) {
+      if (this.currentImageIndex !== 0) {
+        this.changeImage(this.currentImageIndex - 1);
+      } else if (this.options.wrapAround && this.album.length > 1) {
+        this.changeImage(this.album.length - 1);
+      }
+    } else if (keycode === KEYCODE_RIGHTARROW) {
+      if (this.currentImageIndex !== this.album.length - 1) {
+        this.changeImage(this.currentImageIndex + 1);
+      } else if (this.options.wrapAround && this.album.length > 1) {
+        this.changeImage(0);
+      }
+    }
+  };
+
+  // Closing time. :-(
+  Lightbox.prototype.end = function() {
+    this.disableKeyboardNav();
+    $(window).off('resize', this.sizeOverlay);
+    this.$lightbox.fadeOut(this.options.fadeDuration);
+    this.$overlay.fadeOut(this.options.fadeDuration);
+
+    if (this.options.disableScrolling) {
+      $('body').removeClass('lb-disable-scrolling');
+    }
+  };
+
+  return new Lightbox();
+}));
diff --git a/dist/js/lightbox.min.js b/dist/js/lightbox.min.js
new file mode 100644
index 0000000..c468cbc
--- /dev/null
+++ b/dist/js/lightbox.min.js
@@ -0,0 +1,15 @@
+/*!
+ * Lightbox v2.11.2
+ * by Lokesh Dhakar
+ *
+ * More info:
+ * http://lokeshdhakar.com/projects/lightbox2/
+ *
+ * Copyright Lokesh Dhakar
+ * Released under the MIT license
+ * https://github.com/lokesh/lightbox2/blob/master/LICENSE
+ *
+ * @preserve
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.lightbox=b(a.jQuery)}(this,function(a){function b(b){this.album=[],this.currentImageIndex=void 0,this.init(),this.options=a.extend({},this.constructor.defaults),this.option(b)}return b.defaults={albumLabel:"Image %1 of %2",alwaysShowNavOnTouchDevices:!1,fadeDuration:600,fitImagesInViewport:!0,imageFadeDuration:600,positionFromTop:50,resizeDuration:700,showImageNumberLabel:!0,wrapAround:!1,disableScrolling:!1,sanitizeTitle:!1},b.prototype.option=function(b){a.extend(this.options,b)},b.prototype.imageCountLabel=function(a,b){return this.options.albumLabel.replace(/%1/g,a).replace(/%2/g,b)},b.prototype.init=function(){var b=this;a(document).ready(function(){b.enable(),b.build()})},b.prototype.enable=function(){var b=this;a("body").on("click","a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]",function(c){return b.start(a(c.currentTarget)),!1})},b.prototype.build=function(){if(!(a("#lightbox").length>0)){var b=this;a('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo(a("body")),this.$lightbox=a("#lightbox"),this.$overlay=a("#lightboxOverlay"),this.$outerContainer=this.$lightbox.find(".lb-outerContainer"),this.$container=this.$lightbox.find(".lb-container"),this.$image=this.$lightbox.find(".lb-image"),this.$nav=this.$lightbox.find(".lb-nav"),this.containerPadding={top:parseInt(this.$container.css("padding-top"),10),right:parseInt(this.$container.css("padding-right"),10),bottom:parseInt(this.$container.css("padding-bottom"),10),left:parseInt(this.$container.css("padding-left"),10)},this.imageBorderWidth={top:parseInt(this.$image.css("border-top-width"),10),right:parseInt(this.$image.css("border-right-width"),10),bottom:parseInt(this.$image.css("border-bottom-width"),10),left:parseInt(this.$image.css("border-left-width"),10)},this.$overlay.hide().on("click",function(){return b.end(),!1}),this.$lightbox.hide().on("click",function(c){"lightbox"===a(c.target).attr("id")&&b.end()}),this.$outerContainer.on("click",function(c){return"lightbox"===a(c.target).attr("id")&&b.end(),!1}),this.$lightbox.find(".lb-prev").on("click",function(){return 0===b.currentImageIndex?b.changeImage(b.album.length-1):b.changeImage(b.currentImageIndex-1),!1}),this.$lightbox.find(".lb-next").on("click",function(){return b.currentImageIndex===b.album.length-1?b.changeImage(0):b.changeImage(b.currentImageIndex+1),!1}),this.$nav.on("mousedown",function(a){3===a.which&&(b.$nav.css("pointer-events","none"),b.$lightbox.one("contextmenu",function(){setTimeout(function(){this.$nav.css("pointer-events","auto")}.bind(b),0)}))}),this.$lightbox.find(".lb-loader, .lb-close").on("click",function(){return b.end(),!1})}},b.prototype.start=function(b){function c(a){d.album.push({alt:a.attr("data-alt"),link:a.attr("href"),title:a.attr("data-title")||a.attr("title")})}var d=this,e=a(window);e.on("resize",a.proxy(this.sizeOverlay,this)),this.sizeOverlay(),this.album=[];var f,g=0,h=b.attr("data-lightbox");if(h){f=a(b.prop("tagName")+'[data-lightbox="'+h+'"]');for(var i=0;i<f.length;i=++i)c(a(f[i])),f[i]===b[0]&&(g=i)}else if("lightbox"===b.attr("rel"))c(b);else{f=a(b.prop("tagName")+'[rel="'+b.attr("rel")+'"]');for(var j=0;j<f.length;j=++j)c(a(f[j])),f[j]===b[0]&&(g=j)}var k=e.scrollTop()+this.options.positionFromTop,l=e.scrollLeft();this.$lightbox.css({top:k+"px",left:l+"px"}).fadeIn(this.options.fadeDuration),this.options.disableScrolling&&a("body").addClass("lb-disable-scrolling"),this.changeImage(g)},b.prototype.changeImage=function(b){var c=this,d=this.album[b].link,e=d.split(".").slice(-1)[0],f=this.$lightbox.find(".lb-image");this.disableKeyboardNav(),this.$overlay.fadeIn(this.options.fadeDuration),a(".lb-loader").fadeIn("slow"),this.$lightbox.find(".lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption").hide(),this.$outerContainer.addClass("animating");var g=new Image;g.onload=function(){var h,i,j,k,l,m;f.attr({alt:c.album[b].alt,src:d}),a(g),f.width(g.width),f.height(g.height),m=a(window).width(),l=a(window).height(),k=m-c.containerPadding.left-c.containerPadding.right-c.imageBorderWidth.left-c.imageBorderWidth.right-20,j=l-c.containerPadding.top-c.containerPadding.bottom-c.imageBorderWidth.top-c.imageBorderWidth.bottom-c.options.positionFromTop-70,"svg"===e&&(f.width(k),f.height(j)),c.options.fitImagesInViewport?(c.options.maxWidth&&c.options.maxWidth<k&&(k=c.options.maxWidth),c.options.maxHeight&&c.options.maxHeight<j&&(j=c.options.maxHeight)):(k=c.options.maxWidth||g.width||k,j=c.options.maxHeight||g.height||j),(g.width>k||g.height>j)&&(g.width/k>g.height/j?(i=k,h=parseInt(g.height/(g.width/i),10),f.width(i),f.height(h)):(h=j,i=parseInt(g.width/(g.height/h),10),f.width(i),f.height(h))),c.sizeContainer(f.width(),f.height())},g.src=this.album[b].link,this.currentImageIndex=b},b.prototype.sizeOverlay=function(){var b=this;setTimeout(function(){b.$overlay.width(a(document).width()).height(a(document).height())},0)},b.prototype.sizeContainer=function(a,b){function c(){d.$lightbox.find(".lb-dataContainer").width(g),d.$lightbox.find(".lb-prevLink").height(h),d.$lightbox.find(".lb-nextLink").height(h),d.$overlay.focus(),d.showImage()}var d=this,e=this.$outerContainer.outerWidth(),f=this.$outerContainer.outerHeight(),g=a+this.containerPadding.left+this.containerPadding.right+this.imageBorderWidth.left+this.imageBorderWidth.right,h=b+this.containerPadding.top+this.containerPadding.bottom+this.imageBorderWidth.top+this.imageBorderWidth.bottom;e!==g||f!==h?this.$outerContainer.animate({width:g,height:h},this.options.resizeDuration,"swing",function(){c()}):c()},b.prototype.showImage=function(){this.$lightbox.find(".lb-loader").stop(!0).hide(),this.$lightbox.find(".lb-image").fadeIn(this.options.imageFadeDuration),this.updateNav(),this.updateDetails(),this.preloadNeighboringImages(),this.enableKeyboardNav()},b.prototype.updateNav=function(){var a=!1;try{document.createEvent("TouchEvent"),a=!!this.options.alwaysShowNavOnTouchDevices}catch(a){}this.$lightbox.find(".lb-nav").show(),this.album.length>1&&(this.options.wrapAround?(a&&this.$lightbox.find(".lb-prev, .lb-next").css("opacity","1"),this.$lightbox.find(".lb-prev, .lb-next").show()):(this.currentImageIndex>0&&(this.$lightbox.find(".lb-prev").show(),a&&this.$lightbox.find(".lb-prev").css("opacity","1")),this.currentImageIndex<this.album.length-1&&(this.$lightbox.find(".lb-next").show(),a&&this.$lightbox.find(".lb-next").css("opacity","1"))))},b.prototype.updateDetails=function(){var a=this;if(void 0!==this.album[this.currentImageIndex].title&&""!==this.album[this.currentImageIndex].title){var b=this.$lightbox.find(".lb-caption");this.options.sanitizeTitle?b.text(this.album[this.currentImageIndex].title):b.html(this.album[this.currentImageIndex].title),b.fadeIn("fast")}if(this.album.length>1&&this.options.showImageNumberLabel){var c=this.imageCountLabel(this.currentImageIndex+1,this.album.length);this.$lightbox.find(".lb-number").text(c).fadeIn("fast")}else this.$lightbox.find(".lb-number").hide();this.$outerContainer.removeClass("animating"),this.$lightbox.find(".lb-dataContainer").fadeIn(this.options.resizeDuration,function(){return a.sizeOverlay()})},b.prototype.preloadNeighboringImages=function(){if(this.album.length>this.currentImageIndex+1){(new Image).src=this.album[this.currentImageIndex+1].link}if(this.currentImageIndex>0){(new Image).src=this.album[this.currentImageIndex-1].link}},b.prototype.enableKeyboardNav=function(){this.$lightbox.on("keyup.keyboard",a.proxy(this.keyboardAction,this)),this.$overlay.on("keyup.keyboard",a.proxy(this.keyboardAction,this))},b.prototype.disableKeyboardNav=function(){this.$lightbox.off(".keyboard"),this.$overlay.off(".keyboard")},b.prototype.keyboardAction=function(a){var b=a.keyCode;27===b?(a.stopPropagation(),this.end()):37===b?0!==this.currentImageIndex?this.changeImage(this.currentImageIndex-1):this.options.wrapAround&&this.album.length>1&&this.changeImage(this.album.length-1):39===b&&(this.currentImageIndex!==this.album.length-1?this.changeImage(this.currentImageIndex+1):this.options.wrapAround&&this.album.length>1&&this.changeImage(0))},b.prototype.end=function(){this.disableKeyboardNav(),a(window).off("resize",this.sizeOverlay),this.$lightbox.fadeOut(this.options.fadeDuration),this.$overlay.fadeOut(this.options.fadeDuration),this.options.disableScrolling&&a("body").removeClass("lb-disable-scrolling")},new b});
+//# sourceMappingURL=lightbox.min.map
\ No newline at end of file
diff --git a/dist/js/lightbox.min.map b/dist/js/lightbox.min.map
new file mode 100644
index 0000000..ceb12d8
--- /dev/null
+++ b/dist/js/lightbox.min.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../src/js/lightbox.js"],"names":["root","factory","define","amd","exports","module","require","lightbox","jQuery","this","$","Lightbox","options","album","currentImageIndex","init","extend","constructor","defaults","option","albumLabel","alwaysShowNavOnTouchDevices","fadeDuration","fitImagesInViewport","imageFadeDuration","positionFromTop","resizeDuration","showImageNumberLabel","wrapAround","disableScrolling","sanitizeTitle","prototype","imageCountLabel","currentImageNum","totalImages","replace","self","document","ready","enable","build","on","event","start","currentTarget","length","appendTo","$lightbox","$overlay","$outerContainer","find","$container","$image","$nav","containerPadding","top","parseInt","css","right","bottom","left","imageBorderWidth","hide","end","target","attr","changeImage","which","one","setTimeout","bind","$link","addToAlbum","push","alt","link","title","$window","window","proxy","sizeOverlay","$links","imageNumber","dataLightboxValue","prop","i","j","scrollTop","scrollLeft","fadeIn","addClass","filename","filetype","split","slice","disableKeyboardNav","preloader","Image","onload","imageHeight","imageWidth","maxImageHeight","maxImageWidth","windowHeight","windowWidth","src","width","height","maxWidth","maxHeight","sizeContainer","postResize","newWidth","newHeight","focus","showImage","oldWidth","outerWidth","oldHeight","outerHeight","animate","stop","updateNav","updateDetails","preloadNeighboringImages","enableKeyboardNav","alwaysShowNav","createEvent","e","show","$caption","text","html","labelText","removeClass","keyboardAction","off","keycode","keyCode","stopPropagation","fadeOut"],"mappings":"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","file":"lightbox.min.js"}
\ No newline at end of file
diff --git a/package.json b/package.json
index 9dc01b8..ad21f32 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "lightbox2",
-  "version": "2.11.3",
+  "version": "2.11.2",
   "author": "Lokesh Dhakar <lokesh.dhakar@gmail.com>",
   "description": "The original Lightbox script. Uses jQuery.",
   "keywords": [
diff --git a/src/js/lightbox.js b/src/js/lightbox.js
index 36362e5..aa97e73 100644
--- a/src/js/lightbox.js
+++ b/src/js/lightbox.js
@@ -1,5 +1,5 @@
 /*!
- * Lightbox v2.11.3
+ * Lightbox v2.11.2
  * by Lokesh Dhakar
  *
  * More info:

Debdiff

File lists identical (after any substitutions)

No differences were encountered in the control files

More details

Full run details