PageSourceSearch

https://www.purposeprize.org/Scripts/commonCmsBundle?v=SXPdq0ElpST07gCtqjSKHwRQcZ4

js purposeprize.org collected 2026-09-24 23:58:03 UTC 2,520,706 bytes, 70,124 lines download raw bytes

vendor: 11,558 bytes, lines 1-470
1/* input(62763,45255-45262): run-time error JS1010: Expected identifier: finally */
2/*!
3 * jQuery JavaScript Library v3.6.0
4 * https://jquery.com/
5 *
6 * Includes Sizzle.js
7 * https://sizzlejs.com/
8 *
9 * Copyright OpenJS Foundation and other contributors
10 * Released under the MIT license
11 * https://jquery.org/license
12 *
13 * Date: 2021-03-02T17:08Z
14 */
15( function( global, factory ) {
16
17	"use strict";
18
19	if ( typeof module === "object" && typeof module.exports === "object" ) {
20
21		// For CommonJS and CommonJS-like environments where a proper `window`
22		// is present, execute the factory and get jQuery.
23		// For environments that do not have a `window` with a `document`
24		// (such as Node.js), expose a factory as module.exports.
25		// This accentuates the need for the creation of a real `window`.
26		// e.g. var jQuery = require("jquery")(window);
27		// See ticket #14549 for more info.
28		module.exports = global.document ?
29			factory( global, true ) :
30			function( w ) {
31				if ( !w.document ) {
32					throw new Error( "jQuery requires a window with a document" );
33				}
34				return factory( w );
35			};
36	} else {
37		factory( global );
38	}
39
40// Pass this if window is not defined yet
41} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
42
43// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
44// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
45// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
46// enough that all such attempts are guarded in a try block.
47"use strict";
48
49var arr = [];
50
51var getProto = Object.getPrototypeOf;
52
53var slice = arr.slice;
54
55var flat = arr.flat ? function( array ) {
56	return arr.flat.call( array );
57} : function( array ) {
58	return arr.concat.apply( [], array );
59};
60
61
62var push = arr.push;
63
64var indexOf = arr.indexOf;
65
66var class2type = {};
67
68var toString = class2type.toString;
69
70var hasOwn = class2type.hasOwnProperty;
71
72var fnToString = hasOwn.toString;
73
74var ObjectFunctionString = fnToString.call( Object );
75
76var support = {};
77
78var isFunction = function isFunction( obj ) {
79
80		// Support: Chrome <=57, Firefox <=52
81		// In some browsers, typeof returns "function" for HTML <object> elements
82		// (i.e., `typeof document.createElement( "object" ) === "function"`).
83		// We don't want to classify *any* DOM node as a function.
84		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
85		// Plus for old WebKit, typeof returns "function" for HTML collections
86		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
87		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
88			typeof obj.item !== "function";
89	};
90
91
92var isWindow = function isWindow( obj ) {
93		return obj != null && obj === obj.window;
94	};
95
96
97var document = window.document;
98
99
100
101	var preservedScriptAttributes = {
102		type: true,
103		src: true,
104		nonce: true,
105		noModule: true
106	};
107
108	function DOMEval( code, node, doc ) {
109		doc = doc || document;
110
111		var i, val,
112			script = doc.createElement( "script" );
113
114		script.text = code;
115		if ( node ) {
116			for ( i in preservedScriptAttributes ) {
117
118				// Support: Firefox 64+, Edge 18+
119				// Some browsers don't support the "nonce" property on scripts.
120				// On the other hand, just using `getAttribute` is not enough as
121				// the `nonce` attribute is reset to an empty string whenever it
122				// becomes browsing-context connected.
123				// See https://github.com/whatwg/html/issues/2369
124				// See https://html.spec.whatwg.org/#nonce-attributes
125				// The `node.getAttribute` check was added for the sake of
126				// `jQuery.globalEval` so that it can fake a nonce-containing node
127				// via an object.
128				val = node[ i ] || node.getAttribute && node.getAttribute( i );
129				if ( val ) {
130					script.setAttribute( i, val );
131				}
132			}
133		}
134		doc.head.appendChild( script ).parentNode.removeChild( script );
135	}
136
137
138function toType( obj ) {
139	if ( obj == null ) {
140		return obj + "";
141	}
142
143	// Support: Android <=2.3 only (functionish RegExp)
144	return typeof obj === "object" || typeof obj === "function" ?
145		class2type[ toString.call( obj ) ] || "object" :
146		typeof obj;
147}
148/* global Symbol */
149// Defining this global in .eslintrc.json would create a danger of using the global
150// unguarded in another place, it seems safer to define global only for this module
151
152
153
154var
155	version = "hidden",
156
157	// Define a local copy of jQuery
158	jQuery = function( selector, context ) {
159
160		// The jQuery object is actually just the init constructor 'enhanced'
161		// Need init if jQuery is called (just allow error to be thrown if not included)
162		return new jQuery.fn.init( selector, context );
163	};
164
165jQuery.fn = jQuery.prototype = {
166
167	// The current version of jQuery being used
168	jquery: version,
169
170	constructor: jQuery,
171
172	// The default length of a jQuery object is 0
173	length: 0,
174
175	toArray: function() {
176		return slice.call( this );
177	},
178
179	// Get the Nth element in the matched element set OR
180	// Get the whole matched element set as a clean array
181	get: function( num ) {
182
183		// Return all the elements in a clean array
184		if ( num == null ) {
185			return slice.call( this );
186		}
187
188		// Return just the one element from the set
189		return num < 0 ? this[ num + this.length ] : this[ num ];
190	},
191
192	// Take an array of elements and push it onto the stack
193	// (returning the new matched element set)
194	pushStack: function( elems ) {
195
196		// Build a new jQuery matched element set
197		var ret = jQuery.merge( this.constructor(), elems );
198
199		// Add the old object onto the stack (as a reference)
200		ret.prevObject = this;
201
202		// Return the newly-formed element set
203		return ret;
204	},
205
206	// Execute a callback for every element in the matched set.
207	each: function( callback ) {
208		return jQuery.each( this, callback );
209	},
210
211	map: function( callback ) {
212		return this.pushStack( jQuery.map( this, function( elem, i ) {
213			return callback.call( elem, i, elem );
214		} ) );
215	},
216
217	slice: function() {
218		return this.pushStack( slice.apply( this, arguments ) );
219	},
220
221	first: function() {
222		return this.eq( 0 );
223	},
224
225	last: function() {
226		return this.eq( -1 );
227	},
228
229	even: function() {
230		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
231			return ( i + 1 ) % 2;
232		} ) );
233	},
234
235	odd: function() {
236		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
237			return i % 2;
238		} ) );
239	},
240
241	eq: function( i ) {
242		var len = this.length,
243			j = +i + ( i < 0 ? len : 0 );
244		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
245	},
246
247	end: function() {
248		return this.prevObject || this.constructor();
249	},
250
251	// For internal use only.
252	// Behaves like an Array's method, not like a jQuery method.
253	push: push,
254	sort: arr.sort,
255	splice: arr.splice
256};
257
258jQuery.extend = jQuery.fn.extend = function() {
259	var options, name, src, copy, copyIsArray, clone,
260		target = arguments[ 0 ] || {},
261		i = 1,
262		length = arguments.length,
263		deep = false;
264
265	// Handle a deep copy situation
266	if ( typeof target === "boolean" ) {
267		deep = target;
268
269		// Skip the boolean and the target
270		target = arguments[ i ] || {};
271		i++;
272	}
273
274	// Handle case when target is a string or something (possible in deep copy)
275	if ( typeof target !== "object" && !isFunction( target ) ) {
276		target = {};
277	}
278
279	// Extend jQuery itself if only one argument is passed
280	if ( i === length ) {
281		target = this;
282		i--;
283	}
284
285	for ( ; i < length; i++ ) {
286
287		// Only deal with non-null/undefined values
288		if ( ( options = arguments[ i ] ) != null ) {
289
290			// Extend the base object
291			for ( name in options ) {
292				copy = options[ name ];
293
294				// Prevent Object.prototype pollution
295				// Prevent never-ending loop
296				if ( name === "__proto__" || target === copy ) {
297					continue;
298				}
299
300				// Recurse if we're merging plain objects or arrays
301				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
302					( copyIsArray = Array.isArray( copy ) ) ) ) {
303					src = target[ name ];
304
305					// Ensure proper type for the source value
306					if ( copyIsArray && !Array.isArray( src ) ) {
307						clone = [];
308					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
309						clone = {};
310					} else {
311						clone = src;
312					}
313					copyIsArray = false;
314
315					// Never move original objects, clone them
316					target[ name ] = jQuery.extend( deep, clone, copy );
317
318				// Don't bring in undefined values
319				} else if ( copy !== undefined ) {
320					target[ name ] = copy;
321				}
322			}
323		}
324	}
325
326	// Return the modified object
327	return target;
328};
329
330jQuery.extend( {
331
332	// Unique for each copy of jQuery on the page
333	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
334
335	// Assume jQuery is ready without the ready module
336	isReady: true,
337
338	error: function( msg ) {
339		throw new Error( msg );
340	},
341
342	noop: function() {},
343
344	isPlainObject: function( obj ) {
345		var proto, Ctor;
346
347		// Detect obvious negatives
348		// Use toString instead of jQuery.type to catch host objects
349		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
350			return false;
351		}
352
353		proto = getProto( obj );
354
355		// Objects with no prototype (e.g., `Object.create( null )`) are plain
356		if ( !proto ) {
357			return true;
358		}
359
360		// Objects with prototype are plain iff they were constructed by a global Object function
361		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
362		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
363	},
364
365	isEmptyObject: function( obj ) {
366		var name;
367
368		for ( name in obj ) {
369			return false;
370		}
371		return true;
372	},
373
374	// Evaluates a script in a provided context; falls back to the global one
375	// if not specified.
376	globalEval: function( code, options, doc ) {
377		DOMEval( code, { nonce: options && options.nonce }, doc );
378	},
379
380	each: function( obj, callback ) {
381		var length, i = 0;
382
383		if ( isArrayLike( obj ) ) {
384			length = obj.length;
385			for ( ; i < length; i++ ) {
386				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
387					break;
388				}
389			}
390		} else {
391			for ( i in obj ) {
392				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
393					break;
394				}
395			}
396		}
397
398		return obj;
399	},
400
401	// results is for internal usage only
402	makeArray: function( arr, results ) {
403		var ret = results || [];
404
405		if ( arr != null ) {
406			if ( isArrayLike( Object( arr ) ) ) {
407				jQuery.merge( ret,
408					typeof arr === "string" ?
409						[ arr ] : arr
410				);
411			} else {
412				push.call( ret, arr );
413			}
414		}
415
416		return ret;
417	},
418
419	inArray: function( elem, arr, i ) {
420		return arr == null ? -1 : indexOf.call( arr, elem, i );
421	},
422
423	// Support: Android <=4.0 only, PhantomJS 1 only
424	// push.apply(_, arraylike) throws on ancient WebKit
425	merge: function( first, second ) {
426		var len = +second.length,
427			j = 0,
428			i = first.length;
429
430		for ( ; j < len; j++ ) {
431			first[ i++ ] = second[ j ];
432		}
433
434		first.length = i;
435
436		return first;
437	},
438
439	grep: function( elems, callback, invert ) {
440		var callbackInverse,
441			matches = [],
442			i = 0,
443			length = elems.length,
444			callbackExpect = !invert;
445
446		// Go through the array, only saving the items
447		// that pass the validator function
448		for ( ; i < length; i++ ) {
449			callbackInverse = !callback( elems[ i ], i );
450			if ( callbackInverse !== callbackExpect ) {
451				matches.push( elems[ i ] );
452			}
453		}
454
455		return matches;
456	},
457
458	// arg is for internal usage only
459	map: function( elems, callback, arg ) {
460		var length, value,
461			i = 0,
462			ret = [];
463
464		// Go through the array, translating each of the items to their new values
465		if ( isArrayLike( elems ) ) {
466			length = elems.length;
467			for ( ; i < length; i++ ) {
468				value = callback( elems[ i ], i, arg );
469
470				if ( value != null ) {
vendor: 4,201 bytes, lines 471-638
471					ret.push( value );
472				}
473			}
474
475		// Go through every key on the object,
476		} else {
477			for ( i in elems ) {
478				value = callback( elems[ i ], i, arg );
479
480				if ( value != null ) {
481					ret.push( value );
482				}
483			}
484		}
485
486		// Flatten any nested arrays
487		return flat( ret );
488	},
489
490	// A global GUID counter for objects
491	guid: 1,
492
493	// jQuery.support is not used in Core but other projects attach their
494	// properties to it so it needs to exist.
495	support: support
496} );
497
498if ( typeof Symbol === "function" ) {
499	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
500}
501
502// Populate the class2type map
503jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
504	function( _i, name ) {
505		class2type[ "[object " + name + "]" ] = name.toLowerCase();
506	} );
507
508function isArrayLike( obj ) {
509
510	// Support: real iOS 8.2 only (not reproducible in simulator)
511	// `in` check used to prevent JIT error (gh-2145)
512	// hasOwn isn't used here due to false negatives
513	// regarding Nodelist length in IE
514	var length = !!obj && "length" in obj && obj.length,
515		type = toType( obj );
516
517	if ( isFunction( obj ) || isWindow( obj ) ) {
518		return false;
519	}
520
521	return type === "array" || length === 0 ||
522		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
523}
524var Sizzle =
525/*!
526 * Sizzle CSS Selector Engine v2.3.6
527 * https://sizzlejs.com/
528 *
529 * Copyright JS Foundation and other contributors
530 * Released under the MIT license
531 * https://js.foundation/
532 *
533 * Date: 2021-02-16
534 */
535( function( window ) {
536var i,
537	support,
538	Expr,
539	getText,
540	isXML,
541	tokenize,
542	compile,
543	select,
544	outermostContext,
545	sortInput,
546	hasDuplicate,
547
548	// Local document vars
549	setDocument,
550	document,
551	docElem,
552	documentIsHTML,
553	rbuggyQSA,
554	rbuggyMatches,
555	matches,
556	contains,
557
558	// Instance-specific data
559	expando = "sizzle" + 1 * new Date(),
560	preferredDoc = window.document,
561	dirruns = 0,
562	done = 0,
563	classCache = createCache(),
564	tokenCache = createCache(),
565	compilerCache = createCache(),
566	nonnativeSelectorCache = createCache(),
567	sortOrder = function( a, b ) {
568		if ( a === b ) {
569			hasDuplicate = true;
570		}
571		return 0;
572	},
573
574	// Instance methods
575	hasOwn = ( {} ).hasOwnProperty,
576	arr = [],
577	pop = arr.pop,
578	pushNative = arr.push,
579	push = arr.push,
580	slice = arr.slice,
581
582	// Use a stripped-down indexOf as it's faster than native
583	// https://jsperf.com/thor-indexof-vs-for/5
584	indexOf = function( list, elem ) {
585		var i = 0,
586			len = list.length;
587		for ( ; i < len; i++ ) {
588			if ( list[ i ] === elem ) {
589				return i;
590			}
591		}
592		return -1;
593	},
594
595	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
596		"ismap|loop|multiple|open|readonly|required|scoped",
597
598	// Regular expressions
599
600	// http://www.w3.org/TR/css3-selectors/#whitespace
601	whitespace = "[\\x20\\t\\r\\n\\f]",
602
603	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
604	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
605		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
606
607	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
608	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
609
610		// Operator (capture 2)
611		"*([*^$|!~]?=)" + whitespace +
612
613		// "Attribute values must be CSS identifiers [capture 5]
614		// or strings [capture 3 or capture 4]"
615		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
616		whitespace + "*\\]",
617
618	pseudos = ":(" + identifier + ")(?:\\((" +
619
620		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
621		// 1. quoted (capture 3; capture 4 or capture 5)
622		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
623
624		// 2. simple (capture 6)
625		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
626
627		// 3. anything else (capture 2)
628		".*" +
629		")\\)|)",
630
631	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
632	rwhitespace = new RegExp( whitespace + "+", "g" ),
633	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
634		whitespace + "+$", "g" ),
635
636	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
637	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
638		"*" ),
vendor: 4,651 bytes, lines 639-793
639	rdescend = new RegExp( whitespace + "|>" ),
640
641	rpseudo = new RegExp( pseudos ),
642	ridentifier = new RegExp( "^" + identifier + "$" ),
643
644	matchExpr = {
645		"ID": new RegExp( "^#(" + identifier + ")" ),
646		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
647		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
648		"ATTR": new RegExp( "^" + attributes ),
649		"PSEUDO": new RegExp( "^" + pseudos ),
650		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
651			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
652			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
653		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
654
655		// For use in libraries implementing .is()
656		// We use this for POS matching in `select`
657		"needsContext": new RegExp( "^" + whitespace +
658			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
659			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
660	},
661
662	rhtml = /HTML$/i,
663	rinputs = /^(?:input|select|textarea|button)$/i,
664	rheader = /^h\d$/i,
665
666	rnative = /^[^{]+\{\s*\[native \w/,
667
668	// Easily-parseable/retrievable ID or TAG or CLASS selectors
669	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
670
671	rsibling = /[+~]/,
672
673	// CSS escapes
674	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
675	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
676	funescape = function( escape, nonHex ) {
677		var high = "0x" + escape.slice( 1 ) - 0x10000;
678
679		return nonHex ?
680
681			// Strip the backslash prefix from a non-hex escape sequence
682			nonHex :
683
684			// Replace a hexadecimal escape sequence with the encoded Unicode code point
685			// Support: IE <=11+
686			// For values outside the Basic Multilingual Plane (BMP), manually construct a
687			// surrogate pair
688			high < 0 ?
689				String.fromCharCode( high + 0x10000 ) :
690				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
691	},
692
693	// CSS string/identifier serialization
694	// https://drafts.csswg.org/cssom/#common-serializing-idioms
695	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
696	fcssescape = function( ch, asCodePoint ) {
697		if ( asCodePoint ) {
698
699			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
700			if ( ch === "\0" ) {
701				return "\uFFFD";
702			}
703
704			// Control characters and (dependent upon position) numbers get escaped as code points
705			return ch.slice( 0, -1 ) + "\\" +
706				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
707		}
708
709		// Other potentially-special ASCII characters get backslash-escaped
710		return "\\" + ch;
711	},
712
713	// Used for iframes
714	// See setDocument()
715	// Removing the function wrapper causes a "Permission Denied"
716	// error in IE
717	unloadHandler = function() {
718		setDocument();
719	},
720
721	inDisabledFieldset = addCombinator(
722		function( elem ) {
723			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
724		},
725		{ dir: "parentNode", next: "legend" }
726	);
727
728// Optimize for push.apply( _, NodeList )
729try {
730	push.apply(
731		( arr = slice.call( preferredDoc.childNodes ) ),
732		preferredDoc.childNodes
733	);
734
735	// Support: Android<4.0
736	// Detect silently failing push.apply
737	// eslint-disable-next-line no-unused-expressions
738	arr[ preferredDoc.childNodes.length ].nodeType;
739} catch ( e ) {
740	push = { apply: arr.length ?
741
742		// Leverage slice if possible
743		function( target, els ) {
744			pushNative.apply( target, slice.call( els ) );
745		} :
746
747		// Support: IE<9
748		// Otherwise append directly
749		function( target, els ) {
750			var j = target.length,
751				i = 0;
752
753			// Can't trust NodeList.length
754			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
755			target.length = j - 1;
756		}
757	};
758}
759
760function Sizzle( selector, context, results, seed ) {
761	var m, i, elem, nid, match, groups, newSelector,
762		newContext = context && context.ownerDocument,
763
764		// nodeType defaults to 9, since context defaults to document
765		nodeType = context ? context.nodeType : 9;
766
767	results = results || [];
768
769	// Return early from calls with invalid selector or context
770	if ( typeof selector !== "string" || !selector ||
771		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
772
773		return results;
774	}
775
776	// Try to shortcut find operations (as opposed to filters) in HTML documents
777	if ( !seed ) {
778		setDocument( context );
779		context = context || document;
780
781		if ( documentIsHTML ) {
782
783			// If the selector is sufficiently simple, try using a "get*By*" DOM method
784			// (excepting DocumentFragment context, where the methods don't exist)
785			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
786
787				// ID selector
788				if ( ( m = match[ 1 ] ) ) {
789
790					// Document context
791					if ( nodeType === 9 ) {
792						if ( ( elem = context.getElementById( m ) ) ) {
793
794							// Support: IE, Opera, Webkit
795							// TODO: identify versions
796							// getElementById can match elements by name instead of ID
797							if ( elem.id === m ) {
798								results.push( elem );
799								return results;
800							}
801						} else {
802							return results;
803						}
804
805					// Element context
806					} else {
807
808						// Support: IE, Opera, Webkit
809						// TODO: identify versions
810						// getElementById can match elements by name instead of ID
811						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
812							contains( context, elem ) &&
813							elem.id === m ) {
814
815							results.push( elem );
816							return results;
817						}
818					}
819
820				// Type selector
821				} else if ( match[ 2 ] ) {
822					push.apply( results, context.getElementsByTagName( selector ) );
823					return results;
824
825				// Class selector
826				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
827					context.getElementsByClassName ) {
828
829					push.apply( results, context.getElementsByClassName( m ) );
830					return results;
831				}
832			}
833
834			// Take advantage of querySelectorAll
835			if ( support.qsa &&
836				!nonnativeSelectorCache[ selector + " " ] &&
837				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
838
839				// Support: IE 8 only
840				// Exclude object elements
841				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
842
843				newSelector = selector;
844				newContext = context;
845
846				// qSA considers elements outside a scoping root when evaluating child or
847				// descendant combinators, which is not what we want.
848				// In such cases, we work around the behavior by prefixing every selector in the
849				// list with an ID selector referencing the scope context.
850				// The technique has to be used as well when a leading combinator is used
851				// as such selectors are not recognized by querySelectorAll.
852				// Thanks to Andrew Dupont for this technique.
853				if ( nodeType === 1 &&
854					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
855
856					// Expand context for sibling selectors
857					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
858						context;
859
860					// We can use :scope instead of the ID hack if the browser
861					// supports it & if we're not changing the context.
862					if ( newContext !== context || !support.scope ) {
863
864						// Capture the context ID, setting it first if necessary
865						if ( ( nid = context.getAttribute( "id" ) ) ) {
866							nid = nid.replace( rcssescape, fcssescape );
867						} else {
868							context.setAttribute( "id", ( nid = expando ) );
869						}
870					}
871
872					// Prefix every selector in the list
873					groups = tokenize( selector );
874					i = groups.length;
875					while ( i-- ) {
876						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
877							toSelector( groups[ i ] );
878					}
879					newSelector = groups.join( "," );
880				}
881
882				try {
883					push.apply( results,
884						newContext.querySelectorAll( newSelector )
885					);
886					return results;
887				} catch ( qsaError ) {
888					nonnativeSelectorCache( selector, true );
889				} finally {
890					if ( nid === expando ) {
891						context.removeAttribute( "id" );
892					}
893				}
894			}
895		}
896	}
897
898	// All others
899	return select( selector.replace( rtrim, "$1" ), context, results, seed );
900}
901
902/**
903 * Create key-value caches of limited size
904 * @returns {function(string, object)} Returns the Object data after storing it on itself with
905 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
906 *	deleting the oldest entry
907 */
908function createCache() {
909	var keys = [];
910
911	function cache( key, value ) {
912
913		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
914		if ( keys.push( key + " " ) > Expr.cacheLength ) {
915
916			// Only keep the most recent entries
917			delete cache[ keys.shift() ];
918		}
919		return ( cache[ key + " " ] = value );
920	}
921	return cache;
922}
923
924/**
925 * Mark a function for special use by Sizzle
926 * @param {Function} fn The function to mark
927 */
928function markFunction( fn ) {
929	fn[ expando ] = true;
930	return fn;
931}
932
933/**
934 * Support testing using an element
935 * @param {Function} fn Passed the created element and returns a boolean result
936 */
937function assert( fn ) {
938	var el = document.createElement( "fieldset" );
939
940	try {
941		return !!fn( el );
942	} catch ( e ) {
943		return false;
vendor: 4,247 bytes, lines 944-1099
944	} finally {
945
946		// Remove from its parent by default
947		if ( el.parentNode ) {
948			el.parentNode.removeChild( el );
949		}
950
951		// release memory in IE
952		el = null;
953	}
954}
955
956/**
957 * Adds the same handler for all of the specified attrs
958 * @param {String} attrs Pipe-separated list of attributes
959 * @param {Function} handler The method that will be applied
960 */
961function addHandle( attrs, handler ) {
962	var arr = attrs.split( "|" ),
963		i = arr.length;
964
965	while ( i-- ) {
966		Expr.attrHandle[ arr[ i ] ] = handler;
967	}
968}
969
970/**
971 * Checks document order of two siblings
972 * @param {Element} a
973 * @param {Element} b
974 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
975 */
976function siblingCheck( a, b ) {
977	var cur = b && a,
978		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
979			a.sourceIndex - b.sourceIndex;
980
981	// Use IE sourceIndex if available on both nodes
982	if ( diff ) {
983		return diff;
984	}
985
986	// Check if b follows a
987	if ( cur ) {
988		while ( ( cur = cur.nextSibling ) ) {
989			if ( cur === b ) {
990				return -1;
991			}
992		}
993	}
994
995	return a ? 1 : -1;
996}
997
998/**
999 * Returns a function to use in pseudos for input types
1000 * @param {String} type
1001 */
1002function createInputPseudo( type ) {
1003	return function( elem ) {
1004		var name = elem.nodeName.toLowerCase();
1005		return name === "input" && elem.type === type;
1006	};
1007}
1008
1009/**
1010 * Returns a function to use in pseudos for buttons
1011 * @param {String} type
1012 */
1013function createButtonPseudo( type ) {
1014	return function( elem ) {
1015		var name = elem.nodeName.toLowerCase();
1016		return ( name === "input" || name === "button" ) && elem.type === type;
1017	};
1018}
1019
1020/**
1021 * Returns a function to use in pseudos for :enabled/:disabled
1022 * @param {Boolean} disabled true for :disabled; false for :enabled
1023 */
1024function createDisabledPseudo( disabled ) {
1025
1026	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1027	return function( elem ) {
1028
1029		// Only certain elements can match :enabled or :disabled
1030		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1031		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1032		if ( "form" in elem ) {
1033
1034			// Check for inherited disabledness on relevant non-disabled elements:
1035			// * listed form-associated elements in a disabled fieldset
1036			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1037			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1038			// * option elements in a disabled optgroup
1039			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1040			// All such elements have a "form" property.
1041			if ( elem.parentNode && elem.disabled === false ) {
1042
1043				// Option elements defer to a parent optgroup if present
1044				if ( "label" in elem ) {
1045					if ( "label" in elem.parentNode ) {
1046						return elem.parentNode.disabled === disabled;
1047					} else {
1048						return elem.disabled === disabled;
1049					}
1050				}
1051
1052				// Support: IE 6 - 11
1053				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1054				return elem.isDisabled === disabled ||
1055
1056					// Where there is no isDisabled, check manually
1057					/* jshint -W018 */
1058					elem.isDisabled !== !disabled &&
1059					inDisabledFieldset( elem ) === disabled;
1060			}
1061
1062			return elem.disabled === disabled;
1063
1064		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1065		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1066		// even exist on them, let alone have a boolean value.
1067		} else if ( "label" in elem ) {
1068			return elem.disabled === disabled;
1069		}
1070
1071		// Remaining elements are neither :enabled nor :disabled
1072		return false;
1073	};
1074}
1075
1076/**
1077 * Returns a function to use in pseudos for positionals
1078 * @param {Function} fn
1079 */
1080function createPositionalPseudo( fn ) {
1081	return markFunction( function( argument ) {
1082		argument = +argument;
1083		return markFunction( function( seed, matches ) {
1084			var j,
1085				matchIndexes = fn( [], seed.length, argument ),
1086				i = matchIndexes.length;
1087
1088			// Match elements found at the specified indexes
1089			while ( i-- ) {
1090				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1091					seed[ j ] = !( matches[ j ] = seed[ j ] );
1092				}
1093			}
1094		} );
1095	} );
1096}
1097
1098/**
1099 * Checks a node for validity as a Sizzle context
1100 * @param {Element|Object=} context
1101 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1102 */
1103function testContext( context ) {
1104	return context && typeof context.getElementsByTagName !== "undefined" && context;
1105}
1106
1107// Expose support vars for convenience
1108support = Sizzle.support = {};
1109
1110/**
1111 * Detects XML nodes
1112 * @param {Element|Object} elem An element or a document
1113 * @returns {Boolean} True iff elem is a non-HTML XML node
1114 */
1115isXML = Sizzle.isXML = function( elem ) {
1116	var namespace = elem && elem.namespaceURI,
1117		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
1118
1119	// Support: IE <=8
1120	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1121	// https://bugs.jquery.com/ticket/4833
1122	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1123};
1124
1125/**
1126 * Sets document-related variables once based on the current document
1127 * @param {Element|Object} [doc] An element or document object to use to set the document
1128 * @returns {Object} Returns the current document
1129 */
1130setDocument = Sizzle.setDocument = function( node ) {
1131	var hasCompare, subWindow,
1132		doc = node ? node.ownerDocument || node : preferredDoc;
1133
1134	// Return early if doc is invalid or already selected
1135	// Support: IE 11+, Edge 17 - 18+
1136	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1137	// two documents; shallow comparisons work.
1138	// eslint-disable-next-line eqeqeq
1139	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1140		return document;
1141	}
1142
1143	// Update global variables
1144	document = doc;
1145	docElem = document.documentElement;
1146	documentIsHTML = !isXML( document );
1147
1148	// Support: IE 9 - 11+, Edge 12 - 18+
1149	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1150	// Support: IE 11+, Edge 17 - 18+
1151	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1152	// two documents; shallow comparisons work.
1153	// eslint-disable-next-line eqeqeq
1154	if ( preferredDoc != document &&
1155		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1156
1157		// Support: IE 11, Edge
1158		if ( subWindow.addEventListener ) {
1159			subWindow.addEventListener( "unload", unloadHandler, false );
1160
1161		// Support: IE 9 - 10 only
1162		} else if ( subWindow.attachEvent ) {
1163			subWindow.attachEvent( "onunload", unloadHandler );
1164		}
1165	}
1166
1167	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1168	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
1169	// IE/Edge & older browsers don't support the :scope pseudo-class.
1170	// Support: Safari 6.0 only
1171	// Safari 6.0 supports :scope but it's an alias of :root there.
1172	support.scope = assert( function( el ) {
1173		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1174		return typeof el.querySelectorAll !== "undefined" &&
1175			!el.querySelectorAll( ":scope fieldset div" ).length;
1176	} );
1177
1178	/* Attributes
1179	---------------------------------------------------------------------- */
1180
1181	// Support: IE<8
1182	// Verify that getAttribute really returns attributes and not properties
1183	// (excepting IE8 booleans)
1184	support.attributes = assert( function( el ) {
1185		el.className = "i";
1186		return !el.getAttribute( "className" );
1187	} );
1188
1189	/* getElement(s)By*
1190	---------------------------------------------------------------------- */
1191
1192	// Check if getElementsByTagName("*") returns only elements
1193	support.getElementsByTagName = assert( function( el ) {
1194		el.appendChild( document.createComment( "" ) );
1195		return !el.getElementsByTagName( "*" ).length;
1196	} );
1197
1198	// Support: IE<9
1199	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1200
1201	// Support: IE<10
1202	// Check if getElementById returns elements by name
1203	// The broken getElementById methods don't pick up programmatically-set names,
1204	// so use a roundabout getElementsByName test
1205	support.getById = assert( function( el ) {
1206		docElem.appendChild( el ).id = expando;
1207		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1208	} );
1209
1210	// ID filter and find
1211	if ( support.getById ) {
1212		Expr.filter[ "ID" ] = function( id ) {
1213			var attrId = id.replace( runescape, funescape );
1214			return function( elem ) {
1215				return elem.getAttribute( "id" ) === attrId;
1216			};
1217		};
1218		Expr.find[ "ID" ] = function( id, context ) {
1219			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1220				var elem = context.getElementById( id );
1221				return elem ? [ elem ] : [];
1222			}
1223		};
1224	} else {
1225		Expr.filter[ "ID" ] =  function( id ) {
1226			var attrId = id.replace( runescape, funescape );
1227			return function( elem ) {
1228				var node = typeof elem.getAttributeNode !== "undefined" &&
1229					elem.getAttributeNode( "id" );
1230				return node && node.value === attrId;
1231			};
1232		};
1233
vendor: 4,196 bytes, lines 1234-1365
1234		// Support: IE 6 - 7 only
1235		// getElementById is not reliable as a find shortcut
1236		Expr.find[ "ID" ] = function( id, context ) {
1237			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1238				var node, i, elems,
1239					elem = context.getElementById( id );
1240
1241				if ( elem ) {
1242
1243					// Verify the id attribute
1244					node = elem.getAttributeNode( "id" );
1245					if ( node && node.value === id ) {
1246						return [ elem ];
1247					}
1248
1249					// Fall back on getElementsByName
1250					elems = context.getElementsByName( id );
1251					i = 0;
1252					while ( ( elem = elems[ i++ ] ) ) {
1253						node = elem.getAttributeNode( "id" );
1254						if ( node && node.value === id ) {
1255							return [ elem ];
1256						}
1257					}
1258				}
1259
1260				return [];
1261			}
1262		};
1263	}
1264
1265	// Tag
1266	Expr.find[ "TAG" ] = support.getElementsByTagName ?
1267		function( tag, context ) {
1268			if ( typeof context.getElementsByTagName !== "undefined" ) {
1269				return context.getElementsByTagName( tag );
1270
1271			// DocumentFragment nodes don't have gEBTN
1272			} else if ( support.qsa ) {
1273				return context.querySelectorAll( tag );
1274			}
1275		} :
1276
1277		function( tag, context ) {
1278			var elem,
1279				tmp = [],
1280				i = 0,
1281
1282				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1283				results = context.getElementsByTagName( tag );
1284
1285			// Filter out possible comments
1286			if ( tag === "*" ) {
1287				while ( ( elem = results[ i++ ] ) ) {
1288					if ( elem.nodeType === 1 ) {
1289						tmp.push( elem );
1290					}
1291				}
1292
1293				return tmp;
1294			}
1295			return results;
1296		};
1297
1298	// Class
1299	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
1300		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1301			return context.getElementsByClassName( className );
1302		}
1303	};
1304
1305	/* QSA/matchesSelector
1306	---------------------------------------------------------------------- */
1307
1308	// QSA and matchesSelector support
1309
1310	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1311	rbuggyMatches = [];
1312
1313	// qSa(:focus) reports false when true (Chrome 21)
1314	// We allow this because of a bug in IE8/9 that throws an error
1315	// whenever `document.activeElement` is accessed on an iframe
1316	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1317	// See https://bugs.jquery.com/ticket/13378
1318	rbuggyQSA = [];
1319
1320	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1321
1322		// Build QSA regex
1323		// Regex strategy adopted from Diego Perini
1324		assert( function( el ) {
1325
1326			var input;
1327
1328			// Select is set to empty string on purpose
1329			// This is to test IE's treatment of not explicitly
1330			// setting a boolean content attribute,
1331			// since its presence should be enough
1332			// https://bugs.jquery.com/ticket/12359
1333			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1334				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1335				"<option selected=''></option></select>";
1336
1337			// Support: IE8, Opera 11-12.16
1338			// Nothing should be selected when empty strings follow ^= or $= or *=
1339			// The test attribute must be unknown in Opera but "safe" for WinRT
1340			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1341			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
1342				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1343			}
1344
1345			// Support: IE8
1346			// Boolean attributes and "value" are not treated correctly
1347			if ( !el.querySelectorAll( "[selected]" ).length ) {
1348				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1349			}
1350
1351			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1352			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1353				rbuggyQSA.push( "~=" );
1354			}
1355
1356			// Support: IE 11+, Edge 15 - 18+
1357			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
1358			// Adding a temporary attribute to the document before the selection works
1359			// around the issue.
1360			// Interestingly, IE 10 & older don't seem to have the issue.
1361			input = document.createElement( "input" );
1362			input.setAttribute( "name", "" );
1363			el.appendChild( input );
1364			if ( !el.querySelectorAll( "[name='']" ).length ) {
1365				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" 
vendor: 4,065 bytes, lines 1365-1494
1365+
1366					whitespace + "*(?:''|\"\")" );
1367			}
1368
1369			// Webkit/Opera - :checked should return selected option elements
1370			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1371			// IE8 throws error here and will not see later tests
1372			if ( !el.querySelectorAll( ":checked" ).length ) {
1373				rbuggyQSA.push( ":checked" );
1374			}
1375
1376			// Support: Safari 8+, iOS 8+
1377			// https://bugs.webkit.org/show_bug.cgi?id=136851
1378			// In-page `selector#id sibling-combinator selector` fails
1379			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1380				rbuggyQSA.push( ".#.+[+~]" );
1381			}
1382
1383			// Support: Firefox <=3.6 - 5 only
1384			// Old Firefox doesn't throw on a badly-escaped identifier.
1385			el.querySelectorAll( "\\\f" );
1386			rbuggyQSA.push( "[\\r\\n\\f]" );
1387		} );
1388
1389		assert( function( el ) {
1390			el.innerHTML = "<a href='' disabled='disabled'></a>" +
1391				"<select disabled='disabled'><option/></select>";
1392
1393			// Support: Windows 8 Native Apps
1394			// The type and name attributes are restricted during .innerHTML assignment
1395			var input = document.createElement( "input" );
1396			input.setAttribute( "type", "hidden" );
1397			el.appendChild( input ).setAttribute( "name", "D" );
1398
1399			// Support: IE8
1400			// Enforce case-sensitivity of name attribute
1401			if ( el.querySelectorAll( "[name=d]" ).length ) {
1402				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1403			}
1404
1405			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1406			// IE8 throws error here and will not see later tests
1407			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1408				rbuggyQSA.push( ":enabled", ":disabled" );
1409			}
1410
1411			// Support: IE9-11+
1412			// IE's :disabled selector does not pick up the children of disabled fieldsets
1413			docElem.appendChild( el ).disabled = true;
1414			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1415				rbuggyQSA.push( ":enabled", ":disabled" );
1416			}
1417
1418			// Support: Opera 10 - 11 only
1419			// Opera 10-11 does not throw on post-comma invalid pseudos
1420			el.querySelectorAll( "*,:x" );
1421			rbuggyQSA.push( ",.*:" );
1422		} );
1423	}
1424
1425	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1426		docElem.webkitMatchesSelector ||
1427		docElem.mozMatchesSelector ||
1428		docElem.oMatchesSelector ||
1429		docElem.msMatchesSelector ) ) ) ) {
1430
1431		assert( function( el ) {
1432
1433			// Check to see if it's possible to do matchesSelector
1434			// on a disconnected node (IE 9)
1435			support.disconnectedMatch = matches.call( el, "*" );
1436
1437			// This should fail with an exception
1438			// Gecko does not error, returns false instead
1439			matches.call( el, "[s!='']:x" );
1440			rbuggyMatches.push( "!=", pseudos );
1441		} );
1442	}
1443
1444	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1445	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
1446
1447	/* Contains
1448	---------------------------------------------------------------------- */
1449	hasCompare = rnative.test( docElem.compareDocumentPosition );
1450
1451	// Element contains another
1452	// Purposefully self-exclusive
1453	// As in, an element does not contain itself
1454	contains = hasCompare || rnative.test( docElem.contains ) ?
1455		function( a, b ) {
1456			var adown = a.nodeType === 9 ? a.documentElement : a,
1457				bup = b && b.parentNode;
1458			return a === bup || !!( bup && bup.nodeType === 1 && (
1459				adown.contains ?
1460					adown.contains( bup ) :
1461					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1462			) );
1463		} :
1464		function( a, b ) {
1465			if ( b ) {
1466				while ( ( b = b.parentNode ) ) {
1467					if ( b === a ) {
1468						return true;
1469					}
1470				}
1471			}
1472			return false;
1473		};
1474
1475	/* Sorting
1476	---------------------------------------------------------------------- */
1477
1478	// Document order sorting
1479	sortOrder = hasCompare ?
1480	function( a, b ) {
1481
1482		// Flag for duplicate removal
1483		if ( a === b ) {
1484			hasDuplicate = true;
1485			return 0;
1486		}
1487
1488		// Sort on method existence if only one input has compareDocumentPosition
1489		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1490		if ( compare ) {
1491			return compare;
1492		}
1493
1494		// Calculate position if both inputs belong to the same document
1495		// Support: IE 11+, Edge 17 - 18+
1496		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1497		// two documents; shallow comparisons work.
1498		// eslint-disable-next-line eqeqeq
1499		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1500			a.compareDocumentPosition( b ) :
1501
1502			// Otherwise we know they are disconnected
1503			1;
1504
1505		// Disconnected nodes
1506		if ( compare & 1 ||
1507			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1508
1509			// Choose the first element that is related to our preferred document
1510			// Support: IE 11+, Edge 17 - 18+
1511			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1512			// two documents; shallow comparisons work.
1513			// eslint-disable-next-line eqeqeq
1514			if ( a == document || a.ownerDocument == preferredDoc &&
1515				contains( preferredDoc, a ) ) {
1516				return -1;
1517			}
1518
1519			// Support: IE 11+, Edge 17 - 18+
1520			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1521			// two documents; shallow comparisons work.
1522			// eslint-disable-next-line eqeqeq
1523			if ( b == document || b.ownerDocument == preferredDoc &&
1524				contains( preferredDoc, b ) ) {
1525				return 1;
1526			}
1527
1528			// Maintain original order
1529			return sortInput ?
1530				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1531				0;
1532		}
1533
1534		return compare & 4 ? -1 : 1;
1535	} :
1536	function( a, b ) {
1537
1538		// Exit early if the nodes are identical
1539		if ( a === b ) {
1540			hasDuplicate = true;
1541			return 0;
1542		}
1543
1544		var cur,
1545			i = 0,
1546			aup = a.parentNode,
1547			bup = b.parentNode,
1548			ap = [ a ],
1549			bp = [ b ];
1550
1551		// Parentless nodes are either documents or disconnected
1552		if ( !aup || !bup ) {
1553
1554			// Support: IE 11+, Edge 17 - 18+
1555			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1556			// two documents; shallow comparisons work.
1557			/* eslint-disable eqeqeq */
1558			return a == document ? -1 :
1559				b == document ? 1 :
1560				/* eslint-enable eqeqeq */
1561				aup ? -1 :
1562				bup ? 1 :
1563				sortInput ?
1564				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1565				0;
1566
1567		// If the nodes are siblings, we can do a quick check
1568		} else if ( aup === bup ) {
1569			return siblingCheck( a, b );
1570		}
1571
1572		// Otherwise we need full lists of their ancestors for comparison
1573		cur = a;
1574		while ( ( cur = cur.parentNode ) ) {
1575			ap.unshift( cur );
1576		}
1577		cur = b;
1578		while ( ( cur = cur.parentNode ) ) {
1579			bp.unshift( cur );
1580		}
1581
1582		// Walk down the tree looking for a discrepancy
1583		while ( ap[ i ] === bp[ i ] ) {
1584			i++;
1585		}
1586
1587		return i ?
1588
1589			// Do a sibling check if the nodes have a common ancestor
1590			siblingCheck( ap[ i ], bp[ i ] ) :
1591
1592			// Otherwise nodes in our document sort first
1593			// Support: IE 11+, Edge 17 - 18+
1594			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1595			// two documents; shallow comparisons work.
1596			/* eslint-disable eqeqeq */
1597			ap[ i ] == preferredDoc ? -1 :
1598			bp[ i ] == preferredDoc ? 1 :
1599			/* eslint-enable eqeqeq */
1600			0;
1601	};
1602
1603	return document;
1604};
1605
1606Sizzle.matches = function( expr, elements ) {
1607	return Sizzle( expr, null, null, elements );
1608};
1609
1610Sizzle.matchesSelector = function( elem, expr ) {
1611	setDocument( elem );
1612
1613	if ( support.matchesSelector && documentIsHTML &&
1614		!nonnativeSelectorCache[ expr + " " ] &&
1615		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1616		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1617
1618		try {
1619			var ret = matches.call( elem, expr );
1620
1621			// IE 9's matchesSelector returns false on disconnected nodes
1622			if ( ret || support.disconnectedMatch ||
1623
1624				// As well, disconnected nodes are said to be in a document
1625				// fragment in IE 9
1626				elem.document && elem.document.nodeType !== 11 ) {
1627				return ret;
1628			}
1629		} catch ( e ) {
1630			nonnativeSelectorCache( expr, true );
1631		}
1632	}
1633
1634	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1635};
1636
1637Sizzle.contains = function( context, elem ) {
1638
1639	// Set document vars if needed
1640	// Support: IE 11+, Edge 17 - 18+
1641	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1642	// two documents; shallow comparisons work.
1643	// eslint-disable-next-line eqeqeq
1644	if ( ( context.ownerDocument || context ) != document ) {
1645		setDocument( context );
1646	}
1647	return contains( context, elem );
1648};
1649
1650Sizzle.attr = function( elem, name ) {
1651
1652	// Set document vars if needed
vendor: 16,419 bytes, lines 1653-2245
1653	// Support: IE 11+, Edge 17 - 18+
1654	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1655	// two documents; shallow comparisons work.
1656	// eslint-disable-next-line eqeqeq
1657	if ( ( elem.ownerDocument || elem ) != document ) {
1658		setDocument( elem );
1659	}
1660
1661	var fn = Expr.attrHandle[ name.toLowerCase() ],
1662
1663		// Don't get fooled by Object.prototype properties (jQuery #13807)
1664		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1665			fn( elem, name, !documentIsHTML ) :
1666			undefined;
1667
1668	return val !== undefined ?
1669		val :
1670		support.attributes || !documentIsHTML ?
1671			elem.getAttribute( name ) :
1672			( val = elem.getAttributeNode( name ) ) && val.specified ?
1673				val.value :
1674				null;
1675};
1676
1677Sizzle.escape = function( sel ) {
1678	return ( sel + "" ).replace( rcssescape, fcssescape );
1679};
1680
1681Sizzle.error = function( msg ) {
1682	throw new Error( "Syntax error, unrecognized expression: " + msg );
1683};
1684
1685/**
1686 * Document sorting and removing duplicates
1687 * @param {ArrayLike} results
1688 */
1689Sizzle.uniqueSort = function( results ) {
1690	var elem,
1691		duplicates = [],
1692		j = 0,
1693		i = 0;
1694
1695	// Unless we *know* we can detect duplicates, assume their presence
1696	hasDuplicate = !support.detectDuplicates;
1697	sortInput = !support.sortStable && results.slice( 0 );
1698	results.sort( sortOrder );
1699
1700	if ( hasDuplicate ) {
1701		while ( ( elem = results[ i++ ] ) ) {
1702			if ( elem === results[ i ] ) {
1703				j = duplicates.push( i );
1704			}
1705		}
1706		while ( j-- ) {
1707			results.splice( duplicates[ j ], 1 );
1708		}
1709	}
1710
1711	// Clear input after sorting to release objects
1712	// See https://github.com/jquery/sizzle/pull/225
1713	sortInput = null;
1714
1715	return results;
1716};
1717
1718/**
1719 * Utility function for retrieving the text value of an array of DOM nodes
1720 * @param {Array|Element} elem
1721 */
1722getText = Sizzle.getText = function( elem ) {
1723	var node,
1724		ret = "",
1725		i = 0,
1726		nodeType = elem.nodeType;
1727
1728	if ( !nodeType ) {
1729
1730		// If no nodeType, this is expected to be an array
1731		while ( ( node = elem[ i++ ] ) ) {
1732
1733			// Do not traverse comment nodes
1734			ret += getText( node );
1735		}
1736	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1737
1738		// Use textContent for elements
1739		// innerText usage removed for consistency of new lines (jQuery #11153)
1740		if ( typeof elem.textContent === "string" ) {
1741			return elem.textContent;
1742		} else {
1743
1744			// Traverse its children
1745			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1746				ret += getText( elem );
1747			}
1748		}
1749	} else if ( nodeType === 3 || nodeType === 4 ) {
1750		return elem.nodeValue;
1751	}
1752
1753	// Do not include comment or processing instruction nodes
1754
1755	return ret;
1756};
1757
1758Expr = Sizzle.selectors = {
1759
1760	// Can be adjusted by the user
1761	cacheLength: 50,
1762
1763	createPseudo: markFunction,
1764
1765	match: matchExpr,
1766
1767	attrHandle: {},
1768
1769	find: {},
1770
1771	relative: {
1772		">": { dir: "parentNode", first: true },
1773		" ": { dir: "parentNode" },
1774		"+": { dir: "previousSibling", first: true },
1775		"~": { dir: "previousSibling" }
1776	},
1777
1778	preFilter: {
1779		"ATTR": function( match ) {
1780			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1781
1782			// Move the given value to match[3] whether quoted or unquoted
1783			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1784				match[ 5 ] || "" ).replace( runescape, funescape );
1785
1786			if ( match[ 2 ] === "~=" ) {
1787				match[ 3 ] = " " + match[ 3 ] + " ";
1788			}
1789
1790			return match.slice( 0, 4 );
1791		},
1792
1793		"CHILD": function( match ) {
1794
1795			/* matches from matchExpr["CHILD"]
1796				1 type (only|nth|...)
1797				2 what (child|of-type)
1798				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1799				4 xn-component of xn+y argument ([+-]?\d*n|)
1800				5 sign of xn-component
1801				6 x of xn-component
1802				7 sign of y-component
1803				8 y of y-component
1804			*/
1805			match[ 1 ] = match[ 1 ].toLowerCase();
1806
1807			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1808
1809				// nth-* requires argument
1810				if ( !match[ 3 ] ) {
1811					Sizzle.error( match[ 0 ] );
1812				}
1813
1814				// numeric x and y parameters for Expr.filter.CHILD
1815				// remember that false/true cast respectively to 0/1
1816				match[ 4 ] = +( match[ 4 ] ?
1817					match[ 5 ] + ( match[ 6 ] || 1 ) :
1818					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1819				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1820
1821				// other types prohibit arguments
1822			} else if ( match[ 3 ] ) {
1823				Sizzle.error( match[ 0 ] );
1824			}
1825
1826			return match;
1827		},
1828
1829		"PSEUDO": function( match ) {
1830			var excess,
1831				unquoted = !match[ 6 ] && match[ 2 ];
1832
1833			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
1834				return null;
1835			}
1836
1837			// Accept quoted arguments as-is
1838			if ( match[ 3 ] ) {
1839				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1840
1841			// Strip excess characters from unquoted arguments
1842			} else if ( unquoted && rpseudo.test( unquoted ) &&
1843
1844				// Get excess from tokenize (recursively)
1845				( excess = tokenize( unquoted, true ) ) &&
1846
1847				// advance to the next closing parenthesis
1848				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1849
1850				// excess is a negative index
1851				match[ 0 ] = match[ 0 ].slice( 0, excess );
1852				match[ 2 ] = unquoted.slice( 0, excess );
1853			}
1854
1855			// Return only captures needed by the pseudo filter method (type and argument)
1856			return match.slice( 0, 3 );
1857		}
1858	},
1859
1860	filter: {
1861
1862		"TAG": function( nodeNameSelector ) {
1863			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1864			return nodeNameSelector === "*" ?
1865				function() {
1866					return true;
1867				} :
1868				function( elem ) {
1869					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1870				};
1871		},
1872
1873		"CLASS": function( className ) {
1874			var pattern = classCache[ className + " " ];
1875
1876			return pattern ||
1877				( pattern = new RegExp( "(^|" + whitespace +
1878					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1879						className, function( elem ) {
1880							return pattern.test(
1881								typeof elem.className === "string" && elem.className ||
1882								typeof elem.getAttribute !== "undefined" &&
1883									elem.getAttribute( "class" ) ||
1884								""
1885							);
1886				} );
1887		},
1888
1889		"ATTR": function( name, operator, check ) {
1890			return function( elem ) {
1891				var result = Sizzle.attr( elem, name );
1892
1893				if ( result == null ) {
1894					return operator === "!=";
1895				}
1896				if ( !operator ) {
1897					return true;
1898				}
1899
1900				result += "";
1901
1902				/* eslint-disable max-len */
1903
1904				return operator === "=" ? result === check :
1905					operator === "!=" ? result !== check :
1906					operator === "^=" ? check && result.indexOf( check ) === 0 :
1907					operator === "*=" ? check && result.indexOf( check ) > -1 :
1908					operator === "$=" ? check && result.slice( -check.length ) === check :
1909					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1910					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1911					false;
1912				/* eslint-enable max-len */
1913
1914			};
1915		},
1916
1917		"CHILD": function( type, what, _argument, first, last ) {
1918			var simple = type.slice( 0, 3 ) !== "nth",
1919				forward = type.slice( -4 ) !== "last",
1920				ofType = what === "of-type";
1921
1922			return first === 1 && last === 0 ?
1923
1924				// Shortcut for :nth-*(n)
1925				function( elem ) {
1926					return !!elem.parentNode;
1927				} :
1928
1929				function( elem, _context, xml ) {
1930					var cache, uniqueCache, outerCache, node, nodeIndex, start,
1931						dir = simple !== forward ? "nextSibling" : "previousSibling",
1932						parent = elem.parentNode,
1933						name = ofType && elem.nodeName.toLowerCase(),
1934						useCache = !xml && !ofType,
1935						diff = false;
1936
1937					if ( parent ) {
1938
1939						// :(first|last|only)-(child|of-type)
1940						if ( simple ) {
1941							while ( dir ) {
1942								node = elem;
1943								while ( ( node = node[ dir ] ) ) {
1944									if ( ofType ?
1945										node.nodeName.toLowerCase() === name :
1946										node.nodeType === 1 ) {
1947
1948										return false;
1949									}
1950								}
1951
1952								// Reverse direction for :only-* (if we haven't yet done so)
1953								start = dir = type === "only" && !start && "nextSibling";
1954							}
1955							return true;
1956						}
1957
1958						start = [ forward ? parent.firstChild : parent.lastChild ];
1959
1960						// non-xml :nth-child(...) stores cache data on `parent`
1961						if ( forward && useCache ) {
1962
1963							// Seek `elem` from a previously-cached index
1964
1965							// ...in a gzip-friendly way
1966							node = parent;
1967							outerCache = node[ expando ] || ( node[ expando ] = {} );
1968
1969							// Support: IE <9 only
1970							// Defend against cloned attroperties (jQuery gh-1709)
1971							uniqueCache = outerCache[ node.uniqueID ] ||
1972								( outerCache[ node.uniqueID ] = {} );
1973
1974							cache = uniqueCache[ type ] || [];
1975							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1976							diff = nodeIndex && cache[ 2 ];
1977							node = nodeIndex && parent.childNodes[ nodeIndex ];
1978
1979							while ( ( node = ++nodeIndex && node && node[ dir ] ||
1980
1981								// Fallback to seeking `elem` from the start
1982								( diff = nodeIndex = 0 ) || start.pop() ) ) {
1983
1984								// When found, cache indexes on `parent` and break
1985								if ( node.nodeType === 1 && ++diff && node === elem ) {
1986									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1987									break;
1988								}
1989							}
1990
1991						} else {
1992
1993							// Use previously-cached element index if available
1994							if ( useCache ) {
1995
1996								// ...in a gzip-friendly way
1997								node = elem;
1998								outerCache = node[ expando ] || ( node[ expando ] = {} );
1999
2000								// Support: IE <9 only
2001								// Defend against cloned attroperties (jQuery gh-1709)
2002								uniqueCache = outerCache[ node.uniqueID ] ||
2003									( outerCache[ node.uniqueID ] = {} );
2004
2005								cache = uniqueCache[ type ] || [];
2006								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2007								diff = nodeIndex;
2008							}
2009
2010							// xml :nth-child(...)
2011							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
2012							if ( diff === false ) {
2013
2014								// Use the same loop as above to seek `elem` from the start
2015								while ( ( node = ++nodeIndex && node && node[ dir ] ||
2016									( diff = nodeIndex = 0 ) || start.pop() ) ) {
2017
2018									if ( ( ofType ?
2019										node.nodeName.toLowerCase() === name :
2020										node.nodeType === 1 ) &&
2021										++diff ) {
2022
2023										// Cache the index of each encountered element
2024										if ( useCache ) {
2025											outerCache = node[ expando ] ||
2026												( node[ expando ] = {} );
2027
2028											// Support: IE <9 only
2029											// Defend against cloned attroperties (jQuery gh-1709)
2030											uniqueCache = outerCache[ node.uniqueID ] ||
2031												( outerCache[ node.uniqueID ] = {} );
2032
2033											uniqueCache[ type ] = [ dirruns, diff ];
2034										}
2035
2036										if ( node === elem ) {
2037											break;
2038										}
2039									}
2040								}
2041							}
2042						}
2043
2044						// Incorporate the offset, then check against cycle size
2045						diff -= last;
2046						return diff === first || ( diff % first === 0 && diff / first >= 0 );
2047					}
2048				};
2049		},
2050
2051		"PSEUDO": function( pseudo, argument ) {
2052
2053			// pseudo-class names are case-insensitive
2054			// http://www.w3.org/TR/selectors/#pseudo-classes
2055			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2056			// Remember that setFilters inherits from pseudos
2057			var args,
2058				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2059					Sizzle.error( "unsupported pseudo: " + pseudo );
2060
2061			// The user may use createPseudo to indicate that
2062			// arguments are needed to create the filter function
2063			// just as Sizzle does
2064			if ( fn[ expando ] ) {
2065				return fn( argument );
2066			}
2067
2068			// But maintain support for old signatures
2069			if ( fn.length > 1 ) {
2070				args = [ pseudo, pseudo, "", argument ];
2071				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2072					markFunction( function( seed, matches ) {
2073						var idx,
2074							matched = fn( seed, argument ),
2075							i = matched.length;
2076						while ( i-- ) {
2077							idx = indexOf( seed, matched[ i ] );
2078							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
2079						}
2080					} ) :
2081					function( elem ) {
2082						return fn( elem, 0, args );
2083					};
2084			}
2085
2086			return fn;
2087		}
2088	},
2089
2090	pseudos: {
2091
2092		// Potentially complex pseudos
2093		"not": markFunction( function( selector ) {
2094
2095			// Trim the selector passed to compile
2096			// to avoid treating leading and trailing
2097			// spaces as combinators
2098			var input = [],
2099				results = [],
2100				matcher = compile( selector.replace( rtrim, "$1" ) );
2101
2102			return matcher[ expando ] ?
2103				markFunction( function( seed, matches, _context, xml ) {
2104					var elem,
2105						unmatched = matcher( seed, null, xml, [] ),
2106						i = seed.length;
2107
2108					// Match elements unmatched by `matcher`
2109					while ( i-- ) {
2110						if ( ( elem = unmatched[ i ] ) ) {
2111							seed[ i ] = !( matches[ i ] = elem );
2112						}
2113					}
2114				} ) :
2115				function( elem, _context, xml ) {
2116					input[ 0 ] = elem;
2117					matcher( input, null, xml, results );
2118
2119					// Don't keep the element (issue #299)
2120					input[ 0 ] = null;
2121					return !results.pop();
2122				};
2123		} ),
2124
2125		"has": markFunction( function( selector ) {
2126			return function( elem ) {
2127				return Sizzle( selector, elem ).length > 0;
2128			};
2129		} ),
2130
2131		"contains": markFunction( function( text ) {
2132			text = text.replace( runescape, funescape );
2133			return function( elem ) {
2134				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
2135			};
2136		} ),
2137
2138		// "Whether an element is represented by a :lang() selector
2139		// is based solely on the element's language value
2140		// being equal to the identifier C,
2141		// or beginning with the identifier C immediately followed by "-".
2142		// The matching of C against the element's language value is performed case-insensitively.
2143		// The identifier C does not have to be a valid language name."
2144		// http://www.w3.org/TR/selectors/#lang-pseudo
2145		"lang": markFunction( function( lang ) {
2146
2147			// lang value must be a valid identifier
2148			if ( !ridentifier.test( lang || "" ) ) {
2149				Sizzle.error( "unsupported lang: " + lang );
2150			}
2151			lang = lang.replace( runescape, funescape ).toLowerCase();
2152			return function( elem ) {
2153				var elemLang;
2154				do {
2155					if ( ( elemLang = documentIsHTML ?
2156						elem.lang :
2157						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2158
2159						elemLang = elemLang.toLowerCase();
2160						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2161					}
2162				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2163				return false;
2164			};
2165		} ),
2166
2167		// Miscellaneous
2168		"target": function( elem ) {
2169			var hash = window.location && window.location.hash;
2170			return hash && hash.slice( 1 ) === elem.id;
2171		},
2172
2173		"root": function( elem ) {
2174			return elem === docElem;
2175		},
2176
2177		"focus": function( elem ) {
2178			return elem === document.activeElement &&
2179				( !document.hasFocus || document.hasFocus() ) &&
2180				!!( elem.type || elem.href || ~elem.tabIndex );
2181		},
2182
2183		// Boolean properties
2184		"enabled": createDisabledPseudo( false ),
2185		"disabled": createDisabledPseudo( true ),
2186
2187		"checked": function( elem ) {
2188
2189			// In CSS3, :checked should return both checked and selected elements
2190			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2191			var nodeName = elem.nodeName.toLowerCase();
2192			return ( nodeName === "input" && !!elem.checked ) ||
2193				( nodeName === "option" && !!elem.selected );
2194		},
2195
2196		"selected": function( elem ) {
2197
2198			// Accessing this property makes selected-by-default
2199			// options in Safari work properly
2200			if ( elem.parentNode ) {
2201				// eslint-disable-next-line no-unused-expressions
2202				elem.parentNode.selectedIndex;
2203			}
2204
2205			return elem.selected === true;
2206		},
2207
2208		// Contents
2209		"empty": function( elem ) {
2210
2211			// http://www.w3.org/TR/selectors/#empty-pseudo
2212			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2213			//   but not by others (comment: 8; processing instruction: 7; etc.)
2214			// nodeType < 6 works because attributes (2) do not appear as children
2215			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2216				if ( elem.nodeType < 6 ) {
2217					return false;
2218				}
2219			}
2220			return true;
2221		},
2222
2223		"parent": function( elem ) {
2224			return !Expr.pseudos[ "empty" ]( elem );
2225		},
2226
2227		// Element/input types
2228		"header": function( elem ) {
2229			return rheader.test( elem.nodeName );
2230		},
2231
2232		"input": function( elem ) {
2233			return rinputs.test( elem.nodeName );
2234		},
2235
2236		"button": function( elem ) {
2237			var name = elem.nodeName.toLowerCase();
2238			return name === "input" && elem.type === "button" || name === "button";
2239		},
2240
2241		"text": function( elem ) {
2242			var attr;
2243			return elem.nodeName.toLowerCase() === "input" &&
2244				elem.type === "text" &&
2245
vendor: 21,282 bytes, lines 2246-3034
2246				// Support: IE<8
2247				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2248				( ( attr = elem.getAttribute( "type" ) ) == null ||
2249					attr.toLowerCase() === "text" );
2250		},
2251
2252		// Position-in-collection
2253		"first": createPositionalPseudo( function() {
2254			return [ 0 ];
2255		} ),
2256
2257		"last": createPositionalPseudo( function( _matchIndexes, length ) {
2258			return [ length - 1 ];
2259		} ),
2260
2261		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2262			return [ argument < 0 ? argument + length : argument ];
2263		} ),
2264
2265		"even": createPositionalPseudo( function( matchIndexes, length ) {
2266			var i = 0;
2267			for ( ; i < length; i += 2 ) {
2268				matchIndexes.push( i );
2269			}
2270			return matchIndexes;
2271		} ),
2272
2273		"odd": createPositionalPseudo( function( matchIndexes, length ) {
2274			var i = 1;
2275			for ( ; i < length; i += 2 ) {
2276				matchIndexes.push( i );
2277			}
2278			return matchIndexes;
2279		} ),
2280
2281		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2282			var i = argument < 0 ?
2283				argument + length :
2284				argument > length ?
2285					length :
2286					argument;
2287			for ( ; --i >= 0; ) {
2288				matchIndexes.push( i );
2289			}
2290			return matchIndexes;
2291		} ),
2292
2293		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2294			var i = argument < 0 ? argument + length : argument;
2295			for ( ; ++i < length; ) {
2296				matchIndexes.push( i );
2297			}
2298			return matchIndexes;
2299		} )
2300	}
2301};
2302
2303Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
2304
2305// Add button/input type pseudos
2306for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2307	Expr.pseudos[ i ] = createInputPseudo( i );
2308}
2309for ( i in { submit: true, reset: true } ) {
2310	Expr.pseudos[ i ] = createButtonPseudo( i );
2311}
2312
2313// Easy API for creating new setFilters
2314function setFilters() {}
2315setFilters.prototype = Expr.filters = Expr.pseudos;
2316Expr.setFilters = new setFilters();
2317
2318tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2319	var matched, match, tokens, type,
2320		soFar, groups, preFilters,
2321		cached = tokenCache[ selector + " " ];
2322
2323	if ( cached ) {
2324		return parseOnly ? 0 : cached.slice( 0 );
2325	}
2326
2327	soFar = selector;
2328	groups = [];
2329	preFilters = Expr.preFilter;
2330
2331	while ( soFar ) {
2332
2333		// Comma and first run
2334		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2335			if ( match ) {
2336
2337				// Don't consume trailing commas as valid
2338				soFar = soFar.slice( match[ 0 ].length ) || soFar;
2339			}
2340			groups.push( ( tokens = [] ) );
2341		}
2342
2343		matched = false;
2344
2345		// Combinators
2346		if ( ( match = rcombinators.exec( soFar ) ) ) {
2347			matched = match.shift();
2348			tokens.push( {
2349				value: matched,
2350
2351				// Cast descendant combinators to space
2352				type: match[ 0 ].replace( rtrim, " " )
2353			} );
2354			soFar = soFar.slice( matched.length );
2355		}
2356
2357		// Filters
2358		for ( type in Expr.filter ) {
2359			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2360				( match = preFilters[ type ]( match ) ) ) ) {
2361				matched = match.shift();
2362				tokens.push( {
2363					value: matched,
2364					type: type,
2365					matches: match
2366				} );
2367				soFar = soFar.slice( matched.length );
2368			}
2369		}
2370
2371		if ( !matched ) {
2372			break;
2373		}
2374	}
2375
2376	// Return the length of the invalid excess
2377	// if we're just parsing
2378	// Otherwise, throw an error or return tokens
2379	return parseOnly ?
2380		soFar.length :
2381		soFar ?
2382			Sizzle.error( selector ) :
2383
2384			// Cache the tokens
2385			tokenCache( selector, groups ).slice( 0 );
2386};
2387
2388function toSelector( tokens ) {
2389	var i = 0,
2390		len = tokens.length,
2391		selector = "";
2392	for ( ; i < len; i++ ) {
2393		selector += tokens[ i ].value;
2394	}
2395	return selector;
2396}
2397
2398function addCombinator( matcher, combinator, base ) {
2399	var dir = combinator.dir,
2400		skip = combinator.next,
2401		key = skip || dir,
2402		checkNonElements = base && key === "parentNode",
2403		doneName = done++;
2404
2405	return combinator.first ?
2406
2407		// Check against closest ancestor/preceding element
2408		function( elem, context, xml ) {
2409			while ( ( elem = elem[ dir ] ) ) {
2410				if ( elem.nodeType === 1 || checkNonElements ) {
2411					return matcher( elem, context, xml );
2412				}
2413			}
2414			return false;
2415		} :
2416
2417		// Check against all ancestor/preceding elements
2418		function( elem, context, xml ) {
2419			var oldCache, uniqueCache, outerCache,
2420				newCache = [ dirruns, doneName ];
2421
2422			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2423			if ( xml ) {
2424				while ( ( elem = elem[ dir ] ) ) {
2425					if ( elem.nodeType === 1 || checkNonElements ) {
2426						if ( matcher( elem, context, xml ) ) {
2427							return true;
2428						}
2429					}
2430				}
2431			} else {
2432				while ( ( elem = elem[ dir ] ) ) {
2433					if ( elem.nodeType === 1 || checkNonElements ) {
2434						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2435
2436						// Support: IE <9 only
2437						// Defend against cloned attroperties (jQuery gh-1709)
2438						uniqueCache = outerCache[ elem.uniqueID ] ||
2439							( outerCache[ elem.uniqueID ] = {} );
2440
2441						if ( skip && skip === elem.nodeName.toLowerCase() ) {
2442							elem = elem[ dir ] || elem;
2443						} else if ( ( oldCache = uniqueCache[ key ] ) &&
2444							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2445
2446							// Assign to newCache so results back-propagate to previous elements
2447							return ( newCache[ 2 ] = oldCache[ 2 ] );
2448						} else {
2449
2450							// Reuse newcache so results back-propagate to previous elements
2451							uniqueCache[ key ] = newCache;
2452
2453							// A match means we're done; a fail means we have to keep checking
2454							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2455								return true;
2456							}
2457						}
2458					}
2459				}
2460			}
2461			return false;
2462		};
2463}
2464
2465function elementMatcher( matchers ) {
2466	return matchers.length > 1 ?
2467		function( elem, context, xml ) {
2468			var i = matchers.length;
2469			while ( i-- ) {
2470				if ( !matchers[ i ]( elem, context, xml ) ) {
2471					return false;
2472				}
2473			}
2474			return true;
2475		} :
2476		matchers[ 0 ];
2477}
2478
2479function multipleContexts( selector, contexts, results ) {
2480	var i = 0,
2481		len = contexts.length;
2482	for ( ; i < len; i++ ) {
2483		Sizzle( selector, contexts[ i ], results );
2484	}
2485	return results;
2486}
2487
2488function condense( unmatched, map, filter, context, xml ) {
2489	var elem,
2490		newUnmatched = [],
2491		i = 0,
2492		len = unmatched.length,
2493		mapped = map != null;
2494
2495	for ( ; i < len; i++ ) {
2496		if ( ( elem = unmatched[ i ] ) ) {
2497			if ( !filter || filter( elem, context, xml ) ) {
2498				newUnmatched.push( elem );
2499				if ( mapped ) {
2500					map.push( i );
2501				}
2502			}
2503		}
2504	}
2505
2506	return newUnmatched;
2507}
2508
2509function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2510	if ( postFilter && !postFilter[ expando ] ) {
2511		postFilter = setMatcher( postFilter );
2512	}
2513	if ( postFinder && !postFinder[ expando ] ) {
2514		postFinder = setMatcher( postFinder, postSelector );
2515	}
2516	return markFunction( function( seed, results, context, xml ) {
2517		var temp, i, elem,
2518			preMap = [],
2519			postMap = [],
2520			preexisting = results.length,
2521
2522			// Get initial elements from seed or context
2523			elems = seed || multipleContexts(
2524				selector || "*",
2525				context.nodeType ? [ context ] : context,
2526				[]
2527			),
2528
2529			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2530			matcherIn = preFilter && ( seed || !selector ) ?
2531				condense( elems, preMap, preFilter, context, xml ) :
2532				elems,
2533
2534			matcherOut = matcher ?
2535
2536				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2537				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2538
2539					// ...intermediate processing is necessary
2540					[] :
2541
2542					// ...otherwise use results directly
2543					results :
2544				matcherIn;
2545
2546		// Find primary matches
2547		if ( matcher ) {
2548			matcher( matcherIn, matcherOut, context, xml );
2549		}
2550
2551		// Apply postFilter
2552		if ( postFilter ) {
2553			temp = condense( matcherOut, postMap );
2554			postFilter( temp, [], context, xml );
2555
2556			// Un-match failing elements by moving them back to matcherIn
2557			i = temp.length;
2558			while ( i-- ) {
2559				if ( ( elem = temp[ i ] ) ) {
2560					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2561				}
2562			}
2563		}
2564
2565		if ( seed ) {
2566			if ( postFinder || preFilter ) {
2567				if ( postFinder ) {
2568
2569					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2570					temp = [];
2571					i = matcherOut.length;
2572					while ( i-- ) {
2573						if ( ( elem = matcherOut[ i ] ) ) {
2574
2575							// Restore matcherIn since elem is not yet a final match
2576							temp.push( ( matcherIn[ i ] = elem ) );
2577						}
2578					}
2579					postFinder( null, ( matcherOut = [] ), temp, xml );
2580				}
2581
2582				// Move matched elements from seed to results to keep them synchronized
2583				i = matcherOut.length;
2584				while ( i-- ) {
2585					if ( ( elem = matcherOut[ i ] ) &&
2586						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
2587
2588						seed[ temp ] = !( results[ temp ] = elem );
2589					}
2590				}
2591			}
2592
2593		// Add elements to results, through postFinder if defined
2594		} else {
2595			matcherOut = condense(
2596				matcherOut === results ?
2597					matcherOut.splice( preexisting, matcherOut.length ) :
2598					matcherOut
2599			);
2600			if ( postFinder ) {
2601				postFinder( null, results, matcherOut, xml );
2602			} else {
2603				push.apply( results, matcherOut );
2604			}
2605		}
2606	} );
2607}
2608
2609function matcherFromTokens( tokens ) {
2610	var checkContext, matcher, j,
2611		len = tokens.length,
2612		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2613		implicitRelative = leadingRelative || Expr.relative[ " " ],
2614		i = leadingRelative ? 1 : 0,
2615
2616		// The foundational matcher ensures that elements are reachable from top-level context(s)
2617		matchContext = addCombinator( function( elem ) {
2618			return elem === checkContext;
2619		}, implicitRelative, true ),
2620		matchAnyContext = addCombinator( function( elem ) {
2621			return indexOf( checkContext, elem ) > -1;
2622		}, implicitRelative, true ),
2623		matchers = [ function( elem, context, xml ) {
2624			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2625				( checkContext = context ).nodeType ?
2626					matchContext( elem, context, xml ) :
2627					matchAnyContext( elem, context, xml ) );
2628
2629			// Avoid hanging onto element (issue #299)
2630			checkContext = null;
2631			return ret;
2632		} ];
2633
2634	for ( ; i < len; i++ ) {
2635		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2636			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2637		} else {
2638			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2639
2640			// Return special upon seeing a positional matcher
2641			if ( matcher[ expando ] ) {
2642
2643				// Find the next relative operator (if any) for proper handling
2644				j = ++i;
2645				for ( ; j < len; j++ ) {
2646					if ( Expr.relative[ tokens[ j ].type ] ) {
2647						break;
2648					}
2649				}
2650				return setMatcher(
2651					i > 1 && elementMatcher( matchers ),
2652					i > 1 && toSelector(
2653
2654					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2655					tokens
2656						.slice( 0, i - 1 )
2657						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2658					).replace( rtrim, "$1" ),
2659					matcher,
2660					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2661					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2662					j < len && toSelector( tokens )
2663				);
2664			}
2665			matchers.push( matcher );
2666		}
2667	}
2668
2669	return elementMatcher( matchers );
2670}
2671
2672function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2673	var bySet = setMatchers.length > 0,
2674		byElement = elementMatchers.length > 0,
2675		superMatcher = function( seed, context, xml, results, outermost ) {
2676			var elem, j, matcher,
2677				matchedCount = 0,
2678				i = "0",
2679				unmatched = seed && [],
2680				setMatched = [],
2681				contextBackup = outermostContext,
2682
2683				// We must always have either seed elements or outermost context
2684				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2685
2686				// Use integer dirruns iff this is the outermost matcher
2687				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2688				len = elems.length;
2689
2690			if ( outermost ) {
2691
2692				// Support: IE 11+, Edge 17 - 18+
2693				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2694				// two documents; shallow comparisons work.
2695				// eslint-disable-next-line eqeqeq
2696				outermostContext = context == document || context || outermost;
2697			}
2698
2699			// Add elements passing elementMatchers directly to results
2700			// Support: IE<9, Safari
2701			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2702			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2703				if ( byElement && elem ) {
2704					j = 0;
2705
2706					// Support: IE 11+, Edge 17 - 18+
2707					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2708					// two documents; shallow comparisons work.
2709					// eslint-disable-next-line eqeqeq
2710					if ( !context && elem.ownerDocument != document ) {
2711						setDocument( elem );
2712						xml = !documentIsHTML;
2713					}
2714					while ( ( matcher = elementMatchers[ j++ ] ) ) {
2715						if ( matcher( elem, context || document, xml ) ) {
2716							results.push( elem );
2717							break;
2718						}
2719					}
2720					if ( outermost ) {
2721						dirruns = dirrunsUnique;
2722					}
2723				}
2724
2725				// Track unmatched elements for set filters
2726				if ( bySet ) {
2727
2728					// They will have gone through all possible matchers
2729					if ( ( elem = !matcher && elem ) ) {
2730						matchedCount--;
2731					}
2732
2733					// Lengthen the array for every element, matched or not
2734					if ( seed ) {
2735						unmatched.push( elem );
2736					}
2737				}
2738			}
2739
2740			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2741			// makes the latter nonnegative.
2742			matchedCount += i;
2743
2744			// Apply set filters to unmatched elements
2745			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2746			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2747			// no element matchers and no seed.
2748			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2749			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2750			// numerically zero.
2751			if ( bySet && i !== matchedCount ) {
2752				j = 0;
2753				while ( ( matcher = setMatchers[ j++ ] ) ) {
2754					matcher( unmatched, setMatched, context, xml );
2755				}
2756
2757				if ( seed ) {
2758
2759					// Reintegrate element matches to eliminate the need for sorting
2760					if ( matchedCount > 0 ) {
2761						while ( i-- ) {
2762							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2763								setMatched[ i ] = pop.call( results );
2764							}
2765						}
2766					}
2767
2768					// Discard index placeholder values to get only actual matches
2769					setMatched = condense( setMatched );
2770				}
2771
2772				// Add matches to results
2773				push.apply( results, setMatched );
2774
2775				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2776				if ( outermost && !seed && setMatched.length > 0 &&
2777					( matchedCount + setMatchers.length ) > 1 ) {
2778
2779					Sizzle.uniqueSort( results );
2780				}
2781			}
2782
2783			// Override manipulation of globals by nested matchers
2784			if ( outermost ) {
2785				dirruns = dirrunsUnique;
2786				outermostContext = contextBackup;
2787			}
2788
2789			return unmatched;
2790		};
2791
2792	return bySet ?
2793		markFunction( superMatcher ) :
2794		superMatcher;
2795}
2796
2797compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2798	var i,
2799		setMatchers = [],
2800		elementMatchers = [],
2801		cached = compilerCache[ selector + " " ];
2802
2803	if ( !cached ) {
2804
2805		// Generate a function of recursive functions that can be used to check each element
2806		if ( !match ) {
2807			match = tokenize( selector );
2808		}
2809		i = match.length;
2810		while ( i-- ) {
2811			cached = matcherFromTokens( match[ i ] );
2812			if ( cached[ expando ] ) {
2813				setMatchers.push( cached );
2814			} else {
2815				elementMatchers.push( cached );
2816			}
2817		}
2818
2819		// Cache the compiled function
2820		cached = compilerCache(
2821			selector,
2822			matcherFromGroupMatchers( elementMatchers, setMatchers )
2823		);
2824
2825		// Save selector and tokenization
2826		cached.selector = selector;
2827	}
2828	return cached;
2829};
2830
2831/**
2832 * A low-level selection function that works with Sizzle's compiled
2833 *  selector functions
2834 * @param {String|Function} selector A selector or a pre-compiled
2835 *  selector function built with Sizzle.compile
2836 * @param {Element} context
2837 * @param {Array} [results]
2838 * @param {Array} [seed] A set of elements to match against
2839 */
2840select = Sizzle.select = function( selector, context, results, seed ) {
2841	var i, tokens, token, type, find,
2842		compiled = typeof selector === "function" && selector,
2843		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2844
2845	results = results || [];
2846
2847	// Try to minimize operations if there is only one selector in the list and no seed
2848	// (the latter of which guarantees us context)
2849	if ( match.length === 1 ) {
2850
2851		// Reduce context if the leading compound selector is an ID
2852		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2853		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2854			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2855
2856			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2857				.replace( runescape, funescape ), context ) || [] )[ 0 ];
2858			if ( !context ) {
2859				return results;
2860
2861			// Precompiled matchers will still verify ancestry, so step up a level
2862			} else if ( compiled ) {
2863				context = context.parentNode;
2864			}
2865
2866			selector = selector.slice( tokens.shift().value.length );
2867		}
2868
2869		// Fetch a seed set for right-to-left matching
2870		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
2871		while ( i-- ) {
2872			token = tokens[ i ];
2873
2874			// Abort if we hit a combinator
2875			if ( Expr.relative[ ( type = token.type ) ] ) {
2876				break;
2877			}
2878			if ( ( find = Expr.find[ type ] ) ) {
2879
2880				// Search, expanding context for leading sibling combinators
2881				if ( ( seed = find(
2882					token.matches[ 0 ].replace( runescape, funescape ),
2883					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2884						context
2885				) ) ) {
2886
2887					// If seed is empty or no tokens remain, we can return early
2888					tokens.splice( i, 1 );
2889					selector = seed.length && toSelector( tokens );
2890					if ( !selector ) {
2891						push.apply( results, seed );
2892						return results;
2893					}
2894
2895					break;
2896				}
2897			}
2898		}
2899	}
2900
2901	// Compile and execute a filtering function if one is not provided
2902	// Provide `match` to avoid retokenization if we modified the selector above
2903	( compiled || compile( selector, match ) )(
2904		seed,
2905		context,
2906		!documentIsHTML,
2907		results,
2908		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2909	);
2910	return results;
2911};
2912
2913// One-time assignments
2914
2915// Sort stability
2916support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2917
2918// Support: Chrome 14-35+
2919// Always assume duplicates if they aren't passed to the comparison function
2920support.detectDuplicates = !!hasDuplicate;
2921
2922// Initialize against the default document
2923setDocument();
2924
2925// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2926// Detached nodes confoundingly follow *each other*
2927support.sortDetached = assert( function( el ) {
2928
2929	// Should return 1, but returns 4 (following)
2930	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2931} );
2932
2933// Support: IE<8
2934// Prevent attribute/property "interpolation"
2935// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2936if ( !assert( function( el ) {
2937	el.innerHTML = "<a href='#'></a>";
2938	return el.firstChild.getAttribute( "href" ) === "#";
2939} ) ) {
2940	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2941		if ( !isXML ) {
2942			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2943		}
2944	} );
2945}
2946
2947// Support: IE<9
2948// Use defaultValue in place of getAttribute("value")
2949if ( !support.attributes || !assert( function( el ) {
2950	el.innerHTML = "<input/>";
2951	el.firstChild.setAttribute( "value", "" );
2952	return el.firstChild.getAttribute( "value" ) === "";
2953} ) ) {
2954	addHandle( "value", function( elem, _name, isXML ) {
2955		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2956			return elem.defaultValue;
2957		}
2958	} );
2959}
2960
2961// Support: IE<9
2962// Use getAttributeNode to fetch booleans when getAttribute lies
2963if ( !assert( function( el ) {
2964	return el.getAttribute( "disabled" ) == null;
2965} ) ) {
2966	addHandle( booleans, function( elem, name, isXML ) {
2967		var val;
2968		if ( !isXML ) {
2969			return elem[ name ] === true ? name.toLowerCase() :
2970				( val = elem.getAttributeNode( name ) ) && val.specified ?
2971					val.value :
2972					null;
2973		}
2974	} );
2975}
2976
2977return Sizzle;
2978
2979} )( window );
2980
2981
2982
2983jQuery.find = Sizzle;
2984jQuery.expr = Sizzle.selectors;
2985
2986// Deprecated
2987jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2988jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2989jQuery.text = Sizzle.getText;
2990jQuery.isXMLDoc = Sizzle.isXML;
2991jQuery.contains = Sizzle.contains;
2992jQuery.escapeSelector = Sizzle.escape;
2993
2994
2995
2996
2997var dir = function( elem, dir, until ) {
2998	var matched = [],
2999		truncate = until !== undefined;
3000
3001	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
3002		if ( elem.nodeType === 1 ) {
3003			if ( truncate && jQuery( elem ).is( until ) ) {
3004				break;
3005			}
3006			matched.push( elem );
3007		}
3008	}
3009	return matched;
3010};
3011
3012
3013var siblings = function( n, elem ) {
3014	var matched = [];
3015
3016	for ( ; n; n = n.nextSibling ) {
3017		if ( n.nodeType === 1 && n !== elem ) {
3018			matched.push( n );
3019		}
3020	}
3021
3022	return matched;
3023};
3024
3025
3026var rneedsContext = jQuery.expr.match.needsContext;
3027
3028
3029
3030function nodeName( elem, name ) {
3031
3032	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3033
3034}
vendor: 7,871 bytes, lines 3034-3348
3034
3035var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3036
3037
3038
3039// Implement the identical functionality for filter and not
3040function winnow( elements, qualifier, not ) {
3041	if ( isFunction( qualifier ) ) {
3042		return jQuery.grep( elements, function( elem, i ) {
3043			return !!qualifier.call( elem, i, elem ) !== not;
3044		} );
3045	}
3046
3047	// Single element
3048	if ( qualifier.nodeType ) {
3049		return jQuery.grep( elements, function( elem ) {
3050			return ( elem === qualifier ) !== not;
3051		} );
3052	}
3053
3054	// Arraylike of elements (jQuery, arguments, Array)
3055	if ( typeof qualifier !== "string" ) {
3056		return jQuery.grep( elements, function( elem ) {
3057			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
3058		} );
3059	}
3060
3061	// Filtered directly for both simple and complex selectors
3062	return jQuery.filter( qualifier, elements, not );
3063}
3064
3065jQuery.filter = function( expr, elems, not ) {
3066	var elem = elems[ 0 ];
3067
3068	if ( not ) {
3069		expr = ":not(" + expr + ")";
3070	}
3071
3072	if ( elems.length === 1 && elem.nodeType === 1 ) {
3073		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
3074	}
3075
3076	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
3077		return elem.nodeType === 1;
3078	} ) );
3079};
3080
3081jQuery.fn.extend( {
3082	find: function( selector ) {
3083		var i, ret,
3084			len = this.length,
3085			self = this;
3086
3087		if ( typeof selector !== "string" ) {
3088			return this.pushStack( jQuery( selector ).filter( function() {
3089				for ( i = 0; i < len; i++ ) {
3090					if ( jQuery.contains( self[ i ], this ) ) {
3091						return true;
3092					}
3093				}
3094			} ) );
3095		}
3096
3097		ret = this.pushStack( [] );
3098
3099		for ( i = 0; i < len; i++ ) {
3100			jQuery.find( selector, self[ i ], ret );
3101		}
3102
3103		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
3104	},
3105	filter: function( selector ) {
3106		return this.pushStack( winnow( this, selector || [], false ) );
3107	},
3108	not: function( selector ) {
3109		return this.pushStack( winnow( this, selector || [], true ) );
3110	},
3111	is: function( selector ) {
3112		return !!winnow(
3113			this,
3114
3115			// If this is a positional/relative selector, check membership in the returned set
3116			// so $("p:first").is("p:last") won't return true for a doc with two "p".
3117			typeof selector === "string" && rneedsContext.test( selector ) ?
3118				jQuery( selector ) :
3119				selector || [],
3120			false
3121		).length;
3122	}
3123} );
3124
3125
3126// Initialize a jQuery object
3127
3128
3129// A central reference to the root jQuery(document)
3130var rootjQuery,
3131
3132	// A simple way to check for HTML strings
3133	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3134	// Strict HTML recognition (#11290: must start with <)
3135	// Shortcut simple #id case for speed
3136	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3137
3138	init = jQuery.fn.init = function( selector, context, root ) {
3139		var match, elem;
3140
3141		// HANDLE: $(""), $(null), $(undefined), $(false)
3142		if ( !selector ) {
3143			return this;
3144		}
3145
3146		// Method init() accepts an alternate rootjQuery
3147		// so migrate can support jQuery.sub (gh-2101)
3148		root = root || rootjQuery;
3149
3150		// Handle HTML strings
3151		if ( typeof selector === "string" ) {
3152			if ( selector[ 0 ] === "<" &&
3153				selector[ selector.length - 1 ] === ">" &&
3154				selector.length >= 3 ) {
3155
3156				// Assume that strings that start and end with <> are HTML and skip the regex check
3157				match = [ null, selector, null ];
3158
3159			} else {
3160				match = rquickExpr.exec( selector );
3161			}
3162
3163			// Match html or make sure no context is specified for #id
3164			if ( match && ( match[ 1 ] || !context ) ) {
3165
3166				// HANDLE: $(html) -> $(array)
3167				if ( match[ 1 ] ) {
3168					context = context instanceof jQuery ? context[ 0 ] : context;
3169
3170					// Option to run scripts is true for back-compat
3171					// Intentionally let the error be thrown if parseHTML is not present
3172					jQuery.merge( this, jQuery.parseHTML(
3173						match[ 1 ],
3174						context && context.nodeType ? context.ownerDocument || context : document,
3175						true
3176					) );
3177
3178					// HANDLE: $(html, props)
3179					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3180						for ( match in context ) {
3181
3182							// Properties of context are called as methods if possible
3183							if ( isFunction( this[ match ] ) ) {
3184								this[ match ]( context[ match ] );
3185
3186							// ...and otherwise set as attributes
3187							} else {
3188								this.attr( match, context[ match ] );
3189							}
3190						}
3191					}
3192
3193					return this;
3194
3195				// HANDLE: $(#id)
3196				} else {
3197					elem = document.getElementById( match[ 2 ] );
3198
3199					if ( elem ) {
3200
3201						// Inject the element directly into the jQuery object
3202						this[ 0 ] = elem;
3203						this.length = 1;
3204					}
3205					return this;
3206				}
3207
3208			// HANDLE: $(expr, $(...))
3209			} else if ( !context || context.jquery ) {
3210				return ( context || root ).find( selector );
3211
3212			// HANDLE: $(expr, context)
3213			// (which is just equivalent to: $(context).find(expr)
3214			} else {
3215				return this.constructor( context ).find( selector );
3216			}
3217
3218		// HANDLE: $(DOMElement)
3219		} else if ( selector.nodeType ) {
3220			this[ 0 ] = selector;
3221			this.length = 1;
3222			return this;
3223
3224		// HANDLE: $(function)
3225		// Shortcut for document ready
3226		} else if ( isFunction( selector ) ) {
3227			return root.ready !== undefined ?
3228				root.ready( selector ) :
3229
3230				// Execute immediately if ready is not present
3231				selector( jQuery );
3232		}
3233
3234		return jQuery.makeArray( selector, this );
3235	};
3236
3237// Give the init function the jQuery prototype for later instantiation
3238init.prototype = jQuery.fn;
3239
3240// Initialize central reference
3241rootjQuery = jQuery( document );
3242
3243
3244var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3245
3246	// Methods guaranteed to produce a unique set when starting from a unique set
3247	guaranteedUnique = {
3248		children: true,
3249		contents: true,
3250		next: true,
3251		prev: true
3252	};
3253
3254jQuery.fn.extend( {
3255	has: function( target ) {
3256		var targets = jQuery( target, this ),
3257			l = targets.length;
3258
3259		return this.filter( function() {
3260			var i = 0;
3261			for ( ; i < l; i++ ) {
3262				if ( jQuery.contains( this, targets[ i ] ) ) {
3263					return true;
3264				}
3265			}
3266		} );
3267	},
3268
3269	closest: function( selectors, context ) {
3270		var cur,
3271			i = 0,
3272			l = this.length,
3273			matched = [],
3274			targets = typeof selectors !== "string" && jQuery( selectors );
3275
3276		// Positional selectors never match, since there's no _selection_ context
3277		if ( !rneedsContext.test( selectors ) ) {
3278			for ( ; i < l; i++ ) {
3279				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3280
3281					// Always skip document fragments
3282					if ( cur.nodeType < 11 && ( targets ?
3283						targets.index( cur ) > -1 :
3284
3285						// Don't pass non-elements to Sizzle
3286						cur.nodeType === 1 &&
3287							jQuery.find.matchesSelector( cur, selectors ) ) ) {
3288
3289						matched.push( cur );
3290						break;
3291					}
3292				}
3293			}
3294		}
3295
3296		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3297	},
3298
3299	// Determine the position of an element within the set
3300	index: function( elem ) {
3301
3302		// No argument, return index in parent
3303		if ( !elem ) {
3304			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3305		}
3306
3307		// Index in selector
3308		if ( typeof elem === "string" ) {
3309			return indexOf.call( jQuery( elem ), this[ 0 ] );
3310		}
3311
3312		// Locate the position of the desired element
3313		return indexOf.call( this,
3314
3315			// If it receives a jQuery object, the first element is used
3316			elem.jquery ? elem[ 0 ] : elem
3317		);
3318	},
3319
3320	add: function( selector, context ) {
3321		return this.pushStack(
3322			jQuery.uniqueSort(
3323				jQuery.merge( this.get(), jQuery( selector, context ) )
3324			)
3325		);
3326	},
3327
3328	addBack: function( selector ) {
3329		return this.add( selector == null ?
3330			this.prevObject : this.prevObject.filter( selector )
3331		);
3332	}
3333} );
3334
3335function sibling( cur, dir ) {
3336	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3337	return cur;
3338}
3339
3340jQuery.each( {
3341	parent: function( elem ) {
3342		var parent = elem.parentNode;
3343		return parent && parent.nodeType !== 11 ? parent : null;
3344	},
3345	parents: function( elem ) {
3346		return dir( elem, "parentNode" );
3347	},
3348	parentsUntil: function( elem, 
vendor: 13,141 bytes, lines 3348-3840
3348_i, until ) {
3349		return dir( elem, "parentNode", until );
3350	},
3351	next: function( elem ) {
3352		return sibling( elem, "nextSibling" );
3353	},
3354	prev: function( elem ) {
3355		return sibling( elem, "previousSibling" );
3356	},
3357	nextAll: function( elem ) {
3358		return dir( elem, "nextSibling" );
3359	},
3360	prevAll: function( elem ) {
3361		return dir( elem, "previousSibling" );
3362	},
3363	nextUntil: function( elem, _i, until ) {
3364		return dir( elem, "nextSibling", until );
3365	},
3366	prevUntil: function( elem, _i, until ) {
3367		return dir( elem, "previousSibling", until );
3368	},
3369	siblings: function( elem ) {
3370		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3371	},
3372	children: function( elem ) {
3373		return siblings( elem.firstChild );
3374	},
3375	contents: function( elem ) {
3376		if ( elem.contentDocument != null &&
3377
3378			// Support: IE 11+
3379			// <object> elements with no `data` attribute has an object
3380			// `contentDocument` with a `null` prototype.
3381			getProto( elem.contentDocument ) ) {
3382
3383			return elem.contentDocument;
3384		}
3385
3386		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3387		// Treat the template element as a regular one in browsers that
3388		// don't support it.
3389		if ( nodeName( elem, "template" ) ) {
3390			elem = elem.content || elem;
3391		}
3392
3393		return jQuery.merge( [], elem.childNodes );
3394	}
3395}, function( name, fn ) {
3396	jQuery.fn[ name ] = function( until, selector ) {
3397		var matched = jQuery.map( this, fn, until );
3398
3399		if ( name.slice( -5 ) !== "Until" ) {
3400			selector = until;
3401		}
3402
3403		if ( selector && typeof selector === "string" ) {
3404			matched = jQuery.filter( selector, matched );
3405		}
3406
3407		if ( this.length > 1 ) {
3408
3409			// Remove duplicates
3410			if ( !guaranteedUnique[ name ] ) {
3411				jQuery.uniqueSort( matched );
3412			}
3413
3414			// Reverse order for parents* and prev-derivatives
3415			if ( rparentsprev.test( name ) ) {
3416				matched.reverse();
3417			}
3418		}
3419
3420		return this.pushStack( matched );
3421	};
3422} );
3423var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3424
3425
3426
3427// Convert String-formatted options into Object-formatted ones
3428function createOptions( options ) {
3429	var object = {};
3430	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3431		object[ flag ] = true;
3432	} );
3433	return object;
3434}
3435
3436/*
3437 * Create a callback list using the following parameters:
3438 *
3439 *	options: an optional list of space-separated options that will change how
3440 *			the callback list behaves or a more traditional option object
3441 *
3442 * By default a callback list will act like an event callback list and can be
3443 * "fired" multiple times.
3444 *
3445 * Possible options:
3446 *
3447 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3448 *
3449 *	memory:			will keep track of previous values and will call any callback added
3450 *					after the list has been fired right away with the latest "memorized"
3451 *					values (like a Deferred)
3452 *
3453 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3454 *
3455 *	stopOnFalse:	interrupt callings when a callback returns false
3456 *
3457 */
3458jQuery.Callbacks = function( options ) {
3459
3460	// Convert options from String-formatted to Object-formatted if needed
3461	// (we check in cache first)
3462	options = typeof options === "string" ?
3463		createOptions( options ) :
3464		jQuery.extend( {}, options );
3465
3466	var // Flag to know if list is currently firing
3467		firing,
3468
3469		// Last fire value for non-forgettable lists
3470		memory,
3471
3472		// Flag to know if list was already fired
3473		fired,
3474
3475		// Flag to prevent firing
3476		locked,
3477
3478		// Actual callback list
3479		list = [],
3480
3481		// Queue of execution data for repeatable lists
3482		queue = [],
3483
3484		// Index of currently firing callback (modified by add/remove as needed)
3485		firingIndex = -1,
3486
3487		// Fire callbacks
3488		fire = function() {
3489
3490			// Enforce single-firing
3491			locked = locked || options.once;
3492
3493			// Execute callbacks for all pending executions,
3494			// respecting firingIndex overrides and runtime changes
3495			fired = firing = true;
3496			for ( ; queue.length; firingIndex = -1 ) {
3497				memory = queue.shift();
3498				while ( ++firingIndex < list.length ) {
3499
3500					// Run callback and check for early termination
3501					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3502						options.stopOnFalse ) {
3503
3504						// Jump to end and forget the data so .add doesn't re-fire
3505						firingIndex = list.length;
3506						memory = false;
3507					}
3508				}
3509			}
3510
3511			// Forget the data if we're done with it
3512			if ( !options.memory ) {
3513				memory = false;
3514			}
3515
3516			firing = false;
3517
3518			// Clean up if we're done firing for good
3519			if ( locked ) {
3520
3521				// Keep an empty list if we have data for future add calls
3522				if ( memory ) {
3523					list = [];
3524
3525				// Otherwise, this object is spent
3526				} else {
3527					list = "";
3528				}
3529			}
3530		},
3531
3532		// Actual Callbacks object
3533		self = {
3534
3535			// Add a callback or a collection of callbacks to the list
3536			add: function() {
3537				if ( list ) {
3538
3539					// If we have memory from a past run, we should fire after adding
3540					if ( memory && !firing ) {
3541						firingIndex = list.length - 1;
3542						queue.push( memory );
3543					}
3544
3545					( function add( args ) {
3546						jQuery.each( args, function( _, arg ) {
3547							if ( isFunction( arg ) ) {
3548								if ( !options.unique || !self.has( arg ) ) {
3549									list.push( arg );
3550								}
3551							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
3552
3553								// Inspect recursively
3554								add( arg );
3555							}
3556						} );
3557					} )( arguments );
3558
3559					if ( memory && !firing ) {
3560						fire();
3561					}
3562				}
3563				return this;
3564			},
3565
3566			// Remove a callback from the list
3567			remove: function() {
3568				jQuery.each( arguments, function( _, arg ) {
3569					var index;
3570					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3571						list.splice( index, 1 );
3572
3573						// Handle firing indexes
3574						if ( index <= firingIndex ) {
3575							firingIndex--;
3576						}
3577					}
3578				} );
3579				return this;
3580			},
3581
3582			// Check if a given callback is in the list.
3583			// If no argument is given, return whether or not list has callbacks attached.
3584			has: function( fn ) {
3585				return fn ?
3586					jQuery.inArray( fn, list ) > -1 :
3587					list.length > 0;
3588			},
3589
3590			// Remove all callbacks from the list
3591			empty: function() {
3592				if ( list ) {
3593					list = [];
3594				}
3595				return this;
3596			},
3597
3598			// Disable .fire and .add
3599			// Abort any current/pending executions
3600			// Clear all callbacks and values
3601			disable: function() {
3602				locked = queue = [];
3603				list = memory = "";
3604				return this;
3605			},
3606			disabled: function() {
3607				return !list;
3608			},
3609
3610			// Disable .fire
3611			// Also disable .add unless we have memory (since it would have no effect)
3612			// Abort any pending executions
3613			lock: function() {
3614				locked = queue = [];
3615				if ( !memory && !firing ) {
3616					list = memory = "";
3617				}
3618				return this;
3619			},
3620			locked: function() {
3621				return !!locked;
3622			},
3623
3624			// Call all callbacks with the given context and arguments
3625			fireWith: function( context, args ) {
3626				if ( !locked ) {
3627					args = args || [];
3628					args = [ context, args.slice ? args.slice() : args ];
3629					queue.push( args );
3630					if ( !firing ) {
3631						fire();
3632					}
3633				}
3634				return this;
3635			},
3636
3637			// Call all the callbacks with the given arguments
3638			fire: function() {
3639				self.fireWith( this, arguments );
3640				return this;
3641			},
3642
3643			// To know if the callbacks have already been called at least once
3644			fired: function() {
3645				return !!fired;
3646			}
3647		};
3648
3649	return self;
3650};
3651
3652
3653function Identity( v ) {
3654	return v;
3655}
3656function Thrower( ex ) {
3657	throw ex;
3658}
3659
3660function adoptValue( value, resolve, reject, noValue ) {
3661	var method;
3662
3663	try {
3664
3665		// Check for promise aspect first to privilege synchronous behavior
3666		if ( value && isFunction( ( method = value.promise ) ) ) {
3667			method.call( value ).done( resolve ).fail( reject );
3668
3669		// Other thenables
3670		} else if ( value && isFunction( ( method = value.then ) ) ) {
3671			method.call( value, resolve, reject );
3672
3673		// Other non-thenables
3674		} else {
3675
3676			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3677			// * false: [ value ].slice( 0 ) => resolve( value )
3678			// * true: [ value ].slice( 1 ) => resolve()
3679			resolve.apply( undefined, [ value ].slice( noValue ) );
3680		}
3681
3682	// For Promises/A+, convert exceptions into rejections
3683	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3684	// Deferred#then to conditionally suppress rejection.
3685	} catch ( value ) {
3686
3687		// Support: Android 4.0 only
3688		// Strict mode functions invoked without .call/.apply get global-object context
3689		reject.apply( undefined, [ value ] );
3690	}
3691}
3692
3693jQuery.extend( {
3694
3695	Deferred: function( func ) {
3696		var tuples = [
3697
3698				// action, add listener, callbacks,
3699				// ... .then handlers, argument index, [final state]
3700				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3701					jQuery.Callbacks( "memory" ), 2 ],
3702				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3703					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3704				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3705					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3706			],
3707			state = "pending",
3708			promise = {
3709				state: function() {
3710					return state;
3711				},
3712				always: function() {
3713					deferred.done( arguments ).fail( arguments );
3714					return this;
3715				},
3716				"catch": function( fn ) {
3717					return promise.then( null, fn );
3718				},
3719
3720				// Keep pipe for back-compat
3721				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3722					var fns = arguments;
3723
3724					return jQuery.Deferred( function( newDefer ) {
3725						jQuery.each( tuples, function( _i, tuple ) {
3726
3727							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3728							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3729
3730							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3731							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3732							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3733							deferred[ tuple[ 1 ] ]( function() {
3734								var returned = fn && fn.apply( this, arguments );
3735								if ( returned && isFunction( returned.promise ) ) {
3736									returned.promise()
3737										.progress( newDefer.notify )
3738										.done( newDefer.resolve )
3739										.fail( newDefer.reject );
3740								} else {
3741									newDefer[ tuple[ 0 ] + "With" ](
3742										this,
3743										fn ? [ returned ] : arguments
3744									);
3745								}
3746							} );
3747						} );
3748						fns = null;
3749					} ).promise();
3750				},
3751				then: function( onFulfilled, onRejected, onProgress ) {
3752					var maxDepth = 0;
3753					function resolve( depth, deferred, handler, special ) {
3754						return function() {
3755							var that = this,
3756								args = arguments,
3757								mightThrow = function() {
3758									var returned, then;
3759
3760									// Support: Promises/A+ section 2.3.3.3.3
3761									// https://promisesaplus.com/#point-59
3762									// Ignore double-resolution attempts
3763									if ( depth < maxDepth ) {
3764										return;
3765									}
3766
3767									returned = handler.apply( that, args );
3768
3769									// Support: Promises/A+ section 2.3.1
3770									// https://promisesaplus.com/#point-48
3771									if ( returned === deferred.promise() ) {
3772										throw new TypeError( "Thenable self-resolution" );
3773									}
3774
3775									// Support: Promises/A+ sections 2.3.3.1, 3.5
3776									// https://promisesaplus.com/#point-54
3777									// https://promisesaplus.com/#point-75
3778									// Retrieve `then` only once
3779									then = returned &&
3780
3781										// Support: Promises/A+ section 2.3.4
3782										// https://promisesaplus.com/#point-64
3783										// Only check objects and functions for thenability
3784										( typeof returned === "object" ||
3785											typeof returned === "function" ) &&
3786										returned.then;
3787
3788									// Handle a returned thenable
3789									if ( isFunction( then ) ) {
3790
3791										// Special processors (notify) just wait for resolution
3792										if ( special ) {
3793											then.call(
3794												returned,
3795												resolve( maxDepth, deferred, Identity, special ),
3796												resolve( maxDepth, deferred, Thrower, special )
3797											);
3798
3799										// Normal processors (resolve) also hook into progress
3800										} else {
3801
3802											// ...and disregard older resolution values
3803											maxDepth++;
3804
3805											then.call(
3806												returned,
3807												resolve( maxDepth, deferred, Identity, special ),
3808												resolve( maxDepth, deferred, Thrower, special ),
3809												resolve( maxDepth, deferred, Identity,
3810													deferred.notifyWith )
3811											);
3812										}
3813
3814									// Handle all other returned values
3815									} else {
3816
3817										// Only substitute handlers pass on context
3818										// and multiple values (non-spec behavior)
3819										if ( handler !== Identity ) {
3820											that = undefined;
3821											args = [ returned ];
3822										}
3823
3824										// Process the value(s)
3825										// Default process is resolve
3826										( special || deferred.resolveWith )( that, args );
3827									}
3828								},
3829
3830								// Only normal processors (resolve) catch and reject exceptions
3831								process = special ?
3832									mightThrow :
3833									function() {
3834										try {
3835											mightThrow();
3836										} catch ( e ) {
3837
3838											if ( jQuery.Deferred.exceptionHook ) {
3839												jQuery.Deferred.exceptionHook( e,
3840													process.
3840stackTrace );
3841											}
3842
3843											// Support: Promises/A+ section 2.3.3.3.4.1
3844											// https://promisesaplus.com/#point-61
3845											// Ignore post-resolution exceptions
3846											if ( depth + 1 >= maxDepth ) {
3847
3848												// Only substitute handlers pass on context
3849												// and multiple values (non-spec behavior)
3850												if ( handler !== Thrower ) {
3851													that = undefined;
3852													args = [ e ];
3853												}
3854
3855												deferred.rejectWith( that, args );
3856											}
3857										}
3858									};
3859
vendor: 8,433 bytes, lines 3860-4213
3860							// Support: Promises/A+ section 2.3.3.3.1
3861							// https://promisesaplus.com/#point-57
3862							// Re-resolve promises immediately to dodge false rejection from
3863							// subsequent errors
3864							if ( depth ) {
3865								process();
3866							} else {
3867
3868								// Call an optional hook to record the stack, in case of exception
3869								// since it's otherwise lost when execution goes async
3870								if ( jQuery.Deferred.getStackHook ) {
3871									process.stackTrace = jQuery.Deferred.getStackHook();
3872								}
3873								window.setTimeout( process );
3874							}
3875						};
3876					}
3877
3878					return jQuery.Deferred( function( newDefer ) {
3879
3880						// progress_handlers.add( ... )
3881						tuples[ 0 ][ 3 ].add(
3882							resolve(
3883								0,
3884								newDefer,
3885								isFunction( onProgress ) ?
3886									onProgress :
3887									Identity,
3888								newDefer.notifyWith
3889							)
3890						);
3891
3892						// fulfilled_handlers.add( ... )
3893						tuples[ 1 ][ 3 ].add(
3894							resolve(
3895								0,
3896								newDefer,
3897								isFunction( onFulfilled ) ?
3898									onFulfilled :
3899									Identity
3900							)
3901						);
3902
3903						// rejected_handlers.add( ... )
3904						tuples[ 2 ][ 3 ].add(
3905							resolve(
3906								0,
3907								newDefer,
3908								isFunction( onRejected ) ?
3909									onRejected :
3910									Thrower
3911							)
3912						);
3913					} ).promise();
3914				},
3915
3916				// Get a promise for this deferred
3917				// If obj is provided, the promise aspect is added to the object
3918				promise: function( obj ) {
3919					return obj != null ? jQuery.extend( obj, promise ) : promise;
3920				}
3921			},
3922			deferred = {};
3923
3924		// Add list-specific methods
3925		jQuery.each( tuples, function( i, tuple ) {
3926			var list = tuple[ 2 ],
3927				stateString = tuple[ 5 ];
3928
3929			// promise.progress = list.add
3930			// promise.done = list.add
3931			// promise.fail = list.add
3932			promise[ tuple[ 1 ] ] = list.add;
3933
3934			// Handle state
3935			if ( stateString ) {
3936				list.add(
3937					function() {
3938
3939						// state = "resolved" (i.e., fulfilled)
3940						// state = "rejected"
3941						state = stateString;
3942					},
3943
3944					// rejected_callbacks.disable
3945					// fulfilled_callbacks.disable
3946					tuples[ 3 - i ][ 2 ].disable,
3947
3948					// rejected_handlers.disable
3949					// fulfilled_handlers.disable
3950					tuples[ 3 - i ][ 3 ].disable,
3951
3952					// progress_callbacks.lock
3953					tuples[ 0 ][ 2 ].lock,
3954
3955					// progress_handlers.lock
3956					tuples[ 0 ][ 3 ].lock
3957				);
3958			}
3959
3960			// progress_handlers.fire
3961			// fulfilled_handlers.fire
3962			// rejected_handlers.fire
3963			list.add( tuple[ 3 ].fire );
3964
3965			// deferred.notify = function() { deferred.notifyWith(...) }
3966			// deferred.resolve = function() { deferred.resolveWith(...) }
3967			// deferred.reject = function() { deferred.rejectWith(...) }
3968			deferred[ tuple[ 0 ] ] = function() {
3969				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3970				return this;
3971			};
3972
3973			// deferred.notifyWith = list.fireWith
3974			// deferred.resolveWith = list.fireWith
3975			// deferred.rejectWith = list.fireWith
3976			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3977		} );
3978
3979		// Make the deferred a promise
3980		promise.promise( deferred );
3981
3982		// Call given func if any
3983		if ( func ) {
3984			func.call( deferred, deferred );
3985		}
3986
3987		// All done!
3988		return deferred;
3989	},
3990
3991	// Deferred helper
3992	when: function( singleValue ) {
3993		var
3994
3995			// count of uncompleted subordinates
3996			remaining = arguments.length,
3997
3998			// count of unprocessed arguments
3999			i = remaining,
4000
4001			// subordinate fulfillment data
4002			resolveContexts = Array( i ),
4003			resolveValues = slice.call( arguments ),
4004
4005			// the primary Deferred
4006			primary = jQuery.Deferred(),
4007
4008			// subordinate callback factory
4009			updateFunc = function( i ) {
4010				return function( value ) {
4011					resolveContexts[ i ] = this;
4012					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
4013					if ( !( --remaining ) ) {
4014						primary.resolveWith( resolveContexts, resolveValues );
4015					}
4016				};
4017			};
4018
4019		// Single- and empty arguments are adopted like Promise.resolve
4020		if ( remaining <= 1 ) {
4021			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
4022				!remaining );
4023
4024			// Use .then() to unwrap secondary thenables (cf. gh-3000)
4025			if ( primary.state() === "pending" ||
4026				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4027
4028				return primary.then();
4029			}
4030		}
4031
4032		// Multiple arguments are aggregated like Promise.all array elements
4033		while ( i-- ) {
4034			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
4035		}
4036
4037		return primary.promise();
4038	}
4039} );
4040
4041
4042// These usually indicate a programmer mistake during development,
4043// warn about them ASAP rather than swallowing them by default.
4044var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4045
4046jQuery.Deferred.exceptionHook = function( error, stack ) {
4047
4048	// Support: IE 8 - 9 only
4049	// Console exists when dev tools are open, which can happen at any time
4050	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4051		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
4052	}
4053};
4054
4055
4056
4057
4058jQuery.readyException = function( error ) {
4059	window.setTimeout( function() {
4060		throw error;
4061	} );
4062};
4063
4064
4065
4066
4067// The deferred used on DOM ready
4068var readyList = jQuery.Deferred();
4069
4070jQuery.fn.ready = function( fn ) {
4071
4072	readyList
4073		.then( fn )
4074
4075		// Wrap jQuery.readyException in a function so that the lookup
4076		// happens at the time of error handling instead of callback
4077		// registration.
4078		.catch( function( error ) {
4079			jQuery.readyException( error );
4080		} );
4081
4082	return this;
4083};
4084
4085jQuery.extend( {
4086
4087	// Is the DOM ready to be used? Set to true once it occurs.
4088	isReady: false,
4089
4090	// A counter to track how many items to wait for before
4091	// the ready event fires. See #6781
4092	readyWait: 1,
4093
4094	// Handle when the DOM is ready
4095	ready: function( wait ) {
4096
4097		// Abort if there are pending holds or we're already ready
4098		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
4099			return;
4100		}
4101
4102		// Remember that the DOM is ready
4103		jQuery.isReady = true;
4104
4105		// If a normal DOM Ready event fired, decrement, and wait if need be
4106		if ( wait !== true && --jQuery.readyWait > 0 ) {
4107			return;
4108		}
4109
4110		// If there are functions bound, to execute
4111		readyList.resolveWith( document, [ jQuery ] );
4112	}
4113} );
4114
4115jQuery.ready.then = readyList.then;
4116
4117// The ready event handler and self cleanup method
4118function completed() {
4119	document.removeEventListener( "DOMContentLoaded", completed );
4120	window.removeEventListener( "load", completed );
4121	jQuery.ready();
4122}
4123
4124// Catch cases where $(document).ready() is called
4125// after the browser event has already occurred.
4126// Support: IE <=9 - 10 only
4127// Older IE sometimes signals "interactive" too soon
4128if ( document.readyState === "complete" ||
4129	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
4130
4131	// Handle it asynchronously to allow scripts the opportunity to delay ready
4132	window.setTimeout( jQuery.ready );
4133
4134} else {
4135
4136	// Use the handy event callback
4137	document.addEventListener( "DOMContentLoaded", completed );
4138
4139	// A fallback to window.onload, that will always work
4140	window.addEventListener( "load", completed );
4141}
4142
4143
4144
4145
4146// Multifunctional method to get and set values of a collection
4147// The value/s can optionally be executed if it's a function
4148var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4149	var i = 0,
4150		len = elems.length,
4151		bulk = key == null;
4152
4153	// Sets many values
4154	if ( toType( key ) === "object" ) {
4155		chainable = true;
4156		for ( i in key ) {
4157			access( elems, fn, i, key[ i ], true, emptyGet, raw );
4158		}
4159
4160	// Sets one value
4161	} else if ( value !== undefined ) {
4162		chainable = true;
4163
4164		if ( !isFunction( value ) ) {
4165			raw = true;
4166		}
4167
4168		if ( bulk ) {
4169
4170			// Bulk operations run against the entire set
4171			if ( raw ) {
4172				fn.call( elems, value );
4173				fn = null;
4174
4175			// ...except when executing function values
4176			} else {
4177				bulk = fn;
4178				fn = function( elem, _key, value ) {
4179					return bulk.call( jQuery( elem ), value );
4180				};
4181			}
4182		}
4183
4184		if ( fn ) {
4185			for ( ; i < len; i++ ) {
4186				fn(
4187					elems[ i ], key, raw ?
4188						value :
4189						value.call( elems[ i ], i, fn( elems[ i ], key ) )
4190				);
4191			}
4192		}
4193	}
4194
4195	if ( chainable ) {
4196		return elems;
4197	}
4198
4199	// Gets
4200	if ( bulk ) {
4201		return fn.call( elems );
4202	}
4203
4204	return len ? fn( elems[ 0 ], key ) : emptyGet;
4205};
4206
4207
4208// Matches dashed string for camelizing
4209var rmsPrefix = /^-ms-/,
4210	rdashAlpha = /-([a-z])/g;
4211
4212// Used by camelCase as callback to replace()
4213function fcamelCase( _
vendor: 11,636 bytes, lines 4213-4702
4213all, letter ) {
4214	return letter.toUpperCase();
4215}
4216
4217// Convert dashed to camelCase; used by the css and data modules
4218// Support: IE <=9 - 11, Edge 12 - 15
4219// Microsoft forgot to hump their vendor prefix (#9572)
4220function camelCase( string ) {
4221	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4222}
4223var acceptData = function( owner ) {
4224
4225	// Accepts only:
4226	//  - Node
4227	//    - Node.ELEMENT_NODE
4228	//    - Node.DOCUMENT_NODE
4229	//  - Object
4230	//    - Any
4231	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4232};
4233
4234
4235
4236
4237function Data() {
4238	this.expando = jQuery.expando + Data.uid++;
4239}
4240
4241Data.uid = 1;
4242
4243Data.prototype = {
4244
4245	cache: function( owner ) {
4246
4247		// Check if the owner object already has a cache
4248		var value = owner[ this.expando ];
4249
4250		// If not, create one
4251		if ( !value ) {
4252			value = {};
4253
4254			// We can accept data for non-element nodes in modern browsers,
4255			// but we should not, see #8335.
4256			// Always return an empty object.
4257			if ( acceptData( owner ) ) {
4258
4259				// If it is a node unlikely to be stringify-ed or looped over
4260				// use plain assignment
4261				if ( owner.nodeType ) {
4262					owner[ this.expando ] = value;
4263
4264				// Otherwise secure it in a non-enumerable property
4265				// configurable must be true to allow the property to be
4266				// deleted when data is removed
4267				} else {
4268					Object.defineProperty( owner, this.expando, {
4269						value: value,
4270						configurable: true
4271					} );
4272				}
4273			}
4274		}
4275
4276		return value;
4277	},
4278	set: function( owner, data, value ) {
4279		var prop,
4280			cache = this.cache( owner );
4281
4282		// Handle: [ owner, key, value ] args
4283		// Always use camelCase key (gh-2257)
4284		if ( typeof data === "string" ) {
4285			cache[ camelCase( data ) ] = value;
4286
4287		// Handle: [ owner, { properties } ] args
4288		} else {
4289
4290			// Copy the properties one-by-one to the cache object
4291			for ( prop in data ) {
4292				cache[ camelCase( prop ) ] = data[ prop ];
4293			}
4294		}
4295		return cache;
4296	},
4297	get: function( owner, key ) {
4298		return key === undefined ?
4299			this.cache( owner ) :
4300
4301			// Always use camelCase key (gh-2257)
4302			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4303	},
4304	access: function( owner, key, value ) {
4305
4306		// In cases where either:
4307		//
4308		//   1. No key was specified
4309		//   2. A string key was specified, but no value provided
4310		//
4311		// Take the "read" path and allow the get method to determine
4312		// which value to return, respectively either:
4313		//
4314		//   1. The entire cache object
4315		//   2. The data stored at the key
4316		//
4317		if ( key === undefined ||
4318				( ( key && typeof key === "string" ) && value === undefined ) ) {
4319
4320			return this.get( owner, key );
4321		}
4322
4323		// When the key is not a string, or both a key and value
4324		// are specified, set or extend (existing objects) with either:
4325		//
4326		//   1. An object of properties
4327		//   2. A key and value
4328		//
4329		this.set( owner, key, value );
4330
4331		// Since the "set" path can have two possible entry points
4332		// return the expected data based on which path was taken[*]
4333		return value !== undefined ? value : key;
4334	},
4335	remove: function( owner, key ) {
4336		var i,
4337			cache = owner[ this.expando ];
4338
4339		if ( cache === undefined ) {
4340			return;
4341		}
4342
4343		if ( key !== undefined ) {
4344
4345			// Support array or space separated string of keys
4346			if ( Array.isArray( key ) ) {
4347
4348				// If key is an array of keys...
4349				// We always set camelCase keys, so remove that.
4350				key = key.map( camelCase );
4351			} else {
4352				key = camelCase( key );
4353
4354				// If a key with the spaces exists, use it.
4355				// Otherwise, create an array by matching non-whitespace
4356				key = key in cache ?
4357					[ key ] :
4358					( key.match( rnothtmlwhite ) || [] );
4359			}
4360
4361			i = key.length;
4362
4363			while ( i-- ) {
4364				delete cache[ key[ i ] ];
4365			}
4366		}
4367
4368		// Remove the expando if there's no more data
4369		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4370
4371			// Support: Chrome <=35 - 45
4372			// Webkit & Blink performance suffers when deleting properties
4373			// from DOM nodes, so set to undefined instead
4374			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4375			if ( owner.nodeType ) {
4376				owner[ this.expando ] = undefined;
4377			} else {
4378				delete owner[ this.expando ];
4379			}
4380		}
4381	},
4382	hasData: function( owner ) {
4383		var cache = owner[ this.expando ];
4384		return cache !== undefined && !jQuery.isEmptyObject( cache );
4385	}
4386};
4387var dataPriv = new Data();
4388
4389var dataUser = new Data();
4390
4391
4392
4393//	Implementation Summary
4394//
4395//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4396//	2. Improve the module's maintainability by reducing the storage
4397//		paths to a single mechanism.
4398//	3. Use the same single mechanism to support "private" and "user" data.
4399//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4400//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4401//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4402
4403var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4404	rmultiDash = /[A-Z]/g;
4405
4406function getData( data ) {
4407	if ( data === "true" ) {
4408		return true;
4409	}
4410
4411	if ( data === "false" ) {
4412		return false;
4413	}
4414
4415	if ( data === "null" ) {
4416		return null;
4417	}
4418
4419	// Only convert to a number if it doesn't change the string
4420	if ( data === +data + "" ) {
4421		return +data;
4422	}
4423
4424	if ( rbrace.test( data ) ) {
4425		return JSON.parse( data );
4426	}
4427
4428	return data;
4429}
4430
4431function dataAttr( elem, key, data ) {
4432	var name;
4433
4434	// If nothing was found internally, try to fetch any
4435	// data from the HTML5 data-* attribute
4436	if ( data === undefined && elem.nodeType === 1 ) {
4437		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4438		data = elem.getAttribute( name );
4439
4440		if ( typeof data === "string" ) {
4441			try {
4442				data = getData( data );
4443			} catch ( e ) {}
4444
4445			// Make sure we set the data so it isn't changed later
4446			dataUser.set( elem, key, data );
4447		} else {
4448			data = undefined;
4449		}
4450	}
4451	return data;
4452}
4453
4454jQuery.extend( {
4455	hasData: function( elem ) {
4456		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4457	},
4458
4459	data: function( elem, name, data ) {
4460		return dataUser.access( elem, name, data );
4461	},
4462
4463	removeData: function( elem, name ) {
4464		dataUser.remove( elem, name );
4465	},
4466
4467	// TODO: Now that all calls to _data and _removeData have been replaced
4468	// with direct calls to dataPriv methods, these can be deprecated.
4469	_data: function( elem, name, data ) {
4470		return dataPriv.access( elem, name, data );
4471	},
4472
4473	_removeData: function( elem, name ) {
4474		dataPriv.remove( elem, name );
4475	}
4476} );
4477
4478jQuery.fn.extend( {
4479	data: function( key, value ) {
4480		var i, name, data,
4481			elem = this[ 0 ],
4482			attrs = elem && elem.attributes;
4483
4484		// Gets all values
4485		if ( key === undefined ) {
4486			if ( this.length ) {
4487				data = dataUser.get( elem );
4488
4489				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4490					i = attrs.length;
4491					while ( i-- ) {
4492
4493						// Support: IE 11 only
4494						// The attrs elements can be null (#14894)
4495						if ( attrs[ i ] ) {
4496							name = attrs[ i ].name;
4497							if ( name.indexOf( "data-" ) === 0 ) {
4498								name = camelCase( name.slice( 5 ) );
4499								dataAttr( elem, name, data[ name ] );
4500							}
4501						}
4502					}
4503					dataPriv.set( elem, "hasDataAttrs", true );
4504				}
4505			}
4506
4507			return data;
4508		}
4509
4510		// Sets multiple values
4511		if ( typeof key === "object" ) {
4512			return this.each( function() {
4513				dataUser.set( this, key );
4514			} );
4515		}
4516
4517		return access( this, function( value ) {
4518			var data;
4519
4520			// The calling jQuery object (element matches) is not empty
4521			// (and therefore has an element appears at this[ 0 ]) and the
4522			// `value` parameter was not undefined. An empty jQuery object
4523			// will result in `undefined` for elem = this[ 0 ] which will
4524			// throw an exception if an attempt to read a data cache is made.
4525			if ( elem && value === undefined ) {
4526
4527				// Attempt to get data from the cache
4528				// The key will always be camelCased in Data
4529				data = dataUser.get( elem, key );
4530				if ( data !== undefined ) {
4531					return data;
4532				}
4533
4534				// Attempt to "discover" the data in
4535				// HTML5 custom data-* attrs
4536				data = dataAttr( elem, key );
4537				if ( data !== undefined ) {
4538					return data;
4539				}
4540
4541				// We tried really hard, but the data doesn't exist.
4542				return;
4543			}
4544
4545			// Set the data...
4546			this.each( function() {
4547
4548				// We always store the camelCased key
4549				dataUser.set( this, key, value );
4550			} );
4551		}, null, value, arguments.length > 1, null, true );
4552	},
4553
4554	removeData: function( key ) {
4555		return this.each( function() {
4556			dataUser.remove( this, key );
4557		} );
4558	}
4559} );
4560
4561
4562jQuery.extend( {
4563	queue: function( elem, type, data ) {
4564		var queue;
4565
4566		if ( elem ) {
4567			type = ( type || "fx" ) + "queue";
4568			queue = dataPriv.get( elem, type );
4569
4570			// Speed up dequeue by getting out quickly if this is just a lookup
4571			if ( data ) {
4572				if ( !queue || Array.isArray( data ) ) {
4573					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4574				} else {
4575					queue.push( data );
4576				}
4577			}
4578			return queue || [];
4579		}
4580	},
4581
4582	dequeue: function( elem, type ) {
4583		type = type || "fx";
4584
4585		var queue = jQuery.queue( elem, type ),
4586			startLength = queue.length,
4587			fn = queue.shift(),
4588			hooks = jQuery._queueHooks( elem, type ),
4589			next = function() {
4590				jQuery.dequeue( elem, type );
4591			};
4592
4593		// If the fx queue is dequeued, always remove the progress sentinel
4594		if ( fn === "inprogress" ) {
4595			fn = queue.shift();
4596			startLength--;
4597		}
4598
4599		if ( fn ) {
4600
4601			// Add a progress sentinel to prevent the fx queue from being
4602			// automatically dequeued
4603			if ( type === "fx" ) {
4604				queue.unshift( "inprogress" );
4605			}
4606
4607			// Clear up the last queue stop function
4608			delete hooks.stop;
4609			fn.call( elem, next, hooks );
4610		}
4611
4612		if ( !startLength && hooks ) {
4613			hooks.empty.fire();
4614		}
4615	},
4616
4617	// Not public - generate a queueHooks object, or return the current one
4618	_queueHooks: function( elem, type ) {
4619		var key = type + "queueHooks";
4620		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4621			empty: jQuery.Callbacks( "once memory" ).add( function() {
4622				dataPriv.remove( elem, [ type + "queue", key ] );
4623			} )
4624		} );
4625	}
4626} );
4627
4628jQuery.fn.extend( {
4629	queue: function( type, data ) {
4630		var setter = 2;
4631
4632		if ( typeof type !== "string" ) {
4633			data = type;
4634			type = "fx";
4635			setter--;
4636		}
4637
4638		if ( arguments.length < setter ) {
4639			return jQuery.queue( this[ 0 ], type );
4640		}
4641
4642		return data === undefined ?
4643			this :
4644			this.each( function() {
4645				var queue = jQuery.queue( this, type, data );
4646
4647				// Ensure a hooks for this queue
4648				jQuery._queueHooks( this, type );
4649
4650				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4651					jQuery.dequeue( this, type );
4652				}
4653			} );
4654	},
4655	dequeue: function( type ) {
4656		return this.each( function() {
4657			jQuery.dequeue( this, type );
4658		} );
4659	},
4660	clearQueue: function( type ) {
4661		return this.queue( type || "fx", [] );
4662	},
4663
4664	// Get a promise resolved when queues of a certain type
4665	// are emptied (fx is the type by default)
4666	promise: function( type, obj ) {
4667		var tmp,
4668			count = 1,
4669			defer = jQuery.Deferred(),
4670			elements = this,
4671			i = this.length,
4672			resolve = function() {
4673				if ( !( --count ) ) {
4674					defer.resolveWith( elements, [ elements ] );
4675				}
4676			};
4677
4678		if ( typeof type !== "string" ) {
4679			obj = type;
4680			type = undefined;
4681		}
4682		type = type || "fx";
4683
4684		while ( i-- ) {
4685			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4686			if ( tmp && tmp.empty ) {
4687				count++;
4688				tmp.empty.add( resolve );
4689			}
4690		}
4691		resolve();
4692		return defer.promise( obj );
4693	}
4694} );
4695var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4696
4697var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4698
4699
4700var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4701
4702var 
vendor: 5,672 bytes, lines 4702-4917
4702documentElement = document.documentElement;
4703
4704
4705
4706	var isAttached = function( elem ) {
4707			return jQuery.contains( elem.ownerDocument, elem );
4708		},
4709		composed = { composed: true };
4710
4711	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4712	// Check attachment across shadow DOM boundaries when possible (gh-3504)
4713	// Support: iOS 10.0-10.2 only
4714	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4715	// leading to errors. We need to check for `getRootNode`.
4716	if ( documentElement.getRootNode ) {
4717		isAttached = function( elem ) {
4718			return jQuery.contains( elem.ownerDocument, elem ) ||
4719				elem.getRootNode( composed ) === elem.ownerDocument;
4720		};
4721	}
4722var isHiddenWithinTree = function( elem, el ) {
4723
4724		// isHiddenWithinTree might be called from jQuery#filter function;
4725		// in that case, element will be second argument
4726		elem = el || elem;
4727
4728		// Inline style trumps all
4729		return elem.style.display === "none" ||
4730			elem.style.display === "" &&
4731
4732			// Otherwise, check computed style
4733			// Support: Firefox <=43 - 45
4734			// Disconnected elements can have computed display: none, so first confirm that elem is
4735			// in the document.
4736			isAttached( elem ) &&
4737
4738			jQuery.css( elem, "display" ) === "none";
4739	};
4740
4741
4742
4743function adjustCSS( elem, prop, valueParts, tween ) {
4744	var adjusted, scale,
4745		maxIterations = 20,
4746		currentValue = tween ?
4747			function() {
4748				return tween.cur();
4749			} :
4750			function() {
4751				return jQuery.css( elem, prop, "" );
4752			},
4753		initial = currentValue(),
4754		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4755
4756		// Starting value computation is required for potential unit mismatches
4757		initialInUnit = elem.nodeType &&
4758			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4759			rcssNum.exec( jQuery.css( elem, prop ) );
4760
4761	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4762
4763		// Support: Firefox <=54
4764		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4765		initial = initial / 2;
4766
4767		// Trust units reported by jQuery.css
4768		unit = unit || initialInUnit[ 3 ];
4769
4770		// Iteratively approximate from a nonzero starting point
4771		initialInUnit = +initial || 1;
4772
4773		while ( maxIterations-- ) {
4774
4775			// Evaluate and update our best guess (doubling guesses that zero out).
4776			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4777			jQuery.style( elem, prop, initialInUnit + unit );
4778			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4779				maxIterations = 0;
4780			}
4781			initialInUnit = initialInUnit / scale;
4782
4783		}
4784
4785		initialInUnit = initialInUnit * 2;
4786		jQuery.style( elem, prop, initialInUnit + unit );
4787
4788		// Make sure we update the tween properties later on
4789		valueParts = valueParts || [];
4790	}
4791
4792	if ( valueParts ) {
4793		initialInUnit = +initialInUnit || +initial || 0;
4794
4795		// Apply relative offset (+=/-=) if specified
4796		adjusted = valueParts[ 1 ] ?
4797			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4798			+valueParts[ 2 ];
4799		if ( tween ) {
4800			tween.unit = unit;
4801			tween.start = initialInUnit;
4802			tween.end = adjusted;
4803		}
4804	}
4805	return adjusted;
4806}
4807
4808
4809var defaultDisplayMap = {};
4810
4811function getDefaultDisplay( elem ) {
4812	var temp,
4813		doc = elem.ownerDocument,
4814		nodeName = elem.nodeName,
4815		display = defaultDisplayMap[ nodeName ];
4816
4817	if ( display ) {
4818		return display;
4819	}
4820
4821	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4822	display = jQuery.css( temp, "display" );
4823
4824	temp.parentNode.removeChild( temp );
4825
4826	if ( display === "none" ) {
4827		display = "block";
4828	}
4829	defaultDisplayMap[ nodeName ] = display;
4830
4831	return display;
4832}
4833
4834function showHide( elements, show ) {
4835	var display, elem,
4836		values = [],
4837		index = 0,
4838		length = elements.length;
4839
4840	// Determine new display value for elements that need to change
4841	for ( ; index < length; index++ ) {
4842		elem = elements[ index ];
4843		if ( !elem.style ) {
4844			continue;
4845		}
4846
4847		display = elem.style.display;
4848		if ( show ) {
4849
4850			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4851			// check is required in this first loop unless we have a nonempty display value (either
4852			// inline or about-to-be-restored)
4853			if ( display === "none" ) {
4854				values[ index ] = dataPriv.get( elem, "display" ) || null;
4855				if ( !values[ index ] ) {
4856					elem.style.display = "";
4857				}
4858			}
4859			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4860				values[ index ] = getDefaultDisplay( elem );
4861			}
4862		} else {
4863			if ( display !== "none" ) {
4864				values[ index ] = "none";
4865
4866				// Remember what we're overwriting
4867				dataPriv.set( elem, "display", display );
4868			}
4869		}
4870	}
4871
4872	// Set the display of the elements in a second loop to avoid constant reflow
4873	for ( index = 0; index < length; index++ ) {
4874		if ( values[ index ] != null ) {
4875			elements[ index ].style.display = values[ index ];
4876		}
4877	}
4878
4879	return elements;
4880}
4881
4882jQuery.fn.extend( {
4883	show: function() {
4884		return showHide( this, true );
4885	},
4886	hide: function() {
4887		return showHide( this );
4888	},
4889	toggle: function( state ) {
4890		if ( typeof state === "boolean" ) {
4891			return state ? this.show() : this.hide();
4892		}
4893
4894		return this.each( function() {
4895			if ( isHiddenWithinTree( this ) ) {
4896				jQuery( this ).show();
4897			} else {
4898				jQuery( this ).hide();
4899			}
4900		} );
4901	}
4902} );
4903var rcheckableType = ( /^(?:checkbox|radio)$/i );
4904
4905var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4906
4907var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4908
4909
4910
4911( function() {
4912	var fragment = document.createDocumentFragment(),
4913		div = fragment.appendChild( document.createElement( "div" ) ),
4914		input = document.createElement( "input" );
4915
4916	// Support: Android 4.0 - 4.3 only
4917	// Check state lost if the name is set (
vendor: 4,735 bytes, lines 4917-5104
4917#11217)
4918	// Support: Windows Web Apps (WWA)
4919	// `name` and `type` must use .setAttribute for WWA (#14901)
4920	input.setAttribute( "type", "radio" );
4921	input.setAttribute( "checked", "checked" );
4922	input.setAttribute( "name", "t" );
4923
4924	div.appendChild( input );
4925
4926	// Support: Android <=4.1 only
4927	// Older WebKit doesn't clone checked state correctly in fragments
4928	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4929
4930	// Support: IE <=11 only
4931	// Make sure textarea (and checkbox) defaultValue is properly cloned
4932	div.innerHTML = "<textarea>x</textarea>";
4933	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4934
4935	// Support: IE <=9 only
4936	// IE <=9 replaces <option> tags with their contents when inserted outside of
4937	// the select element.
4938	div.innerHTML = "<option></option>";
4939	support.option = !!div.lastChild;
4940} )();
4941
4942
4943// We have to close these tags to support XHTML (#13200)
4944var wrapMap = {
4945
4946	// XHTML parsers do not magically insert elements in the
4947	// same way that tag soup parsers do. So we cannot shorten
4948	// this by omitting <tbody> or other required elements.
4949	thead: [ 1, "<table>", "</table>" ],
4950	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4951	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4952	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4953
4954	_default: [ 0, "", "" ]
4955};
4956
4957wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4958wrapMap.th = wrapMap.td;
4959
4960// Support: IE <=9 only
4961if ( !support.option ) {
4962	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4963}
4964
4965
4966function getAll( context, tag ) {
4967
4968	// Support: IE <=9 - 11 only
4969	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
4970	var ret;
4971
4972	if ( typeof context.getElementsByTagName !== "undefined" ) {
4973		ret = context.getElementsByTagName( tag || "*" );
4974
4975	} else if ( typeof context.querySelectorAll !== "undefined" ) {
4976		ret = context.querySelectorAll( tag || "*" );
4977
4978	} else {
4979		ret = [];
4980	}
4981
4982	if ( tag === undefined || tag && nodeName( context, tag ) ) {
4983		return jQuery.merge( [ context ], ret );
4984	}
4985
4986	return ret;
4987}
4988
4989
4990// Mark scripts as having already been evaluated
4991function setGlobalEval( elems, refElements ) {
4992	var i = 0,
4993		l = elems.length;
4994
4995	for ( ; i < l; i++ ) {
4996		dataPriv.set(
4997			elems[ i ],
4998			"globalEval",
4999			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
5000		);
5001	}
5002}
5003
5004
5005var rhtml = /<|&#?\w+;/;
5006
5007function buildFragment( elems, context, scripts, selection, ignored ) {
5008	var elem, tmp, tag, wrap, attached, j,
5009		fragment = context.createDocumentFragment(),
5010		nodes = [],
5011		i = 0,
5012		l = elems.length;
5013
5014	for ( ; i < l; i++ ) {
5015		elem = elems[ i ];
5016
5017		if ( elem || elem === 0 ) {
5018
5019			// Add nodes directly
5020			if ( toType( elem ) === "object" ) {
5021
5022				// Support: Android <=4.0 only, PhantomJS 1 only
5023				// push.apply(_, arraylike) throws on ancient WebKit
5024				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5025
5026			// Convert non-html into a text node
5027			} else if ( !rhtml.test( elem ) ) {
5028				nodes.push( context.createTextNode( elem ) );
5029
5030			// Convert html into DOM nodes
5031			} else {
5032				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
5033
5034				// Deserialize a standard representation
5035				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
5036				wrap = wrapMap[ tag ] || wrapMap._default;
5037				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
5038
5039				// Descend through wrappers to the right content
5040				j = wrap[ 0 ];
5041				while ( j-- ) {
5042					tmp = tmp.lastChild;
5043				}
5044
5045				// Support: Android <=4.0 only, PhantomJS 1 only
5046				// push.apply(_, arraylike) throws on ancient WebKit
5047				jQuery.merge( nodes, tmp.childNodes );
5048
5049				// Remember the top-level container
5050				tmp = fragment.firstChild;
5051
5052				// Ensure the created nodes are orphaned (#12392)
5053				tmp.textContent = "";
5054			}
5055		}
5056	}
5057
5058	// Remove wrapper from fragment
5059	fragment.textContent = "";
5060
5061	i = 0;
5062	while ( ( elem = nodes[ i++ ] ) ) {
5063
5064		// Skip elements already in the context collection (trac-4087)
5065		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
5066			if ( ignored ) {
5067				ignored.push( elem );
5068			}
5069			continue;
5070		}
5071
5072		attached = isAttached( elem );
5073
5074		// Append to fragment
5075		tmp = getAll( fragment.appendChild( elem ), "script" );
5076
5077		// Preserve script evaluation history
5078		if ( attached ) {
5079			setGlobalEval( tmp );
5080		}
5081
5082		// Capture executables
5083		if ( scripts ) {
5084			j = 0;
5085			while ( ( elem = tmp[ j++ ] ) ) {
5086				if ( rscriptType.test( elem.type || "" ) ) {
5087					scripts.push( elem );
5088				}
5089			}
5090		}
5091	}
5092
5093	return fragment;
5094}
5095
5096
5097var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5098
5099function returnTrue() {
5100	return true;
5101}
5102
5103function returnFalse() {
5104	return false;
5105}
5106
5107// Support: IE <=9 - 11+
5108// focus() and blur() are asynchronous, except when they are no-op.
5109// So expect focus to be synchronous when the element is already active,
5110// and blur to be synchronous when the element is not already active.
5111// (focus and blur are always synchronous in other supported browsers,
5112// this just defines when we can count on it).
5113function expectSync( elem, type ) {
5114	return ( elem === safeActiveElement() ) === ( type === "focus" );
5115}
5116
5117// Support: IE <=9 only
5118// Accessing document.activeElement can throw unexpectedly
5119// https://bugs.jquery.com/ticket/13393
5120function safeActiveElement() {
5121	try {
5122		return document.activeElement;
5123	} catch ( err ) { }
vendor: 10,038 bytes, lines 5123-5473
5123
5124}
5125
5126function on( elem, types, selector, data, fn, one ) {
5127	var origFn, type;
5128
5129	// Types can be a map of types/handlers
5130	if ( typeof types === "object" ) {
5131
5132		// ( types-Object, selector, data )
5133		if ( typeof selector !== "string" ) {
5134
5135			// ( types-Object, data )
5136			data = data || selector;
5137			selector = undefined;
5138		}
5139		for ( type in types ) {
5140			on( elem, type, selector, data, types[ type ], one );
5141		}
5142		return elem;
5143	}
5144
5145	if ( data == null && fn == null ) {
5146
5147		// ( types, fn )
5148		fn = selector;
5149		data = selector = undefined;
5150	} else if ( fn == null ) {
5151		if ( typeof selector === "string" ) {
5152
5153			// ( types, selector, fn )
5154			fn = data;
5155			data = undefined;
5156		} else {
5157
5158			// ( types, data, fn )
5159			fn = data;
5160			data = selector;
5161			selector = undefined;
5162		}
5163	}
5164	if ( fn === false ) {
5165		fn = returnFalse;
5166	} else if ( !fn ) {
5167		return elem;
5168	}
5169
5170	if ( one === 1 ) {
5171		origFn = fn;
5172		fn = function( event ) {
5173
5174			// Can use an empty set, since event contains the info
5175			jQuery().off( event );
5176			return origFn.apply( this, arguments );
5177		};
5178
5179		// Use same guid so caller can remove using origFn
5180		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5181	}
5182	return elem.each( function() {
5183		jQuery.event.add( this, types, fn, data, selector );
5184	} );
5185}
5186
5187/*
5188 * Helper functions for managing events -- not part of the public interface.
5189 * Props to Dean Edwards' addEvent library for many of the ideas.
5190 */
5191jQuery.event = {
5192
5193	global: {},
5194
5195	add: function( elem, types, handler, data, selector ) {
5196
5197		var handleObjIn, eventHandle, tmp,
5198			events, t, handleObj,
5199			special, handlers, type, namespaces, origType,
5200			elemData = dataPriv.get( elem );
5201
5202		// Only attach events to objects that accept data
5203		if ( !acceptData( elem ) ) {
5204			return;
5205		}
5206
5207		// Caller can pass in an object of custom data in lieu of the handler
5208		if ( handler.handler ) {
5209			handleObjIn = handler;
5210			handler = handleObjIn.handler;
5211			selector = handleObjIn.selector;
5212		}
5213
5214		// Ensure that invalid selectors throw exceptions at attach time
5215		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
5216		if ( selector ) {
5217			jQuery.find.matchesSelector( documentElement, selector );
5218		}
5219
5220		// Make sure that the handler has a unique ID, used to find/remove it later
5221		if ( !handler.guid ) {
5222			handler.guid = jQuery.guid++;
5223		}
5224
5225		// Init the element's event structure and main handler, if this is the first
5226		if ( !( events = elemData.events ) ) {
5227			events = elemData.events = Object.create( null );
5228		}
5229		if ( !( eventHandle = elemData.handle ) ) {
5230			eventHandle = elemData.handle = function( e ) {
5231
5232				// Discard the second event of a jQuery.event.trigger() and
5233				// when an event is called after a page has unloaded
5234				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5235					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5236			};
5237		}
5238
5239		// Handle multiple events separated by a space
5240		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5241		t = types.length;
5242		while ( t-- ) {
5243			tmp = rtypenamespace.exec( types[ t ] ) || [];
5244			type = origType = tmp[ 1 ];
5245			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5246
5247			// There *must* be a type, no attaching namespace-only handlers
5248			if ( !type ) {
5249				continue;
5250			}
5251
5252			// If event changes its type, use the special event handlers for the changed type
5253			special = jQuery.event.special[ type ] || {};
5254
5255			// If selector defined, determine special event api type, otherwise given type
5256			type = ( selector ? special.delegateType : special.bindType ) || type;
5257
5258			// Update special based on newly reset type
5259			special = jQuery.event.special[ type ] || {};
5260
5261			// handleObj is passed to all event handlers
5262			handleObj = jQuery.extend( {
5263				type: type,
5264				origType: origType,
5265				data: data,
5266				handler: handler,
5267				guid: handler.guid,
5268				selector: selector,
5269				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5270				namespace: namespaces.join( "." )
5271			}, handleObjIn );
5272
5273			// Init the event handler queue if we're the first
5274			if ( !( handlers = events[ type ] ) ) {
5275				handlers = events[ type ] = [];
5276				handlers.delegateCount = 0;
5277
5278				// Only use addEventListener if the special events handler returns false
5279				if ( !special.setup ||
5280					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5281
5282					if ( elem.addEventListener ) {
5283						elem.addEventListener( type, eventHandle );
5284					}
5285				}
5286			}
5287
5288			if ( special.add ) {
5289				special.add.call( elem, handleObj );
5290
5291				if ( !handleObj.handler.guid ) {
5292					handleObj.handler.guid = handler.guid;
5293				}
5294			}
5295
5296			// Add to the element's handler list, delegates in front
5297			if ( selector ) {
5298				handlers.splice( handlers.delegateCount++, 0, handleObj );
5299			} else {
5300				handlers.push( handleObj );
5301			}
5302
5303			// Keep track of which events have ever been used, for event optimization
5304			jQuery.event.global[ type ] = true;
5305		}
5306
5307	},
5308
5309	// Detach an event or set of events from an element
5310	remove: function( elem, types, handler, selector, mappedTypes ) {
5311
5312		var j, origCount, tmp,
5313			events, t, handleObj,
5314			special, handlers, type, namespaces, origType,
5315			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5316
5317		if ( !elemData || !( events = elemData.events ) ) {
5318			return;
5319		}
5320
5321		// Once for each type.namespace in types; type may be omitted
5322		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5323		t = types.length;
5324		while ( t-- ) {
5325			tmp = rtypenamespace.exec( types[ t ] ) || [];
5326			type = origType = tmp[ 1 ];
5327			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5328
5329			// Unbind all events (on this namespace, if provided) for the element
5330			if ( !type ) {
5331				for ( type in events ) {
5332					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5333				}
5334				continue;
5335			}
5336
5337			special = jQuery.event.special[ type ] || {};
5338			type = ( selector ? special.delegateType : special.bindType ) || type;
5339			handlers = events[ type ] || [];
5340			tmp = tmp[ 2 ] &&
5341				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5342
5343			// Remove matching events
5344			origCount = j = handlers.length;
5345			while ( j-- ) {
5346				handleObj = handlers[ j ];
5347
5348				if ( ( mappedTypes || origType === handleObj.origType ) &&
5349					( !handler || handler.guid === handleObj.guid ) &&
5350					( !tmp || tmp.test( handleObj.namespace ) ) &&
5351					( !selector || selector === handleObj.selector ||
5352						selector === "**" && handleObj.selector ) ) {
5353					handlers.splice( j, 1 );
5354
5355					if ( handleObj.selector ) {
5356						handlers.delegateCount--;
5357					}
5358					if ( special.remove ) {
5359						special.remove.call( elem, handleObj );
5360					}
5361				}
5362			}
5363
5364			// Remove generic event handler if we removed something and no more handlers exist
5365			// (avoids potential for endless recursion during removal of special event handlers)
5366			if ( origCount && !handlers.length ) {
5367				if ( !special.teardown ||
5368					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5369
5370					jQuery.removeEvent( elem, type, elemData.handle );
5371				}
5372
5373				delete events[ type ];
5374			}
5375		}
5376
5377		// Remove data and the expando if it's no longer used
5378		if ( jQuery.isEmptyObject( events ) ) {
5379			dataPriv.remove( elem, "handle events" );
5380		}
5381	},
5382
5383	dispatch: function( nativeEvent ) {
5384
5385		var i, j, ret, matched, handleObj, handlerQueue,
5386			args = new Array( arguments.length ),
5387
5388			// Make a writable jQuery.Event from the native event object
5389			event = jQuery.event.fix( nativeEvent ),
5390
5391			handlers = (
5392				dataPriv.get( this, "events" ) || Object.create( null )
5393			)[ event.type ] || [],
5394			special = jQuery.event.special[ event.type ] || {};
5395
5396		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5397		args[ 0 ] = event;
5398
5399		for ( i = 1; i < arguments.length; i++ ) {
5400			args[ i ] = arguments[ i ];
5401		}
5402
5403		event.delegateTarget = this;
5404
5405		// Call the preDispatch hook for the mapped type, and let it bail if desired
5406		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5407			return;
5408		}
5409
5410		// Determine handlers
5411		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5412
5413		// Run delegates first; they may want to stop propagation beneath us
5414		i = 0;
5415		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5416			event.currentTarget = matched.elem;
5417
5418			j = 0;
5419			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5420				!event.isImmediatePropagationStopped() ) {
5421
5422				// If the event is namespaced, then each handler is only invoked if it is
5423				// specially universal or its namespaces are a superset of the event's.
5424				if ( !event.rnamespace || handleObj.namespace === false ||
5425					event.rnamespace.test( handleObj.namespace ) ) {
5426
5427					event.handleObj = handleObj;
5428					event.data = handleObj.data;
5429
5430					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5431						handleObj.handler ).apply( matched.elem, args );
5432
5433					if ( ret !== undefined ) {
5434						if ( ( event.result = ret ) === false ) {
5435							event.preventDefault();
5436							event.stopPropagation();
5437						}
5438					}
5439				}
5440			}
5441		}
5442
5443		// Call the postDispatch hook for the mapped type
5444		if ( special.postDispatch ) {
5445			special.postDispatch.call( this, event );
5446		}
5447
5448		return event.result;
5449	},
5450
5451	handlers: function( event, handlers ) {
5452		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5453			handlerQueue = [],
5454			delegateCount = handlers.delegateCount,
5455			cur = event.target;
5456
5457		// Find delegate handlers
5458		if ( delegateCount &&
5459
5460			// Support: IE <=9
5461			// Black-hole SVG <use> instance trees (trac-13180)
5462			cur.nodeType &&
5463
5464			// Support: Firefox <=42
5465			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5466			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5467			// Support: IE 11 only
5468			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5469			!( event.type === "click" && event.button >= 1 ) ) {
5470
5471			for ( ; cur !== this; cur = cur.parentNode || this ) {
5472
5473				// Don't check non-elements (
vendor: 5,172 bytes, lines 5473-5645
5473#13208)
5474				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5475				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5476					matchedHandlers = [];
5477					matchedSelectors = {};
5478					for ( i = 0; i < delegateCount; i++ ) {
5479						handleObj = handlers[ i ];
5480
5481						// Don't conflict with Object.prototype properties (#13203)
5482						sel = handleObj.selector + " ";
5483
5484						if ( matchedSelectors[ sel ] === undefined ) {
5485							matchedSelectors[ sel ] = handleObj.needsContext ?
5486								jQuery( sel, this ).index( cur ) > -1 :
5487								jQuery.find( sel, this, null, [ cur ] ).length;
5488						}
5489						if ( matchedSelectors[ sel ] ) {
5490							matchedHandlers.push( handleObj );
5491						}
5492					}
5493					if ( matchedHandlers.length ) {
5494						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5495					}
5496				}
5497			}
5498		}
5499
5500		// Add the remaining (directly-bound) handlers
5501		cur = this;
5502		if ( delegateCount < handlers.length ) {
5503			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5504		}
5505
5506		return handlerQueue;
5507	},
5508
5509	addProp: function( name, hook ) {
5510		Object.defineProperty( jQuery.Event.prototype, name, {
5511			enumerable: true,
5512			configurable: true,
5513
5514			get: isFunction( hook ) ?
5515				function() {
5516					if ( this.originalEvent ) {
5517						return hook( this.originalEvent );
5518					}
5519				} :
5520				function() {
5521					if ( this.originalEvent ) {
5522						return this.originalEvent[ name ];
5523					}
5524				},
5525
5526			set: function( value ) {
5527				Object.defineProperty( this, name, {
5528					enumerable: true,
5529					configurable: true,
5530					writable: true,
5531					value: value
5532				} );
5533			}
5534		} );
5535	},
5536
5537	fix: function( originalEvent ) {
5538		return originalEvent[ jQuery.expando ] ?
5539			originalEvent :
5540			new jQuery.Event( originalEvent );
5541	},
5542
5543	special: {
5544		load: {
5545
5546			// Prevent triggered image.load events from bubbling to window.load
5547			noBubble: true
5548		},
5549		click: {
5550
5551			// Utilize native event to ensure correct state for checkable inputs
5552			setup: function( data ) {
5553
5554				// For mutual compressibility with _default, replace `this` access with a local var.
5555				// `|| data` is dead code meant only to preserve the variable through minification.
5556				var el = this || data;
5557
5558				// Claim the first handler
5559				if ( rcheckableType.test( el.type ) &&
5560					el.click && nodeName( el, "input" ) ) {
5561
5562					// dataPriv.set( el, "click", ... )
5563					leverageNative( el, "click", returnTrue );
5564				}
5565
5566				// Return false to allow normal processing in the caller
5567				return false;
5568			},
5569			trigger: function( data ) {
5570
5571				// For mutual compressibility with _default, replace `this` access with a local var.
5572				// `|| data` is dead code meant only to preserve the variable through minification.
5573				var el = this || data;
5574
5575				// Force setup before triggering a click
5576				if ( rcheckableType.test( el.type ) &&
5577					el.click && nodeName( el, "input" ) ) {
5578
5579					leverageNative( el, "click" );
5580				}
5581
5582				// Return non-false to allow normal event-path propagation
5583				return true;
5584			},
5585
5586			// For cross-browser consistency, suppress native .click() on links
5587			// Also prevent it if we're currently inside a leveraged native-event stack
5588			_default: function( event ) {
5589				var target = event.target;
5590				return rcheckableType.test( target.type ) &&
5591					target.click && nodeName( target, "input" ) &&
5592					dataPriv.get( target, "click" ) ||
5593					nodeName( target, "a" );
5594			}
5595		},
5596
5597		beforeunload: {
5598			postDispatch: function( event ) {
5599
5600				// Support: Firefox 20+
5601				// Firefox doesn't alert if the returnValue field is not set.
5602				if ( event.result !== undefined && event.originalEvent ) {
5603					event.originalEvent.returnValue = event.result;
5604				}
5605			}
5606		}
5607	}
5608};
5609
5610// Ensure the presence of an event listener that handles manually-triggered
5611// synthetic events by interrupting progress until reinvoked in response to
5612// *native* events that it fires directly, ensuring that state changes have
5613// already occurred before other listeners are invoked.
5614function leverageNative( el, type, expectSync ) {
5615
5616	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5617	if ( !expectSync ) {
5618		if ( dataPriv.get( el, type ) === undefined ) {
5619			jQuery.event.add( el, type, returnTrue );
5620		}
5621		return;
5622	}
5623
5624	// Register the controller as a special universal handler for all event namespaces
5625	dataPriv.set( el, type, false );
5626	jQuery.event.add( el, type, {
5627		namespace: false,
5628		handler: function( event ) {
5629			var notAsync, result,
5630				saved = dataPriv.get( this, type );
5631
5632			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5633
5634				// Interrupt processing of the outer synthetic .trigger()ed event
5635				// Saved data should be false in such cases, but might be a leftover capture object
5636				// from an async native handler (gh-4350)
5637				if ( !saved.length ) {
5638
5639					// Store arguments for use when handling the inner native event
5640					// There will always be at least one argument (an event object), so this array
5641					// will not be confused with a leftover capture object.
5642					saved = slice.call( arguments );
5643					dataPriv.set( this, type, saved );
5644
5645					// Trigger the native event and capture its result
5646					// Support: IE <=9 - 11+
5647					// focus() and blur() are asynchronous
5648					notAsync = expectSync( this, type );
5649					this[ type ]();
5650					result = dataPriv.get( this, type );
5651					if ( saved !== result || notAsync ) {
5652						dataPriv.set( this, type, false );
5653					} else {
5654						result = {};
5655					}
5656					if ( saved !== result ) {
5657
5658						// Cancel the outer synthetic event
5659						event.stopImmediatePropagation();
5660						event.preventDefault();
5661
5662						// Support: Chrome 86+
5663						// In Chrome, if an element having a focusout handler is blurred by
5664						// clicking outside of it, it invokes the handler synchronously. If
5665						// that handler calls `.remove()` on the element, the data is cleared,
5666						// leaving `result` undefined. We need to guard against this.
5667						return result && result.value;
5668					}
5669
5670				// If this is an inner synthetic event for an event with a bubbling surrogate
5671				// (focus or blur), assume that the surrogate already propagated from triggering the
5672				// native event and prevent that from happening again here.
5673				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5674				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
5675				// less bad than duplication.
5676				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5677					event.stopPropagation();
5678				}
5679
5680			// If this is a native event triggered above, everything is now in order
5681			// Fire an inner synthetic event with the original arguments
5682			} else if ( saved.length ) {
5683
5684				// ...and capture the result
5685				dataPriv.set( this, type, {
5686					value: jQuery.event.trigger(
5687
5688						// Support: IE <=9 - 11+
5689						// Extend with the prototype to reset the above stopImmediatePropagation()
5690						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5691						saved.slice( 1 ),
5692						this
5693					)
5694				} );
5695
5696				// Abort handling of the native event
5697				event.stopImmediatePropagation();
5698			}
5699		}
5700	} );
5701}
5702
5703jQuery.removeEvent = function( elem, type, handle ) {
5704
5705	// This "if" is needed for plain objects
5706	if ( elem.removeEventListener ) {
5707		elem.removeEventListener( type, handle );
5708	}
5709};
5710
5711jQuery.Event = function( src, props ) {
5712
5713	// Allow instantiation without the 'new' keyword
5714	if ( !( this instanceof jQuery.Event ) ) {
5715		return new jQuery.Event( src, props );
5716	}
5717
5718	// Event object
5719	if ( src && src.type ) {
5720		this.originalEvent = src;
5721		this.type = src.type;
5722
5723		// Events bubbling up the document may have been marked as prevented
5724		// by a handler lower down the tree; reflect the correct value.
5725		this.isDefaultPrevented = src.defaultPrevented ||
5726				src.defaultPrevented === undefined &&
5727
5728				// Support: Android <=2.3 only
5729				src.returnValue === false ?
5730			returnTrue :
5731			returnFalse;
5732
5733		// Create target properties
5734		// Support: Safari <=6 - 7 only
5735		// Target should not be a text node (#504, #13143)
5736		this.target = ( src.target && src.target.nodeType === 3 ) ?
5737			src.target.parentNode :
5738			src.target;
5739
5740		this.currentTarget = src.currentTarget;
5741		this.relatedTarget = src.relatedTarget;
5742
5743	// Event type
5744	} else {
5745		this.type = src;
5746	}
5747
5748	// Put explicitly provided properties onto the event object
5749	if ( props ) {
5750		jQuery.extend( this, props );
5751	}
5752
5753	// Create a timestamp if incoming event doesn't have one
5754	this.timeStamp = src && src.timeStamp || Date.now();
5755
5756	// Mark it as fixed
5757	this[ jQuery.expando ] = true;
5758};
5759
5760// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5761// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5762jQuery.Event.prototype = {
5763	constructor: jQuery.Event,
5764	isDefaultPrevented: returnFalse,
5765	isPropagationStopped: returnFalse,
5766	isImmediatePropagationStopped: returnFalse,
5767	isSimulated: false,
5768
5769	preventDefault: function() {
5770		var e = this.originalEvent;
5771
5772		this.isDefaultPrevented = returnTrue;
5773
5774		if ( e && !this.isSimulated ) {
5775			e.preventDefault();
5776		}
5777	},
5778	stopPropagation: function() {
5779		var e = this.originalEvent;
5780
5781		this.isPropagationStopped = returnTrue;
5782
5783		if ( e && !this.isSimulated ) {
5784			e.stopPropagation();
5785		}
5786	},
5787	stopImmediatePropagation: function() {
5788		var e = this.originalEvent;
5789
5790		this.isImmediatePropagationStopped = returnTrue;
5791
5792		if ( e && !this.isSimulated ) {
5793			e.stopImmediatePropagation();
5794		}
5795
5796		this.stopPropagation();
5797	}
5798};
5799
5800// Includes all common event props including KeyEvent and MouseEvent specific props
5801jQuery.each( {
5802	altKey: true,
5803	bubbles: true,
5804	cancelable: true,
5805	changedTouches: true,
5806	ctrlKey: true,
5807	detail: true,
5808	eventPhase: true,
5809	metaKey: true,
5810	pageX: true,
5811	pageY: true,
5812	shiftKey: true,
5813	view: true,
5814	"char": true,
5815	code: true,
5816	charCode: true,
5817	key: true,
5818	keyCode: true,
5819	button: true,
5820	buttons: true,
5821	clientX: true,
5822	clientY: true,
5823	offsetX: true,
5824	offsetY: true,
5825	pointerId: true,
5826	pointerType: true,
5827	screenX: true,
5828	screenY: true,
5829	targetTouches: true,
5830	toElement: true,
5831	touches: true,
5832	which: true
5833}, jQuery.event.addProp );
5834
5835jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5836	jQuery.event.special[ type ] = {
5837
5838		// Utilize native event if possible so blur/focus sequence is correct
5839		setup: function() {
5840
5841			// Claim the first handler
5842			// dataPriv.set( this, "focus", ... )
5843			// dataPriv.set( this, "blur", ... )
5844			leverageNative( this, type, expectSync );
5845
5846			// Return false to allow normal processing in the caller
5847			return false;
vendor: 8,358 bytes, lines 5848-6161
5848		},
5849		trigger: function() {
5850
5851			// Force setup before trigger
5852			leverageNative( this, type );
5853
5854			// Return non-false to allow normal event-path propagation
5855			return true;
5856		},
5857
5858		// Suppress native focus or blur as it's already being fired
5859		// in leverageNative.
5860		_default: function() {
5861			return true;
5862		},
5863
5864		delegateType: delegateType
5865	};
5866} );
5867
5868// Create mouseenter/leave events using mouseover/out and event-time checks
5869// so that event delegation works in jQuery.
5870// Do the same for pointerenter/pointerleave and pointerover/pointerout
5871//
5872// Support: Safari 7 only
5873// Safari sends mouseenter too often; see:
5874// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5875// for the description of the bug (it existed in older Chrome versions as well).
5876jQuery.each( {
5877	mouseenter: "mouseover",
5878	mouseleave: "mouseout",
5879	pointerenter: "pointerover",
5880	pointerleave: "pointerout"
5881}, function( orig, fix ) {
5882	jQuery.event.special[ orig ] = {
5883		delegateType: fix,
5884		bindType: fix,
5885
5886		handle: function( event ) {
5887			var ret,
5888				target = this,
5889				related = event.relatedTarget,
5890				handleObj = event.handleObj;
5891
5892			// For mouseenter/leave call the handler if related is outside the target.
5893			// NB: No relatedTarget if the mouse left/entered the browser window
5894			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5895				event.type = handleObj.origType;
5896				ret = handleObj.handler.apply( this, arguments );
5897				event.type = fix;
5898			}
5899			return ret;
5900		}
5901	};
5902} );
5903
5904jQuery.fn.extend( {
5905
5906	on: function( types, selector, data, fn ) {
5907		return on( this, types, selector, data, fn );
5908	},
5909	one: function( types, selector, data, fn ) {
5910		return on( this, types, selector, data, fn, 1 );
5911	},
5912	off: function( types, selector, fn ) {
5913		var handleObj, type;
5914		if ( types && types.preventDefault && types.handleObj ) {
5915
5916			// ( event )  dispatched jQuery.Event
5917			handleObj = types.handleObj;
5918			jQuery( types.delegateTarget ).off(
5919				handleObj.namespace ?
5920					handleObj.origType + "." + handleObj.namespace :
5921					handleObj.origType,
5922				handleObj.selector,
5923				handleObj.handler
5924			);
5925			return this;
5926		}
5927		if ( typeof types === "object" ) {
5928
5929			// ( types-object [, selector] )
5930			for ( type in types ) {
5931				this.off( type, selector, types[ type ] );
5932			}
5933			return this;
5934		}
5935		if ( selector === false || typeof selector === "function" ) {
5936
5937			// ( types [, fn] )
5938			fn = selector;
5939			selector = undefined;
5940		}
5941		if ( fn === false ) {
5942			fn = returnFalse;
5943		}
5944		return this.each( function() {
5945			jQuery.event.remove( this, types, fn, selector );
5946		} );
5947	}
5948} );
5949
5950
5951var
5952
5953	// Support: IE <=10 - 11, Edge 12 - 13 only
5954	// In IE/Edge using regex groups here causes severe slowdowns.
5955	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5956	rnoInnerhtml = /<script|<style|<link/i,
5957
5958	// checked="checked" or checked
5959	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5960	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5961
5962// Prefer a tbody over its parent table for containing new rows
5963function manipulationTarget( elem, content ) {
5964	if ( nodeName( elem, "table" ) &&
5965		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5966
5967		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5968	}
5969
5970	return elem;
5971}
5972
5973// Replace/restore the type attribute of script elements for safe DOM manipulation
5974function disableScript( elem ) {
5975	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5976	return elem;
5977}
5978function restoreScript( elem ) {
5979	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5980		elem.type = elem.type.slice( 5 );
5981	} else {
5982		elem.removeAttribute( "type" );
5983	}
5984
5985	return elem;
5986}
5987
5988function cloneCopyEvent( src, dest ) {
5989	var i, l, type, pdataOld, udataOld, udataCur, events;
5990
5991	if ( dest.nodeType !== 1 ) {
5992		return;
5993	}
5994
5995	// 1. Copy private data: events, handlers, etc.
5996	if ( dataPriv.hasData( src ) ) {
5997		pdataOld = dataPriv.get( src );
5998		events = pdataOld.events;
5999
6000		if ( events ) {
6001			dataPriv.remove( dest, "handle events" );
6002
6003			for ( type in events ) {
6004				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6005					jQuery.event.add( dest, type, events[ type ][ i ] );
6006				}
6007			}
6008		}
6009	}
6010
6011	// 2. Copy user data
6012	if ( dataUser.hasData( src ) ) {
6013		udataOld = dataUser.access( src );
6014		udataCur = jQuery.extend( {}, udataOld );
6015
6016		dataUser.set( dest, udataCur );
6017	}
6018}
6019
6020// Fix IE bugs, see support tests
6021function fixInput( src, dest ) {
6022	var nodeName = dest.nodeName.toLowerCase();
6023
6024	// Fails to persist the checked state of a cloned checkbox or radio button.
6025	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
6026		dest.checked = src.checked;
6027
6028	// Fails to return the selected option to the default selected state when cloning options
6029	} else if ( nodeName === "input" || nodeName === "textarea" ) {
6030		dest.defaultValue = src.defaultValue;
6031	}
6032}
6033
6034function domManip( collection, args, callback, ignored ) {
6035
6036	// Flatten any nested arrays
6037	args = flat( args );
6038
6039	var fragment, first, scripts, hasScripts, node, doc,
6040		i = 0,
6041		l = collection.length,
6042		iNoClone = l - 1,
6043		value = args[ 0 ],
6044		valueIsFunction = isFunction( value );
6045
6046	// We can't cloneNode fragments that contain checked, in WebKit
6047	if ( valueIsFunction ||
6048			( l > 1 && typeof value === "string" &&
6049				!support.checkClone && rchecked.test( value ) ) ) {
6050		return collection.each( function( index ) {
6051			var self = collection.eq( index );
6052			if ( valueIsFunction ) {
6053				args[ 0 ] = value.call( this, index, self.html() );
6054			}
6055			domManip( self, args, callback, ignored );
6056		} );
6057	}
6058
6059	if ( l ) {
6060		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
6061		first = fragment.firstChild;
6062
6063		if ( fragment.childNodes.length === 1 ) {
6064			fragment = first;
6065		}
6066
6067		// Require either new content or an interest in ignored elements to invoke the callback
6068		if ( first || ignored ) {
6069			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
6070			hasScripts = scripts.length;
6071
6072			// Use the original fragment for the last item
6073			// instead of the first because it can end up
6074			// being emptied incorrectly in certain situations (#8070).
6075			for ( ; i < l; i++ ) {
6076				node = fragment;
6077
6078				if ( i !== iNoClone ) {
6079					node = jQuery.clone( node, true, true );
6080
6081					// Keep references to cloned scripts for later restoration
6082					if ( hasScripts ) {
6083
6084						// Support: Android <=4.0 only, PhantomJS 1 only
6085						// push.apply(_, arraylike) throws on ancient WebKit
6086						jQuery.merge( scripts, getAll( node, "script" ) );
6087					}
6088				}
6089
6090				callback.call( collection[ i ], node, i );
6091			}
6092
6093			if ( hasScripts ) {
6094				doc = scripts[ scripts.length - 1 ].ownerDocument;
6095
6096				// Reenable scripts
6097				jQuery.map( scripts, restoreScript );
6098
6099				// Evaluate executable scripts on first document insertion
6100				for ( i = 0; i < hasScripts; i++ ) {
6101					node = scripts[ i ];
6102					if ( rscriptType.test( node.type || "" ) &&
6103						!dataPriv.access( node, "globalEval" ) &&
6104						jQuery.contains( doc, node ) ) {
6105
6106						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
6107
6108							// Optional AJAX dependency, but won't run scripts if not present
6109							if ( jQuery._evalUrl && !node.noModule ) {
6110								jQuery._evalUrl( node.src, {
6111									nonce: node.nonce || node.getAttribute( "nonce" )
6112								}, doc );
6113							}
6114						} else {
6115							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
6116						}
6117					}
6118				}
6119			}
6120		}
6121	}
6122
6123	return collection;
6124}
6125
6126function remove( elem, selector, keepData ) {
6127	var node,
6128		nodes = selector ? jQuery.filter( selector, elem ) : elem,
6129		i = 0;
6130
6131	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
6132		if ( !keepData && node.nodeType === 1 ) {
6133			jQuery.cleanData( getAll( node ) );
6134		}
6135
6136		if ( node.parentNode ) {
6137			if ( keepData && isAttached( node ) ) {
6138				setGlobalEval( getAll( node, "script" ) );
6139			}
6140			node.parentNode.removeChild( node );
6141		}
6142	}
6143
6144	return elem;
6145}
6146
6147jQuery.extend( {
6148	htmlPrefilter: function( html ) {
6149		return html;
6150	},
6151
6152	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6153		var i, l, srcElements, destElements,
6154			clone = elem.cloneNode( true ),
6155			inPage = isAttached( elem );
6156
6157		// Fix IE cloning issues
6158		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6159				!jQuery.isXMLDoc( elem ) ) {
6160
6161			// We eschew Sizzle here for performance reasons:
vendor: 5,848 bytes, lines 6161-6397
6161 https://jsperf.com/getall-vs-sizzle/2
6162			destElements = getAll( clone );
6163			srcElements = getAll( elem );
6164
6165			for ( i = 0, l = srcElements.length; i < l; i++ ) {
6166				fixInput( srcElements[ i ], destElements[ i ] );
6167			}
6168		}
6169
6170		// Copy the events from the original to the clone
6171		if ( dataAndEvents ) {
6172			if ( deepDataAndEvents ) {
6173				srcElements = srcElements || getAll( elem );
6174				destElements = destElements || getAll( clone );
6175
6176				for ( i = 0, l = srcElements.length; i < l; i++ ) {
6177					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6178				}
6179			} else {
6180				cloneCopyEvent( elem, clone );
6181			}
6182		}
6183
6184		// Preserve script evaluation history
6185		destElements = getAll( clone, "script" );
6186		if ( destElements.length > 0 ) {
6187			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6188		}
6189
6190		// Return the cloned set
6191		return clone;
6192	},
6193
6194	cleanData: function( elems ) {
6195		var data, elem, type,
6196			special = jQuery.event.special,
6197			i = 0;
6198
6199		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6200			if ( acceptData( elem ) ) {
6201				if ( ( data = elem[ dataPriv.expando ] ) ) {
6202					if ( data.events ) {
6203						for ( type in data.events ) {
6204							if ( special[ type ] ) {
6205								jQuery.event.remove( elem, type );
6206
6207							// This is a shortcut to avoid jQuery.event.remove's overhead
6208							} else {
6209								jQuery.removeEvent( elem, type, data.handle );
6210							}
6211						}
6212					}
6213
6214					// Support: Chrome <=35 - 45+
6215					// Assign undefined instead of using delete, see Data#remove
6216					elem[ dataPriv.expando ] = undefined;
6217				}
6218				if ( elem[ dataUser.expando ] ) {
6219
6220					// Support: Chrome <=35 - 45+
6221					// Assign undefined instead of using delete, see Data#remove
6222					elem[ dataUser.expando ] = undefined;
6223				}
6224			}
6225		}
6226	}
6227} );
6228
6229jQuery.fn.extend( {
6230	detach: function( selector ) {
6231		return remove( this, selector, true );
6232	},
6233
6234	remove: function( selector ) {
6235		return remove( this, selector );
6236	},
6237
6238	text: function( value ) {
6239		return access( this, function( value ) {
6240			return value === undefined ?
6241				jQuery.text( this ) :
6242				this.empty().each( function() {
6243					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6244						this.textContent = value;
6245					}
6246				} );
6247		}, null, value, arguments.length );
6248	},
6249
6250	append: function() {
6251		return domManip( this, arguments, function( elem ) {
6252			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6253				var target = manipulationTarget( this, elem );
6254				target.appendChild( elem );
6255			}
6256		} );
6257	},
6258
6259	prepend: function() {
6260		return domManip( this, arguments, function( elem ) {
6261			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6262				var target = manipulationTarget( this, elem );
6263				target.insertBefore( elem, target.firstChild );
6264			}
6265		} );
6266	},
6267
6268	before: function() {
6269		return domManip( this, arguments, function( elem ) {
6270			if ( this.parentNode ) {
6271				this.parentNode.insertBefore( elem, this );
6272			}
6273		} );
6274	},
6275
6276	after: function() {
6277		return domManip( this, arguments, function( elem ) {
6278			if ( this.parentNode ) {
6279				this.parentNode.insertBefore( elem, this.nextSibling );
6280			}
6281		} );
6282	},
6283
6284	empty: function() {
6285		var elem,
6286			i = 0;
6287
6288		for ( ; ( elem = this[ i ] ) != null; i++ ) {
6289			if ( elem.nodeType === 1 ) {
6290
6291				// Prevent memory leaks
6292				jQuery.cleanData( getAll( elem, false ) );
6293
6294				// Remove any remaining nodes
6295				elem.textContent = "";
6296			}
6297		}
6298
6299		return this;
6300	},
6301
6302	clone: function( dataAndEvents, deepDataAndEvents ) {
6303		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6304		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6305
6306		return this.map( function() {
6307			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6308		} );
6309	},
6310
6311	html: function( value ) {
6312		return access( this, function( value ) {
6313			var elem = this[ 0 ] || {},
6314				i = 0,
6315				l = this.length;
6316
6317			if ( value === undefined && elem.nodeType === 1 ) {
6318				return elem.innerHTML;
6319			}
6320
6321			// See if we can take a shortcut and just use innerHTML
6322			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6323				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6324
6325				value = jQuery.htmlPrefilter( value );
6326
6327				try {
6328					for ( ; i < l; i++ ) {
6329						elem = this[ i ] || {};
6330
6331						// Remove element nodes and prevent memory leaks
6332						if ( elem.nodeType === 1 ) {
6333							jQuery.cleanData( getAll( elem, false ) );
6334							elem.innerHTML = value;
6335						}
6336					}
6337
6338					elem = 0;
6339
6340				// If using innerHTML throws an exception, use the fallback method
6341				} catch ( e ) {}
6342			}
6343
6344			if ( elem ) {
6345				this.empty().append( value );
6346			}
6347		}, null, value, arguments.length );
6348	},
6349
6350	replaceWith: function() {
6351		var ignored = [];
6352
6353		// Make the changes, replacing each non-ignored context element with the new content
6354		return domManip( this, arguments, function( elem ) {
6355			var parent = this.parentNode;
6356
6357			if ( jQuery.inArray( this, ignored ) < 0 ) {
6358				jQuery.cleanData( getAll( this ) );
6359				if ( parent ) {
6360					parent.replaceChild( elem, this );
6361				}
6362			}
6363
6364		// Force callback invocation
6365		}, ignored );
6366	}
6367} );
6368
6369jQuery.each( {
6370	appendTo: "append",
6371	prependTo: "prepend",
6372	insertBefore: "before",
6373	insertAfter: "after",
6374	replaceAll: "replaceWith"
6375}, function( name, original ) {
6376	jQuery.fn[ name ] = function( selector ) {
6377		var elems,
6378			ret = [],
6379			insert = jQuery( selector ),
6380			last = insert.length - 1,
6381			i = 0;
6382
6383		for ( ; i <= last; i++ ) {
6384			elems = i === last ? this : this.clone( true );
6385			jQuery( insert[ i ] )[ original ]( elems );
6386
6387			// Support: Android <=4.0 only, PhantomJS 1 only
6388			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6389			push.apply( ret, elems.get() );
6390		}
6391
6392		return this.pushStack( ret );
6393	};
6394} );
6395var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6396
6397var 
vendor: 15,567 bytes, lines 6397-6933
6397getStyles = function( elem ) {
6398
6399		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6400		// IE throws on elements created in popups
6401		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6402		var view = elem.ownerDocument.defaultView;
6403
6404		if ( !view || !view.opener ) {
6405			view = window;
6406		}
6407
6408		return view.getComputedStyle( elem );
6409	};
6410
6411var swap = function( elem, options, callback ) {
6412	var ret, name,
6413		old = {};
6414
6415	// Remember the old values, and insert the new ones
6416	for ( name in options ) {
6417		old[ name ] = elem.style[ name ];
6418		elem.style[ name ] = options[ name ];
6419	}
6420
6421	ret = callback.call( elem );
6422
6423	// Revert the old values
6424	for ( name in options ) {
6425		elem.style[ name ] = old[ name ];
6426	}
6427
6428	return ret;
6429};
6430
6431
6432var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6433
6434
6435
6436( function() {
6437
6438	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6439	// so they're executed at the same time to save the second computation.
6440	function computeStyleTests() {
6441
6442		// This is a singleton, we need to execute it only once
6443		if ( !div ) {
6444			return;
6445		}
6446
6447		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6448			"margin-top:1px;padding:0;border:0";
6449		div.style.cssText =
6450			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6451			"margin:auto;border:1px;padding:1px;" +
6452			"width:60%;top:1%";
6453		documentElement.appendChild( container ).appendChild( div );
6454
6455		var divStyle = window.getComputedStyle( div );
6456		pixelPositionVal = divStyle.top !== "1%";
6457
6458		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6459		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6460
6461		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6462		// Some styles come back with percentage values, even though they shouldn't
6463		div.style.right = "60%";
6464		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6465
6466		// Support: IE 9 - 11 only
6467		// Detect misreporting of content dimensions for box-sizing:border-box elements
6468		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6469
6470		// Support: IE 9 only
6471		// Detect overflow:scroll screwiness (gh-3699)
6472		// Support: Chrome <=64
6473		// Don't get tricked when zoom affects offsetWidth (gh-4029)
6474		div.style.position = "absolute";
6475		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6476
6477		documentElement.removeChild( container );
6478
6479		// Nullify the div so it wouldn't be stored in the memory and
6480		// it will also be a sign that checks already performed
6481		div = null;
6482	}
6483
6484	function roundPixelMeasures( measure ) {
6485		return Math.round( parseFloat( measure ) );
6486	}
6487
6488	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6489		reliableTrDimensionsVal, reliableMarginLeftVal,
6490		container = document.createElement( "div" ),
6491		div = document.createElement( "div" );
6492
6493	// Finish early in limited (non-browser) environments
6494	if ( !div.style ) {
6495		return;
6496	}
6497
6498	// Support: IE <=9 - 11 only
6499	// Style of cloned element affects source element cloned (#8908)
6500	div.style.backgroundClip = "content-box";
6501	div.cloneNode( true ).style.backgroundClip = "";
6502	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6503
6504	jQuery.extend( support, {
6505		boxSizingReliable: function() {
6506			computeStyleTests();
6507			return boxSizingReliableVal;
6508		},
6509		pixelBoxStyles: function() {
6510			computeStyleTests();
6511			return pixelBoxStylesVal;
6512		},
6513		pixelPosition: function() {
6514			computeStyleTests();
6515			return pixelPositionVal;
6516		},
6517		reliableMarginLeft: function() {
6518			computeStyleTests();
6519			return reliableMarginLeftVal;
6520		},
6521		scrollboxSize: function() {
6522			computeStyleTests();
6523			return scrollboxSizeVal;
6524		},
6525
6526		// Support: IE 9 - 11+, Edge 15 - 18+
6527		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6528		// set in CSS while `offset*` properties report correct values.
6529		// Behavior in IE 9 is more subtle than in newer versions & it passes
6530		// some versions of this test; make sure not to make it pass there!
6531		//
6532		// Support: Firefox 70+
6533		// Only Firefox includes border widths
6534		// in computed dimensions. (gh-4529)
6535		reliableTrDimensions: function() {
6536			var table, tr, trChild, trStyle;
6537			if ( reliableTrDimensionsVal == null ) {
6538				table = document.createElement( "table" );
6539				tr = document.createElement( "tr" );
6540				trChild = document.createElement( "div" );
6541
6542				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
6543				tr.style.cssText = "border:1px solid";
6544
6545				// Support: Chrome 86+
6546				// Height set through cssText does not get applied.
6547				// Computed height then comes back as 0.
6548				tr.style.height = "1px";
6549				trChild.style.height = "9px";
6550
6551				// Support: Android 8 Chrome 86+
6552				// In our bodyBackground.html iframe,
6553				// display for all div elements is set to "inline",
6554				// which causes a problem only in Android 8 Chrome 86.
6555				// Ensuring the div is display: block
6556				// gets around this issue.
6557				trChild.style.display = "block";
6558
6559				documentElement
6560					.appendChild( table )
6561					.appendChild( tr )
6562					.appendChild( trChild );
6563
6564				trStyle = window.getComputedStyle( tr );
6565				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
6566					parseInt( trStyle.borderTopWidth, 10 ) +
6567					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
6568
6569				documentElement.removeChild( table );
6570			}
6571			return reliableTrDimensionsVal;
6572		}
6573	} );
6574} )();
6575
6576
6577function curCSS( elem, name, computed ) {
6578	var width, minWidth, maxWidth, ret,
6579
6580		// Support: Firefox 51+
6581		// Retrieving style before computed somehow
6582		// fixes an issue with getting wrong values
6583		// on detached elements
6584		style = elem.style;
6585
6586	computed = computed || getStyles( elem );
6587
6588	// getPropertyValue is needed for:
6589	//   .css('filter') (IE 9 only, #12537)
6590	//   .css('--customProperty) (#3144)
6591	if ( computed ) {
6592		ret = computed.getPropertyValue( name ) || computed[ name ];
6593
6594		if ( ret === "" && !isAttached( elem ) ) {
6595			ret = jQuery.style( elem, name );
6596		}
6597
6598		// A tribute to the "awesome hack by Dean Edwards"
6599		// Android Browser returns percentage for some values,
6600		// but width seems to be reliably pixels.
6601		// This is against the CSSOM draft spec:
6602		// https://drafts.csswg.org/cssom/#resolved-values
6603		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6604
6605			// Remember the original values
6606			width = style.width;
6607			minWidth = style.minWidth;
6608			maxWidth = style.maxWidth;
6609
6610			// Put in the new values to get a computed value out
6611			style.minWidth = style.maxWidth = style.width = ret;
6612			ret = computed.width;
6613
6614			// Revert the changed values
6615			style.width = width;
6616			style.minWidth = minWidth;
6617			style.maxWidth = maxWidth;
6618		}
6619	}
6620
6621	return ret !== undefined ?
6622
6623		// Support: IE <=9 - 11 only
6624		// IE returns zIndex value as an integer.
6625		ret + "" :
6626		ret;
6627}
6628
6629
6630function addGetHookIf( conditionFn, hookFn ) {
6631
6632	// Define the hook, we'll check on the first run if it's really needed.
6633	return {
6634		get: function() {
6635			if ( conditionFn() ) {
6636
6637				// Hook not needed (or it's not possible to use it due
6638				// to missing dependency), remove it.
6639				delete this.get;
6640				return;
6641			}
6642
6643			// Hook needed; redefine it so that the support test is not executed again.
6644			return ( this.get = hookFn ).apply( this, arguments );
6645		}
6646	};
6647}
6648
6649
6650var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6651	emptyStyle = document.createElement( "div" ).style,
6652	vendorProps = {};
6653
6654// Return a vendor-prefixed property or undefined
6655function vendorPropName( name ) {
6656
6657	// Check for vendor prefixed names
6658	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6659		i = cssPrefixes.length;
6660
6661	while ( i-- ) {
6662		name = cssPrefixes[ i ] + capName;
6663		if ( name in emptyStyle ) {
6664			return name;
6665		}
6666	}
6667}
6668
6669// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6670function finalPropName( name ) {
6671	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6672
6673	if ( final ) {
6674		return final;
6675	}
6676	if ( name in emptyStyle ) {
6677		return name;
6678	}
6679	return vendorProps[ name ] = vendorPropName( name ) || name;
6680}
6681
6682
6683var
6684
6685	// Swappable if display is none or starts with table
6686	// except "table", "table-cell", or "table-caption"
6687	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6688	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6689	rcustomProp = /^--/,
6690	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6691	cssNormalTransform = {
6692		letterSpacing: "0",
6693		fontWeight: "400"
6694	};
6695
6696function setPositiveNumber( _elem, value, subtract ) {
6697
6698	// Any relative (+/-) values have already been
6699	// normalized at this point
6700	var matches = rcssNum.exec( value );
6701	return matches ?
6702
6703		// Guard against undefined "subtract", e.g., when used as in cssHooks
6704		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6705		value;
6706}
6707
6708function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6709	var i = dimension === "width" ? 1 : 0,
6710		extra = 0,
6711		delta = 0;
6712
6713	// Adjustment may not be necessary
6714	if ( box === ( isBorderBox ? "border" : "content" ) ) {
6715		return 0;
6716	}
6717
6718	for ( ; i < 4; i += 2 ) {
6719
6720		// Both box models exclude margin
6721		if ( box === "margin" ) {
6722			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6723		}
6724
6725		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6726		if ( !isBorderBox ) {
6727
6728			// Add padding
6729			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6730
6731			// For "border" or "margin", add border
6732			if ( box !== "padding" ) {
6733				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6734
6735			// But still keep track of it otherwise
6736			} else {
6737				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6738			}
6739
6740		// If we get here with a border-box (content + padding + border), we're seeking "content" or
6741		// "padding" or "margin"
6742		} else {
6743
6744			// For "content", subtract padding
6745			if ( box === "content" ) {
6746				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6747			}
6748
6749			// For "content" or "padding", subtract border
6750			if ( box !== "margin" ) {
6751				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6752			}
6753		}
6754	}
6755
6756	// Account for positive content-box scroll gutter when requested by providing computedVal
6757	if ( !isBorderBox && computedVal >= 0 ) {
6758
6759		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6760		// Assuming integer scroll gutter, subtract the rest and round down
6761		delta += Math.max( 0, Math.ceil(
6762			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6763			computedVal -
6764			delta -
6765			extra -
6766			0.5
6767
6768		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6769		// Use an explicit zero to avoid NaN (gh-3964)
6770		) ) || 0;
6771	}
6772
6773	return delta;
6774}
6775
6776function getWidthOrHeight( elem, dimension, extra ) {
6777
6778	// Start with computed style
6779	var styles = getStyles( elem ),
6780
6781		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6782		// Fake content-box until we know it's needed to know the true value.
6783		boxSizingNeeded = !support.boxSizingReliable() || extra,
6784		isBorderBox = boxSizingNeeded &&
6785			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6786		valueIsBorderBox = isBorderBox,
6787
6788		val = curCSS( elem, dimension, styles ),
6789		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6790
6791	// Support: Firefox <=54
6792	// Return a confounding non-pixel value or feign ignorance, as appropriate.
6793	if ( rnumnonpx.test( val ) ) {
6794		if ( !extra ) {
6795			return val;
6796		}
6797		val = "auto";
6798	}
6799
6800
6801	// Support: IE 9 - 11 only
6802	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
6803	// In those cases, the computed value can be trusted to be border-box.
6804	if ( ( !support.boxSizingReliable() && isBorderBox ||
6805
6806		// Support: IE 10 - 11+, Edge 15 - 18+
6807		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6808		// set in CSS while `offset*` properties report correct values.
6809		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
6810		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6811
6812		// Fall back to offsetWidth/offsetHeight when value is "auto"
6813		// This happens for inline elements with no explicit setting (gh-3571)
6814		val === "auto" ||
6815
6816		// Support: Android <=4.1 - 4.3 only
6817		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6818		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6819
6820		// Make sure the element is visible & connected
6821		elem.getClientRects().length ) {
6822
6823		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6824
6825		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
6826		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6827		// retrieved value as a content box dimension.
6828		valueIsBorderBox = offsetProp in elem;
6829		if ( valueIsBorderBox ) {
6830			val = elem[ offsetProp ];
6831		}
6832	}
6833
6834	// Normalize "" and auto
6835	val = parseFloat( val ) || 0;
6836
6837	// Adjust for the element's box model
6838	return ( val +
6839		boxModelAdjustment(
6840			elem,
6841			dimension,
6842			extra || ( isBorderBox ? "border" : "content" ),
6843			valueIsBorderBox,
6844			styles,
6845
6846			// Provide the current computed size to request scroll gutter calculation (gh-3589)
6847			val
6848		)
6849	) + "px";
6850}
6851
6852jQuery.extend( {
6853
6854	// Add in style property hooks for overriding the default
6855	// behavior of getting and setting a style property
6856	cssHooks: {
6857		opacity: {
6858			get: function( elem, computed ) {
6859				if ( computed ) {
6860
6861					// We should always get a number back from opacity
6862					var ret = curCSS( elem, "opacity" );
6863					return ret === "" ? "1" : ret;
6864				}
6865			}
6866		}
6867	},
6868
6869	// Don't automatically add "px" to these possibly-unitless properties
6870	cssNumber: {
6871		"animationIterationCount": true,
6872		"columnCount": true,
6873		"fillOpacity": true,
6874		"flexGrow": true,
6875		"flexShrink": true,
6876		"fontWeight": true,
6877		"gridArea": true,
6878		"gridColumn": true,
6879		"gridColumnEnd": true,
6880		"gridColumnStart": true,
6881		"gridRow": true,
6882		"gridRowEnd": true,
6883		"gridRowStart": true,
6884		"lineHeight": true,
6885		"opacity": true,
6886		"order": true,
6887		"orphans": true,
6888		"widows": true,
6889		"zIndex": true,
6890		"zoom": true
6891	},
6892
6893	// Add in properties whose names you wish to fix before
6894	// setting or getting the value
6895	cssProps: {},
6896
6897	// Get and set the style property on a DOM Node
6898	style: function( elem, name, value, extra ) {
6899
6900		// Don't set styles on text and comment nodes
6901		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6902			return;
6903		}
6904
6905		// Make sure that we're working with the right name
6906		var ret, type, hooks,
6907			origName = camelCase( name ),
6908			isCustomProp = rcustomProp.test( name ),
6909			style = elem.style;
6910
6911		// Make sure that we're working with the right name. We don't
6912		// want to query the value if it is a CSS custom property
6913		// since they are user-defined.
6914		if ( !isCustomProp ) {
6915			name = finalPropName( origName );
6916		}
6917
6918		// Gets hook for the prefixed version, then unprefixed version
6919		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6920
6921		// Check if we're setting a value
6922		if ( value !== undefined ) {
6923			type = typeof value;
6924
6925			// Convert "+=" or "-=" to relative numbers (#7345)
6926			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6927				value = adjustCSS( elem, name, ret );
6928
6929				// Fixes bug #9237
6930				type = "number";
6931			}
6932
6933			// Make sure that null and NaN values aren't set (#
vendor: 16,824 bytes, lines 6933-7557
69337116)
6934			if ( value == null || value !== value ) {
6935				return;
6936			}
6937
6938			// If a number was passed in, add the unit (except for certain CSS properties)
6939			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6940			// "px" to a few hardcoded values.
6941			if ( type === "number" && !isCustomProp ) {
6942				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6943			}
6944
6945			// background-* props affect original clone's values
6946			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6947				style[ name ] = "inherit";
6948			}
6949
6950			// If a hook was provided, use that value, otherwise just set the specified value
6951			if ( !hooks || !( "set" in hooks ) ||
6952				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6953
6954				if ( isCustomProp ) {
6955					style.setProperty( name, value );
6956				} else {
6957					style[ name ] = value;
6958				}
6959			}
6960
6961		} else {
6962
6963			// If a hook was provided get the non-computed value from there
6964			if ( hooks && "get" in hooks &&
6965				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6966
6967				return ret;
6968			}
6969
6970			// Otherwise just get the value from the style object
6971			return style[ name ];
6972		}
6973	},
6974
6975	css: function( elem, name, extra, styles ) {
6976		var val, num, hooks,
6977			origName = camelCase( name ),
6978			isCustomProp = rcustomProp.test( name );
6979
6980		// Make sure that we're working with the right name. We don't
6981		// want to modify the value if it is a CSS custom property
6982		// since they are user-defined.
6983		if ( !isCustomProp ) {
6984			name = finalPropName( origName );
6985		}
6986
6987		// Try prefixed name followed by the unprefixed name
6988		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6989
6990		// If a hook was provided get the computed value from there
6991		if ( hooks && "get" in hooks ) {
6992			val = hooks.get( elem, true, extra );
6993		}
6994
6995		// Otherwise, if a way to get the computed value exists, use that
6996		if ( val === undefined ) {
6997			val = curCSS( elem, name, styles );
6998		}
6999
7000		// Convert "normal" to computed value
7001		if ( val === "normal" && name in cssNormalTransform ) {
7002			val = cssNormalTransform[ name ];
7003		}
7004
7005		// Make numeric if forced or a qualifier was provided and val looks numeric
7006		if ( extra === "" || extra ) {
7007			num = parseFloat( val );
7008			return extra === true || isFinite( num ) ? num || 0 : val;
7009		}
7010
7011		return val;
7012	}
7013} );
7014
7015jQuery.each( [ "height", "width" ], function( _i, dimension ) {
7016	jQuery.cssHooks[ dimension ] = {
7017		get: function( elem, computed, extra ) {
7018			if ( computed ) {
7019
7020				// Certain elements can have dimension info if we invisibly show them
7021				// but it must have a current display style that would benefit
7022				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
7023
7024					// Support: Safari 8+
7025					// Table columns in Safari have non-zero offsetWidth & zero
7026					// getBoundingClientRect().width unless display is changed.
7027					// Support: IE <=11 only
7028					// Running getBoundingClientRect on a disconnected node
7029					// in IE throws an error.
7030					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
7031					swap( elem, cssShow, function() {
7032						return getWidthOrHeight( elem, dimension, extra );
7033					} ) :
7034					getWidthOrHeight( elem, dimension, extra );
7035			}
7036		},
7037
7038		set: function( elem, value, extra ) {
7039			var matches,
7040				styles = getStyles( elem ),
7041
7042				// Only read styles.position if the test has a chance to fail
7043				// to avoid forcing a reflow.
7044				scrollboxSizeBuggy = !support.scrollboxSize() &&
7045					styles.position === "absolute",
7046
7047				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
7048				boxSizingNeeded = scrollboxSizeBuggy || extra,
7049				isBorderBox = boxSizingNeeded &&
7050					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7051				subtract = extra ?
7052					boxModelAdjustment(
7053						elem,
7054						dimension,
7055						extra,
7056						isBorderBox,
7057						styles
7058					) :
7059					0;
7060
7061			// Account for unreliable border-box dimensions by comparing offset* to computed and
7062			// faking a content-box to get border and padding (gh-3699)
7063			if ( isBorderBox && scrollboxSizeBuggy ) {
7064				subtract -= Math.ceil(
7065					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
7066					parseFloat( styles[ dimension ] ) -
7067					boxModelAdjustment( elem, dimension, "border", false, styles ) -
7068					0.5
7069				);
7070			}
7071
7072			// Convert to pixels if value adjustment is needed
7073			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
7074				( matches[ 3 ] || "px" ) !== "px" ) {
7075
7076				elem.style[ dimension ] = value;
7077				value = jQuery.css( elem, dimension );
7078			}
7079
7080			return setPositiveNumber( elem, value, subtract );
7081		}
7082	};
7083} );
7084
7085jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
7086	function( elem, computed ) {
7087		if ( computed ) {
7088			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
7089				elem.getBoundingClientRect().left -
7090					swap( elem, { marginLeft: 0 }, function() {
7091						return elem.getBoundingClientRect().left;
7092					} )
7093			) + "px";
7094		}
7095	}
7096);
7097
7098// These hooks are used by animate to expand properties
7099jQuery.each( {
7100	margin: "",
7101	padding: "",
7102	border: "Width"
7103}, function( prefix, suffix ) {
7104	jQuery.cssHooks[ prefix + suffix ] = {
7105		expand: function( value ) {
7106			var i = 0,
7107				expanded = {},
7108
7109				// Assumes a single number if not a string
7110				parts = typeof value === "string" ? value.split( " " ) : [ value ];
7111
7112			for ( ; i < 4; i++ ) {
7113				expanded[ prefix + cssExpand[ i ] + suffix ] =
7114					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7115			}
7116
7117			return expanded;
7118		}
7119	};
7120
7121	if ( prefix !== "margin" ) {
7122		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7123	}
7124} );
7125
7126jQuery.fn.extend( {
7127	css: function( name, value ) {
7128		return access( this, function( elem, name, value ) {
7129			var styles, len,
7130				map = {},
7131				i = 0;
7132
7133			if ( Array.isArray( name ) ) {
7134				styles = getStyles( elem );
7135				len = name.length;
7136
7137				for ( ; i < len; i++ ) {
7138					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
7139				}
7140
7141				return map;
7142			}
7143
7144			return value !== undefined ?
7145				jQuery.style( elem, name, value ) :
7146				jQuery.css( elem, name );
7147		}, name, value, arguments.length > 1 );
7148	}
7149} );
7150
7151
7152function Tween( elem, options, prop, end, easing ) {
7153	return new Tween.prototype.init( elem, options, prop, end, easing );
7154}
7155jQuery.Tween = Tween;
7156
7157Tween.prototype = {
7158	constructor: Tween,
7159	init: function( elem, options, prop, end, easing, unit ) {
7160		this.elem = elem;
7161		this.prop = prop;
7162		this.easing = easing || jQuery.easing._default;
7163		this.options = options;
7164		this.start = this.now = this.cur();
7165		this.end = end;
7166		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
7167	},
7168	cur: function() {
7169		var hooks = Tween.propHooks[ this.prop ];
7170
7171		return hooks && hooks.get ?
7172			hooks.get( this ) :
7173			Tween.propHooks._default.get( this );
7174	},
7175	run: function( percent ) {
7176		var eased,
7177			hooks = Tween.propHooks[ this.prop ];
7178
7179		if ( this.options.duration ) {
7180			this.pos = eased = jQuery.easing[ this.easing ](
7181				percent, this.options.duration * percent, 0, 1, this.options.duration
7182			);
7183		} else {
7184			this.pos = eased = percent;
7185		}
7186		this.now = ( this.end - this.start ) * eased + this.start;
7187
7188		if ( this.options.step ) {
7189			this.options.step.call( this.elem, this.now, this );
7190		}
7191
7192		if ( hooks && hooks.set ) {
7193			hooks.set( this );
7194		} else {
7195			Tween.propHooks._default.set( this );
7196		}
7197		return this;
7198	}
7199};
7200
7201Tween.prototype.init.prototype = Tween.prototype;
7202
7203Tween.propHooks = {
7204	_default: {
7205		get: function( tween ) {
7206			var result;
7207
7208			// Use a property on the element directly when it is not a DOM element,
7209			// or when there is no matching style property that exists.
7210			if ( tween.elem.nodeType !== 1 ||
7211				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
7212				return tween.elem[ tween.prop ];
7213			}
7214
7215			// Passing an empty string as a 3rd parameter to .css will automatically
7216			// attempt a parseFloat and fallback to a string if the parse fails.
7217			// Simple values such as "10px" are parsed to Float;
7218			// complex values such as "rotate(1rad)" are returned as-is.
7219			result = jQuery.css( tween.elem, tween.prop, "" );
7220
7221			// Empty strings, null, undefined and "auto" are converted to 0.
7222			return !result || result === "auto" ? 0 : result;
7223		},
7224		set: function( tween ) {
7225
7226			// Use step hook for back compat.
7227			// Use cssHook if its there.
7228			// Use .style if available and use plain properties where available.
7229			if ( jQuery.fx.step[ tween.prop ] ) {
7230				jQuery.fx.step[ tween.prop ]( tween );
7231			} else if ( tween.elem.nodeType === 1 && (
7232				jQuery.cssHooks[ tween.prop ] ||
7233					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
7234				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7235			} else {
7236				tween.elem[ tween.prop ] = tween.now;
7237			}
7238		}
7239	}
7240};
7241
7242// Support: IE <=9 only
7243// Panic based approach to setting things on disconnected nodes
7244Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7245	set: function( tween ) {
7246		if ( tween.elem.nodeType && tween.elem.parentNode ) {
7247			tween.elem[ tween.prop ] = tween.now;
7248		}
7249	}
7250};
7251
7252jQuery.easing = {
7253	linear: function( p ) {
7254		return p;
7255	},
7256	swing: function( p ) {
7257		return 0.5 - Math.cos( p * Math.PI ) / 2;
7258	},
7259	_default: "swing"
7260};
7261
7262jQuery.fx = Tween.prototype.init;
7263
7264// Back compat <1.8 extension point
7265jQuery.fx.step = {};
7266
7267
7268
7269
7270var
7271	fxNow, inProgress,
7272	rfxtypes = /^(?:toggle|show|hide)$/,
7273	rrun = /queueHooks$/;
7274
7275function schedule() {
7276	if ( inProgress ) {
7277		if ( document.hidden === false && window.requestAnimationFrame ) {
7278			window.requestAnimationFrame( schedule );
7279		} else {
7280			window.setTimeout( schedule, jQuery.fx.interval );
7281		}
7282
7283		jQuery.fx.tick();
7284	}
7285}
7286
7287// Animations created synchronously will run synchronously
7288function createFxNow() {
7289	window.setTimeout( function() {
7290		fxNow = undefined;
7291	} );
7292	return ( fxNow = Date.now() );
7293}
7294
7295// Generate parameters to create a standard animation
7296function genFx( type, includeWidth ) {
7297	var which,
7298		i = 0,
7299		attrs = { height: type };
7300
7301	// If we include width, step value is 1 to do all cssExpand values,
7302	// otherwise step value is 2 to skip over Left and Right
7303	includeWidth = includeWidth ? 1 : 0;
7304	for ( ; i < 4; i += 2 - includeWidth ) {
7305		which = cssExpand[ i ];
7306		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7307	}
7308
7309	if ( includeWidth ) {
7310		attrs.opacity = attrs.width = type;
7311	}
7312
7313	return attrs;
7314}
7315
7316function createTween( value, prop, animation ) {
7317	var tween,
7318		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7319		index = 0,
7320		length = collection.length;
7321	for ( ; index < length; index++ ) {
7322		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7323
7324			// We're done with this property
7325			return tween;
7326		}
7327	}
7328}
7329
7330function defaultPrefilter( elem, props, opts ) {
7331	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7332		isBox = "width" in props || "height" in props,
7333		anim = this,
7334		orig = {},
7335		style = elem.style,
7336		hidden = elem.nodeType && isHiddenWithinTree( elem ),
7337		dataShow = dataPriv.get( elem, "fxshow" );
7338
7339	// Queue-skipping animations hijack the fx hooks
7340	if ( !opts.queue ) {
7341		hooks = jQuery._queueHooks( elem, "fx" );
7342		if ( hooks.unqueued == null ) {
7343			hooks.unqueued = 0;
7344			oldfire = hooks.empty.fire;
7345			hooks.empty.fire = function() {
7346				if ( !hooks.unqueued ) {
7347					oldfire();
7348				}
7349			};
7350		}
7351		hooks.unqueued++;
7352
7353		anim.always( function() {
7354
7355			// Ensure the complete handler is called before this completes
7356			anim.always( function() {
7357				hooks.unqueued--;
7358				if ( !jQuery.queue( elem, "fx" ).length ) {
7359					hooks.empty.fire();
7360				}
7361			} );
7362		} );
7363	}
7364
7365	// Detect show/hide animations
7366	for ( prop in props ) {
7367		value = props[ prop ];
7368		if ( rfxtypes.test( value ) ) {
7369			delete props[ prop ];
7370			toggle = toggle || value === "toggle";
7371			if ( value === ( hidden ? "hide" : "show" ) ) {
7372
7373				// Pretend to be hidden if this is a "show" and
7374				// there is still data from a stopped show/hide
7375				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7376					hidden = true;
7377
7378				// Ignore all other no-op show/hide data
7379				} else {
7380					continue;
7381				}
7382			}
7383			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7384		}
7385	}
7386
7387	// Bail out if this is a no-op like .hide().hide()
7388	propTween = !jQuery.isEmptyObject( props );
7389	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7390		return;
7391	}
7392
7393	// Restrict "overflow" and "display" styles during box animations
7394	if ( isBox && elem.nodeType === 1 ) {
7395
7396		// Support: IE <=9 - 11, Edge 12 - 15
7397		// Record all 3 overflow attributes because IE does not infer the shorthand
7398		// from identically-valued overflowX and overflowY and Edge just mirrors
7399		// the overflowX value there.
7400		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7401
7402		// Identify a display type, preferring old show/hide data over the CSS cascade
7403		restoreDisplay = dataShow && dataShow.display;
7404		if ( restoreDisplay == null ) {
7405			restoreDisplay = dataPriv.get( elem, "display" );
7406		}
7407		display = jQuery.css( elem, "display" );
7408		if ( display === "none" ) {
7409			if ( restoreDisplay ) {
7410				display = restoreDisplay;
7411			} else {
7412
7413				// Get nonempty value(s) by temporarily forcing visibility
7414				showHide( [ elem ], true );
7415				restoreDisplay = elem.style.display || restoreDisplay;
7416				display = jQuery.css( elem, "display" );
7417				showHide( [ elem ] );
7418			}
7419		}
7420
7421		// Animate inline elements as inline-block
7422		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7423			if ( jQuery.css( elem, "float" ) === "none" ) {
7424
7425				// Restore the original display value at the end of pure show/hide animations
7426				if ( !propTween ) {
7427					anim.done( function() {
7428						style.display = restoreDisplay;
7429					} );
7430					if ( restoreDisplay == null ) {
7431						display = style.display;
7432						restoreDisplay = display === "none" ? "" : display;
7433					}
7434				}
7435				style.display = "inline-block";
7436			}
7437		}
7438	}
7439
7440	if ( opts.overflow ) {
7441		style.overflow = "hidden";
7442		anim.always( function() {
7443			style.overflow = opts.overflow[ 0 ];
7444			style.overflowX = opts.overflow[ 1 ];
7445			style.overflowY = opts.overflow[ 2 ];
7446		} );
7447	}
7448
7449	// Implement show/hide animations
7450	propTween = false;
7451	for ( prop in orig ) {
7452
7453		// General show/hide setup for this element animation
7454		if ( !propTween ) {
7455			if ( dataShow ) {
7456				if ( "hidden" in dataShow ) {
7457					hidden = dataShow.hidden;
7458				}
7459			} else {
7460				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7461			}
7462
7463			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7464			if ( toggle ) {
7465				dataShow.hidden = !hidden;
7466			}
7467
7468			// Show elements before animating them
7469			if ( hidden ) {
7470				showHide( [ elem ], true );
7471			}
7472
7473			/* eslint-disable no-loop-func */
7474
7475			anim.done( function() {
7476
7477				/* eslint-enable no-loop-func */
7478
7479				// The final step of a "hide" animation is actually hiding the element
7480				if ( !hidden ) {
7481					showHide( [ elem ] );
7482				}
7483				dataPriv.remove( elem, "fxshow" );
7484				for ( prop in orig ) {
7485					jQuery.style( elem, prop, orig[ prop ] );
7486				}
7487			} );
7488		}
7489
7490		// Per-property setup
7491		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7492		if ( !( prop in dataShow ) ) {
7493			dataShow[ prop ] = propTween.start;
7494			if ( hidden ) {
7495				propTween.end = propTween.start;
7496				propTween.start = 0;
7497			}
7498		}
7499	}
7500}
7501
7502function propFilter( props, specialEasing ) {
7503	var index, name, easing, value, hooks;
7504
7505	// camelCase, specialEasing and expand cssHook pass
7506	for ( index in props ) {
7507		name = camelCase( index );
7508		easing = specialEasing[ name ];
7509		value = props[ index ];
7510		if ( Array.isArray( value ) ) {
7511			easing = value[ 1 ];
7512			value = props[ index ] = value[ 0 ];
7513		}
7514
7515		if ( index !== name ) {
7516			props[ name ] = value;
7517			delete props[ index ];
7518		}
7519
7520		hooks = jQuery.cssHooks[ name ];
7521		if ( hooks && "expand" in hooks ) {
7522			value = hooks.expand( value );
7523			delete props[ name ];
7524
7525			// Not quite $.extend, this won't overwrite existing keys.
7526			// Reusing 'index' because we have the correct "name"
7527			for ( index in value ) {
7528				if ( !( index in props ) ) {
7529					props[ index ] = value[ index ];
7530					specialEasing[ index ] = easing;
7531				}
7532			}
7533		} else {
7534			specialEasing[ name ] = easing;
7535		}
7536	}
7537}
7538
7539function Animation( elem, properties, options ) {
7540	var result,
7541		stopped,
7542		index = 0,
7543		length = Animation.prefilters.length,
7544		deferred = jQuery.Deferred().always( function() {
7545
7546			// Don't match elem in the :animated selector
7547			delete tick.elem;
7548		} ),
7549		tick = function() {
7550			if ( stopped ) {
7551				return false;
7552			}
7553			var currentTime = fxNow || createFxNow(),
7554				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7555
7556				// Support: Android 2.3 only
7557				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (
vendor: 9,539 bytes, lines 7557-7947
7557#12497)
7558				temp = remaining / animation.duration || 0,
7559				percent = 1 - temp,
7560				index = 0,
7561				length = animation.tweens.length;
7562
7563			for ( ; index < length; index++ ) {
7564				animation.tweens[ index ].run( percent );
7565			}
7566
7567			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7568
7569			// If there's more to do, yield
7570			if ( percent < 1 && length ) {
7571				return remaining;
7572			}
7573
7574			// If this was an empty animation, synthesize a final progress notification
7575			if ( !length ) {
7576				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7577			}
7578
7579			// Resolve the animation and report its conclusion
7580			deferred.resolveWith( elem, [ animation ] );
7581			return false;
7582		},
7583		animation = deferred.promise( {
7584			elem: elem,
7585			props: jQuery.extend( {}, properties ),
7586			opts: jQuery.extend( true, {
7587				specialEasing: {},
7588				easing: jQuery.easing._default
7589			}, options ),
7590			originalProperties: properties,
7591			originalOptions: options,
7592			startTime: fxNow || createFxNow(),
7593			duration: options.duration,
7594			tweens: [],
7595			createTween: function( prop, end ) {
7596				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7597					animation.opts.specialEasing[ prop ] || animation.opts.easing );
7598				animation.tweens.push( tween );
7599				return tween;
7600			},
7601			stop: function( gotoEnd ) {
7602				var index = 0,
7603
7604					// If we are going to the end, we want to run all the tweens
7605					// otherwise we skip this part
7606					length = gotoEnd ? animation.tweens.length : 0;
7607				if ( stopped ) {
7608					return this;
7609				}
7610				stopped = true;
7611				for ( ; index < length; index++ ) {
7612					animation.tweens[ index ].run( 1 );
7613				}
7614
7615				// Resolve when we played the last frame; otherwise, reject
7616				if ( gotoEnd ) {
7617					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7618					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7619				} else {
7620					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7621				}
7622				return this;
7623			}
7624		} ),
7625		props = animation.props;
7626
7627	propFilter( props, animation.opts.specialEasing );
7628
7629	for ( ; index < length; index++ ) {
7630		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7631		if ( result ) {
7632			if ( isFunction( result.stop ) ) {
7633				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7634					result.stop.bind( result );
7635			}
7636			return result;
7637		}
7638	}
7639
7640	jQuery.map( props, createTween, animation );
7641
7642	if ( isFunction( animation.opts.start ) ) {
7643		animation.opts.start.call( elem, animation );
7644	}
7645
7646	// Attach callbacks from options
7647	animation
7648		.progress( animation.opts.progress )
7649		.done( animation.opts.done, animation.opts.complete )
7650		.fail( animation.opts.fail )
7651		.always( animation.opts.always );
7652
7653	jQuery.fx.timer(
7654		jQuery.extend( tick, {
7655			elem: elem,
7656			anim: animation,
7657			queue: animation.opts.queue
7658		} )
7659	);
7660
7661	return animation;
7662}
7663
7664jQuery.Animation = jQuery.extend( Animation, {
7665
7666	tweeners: {
7667		"*": [ function( prop, value ) {
7668			var tween = this.createTween( prop, value );
7669			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7670			return tween;
7671		} ]
7672	},
7673
7674	tweener: function( props, callback ) {
7675		if ( isFunction( props ) ) {
7676			callback = props;
7677			props = [ "*" ];
7678		} else {
7679			props = props.match( rnothtmlwhite );
7680		}
7681
7682		var prop,
7683			index = 0,
7684			length = props.length;
7685
7686		for ( ; index < length; index++ ) {
7687			prop = props[ index ];
7688			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7689			Animation.tweeners[ prop ].unshift( callback );
7690		}
7691	},
7692
7693	prefilters: [ defaultPrefilter ],
7694
7695	prefilter: function( callback, prepend ) {
7696		if ( prepend ) {
7697			Animation.prefilters.unshift( callback );
7698		} else {
7699			Animation.prefilters.push( callback );
7700		}
7701	}
7702} );
7703
7704jQuery.speed = function( speed, easing, fn ) {
7705	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7706		complete: fn || !fn && easing ||
7707			isFunction( speed ) && speed,
7708		duration: speed,
7709		easing: fn && easing || easing && !isFunction( easing ) && easing
7710	};
7711
7712	// Go to the end state if fx are off
7713	if ( jQuery.fx.off ) {
7714		opt.duration = 0;
7715
7716	} else {
7717		if ( typeof opt.duration !== "number" ) {
7718			if ( opt.duration in jQuery.fx.speeds ) {
7719				opt.duration = jQuery.fx.speeds[ opt.duration ];
7720
7721			} else {
7722				opt.duration = jQuery.fx.speeds._default;
7723			}
7724		}
7725	}
7726
7727	// Normalize opt.queue - true/undefined/null -> "fx"
7728	if ( opt.queue == null || opt.queue === true ) {
7729		opt.queue = "fx";
7730	}
7731
7732	// Queueing
7733	opt.old = opt.complete;
7734
7735	opt.complete = function() {
7736		if ( isFunction( opt.old ) ) {
7737			opt.old.call( this );
7738		}
7739
7740		if ( opt.queue ) {
7741			jQuery.dequeue( this, opt.queue );
7742		}
7743	};
7744
7745	return opt;
7746};
7747
7748jQuery.fn.extend( {
7749	fadeTo: function( speed, to, easing, callback ) {
7750
7751		// Show any hidden elements after setting opacity to 0
7752		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7753
7754			// Animate to the value specified
7755			.end().animate( { opacity: to }, speed, easing, callback );
7756	},
7757	animate: function( prop, speed, easing, callback ) {
7758		var empty = jQuery.isEmptyObject( prop ),
7759			optall = jQuery.speed( speed, easing, callback ),
7760			doAnimation = function() {
7761
7762				// Operate on a copy of prop so per-property easing won't be lost
7763				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7764
7765				// Empty animations, or finishing resolves immediately
7766				if ( empty || dataPriv.get( this, "finish" ) ) {
7767					anim.stop( true );
7768				}
7769			};
7770
7771		doAnimation.finish = doAnimation;
7772
7773		return empty || optall.queue === false ?
7774			this.each( doAnimation ) :
7775			this.queue( optall.queue, doAnimation );
7776	},
7777	stop: function( type, clearQueue, gotoEnd ) {
7778		var stopQueue = function( hooks ) {
7779			var stop = hooks.stop;
7780			delete hooks.stop;
7781			stop( gotoEnd );
7782		};
7783
7784		if ( typeof type !== "string" ) {
7785			gotoEnd = clearQueue;
7786			clearQueue = type;
7787			type = undefined;
7788		}
7789		if ( clearQueue ) {
7790			this.queue( type || "fx", [] );
7791		}
7792
7793		return this.each( function() {
7794			var dequeue = true,
7795				index = type != null && type + "queueHooks",
7796				timers = jQuery.timers,
7797				data = dataPriv.get( this );
7798
7799			if ( index ) {
7800				if ( data[ index ] && data[ index ].stop ) {
7801					stopQueue( data[ index ] );
7802				}
7803			} else {
7804				for ( index in data ) {
7805					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7806						stopQueue( data[ index ] );
7807					}
7808				}
7809			}
7810
7811			for ( index = timers.length; index--; ) {
7812				if ( timers[ index ].elem === this &&
7813					( type == null || timers[ index ].queue === type ) ) {
7814
7815					timers[ index ].anim.stop( gotoEnd );
7816					dequeue = false;
7817					timers.splice( index, 1 );
7818				}
7819			}
7820
7821			// Start the next in the queue if the last step wasn't forced.
7822			// Timers currently will call their complete callbacks, which
7823			// will dequeue but only if they were gotoEnd.
7824			if ( dequeue || !gotoEnd ) {
7825				jQuery.dequeue( this, type );
7826			}
7827		} );
7828	},
7829	finish: function( type ) {
7830		if ( type !== false ) {
7831			type = type || "fx";
7832		}
7833		return this.each( function() {
7834			var index,
7835				data = dataPriv.get( this ),
7836				queue = data[ type + "queue" ],
7837				hooks = data[ type + "queueHooks" ],
7838				timers = jQuery.timers,
7839				length = queue ? queue.length : 0;
7840
7841			// Enable finishing flag on private data
7842			data.finish = true;
7843
7844			// Empty the queue first
7845			jQuery.queue( this, type, [] );
7846
7847			if ( hooks && hooks.stop ) {
7848				hooks.stop.call( this, true );
7849			}
7850
7851			// Look for any active animations, and finish them
7852			for ( index = timers.length; index--; ) {
7853				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7854					timers[ index ].anim.stop( true );
7855					timers.splice( index, 1 );
7856				}
7857			}
7858
7859			// Look for any animations in the old queue and finish them
7860			for ( index = 0; index < length; index++ ) {
7861				if ( queue[ index ] && queue[ index ].finish ) {
7862					queue[ index ].finish.call( this );
7863				}
7864			}
7865
7866			// Turn off finishing flag
7867			delete data.finish;
7868		} );
7869	}
7870} );
7871
7872jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7873	var cssFn = jQuery.fn[ name ];
7874	jQuery.fn[ name ] = function( speed, easing, callback ) {
7875		return speed == null || typeof speed === "boolean" ?
7876			cssFn.apply( this, arguments ) :
7877			this.animate( genFx( name, true ), speed, easing, callback );
7878	};
7879} );
7880
7881// Generate shortcuts for custom animations
7882jQuery.each( {
7883	slideDown: genFx( "show" ),
7884	slideUp: genFx( "hide" ),
7885	slideToggle: genFx( "toggle" ),
7886	fadeIn: { opacity: "show" },
7887	fadeOut: { opacity: "hide" },
7888	fadeToggle: { opacity: "toggle" }
7889}, function( name, props ) {
7890	jQuery.fn[ name ] = function( speed, easing, callback ) {
7891		return this.animate( props, speed, easing, callback );
7892	};
7893} );
7894
7895jQuery.timers = [];
7896jQuery.fx.tick = function() {
7897	var timer,
7898		i = 0,
7899		timers = jQuery.timers;
7900
7901	fxNow = Date.now();
7902
7903	for ( ; i < timers.length; i++ ) {
7904		timer = timers[ i ];
7905
7906		// Run the timer and safely remove it when done (allowing for external removal)
7907		if ( !timer() && timers[ i ] === timer ) {
7908			timers.splice( i--, 1 );
7909		}
7910	}
7911
7912	if ( !timers.length ) {
7913		jQuery.fx.stop();
7914	}
7915	fxNow = undefined;
7916};
7917
7918jQuery.fx.timer = function( timer ) {
7919	jQuery.timers.push( timer );
7920	jQuery.fx.start();
7921};
7922
7923jQuery.fx.interval = 13;
7924jQuery.fx.start = function() {
7925	if ( inProgress ) {
7926		return;
7927	}
7928
7929	inProgress = true;
7930	schedule();
7931};
7932
7933jQuery.fx.stop = function() {
7934	inProgress = null;
7935};
7936
7937jQuery.fx.speeds = {
7938	slow: 600,
7939	fast: 200,
7940
7941	// Default speed
7942	_default: 400
7943};
7944
7945
7946// Based off of the plugin by Clint Helfers, with permission.
7947// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
vendor: 5,321 bytes, lines 7947-8172
7947
7948jQuery.fn.delay = function( time, type ) {
7949	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7950	type = type || "fx";
7951
7952	return this.queue( type, function( next, hooks ) {
7953		var timeout = window.setTimeout( next, time );
7954		hooks.stop = function() {
7955			window.clearTimeout( timeout );
7956		};
7957	} );
7958};
7959
7960
7961( function() {
7962	var input = document.createElement( "input" ),
7963		select = document.createElement( "select" ),
7964		opt = select.appendChild( document.createElement( "option" ) );
7965
7966	input.type = "checkbox";
7967
7968	// Support: Android <=4.3 only
7969	// Default value for a checkbox should be "on"
7970	support.checkOn = input.value !== "";
7971
7972	// Support: IE <=11 only
7973	// Must access selectedIndex to make default options select
7974	support.optSelected = opt.selected;
7975
7976	// Support: IE <=11 only
7977	// An input loses its value after becoming a radio
7978	input = document.createElement( "input" );
7979	input.value = "t";
7980	input.type = "radio";
7981	support.radioValue = input.value === "t";
7982} )();
7983
7984
7985var boolHook,
7986	attrHandle = jQuery.expr.attrHandle;
7987
7988jQuery.fn.extend( {
7989	attr: function( name, value ) {
7990		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7991	},
7992
7993	removeAttr: function( name ) {
7994		return this.each( function() {
7995			jQuery.removeAttr( this, name );
7996		} );
7997	}
7998} );
7999
8000jQuery.extend( {
8001	attr: function( elem, name, value ) {
8002		var ret, hooks,
8003			nType = elem.nodeType;
8004
8005		// Don't get/set attributes on text, comment and attribute nodes
8006		if ( nType === 3 || nType === 8 || nType === 2 ) {
8007			return;
8008		}
8009
8010		// Fallback to prop when attributes are not supported
8011		if ( typeof elem.getAttribute === "undefined" ) {
8012			return jQuery.prop( elem, name, value );
8013		}
8014
8015		// Attribute hooks are determined by the lowercase version
8016		// Grab necessary hook if one is defined
8017		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8018			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
8019				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
8020		}
8021
8022		if ( value !== undefined ) {
8023			if ( value === null ) {
8024				jQuery.removeAttr( elem, name );
8025				return;
8026			}
8027
8028			if ( hooks && "set" in hooks &&
8029				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8030				return ret;
8031			}
8032
8033			elem.setAttribute( name, value + "" );
8034			return value;
8035		}
8036
8037		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8038			return ret;
8039		}
8040
8041		ret = jQuery.find.attr( elem, name );
8042
8043		// Non-existent attributes return null, we normalize to undefined
8044		return ret == null ? undefined : ret;
8045	},
8046
8047	attrHooks: {
8048		type: {
8049			set: function( elem, value ) {
8050				if ( !support.radioValue && value === "radio" &&
8051					nodeName( elem, "input" ) ) {
8052					var val = elem.value;
8053					elem.setAttribute( "type", value );
8054					if ( val ) {
8055						elem.value = val;
8056					}
8057					return value;
8058				}
8059			}
8060		}
8061	},
8062
8063	removeAttr: function( elem, value ) {
8064		var name,
8065			i = 0,
8066
8067			// Attribute names can contain non-HTML whitespace characters
8068			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
8069			attrNames = value && value.match( rnothtmlwhite );
8070
8071		if ( attrNames && elem.nodeType === 1 ) {
8072			while ( ( name = attrNames[ i++ ] ) ) {
8073				elem.removeAttribute( name );
8074			}
8075		}
8076	}
8077} );
8078
8079// Hooks for boolean attributes
8080boolHook = {
8081	set: function( elem, value, name ) {
8082		if ( value === false ) {
8083
8084			// Remove boolean attributes when set to false
8085			jQuery.removeAttr( elem, name );
8086		} else {
8087			elem.setAttribute( name, name );
8088		}
8089		return name;
8090	}
8091};
8092
8093jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
8094	var getter = attrHandle[ name ] || jQuery.find.attr;
8095
8096	attrHandle[ name ] = function( elem, name, isXML ) {
8097		var ret, handle,
8098			lowercaseName = name.toLowerCase();
8099
8100		if ( !isXML ) {
8101
8102			// Avoid an infinite loop by temporarily removing this function from the getter
8103			handle = attrHandle[ lowercaseName ];
8104			attrHandle[ lowercaseName ] = ret;
8105			ret = getter( elem, name, isXML ) != null ?
8106				lowercaseName :
8107				null;
8108			attrHandle[ lowercaseName ] = handle;
8109		}
8110		return ret;
8111	};
8112} );
8113
8114
8115
8116
8117var rfocusable = /^(?:input|select|textarea|button)$/i,
8118	rclickable = /^(?:a|area)$/i;
8119
8120jQuery.fn.extend( {
8121	prop: function( name, value ) {
8122		return access( this, jQuery.prop, name, value, arguments.length > 1 );
8123	},
8124
8125	removeProp: function( name ) {
8126		return this.each( function() {
8127			delete this[ jQuery.propFix[ name ] || name ];
8128		} );
8129	}
8130} );
8131
8132jQuery.extend( {
8133	prop: function( elem, name, value ) {
8134		var ret, hooks,
8135			nType = elem.nodeType;
8136
8137		// Don't get/set properties on text, comment and attribute nodes
8138		if ( nType === 3 || nType === 8 || nType === 2 ) {
8139			return;
8140		}
8141
8142		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8143
8144			// Fix name and attach hooks
8145			name = jQuery.propFix[ name ] || name;
8146			hooks = jQuery.propHooks[ name ];
8147		}
8148
8149		if ( value !== undefined ) {
8150			if ( hooks && "set" in hooks &&
8151				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8152				return ret;
8153			}
8154
8155			return ( elem[ name ] = value );
8156		}
8157
8158		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8159			return ret;
8160		}
8161
8162		return elem[ name ];
8163	},
8164
8165	propHooks: {
8166		tabIndex: {
8167			get: function( elem ) {
8168
8169				// Support: IE <=9 - 11 only
8170				// elem.tabIndex doesn't always return the
8171				// correct value when it hasn't been explicitly set
8172				// 
vendor: 4,831 bytes, lines 8172-8385
8172https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8173				// Use proper attribute retrieval(#12072)
8174				var tabindex = jQuery.find.attr( elem, "tabindex" );
8175
8176				if ( tabindex ) {
8177					return parseInt( tabindex, 10 );
8178				}
8179
8180				if (
8181					rfocusable.test( elem.nodeName ) ||
8182					rclickable.test( elem.nodeName ) &&
8183					elem.href
8184				) {
8185					return 0;
8186				}
8187
8188				return -1;
8189			}
8190		}
8191	},
8192
8193	propFix: {
8194		"for": "htmlFor",
8195		"class": "className"
8196	}
8197} );
8198
8199// Support: IE <=11 only
8200// Accessing the selectedIndex property
8201// forces the browser to respect setting selected
8202// on the option
8203// The getter ensures a default option is selected
8204// when in an optgroup
8205// eslint rule "no-unused-expressions" is disabled for this code
8206// since it considers such accessions noop
8207if ( !support.optSelected ) {
8208	jQuery.propHooks.selected = {
8209		get: function( elem ) {
8210
8211			/* eslint no-unused-expressions: "off" */
8212
8213			var parent = elem.parentNode;
8214			if ( parent && parent.parentNode ) {
8215				parent.parentNode.selectedIndex;
8216			}
8217			return null;
8218		},
8219		set: function( elem ) {
8220
8221			/* eslint no-unused-expressions: "off" */
8222
8223			var parent = elem.parentNode;
8224			if ( parent ) {
8225				parent.selectedIndex;
8226
8227				if ( parent.parentNode ) {
8228					parent.parentNode.selectedIndex;
8229				}
8230			}
8231		}
8232	};
8233}
8234
8235jQuery.each( [
8236	"tabIndex",
8237	"readOnly",
8238	"maxLength",
8239	"cellSpacing",
8240	"cellPadding",
8241	"rowSpan",
8242	"colSpan",
8243	"useMap",
8244	"frameBorder",
8245	"contentEditable"
8246], function() {
8247	jQuery.propFix[ this.toLowerCase() ] = this;
8248} );
8249
8250
8251
8252
8253	// Strip and collapse whitespace according to HTML spec
8254	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8255	function stripAndCollapse( value ) {
8256		var tokens = value.match( rnothtmlwhite ) || [];
8257		return tokens.join( " " );
8258	}
8259
8260
8261function getClass( elem ) {
8262	return elem.getAttribute && elem.getAttribute( "class" ) || "";
8263}
8264
8265function classesToArray( value ) {
8266	if ( Array.isArray( value ) ) {
8267		return value;
8268	}
8269	if ( typeof value === "string" ) {
8270		return value.match( rnothtmlwhite ) || [];
8271	}
8272	return [];
8273}
8274
8275jQuery.fn.extend( {
8276	addClass: function( value ) {
8277		var classes, elem, cur, curValue, clazz, j, finalValue,
8278			i = 0;
8279
8280		if ( isFunction( value ) ) {
8281			return this.each( function( j ) {
8282				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8283			} );
8284		}
8285
8286		classes = classesToArray( value );
8287
8288		if ( classes.length ) {
8289			while ( ( elem = this[ i++ ] ) ) {
8290				curValue = getClass( elem );
8291				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8292
8293				if ( cur ) {
8294					j = 0;
8295					while ( ( clazz = classes[ j++ ] ) ) {
8296						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8297							cur += clazz + " ";
8298						}
8299					}
8300
8301					// Only assign if different to avoid unneeded rendering.
8302					finalValue = stripAndCollapse( cur );
8303					if ( curValue !== finalValue ) {
8304						elem.setAttribute( "class", finalValue );
8305					}
8306				}
8307			}
8308		}
8309
8310		return this;
8311	},
8312
8313	removeClass: function( value ) {
8314		var classes, elem, cur, curValue, clazz, j, finalValue,
8315			i = 0;
8316
8317		if ( isFunction( value ) ) {
8318			return this.each( function( j ) {
8319				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8320			} );
8321		}
8322
8323		if ( !arguments.length ) {
8324			return this.attr( "class", "" );
8325		}
8326
8327		classes = classesToArray( value );
8328
8329		if ( classes.length ) {
8330			while ( ( elem = this[ i++ ] ) ) {
8331				curValue = getClass( elem );
8332
8333				// This expression is here for better compressibility (see addClass)
8334				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8335
8336				if ( cur ) {
8337					j = 0;
8338					while ( ( clazz = classes[ j++ ] ) ) {
8339
8340						// Remove *all* instances
8341						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8342							cur = cur.replace( " " + clazz + " ", " " );
8343						}
8344					}
8345
8346					// Only assign if different to avoid unneeded rendering.
8347					finalValue = stripAndCollapse( cur );
8348					if ( curValue !== finalValue ) {
8349						elem.setAttribute( "class", finalValue );
8350					}
8351				}
8352			}
8353		}
8354
8355		return this;
8356	},
8357
8358	toggleClass: function( value, stateVal ) {
8359		var type = typeof value,
8360			isValidValue = type === "string" || Array.isArray( value );
8361
8362		if ( typeof stateVal === "boolean" && isValidValue ) {
8363			return stateVal ? this.addClass( value ) : this.removeClass( value );
8364		}
8365
8366		if ( isFunction( value ) ) {
8367			return this.each( function( i ) {
8368				jQuery( this ).toggleClass(
8369					value.call( this, i, getClass( this ), stateVal ),
8370					stateVal
8371				);
8372			} );
8373		}
8374
8375		return this.each( function() {
8376			var className, i, self, classNames;
8377
8378			if ( isValidValue ) {
8379
8380				// Toggle individual class names
8381				i = 0;
8382				self = jQuery( this );
8383				classNames = classesToArray( value );
8384
8385				while ( ( className = classNames[ i++ ] ) ) {
vendor: 2,605 bytes, lines 8385-8501
8385
8386
8387					// Check each className given, space separated list
8388					if ( self.hasClass( className ) ) {
8389						self.removeClass( className );
8390					} else {
8391						self.addClass( className );
8392					}
8393				}
8394
8395			// Toggle whole class name
8396			} else if ( value === undefined || type === "boolean" ) {
8397				className = getClass( this );
8398				if ( className ) {
8399
8400					// Store className if set
8401					dataPriv.set( this, "__className__", className );
8402				}
8403
8404				// If the element has a class name or if we're passed `false`,
8405				// then remove the whole classname (if there was one, the above saved it).
8406				// Otherwise bring back whatever was previously saved (if anything),
8407				// falling back to the empty string if nothing was stored.
8408				if ( this.setAttribute ) {
8409					this.setAttribute( "class",
8410						className || value === false ?
8411							"" :
8412							dataPriv.get( this, "__className__" ) || ""
8413					);
8414				}
8415			}
8416		} );
8417	},
8418
8419	hasClass: function( selector ) {
8420		var className, elem,
8421			i = 0;
8422
8423		className = " " + selector + " ";
8424		while ( ( elem = this[ i++ ] ) ) {
8425			if ( elem.nodeType === 1 &&
8426				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8427				return true;
8428			}
8429		}
8430
8431		return false;
8432	}
8433} );
8434
8435
8436
8437
8438var rreturn = /\r/g;
8439
8440jQuery.fn.extend( {
8441	val: function( value ) {
8442		var hooks, ret, valueIsFunction,
8443			elem = this[ 0 ];
8444
8445		if ( !arguments.length ) {
8446			if ( elem ) {
8447				hooks = jQuery.valHooks[ elem.type ] ||
8448					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8449
8450				if ( hooks &&
8451					"get" in hooks &&
8452					( ret = hooks.get( elem, "value" ) ) !== undefined
8453				) {
8454					return ret;
8455				}
8456
8457				ret = elem.value;
8458
8459				// Handle most common string cases
8460				if ( typeof ret === "string" ) {
8461					return ret.replace( rreturn, "" );
8462				}
8463
8464				// Handle cases where value is null/undef or number
8465				return ret == null ? "" : ret;
8466			}
8467
8468			return;
8469		}
8470
8471		valueIsFunction = isFunction( value );
8472
8473		return this.each( function( i ) {
8474			var val;
8475
8476			if ( this.nodeType !== 1 ) {
8477				return;
8478			}
8479
8480			if ( valueIsFunction ) {
8481				val = value.call( this, i, jQuery( this ).val() );
8482			} else {
8483				val = value;
8484			}
8485
8486			// Treat null/undefined as ""; convert numbers to string
8487			if ( val == null ) {
8488				val = "";
8489
8490			} else if ( typeof val === "number" ) {
8491				val += "";
8492
8493			} else if ( Array.isArray( val ) ) {
8494				val = jQuery.map( val, function( value ) {
8495					return value == null ? "" : value + "";
8496				} );
8497			}
8498
8499			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8500
8501			// If set returns undefined, fall back to normal setting
vendor: 5,740 bytes, lines 8502-8717
8502			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8503				this.value = val;
8504			}
8505		} );
8506	}
8507} );
8508
8509jQuery.extend( {
8510	valHooks: {
8511		option: {
8512			get: function( elem ) {
8513
8514				var val = jQuery.find.attr( elem, "value" );
8515				return val != null ?
8516					val :
8517
8518					// Support: IE <=10 - 11 only
8519					// option.text throws exceptions (#14686, #14858)
8520					// Strip and collapse whitespace
8521					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8522					stripAndCollapse( jQuery.text( elem ) );
8523			}
8524		},
8525		select: {
8526			get: function( elem ) {
8527				var value, option, i,
8528					options = elem.options,
8529					index = elem.selectedIndex,
8530					one = elem.type === "select-one",
8531					values = one ? null : [],
8532					max = one ? index + 1 : options.length;
8533
8534				if ( index < 0 ) {
8535					i = max;
8536
8537				} else {
8538					i = one ? index : 0;
8539				}
8540
8541				// Loop through all the selected options
8542				for ( ; i < max; i++ ) {
8543					option = options[ i ];
8544
8545					// Support: IE <=9 only
8546					// IE8-9 doesn't update selected after form reset (#2551)
8547					if ( ( option.selected || i === index ) &&
8548
8549							// Don't return options that are disabled or in a disabled optgroup
8550							!option.disabled &&
8551							( !option.parentNode.disabled ||
8552								!nodeName( option.parentNode, "optgroup" ) ) ) {
8553
8554						// Get the specific value for the option
8555						value = jQuery( option ).val();
8556
8557						// We don't need an array for one selects
8558						if ( one ) {
8559							return value;
8560						}
8561
8562						// Multi-Selects return an array
8563						values.push( value );
8564					}
8565				}
8566
8567				return values;
8568			},
8569
8570			set: function( elem, value ) {
8571				var optionSet, option,
8572					options = elem.options,
8573					values = jQuery.makeArray( value ),
8574					i = options.length;
8575
8576				while ( i-- ) {
8577					option = options[ i ];
8578
8579					/* eslint-disable no-cond-assign */
8580
8581					if ( option.selected =
8582						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8583					) {
8584						optionSet = true;
8585					}
8586
8587					/* eslint-enable no-cond-assign */
8588				}
8589
8590				// Force browsers to behave consistently when non-matching value is set
8591				if ( !optionSet ) {
8592					elem.selectedIndex = -1;
8593				}
8594				return values;
8595			}
8596		}
8597	}
8598} );
8599
8600// Radios and checkboxes getter/setter
8601jQuery.each( [ "radio", "checkbox" ], function() {
8602	jQuery.valHooks[ this ] = {
8603		set: function( elem, value ) {
8604			if ( Array.isArray( value ) ) {
8605				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8606			}
8607		}
8608	};
8609	if ( !support.checkOn ) {
8610		jQuery.valHooks[ this ].get = function( elem ) {
8611			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8612		};
8613	}
8614} );
8615
8616
8617
8618
8619// Return jQuery for attributes-only inclusion
8620
8621
8622support.focusin = "onfocusin" in window;
8623
8624
8625var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8626	stopPropagationCallback = function( e ) {
8627		e.stopPropagation();
8628	};
8629
8630jQuery.extend( jQuery.event, {
8631
8632	trigger: function( event, data, elem, onlyHandlers ) {
8633
8634		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8635			eventPath = [ elem || document ],
8636			type = hasOwn.call( event, "type" ) ? event.type : event,
8637			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8638
8639		cur = lastElement = tmp = elem = elem || document;
8640
8641		// Don't do events on text and comment nodes
8642		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8643			return;
8644		}
8645
8646		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8647		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8648			return;
8649		}
8650
8651		if ( type.indexOf( "." ) > -1 ) {
8652
8653			// Namespaced trigger; create a regexp to match event type in handle()
8654			namespaces = type.split( "." );
8655			type = namespaces.shift();
8656			namespaces.sort();
8657		}
8658		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8659
8660		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8661		event = event[ jQuery.expando ] ?
8662			event :
8663			new jQuery.Event( type, typeof event === "object" && event );
8664
8665		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8666		event.isTrigger = onlyHandlers ? 2 : 3;
8667		event.namespace = namespaces.join( "." );
8668		event.rnamespace = event.namespace ?
8669			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8670			null;
8671
8672		// Clean up the event in case it is being reused
8673		event.result = undefined;
8674		if ( !event.target ) {
8675			event.target = elem;
8676		}
8677
8678		// Clone any incoming data and prepend the event, creating the handler arg list
8679		data = data == null ?
8680			[ event ] :
8681			jQuery.makeArray( data, [ event ] );
8682
8683		// Allow special events to draw outside the lines
8684		special = jQuery.event.special[ type ] || {};
8685		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8686			return;
8687		}
8688
8689		// Determine event propagation path in advance, per W3C events spec (#9951)
8690		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8691		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8692
8693			bubbleType = special.delegateType || type;
8694			if ( !rfocusMorph.test( bubbleType + type ) ) {
8695				cur = cur.parentNode;
8696			}
8697			for ( ; cur; cur = cur.parentNode ) {
8698				eventPath.push( cur );
8699				tmp = cur;
8700			}
8701
8702			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8703			if ( tmp === ( elem.ownerDocument || document ) ) {
8704				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8705			}
8706		}
8707
8708		// Fire handlers on the event path
8709		i = 0;
8710		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8711			lastElement = cur;
8712			event.type = i > 1 ?
8713				bubbleType :
8714				special.bindType || type;
8715
8716			// jQuery handler
8717			handle = ( dataPriv.get( cur, "events" ) || 
vendor: 11,690 bytes, lines 8717-9159
8717Object.create( null ) )[ event.type ] &&
8718				dataPriv.get( cur, "handle" );
8719			if ( handle ) {
8720				handle.apply( cur, data );
8721			}
8722
8723			// Native handler
8724			handle = ontype && cur[ ontype ];
8725			if ( handle && handle.apply && acceptData( cur ) ) {
8726				event.result = handle.apply( cur, data );
8727				if ( event.result === false ) {
8728					event.preventDefault();
8729				}
8730			}
8731		}
8732		event.type = type;
8733
8734		// If nobody prevented the default action, do it now
8735		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8736
8737			if ( ( !special._default ||
8738				special._default.apply( eventPath.pop(), data ) === false ) &&
8739				acceptData( elem ) ) {
8740
8741				// Call a native DOM method on the target with the same name as the event.
8742				// Don't do default actions on window, that's where global variables be (#6170)
8743				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8744
8745					// Don't re-trigger an onFOO event when we call its FOO() method
8746					tmp = elem[ ontype ];
8747
8748					if ( tmp ) {
8749						elem[ ontype ] = null;
8750					}
8751
8752					// Prevent re-triggering of the same event, since we already bubbled it above
8753					jQuery.event.triggered = type;
8754
8755					if ( event.isPropagationStopped() ) {
8756						lastElement.addEventListener( type, stopPropagationCallback );
8757					}
8758
8759					elem[ type ]();
8760
8761					if ( event.isPropagationStopped() ) {
8762						lastElement.removeEventListener( type, stopPropagationCallback );
8763					}
8764
8765					jQuery.event.triggered = undefined;
8766
8767					if ( tmp ) {
8768						elem[ ontype ] = tmp;
8769					}
8770				}
8771			}
8772		}
8773
8774		return event.result;
8775	},
8776
8777	// Piggyback on a donor event to simulate a different one
8778	// Used only for `focus(in | out)` events
8779	simulate: function( type, elem, event ) {
8780		var e = jQuery.extend(
8781			new jQuery.Event(),
8782			event,
8783			{
8784				type: type,
8785				isSimulated: true
8786			}
8787		);
8788
8789		jQuery.event.trigger( e, null, elem );
8790	}
8791
8792} );
8793
8794jQuery.fn.extend( {
8795
8796	trigger: function( type, data ) {
8797		return this.each( function() {
8798			jQuery.event.trigger( type, data, this );
8799		} );
8800	},
8801	triggerHandler: function( type, data ) {
8802		var elem = this[ 0 ];
8803		if ( elem ) {
8804			return jQuery.event.trigger( type, data, elem, true );
8805		}
8806	}
8807} );
8808
8809
8810// Support: Firefox <=44
8811// Firefox doesn't have focus(in | out) events
8812// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8813//
8814// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8815// focus(in | out) events fire after focus & blur events,
8816// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8817// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8818if ( !support.focusin ) {
8819	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8820
8821		// Attach a single capturing handler on the document while someone wants focusin/focusout
8822		var handler = function( event ) {
8823			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8824		};
8825
8826		jQuery.event.special[ fix ] = {
8827			setup: function() {
8828
8829				// Handle: regular nodes (via `this.ownerDocument`), window
8830				// (via `this.document`) & document (via `this`).
8831				var doc = this.ownerDocument || this.document || this,
8832					attaches = dataPriv.access( doc, fix );
8833
8834				if ( !attaches ) {
8835					doc.addEventListener( orig, handler, true );
8836				}
8837				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8838			},
8839			teardown: function() {
8840				var doc = this.ownerDocument || this.document || this,
8841					attaches = dataPriv.access( doc, fix ) - 1;
8842
8843				if ( !attaches ) {
8844					doc.removeEventListener( orig, handler, true );
8845					dataPriv.remove( doc, fix );
8846
8847				} else {
8848					dataPriv.access( doc, fix, attaches );
8849				}
8850			}
8851		};
8852	} );
8853}
8854var location = window.location;
8855
8856var nonce = { guid: Date.now() };
8857
8858var rquery = ( /\?/ );
8859
8860
8861
8862// Cross-browser xml parsing
8863jQuery.parseXML = function( data ) {
8864	var xml, parserErrorElem;
8865	if ( !data || typeof data !== "string" ) {
8866		return null;
8867	}
8868
8869	// Support: IE 9 - 11 only
8870	// IE throws on parseFromString with invalid input.
8871	try {
8872		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8873	} catch ( e ) {}
8874
8875	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8876	if ( !xml || parserErrorElem ) {
8877		jQuery.error( "Invalid XML: " + (
8878			parserErrorElem ?
8879				jQuery.map( parserErrorElem.childNodes, function( el ) {
8880					return el.textContent;
8881				} ).join( "\n" ) :
8882				data
8883		) );
8884	}
8885	return xml;
8886};
8887
8888
8889var
8890	rbracket = /\[\]$/,
8891	rCRLF = /\r?\n/g,
8892	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8893	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8894
8895function buildParams( prefix, obj, traditional, add ) {
8896	var name;
8897
8898	if ( Array.isArray( obj ) ) {
8899
8900		// Serialize array item.
8901		jQuery.each( obj, function( i, v ) {
8902			if ( traditional || rbracket.test( prefix ) ) {
8903
8904				// Treat each array item as a scalar.
8905				add( prefix, v );
8906
8907			} else {
8908
8909				// Item is non-scalar (array or object), encode its numeric index.
8910				buildParams(
8911					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8912					v,
8913					traditional,
8914					add
8915				);
8916			}
8917		} );
8918
8919	} else if ( !traditional && toType( obj ) === "object" ) {
8920
8921		// Serialize object item.
8922		for ( name in obj ) {
8923			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8924		}
8925
8926	} else {
8927
8928		// Serialize scalar item.
8929		add( prefix, obj );
8930	}
8931}
8932
8933// Serialize an array of form elements or a set of
8934// key/values into a query string
8935jQuery.param = function( a, traditional ) {
8936	var prefix,
8937		s = [],
8938		add = function( key, valueOrFunction ) {
8939
8940			// If value is a function, invoke it and use its return value
8941			var value = isFunction( valueOrFunction ) ?
8942				valueOrFunction() :
8943				valueOrFunction;
8944
8945			s[ s.length ] = encodeURIComponent( key ) + "=" +
8946				encodeURIComponent( value == null ? "" : value );
8947		};
8948
8949	if ( a == null ) {
8950		return "";
8951	}
8952
8953	// If an array was passed in, assume that it is an array of form elements.
8954	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8955
8956		// Serialize the form elements
8957		jQuery.each( a, function() {
8958			add( this.name, this.value );
8959		} );
8960
8961	} else {
8962
8963		// If traditional, encode the "old" way (the way 1.3.2 or older
8964		// did it), otherwise encode params recursively.
8965		for ( prefix in a ) {
8966			buildParams( prefix, a[ prefix ], traditional, add );
8967		}
8968	}
8969
8970	// Return the resulting serialization
8971	return s.join( "&" );
8972};
8973
8974jQuery.fn.extend( {
8975	serialize: function() {
8976		return jQuery.param( this.serializeArray() );
8977	},
8978	serializeArray: function() {
8979		return this.map( function() {
8980
8981			// Can add propHook for "elements" to filter or add form elements
8982			var elements = jQuery.prop( this, "elements" );
8983			return elements ? jQuery.makeArray( elements ) : this;
8984		} ).filter( function() {
8985			var type = this.type;
8986
8987			// Use .is( ":disabled" ) so that fieldset[disabled] works
8988			return this.name && !jQuery( this ).is( ":disabled" ) &&
8989				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8990				( this.checked || !rcheckableType.test( type ) );
8991		} ).map( function( _i, elem ) {
8992			var val = jQuery( this ).val();
8993
8994			if ( val == null ) {
8995				return null;
8996			}
8997
8998			if ( Array.isArray( val ) ) {
8999				return jQuery.map( val, function( val ) {
9000					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9001				} );
9002			}
9003
9004			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9005		} ).get();
9006	}
9007} );
9008
9009
9010var
9011	r20 = /%20/g,
9012	rhash = /#.*$/,
9013	rantiCache = /([?&])_=[^&]*/,
9014	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
9015
9016	// #7653, #8125, #8152: local protocol detection
9017	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
9018	rnoContent = /^(?:GET|HEAD)$/,
9019	rprotocol = /^\/\//,
9020
9021	/* Prefilters
9022	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
9023	 * 2) These are called:
9024	 *    - BEFORE asking for a transport
9025	 *    - AFTER param serialization (s.data is a string if s.processData is true)
9026	 * 3) key is the dataType
9027	 * 4) the catchall symbol "*" can be used
9028	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
9029	 */
9030	prefilters = {},
9031
9032	/* Transports bindings
9033	 * 1) key is the dataType
9034	 * 2) the catchall symbol "*" can be used
9035	 * 3) selection will start with transport dataType and THEN go to "*" if needed
9036	 */
9037	transports = {},
9038
9039	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
9040	allTypes = "*/".concat( "*" ),
9041
9042	// Anchor tag for parsing the document origin
9043	originAnchor = document.createElement( "a" );
9044
9045originAnchor.href = location.href;
9046
9047// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
9048function addToPrefiltersOrTransports( structure ) {
9049
9050	// dataTypeExpression is optional and defaults to "*"
9051	return function( dataTypeExpression, func ) {
9052
9053		if ( typeof dataTypeExpression !== "string" ) {
9054			func = dataTypeExpression;
9055			dataTypeExpression = "*";
9056		}
9057
9058		var dataType,
9059			i = 0,
9060			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
9061
9062		if ( isFunction( func ) ) {
9063
9064			// For each dataType in the dataTypeExpression
9065			while ( ( dataType = dataTypes[ i++ ] ) ) {
9066
9067				// Prepend if requested
9068				if ( dataType[ 0 ] === "+" ) {
9069					dataType = dataType.slice( 1 ) || "*";
9070					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
9071
9072				// Otherwise append
9073				} else {
9074					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
9075				}
9076			}
9077		}
9078	};
9079}
9080
9081// Base inspection function for prefilters and transports
9082function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
9083
9084	var inspected = {},
9085		seekingTransport = ( structure === transports );
9086
9087	function inspect( dataType ) {
9088		var selected;
9089		inspected[ dataType ] = true;
9090		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
9091			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
9092			if ( typeof dataTypeOrTransport === "string" &&
9093				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
9094
9095				options.dataTypes.unshift( dataTypeOrTransport );
9096				inspect( dataTypeOrTransport );
9097				return false;
9098			} else if ( seekingTransport ) {
9099				return !( selected = dataTypeOrTransport );
9100			}
9101		} );
9102		return selected;
9103	}
9104
9105	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
9106}
9107
9108// A special extend for ajax options
9109// that takes "flat" options (not to be deep extended)
9110// Fixes #9887
9111function ajaxExtend( target, src ) {
9112	var key, deep,
9113		flatOptions = jQuery.ajaxSettings.flatOptions || {};
9114
9115	for ( key in src ) {
9116		if ( src[ key ] !== undefined ) {
9117			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
9118		}
9119	}
9120	if ( deep ) {
9121		jQuery.extend( true, target, deep );
9122	}
9123
9124	return target;
9125}
9126
9127/* Handles responses to an ajax request:
9128 * - finds the right dataType (mediates between content-type and expected dataType)
9129 * - returns the corresponding response
9130 */
9131function ajaxHandleResponses( s, jqXHR, responses ) {
9132
9133	var ct, type, finalDataType, firstDataType,
9134		contents = s.contents,
9135		dataTypes = s.dataTypes;
9136
9137	// Remove auto dataType and get content-type in the process
9138	while ( dataTypes[ 0 ] === "*" ) {
9139		dataTypes.shift();
9140		if ( ct === undefined ) {
9141			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
9142		}
9143	}
9144
9145	// Check if we're dealing with a known content-type
9146	if ( ct ) {
9147		for ( type in contents ) {
9148			if ( contents[ type ] && contents[ type ].test( ct ) ) {
9149				dataTypes.unshift( type );
9150				break;
9151			}
9152		}
9153	}
9154
9155	// Check to see if we have a response for the expected dataType
9156	if ( dataTypes[ 0 ] in responses ) {
9157		finalDataType = dataTypes[ 0 ];
9158	} else {
9159
vendor: 9,143 bytes, lines 9160-9535
9160		// Try convertible dataTypes
9161		for ( type in responses ) {
9162			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
9163				finalDataType = type;
9164				break;
9165			}
9166			if ( !firstDataType ) {
9167				firstDataType = type;
9168			}
9169		}
9170
9171		// Or just use first one
9172		finalDataType = finalDataType || firstDataType;
9173	}
9174
9175	// If we found a dataType
9176	// We add the dataType to the list if needed
9177	// and return the corresponding response
9178	if ( finalDataType ) {
9179		if ( finalDataType !== dataTypes[ 0 ] ) {
9180			dataTypes.unshift( finalDataType );
9181		}
9182		return responses[ finalDataType ];
9183	}
9184}
9185
9186/* Chain conversions given the request and the original response
9187 * Also sets the responseXXX fields on the jqXHR instance
9188 */
9189function ajaxConvert( s, response, jqXHR, isSuccess ) {
9190	var conv2, current, conv, tmp, prev,
9191		converters = {},
9192
9193		// Work with a copy of dataTypes in case we need to modify it for conversion
9194		dataTypes = s.dataTypes.slice();
9195
9196	// Create converters map with lowercased keys
9197	if ( dataTypes[ 1 ] ) {
9198		for ( conv in s.converters ) {
9199			converters[ conv.toLowerCase() ] = s.converters[ conv ];
9200		}
9201	}
9202
9203	current = dataTypes.shift();
9204
9205	// Convert to each sequential dataType
9206	while ( current ) {
9207
9208		if ( s.responseFields[ current ] ) {
9209			jqXHR[ s.responseFields[ current ] ] = response;
9210		}
9211
9212		// Apply the dataFilter if provided
9213		if ( !prev && isSuccess && s.dataFilter ) {
9214			response = s.dataFilter( response, s.dataType );
9215		}
9216
9217		prev = current;
9218		current = dataTypes.shift();
9219
9220		if ( current ) {
9221
9222			// There's only work to do if current dataType is non-auto
9223			if ( current === "*" ) {
9224
9225				current = prev;
9226
9227			// Convert response if prev dataType is non-auto and differs from current
9228			} else if ( prev !== "*" && prev !== current ) {
9229
9230				// Seek a direct converter
9231				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
9232
9233				// If none found, seek a pair
9234				if ( !conv ) {
9235					for ( conv2 in converters ) {
9236
9237						// If conv2 outputs current
9238						tmp = conv2.split( " " );
9239						if ( tmp[ 1 ] === current ) {
9240
9241							// If prev can be converted to accepted input
9242							conv = converters[ prev + " " + tmp[ 0 ] ] ||
9243								converters[ "* " + tmp[ 0 ] ];
9244							if ( conv ) {
9245
9246								// Condense equivalence converters
9247								if ( conv === true ) {
9248									conv = converters[ conv2 ];
9249
9250								// Otherwise, insert the intermediate dataType
9251								} else if ( converters[ conv2 ] !== true ) {
9252									current = tmp[ 0 ];
9253									dataTypes.unshift( tmp[ 1 ] );
9254								}
9255								break;
9256							}
9257						}
9258					}
9259				}
9260
9261				// Apply converter (if not an equivalence)
9262				if ( conv !== true ) {
9263
9264					// Unless errors are allowed to bubble, catch and return them
9265					if ( conv && s.throws ) {
9266						response = conv( response );
9267					} else {
9268						try {
9269							response = conv( response );
9270						} catch ( e ) {
9271							return {
9272								state: "parsererror",
9273								error: conv ? e : "No conversion from " + prev + " to " + current
9274							};
9275						}
9276					}
9277				}
9278			}
9279		}
9280	}
9281
9282	return { state: "success", data: response };
9283}
9284
9285jQuery.extend( {
9286
9287	// Counter for holding the number of active queries
9288	active: 0,
9289
9290	// Last-Modified header cache for next request
9291	lastModified: {},
9292	etag: {},
9293
9294	ajaxSettings: {
9295		url: location.href,
9296		type: "GET",
9297		isLocal: rlocalProtocol.test( location.protocol ),
9298		global: true,
9299		processData: true,
9300		async: true,
9301		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9302
9303		/*
9304		timeout: 0,
9305		data: null,
9306		dataType: null,
9307		username: null,
9308		password: null,
9309		cache: null,
9310		throws: false,
9311		traditional: false,
9312		headers: {},
9313		*/
9314
9315		accepts: {
9316			"*": allTypes,
9317			text: "text/plain",
9318			html: "text/html",
9319			xml: "application/xml, text/xml",
9320			json: "application/json, text/javascript"
9321		},
9322
9323		contents: {
9324			xml: /\bxml\b/,
9325			html: /\bhtml/,
9326			json: /\bjson\b/
9327		},
9328
9329		responseFields: {
9330			xml: "responseXML",
9331			text: "responseText",
9332			json: "responseJSON"
9333		},
9334
9335		// Data converters
9336		// Keys separate source (or catchall "*") and destination types with a single space
9337		converters: {
9338
9339			// Convert anything to text
9340			"* text": String,
9341
9342			// Text to html (true = no transformation)
9343			"text html": true,
9344
9345			// Evaluate text as a json expression
9346			"text json": JSON.parse,
9347
9348			// Parse text as xml
9349			"text xml": jQuery.parseXML
9350		},
9351
9352		// For options that shouldn't be deep extended:
9353		// you can add your own custom options here if
9354		// and when you create one that shouldn't be
9355		// deep extended (see ajaxExtend)
9356		flatOptions: {
9357			url: true,
9358			context: true
9359		}
9360	},
9361
9362	// Creates a full fledged settings object into target
9363	// with both ajaxSettings and settings fields.
9364	// If target is omitted, writes into ajaxSettings.
9365	ajaxSetup: function( target, settings ) {
9366		return settings ?
9367
9368			// Building a settings object
9369			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9370
9371			// Extending ajaxSettings
9372			ajaxExtend( jQuery.ajaxSettings, target );
9373	},
9374
9375	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9376	ajaxTransport: addToPrefiltersOrTransports( transports ),
9377
9378	// Main method
9379	ajax: function( url, options ) {
9380
9381		// If url is an object, simulate pre-1.5 signature
9382		if ( typeof url === "object" ) {
9383			options = url;
9384			url = undefined;
9385		}
9386
9387		// Force options to be an object
9388		options = options || {};
9389
9390		var transport,
9391
9392			// URL without anti-cache param
9393			cacheURL,
9394
9395			// Response headers
9396			responseHeadersString,
9397			responseHeaders,
9398
9399			// timeout handle
9400			timeoutTimer,
9401
9402			// Url cleanup var
9403			urlAnchor,
9404
9405			// Request state (becomes false upon send and true upon completion)
9406			completed,
9407
9408			// To know if global events are to be dispatched
9409			fireGlobals,
9410
9411			// Loop variable
9412			i,
9413
9414			// uncached part of the url
9415			uncached,
9416
9417			// Create the final options object
9418			s = jQuery.ajaxSetup( {}, options ),
9419
9420			// Callbacks context
9421			callbackContext = s.context || s,
9422
9423			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9424			globalEventContext = s.context &&
9425				( callbackContext.nodeType || callbackContext.jquery ) ?
9426				jQuery( callbackContext ) :
9427				jQuery.event,
9428
9429			// Deferreds
9430			deferred = jQuery.Deferred(),
9431			completeDeferred = jQuery.Callbacks( "once memory" ),
9432
9433			// Status-dependent callbacks
9434			statusCode = s.statusCode || {},
9435
9436			// Headers (they are sent all at once)
9437			requestHeaders = {},
9438			requestHeadersNames = {},
9439
9440			// Default abort message
9441			strAbort = "canceled",
9442
9443			// Fake xhr
9444			jqXHR = {
9445				readyState: 0,
9446
9447				// Builds headers hashtable if needed
9448				getResponseHeader: function( key ) {
9449					var match;
9450					if ( completed ) {
9451						if ( !responseHeaders ) {
9452							responseHeaders = {};
9453							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9454								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9455									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9456										.concat( match[ 2 ] );
9457							}
9458						}
9459						match = responseHeaders[ key.toLowerCase() + " " ];
9460					}
9461					return match == null ? null : match.join( ", " );
9462				},
9463
9464				// Raw string
9465				getAllResponseHeaders: function() {
9466					return completed ? responseHeadersString : null;
9467				},
9468
9469				// Caches the header
9470				setRequestHeader: function( name, value ) {
9471					if ( completed == null ) {
9472						name = requestHeadersNames[ name.toLowerCase() ] =
9473							requestHeadersNames[ name.toLowerCase() ] || name;
9474						requestHeaders[ name ] = value;
9475					}
9476					return this;
9477				},
9478
9479				// Overrides response content-type header
9480				overrideMimeType: function( type ) {
9481					if ( completed == null ) {
9482						s.mimeType = type;
9483					}
9484					return this;
9485				},
9486
9487				// Status-dependent callbacks
9488				statusCode: function( map ) {
9489					var code;
9490					if ( map ) {
9491						if ( completed ) {
9492
9493							// Execute the appropriate callbacks
9494							jqXHR.always( map[ jqXHR.status ] );
9495						} else {
9496
9497							// Lazy-add the new callbacks in a way that preserves old ones
9498							for ( code in map ) {
9499								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9500							}
9501						}
9502					}
9503					return this;
9504				},
9505
9506				// Cancel the request
9507				abort: function( statusText ) {
9508					var finalText = statusText || strAbort;
9509					if ( transport ) {
9510						transport.abort( finalText );
9511					}
9512					done( 0, finalText );
9513					return this;
9514				}
9515			};
9516
9517		// Attach deferreds
9518		deferred.promise( jqXHR );
9519
9520		// Add protocol if not provided (prefilters might expect it)
9521		// Handle falsy url in the settings object (#10093: consistency with old signature)
9522		// We also use the url parameter if available
9523		s.url = ( ( url || s.url || location.href ) + "" )
9524			.replace( rprotocol, location.protocol + "//" );
9525
9526		// Alias method option to type as per ticket #12004
9527		s.type = options.method || options.type || s.method || s.type;
9528
9529		// Extract dataTypes list
9530		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9531
9532		// A cross-domain request is in order when the origin doesn't match the current origin.
9533		if ( s.crossDomain == null ) {
9534			urlAnchor = document.createElement( "a" );
9535
vendor: 9,646 bytes, lines 9536-9886
9536			// Support: IE <=8 - 11, Edge 12 - 15
9537			// IE throws exception on accessing the href property if url is malformed,
9538			// e.g. http://example.com:80x/
9539			try {
9540				urlAnchor.href = s.url;
9541
9542				// Support: IE <=8 - 11 only
9543				// Anchor's host property isn't correctly set when s.url is relative
9544				urlAnchor.href = urlAnchor.href;
9545				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9546					urlAnchor.protocol + "//" + urlAnchor.host;
9547			} catch ( e ) {
9548
9549				// If there is an error parsing the URL, assume it is crossDomain,
9550				// it can be rejected by the transport if it is invalid
9551				s.crossDomain = true;
9552			}
9553		}
9554
9555		// Convert data if not already a string
9556		if ( s.data && s.processData && typeof s.data !== "string" ) {
9557			s.data = jQuery.param( s.data, s.traditional );
9558		}
9559
9560		// Apply prefilters
9561		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9562
9563		// If request was aborted inside a prefilter, stop there
9564		if ( completed ) {
9565			return jqXHR;
9566		}
9567
9568		// We can fire global events as of now if asked to
9569		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9570		fireGlobals = jQuery.event && s.global;
9571
9572		// Watch for a new set of requests
9573		if ( fireGlobals && jQuery.active++ === 0 ) {
9574			jQuery.event.trigger( "ajaxStart" );
9575		}
9576
9577		// Uppercase the type
9578		s.type = s.type.toUpperCase();
9579
9580		// Determine if request has content
9581		s.hasContent = !rnoContent.test( s.type );
9582
9583		// Save the URL in case we're toying with the If-Modified-Since
9584		// and/or If-None-Match header later on
9585		// Remove hash to simplify url manipulation
9586		cacheURL = s.url.replace( rhash, "" );
9587
9588		// More options handling for requests with no content
9589		if ( !s.hasContent ) {
9590
9591			// Remember the hash so we can put it back
9592			uncached = s.url.slice( cacheURL.length );
9593
9594			// If data is available and should be processed, append data to url
9595			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9596				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9597
9598				// #9682: remove data so that it's not used in an eventual retry
9599				delete s.data;
9600			}
9601
9602			// Add or update anti-cache param if needed
9603			if ( s.cache === false ) {
9604				cacheURL = cacheURL.replace( rantiCache, "$1" );
9605				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9606					uncached;
9607			}
9608
9609			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9610			s.url = cacheURL + uncached;
9611
9612		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9613		} else if ( s.data && s.processData &&
9614			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9615			s.data = s.data.replace( r20, "+" );
9616		}
9617
9618		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9619		if ( s.ifModified ) {
9620			if ( jQuery.lastModified[ cacheURL ] ) {
9621				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9622			}
9623			if ( jQuery.etag[ cacheURL ] ) {
9624				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9625			}
9626		}
9627
9628		// Set the correct header, if data is being sent
9629		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9630			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9631		}
9632
9633		// Set the Accepts header for the server, depending on the dataType
9634		jqXHR.setRequestHeader(
9635			"Accept",
9636			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9637				s.accepts[ s.dataTypes[ 0 ] ] +
9638					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9639				s.accepts[ "*" ]
9640		);
9641
9642		// Check for headers option
9643		for ( i in s.headers ) {
9644			jqXHR.setRequestHeader( i, s.headers[ i ] );
9645		}
9646
9647		// Allow custom headers/mimetypes and early abort
9648		if ( s.beforeSend &&
9649			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9650
9651			// Abort if not done already and return
9652			return jqXHR.abort();
9653		}
9654
9655		// Aborting is no longer a cancellation
9656		strAbort = "abort";
9657
9658		// Install callbacks on deferreds
9659		completeDeferred.add( s.complete );
9660		jqXHR.done( s.success );
9661		jqXHR.fail( s.error );
9662
9663		// Get transport
9664		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9665
9666		// If no transport, we auto-abort
9667		if ( !transport ) {
9668			done( -1, "No Transport" );
9669		} else {
9670			jqXHR.readyState = 1;
9671
9672			// Send global event
9673			if ( fireGlobals ) {
9674				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9675			}
9676
9677			// If request was aborted inside ajaxSend, stop there
9678			if ( completed ) {
9679				return jqXHR;
9680			}
9681
9682			// Timeout
9683			if ( s.async && s.timeout > 0 ) {
9684				timeoutTimer = window.setTimeout( function() {
9685					jqXHR.abort( "timeout" );
9686				}, s.timeout );
9687			}
9688
9689			try {
9690				completed = false;
9691				transport.send( requestHeaders, done );
9692			} catch ( e ) {
9693
9694				// Rethrow post-completion exceptions
9695				if ( completed ) {
9696					throw e;
9697				}
9698
9699				// Propagate others as results
9700				done( -1, e );
9701			}
9702		}
9703
9704		// Callback for when everything is done
9705		function done( status, nativeStatusText, responses, headers ) {
9706			var isSuccess, success, error, response, modified,
9707				statusText = nativeStatusText;
9708
9709			// Ignore repeat invocations
9710			if ( completed ) {
9711				return;
9712			}
9713
9714			completed = true;
9715
9716			// Clear timeout if it exists
9717			if ( timeoutTimer ) {
9718				window.clearTimeout( timeoutTimer );
9719			}
9720
9721			// Dereference transport for early garbage collection
9722			// (no matter how long the jqXHR object will be used)
9723			transport = undefined;
9724
9725			// Cache response headers
9726			responseHeadersString = headers || "";
9727
9728			// Set readyState
9729			jqXHR.readyState = status > 0 ? 4 : 0;
9730
9731			// Determine if successful
9732			isSuccess = status >= 200 && status < 300 || status === 304;
9733
9734			// Get response data
9735			if ( responses ) {
9736				response = ajaxHandleResponses( s, jqXHR, responses );
9737			}
9738
9739			// Use a noop converter for missing script but not if jsonp
9740			if ( !isSuccess &&
9741				jQuery.inArray( "script", s.dataTypes ) > -1 &&
9742				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
9743				s.converters[ "text script" ] = function() {};
9744			}
9745
9746			// Convert no matter what (that way responseXXX fields are always set)
9747			response = ajaxConvert( s, response, jqXHR, isSuccess );
9748
9749			// If successful, handle type chaining
9750			if ( isSuccess ) {
9751
9752				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9753				if ( s.ifModified ) {
9754					modified = jqXHR.getResponseHeader( "Last-Modified" );
9755					if ( modified ) {
9756						jQuery.lastModified[ cacheURL ] = modified;
9757					}
9758					modified = jqXHR.getResponseHeader( "etag" );
9759					if ( modified ) {
9760						jQuery.etag[ cacheURL ] = modified;
9761					}
9762				}
9763
9764				// if no content
9765				if ( status === 204 || s.type === "HEAD" ) {
9766					statusText = "nocontent";
9767
9768				// if not modified
9769				} else if ( status === 304 ) {
9770					statusText = "notmodified";
9771
9772				// If we have data, let's convert it
9773				} else {
9774					statusText = response.state;
9775					success = response.data;
9776					error = response.error;
9777					isSuccess = !error;
9778				}
9779			} else {
9780
9781				// Extract error from statusText and normalize for non-aborts
9782				error = statusText;
9783				if ( status || !statusText ) {
9784					statusText = "error";
9785					if ( status < 0 ) {
9786						status = 0;
9787					}
9788				}
9789			}
9790
9791			// Set data for the fake xhr object
9792			jqXHR.status = status;
9793			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9794
9795			// Success/Error
9796			if ( isSuccess ) {
9797				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9798			} else {
9799				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9800			}
9801
9802			// Status-dependent callbacks
9803			jqXHR.statusCode( statusCode );
9804			statusCode = undefined;
9805
9806			if ( fireGlobals ) {
9807				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9808					[ jqXHR, s, isSuccess ? success : error ] );
9809			}
9810
9811			// Complete
9812			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9813
9814			if ( fireGlobals ) {
9815				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9816
9817				// Handle the global AJAX counter
9818				if ( !( --jQuery.active ) ) {
9819					jQuery.event.trigger( "ajaxStop" );
9820				}
9821			}
9822		}
9823
9824		return jqXHR;
9825	},
9826
9827	getJSON: function( url, data, callback ) {
9828		return jQuery.get( url, data, callback, "json" );
9829	},
9830
9831	getScript: function( url, callback ) {
9832		return jQuery.get( url, undefined, callback, "script" );
9833	}
9834} );
9835
9836jQuery.each( [ "get", "post" ], function( _i, method ) {
9837	jQuery[ method ] = function( url, data, callback, type ) {
9838
9839		// Shift arguments if data argument was omitted
9840		if ( isFunction( data ) ) {
9841			type = type || callback;
9842			callback = data;
9843			data = undefined;
9844		}
9845
9846		// The url can be an options object (which then must have .url)
9847		return jQuery.ajax( jQuery.extend( {
9848			url: url,
9849			type: method,
9850			dataType: type,
9851			data: data,
9852			success: callback
9853		}, jQuery.isPlainObject( url ) && url ) );
9854	};
9855} );
9856
9857jQuery.ajaxPrefilter( function( s ) {
9858	var i;
9859	for ( i in s.headers ) {
9860		if ( i.toLowerCase() === "content-type" ) {
9861			s.contentType = s.headers[ i ] || "";
9862		}
9863	}
9864} );
9865
9866
9867jQuery._evalUrl = function( url, options, doc ) {
9868	return jQuery.ajax( {
9869		url: url,
9870
9871		// Make this explicit, since user can override this through ajaxSetup (#11264)
9872		type: "GET",
9873		dataType: "script",
9874		cache: true,
9875		async: false,
9876		global: false,
9877
9878		// Only evaluate the response if it is successful (gh-4126)
9879		// dataFilter is not invoked for failure responses, so using it instead
9880		// of the default converter is kludgy but it works.
9881		converters: {
9882			"text script": function() {}
9883		},
9884		dataFilter: function( response ) {
9885			jQuery.globalEval( response, options, doc );
9886		}
vendor: 6,627 bytes, lines 9886-10169
9886
9887	} );
9888};
9889
9890
9891jQuery.fn.extend( {
9892	wrapAll: function( html ) {
9893		var wrap;
9894
9895		if ( this[ 0 ] ) {
9896			if ( isFunction( html ) ) {
9897				html = html.call( this[ 0 ] );
9898			}
9899
9900			// The elements to wrap the target around
9901			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9902
9903			if ( this[ 0 ].parentNode ) {
9904				wrap.insertBefore( this[ 0 ] );
9905			}
9906
9907			wrap.map( function() {
9908				var elem = this;
9909
9910				while ( elem.firstElementChild ) {
9911					elem = elem.firstElementChild;
9912				}
9913
9914				return elem;
9915			} ).append( this );
9916		}
9917
9918		return this;
9919	},
9920
9921	wrapInner: function( html ) {
9922		if ( isFunction( html ) ) {
9923			return this.each( function( i ) {
9924				jQuery( this ).wrapInner( html.call( this, i ) );
9925			} );
9926		}
9927
9928		return this.each( function() {
9929			var self = jQuery( this ),
9930				contents = self.contents();
9931
9932			if ( contents.length ) {
9933				contents.wrapAll( html );
9934
9935			} else {
9936				self.append( html );
9937			}
9938		} );
9939	},
9940
9941	wrap: function( html ) {
9942		var htmlIsFunction = isFunction( html );
9943
9944		return this.each( function( i ) {
9945			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9946		} );
9947	},
9948
9949	unwrap: function( selector ) {
9950		this.parent( selector ).not( "body" ).each( function() {
9951			jQuery( this ).replaceWith( this.childNodes );
9952		} );
9953		return this;
9954	}
9955} );
9956
9957
9958jQuery.expr.pseudos.hidden = function( elem ) {
9959	return !jQuery.expr.pseudos.visible( elem );
9960};
9961jQuery.expr.pseudos.visible = function( elem ) {
9962	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9963};
9964
9965
9966
9967
9968jQuery.ajaxSettings.xhr = function() {
9969	try {
9970		return new window.XMLHttpRequest();
9971	} catch ( e ) {}
9972};
9973
9974var xhrSuccessStatus = {
9975
9976		// File protocol always yields status code 0, assume 200
9977		0: 200,
9978
9979		// Support: IE <=9 only
9980		// #1450: sometimes IE returns 1223 when it should be 204
9981		1223: 204
9982	},
9983	xhrSupported = jQuery.ajaxSettings.xhr();
9984
9985support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9986support.ajax = xhrSupported = !!xhrSupported;
9987
9988jQuery.ajaxTransport( function( options ) {
9989	var callback, errorCallback;
9990
9991	// Cross domain only allowed if supported through XMLHttpRequest
9992	if ( support.cors || xhrSupported && !options.crossDomain ) {
9993		return {
9994			send: function( headers, complete ) {
9995				var i,
9996					xhr = options.xhr();
9997
9998				xhr.open(
9999					options.type,
10000					options.url,
10001					options.async,
10002					options.username,
10003					options.password
10004				);
10005
10006				// Apply custom fields if provided
10007				if ( options.xhrFields ) {
10008					for ( i in options.xhrFields ) {
10009						xhr[ i ] = options.xhrFields[ i ];
10010					}
10011				}
10012
10013				// Override mime type if needed
10014				if ( options.mimeType && xhr.overrideMimeType ) {
10015					xhr.overrideMimeType( options.mimeType );
10016				}
10017
10018				// X-Requested-With header
10019				// For cross-domain requests, seeing as conditions for a preflight are
10020				// akin to a jigsaw puzzle, we simply never set it to be sure.
10021				// (it can always be set on a per-request basis or even using ajaxSetup)
10022				// For same-domain requests, won't change header if already provided.
10023				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
10024					headers[ "X-Requested-With" ] = "XMLHttpRequest";
10025				}
10026
10027				// Set headers
10028				for ( i in headers ) {
10029					xhr.setRequestHeader( i, headers[ i ] );
10030				}
10031
10032				// Callback
10033				callback = function( type ) {
10034					return function() {
10035						if ( callback ) {
10036							callback = errorCallback = xhr.onload =
10037								xhr.onerror = xhr.onabort = xhr.ontimeout =
10038									xhr.onreadystatechange = null;
10039
10040							if ( type === "abort" ) {
10041								xhr.abort();
10042							} else if ( type === "error" ) {
10043
10044								// Support: IE <=9 only
10045								// On a manual native abort, IE9 throws
10046								// errors on any property access that is not readyState
10047								if ( typeof xhr.status !== "number" ) {
10048									complete( 0, "error" );
10049								} else {
10050									complete(
10051
10052										// File: protocol always yields status 0; see #8605, #14207
10053										xhr.status,
10054										xhr.statusText
10055									);
10056								}
10057							} else {
10058								complete(
10059									xhrSuccessStatus[ xhr.status ] || xhr.status,
10060									xhr.statusText,
10061
10062									// Support: IE <=9 only
10063									// IE9 has no XHR2 but throws on binary (trac-11426)
10064									// For XHR2 non-text, let the caller handle it (gh-2498)
10065									( xhr.responseType || "text" ) !== "text"  ||
10066									typeof xhr.responseText !== "string" ?
10067										{ binary: xhr.response } :
10068										{ text: xhr.responseText },
10069									xhr.getAllResponseHeaders()
10070								);
10071							}
10072						}
10073					};
10074				};
10075
10076				// Listen to events
10077				xhr.onload = callback();
10078				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
10079
10080				// Support: IE 9 only
10081				// Use onreadystatechange to replace onabort
10082				// to handle uncaught aborts
10083				if ( xhr.onabort !== undefined ) {
10084					xhr.onabort = errorCallback;
10085				} else {
10086					xhr.onreadystatechange = function() {
10087
10088						// Check readyState before timeout as it changes
10089						if ( xhr.readyState === 4 ) {
10090
10091							// Allow onerror to be called first,
10092							// but that will not handle a native abort
10093							// Also, save errorCallback to a variable
10094							// as xhr.onerror cannot be accessed
10095							window.setTimeout( function() {
10096								if ( callback ) {
10097									errorCallback();
10098								}
10099							} );
10100						}
10101					};
10102				}
10103
10104				// Create the abort callback
10105				callback = callback( "abort" );
10106
10107				try {
10108
10109					// Do send the request (this may raise an exception)
10110					xhr.send( options.hasContent && options.data || null );
10111				} catch ( e ) {
10112
10113					// #14683: Only rethrow if this hasn't been notified as an error yet
10114					if ( callback ) {
10115						throw e;
10116					}
10117				}
10118			},
10119
10120			abort: function() {
10121				if ( callback ) {
10122					callback();
10123				}
10124			}
10125		};
10126	}
10127} );
10128
10129
10130
10131
10132// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
10133jQuery.ajaxPrefilter( function( s ) {
10134	if ( s.crossDomain ) {
10135		s.contents.script = false;
10136	}
10137} );
10138
10139// Install script dataType
10140jQuery.ajaxSetup( {
10141	accepts: {
10142		script: "text/javascript, application/javascript, " +
10143			"application/ecmascript, application/x-ecmascript"
10144	},
10145	contents: {
10146		script: /\b(?:java|ecma)script\b/
10147	},
10148	converters: {
10149		"text script": function( text ) {
10150			jQuery.globalEval( text );
10151			return text;
10152		}
10153	}
10154} );
10155
10156// Handle cache's special case and crossDomain
10157jQuery.ajaxPrefilter( "script", function( s ) {
10158	if ( s.cache === undefined ) {
10159		s.cache = false;
10160	}
10161	if ( s.crossDomain ) {
10162		s.type = "GET";
10163	}
10164} );
10165
10166// Bind script tag hack transport
10167jQuery.ajaxTransport( "script", function( s ) {
10168
10169	// This transport only deals with cross domain 
vendor: 15,734 bytes, lines 10169-10733
10169or forced-by-attrs requests
10170	if ( s.crossDomain || s.scriptAttrs ) {
10171		var script, callback;
10172		return {
10173			send: function( _, complete ) {
10174				script = jQuery( "<script>" )
10175					.attr( s.scriptAttrs || {} )
10176					.prop( { charset: s.scriptCharset, src: s.url } )
10177					.on( "load error", callback = function( evt ) {
10178						script.remove();
10179						callback = null;
10180						if ( evt ) {
10181							complete( evt.type === "error" ? 404 : 200, evt.type );
10182						}
10183					} );
10184
10185				// Use native DOM manipulation to avoid our domManip AJAX trickery
10186				document.head.appendChild( script[ 0 ] );
10187			},
10188			abort: function() {
10189				if ( callback ) {
10190					callback();
10191				}
10192			}
10193		};
10194	}
10195} );
10196
10197
10198
10199
10200var oldCallbacks = [],
10201	rjsonp = /(=)\?(?=&|$)|\?\?/;
10202
10203// Default jsonp settings
10204jQuery.ajaxSetup( {
10205	jsonp: "callback",
10206	jsonpCallback: function() {
10207		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
10208		this[ callback ] = true;
10209		return callback;
10210	}
10211} );
10212
10213// Detect, normalize options and install callbacks for jsonp requests
10214jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
10215
10216	var callbackName, overwritten, responseContainer,
10217		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
10218			"url" :
10219			typeof s.data === "string" &&
10220				( s.contentType || "" )
10221					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
10222				rjsonp.test( s.data ) && "data"
10223		);
10224
10225	// Handle iff the expected data type is "jsonp" or we have a parameter to set
10226	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
10227
10228		// Get callback name, remembering preexisting value associated with it
10229		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
10230			s.jsonpCallback() :
10231			s.jsonpCallback;
10232
10233		// Insert callback into url or form data
10234		if ( jsonProp ) {
10235			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
10236		} else if ( s.jsonp !== false ) {
10237			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
10238		}
10239
10240		// Use data converter to retrieve json after script execution
10241		s.converters[ "script json" ] = function() {
10242			if ( !responseContainer ) {
10243				jQuery.error( callbackName + " was not called" );
10244			}
10245			return responseContainer[ 0 ];
10246		};
10247
10248		// Force json dataType
10249		s.dataTypes[ 0 ] = "json";
10250
10251		// Install callback
10252		overwritten = window[ callbackName ];
10253		window[ callbackName ] = function() {
10254			responseContainer = arguments;
10255		};
10256
10257		// Clean-up function (fires after converters)
10258		jqXHR.always( function() {
10259
10260			// If previous value didn't exist - remove it
10261			if ( overwritten === undefined ) {
10262				jQuery( window ).removeProp( callbackName );
10263
10264			// Otherwise restore preexisting value
10265			} else {
10266				window[ callbackName ] = overwritten;
10267			}
10268
10269			// Save back as free
10270			if ( s[ callbackName ] ) {
10271
10272				// Make sure that re-using the options doesn't screw things around
10273				s.jsonpCallback = originalSettings.jsonpCallback;
10274
10275				// Save the callback name for future use
10276				oldCallbacks.push( callbackName );
10277			}
10278
10279			// Call if it was a function and we have a response
10280			if ( responseContainer && isFunction( overwritten ) ) {
10281				overwritten( responseContainer[ 0 ] );
10282			}
10283
10284			responseContainer = overwritten = undefined;
10285		} );
10286
10287		// Delegate to script
10288		return "script";
10289	}
10290} );
10291
10292
10293
10294
10295// Support: Safari 8 only
10296// In Safari 8 documents created via document.implementation.createHTMLDocument
10297// collapse sibling forms: the second one becomes a child of the first one.
10298// Because of that, this security measure has to be disabled in Safari 8.
10299// https://bugs.webkit.org/show_bug.cgi?id=137337
10300support.createHTMLDocument = ( function() {
10301	var body = document.implementation.createHTMLDocument( "" ).body;
10302	body.innerHTML = "<form></form><form></form>";
10303	return body.childNodes.length === 2;
10304} )();
10305
10306
10307// Argument "data" should be string of html
10308// context (optional): If specified, the fragment will be created in this context,
10309// defaults to document
10310// keepScripts (optional): If true, will include scripts passed in the html string
10311jQuery.parseHTML = function( data, context, keepScripts ) {
10312	if ( typeof data !== "string" ) {
10313		return [];
10314	}
10315	if ( typeof context === "boolean" ) {
10316		keepScripts = context;
10317		context = false;
10318	}
10319
10320	var base, parsed, scripts;
10321
10322	if ( !context ) {
10323
10324		// Stop scripts or inline event handlers from being executed immediately
10325		// by using document.implementation
10326		if ( support.createHTMLDocument ) {
10327			context = document.implementation.createHTMLDocument( "" );
10328
10329			// Set the base href for the created document
10330			// so any parsed elements with URLs
10331			// are based on the document's URL (gh-2965)
10332			base = context.createElement( "base" );
10333			base.href = document.location.href;
10334			context.head.appendChild( base );
10335		} else {
10336			context = document;
10337		}
10338	}
10339
10340	parsed = rsingleTag.exec( data );
10341	scripts = !keepScripts && [];
10342
10343	// Single tag
10344	if ( parsed ) {
10345		return [ context.createElement( parsed[ 1 ] ) ];
10346	}
10347
10348	parsed = buildFragment( [ data ], context, scripts );
10349
10350	if ( scripts && scripts.length ) {
10351		jQuery( scripts ).remove();
10352	}
10353
10354	return jQuery.merge( [], parsed.childNodes );
10355};
10356
10357
10358/**
10359 * Load a url into a page
10360 */
10361jQuery.fn.load = function( url, params, callback ) {
10362	var selector, type, response,
10363		self = this,
10364		off = url.indexOf( " " );
10365
10366	if ( off > -1 ) {
10367		selector = stripAndCollapse( url.slice( off ) );
10368		url = url.slice( 0, off );
10369	}
10370
10371	// If it's a function
10372	if ( isFunction( params ) ) {
10373
10374		// We assume that it's the callback
10375		callback = params;
10376		params = undefined;
10377
10378	// Otherwise, build a param string
10379	} else if ( params && typeof params === "object" ) {
10380		type = "POST";
10381	}
10382
10383	// If we have elements to modify, make the request
10384	if ( self.length > 0 ) {
10385		jQuery.ajax( {
10386			url: url,
10387
10388			// If "type" variable is undefined, then "GET" method will be used.
10389			// Make value of this field explicit since
10390			// user can override it through ajaxSetup method
10391			type: type || "GET",
10392			dataType: "html",
10393			data: params
10394		} ).done( function( responseText ) {
10395
10396			// Save response for use in complete callback
10397			response = arguments;
10398
10399			self.html( selector ?
10400
10401				// If a selector was specified, locate the right elements in a dummy div
10402				// Exclude scripts to avoid IE 'Permission Denied' errors
10403				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10404
10405				// Otherwise use the full result
10406				responseText );
10407
10408		// If the request succeeds, this function gets "data", "status", "jqXHR"
10409		// but they are ignored because response was set above.
10410		// If it fails, this function gets "jqXHR", "status", "error"
10411		} ).always( callback && function( jqXHR, status ) {
10412			self.each( function() {
10413				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10414			} );
10415		} );
10416	}
10417
10418	return this;
10419};
10420
10421
10422
10423
10424jQuery.expr.pseudos.animated = function( elem ) {
10425	return jQuery.grep( jQuery.timers, function( fn ) {
10426		return elem === fn.elem;
10427	} ).length;
10428};
10429
10430
10431
10432
10433jQuery.offset = {
10434	setOffset: function( elem, options, i ) {
10435		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10436			position = jQuery.css( elem, "position" ),
10437			curElem = jQuery( elem ),
10438			props = {};
10439
10440		// Set position first, in-case top/left are set even on static elem
10441		if ( position === "static" ) {
10442			elem.style.position = "relative";
10443		}
10444
10445		curOffset = curElem.offset();
10446		curCSSTop = jQuery.css( elem, "top" );
10447		curCSSLeft = jQuery.css( elem, "left" );
10448		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10449			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10450
10451		// Need to be able to calculate position if either
10452		// top or left is auto and position is either absolute or fixed
10453		if ( calculatePosition ) {
10454			curPosition = curElem.position();
10455			curTop = curPosition.top;
10456			curLeft = curPosition.left;
10457
10458		} else {
10459			curTop = parseFloat( curCSSTop ) || 0;
10460			curLeft = parseFloat( curCSSLeft ) || 0;
10461		}
10462
10463		if ( isFunction( options ) ) {
10464
10465			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10466			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10467		}
10468
10469		if ( options.top != null ) {
10470			props.top = ( options.top - curOffset.top ) + curTop;
10471		}
10472		if ( options.left != null ) {
10473			props.left = ( options.left - curOffset.left ) + curLeft;
10474		}
10475
10476		if ( "using" in options ) {
10477			options.using.call( elem, props );
10478
10479		} else {
10480			curElem.css( props );
10481		}
10482	}
10483};
10484
10485jQuery.fn.extend( {
10486
10487	// offset() relates an element's border box to the document origin
10488	offset: function( options ) {
10489
10490		// Preserve chaining for setter
10491		if ( arguments.length ) {
10492			return options === undefined ?
10493				this :
10494				this.each( function( i ) {
10495					jQuery.offset.setOffset( this, options, i );
10496				} );
10497		}
10498
10499		var rect, win,
10500			elem = this[ 0 ];
10501
10502		if ( !elem ) {
10503			return;
10504		}
10505
10506		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10507		// Support: IE <=11 only
10508		// Running getBoundingClientRect on a
10509		// disconnected node in IE throws an error
10510		if ( !elem.getClientRects().length ) {
10511			return { top: 0, left: 0 };
10512		}
10513
10514		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
10515		rect = elem.getBoundingClientRect();
10516		win = elem.ownerDocument.defaultView;
10517		return {
10518			top: rect.top + win.pageYOffset,
10519			left: rect.left + win.pageXOffset
10520		};
10521	},
10522
10523	// position() relates an element's margin box to its offset parent's padding box
10524	// This corresponds to the behavior of CSS absolute positioning
10525	position: function() {
10526		if ( !this[ 0 ] ) {
10527			return;
10528		}
10529
10530		var offsetParent, offset, doc,
10531			elem = this[ 0 ],
10532			parentOffset = { top: 0, left: 0 };
10533
10534		// position:fixed elements are offset from the viewport, which itself always has zero offset
10535		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10536
10537			// Assume position:fixed implies availability of getBoundingClientRect
10538			offset = elem.getBoundingClientRect();
10539
10540		} else {
10541			offset = this.offset();
10542
10543			// Account for the *real* offset parent, which can be the document or its root element
10544			// when a statically positioned element is identified
10545			doc = elem.ownerDocument;
10546			offsetParent = elem.offsetParent || doc.documentElement;
10547			while ( offsetParent &&
10548				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10549				jQuery.css( offsetParent, "position" ) === "static" ) {
10550
10551				offsetParent = offsetParent.parentNode;
10552			}
10553			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10554
10555				// Incorporate borders into its offset, since they are outside its content origin
10556				parentOffset = jQuery( offsetParent ).offset();
10557				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10558				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10559			}
10560		}
10561
10562		// Subtract parent offsets and element margins
10563		return {
10564			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10565			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10566		};
10567	},
10568
10569	// This method will return documentElement in the following cases:
10570	// 1) For the element inside the iframe without offsetParent, this method will return
10571	//    documentElement of the parent window
10572	// 2) For the hidden or detached element
10573	// 3) For body or html element, i.e. in case of the html node - it will return itself
10574	//
10575	// but those exceptions were never presented as a real life use-cases
10576	// and might be considered as more preferable results.
10577	//
10578	// This logic, however, is not guaranteed and can change at any point in the future
10579	offsetParent: function() {
10580		return this.map( function() {
10581			var offsetParent = this.offsetParent;
10582
10583			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10584				offsetParent = offsetParent.offsetParent;
10585			}
10586
10587			return offsetParent || documentElement;
10588		} );
10589	}
10590} );
10591
10592// Create scrollLeft and scrollTop methods
10593jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10594	var top = "pageYOffset" === prop;
10595
10596	jQuery.fn[ method ] = function( val ) {
10597		return access( this, function( elem, method, val ) {
10598
10599			// Coalesce documents and windows
10600			var win;
10601			if ( isWindow( elem ) ) {
10602				win = elem;
10603			} else if ( elem.nodeType === 9 ) {
10604				win = elem.defaultView;
10605			}
10606
10607			if ( val === undefined ) {
10608				return win ? win[ prop ] : elem[ method ];
10609			}
10610
10611			if ( win ) {
10612				win.scrollTo(
10613					!top ? val : win.pageXOffset,
10614					top ? val : win.pageYOffset
10615				);
10616
10617			} else {
10618				elem[ method ] = val;
10619			}
10620		}, method, val, arguments.length );
10621	};
10622} );
10623
10624// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10625// Add the top/left cssHooks using jQuery.fn.position
10626// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10627// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10628// getComputedStyle returns percent when specified for top/left/bottom/right;
10629// rather than make the css module depend on the offset module, just check for it here
10630jQuery.each( [ "top", "left" ], function( _i, prop ) {
10631	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10632		function( elem, computed ) {
10633			if ( computed ) {
10634				computed = curCSS( elem, prop );
10635
10636				// If curCSS returns percentage, fallback to offset
10637				return rnumnonpx.test( computed ) ?
10638					jQuery( elem ).position()[ prop ] + "px" :
10639					computed;
10640			}
10641		}
10642	);
10643} );
10644
10645
10646// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10647jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10648	jQuery.each( {
10649		padding: "inner" + name,
10650		content: type,
10651		"": "outer" + name
10652	}, function( defaultExtra, funcName ) {
10653
10654		// Margin is only for outerHeight, outerWidth
10655		jQuery.fn[ funcName ] = function( margin, value ) {
10656			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10657				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10658
10659			return access( this, function( elem, type, value ) {
10660				var doc;
10661
10662				if ( isWindow( elem ) ) {
10663
10664					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10665					return funcName.indexOf( "outer" ) === 0 ?
10666						elem[ "inner" + name ] :
10667						elem.document.documentElement[ "client" + name ];
10668				}
10669
10670				// Get document width or height
10671				if ( elem.nodeType === 9 ) {
10672					doc = elem.documentElement;
10673
10674					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10675					// whichever is greatest
10676					return Math.max(
10677						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10678						elem.body[ "offset" + name ], doc[ "offset" + name ],
10679						doc[ "client" + name ]
10680					);
10681				}
10682
10683				return value === undefined ?
10684
10685					// Get width or height on the element, requesting but not forcing parseFloat
10686					jQuery.css( elem, type, extra ) :
10687
10688					// Set width or height on the element
10689					jQuery.style( elem, type, value, extra );
10690			}, type, chainable ? margin : undefined, chainable );
10691		};
10692	} );
10693} );
10694
10695
10696jQuery.each( [
10697	"ajaxStart",
10698	"ajaxStop",
10699	"ajaxComplete",
10700	"ajaxError",
10701	"ajaxSuccess",
10702	"ajaxSend"
10703], function( _i, type ) {
10704	jQuery.fn[ type ] = function( fn ) {
10705		return this.on( type, fn );
10706	};
10707} );
10708
10709
10710
10711
10712jQuery.fn.extend( {
10713
10714	bind: function( types, data, fn ) {
10715		return this.on( types, null, data, fn );
10716	},
10717	unbind: function( types, fn ) {
10718		return this.off( types, null, fn );
10719	},
10720
10721	delegate: function( selector, types, data, fn ) {
10722		return this.on( types, selector, data, fn );
10723	},
10724	undelegate: function( selector, types, fn ) {
10725
10726		// ( namespace ) or ( selector, types [, fn] )
10727		return arguments.length === 1 ?
10728			this.off( selector, "**" ) :
10729			this.off( types, selector || "**", fn );
10730	},
10731
10732	hover: function( fnOver, fnOut ) {
10733		return this
vendor: 2,388 bytes, lines 10733-10823
10733.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10734	}
10735} );
10736
10737jQuery.each(
10738	( "blur focus focusin focusout resize scroll click dblclick " +
10739	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10740	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
10741	function( _i, name ) {
10742
10743		// Handle event binding
10744		jQuery.fn[ name ] = function( data, fn ) {
10745			return arguments.length > 0 ?
10746				this.on( name, null, data, fn ) :
10747				this.trigger( name );
10748		};
10749	}
10750);
10751
10752
10753
10754
10755// Support: Android <=4.0 only
10756// Make sure we trim BOM and NBSP
10757var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10758
10759// Bind a function to a context, optionally partially applying any
10760// arguments.
10761// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10762// However, it is not slated for removal any time soon
10763jQuery.proxy = function( fn, context ) {
10764	var tmp, args, proxy;
10765
10766	if ( typeof context === "string" ) {
10767		tmp = fn[ context ];
10768		context = fn;
10769		fn = tmp;
10770	}
10771
10772	// Quick check to determine if target is callable, in the spec
10773	// this throws a TypeError, but we will just return undefined.
10774	if ( !isFunction( fn ) ) {
10775		return undefined;
10776	}
10777
10778	// Simulated bind
10779	args = slice.call( arguments, 2 );
10780	proxy = function() {
10781		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10782	};
10783
10784	// Set the guid of unique handler to the same of original handler, so it can be removed
10785	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10786
10787	return proxy;
10788};
10789
10790jQuery.holdReady = function( hold ) {
10791	if ( hold ) {
10792		jQuery.readyWait++;
10793	} else {
10794		jQuery.ready( true );
10795	}
10796};
10797jQuery.isArray = Array.isArray;
10798jQuery.parseJSON = JSON.parse;
10799jQuery.nodeName = nodeName;
10800jQuery.isFunction = isFunction;
10801jQuery.isWindow = isWindow;
10802jQuery.camelCase = camelCase;
10803jQuery.type = toType;
10804
10805jQuery.now = Date.now;
10806
10807jQuery.isNumeric = function( obj ) {
10808
10809	// As of jQuery 3.0, isNumeric is limited to
10810	// strings and numbers (primitives or objects)
10811	// that can be coerced to finite numbers (gh-2662)
10812	var type = jQuery.type( obj );
10813	return ( type === "number" || type === "string" ) &&
10814
10815		// parseFloat NaNs numeric-cast false positives ("")
10816		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10817		// subtraction forces infinities to NaN
10818		!isNaN( obj - parseFloat( obj ) );
10819};
10820
10821jQuery.trim = function( text ) {
10822	return text == null ?
10823		"" :
10824		( text + "" ).replace( rtrim, "" );
10825};
10826
10827
10828
10829// Register as a named AMD module, since jQuery can be concatenated with other
10830// files that may use define, but not via a proper concatenation script that
10831// understands anonymous AMD modules. A named AMD is safest and most robust
10832// way to register. Lowercase jquery is used because AMD module names are
10833// derived from file names, and jQuery is normally delivered in a lowercase
10834// file name. Do this after creating the global so that if an AMD module wants
10835// to call noConflict to hide this version of jQuery, it will work.
10836
10837// Note that for maximum portability, libraries that are not jQuery should
10838// declare themselves as anonymous modules, and avoid setting a global if an
10839// AMD loader is present. jQuery is a special case. For more information, see
10840// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10841
10842if ( typeof define === "function" && define.amd ) {
10843	define( "jquery", [], function() {
10844		return jQuery;
10845	} );
10846}
10847
10848
10849
10850
10851var
10852
10853	// Map over jQuery in case of overwrite
10854	_jQuery = window.jQuery,
10855
10856	// Map over the $ in case of overwrite
10857	_$ = window.$;
10858
10859jQuery.noConflict = function( deep ) {
10860	if ( window.$ === jQuery ) {
10861		window.$ = _$;
10862	}
10863
10864	if ( deep && window.jQuery === jQuery ) {
10865		window.jQuery = _jQuery;
10866	}
10867
10868	return jQuery;
10869};
10870
10871// Expose jQuery and $ identifiers, even in AMD
10872// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10873// and CommonJS for browser emulators (#13566)
10874if ( typeof noGlobal === "undefined" ) {
10875	window.jQuery = window.$ = jQuery;
10876}
10877
10878
10879
10880
10881return jQuery;
10882} );
10883
10884/*!
10885 * jQuery Migrate - 2013-05-08
10886 * https://github.com/jquery/jquery-migrate
10887 * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
10888 */
10889(function( jQuery, window, undefined ) {
10890// See http://bugs.jquery.com/ticket/13335
10891// "use strict";
10892
10893
10894var warnedAbout = {};
10895
10896// List of warnings already given; public read only
10897jQuery.migrateWarnings = [];
10898
10899// Set to true to prevent console output; migrateWarnings still maintained
10900// jQuery.migrateMute = false;
10901
10902// Show a message on the console so devs know we're active
10903if ( !jQuery.migrateMute && window.console && window.console.log ) {
10904	window.console.log("JQMIGRATE: Logging is active");
10905}
10906
10907// Set to false to disable traces that appear with warnings
10908if ( jQuery.migrateTrace === undefined ) {
10909	jQuery.migrateTrace = true;
10910}
10911
10912// Forget any warnings we've already given; public
10913jQuery.migrateReset = function() {
10914	warnedAbout = {};
10915	jQuery.migrateWarnings.length = 0;
10916};
10917
10918function migrateWarn( msg) {
10919	var console = window.console;
10920	if ( !warnedAbout[ msg ] ) {
10921		warnedAbout[ msg ] = true;
10922		jQuery.migrateWarnings.push( msg );
10923		if ( console && console.warn && !jQuery.migrateMute ) {
10924			console.warn( "JQMIGRATE: " + msg );
10925			if ( jQuery.migrateTrace && console.trace ) {
10926				console.trace();
10927			}
10928		}
10929	}
10930}
10931
10932function migrateWarnProp( obj, prop, value, msg ) {
10933	if ( Object.defineProperty ) {
10934		// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
10935		// allow property to be overwritten in case some other plugin wants it
10936		try {
10937			Object.defineProperty( obj, prop, {
10938				configurable: true,
10939				enumerable: true,
10940				get: function() {
10941					migrateWarn( msg );
10942					return value;
10943				},
10944				set: function( newValue ) {
10945					migrateWarn( msg );
10946					value = newValue;
10947				}
10948			});
10949			return;
10950		} catch( err ) {
10951			// IE8 is a dope about Object.defineProperty, can't warn there
10952		}
10953	}
10954
10955	// Non-ES5 (or broken) browser; just set the property
10956	jQuery._definePropertyBroken = true;
10957	obj[ prop ] = value;
10958}
10959
10960if ( document.compatMode === "BackCompat" ) {
10961	// jQuery has never supported or tested Quirks Mode
10962	migrateWarn( "jQuery is not compatible with Quirks Mode" );
10963}
10964
10965
10966var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
10967	oldAttr = jQuery.attr,
10968	valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
10969		function() { return null; },
10970	valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
10971		function() { return undefined; },
10972	rnoType = /^(?:input|button)$/i,
10973	rnoAttrNodeType = /^[238]$/,
10974	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
10975	ruseDefault = /^(?:checked|selected)$/i;
10976
10977// jQuery.attrFn
10978migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
10979
10980jQuery.attr = function( elem, name, value, pass ) {
10981	var lowerName = name.toLowerCase(),
10982		nType = elem && elem.nodeType;
10983
10984	if ( pass ) {
10985		// Since pass is used internally, we only warn for new jQuery
10986		// versions where there isn't a pass arg in the formal params
10987		if ( oldAttr.length < 4 ) {
10988			migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
10989		}
10990		if ( elem && !rnoAttrNodeType.test( nType ) &&
10991			(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
10992			return jQuery( elem )[ name ]( value );
10993		}
10994	}
10995
10996	// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
10997	// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
10998	if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
10999		migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
11000	}
11001
11002	// Restore boolHook for boolean property/attribute synchronization
11003	if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
11004		jQuery.attrHooks[ lowerName ] = {
11005			get: function( elem, name ) {
11006				// Align boolean attributes with corresponding properties
11007				// Fall back to attribute presence where some booleans are not supported
11008				var attrNode,
11009					property = jQuery.prop( elem, name );
11010				return property === true || typeof property !== "boolean" &&
11011					( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
11012
11013					name.toLowerCase() :
11014					undefined;
11015			},
11016			set: function( elem, value, name ) {
11017				var propName;
11018				if ( value === false ) {
11019					// Remove boolean attributes when set to false
11020					jQuery.removeAttr( elem, name );
11021				} else {
11022					// value is true since we know at this point it's type boolean and not false
11023					// Set boolean attributes to the same name and set the DOM property
11024					propName = jQuery.propFix[ name ] || name;
11025					if ( propName in elem ) {
11026						// Only set the IDL specifically if it already exists on the element
11027						elem[ propName ] = true;
11028					}
11029
11030					elem.setAttribute( name, name.toLowerCase() );
11031				}
11032				return name;
11033			}
11034		};
11035
11036		// Warn only for attributes that can remain distinct from their properties post-1.9
11037		if ( ruseDefault.test( lowerName ) ) {
11038			migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
11039		}
11040	}
11041
11042	return oldAttr.call( jQuery, elem, name, value );
11043};
11044
11045// attrHooks: value
11046jQuery.attrHooks.value = {
11047	get: function( elem, name ) {
11048		var nodeName = ( elem.nodeName || "" ).toLowerCase();
11049		if ( nodeName === "button" ) {
11050			return valueAttrGet.apply( this, arguments );
11051		}
11052		if ( nodeName !== "input" && nodeName !== "option" ) {
11053			migrateWarn("jQuery.fn.attr('value') no longer gets properties");
11054		}
11055		return name in elem ?
11056			elem.value :
11057			null;
11058	},
11059	set: function( elem, value ) {
11060		var nodeName = ( elem.nodeName || "" ).toLowerCase();
11061		if ( nodeName === "button" ) {
11062			return valueAttrSet.apply( this, arguments );
11063		}
11064		if ( nodeName !== "input" && nodeName !== "option" ) {
11065			migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
11066		}
11067		// Does not return so that setAttribute is also used
11068		elem.value = value;
11069	}
11070};
11071
11072
11073var matched, browser,
11074	oldInit = jQuery.fn.init,
11075	oldParseJSON = jQuery.parseJSON,
11076	// Note: XSS check is done below after string is trimmed
11077	rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
11078
11079// $(html) "looks like html" rule change
11080jQuery.fn.init = function( selector, context, rootjQuery ) {
11081	var match;
11082
11083	if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
11084			(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
11085		// This is an HTML string according to the "old" rules; is it still?
11086		if ( selector.charAt( 0 ) !== "<" ) {
11087			migrateWarn("$(html) HTML strings must start with '<' character");
11088		}
11089		if ( match[ 3 ] ) {
11090			migrateWarn("$(html) HTML text after last tag is ignored");
11091		}
11092		// Consistently reject any HTML-like string starting with a hash (#9521)
11093		// Note that this may break jQuery 1.6.x code that otherwise would work.
11094		if ( match[ 0 ].charAt( 0 ) === "#" ) {
11095			migrateWarn("HTML string cannot start with a '#' character");
11096			jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
11097		}
11098		// Now process using loose rules; let pre-1.8 play too
11099		if ( context && context.context ) {
11100			// jQuery object as context; parseHTML expects a DOM object
11101			context = context.context;
11102		}
11103		if ( jQuery.parseHTML ) {
11104			return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
11105					context, rootjQuery );
11106		}
11107	}
11108	return oldInit.apply( this, arguments );
11109};
11110jQuery.fn.init.prototype = jQuery.fn;
11111
11112// Let $.parseJSON(falsy_value) return null
11113jQuery.parseJSON = function( json ) {
11114	if ( !json && json !== null ) {
11115		migrateWarn("jQuery.parseJSON requires a valid JSON string");
11116		return null;
11117	}
11118	return oldParseJSON.apply( this, arguments );
11119};
11120
11121jQuery.uaMatch = function( ua ) {
11122	ua = ua.toLowerCase();
11123
11124	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
11125		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
11126		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
11127		/(msie) ([\w.]+)/.exec( ua ) ||
11128		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
11129		[];
11130
11131	return {
11132		browser: match[ 1 ] || "",
11133		version: match[ 2 ] || "0"
11134	};
11135};
11136
11137// Don't clobber any existing jQuery.browser in case it's different
11138if ( !jQuery.browser ) {
11139	matched = jQuery.uaMatch( navigator.userAgent );
11140	browser = {};
11141
11142	if ( matched.browser ) {
11143		browser[ matched.browser ] = true;
11144		browser.version = matched.version;
11145	}
11146
11147	// Chrome is Webkit, but Webkit is also Safari.
11148	if ( browser.chrome ) {
11149		browser.webkit = true;
11150	} else if ( browser.webkit ) {
11151		browser.safari = true;
11152	}
11153
11154	jQuery.browser = browser;
11155}
11156
11157// Warn if the code tries to get jQuery.browser
11158migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
11159
11160jQuery.sub = function() {
11161	function jQuerySub( selector, context ) {
11162		return new jQuerySub.fn.init( selector, context );
11163	}
11164	jQuery.extend( true, jQuerySub, this );
11165	jQuerySub.superclass = this;
11166	jQuerySub.fn = jQuerySub.prototype = this();
11167	jQuerySub.fn.constructor = jQuerySub;
11168	jQuerySub.sub = this.sub;
11169	jQuerySub.fn.init = function init( selector, context ) {
11170		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
11171			context = jQuerySub( context );
11172		}
11173
11174		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
11175	};
11176	jQuerySub.fn.init.prototype = jQuerySub.fn;
11177	var rootjQuerySub = jQuerySub(document);
11178	migrateWarn( "jQuery.sub() is deprecated" );
11179	return jQuerySub;
11180};
11181
11182
11183// Ensure that $.ajax gets the new parseJSON defined in core.js
11184jQuery.ajaxSetup({
11185	converters: {
11186		"text json": jQuery.parseJSON
11187	}
11188});
11189
11190
11191var oldFnData = jQuery.fn.data;
11192
11193jQuery.fn.data = function( name ) {
11194	var ret, evt,
11195		elem = this[0];
11196
11197	// Handles 1.7 which has this behavior and 1.8 which doesn't
11198	if ( elem && name === "events" && arguments.length === 1 ) {
11199		ret = jQuery.data( elem, name );
11200		evt = jQuery._data( elem, name );
11201		if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
11202			migrateWarn("Use of jQuery.fn.data('events') is deprecated");
11203			return evt;
11204		}
11205	}
11206	return oldFnData.apply( this, arguments );
11207};
11208
11209
11210var rscriptType = /\/(java|ecma)script/i,
11211	oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
11212
11213jQuery.fn.andSelf = function() {
11214	migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
11215	return oldSelf.apply( this, arguments );
11216};
11217
11218// Since jQuery.clean is used internally on older versions, we only shim if it's missing
11219if ( !jQuery.clean ) {
11220	jQuery.clean = function( elems, context, fragment, scripts ) {
11221		// Set context per 1.8 logic
11222		context = context || document;
11223		context = !context.nodeType && context[0] || context;
11224		context = context.ownerDocument || context;
11225
11226		migrateWarn("jQuery.clean() is deprecated");
11227
11228		var i, elem, handleScript, jsTags,
11229			ret = [];
11230
11231		jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
11232
11233		// Complex logic lifted directly from jQuery 1.8
11234		if ( fragment ) {
11235			// Special handling of each script element
11236			handleScript = function( elem ) {
11237				// Check if we consider it executable
11238				if ( !elem.type || rscriptType.test( elem.type ) ) {
11239					// Detach the script and store it in the scripts array (if provided) or the fragment
11240					// Return truthy to indicate that it has been handled
11241					return scripts ?
11242						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
11243						fragment.appendChild( elem );
11244				}
11245			};
11246
11247			for ( i = 0; (elem = ret[i]) != null; i++ ) {
11248				// Check if we're done after handling an executable script
11249				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
11250					// Append to fragment and handle embedded scripts
11251					fragment.appendChild( elem );
11252					if ( typeof elem.getElementsByTagName !== "undefined" ) {
11253						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
11254						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
11255
11256						// Splice the scripts into ret after their former ancestor and advance our index beyond them
11257						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
11258						i += jsTags.length;
11259					}
11260				}
11261			}
11262		}
11263
11264		return ret;
11265	};
11266}
11267
11268var eventAdd = jQuery.event.add,
11269	eventRemove = jQuery.event.remove,
11270	eventTrigger = jQuery.event.trigger,
11271	oldToggle = jQuery.fn.toggle,
11272	oldLive = jQuery.fn.live,
11273	oldDie = jQuery.fn.die,
11274	ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
11275	rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
11276	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
11277	hoverHack = function( events ) {
11278		if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
11279			return events;
11280		}
11281		if ( rhoverHack.test( events ) ) {
11282			migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
11283		}
11284		return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
11285	};
11286
11287// Event props removed in 1.9, put them back if needed; no practical way to warn them
11288if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
11289	jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
11290}
11291
11292// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
11293if ( jQuery.event.dispatch ) {
11294	migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
11295}
11296
11297// Support for 'hover' pseudo-event and ajax event warnings
11298jQuery.event.add = function( elem, types, handler, data, selector ){
11299	if ( elem !== document && rajaxEvent.test( types ) ) {
11300		migrateWarn( "AJAX events should be attached to document: " + types );
11301	}
11302	eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
11303};
11304jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
11305	eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
11306};
11307
11308jQuery.fn.error = function() {
11309	var args = Array.prototype.slice.call( arguments, 0);
11310	migrateWarn("jQuery.fn.error() is deprecated");
11311	args.splice( 0, 0, "error" );
11312	if ( arguments.length ) {
11313		return this.bind.apply( this, args );
11314	}
11315	// error event should not bubble to window, although it does pre-1.7
11316	this.triggerHandler.apply( this, args );
11317	return this;
11318};
11319
11320jQuery.fn.toggle = function( fn, fn2 ) {
11321
11322	// Don't mess with animation or css toggles
11323	if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
11324		return oldToggle.apply( this, arguments );
11325	}
11326	migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
11327
11328	// Save reference to arguments for access in closure
11329	var args = arguments,
11330		guid = fn.guid || jQuery.guid++,
11331		i = 0,
11332		toggler = function( event ) {
11333			// Figure out which function to execute
11334			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
11335			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
11336
11337			// Make sure that clicks stop
11338			event.preventDefault();
11339
11340			// and execute the function
11341			return args[ lastToggle ].apply( this, arguments ) || false;
11342		};
11343
11344	// link all the functions, so any of them can unbind this click handler
11345	toggler.guid = guid;
11346	while ( i < args.length ) {
11347		args[ i++ ].guid = guid;
11348	}
11349
11350	return this.click( toggler );
11351};
11352
11353jQuery.fn.live = function( types, data, fn ) {
11354	migrateWarn("jQuery.fn.live() is deprecated");
11355	if ( oldLive ) {
11356		return oldLive.apply( this, arguments );
11357	}
11358	jQuery( this.context ).on( types, this.selector, data, fn );
11359	return this;
11360};
11361
11362jQuery.fn.die = function( types, fn ) {
11363	migrateWarn("jQuery.fn.die() is deprecated");
11364	if ( oldDie ) {
11365		return oldDie.apply( this, arguments );
11366	}
11367	jQuery( this.context ).off( types, this.selector || "**", fn );
11368	return this;
11369};
11370
11371// Turn global events into document-triggered events
11372jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
11373	if ( !elem && !rajaxEvent.test( event ) ) {
11374		migrateWarn( "Global events are undocumented and deprecated" );
11375	}
11376	return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
11377};
11378jQuery.each( ajaxEvents.split("|"),
11379	function( _, name ) {
11380		jQuery.event.special[ name ] = {
11381			setup: function() {
11382				var elem = this;
11383
11384				// The document needs no shimming; must be !== for oldIE
11385				if ( elem !== document ) {
11386					jQuery.event.add( document, name + "." + jQuery.guid, function() {
11387						jQuery.event.trigger( name, null, elem, true );
11388					});
11389					jQuery._data( this, name, jQuery.guid++ );
11390				}
11391				return false;
vendor: 2,882 bytes, lines 11392-11473
11392			},
11393			teardown: function() {
11394				if ( this !== document ) {
11395					jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
11396				}
11397				return false;
11398			}
11399		};
11400	}
11401);
11402
11403
11404})( jQuery, window );
11405/*! jQuery UI - v1.13.2 - 2022-07-14
11406* http://jqueryui.com
11407* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
11408* Copyright jQuery Foundation and other contributors; Licensed MIT */
11409
11410( function( factory ) {
11411	"use strict";
11412	
11413	if ( typeof define === "function" && define.amd ) {
11414
11415		// AMD. Register as an anonymous module.
11416		define( [ "jquery" ], factory );
11417	} else {
11418
11419		// Browser globals
11420		factory( jQuery );
11421	}
11422} )( function( $ ) {
11423"use strict";
11424
11425$.ui = $.ui || {};
11426
11427var version = $.ui.version = "1.13.2";
11428
11429
11430/*!
11431 * jQuery UI Widget 1.13.2
11432 * http://jqueryui.com
11433 *
11434 * Copyright jQuery Foundation and other contributors
11435 * Released under the MIT license.
11436 * http://jquery.org/license
11437 */
11438
11439//>>label: Widget
11440//>>group: Core
11441//>>description: Provides a factory for creating stateful widgets with a common API.
11442//>>docs: http://api.jqueryui.com/jQuery.widget/
11443//>>demos: http://jqueryui.com/widget/
11444
11445
11446var widgetUuid = 0;
11447var widgetHasOwnProperty = Array.prototype.hasOwnProperty;
11448var widgetSlice = Array.prototype.slice;
11449
11450$.cleanData = ( function( orig ) {
11451	return function( elems ) {
11452		var events, elem, i;
11453		for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
11454
11455			// Only trigger remove when necessary to save time
11456			events = $._data( elem, "events" );
11457			if ( events && events.remove ) {
11458				$( elem ).triggerHandler( "remove" );
11459			}
11460		}
11461		orig( elems );
11462	};
11463} )( $.cleanData );
11464
11465$.widget = function( name, base, prototype ) {
11466	var existingConstructor, constructor, basePrototype;
11467
11468	// ProxiedPrototype allows the provided prototype to remain unmodified
11469	// so that it can be used as a mixin for multiple widgets (#8876)
11470	var proxiedPrototype = {};
11471
11472	var namespace = name.split( "." )[ 0 ];
11473	name = name.split( "." )[ 1 ];
vendor: 18,823 bytes, lines 11473-12173
11473
11474	var fullName = namespace + "-" + name;
11475
11476	if ( !prototype ) {
11477		prototype = base;
11478		base = $.Widget;
11479	}
11480
11481	if ( Array.isArray( prototype ) ) {
11482		prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
11483	}
11484
11485	// Create selector for plugin
11486	$.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {
11487		return !!$.data( elem, fullName );
11488	};
11489
11490	$[ namespace ] = $[ namespace ] || {};
11491	existingConstructor = $[ namespace ][ name ];
11492	constructor = $[ namespace ][ name ] = function( options, element ) {
11493
11494		// Allow instantiation without "new" keyword
11495		if ( !this || !this._createWidget ) {
11496			return new constructor( options, element );
11497		}
11498
11499		// Allow instantiation without initializing for simple inheritance
11500		// must use "new" keyword (the code above always passes args)
11501		if ( arguments.length ) {
11502			this._createWidget( options, element );
11503		}
11504	};
11505
11506	// Extend with the existing constructor to carry over any static properties
11507	$.extend( constructor, existingConstructor, {
11508		version: prototype.version,
11509
11510		// Copy the object used to create the prototype in case we need to
11511		// redefine the widget later
11512		_proto: $.extend( {}, prototype ),
11513
11514		// Track widgets that inherit from this widget in case this widget is
11515		// redefined after a widget inherits from it
11516		_childConstructors: []
11517	} );
11518
11519	basePrototype = new base();
11520
11521	// We need to make the options hash a property directly on the new instance
11522	// otherwise we'll modify the options hash on the prototype that we're
11523	// inheriting from
11524	basePrototype.options = $.widget.extend( {}, basePrototype.options );
11525	$.each( prototype, function( prop, value ) {
11526		if ( typeof value !== "function" ) {
11527			proxiedPrototype[ prop ] = value;
11528			return;
11529		}
11530		proxiedPrototype[ prop ] = ( function() {
11531			function _super() {
11532				return base.prototype[ prop ].apply( this, arguments );
11533			}
11534
11535			function _superApply( args ) {
11536				return base.prototype[ prop ].apply( this, args );
11537			}
11538
11539			return function() {
11540				var __super = this._super;
11541				var __superApply = this._superApply;
11542				var returnValue;
11543
11544				this._super = _super;
11545				this._superApply = _superApply;
11546
11547				returnValue = value.apply( this, arguments );
11548
11549				this._super = __super;
11550				this._superApply = __superApply;
11551
11552				return returnValue;
11553			};
11554		} )();
11555	} );
11556	constructor.prototype = $.widget.extend( basePrototype, {
11557
11558		// TODO: remove support for widgetEventPrefix
11559		// always use the name + a colon as the prefix, e.g., draggable:start
11560		// don't prefix for widgets that aren't DOM-based
11561		widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
11562	}, proxiedPrototype, {
11563		constructor: constructor,
11564		namespace: namespace,
11565		widgetName: name,
11566		widgetFullName: fullName
11567	} );
11568
11569	// If this widget is being redefined then we need to find all widgets that
11570	// are inheriting from it and redefine all of them so that they inherit from
11571	// the new version of this widget. We're essentially trying to replace one
11572	// level in the prototype chain.
11573	if ( existingConstructor ) {
11574		$.each( existingConstructor._childConstructors, function( i, child ) {
11575			var childPrototype = child.prototype;
11576
11577			// Redefine the child widget using the same prototype that was
11578			// originally used, but inherit from the new version of the base
11579			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
11580				child._proto );
11581		} );
11582
11583		// Remove the list of existing child constructors from the old constructor
11584		// so the old child constructors can be garbage collected
11585		delete existingConstructor._childConstructors;
11586	} else {
11587		base._childConstructors.push( constructor );
11588	}
11589
11590	$.widget.bridge( name, constructor );
11591
11592	return constructor;
11593};
11594
11595$.widget.extend = function( target ) {
11596	var input = widgetSlice.call( arguments, 1 );
11597	var inputIndex = 0;
11598	var inputLength = input.length;
11599	var key;
11600	var value;
11601
11602	for ( ; inputIndex < inputLength; inputIndex++ ) {
11603		for ( key in input[ inputIndex ] ) {
11604			value = input[ inputIndex ][ key ];
11605			if ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) {
11606
11607				// Clone objects
11608				if ( $.isPlainObject( value ) ) {
11609					target[ key ] = $.isPlainObject( target[ key ] ) ?
11610						$.widget.extend( {}, target[ key ], value ) :
11611
11612						// Don't extend strings, arrays, etc. with objects
11613						$.widget.extend( {}, value );
11614
11615				// Copy everything else by reference
11616				} else {
11617					target[ key ] = value;
11618				}
11619			}
11620		}
11621	}
11622	return target;
11623};
11624
11625$.widget.bridge = function( name, object ) {
11626	var fullName = object.prototype.widgetFullName || name;
11627	$.fn[ name ] = function( options ) {
11628		var isMethodCall = typeof options === "string";
11629		var args = widgetSlice.call( arguments, 1 );
11630		var returnValue = this;
11631
11632		if ( isMethodCall ) {
11633
11634			// If this is an empty collection, we need to have the instance method
11635			// return undefined instead of the jQuery instance
11636			if ( !this.length && options === "instance" ) {
11637				returnValue = undefined;
11638			} else {
11639				this.each( function() {
11640					var methodValue;
11641					var instance = $.data( this, fullName );
11642
11643					if ( options === "instance" ) {
11644						returnValue = instance;
11645						return false;
11646					}
11647
11648					if ( !instance ) {
11649						return $.error( "cannot call methods on " + name +
11650							" prior to initialization; " +
11651							"attempted to call method '" + options + "'" );
11652					}
11653
11654					if ( typeof instance[ options ] !== "function" ||
11655						options.charAt( 0 ) === "_" ) {
11656						return $.error( "no such method '" + options + "' for " + name +
11657							" widget instance" );
11658					}
11659
11660					methodValue = instance[ options ].apply( instance, args );
11661
11662					if ( methodValue !== instance && methodValue !== undefined ) {
11663						returnValue = methodValue && methodValue.jquery ?
11664							returnValue.pushStack( methodValue.get() ) :
11665							methodValue;
11666						return false;
11667					}
11668				} );
11669			}
11670		} else {
11671
11672			// Allow multiple hashes to be passed on init
11673			if ( args.length ) {
11674				options = $.widget.extend.apply( null, [ options ].concat( args ) );
11675			}
11676
11677			this.each( function() {
11678				var instance = $.data( this, fullName );
11679				if ( instance ) {
11680					instance.option( options || {} );
11681					if ( instance._init ) {
11682						instance._init();
11683					}
11684				} else {
11685					$.data( this, fullName, new object( options, this ) );
11686				}
11687			} );
11688		}
11689
11690		return returnValue;
11691	};
11692};
11693
11694$.Widget = function( /* options, element */ ) {};
11695$.Widget._childConstructors = [];
11696
11697$.Widget.prototype = {
11698	widgetName: "widget",
11699	widgetEventPrefix: "",
11700	defaultElement: "<div>",
11701
11702	options: {
11703		classes: {},
11704		disabled: false,
11705
11706		// Callbacks
11707		create: null
11708	},
11709
11710	_createWidget: function( options, element ) {
11711		element = $( element || this.defaultElement || this )[ 0 ];
11712		this.element = $( element );
11713		this.uuid = widgetUuid++;
11714		this.eventNamespace = "." + this.widgetName + this.uuid;
11715
11716		this.bindings = $();
11717		this.hoverable = $();
11718		this.focusable = $();
11719		this.classesElementLookup = {};
11720
11721		if ( element !== this ) {
11722			$.data( element, this.widgetFullName, this );
11723			this._on( true, this.element, {
11724				remove: function( event ) {
11725					if ( event.target === element ) {
11726						this.destroy();
11727					}
11728				}
11729			} );
11730			this.document = $( element.style ?
11731
11732				// Element within the document
11733				element.ownerDocument :
11734
11735				// Element is window or document
11736				element.document || element );
11737			this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
11738		}
11739
11740		this.options = $.widget.extend( {},
11741			this.options,
11742			this._getCreateOptions(),
11743			options );
11744
11745		this._create();
11746
11747		if ( this.options.disabled ) {
11748			this._setOptionDisabled( this.options.disabled );
11749		}
11750
11751		this._trigger( "create", null, this._getCreateEventData() );
11752		this._init();
11753	},
11754
11755	_getCreateOptions: function() {
11756		return {};
11757	},
11758
11759	_getCreateEventData: $.noop,
11760
11761	_create: $.noop,
11762
11763	_init: $.noop,
11764
11765	destroy: function() {
11766		var that = this;
11767
11768		this._destroy();
11769		$.each( this.classesElementLookup, function( key, value ) {
11770			that._removeClass( value, key );
11771		} );
11772
11773		// We can probably remove the unbind calls in 2.0
11774		// all event bindings should go through this._on()
11775		this.element
11776			.off( this.eventNamespace )
11777			.removeData( this.widgetFullName );
11778		this.widget()
11779			.off( this.eventNamespace )
11780			.removeAttr( "aria-disabled" );
11781
11782		// Clean up events and states
11783		this.bindings.off( this.eventNamespace );
11784	},
11785
11786	_destroy: $.noop,
11787
11788	widget: function() {
11789		return this.element;
11790	},
11791
11792	option: function( key, value ) {
11793		var options = key;
11794		var parts;
11795		var curOption;
11796		var i;
11797
11798		if ( arguments.length === 0 ) {
11799
11800			// Don't return a reference to the internal hash
11801			return $.widget.extend( {}, this.options );
11802		}
11803
11804		if ( typeof key === "string" ) {
11805
11806			// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
11807			options = {};
11808			parts = key.split( "." );
11809			key = parts.shift();
11810			if ( parts.length ) {
11811				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
11812				for ( i = 0; i < parts.length - 1; i++ ) {
11813					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
11814					curOption = curOption[ parts[ i ] ];
11815				}
11816				key = parts.pop();
11817				if ( arguments.length === 1 ) {
11818					return curOption[ key ] === undefined ? null : curOption[ key ];
11819				}
11820				curOption[ key ] = value;
11821			} else {
11822				if ( arguments.length === 1 ) {
11823					return this.options[ key ] === undefined ? null : this.options[ key ];
11824				}
11825				options[ key ] = value;
11826			}
11827		}
11828
11829		this._setOptions( options );
11830
11831		return this;
11832	},
11833
11834	_setOptions: function( options ) {
11835		var key;
11836
11837		for ( key in options ) {
11838			this._setOption( key, options[ key ] );
11839		}
11840
11841		return this;
11842	},
11843
11844	_setOption: function( key, value ) {
11845		if ( key === "classes" ) {
11846			this._setOptionClasses( value );
11847		}
11848
11849		this.options[ key ] = value;
11850
11851		if ( key === "disabled" ) {
11852			this._setOptionDisabled( value );
11853		}
11854
11855		return this;
11856	},
11857
11858	_setOptionClasses: function( value ) {
11859		var classKey, elements, currentElements;
11860
11861		for ( classKey in value ) {
11862			currentElements = this.classesElementLookup[ classKey ];
11863			if ( value[ classKey ] === this.options.classes[ classKey ] ||
11864					!currentElements ||
11865					!currentElements.length ) {
11866				continue;
11867			}
11868
11869			// We are doing this to create a new jQuery object because the _removeClass() call
11870			// on the next line is going to destroy the reference to the current elements being
11871			// tracked. We need to save a copy of this collection so that we can add the new classes
11872			// below.
11873			elements = $( currentElements.get() );
11874			this._removeClass( currentElements, classKey );
11875
11876			// We don't use _addClass() here, because that uses this.options.classes
11877			// for generating the string of classes. We want to use the value passed in from
11878			// _setOption(), this is the new value of the classes option which was passed to
11879			// _setOption(). We pass this value directly to _classes().
11880			elements.addClass( this._classes( {
11881				element: elements,
11882				keys: classKey,
11883				classes: value,
11884				add: true
11885			} ) );
11886		}
11887	},
11888
11889	_setOptionDisabled: function( value ) {
11890		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
11891
11892		// If the widget is becoming disabled, then nothing is interactive
11893		if ( value ) {
11894			this._removeClass( this.hoverable, null, "ui-state-hover" );
11895			this._removeClass( this.focusable, null, "ui-state-focus" );
11896		}
11897	},
11898
11899	enable: function() {
11900		return this._setOptions( { disabled: false } );
11901	},
11902
11903	disable: function() {
11904		return this._setOptions( { disabled: true } );
11905	},
11906
11907	_classes: function( options ) {
11908		var full = [];
11909		var that = this;
11910
11911		options = $.extend( {
11912			element: this.element,
11913			classes: this.options.classes || {}
11914		}, options );
11915
11916		function bindRemoveEvent() {
11917			var nodesToBind = [];
11918
11919			options.element.each( function( _, element ) {
11920				var isTracked = $.map( that.classesElementLookup, function( elements ) {
11921					return elements;
11922				} )
11923					.some( function( elements ) {
11924						return elements.is( element );
11925					} );
11926
11927				if ( !isTracked ) {
11928					nodesToBind.push( element );
11929				}
11930			} );
11931
11932			that._on( $( nodesToBind ), {
11933				remove: "_untrackClassesElement"
11934			} );
11935		}
11936
11937		function processClassString( classes, checkOption ) {
11938			var current, i;
11939			for ( i = 0; i < classes.length; i++ ) {
11940				current = that.classesElementLookup[ classes[ i ] ] || $();
11941				if ( options.add ) {
11942					bindRemoveEvent();
11943					current = $( $.uniqueSort( current.get().concat( options.element.get() ) ) );
11944				} else {
11945					current = $( current.not( options.element ).get() );
11946				}
11947				that.classesElementLookup[ classes[ i ] ] = current;
11948				full.push( classes[ i ] );
11949				if ( checkOption && options.classes[ classes[ i ] ] ) {
11950					full.push( options.classes[ classes[ i ] ] );
11951				}
11952			}
11953		}
11954
11955		if ( options.keys ) {
11956			processClassString( options.keys.match( /\S+/g ) || [], true );
11957		}
11958		if ( options.extra ) {
11959			processClassString( options.extra.match( /\S+/g ) || [] );
11960		}
11961
11962		return full.join( " " );
11963	},
11964
11965	_untrackClassesElement: function( event ) {
11966		var that = this;
11967		$.each( that.classesElementLookup, function( key, value ) {
11968			if ( $.inArray( event.target, value ) !== -1 ) {
11969				that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
11970			}
11971		} );
11972
11973		this._off( $( event.target ) );
11974	},
11975
11976	_removeClass: function( element, keys, extra ) {
11977		return this._toggleClass( element, keys, extra, false );
11978	},
11979
11980	_addClass: function( element, keys, extra ) {
11981		return this._toggleClass( element, keys, extra, true );
11982	},
11983
11984	_toggleClass: function( element, keys, extra, add ) {
11985		add = ( typeof add === "boolean" ) ? add : extra;
11986		var shift = ( typeof element === "string" || element === null ),
11987			options = {
11988				extra: shift ? keys : extra,
11989				keys: shift ? element : keys,
11990				element: shift ? this.element : element,
11991				add: add
11992			};
11993		options.element.toggleClass( this._classes( options ), add );
11994		return this;
11995	},
11996
11997	_on: function( suppressDisabledCheck, element, handlers ) {
11998		var delegateElement;
11999		var instance = this;
12000
12001		// No suppressDisabledCheck flag, shuffle arguments
12002		if ( typeof suppressDisabledCheck !== "boolean" ) {
12003			handlers = element;
12004			element = suppressDisabledCheck;
12005			suppressDisabledCheck = false;
12006		}
12007
12008		// No element argument, shuffle and use this.element
12009		if ( !handlers ) {
12010			handlers = element;
12011			element = this.element;
12012			delegateElement = this.widget();
12013		} else {
12014			element = delegateElement = $( element );
12015			this.bindings = this.bindings.add( element );
12016		}
12017
12018		$.each( handlers, function( event, handler ) {
12019			function handlerProxy() {
12020
12021				// Allow widgets to customize the disabled handling
12022				// - disabled as an array instead of boolean
12023				// - disabled class as method for disabling individual parts
12024				if ( !suppressDisabledCheck &&
12025						( instance.options.disabled === true ||
12026						$( this ).hasClass( "ui-state-disabled" ) ) ) {
12027					return;
12028				}
12029				return ( typeof handler === "string" ? instance[ handler ] : handler )
12030					.apply( instance, arguments );
12031			}
12032
12033			// Copy the guid so direct unbinding works
12034			if ( typeof handler !== "string" ) {
12035				handlerProxy.guid = handler.guid =
12036					handler.guid || handlerProxy.guid || $.guid++;
12037			}
12038
12039			var match = event.match( /^([\w:-]*)\s*(.*)$/ );
12040			var eventName = match[ 1 ] + instance.eventNamespace;
12041			var selector = match[ 2 ];
12042
12043			if ( selector ) {
12044				delegateElement.on( eventName, selector, handlerProxy );
12045			} else {
12046				element.on( eventName, handlerProxy );
12047			}
12048		} );
12049	},
12050
12051	_off: function( element, eventName ) {
12052		eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
12053			this.eventNamespace;
12054		element.off( eventName );
12055
12056		// Clear the stack to avoid memory leaks (#10056)
12057		this.bindings = $( this.bindings.not( element ).get() );
12058		this.focusable = $( this.focusable.not( element ).get() );
12059		this.hoverable = $( this.hoverable.not( element ).get() );
12060	},
12061
12062	_delay: function( handler, delay ) {
12063		function handlerProxy() {
12064			return ( typeof handler === "string" ? instance[ handler ] : handler )
12065				.apply( instance, arguments );
12066		}
12067		var instance = this;
12068		return setTimeout( handlerProxy, delay || 0 );
12069	},
12070
12071	_hoverable: function( element ) {
12072		this.hoverable = this.hoverable.add( element );
12073		this._on( element, {
12074			mouseenter: function( event ) {
12075				this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
12076			},
12077			mouseleave: function( event ) {
12078				this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
12079			}
12080		} );
12081	},
12082
12083	_focusable: function( element ) {
12084		this.focusable = this.focusable.add( element );
12085		this._on( element, {
12086			focusin: function( event ) {
12087				this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
12088			},
12089			focusout: function( event ) {
12090				this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
12091			}
12092		} );
12093	},
12094
12095	_trigger: function( type, event, data ) {
12096		var prop, orig;
12097		var callback = this.options[ type ];
12098
12099		data = data || {};
12100		event = $.Event( event );
12101		event.type = ( type === this.widgetEventPrefix ?
12102			type :
12103			this.widgetEventPrefix + type ).toLowerCase();
12104
12105		// The original event may come from any element
12106		// so we need to reset the target on the new event
12107		event.target = this.element[ 0 ];
12108
12109		// Copy original event properties over to the new event
12110		orig = event.originalEvent;
12111		if ( orig ) {
12112			for ( prop in orig ) {
12113				if ( !( prop in event ) ) {
12114					event[ prop ] = orig[ prop ];
12115				}
12116			}
12117		}
12118
12119		this.element.trigger( event, data );
12120		return !( typeof callback === "function" &&
12121			callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
12122			event.isDefaultPrevented() );
12123	}
12124};
12125
12126$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
12127	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
12128		if ( typeof options === "string" ) {
12129			options = { effect: options };
12130		}
12131
12132		var hasOptions;
12133		var effectName = !options ?
12134			method :
12135			options === true || typeof options === "number" ?
12136				defaultEffect :
12137				options.effect || defaultEffect;
12138
12139		options = options || {};
12140		if ( typeof options === "number" ) {
12141			options = { duration: options };
12142		} else if ( options === true ) {
12143			options = {};
12144		}
12145
12146		hasOptions = !$.isEmptyObject( options );
12147		options.complete = callback;
12148
12149		if ( options.delay ) {
12150			element.delay( options.delay );
12151		}
12152
12153		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
12154			element[ method ]( options );
12155		} else if ( effectName !== method && element[ effectName ] ) {
12156			element[ effectName ]( options.duration, options.easing, callback );
12157		} else {
12158			element.queue( function( next ) {
12159				$( this )[ method ]();
12160				if ( callback ) {
12161					callback.call( element[ 0 ] );
12162				}
12163				next();
12164			} );
12165		}
12166	};
12167} );
12168
12169var widget = $.widget;
12170
12171
12172/*!
12173 * jQuery UI Position 1.1
vendor: 1,610 bytes, lines 12173-12246
121733.2
12174 * http://jqueryui.com
12175 *
12176 * Copyright jQuery Foundation and other contributors
12177 * Released under the MIT license.
12178 * http://jquery.org/license
12179 *
12180 * http://api.jqueryui.com/position/
12181 */
12182
12183//>>label: Position
12184//>>group: Core
12185//>>description: Positions elements relative to other elements.
12186//>>docs: http://api.jqueryui.com/position/
12187//>>demos: http://jqueryui.com/position/
12188
12189
12190( function() {
12191var cachedScrollbarWidth,
12192	max = Math.max,
12193	abs = Math.abs,
12194	rhorizontal = /left|center|right/,
12195	rvertical = /top|center|bottom/,
12196	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
12197	rposition = /^\w+/,
12198	rpercent = /%$/,
12199	_position = $.fn.position;
12200
12201function getOffsets( offsets, width, height ) {
12202	return [
12203		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
12204		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
12205	];
12206}
12207
12208function parseCss( element, property ) {
12209	return parseInt( $.css( element, property ), 10 ) || 0;
12210}
12211
12212function isWindow( obj ) {
12213	return obj != null && obj === obj.window;
12214}
12215
12216function getDimensions( elem ) {
12217	var raw = elem[ 0 ];
12218	if ( raw.nodeType === 9 ) {
12219		return {
12220			width: elem.width(),
12221			height: elem.height(),
12222			offset: { top: 0, left: 0 }
12223		};
12224	}
12225	if ( isWindow( raw ) ) {
12226		return {
12227			width: elem.width(),
12228			height: elem.height(),
12229			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
12230		};
12231	}
12232	if ( raw.preventDefault ) {
12233		return {
12234			width: 0,
12235			height: 0,
12236			offset: { top: raw.pageY, left: raw.pageX }
12237		};
12238	}
12239	return {
12240		width: elem.outerWidth(),
12241		height: elem.outerHeight(),
12242		offset: elem.offset()
12243	};
12244}
12245
12246$.position =
vendor: 13,231 bytes, lines 12246-12670
12246 {
12247	scrollbarWidth: function() {
12248		if ( cachedScrollbarWidth !== undefined ) {
12249			return cachedScrollbarWidth;
12250		}
12251		var w1, w2,
12252			div = $( "<div style=" +
12253				"'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>" +
12254				"<div style='height:300px;width:auto;'></div></div>" ),
12255			innerDiv = div.children()[ 0 ];
12256
12257		$( "body" ).append( div );
12258		w1 = innerDiv.offsetWidth;
12259		div.css( "overflow", "scroll" );
12260
12261		w2 = innerDiv.offsetWidth;
12262
12263		if ( w1 === w2 ) {
12264			w2 = div[ 0 ].clientWidth;
12265		}
12266
12267		div.remove();
12268
12269		return ( cachedScrollbarWidth = w1 - w2 );
12270	},
12271	getScrollInfo: function( within ) {
12272		var overflowX = within.isWindow || within.isDocument ? "" :
12273				within.element.css( "overflow-x" ),
12274			overflowY = within.isWindow || within.isDocument ? "" :
12275				within.element.css( "overflow-y" ),
12276			hasOverflowX = overflowX === "scroll" ||
12277				( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
12278			hasOverflowY = overflowY === "scroll" ||
12279				( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
12280		return {
12281			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
12282			height: hasOverflowX ? $.position.scrollbarWidth() : 0
12283		};
12284	},
12285	getWithinInfo: function( element ) {
12286		var withinElement = $( element || window ),
12287			isElemWindow = isWindow( withinElement[ 0 ] ),
12288			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
12289			hasOffset = !isElemWindow && !isDocument;
12290		return {
12291			element: withinElement,
12292			isWindow: isElemWindow,
12293			isDocument: isDocument,
12294			offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
12295			scrollLeft: withinElement.scrollLeft(),
12296			scrollTop: withinElement.scrollTop(),
12297			width: withinElement.outerWidth(),
12298			height: withinElement.outerHeight()
12299		};
12300	}
12301};
12302
12303$.fn.position = function( options ) {
12304	if ( !options || !options.of ) {
12305		return _position.apply( this, arguments );
12306	}
12307
12308	// Make a copy, we don't want to modify arguments
12309	options = $.extend( {}, options );
12310
12311	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
12312
12313		// Make sure string options are treated as CSS selectors
12314		target = typeof options.of === "string" ?
12315			$( document ).find( options.of ) :
12316			$( options.of ),
12317
12318		within = $.position.getWithinInfo( options.within ),
12319		scrollInfo = $.position.getScrollInfo( within ),
12320		collision = ( options.collision || "flip" ).split( " " ),
12321		offsets = {};
12322
12323	dimensions = getDimensions( target );
12324	if ( target[ 0 ].preventDefault ) {
12325
12326		// Force left top to allow flipping
12327		options.at = "left top";
12328	}
12329	targetWidth = dimensions.width;
12330	targetHeight = dimensions.height;
12331	targetOffset = dimensions.offset;
12332
12333	// Clone to reuse original targetOffset later
12334	basePosition = $.extend( {}, targetOffset );
12335
12336	// Force my and at to have valid horizontal and vertical positions
12337	// if a value is missing or invalid, it will be converted to center
12338	$.each( [ "my", "at" ], function() {
12339		var pos = ( options[ this ] || "" ).split( " " ),
12340			horizontalOffset,
12341			verticalOffset;
12342
12343		if ( pos.length === 1 ) {
12344			pos = rhorizontal.test( pos[ 0 ] ) ?
12345				pos.concat( [ "center" ] ) :
12346				rvertical.test( pos[ 0 ] ) ?
12347					[ "center" ].concat( pos ) :
12348					[ "center", "center" ];
12349		}
12350		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
12351		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
12352
12353		// Calculate offsets
12354		horizontalOffset = roffset.exec( pos[ 0 ] );
12355		verticalOffset = roffset.exec( pos[ 1 ] );
12356		offsets[ this ] = [
12357			horizontalOffset ? horizontalOffset[ 0 ] : 0,
12358			verticalOffset ? verticalOffset[ 0 ] : 0
12359		];
12360
12361		// Reduce to just the positions without the offsets
12362		options[ this ] = [
12363			rposition.exec( pos[ 0 ] )[ 0 ],
12364			rposition.exec( pos[ 1 ] )[ 0 ]
12365		];
12366	} );
12367
12368	// Normalize collision option
12369	if ( collision.length === 1 ) {
12370		collision[ 1 ] = collision[ 0 ];
12371	}
12372
12373	if ( options.at[ 0 ] === "right" ) {
12374		basePosition.left += targetWidth;
12375	} else if ( options.at[ 0 ] === "center" ) {
12376		basePosition.left += targetWidth / 2;
12377	}
12378
12379	if ( options.at[ 1 ] === "bottom" ) {
12380		basePosition.top += targetHeight;
12381	} else if ( options.at[ 1 ] === "center" ) {
12382		basePosition.top += targetHeight / 2;
12383	}
12384
12385	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
12386	basePosition.left += atOffset[ 0 ];
12387	basePosition.top += atOffset[ 1 ];
12388
12389	return this.each( function() {
12390		var collisionPosition, using,
12391			elem = $( this ),
12392			elemWidth = elem.outerWidth(),
12393			elemHeight = elem.outerHeight(),
12394			marginLeft = parseCss( this, "marginLeft" ),
12395			marginTop = parseCss( this, "marginTop" ),
12396			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
12397				scrollInfo.width,
12398			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
12399				scrollInfo.height,
12400			position = $.extend( {}, basePosition ),
12401			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
12402
12403		if ( options.my[ 0 ] === "right" ) {
12404			position.left -= elemWidth;
12405		} else if ( options.my[ 0 ] === "center" ) {
12406			position.left -= elemWidth / 2;
12407		}
12408
12409		if ( options.my[ 1 ] === "bottom" ) {
12410			position.top -= elemHeight;
12411		} else if ( options.my[ 1 ] === "center" ) {
12412			position.top -= elemHeight / 2;
12413		}
12414
12415		position.left += myOffset[ 0 ];
12416		position.top += myOffset[ 1 ];
12417
12418		collisionPosition = {
12419			marginLeft: marginLeft,
12420			marginTop: marginTop
12421		};
12422
12423		$.each( [ "left", "top" ], function( i, dir ) {
12424			if ( $.ui.position[ collision[ i ] ] ) {
12425				$.ui.position[ collision[ i ] ][ dir ]( position, {
12426					targetWidth: targetWidth,
12427					targetHeight: targetHeight,
12428					elemWidth: elemWidth,
12429					elemHeight: elemHeight,
12430					collisionPosition: collisionPosition,
12431					collisionWidth: collisionWidth,
12432					collisionHeight: collisionHeight,
12433					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
12434					my: options.my,
12435					at: options.at,
12436					within: within,
12437					elem: elem
12438				} );
12439			}
12440		} );
12441
12442		if ( options.using ) {
12443
12444			// Adds feedback as second argument to using callback, if present
12445			using = function( props ) {
12446				var left = targetOffset.left - position.left,
12447					right = left + targetWidth - elemWidth,
12448					top = targetOffset.top - position.top,
12449					bottom = top + targetHeight - elemHeight,
12450					feedback = {
12451						target: {
12452							element: target,
12453							left: targetOffset.left,
12454							top: targetOffset.top,
12455							width: targetWidth,
12456							height: targetHeight
12457						},
12458						element: {
12459							element: elem,
12460							left: position.left,
12461							top: position.top,
12462							width: elemWidth,
12463							height: elemHeight
12464						},
12465						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
12466						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
12467					};
12468				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
12469					feedback.horizontal = "center";
12470				}
12471				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
12472					feedback.vertical = "middle";
12473				}
12474				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
12475					feedback.important = "horizontal";
12476				} else {
12477					feedback.important = "vertical";
12478				}
12479				options.using.call( this, props, feedback );
12480			};
12481		}
12482
12483		elem.offset( $.extend( position, { using: using } ) );
12484	} );
12485};
12486
12487$.ui.position = {
12488	fit: {
12489		left: function( position, data ) {
12490			var within = data.within,
12491				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
12492				outerWidth = within.width,
12493				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
12494				overLeft = withinOffset - collisionPosLeft,
12495				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
12496				newOverRight;
12497
12498			// Element is wider than within
12499			if ( data.collisionWidth > outerWidth ) {
12500
12501				// Element is initially over the left side of within
12502				if ( overLeft > 0 && overRight <= 0 ) {
12503					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
12504						withinOffset;
12505					position.left += overLeft - newOverRight;
12506
12507				// Element is initially over right side of within
12508				} else if ( overRight > 0 && overLeft <= 0 ) {
12509					position.left = withinOffset;
12510
12511				// Element is initially over both left and right sides of within
12512				} else {
12513					if ( overLeft > overRight ) {
12514						position.left = withinOffset + outerWidth - data.collisionWidth;
12515					} else {
12516						position.left = withinOffset;
12517					}
12518				}
12519
12520			// Too far left -> align with left edge
12521			} else if ( overLeft > 0 ) {
12522				position.left += overLeft;
12523
12524			// Too far right -> align with right edge
12525			} else if ( overRight > 0 ) {
12526				position.left -= overRight;
12527
12528			// Adjust based on position and margin
12529			} else {
12530				position.left = max( position.left - collisionPosLeft, position.left );
12531			}
12532		},
12533		top: function( position, data ) {
12534			var within = data.within,
12535				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
12536				outerHeight = data.within.height,
12537				collisionPosTop = position.top - data.collisionPosition.marginTop,
12538				overTop = withinOffset - collisionPosTop,
12539				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
12540				newOverBottom;
12541
12542			// Element is taller than within
12543			if ( data.collisionHeight > outerHeight ) {
12544
12545				// Element is initially over the top of within
12546				if ( overTop > 0 && overBottom <= 0 ) {
12547					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
12548						withinOffset;
12549					position.top += overTop - newOverBottom;
12550
12551				// Element is initially over bottom of within
12552				} else if ( overBottom > 0 && overTop <= 0 ) {
12553					position.top = withinOffset;
12554
12555				// Element is initially over both top and bottom of within
12556				} else {
12557					if ( overTop > overBottom ) {
12558						position.top = withinOffset + outerHeight - data.collisionHeight;
12559					} else {
12560						position.top = withinOffset;
12561					}
12562				}
12563
12564			// Too far up -> align with top
12565			} else if ( overTop > 0 ) {
12566				position.top += overTop;
12567
12568			// Too far down -> align with bottom edge
12569			} else if ( overBottom > 0 ) {
12570				position.top -= overBottom;
12571
12572			// Adjust based on position and margin
12573			} else {
12574				position.top = max( position.top - collisionPosTop, position.top );
12575			}
12576		}
12577	},
12578	flip: {
12579		left: function( position, data ) {
12580			var within = data.within,
12581				withinOffset = within.offset.left + within.scrollLeft,
12582				outerWidth = within.width,
12583				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
12584				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
12585				overLeft = collisionPosLeft - offsetLeft,
12586				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
12587				myOffset = data.my[ 0 ] === "left" ?
12588					-data.elemWidth :
12589					data.my[ 0 ] === "right" ?
12590						data.elemWidth :
12591						0,
12592				atOffset = data.at[ 0 ] === "left" ?
12593					data.targetWidth :
12594					data.at[ 0 ] === "right" ?
12595						-data.targetWidth :
12596						0,
12597				offset = -2 * data.offset[ 0 ],
12598				newOverRight,
12599				newOverLeft;
12600
12601			if ( overLeft < 0 ) {
12602				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
12603					outerWidth - withinOffset;
12604				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
12605					position.left += myOffset + atOffset + offset;
12606				}
12607			} else if ( overRight > 0 ) {
12608				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
12609					atOffset + offset - offsetLeft;
12610				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
12611					position.left += myOffset + atOffset + offset;
12612				}
12613			}
12614		},
12615		top: function( position, data ) {
12616			var within = data.within,
12617				withinOffset = within.offset.top + within.scrollTop,
12618				outerHeight = within.height,
12619				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
12620				collisionPosTop = position.top - data.collisionPosition.marginTop,
12621				overTop = collisionPosTop - offsetTop,
12622				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
12623				top = data.my[ 1 ] === "top",
12624				myOffset = top ?
12625					-data.elemHeight :
12626					data.my[ 1 ] === "bottom" ?
12627						data.elemHeight :
12628						0,
12629				atOffset = data.at[ 1 ] === "top" ?
12630					data.targetHeight :
12631					data.at[ 1 ] === "bottom" ?
12632						-data.targetHeight :
12633						0,
12634				offset = -2 * data.offset[ 1 ],
12635				newOverTop,
12636				newOverBottom;
12637			if ( overTop < 0 ) {
12638				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
12639					outerHeight - withinOffset;
12640				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
12641					position.top += myOffset + atOffset + offset;
12642				}
12643			} else if ( overBottom > 0 ) {
12644				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
12645					offset - offsetTop;
12646				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
12647					position.top += myOffset + atOffset + offset;
12648				}
12649			}
12650		}
12651	},
12652	flipfit: {
12653		left: function() {
12654			$.ui.position.flip.left.apply( this, arguments );
12655			$.ui.position.fit.left.apply( this, arguments );
12656		},
12657		top: function() {
12658			$.ui.position.flip.top.apply( this, arguments );
12659			$.ui.position.fit.top.apply( this, arguments );
12660		}
12661	}
12662};
12663
12664} )();
12665
12666var position = $.ui.position;
12667
12668
12669/*!
12670 * jQuery UI 
12670:data 1.13.2
12671 * http://jqueryui.com
12672 *
12673 * Copyright jQuery Foundation and other contributors
12674 * Released under the MIT license.
12675 * http://jquery.org/license
12676 */
12677
12678//>>label: :data Selector
vendor: 1,696 bytes, lines 12679-12747
12679//>>group: Core
12680//>>description: Selects elements which have data stored under the specified key.
12681//>>docs: http://api.jqueryui.com/data-selector/
12682
12683
12684var data = $.extend( $.expr.pseudos, {
12685	data: $.expr.createPseudo ?
12686		$.expr.createPseudo( function( dataName ) {
12687			return function( elem ) {
12688				return !!$.data( elem, dataName );
12689			};
12690		} ) :
12691
12692		// Support: jQuery <1.8
12693		function( elem, i, match ) {
12694			return !!$.data( elem, match[ 3 ] );
12695		}
12696} );
12697
12698/*!
12699 * jQuery UI Disable Selection 1.13.2
12700 * http://jqueryui.com
12701 *
12702 * Copyright jQuery Foundation and other contributors
12703 * Released under the MIT license.
12704 * http://jquery.org/license
12705 */
12706
12707//>>label: disableSelection
12708//>>group: Core
12709//>>description: Disable selection of text content within the set of matched elements.
12710//>>docs: http://api.jqueryui.com/disableSelection/
12711
12712// This file is deprecated
12713
12714var disableSelection = $.fn.extend( {
12715	disableSelection: ( function() {
12716		var eventType = "onselectstart" in document.createElement( "div" ) ?
12717			"selectstart" :
12718			"mousedown";
12719
12720		return function() {
12721			return this.on( eventType + ".ui-disableSelection", function( event ) {
12722				event.preventDefault();
12723			} );
12724		};
12725	} )(),
12726
12727	enableSelection: function() {
12728		return this.off( ".ui-disableSelection" );
12729	}
12730} );
12731
12732
12733
12734// Create a local jQuery because jQuery Color relies on it and the
12735// global may not exist with AMD and a custom build (#10199).
12736// This module is a noop if used as a regular AMD module.
12737// eslint-disable-next-line no-unused-vars
12738var jQuery = $;
12739
12740
12741/*!
12742 * jQuery Color Animations v2.2.0
12743 * https://github.com/jquery/jquery-color
12744 *
12745 * Copyright OpenJS Foundation and other contributors
12746 * Released under the MIT license.
12747 * http
vendor: 16,926 bytes, lines 12747-13454
12747://jquery.org/license
12748 *
12749 * Date: Sun May 10 09:02:36 2020 +0200
12750 */
12751
12752
12753
12754	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
12755		"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
12756
12757	class2type = {},
12758	toString = class2type.toString,
12759
12760	// plusequals test for += 100 -= 100
12761	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
12762
12763	// a set of RE's that can match strings and generate color tuples.
12764	stringParsers = [ {
12765			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
12766			parse: function( execResult ) {
12767				return [
12768					execResult[ 1 ],
12769					execResult[ 2 ],
12770					execResult[ 3 ],
12771					execResult[ 4 ]
12772				];
12773			}
12774		}, {
12775			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
12776			parse: function( execResult ) {
12777				return [
12778					execResult[ 1 ] * 2.55,
12779					execResult[ 2 ] * 2.55,
12780					execResult[ 3 ] * 2.55,
12781					execResult[ 4 ]
12782				];
12783			}
12784		}, {
12785
12786			// this regex ignores A-F because it's compared against an already lowercased string
12787			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/,
12788			parse: function( execResult ) {
12789				return [
12790					parseInt( execResult[ 1 ], 16 ),
12791					parseInt( execResult[ 2 ], 16 ),
12792					parseInt( execResult[ 3 ], 16 ),
12793					execResult[ 4 ] ?
12794						( parseInt( execResult[ 4 ], 16 ) / 255 ).toFixed( 2 ) :
12795						1
12796				];
12797			}
12798		}, {
12799
12800			// this regex ignores A-F because it's compared against an already lowercased string
12801			re: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/,
12802			parse: function( execResult ) {
12803				return [
12804					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
12805					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
12806					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ),
12807					execResult[ 4 ] ?
12808						( parseInt( execResult[ 4 ] + execResult[ 4 ], 16 ) / 255 )
12809							.toFixed( 2 ) :
12810						1
12811				];
12812			}
12813		}, {
12814			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
12815			space: "hsla",
12816			parse: function( execResult ) {
12817				return [
12818					execResult[ 1 ],
12819					execResult[ 2 ] / 100,
12820					execResult[ 3 ] / 100,
12821					execResult[ 4 ]
12822				];
12823			}
12824		} ],
12825
12826	// jQuery.Color( )
12827	color = jQuery.Color = function( color, green, blue, alpha ) {
12828		return new jQuery.Color.fn.parse( color, green, blue, alpha );
12829	},
12830	spaces = {
12831		rgba: {
12832			props: {
12833				red: {
12834					idx: 0,
12835					type: "byte"
12836				},
12837				green: {
12838					idx: 1,
12839					type: "byte"
12840				},
12841				blue: {
12842					idx: 2,
12843					type: "byte"
12844				}
12845			}
12846		},
12847
12848		hsla: {
12849			props: {
12850				hue: {
12851					idx: 0,
12852					type: "degrees"
12853				},
12854				saturation: {
12855					idx: 1,
12856					type: "percent"
12857				},
12858				lightness: {
12859					idx: 2,
12860					type: "percent"
12861				}
12862			}
12863		}
12864	},
12865	propTypes = {
12866		"byte": {
12867			floor: true,
12868			max: 255
12869		},
12870		"percent": {
12871			max: 1
12872		},
12873		"degrees": {
12874			mod: 360,
12875			floor: true
12876		}
12877	},
12878	support = color.support = {},
12879
12880	// element for support tests
12881	supportElem = jQuery( "<p>" )[ 0 ],
12882
12883	// colors = jQuery.Color.names
12884	colors,
12885
12886	// local aliases of functions called often
12887	each = jQuery.each;
12888
12889// determine rgba support immediately
12890supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
12891support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
12892
12893// define cache name and alpha properties
12894// for rgba and hsla spaces
12895each( spaces, function( spaceName, space ) {
12896	space.cache = "_" + spaceName;
12897	space.props.alpha = {
12898		idx: 3,
12899		type: "percent",
12900		def: 1
12901	};
12902} );
12903
12904// Populate the class2type map
12905jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
12906	function( _i, name ) {
12907		class2type[ "[object " + name + "]" ] = name.toLowerCase();
12908	} );
12909
12910function getType( obj ) {
12911	if ( obj == null ) {
12912		return obj + "";
12913	}
12914
12915	return typeof obj === "object" ?
12916		class2type[ toString.call( obj ) ] || "object" :
12917		typeof obj;
12918}
12919
12920function clamp( value, prop, allowEmpty ) {
12921	var type = propTypes[ prop.type ] || {};
12922
12923	if ( value == null ) {
12924		return ( allowEmpty || !prop.def ) ? null : prop.def;
12925	}
12926
12927	// ~~ is an short way of doing floor for positive numbers
12928	value = type.floor ? ~~value : parseFloat( value );
12929
12930	// IE will pass in empty strings as value for alpha,
12931	// which will hit this case
12932	if ( isNaN( value ) ) {
12933		return prop.def;
12934	}
12935
12936	if ( type.mod ) {
12937
12938		// we add mod before modding to make sure that negatives values
12939		// get converted properly: -10 -> 350
12940		return ( value + type.mod ) % type.mod;
12941	}
12942
12943	// for now all property types without mod have min and max
12944	return Math.min( type.max, Math.max( 0, value ) );
12945}
12946
12947function stringParse( string ) {
12948	var inst = color(),
12949		rgba = inst._rgba = [];
12950
12951	string = string.toLowerCase();
12952
12953	each( stringParsers, function( _i, parser ) {
12954		var parsed,
12955			match = parser.re.exec( string ),
12956			values = match && parser.parse( match ),
12957			spaceName = parser.space || "rgba";
12958
12959		if ( values ) {
12960			parsed = inst[ spaceName ]( values );
12961
12962			// if this was an rgba parse the assignment might happen twice
12963			// oh well....
12964			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
12965			rgba = inst._rgba = parsed._rgba;
12966
12967			// exit each( stringParsers ) here because we matched
12968			return false;
12969		}
12970	} );
12971
12972	// Found a stringParser that handled it
12973	if ( rgba.length ) {
12974
12975		// if this came from a parsed string, force "transparent" when alpha is 0
12976		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
12977		if ( rgba.join() === "0,0,0,0" ) {
12978			jQuery.extend( rgba, colors.transparent );
12979		}
12980		return inst;
12981	}
12982
12983	// named colors
12984	return colors[ string ];
12985}
12986
12987color.fn = jQuery.extend( color.prototype, {
12988	parse: function( red, green, blue, alpha ) {
12989		if ( red === undefined ) {
12990			this._rgba = [ null, null, null, null ];
12991			return this;
12992		}
12993		if ( red.jquery || red.nodeType ) {
12994			red = jQuery( red ).css( green );
12995			green = undefined;
12996		}
12997
12998		var inst = this,
12999			type = getType( red ),
13000			rgba = this._rgba = [];
13001
13002		// more than 1 argument specified - assume ( red, green, blue, alpha )
13003		if ( green !== undefined ) {
13004			red = [ red, green, blue, alpha ];
13005			type = "array";
13006		}
13007
13008		if ( type === "string" ) {
13009			return this.parse( stringParse( red ) || colors._default );
13010		}
13011
13012		if ( type === "array" ) {
13013			each( spaces.rgba.props, function( _key, prop ) {
13014				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
13015			} );
13016			return this;
13017		}
13018
13019		if ( type === "object" ) {
13020			if ( red instanceof color ) {
13021				each( spaces, function( _spaceName, space ) {
13022					if ( red[ space.cache ] ) {
13023						inst[ space.cache ] = red[ space.cache ].slice();
13024					}
13025				} );
13026			} else {
13027				each( spaces, function( _spaceName, space ) {
13028					var cache = space.cache;
13029					each( space.props, function( key, prop ) {
13030
13031						// if the cache doesn't exist, and we know how to convert
13032						if ( !inst[ cache ] && space.to ) {
13033
13034							// if the value was null, we don't need to copy it
13035							// if the key was alpha, we don't need to copy it either
13036							if ( key === "alpha" || red[ key ] == null ) {
13037								return;
13038							}
13039							inst[ cache ] = space.to( inst._rgba );
13040						}
13041
13042						// this is the only case where we allow nulls for ALL properties.
13043						// call clamp with alwaysAllowEmpty
13044						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
13045					} );
13046
13047					// everything defined but alpha?
13048					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
13049
13050						// use the default of 1
13051						if ( inst[ cache ][ 3 ] == null ) {
13052							inst[ cache ][ 3 ] = 1;
13053						}
13054
13055						if ( space.from ) {
13056							inst._rgba = space.from( inst[ cache ] );
13057						}
13058					}
13059				} );
13060			}
13061			return this;
13062		}
13063	},
13064	is: function( compare ) {
13065		var is = color( compare ),
13066			same = true,
13067			inst = this;
13068
13069		each( spaces, function( _, space ) {
13070			var localCache,
13071				isCache = is[ space.cache ];
13072			if ( isCache ) {
13073				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
13074				each( space.props, function( _, prop ) {
13075					if ( isCache[ prop.idx ] != null ) {
13076						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
13077						return same;
13078					}
13079				} );
13080			}
13081			return same;
13082		} );
13083		return same;
13084	},
13085	_space: function() {
13086		var used = [],
13087			inst = this;
13088		each( spaces, function( spaceName, space ) {
13089			if ( inst[ space.cache ] ) {
13090				used.push( spaceName );
13091			}
13092		} );
13093		return used.pop();
13094	},
13095	transition: function( other, distance ) {
13096		var end = color( other ),
13097			spaceName = end._space(),
13098			space = spaces[ spaceName ],
13099			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
13100			start = startColor[ space.cache ] || space.to( startColor._rgba ),
13101			result = start.slice();
13102
13103		end = end[ space.cache ];
13104		each( space.props, function( _key, prop ) {
13105			var index = prop.idx,
13106				startValue = start[ index ],
13107				endValue = end[ index ],
13108				type = propTypes[ prop.type ] || {};
13109
13110			// if null, don't override start value
13111			if ( endValue === null ) {
13112				return;
13113			}
13114
13115			// if null - use end
13116			if ( startValue === null ) {
13117				result[ index ] = endValue;
13118			} else {
13119				if ( type.mod ) {
13120					if ( endValue - startValue > type.mod / 2 ) {
13121						startValue += type.mod;
13122					} else if ( startValue - endValue > type.mod / 2 ) {
13123						startValue -= type.mod;
13124					}
13125				}
13126				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
13127			}
13128		} );
13129		return this[ spaceName ]( result );
13130	},
13131	blend: function( opaque ) {
13132
13133		// if we are already opaque - return ourself
13134		if ( this._rgba[ 3 ] === 1 ) {
13135			return this;
13136		}
13137
13138		var rgb = this._rgba.slice(),
13139			a = rgb.pop(),
13140			blend = color( opaque )._rgba;
13141
13142		return color( jQuery.map( rgb, function( v, i ) {
13143			return ( 1 - a ) * blend[ i ] + a * v;
13144		} ) );
13145	},
13146	toRgbaString: function() {
13147		var prefix = "rgba(",
13148			rgba = jQuery.map( this._rgba, function( v, i ) {
13149				if ( v != null ) {
13150					return v;
13151				}
13152				return i > 2 ? 1 : 0;
13153			} );
13154
13155		if ( rgba[ 3 ] === 1 ) {
13156			rgba.pop();
13157			prefix = "rgb(";
13158		}
13159
13160		return prefix + rgba.join() + ")";
13161	},
13162	toHslaString: function() {
13163		var prefix = "hsla(",
13164			hsla = jQuery.map( this.hsla(), function( v, i ) {
13165				if ( v == null ) {
13166					v = i > 2 ? 1 : 0;
13167				}
13168
13169				// catch 1 and 2
13170				if ( i && i < 3 ) {
13171					v = Math.round( v * 100 ) + "%";
13172				}
13173				return v;
13174			} );
13175
13176		if ( hsla[ 3 ] === 1 ) {
13177			hsla.pop();
13178			prefix = "hsl(";
13179		}
13180		return prefix + hsla.join() + ")";
13181	},
13182	toHexString: function( includeAlpha ) {
13183		var rgba = this._rgba.slice(),
13184			alpha = rgba.pop();
13185
13186		if ( includeAlpha ) {
13187			rgba.push( ~~( alpha * 255 ) );
13188		}
13189
13190		return "#" + jQuery.map( rgba, function( v ) {
13191
13192			// default to 0 when nulls exist
13193			v = ( v || 0 ).toString( 16 );
13194			return v.length === 1 ? "0" + v : v;
13195		} ).join( "" );
13196	},
13197	toString: function() {
13198		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
13199	}
13200} );
13201color.fn.parse.prototype = color.fn;
13202
13203// hsla conversions adapted from:
13204// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
13205
13206function hue2rgb( p, q, h ) {
13207	h = ( h + 1 ) % 1;
13208	if ( h * 6 < 1 ) {
13209		return p + ( q - p ) * h * 6;
13210	}
13211	if ( h * 2 < 1 ) {
13212		return q;
13213	}
13214	if ( h * 3 < 2 ) {
13215		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
13216	}
13217	return p;
13218}
13219
13220spaces.hsla.to = function( rgba ) {
13221	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
13222		return [ null, null, null, rgba[ 3 ] ];
13223	}
13224	var r = rgba[ 0 ] / 255,
13225		g = rgba[ 1 ] / 255,
13226		b = rgba[ 2 ] / 255,
13227		a = rgba[ 3 ],
13228		max = Math.max( r, g, b ),
13229		min = Math.min( r, g, b ),
13230		diff = max - min,
13231		add = max + min,
13232		l = add * 0.5,
13233		h, s;
13234
13235	if ( min === max ) {
13236		h = 0;
13237	} else if ( r === max ) {
13238		h = ( 60 * ( g - b ) / diff ) + 360;
13239	} else if ( g === max ) {
13240		h = ( 60 * ( b - r ) / diff ) + 120;
13241	} else {
13242		h = ( 60 * ( r - g ) / diff ) + 240;
13243	}
13244
13245	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
13246	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
13247	if ( diff === 0 ) {
13248		s = 0;
13249	} else if ( l <= 0.5 ) {
13250		s = diff / add;
13251	} else {
13252		s = diff / ( 2 - add );
13253	}
13254	return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
13255};
13256
13257spaces.hsla.from = function( hsla ) {
13258	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
13259		return [ null, null, null, hsla[ 3 ] ];
13260	}
13261	var h = hsla[ 0 ] / 360,
13262		s = hsla[ 1 ],
13263		l = hsla[ 2 ],
13264		a = hsla[ 3 ],
13265		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
13266		p = 2 * l - q;
13267
13268	return [
13269		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
13270		Math.round( hue2rgb( p, q, h ) * 255 ),
13271		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
13272		a
13273	];
13274};
13275
13276
13277each( spaces, function( spaceName, space ) {
13278	var props = space.props,
13279		cache = space.cache,
13280		to = space.to,
13281		from = space.from;
13282
13283	// makes rgba() and hsla()
13284	color.fn[ spaceName ] = function( value ) {
13285
13286		// generate a cache for this space if it doesn't exist
13287		if ( to && !this[ cache ] ) {
13288			this[ cache ] = to( this._rgba );
13289		}
13290		if ( value === undefined ) {
13291			return this[ cache ].slice();
13292		}
13293
13294		var ret,
13295			type = getType( value ),
13296			arr = ( type === "array" || type === "object" ) ? value : arguments,
13297			local = this[ cache ].slice();
13298
13299		each( props, function( key, prop ) {
13300			var val = arr[ type === "object" ? key : prop.idx ];
13301			if ( val == null ) {
13302				val = local[ prop.idx ];
13303			}
13304			local[ prop.idx ] = clamp( val, prop );
13305		} );
13306
13307		if ( from ) {
13308			ret = color( from( local ) );
13309			ret[ cache ] = local;
13310			return ret;
13311		} else {
13312			return color( local );
13313		}
13314	};
13315
13316	// makes red() green() blue() alpha() hue() saturation() lightness()
13317	each( props, function( key, prop ) {
13318
13319		// alpha is included in more than one space
13320		if ( color.fn[ key ] ) {
13321			return;
13322		}
13323		color.fn[ key ] = function( value ) {
13324			var local, cur, match, fn,
13325				vtype = getType( value );
13326
13327			if ( key === "alpha" ) {
13328				fn = this._hsla ? "hsla" : "rgba";
13329			} else {
13330				fn = spaceName;
13331			}
13332			local = this[ fn ]();
13333			cur = local[ prop.idx ];
13334
13335			if ( vtype === "undefined" ) {
13336				return cur;
13337			}
13338
13339			if ( vtype === "function" ) {
13340				value = value.call( this, cur );
13341				vtype = getType( value );
13342			}
13343			if ( value == null && prop.empty ) {
13344				return this;
13345			}
13346			if ( vtype === "string" ) {
13347				match = rplusequals.exec( value );
13348				if ( match ) {
13349					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
13350				}
13351			}
13352			local[ prop.idx ] = value;
13353			return this[ fn ]( local );
13354		};
13355	} );
13356} );
13357
13358// add cssHook and .fx.step function for each named hook.
13359// accept a space separated string of properties
13360color.hook = function( hook ) {
13361	var hooks = hook.split( " " );
13362	each( hooks, function( _i, hook ) {
13363		jQuery.cssHooks[ hook ] = {
13364			set: function( elem, value ) {
13365				var parsed, curElem,
13366					backgroundColor = "";
13367
13368				if ( value !== "transparent" && ( getType( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
13369					value = color( parsed || value );
13370					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
13371						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
13372						while (
13373							( backgroundColor === "" || backgroundColor === "transparent" ) &&
13374							curElem && curElem.style
13375						) {
13376							try {
13377								backgroundColor = jQuery.css( curElem, "backgroundColor" );
13378								curElem = curElem.parentNode;
13379							} catch ( e ) {
13380							}
13381						}
13382
13383						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
13384							backgroundColor :
13385							"_default" );
13386					}
13387
13388					value = value.toRgbaString();
13389				}
13390				try {
13391					elem.style[ hook ] = value;
13392				} catch ( e ) {
13393
13394					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
13395				}
13396			}
13397		};
13398		jQuery.fx.step[ hook ] = function( fx ) {
13399			if ( !fx.colorInit ) {
13400				fx.start = color( fx.elem, hook );
13401				fx.end = color( fx.end );
13402				fx.colorInit = true;
13403			}
13404			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
13405		};
13406	} );
13407
13408};
13409
13410color.hook( stepHooks );
13411
13412jQuery.cssHooks.borderColor = {
13413	expand: function( value ) {
13414		var expanded = {};
13415
13416		each( [ "Top", "Right", "Bottom", "Left" ], function( _i, part ) {
13417			expanded[ "border" + part + "Color" ] = value;
13418		} );
13419		return expanded;
13420	}
13421};
13422
13423// Basic color names only.
13424// Usage of any of the other color names requires adding yourself or including
13425// jquery.color.svg-names.js.
13426colors = jQuery.Color.names = {
13427
13428	// 4.1. Basic color keywords
13429	aqua: "#00ffff",
13430	black: "#000000",
13431	blue: "#0000ff",
13432	fuchsia: "#ff00ff",
13433	gray: "#808080",
13434	green: "#008000",
13435	lime: "#00ff00",
13436	maroon: "#800000",
13437	navy: "#000080",
13438	olive: "#808000",
13439	purple: "#800080",
13440	red: "#ff0000",
13441	silver: "#c0c0c0",
13442	teal: "#008080",
13443	white: "#ffffff",
13444	yellow: "#ffff00",
13445
13446	// 4.2.3. "transparent" color keyword
13447	transparent: [ null, null, null, 0 ],
13448
13449	_default: "#ffffff"
13450};
13451
13452
13453/*!
13454 * jQuery UI Effects 1.13.
134542
13455 * http://jqueryui.com
13456 *
13457 * Copyright jQuery Foundation and other contributors
13458 * Released under the MIT license.
13459 * http://jquery.org/license
13460 */
13461
13462//>>label: Effects Core
13463//>>group: Effects
13464/* eslint-disable max-len */
13465//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
13466/* eslint-enable max-len */
13467//>>docs: http://api.jqueryui.com/category/effects-core/
13468//>>demos: http
vendor: 9,484 bytes, lines 13468-13838
13468://jqueryui.com/effect/
13469
13470
13471var dataSpace = "ui-effects-",
13472	dataSpaceStyle = "ui-effects-style",
13473	dataSpaceAnimated = "ui-effects-animated";
13474
13475$.effects = {
13476	effect: {}
13477};
13478
13479/******************************************************************************/
13480/****************************** CLASS ANIMATIONS ******************************/
13481/******************************************************************************/
13482( function() {
13483
13484var classAnimationActions = [ "add", "remove", "toggle" ],
13485	shorthandStyles = {
13486		border: 1,
13487		borderBottom: 1,
13488		borderColor: 1,
13489		borderLeft: 1,
13490		borderRight: 1,
13491		borderTop: 1,
13492		borderWidth: 1,
13493		margin: 1,
13494		padding: 1
13495	};
13496
13497$.each(
13498	[ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
13499	function( _, prop ) {
13500		$.fx.step[ prop ] = function( fx ) {
13501			if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
13502				jQuery.style( fx.elem, prop, fx.end );
13503				fx.setAttr = true;
13504			}
13505		};
13506	}
13507);
13508
13509function camelCase( string ) {
13510	return string.replace( /-([\da-z])/gi, function( all, letter ) {
13511		return letter.toUpperCase();
13512	} );
13513}
13514
13515function getElementStyles( elem ) {
13516	var key, len,
13517		style = elem.ownerDocument.defaultView ?
13518			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
13519			elem.currentStyle,
13520		styles = {};
13521
13522	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
13523		len = style.length;
13524		while ( len-- ) {
13525			key = style[ len ];
13526			if ( typeof style[ key ] === "string" ) {
13527				styles[ camelCase( key ) ] = style[ key ];
13528			}
13529		}
13530
13531	// Support: Opera, IE <9
13532	} else {
13533		for ( key in style ) {
13534			if ( typeof style[ key ] === "string" ) {
13535				styles[ key ] = style[ key ];
13536			}
13537		}
13538	}
13539
13540	return styles;
13541}
13542
13543function styleDifference( oldStyle, newStyle ) {
13544	var diff = {},
13545		name, value;
13546
13547	for ( name in newStyle ) {
13548		value = newStyle[ name ];
13549		if ( oldStyle[ name ] !== value ) {
13550			if ( !shorthandStyles[ name ] ) {
13551				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
13552					diff[ name ] = value;
13553				}
13554			}
13555		}
13556	}
13557
13558	return diff;
13559}
13560
13561// Support: jQuery <1.8
13562if ( !$.fn.addBack ) {
13563	$.fn.addBack = function( selector ) {
13564		return this.add( selector == null ?
13565			this.prevObject : this.prevObject.filter( selector )
13566		);
13567	};
13568}
13569
13570$.effects.animateClass = function( value, duration, easing, callback ) {
13571	var o = $.speed( duration, easing, callback );
13572
13573	return this.queue( function() {
13574		var animated = $( this ),
13575			baseClass = animated.attr( "class" ) || "",
13576			applyClassChange,
13577			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
13578
13579		// Map the animated objects to store the original styles.
13580		allAnimations = allAnimations.map( function() {
13581			var el = $( this );
13582			return {
13583				el: el,
13584				start: getElementStyles( this )
13585			};
13586		} );
13587
13588		// Apply class change
13589		applyClassChange = function() {
13590			$.each( classAnimationActions, function( i, action ) {
13591				if ( value[ action ] ) {
13592					animated[ action + "Class" ]( value[ action ] );
13593				}
13594			} );
13595		};
13596		applyClassChange();
13597
13598		// Map all animated objects again - calculate new styles and diff
13599		allAnimations = allAnimations.map( function() {
13600			this.end = getElementStyles( this.el[ 0 ] );
13601			this.diff = styleDifference( this.start, this.end );
13602			return this;
13603		} );
13604
13605		// Apply original class
13606		animated.attr( "class", baseClass );
13607
13608		// Map all animated objects again - this time collecting a promise
13609		allAnimations = allAnimations.map( function() {
13610			var styleInfo = this,
13611				dfd = $.Deferred(),
13612				opts = $.extend( {}, o, {
13613					queue: false,
13614					complete: function() {
13615						dfd.resolve( styleInfo );
13616					}
13617				} );
13618
13619			this.el.animate( this.diff, opts );
13620			return dfd.promise();
13621		} );
13622
13623		// Once all animations have completed:
13624		$.when.apply( $, allAnimations.get() ).done( function() {
13625
13626			// Set the final class
13627			applyClassChange();
13628
13629			// For each animated element,
13630			// clear all css properties that were animated
13631			$.each( arguments, function() {
13632				var el = this.el;
13633				$.each( this.diff, function( key ) {
13634					el.css( key, "" );
13635				} );
13636			} );
13637
13638			// This is guarnteed to be there if you use jQuery.speed()
13639			// it also handles dequeuing the next anim...
13640			o.complete.call( animated[ 0 ] );
13641		} );
13642	} );
13643};
13644
13645$.fn.extend( {
13646	addClass: ( function( orig ) {
13647		return function( classNames, speed, easing, callback ) {
13648			return speed ?
13649				$.effects.animateClass.call( this,
13650					{ add: classNames }, speed, easing, callback ) :
13651				orig.apply( this, arguments );
13652		};
13653	} )( $.fn.addClass ),
13654
13655	removeClass: ( function( orig ) {
13656		return function( classNames, speed, easing, callback ) {
13657			return arguments.length > 1 ?
13658				$.effects.animateClass.call( this,
13659					{ remove: classNames }, speed, easing, callback ) :
13660				orig.apply( this, arguments );
13661		};
13662	} )( $.fn.removeClass ),
13663
13664	toggleClass: ( function( orig ) {
13665		return function( classNames, force, speed, easing, callback ) {
13666			if ( typeof force === "boolean" || force === undefined ) {
13667				if ( !speed ) {
13668
13669					// Without speed parameter
13670					return orig.apply( this, arguments );
13671				} else {
13672					return $.effects.animateClass.call( this,
13673						( force ? { add: classNames } : { remove: classNames } ),
13674						speed, easing, callback );
13675				}
13676			} else {
13677
13678				// Without force parameter
13679				return $.effects.animateClass.call( this,
13680					{ toggle: classNames }, force, speed, easing );
13681			}
13682		};
13683	} )( $.fn.toggleClass ),
13684
13685	switchClass: function( remove, add, speed, easing, callback ) {
13686		return $.effects.animateClass.call( this, {
13687			add: add,
13688			remove: remove
13689		}, speed, easing, callback );
13690	}
13691} );
13692
13693} )();
13694
13695/******************************************************************************/
13696/*********************************** EFFECTS **********************************/
13697/******************************************************************************/
13698
13699( function() {
13700
13701if ( $.expr && $.expr.pseudos && $.expr.pseudos.animated ) {
13702	$.expr.pseudos.animated = ( function( orig ) {
13703		return function( elem ) {
13704			return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
13705		};
13706	} )( $.expr.pseudos.animated );
13707}
13708
13709if ( $.uiBackCompat !== false ) {
13710	$.extend( $.effects, {
13711
13712		// Saves a set of properties in a data storage
13713		save: function( element, set ) {
13714			var i = 0, length = set.length;
13715			for ( ; i < length; i++ ) {
13716				if ( set[ i ] !== null ) {
13717					element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
13718				}
13719			}
13720		},
13721
13722		// Restores a set of previously saved properties from a data storage
13723		restore: function( element, set ) {
13724			var val, i = 0, length = set.length;
13725			for ( ; i < length; i++ ) {
13726				if ( set[ i ] !== null ) {
13727					val = element.data( dataSpace + set[ i ] );
13728					element.css( set[ i ], val );
13729				}
13730			}
13731		},
13732
13733		setMode: function( el, mode ) {
13734			if ( mode === "toggle" ) {
13735				mode = el.is( ":hidden" ) ? "show" : "hide";
13736			}
13737			return mode;
13738		},
13739
13740		// Wraps the element around a wrapper that copies position properties
13741		createWrapper: function( element ) {
13742
13743			// If the element is already wrapped, return it
13744			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
13745				return element.parent();
13746			}
13747
13748			// Wrap the element
13749			var props = {
13750					width: element.outerWidth( true ),
13751					height: element.outerHeight( true ),
13752					"float": element.css( "float" )
13753				},
13754				wrapper = $( "<div></div>" )
13755					.addClass( "ui-effects-wrapper" )
13756					.css( {
13757						fontSize: "100%",
13758						background: "transparent",
13759						border: "none",
13760						margin: 0,
13761						padding: 0
13762					} ),
13763
13764				// Store the size in case width/height are defined in % - Fixes #5245
13765				size = {
13766					width: element.width(),
13767					height: element.height()
13768				},
13769				active = document.activeElement;
13770
13771			// Support: Firefox
13772			// Firefox incorrectly exposes anonymous content
13773			// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
13774			try {
13775				// eslint-disable-next-line no-unused-expressions
13776				active.id;
13777			} catch ( e ) {
13778				active = document.body;
13779			}
13780
13781			element.wrap( wrapper );
13782
13783			// Fixes #7595 - Elements lose focus when wrapped.
13784			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
13785				$( active ).trigger( "focus" );
13786			}
13787
13788			// Hotfix for jQuery 1.4 since some change in wrap() seems to actually
13789			// lose the reference to the wrapped element
13790			wrapper = element.parent();
13791
13792			// Transfer positioning properties to the wrapper
13793			if ( element.css( "position" ) === "static" ) {
13794				wrapper.css( { position: "relative" } );
13795				element.css( { position: "relative" } );
13796			} else {
13797				$.extend( props, {
13798					position: element.css( "position" ),
13799					zIndex: element.css( "z-index" )
13800				} );
13801				$.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
13802					props[ pos ] = element.css( pos );
13803					if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
13804						props[ pos ] = "auto";
13805					}
13806				} );
13807				element.css( {
13808					position: "relative",
13809					top: 0,
13810					left: 0,
13811					right: "auto",
13812					bottom: "auto"
13813				} );
13814			}
13815			element.css( size );
13816
13817			return wrapper.css( props ).show();
13818		},
13819
13820		removeWrapper: function( element ) {
13821			var active = document.activeElement;
13822
13823			if ( element.parent().is( ".ui-effects-wrapper" ) ) {
13824				element.parent().replaceWith( element );
13825
13826				// Fixes #7595 - Elements lose focus when wrapped.
13827				if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
13828					$( active ).trigger( "focus" );
13829				}
13830			}
13831
13832			return element;
13833		}
13834	} );
13835}
13836
13837$.extend( $.effects, {
13838	version: "1.13.
vendor: 2,055 bytes, lines 13838-13933
138382",
13839
13840	define: function( name, mode, effect ) {
13841		if ( !effect ) {
13842			effect = mode;
13843			mode = "effect";
13844		}
13845
13846		$.effects.effect[ name ] = effect;
13847		$.effects.effect[ name ].mode = mode;
13848
13849		return effect;
13850	},
13851
13852	scaledDimensions: function( element, percent, direction ) {
13853		if ( percent === 0 ) {
13854			return {
13855				height: 0,
13856				width: 0,
13857				outerHeight: 0,
13858				outerWidth: 0
13859			};
13860		}
13861
13862		var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
13863			y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
13864
13865		return {
13866			height: element.height() * y,
13867			width: element.width() * x,
13868			outerHeight: element.outerHeight() * y,
13869			outerWidth: element.outerWidth() * x
13870		};
13871
13872	},
13873
13874	clipToBox: function( animation ) {
13875		return {
13876			width: animation.clip.right - animation.clip.left,
13877			height: animation.clip.bottom - animation.clip.top,
13878			left: animation.clip.left,
13879			top: animation.clip.top
13880		};
13881	},
13882
13883	// Injects recently queued functions to be first in line (after "inprogress")
13884	unshift: function( element, queueLength, count ) {
13885		var queue = element.queue();
13886
13887		if ( queueLength > 1 ) {
13888			queue.splice.apply( queue,
13889				[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
13890		}
13891		element.dequeue();
13892	},
13893
13894	saveStyle: function( element ) {
13895		element.data( dataSpaceStyle, element[ 0 ].style.cssText );
13896	},
13897
13898	restoreStyle: function( element ) {
13899		element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
13900		element.removeData( dataSpaceStyle );
13901	},
13902
13903	mode: function( element, mode ) {
13904		var hidden = element.is( ":hidden" );
13905
13906		if ( mode === "toggle" ) {
13907			mode = hidden ? "show" : "hide";
13908		}
13909		if ( hidden ? mode === "hide" : mode === "show" ) {
13910			mode = "none";
13911		}
13912		return mode;
13913	},
13914
13915	// Translates a [top,left] array into a baseline value
13916	getBaseline: function( origin, original ) {
13917		var y, x;
13918
13919		switch ( origin[ 0 ] ) {
13920		case "top":
13921			y = 0;
13922			break;
13923		case "middle":
13924			y = 0.5;
13925			break;
13926		case "bottom":
13927			y = 1;
13928			break;
13929		default:
13930			y = origin[ 0 ] / original.height;
13931		}
13932
13933		switch ( origin[ 1 ] ) {
13934		case "left":
13935			x = 0;
13936			break;
13937		case "center":
13938			x = 0.5;
13939			break;
13940		case "right":
13941			x = 1;
13942			break;
13943		default:
13944			x = origin[ 1 ] / original.width;
13945		}
13946
13947		return {
13948			x: x,
13949			y: y
13950		};
13951	},
13952
13953	// Creates a placeholder element so that the original element can be made absolute
13954	createPlaceholder: function( element ) {
13955		var placeholder,
13956			cssPosition = element.css( "position" ),
13957			position = element.position();
13958
13959		// Lock in margins first to account for form elements, which
13960		// will change margin if you explicitly set height
13961		// see: http
vendor: 10,558 bytes, lines 13961-14355
13961://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
13962		// Support: Safari
13963		element.css( {
13964			marginTop: element.css( "marginTop" ),
13965			marginBottom: element.css( "marginBottom" ),
13966			marginLeft: element.css( "marginLeft" ),
13967			marginRight: element.css( "marginRight" )
13968		} )
13969		.outerWidth( element.outerWidth() )
13970		.outerHeight( element.outerHeight() );
13971
13972		if ( /^(static|relative)/.test( cssPosition ) ) {
13973			cssPosition = "absolute";
13974
13975			placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
13976
13977				// Convert inline to inline block to account for inline elements
13978				// that turn to inline block based on content (like img)
13979				display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
13980					"inline-block" :
13981					"block",
13982				visibility: "hidden",
13983
13984				// Margins need to be set to account for margin collapse
13985				marginTop: element.css( "marginTop" ),
13986				marginBottom: element.css( "marginBottom" ),
13987				marginLeft: element.css( "marginLeft" ),
13988				marginRight: element.css( "marginRight" ),
13989				"float": element.css( "float" )
13990			} )
13991			.outerWidth( element.outerWidth() )
13992			.outerHeight( element.outerHeight() )
13993			.addClass( "ui-effects-placeholder" );
13994
13995			element.data( dataSpace + "placeholder", placeholder );
13996		}
13997
13998		element.css( {
13999			position: cssPosition,
14000			left: position.left,
14001			top: position.top
14002		} );
14003
14004		return placeholder;
14005	},
14006
14007	removePlaceholder: function( element ) {
14008		var dataKey = dataSpace + "placeholder",
14009				placeholder = element.data( dataKey );
14010
14011		if ( placeholder ) {
14012			placeholder.remove();
14013			element.removeData( dataKey );
14014		}
14015	},
14016
14017	// Removes a placeholder if it exists and restores
14018	// properties that were modified during placeholder creation
14019	cleanUp: function( element ) {
14020		$.effects.restoreStyle( element );
14021		$.effects.removePlaceholder( element );
14022	},
14023
14024	setTransition: function( element, list, factor, value ) {
14025		value = value || {};
14026		$.each( list, function( i, x ) {
14027			var unit = element.cssUnit( x );
14028			if ( unit[ 0 ] > 0 ) {
14029				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
14030			}
14031		} );
14032		return value;
14033	}
14034} );
14035
14036// Return an effect options object for the given parameters:
14037function _normalizeArguments( effect, options, speed, callback ) {
14038
14039	// Allow passing all options as the first parameter
14040	if ( $.isPlainObject( effect ) ) {
14041		options = effect;
14042		effect = effect.effect;
14043	}
14044
14045	// Convert to an object
14046	effect = { effect: effect };
14047
14048	// Catch (effect, null, ...)
14049	if ( options == null ) {
14050		options = {};
14051	}
14052
14053	// Catch (effect, callback)
14054	if ( typeof options === "function" ) {
14055		callback = options;
14056		speed = null;
14057		options = {};
14058	}
14059
14060	// Catch (effect, speed, ?)
14061	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
14062		callback = speed;
14063		speed = options;
14064		options = {};
14065	}
14066
14067	// Catch (effect, options, callback)
14068	if ( typeof speed === "function" ) {
14069		callback = speed;
14070		speed = null;
14071	}
14072
14073	// Add options to effect
14074	if ( options ) {
14075		$.extend( effect, options );
14076	}
14077
14078	speed = speed || options.duration;
14079	effect.duration = $.fx.off ? 0 :
14080		typeof speed === "number" ? speed :
14081		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
14082		$.fx.speeds._default;
14083
14084	effect.complete = callback || options.complete;
14085
14086	return effect;
14087}
14088
14089function standardAnimationOption( option ) {
14090
14091	// Valid standard speeds (nothing, number, named speed)
14092	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
14093		return true;
14094	}
14095
14096	// Invalid strings - treat as "normal" speed
14097	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
14098		return true;
14099	}
14100
14101	// Complete callback
14102	if ( typeof option === "function" ) {
14103		return true;
14104	}
14105
14106	// Options hash (but not naming an effect)
14107	if ( typeof option === "object" && !option.effect ) {
14108		return true;
14109	}
14110
14111	// Didn't match any standard API
14112	return false;
14113}
14114
14115$.fn.extend( {
14116	effect: function( /* effect, options, speed, callback */ ) {
14117		var args = _normalizeArguments.apply( this, arguments ),
14118			effectMethod = $.effects.effect[ args.effect ],
14119			defaultMode = effectMethod.mode,
14120			queue = args.queue,
14121			queueName = queue || "fx",
14122			complete = args.complete,
14123			mode = args.mode,
14124			modes = [],
14125			prefilter = function( next ) {
14126				var el = $( this ),
14127					normalizedMode = $.effects.mode( el, mode ) || defaultMode;
14128
14129				// Sentinel for duck-punching the :animated pseudo-selector
14130				el.data( dataSpaceAnimated, true );
14131
14132				// Save effect mode for later use,
14133				// we can't just call $.effects.mode again later,
14134				// as the .show() below destroys the initial state
14135				modes.push( normalizedMode );
14136
14137				// See $.uiBackCompat inside of run() for removal of defaultMode in 1.14
14138				if ( defaultMode && ( normalizedMode === "show" ||
14139						( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
14140					el.show();
14141				}
14142
14143				if ( !defaultMode || normalizedMode !== "none" ) {
14144					$.effects.saveStyle( el );
14145				}
14146
14147				if ( typeof next === "function" ) {
14148					next();
14149				}
14150			};
14151
14152		if ( $.fx.off || !effectMethod ) {
14153
14154			// Delegate to the original method (e.g., .show()) if possible
14155			if ( mode ) {
14156				return this[ mode ]( args.duration, complete );
14157			} else {
14158				return this.each( function() {
14159					if ( complete ) {
14160						complete.call( this );
14161					}
14162				} );
14163			}
14164		}
14165
14166		function run( next ) {
14167			var elem = $( this );
14168
14169			function cleanup() {
14170				elem.removeData( dataSpaceAnimated );
14171
14172				$.effects.cleanUp( elem );
14173
14174				if ( args.mode === "hide" ) {
14175					elem.hide();
14176				}
14177
14178				done();
14179			}
14180
14181			function done() {
14182				if ( typeof complete === "function" ) {
14183					complete.call( elem[ 0 ] );
14184				}
14185
14186				if ( typeof next === "function" ) {
14187					next();
14188				}
14189			}
14190
14191			// Override mode option on a per element basis,
14192			// as toggle can be either show or hide depending on element state
14193			args.mode = modes.shift();
14194
14195			if ( $.uiBackCompat !== false && !defaultMode ) {
14196				if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
14197
14198					// Call the core method to track "olddisplay" properly
14199					elem[ mode ]();
14200					done();
14201				} else {
14202					effectMethod.call( elem[ 0 ], args, done );
14203				}
14204			} else {
14205				if ( args.mode === "none" ) {
14206
14207					// Call the core method to track "olddisplay" properly
14208					elem[ mode ]();
14209					done();
14210				} else {
14211					effectMethod.call( elem[ 0 ], args, cleanup );
14212				}
14213			}
14214		}
14215
14216		// Run prefilter on all elements first to ensure that
14217		// any showing or hiding happens before placeholder creation,
14218		// which ensures that any layout changes are correctly captured.
14219		return queue === false ?
14220			this.each( prefilter ).each( run ) :
14221			this.queue( queueName, prefilter ).queue( queueName, run );
14222	},
14223
14224	show: ( function( orig ) {
14225		return function( option ) {
14226			if ( standardAnimationOption( option ) ) {
14227				return orig.apply( this, arguments );
14228			} else {
14229				var args = _normalizeArguments.apply( this, arguments );
14230				args.mode = "show";
14231				return this.effect.call( this, args );
14232			}
14233		};
14234	} )( $.fn.show ),
14235
14236	hide: ( function( orig ) {
14237		return function( option ) {
14238			if ( standardAnimationOption( option ) ) {
14239				return orig.apply( this, arguments );
14240			} else {
14241				var args = _normalizeArguments.apply( this, arguments );
14242				args.mode = "hide";
14243				return this.effect.call( this, args );
14244			}
14245		};
14246	} )( $.fn.hide ),
14247
14248	toggle: ( function( orig ) {
14249		return function( option ) {
14250			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
14251				return orig.apply( this, arguments );
14252			} else {
14253				var args = _normalizeArguments.apply( this, arguments );
14254				args.mode = "toggle";
14255				return this.effect.call( this, args );
14256			}
14257		};
14258	} )( $.fn.toggle ),
14259
14260	cssUnit: function( key ) {
14261		var style = this.css( key ),
14262			val = [];
14263
14264		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
14265			if ( style.indexOf( unit ) > 0 ) {
14266				val = [ parseFloat( style ), unit ];
14267			}
14268		} );
14269		return val;
14270	},
14271
14272	cssClip: function( clipObj ) {
14273		if ( clipObj ) {
14274			return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
14275				clipObj.bottom + "px " + clipObj.left + "px)" );
14276		}
14277		return parseClip( this.css( "clip" ), this );
14278	},
14279
14280	transfer: function( options, done ) {
14281		var element = $( this ),
14282			target = $( options.to ),
14283			targetFixed = target.css( "position" ) === "fixed",
14284			body = $( "body" ),
14285			fixTop = targetFixed ? body.scrollTop() : 0,
14286			fixLeft = targetFixed ? body.scrollLeft() : 0,
14287			endPosition = target.offset(),
14288			animation = {
14289				top: endPosition.top - fixTop,
14290				left: endPosition.left - fixLeft,
14291				height: target.innerHeight(),
14292				width: target.innerWidth()
14293			},
14294			startPosition = element.offset(),
14295			transfer = $( "<div class='ui-effects-transfer'></div>" );
14296
14297		transfer
14298			.appendTo( "body" )
14299			.addClass( options.className )
14300			.css( {
14301				top: startPosition.top - fixTop,
14302				left: startPosition.left - fixLeft,
14303				height: element.innerHeight(),
14304				width: element.innerWidth(),
14305				position: targetFixed ? "fixed" : "absolute"
14306			} )
14307			.animate( animation, options.duration, options.easing, function() {
14308				transfer.remove();
14309				if ( typeof done === "function" ) {
14310					done();
14311				}
14312			} );
14313	}
14314} );
14315
14316function parseClip( str, element ) {
14317		var outerWidth = element.outerWidth(),
14318			outerHeight = element.outerHeight(),
14319			clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
14320			values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
14321
14322		return {
14323			top: parseFloat( values[ 1 ] ) || 0,
14324			right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
14325			bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
14326			left: parseFloat( values[ 4 ] ) || 0
14327		};
14328}
14329
14330$.fx.step.clip = function( fx ) {
14331	if ( !fx.clipInit ) {
14332		fx.start = $( fx.elem ).cssClip();
14333		if ( typeof fx.end === "string" ) {
14334			fx.end = parseClip( fx.end, fx.elem );
14335		}
14336		fx.clipInit = true;
14337	}
14338
14339	$( fx.elem ).cssClip( {
14340		top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
14341		right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
14342		bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
14343		left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
14344	} );
14345};
14346
14347} )();
14348
14349/******************************************************************************/
14350/*********************************** EASING ***********************************/
14351/******************************************************************************/
14352
14353( function() {
14354
14355// Based on easing equations from Robert Penner (http://
vendor: 24,998 bytes, lines 14355-15310
14355www.robertpenner.com/easing)
14356
14357var baseEasings = {};
14358
14359$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
14360	baseEasings[ name ] = function( p ) {
14361		return Math.pow( p, i + 2 );
14362	};
14363} );
14364
14365$.extend( baseEasings, {
14366	Sine: function( p ) {
14367		return 1 - Math.cos( p * Math.PI / 2 );
14368	},
14369	Circ: function( p ) {
14370		return 1 - Math.sqrt( 1 - p * p );
14371	},
14372	Elastic: function( p ) {
14373		return p === 0 || p === 1 ? p :
14374			-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
14375	},
14376	Back: function( p ) {
14377		return p * p * ( 3 * p - 2 );
14378	},
14379	Bounce: function( p ) {
14380		var pow2,
14381			bounce = 4;
14382
14383		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
14384		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
14385	}
14386} );
14387
14388$.each( baseEasings, function( name, easeIn ) {
14389	$.easing[ "easeIn" + name ] = easeIn;
14390	$.easing[ "easeOut" + name ] = function( p ) {
14391		return 1 - easeIn( 1 - p );
14392	};
14393	$.easing[ "easeInOut" + name ] = function( p ) {
14394		return p < 0.5 ?
14395			easeIn( p * 2 ) / 2 :
14396			1 - easeIn( p * -2 + 2 ) / 2;
14397	};
14398} );
14399
14400} )();
14401
14402var effect = $.effects;
14403
14404
14405/*!
14406 * jQuery UI Effects Blind 1.13.2
14407 * http://jqueryui.com
14408 *
14409 * Copyright jQuery Foundation and other contributors
14410 * Released under the MIT license.
14411 * http://jquery.org/license
14412 */
14413
14414//>>label: Blind Effect
14415//>>group: Effects
14416//>>description: Blinds the element.
14417//>>docs: http://api.jqueryui.com/blind-effect/
14418//>>demos: http://jqueryui.com/effect/
14419
14420
14421var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) {
14422	var map = {
14423			up: [ "bottom", "top" ],
14424			vertical: [ "bottom", "top" ],
14425			down: [ "top", "bottom" ],
14426			left: [ "right", "left" ],
14427			horizontal: [ "right", "left" ],
14428			right: [ "left", "right" ]
14429		},
14430		element = $( this ),
14431		direction = options.direction || "up",
14432		start = element.cssClip(),
14433		animate = { clip: $.extend( {}, start ) },
14434		placeholder = $.effects.createPlaceholder( element );
14435
14436	animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
14437
14438	if ( options.mode === "show" ) {
14439		element.cssClip( animate.clip );
14440		if ( placeholder ) {
14441			placeholder.css( $.effects.clipToBox( animate ) );
14442		}
14443
14444		animate.clip = start;
14445	}
14446
14447	if ( placeholder ) {
14448		placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
14449	}
14450
14451	element.animate( animate, {
14452		queue: false,
14453		duration: options.duration,
14454		easing: options.easing,
14455		complete: done
14456	} );
14457} );
14458
14459
14460/*!
14461 * jQuery UI Effects Bounce 1.13.2
14462 * http://jqueryui.com
14463 *
14464 * Copyright jQuery Foundation and other contributors
14465 * Released under the MIT license.
14466 * http://jquery.org/license
14467 */
14468
14469//>>label: Bounce Effect
14470//>>group: Effects
14471//>>description: Bounces an element horizontally or vertically n times.
14472//>>docs: http://api.jqueryui.com/bounce-effect/
14473//>>demos: http://jqueryui.com/effect/
14474
14475
14476var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) {
14477	var upAnim, downAnim, refValue,
14478		element = $( this ),
14479
14480		// Defaults:
14481		mode = options.mode,
14482		hide = mode === "hide",
14483		show = mode === "show",
14484		direction = options.direction || "up",
14485		distance = options.distance,
14486		times = options.times || 5,
14487
14488		// Number of internal animations
14489		anims = times * 2 + ( show || hide ? 1 : 0 ),
14490		speed = options.duration / anims,
14491		easing = options.easing,
14492
14493		// Utility:
14494		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
14495		motion = ( direction === "up" || direction === "left" ),
14496		i = 0,
14497
14498		queuelen = element.queue().length;
14499
14500	$.effects.createPlaceholder( element );
14501
14502	refValue = element.css( ref );
14503
14504	// Default distance for the BIGGEST bounce is the outer Distance / 3
14505	if ( !distance ) {
14506		distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
14507	}
14508
14509	if ( show ) {
14510		downAnim = { opacity: 1 };
14511		downAnim[ ref ] = refValue;
14512
14513		// If we are showing, force opacity 0 and set the initial position
14514		// then do the "first" animation
14515		element
14516			.css( "opacity", 0 )
14517			.css( ref, motion ? -distance * 2 : distance * 2 )
14518			.animate( downAnim, speed, easing );
14519	}
14520
14521	// Start at the smallest distance if we are hiding
14522	if ( hide ) {
14523		distance = distance / Math.pow( 2, times - 1 );
14524	}
14525
14526	downAnim = {};
14527	downAnim[ ref ] = refValue;
14528
14529	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
14530	for ( ; i < times; i++ ) {
14531		upAnim = {};
14532		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
14533
14534		element
14535			.animate( upAnim, speed, easing )
14536			.animate( downAnim, speed, easing );
14537
14538		distance = hide ? distance * 2 : distance / 2;
14539	}
14540
14541	// Last Bounce when Hiding
14542	if ( hide ) {
14543		upAnim = { opacity: 0 };
14544		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
14545
14546		element.animate( upAnim, speed, easing );
14547	}
14548
14549	element.queue( done );
14550
14551	$.effects.unshift( element, queuelen, anims + 1 );
14552} );
14553
14554
14555/*!
14556 * jQuery UI Effects Clip 1.13.2
14557 * http://jqueryui.com
14558 *
14559 * Copyright jQuery Foundation and other contributors
14560 * Released under the MIT license.
14561 * http://jquery.org/license
14562 */
14563
14564//>>label: Clip Effect
14565//>>group: Effects
14566//>>description: Clips the element on and off like an old TV.
14567//>>docs: http://api.jqueryui.com/clip-effect/
14568//>>demos: http://jqueryui.com/effect/
14569
14570
14571var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) {
14572	var start,
14573		animate = {},
14574		element = $( this ),
14575		direction = options.direction || "vertical",
14576		both = direction === "both",
14577		horizontal = both || direction === "horizontal",
14578		vertical = both || direction === "vertical";
14579
14580	start = element.cssClip();
14581	animate.clip = {
14582		top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
14583		right: horizontal ? ( start.right - start.left ) / 2 : start.right,
14584		bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
14585		left: horizontal ? ( start.right - start.left ) / 2 : start.left
14586	};
14587
14588	$.effects.createPlaceholder( element );
14589
14590	if ( options.mode === "show" ) {
14591		element.cssClip( animate.clip );
14592		animate.clip = start;
14593	}
14594
14595	element.animate( animate, {
14596		queue: false,
14597		duration: options.duration,
14598		easing: options.easing,
14599		complete: done
14600	} );
14601
14602} );
14603
14604
14605/*!
14606 * jQuery UI Effects Drop 1.13.2
14607 * http://jqueryui.com
14608 *
14609 * Copyright jQuery Foundation and other contributors
14610 * Released under the MIT license.
14611 * http://jquery.org/license
14612 */
14613
14614//>>label: Drop Effect
14615//>>group: Effects
14616//>>description: Moves an element in one direction and hides it at the same time.
14617//>>docs: http://api.jqueryui.com/drop-effect/
14618//>>demos: http://jqueryui.com/effect/
14619
14620
14621var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) {
14622
14623	var distance,
14624		element = $( this ),
14625		mode = options.mode,
14626		show = mode === "show",
14627		direction = options.direction || "left",
14628		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
14629		motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
14630		oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
14631		animation = {
14632			opacity: 0
14633		};
14634
14635	$.effects.createPlaceholder( element );
14636
14637	distance = options.distance ||
14638		element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
14639
14640	animation[ ref ] = motion + distance;
14641
14642	if ( show ) {
14643		element.css( animation );
14644
14645		animation[ ref ] = oppositeMotion + distance;
14646		animation.opacity = 1;
14647	}
14648
14649	// Animate
14650	element.animate( animation, {
14651		queue: false,
14652		duration: options.duration,
14653		easing: options.easing,
14654		complete: done
14655	} );
14656} );
14657
14658
14659/*!
14660 * jQuery UI Effects Explode 1.13.2
14661 * http://jqueryui.com
14662 *
14663 * Copyright jQuery Foundation and other contributors
14664 * Released under the MIT license.
14665 * http://jquery.org/license
14666 */
14667
14668//>>label: Explode Effect
14669//>>group: Effects
14670/* eslint-disable max-len */
14671//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
14672/* eslint-enable max-len */
14673//>>docs: http://api.jqueryui.com/explode-effect/
14674//>>demos: http://jqueryui.com/effect/
14675
14676
14677var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) {
14678
14679	var i, j, left, top, mx, my,
14680		rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
14681		cells = rows,
14682		element = $( this ),
14683		mode = options.mode,
14684		show = mode === "show",
14685
14686		// Show and then visibility:hidden the element before calculating offset
14687		offset = element.show().css( "visibility", "hidden" ).offset(),
14688
14689		// Width and height of a piece
14690		width = Math.ceil( element.outerWidth() / cells ),
14691		height = Math.ceil( element.outerHeight() / rows ),
14692		pieces = [];
14693
14694	// Children animate complete:
14695	function childComplete() {
14696		pieces.push( this );
14697		if ( pieces.length === rows * cells ) {
14698			animComplete();
14699		}
14700	}
14701
14702	// Clone the element for each row and cell.
14703	for ( i = 0; i < rows; i++ ) { // ===>
14704		top = offset.top + i * height;
14705		my = i - ( rows - 1 ) / 2;
14706
14707		for ( j = 0; j < cells; j++ ) { // |||
14708			left = offset.left + j * width;
14709			mx = j - ( cells - 1 ) / 2;
14710
14711			// Create a clone of the now hidden main element that will be absolute positioned
14712			// within a wrapper div off the -left and -top equal to size of our pieces
14713			element
14714				.clone()
14715				.appendTo( "body" )
14716				.wrap( "<div></div>" )
14717				.css( {
14718					position: "absolute",
14719					visibility: "visible",
14720					left: -j * width,
14721					top: -i * height
14722				} )
14723
14724				// Select the wrapper - make it overflow: hidden and absolute positioned based on
14725				// where the original was located +left and +top equal to the size of pieces
14726				.parent()
14727					.addClass( "ui-effects-explode" )
14728					.css( {
14729						position: "absolute",
14730						overflow: "hidden",
14731						width: width,
14732						height: height,
14733						left: left + ( show ? mx * width : 0 ),
14734						top: top + ( show ? my * height : 0 ),
14735						opacity: show ? 0 : 1
14736					} )
14737					.animate( {
14738						left: left + ( show ? 0 : mx * width ),
14739						top: top + ( show ? 0 : my * height ),
14740						opacity: show ? 1 : 0
14741					}, options.duration || 500, options.easing, childComplete );
14742		}
14743	}
14744
14745	function animComplete() {
14746		element.css( {
14747			visibility: "visible"
14748		} );
14749		$( pieces ).remove();
14750		done();
14751	}
14752} );
14753
14754
14755/*!
14756 * jQuery UI Effects Fade 1.13.2
14757 * http://jqueryui.com
14758 *
14759 * Copyright jQuery Foundation and other contributors
14760 * Released under the MIT license.
14761 * http://jquery.org/license
14762 */
14763
14764//>>label: Fade Effect
14765//>>group: Effects
14766//>>description: Fades the element.
14767//>>docs: http://api.jqueryui.com/fade-effect/
14768//>>demos: http://jqueryui.com/effect/
14769
14770
14771var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) {
14772	var show = options.mode === "show";
14773
14774	$( this )
14775		.css( "opacity", show ? 0 : 1 )
14776		.animate( {
14777			opacity: show ? 1 : 0
14778		}, {
14779			queue: false,
14780			duration: options.duration,
14781			easing: options.easing,
14782			complete: done
14783		} );
14784} );
14785
14786
14787/*!
14788 * jQuery UI Effects Fold 1.13.2
14789 * http://jqueryui.com
14790 *
14791 * Copyright jQuery Foundation and other contributors
14792 * Released under the MIT license.
14793 * http://jquery.org/license
14794 */
14795
14796//>>label: Fold Effect
14797//>>group: Effects
14798//>>description: Folds an element first horizontally and then vertically.
14799//>>docs: http://api.jqueryui.com/fold-effect/
14800//>>demos: http://jqueryui.com/effect/
14801
14802
14803var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) {
14804
14805	// Create element
14806	var element = $( this ),
14807		mode = options.mode,
14808		show = mode === "show",
14809		hide = mode === "hide",
14810		size = options.size || 15,
14811		percent = /([0-9]+)%/.exec( size ),
14812		horizFirst = !!options.horizFirst,
14813		ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
14814		duration = options.duration / 2,
14815
14816		placeholder = $.effects.createPlaceholder( element ),
14817
14818		start = element.cssClip(),
14819		animation1 = { clip: $.extend( {}, start ) },
14820		animation2 = { clip: $.extend( {}, start ) },
14821
14822		distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
14823
14824		queuelen = element.queue().length;
14825
14826	if ( percent ) {
14827		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
14828	}
14829	animation1.clip[ ref[ 0 ] ] = size;
14830	animation2.clip[ ref[ 0 ] ] = size;
14831	animation2.clip[ ref[ 1 ] ] = 0;
14832
14833	if ( show ) {
14834		element.cssClip( animation2.clip );
14835		if ( placeholder ) {
14836			placeholder.css( $.effects.clipToBox( animation2 ) );
14837		}
14838
14839		animation2.clip = start;
14840	}
14841
14842	// Animate
14843	element
14844		.queue( function( next ) {
14845			if ( placeholder ) {
14846				placeholder
14847					.animate( $.effects.clipToBox( animation1 ), duration, options.easing )
14848					.animate( $.effects.clipToBox( animation2 ), duration, options.easing );
14849			}
14850
14851			next();
14852		} )
14853		.animate( animation1, duration, options.easing )
14854		.animate( animation2, duration, options.easing )
14855		.queue( done );
14856
14857	$.effects.unshift( element, queuelen, 4 );
14858} );
14859
14860
14861/*!
14862 * jQuery UI Effects Highlight 1.13.2
14863 * http://jqueryui.com
14864 *
14865 * Copyright jQuery Foundation and other contributors
14866 * Released under the MIT license.
14867 * http://jquery.org/license
14868 */
14869
14870//>>label: Highlight Effect
14871//>>group: Effects
14872//>>description: Highlights the background of an element in a defined color for a custom duration.
14873//>>docs: http://api.jqueryui.com/highlight-effect/
14874//>>demos: http://jqueryui.com/effect/
14875
14876
14877var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) {
14878	var element = $( this ),
14879		animation = {
14880			backgroundColor: element.css( "backgroundColor" )
14881		};
14882
14883	if ( options.mode === "hide" ) {
14884		animation.opacity = 0;
14885	}
14886
14887	$.effects.saveStyle( element );
14888
14889	element
14890		.css( {
14891			backgroundImage: "none",
14892			backgroundColor: options.color || "#ffff99"
14893		} )
14894		.animate( animation, {
14895			queue: false,
14896			duration: options.duration,
14897			easing: options.easing,
14898			complete: done
14899		} );
14900} );
14901
14902
14903/*!
14904 * jQuery UI Effects Size 1.13.2
14905 * http://jqueryui.com
14906 *
14907 * Copyright jQuery Foundation and other contributors
14908 * Released under the MIT license.
14909 * http://jquery.org/license
14910 */
14911
14912//>>label: Size Effect
14913//>>group: Effects
14914//>>description: Resize an element to a specified width and height.
14915//>>docs: http://api.jqueryui.com/size-effect/
14916//>>demos: http://jqueryui.com/effect/
14917
14918
14919var effectsEffectSize = $.effects.define( "size", function( options, done ) {
14920
14921	// Create element
14922	var baseline, factor, temp,
14923		element = $( this ),
14924
14925		// Copy for children
14926		cProps = [ "fontSize" ],
14927		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
14928		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
14929
14930		// Set options
14931		mode = options.mode,
14932		restore = mode !== "effect",
14933		scale = options.scale || "both",
14934		origin = options.origin || [ "middle", "center" ],
14935		position = element.css( "position" ),
14936		pos = element.position(),
14937		original = $.effects.scaledDimensions( element ),
14938		from = options.from || original,
14939		to = options.to || $.effects.scaledDimensions( element, 0 );
14940
14941	$.effects.createPlaceholder( element );
14942
14943	if ( mode === "show" ) {
14944		temp = from;
14945		from = to;
14946		to = temp;
14947	}
14948
14949	// Set scaling factor
14950	factor = {
14951		from: {
14952			y: from.height / original.height,
14953			x: from.width / original.width
14954		},
14955		to: {
14956			y: to.height / original.height,
14957			x: to.width / original.width
14958		}
14959	};
14960
14961	// Scale the css box
14962	if ( scale === "box" || scale === "both" ) {
14963
14964		// Vertical props scaling
14965		if ( factor.from.y !== factor.to.y ) {
14966			from = $.effects.setTransition( element, vProps, factor.from.y, from );
14967			to = $.effects.setTransition( element, vProps, factor.to.y, to );
14968		}
14969
14970		// Horizontal props scaling
14971		if ( factor.from.x !== factor.to.x ) {
14972			from = $.effects.setTransition( element, hProps, factor.from.x, from );
14973			to = $.effects.setTransition( element, hProps, factor.to.x, to );
14974		}
14975	}
14976
14977	// Scale the content
14978	if ( scale === "content" || scale === "both" ) {
14979
14980		// Vertical props scaling
14981		if ( factor.from.y !== factor.to.y ) {
14982			from = $.effects.setTransition( element, cProps, factor.from.y, from );
14983			to = $.effects.setTransition( element, cProps, factor.to.y, to );
14984		}
14985	}
14986
14987	// Adjust the position properties based on the provided origin points
14988	if ( origin ) {
14989		baseline = $.effects.getBaseline( origin, original );
14990		from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
14991		from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
14992		to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
14993		to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
14994	}
14995	delete from.outerHeight;
14996	delete from.outerWidth;
14997	element.css( from );
14998
14999	// Animate the children if desired
15000	if ( scale === "content" || scale === "both" ) {
15001
15002		vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
15003		hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
15004
15005		// Only animate children with width attributes specified
15006		// TODO: is this right? should we include anything with css width specified as well
15007		element.find( "*[width]" ).each( function() {
15008			var child = $( this ),
15009				childOriginal = $.effects.scaledDimensions( child ),
15010				childFrom = {
15011					height: childOriginal.height * factor.from.y,
15012					width: childOriginal.width * factor.from.x,
15013					outerHeight: childOriginal.outerHeight * factor.from.y,
15014					outerWidth: childOriginal.outerWidth * factor.from.x
15015				},
15016				childTo = {
15017					height: childOriginal.height * factor.to.y,
15018					width: childOriginal.width * factor.to.x,
15019					outerHeight: childOriginal.height * factor.to.y,
15020					outerWidth: childOriginal.width * factor.to.x
15021				};
15022
15023			// Vertical props scaling
15024			if ( factor.from.y !== factor.to.y ) {
15025				childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
15026				childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
15027			}
15028
15029			// Horizontal props scaling
15030			if ( factor.from.x !== factor.to.x ) {
15031				childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
15032				childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
15033			}
15034
15035			if ( restore ) {
15036				$.effects.saveStyle( child );
15037			}
15038
15039			// Animate children
15040			child.css( childFrom );
15041			child.animate( childTo, options.duration, options.easing, function() {
15042
15043				// Restore children
15044				if ( restore ) {
15045					$.effects.restoreStyle( child );
15046				}
15047			} );
15048		} );
15049	}
15050
15051	// Animate
15052	element.animate( to, {
15053		queue: false,
15054		duration: options.duration,
15055		easing: options.easing,
15056		complete: function() {
15057
15058			var offset = element.offset();
15059
15060			if ( to.opacity === 0 ) {
15061				element.css( "opacity", from.opacity );
15062			}
15063
15064			if ( !restore ) {
15065				element
15066					.css( "position", position === "static" ? "relative" : position )
15067					.offset( offset );
15068
15069				// Need to save style here so that automatic style restoration
15070				// doesn't restore to the original styles from before the animation.
15071				$.effects.saveStyle( element );
15072			}
15073
15074			done();
15075		}
15076	} );
15077
15078} );
15079
15080
15081/*!
15082 * jQuery UI Effects Scale 1.13.2
15083 * http://jqueryui.com
15084 *
15085 * Copyright jQuery Foundation and other contributors
15086 * Released under the MIT license.
15087 * http://jquery.org/license
15088 */
15089
15090//>>label: Scale Effect
15091//>>group: Effects
15092//>>description: Grows or shrinks an element and its content.
15093//>>docs: http://api.jqueryui.com/scale-effect/
15094//>>demos: http://jqueryui.com/effect/
15095
15096
15097var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
15098
15099	// Create element
15100	var el = $( this ),
15101		mode = options.mode,
15102		percent = parseInt( options.percent, 10 ) ||
15103			( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
15104
15105		newOptions = $.extend( true, {
15106			from: $.effects.scaledDimensions( el ),
15107			to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
15108			origin: options.origin || [ "middle", "center" ]
15109		}, options );
15110
15111	// Fade option to support puff
15112	if ( options.fade ) {
15113		newOptions.from.opacity = 1;
15114		newOptions.to.opacity = 0;
15115	}
15116
15117	$.effects.effect.size.call( this, newOptions, done );
15118} );
15119
15120
15121/*!
15122 * jQuery UI Effects Puff 1.13.2
15123 * http://jqueryui.com
15124 *
15125 * Copyright jQuery Foundation and other contributors
15126 * Released under the MIT license.
15127 * http://jquery.org/license
15128 */
15129
15130//>>label: Puff Effect
15131//>>group: Effects
15132//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
15133//>>docs: http://api.jqueryui.com/puff-effect/
15134//>>demos: http://jqueryui.com/effect/
15135
15136
15137var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) {
15138	var newOptions = $.extend( true, {}, options, {
15139		fade: true,
15140		percent: parseInt( options.percent, 10 ) || 150
15141	} );
15142
15143	$.effects.effect.scale.call( this, newOptions, done );
15144} );
15145
15146
15147/*!
15148 * jQuery UI Effects Pulsate 1.13.2
15149 * http://jqueryui.com
15150 *
15151 * Copyright jQuery Foundation and other contributors
15152 * Released under the MIT license.
15153 * http://jquery.org/license
15154 */
15155
15156//>>label: Pulsate Effect
15157//>>group: Effects
15158//>>description: Pulsates an element n times by changing the opacity to zero and back.
15159//>>docs: http://api.jqueryui.com/pulsate-effect/
15160//>>demos: http://jqueryui.com/effect/
15161
15162
15163var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) {
15164	var element = $( this ),
15165		mode = options.mode,
15166		show = mode === "show",
15167		hide = mode === "hide",
15168		showhide = show || hide,
15169
15170		// Showing or hiding leaves off the "last" animation
15171		anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
15172		duration = options.duration / anims,
15173		animateTo = 0,
15174		i = 1,
15175		queuelen = element.queue().length;
15176
15177	if ( show || !element.is( ":visible" ) ) {
15178		element.css( "opacity", 0 ).show();
15179		animateTo = 1;
15180	}
15181
15182	// Anims - 1 opacity "toggles"
15183	for ( ; i < anims; i++ ) {
15184		element.animate( { opacity: animateTo }, duration, options.easing );
15185		animateTo = 1 - animateTo;
15186	}
15187
15188	element.animate( { opacity: animateTo }, duration, options.easing );
15189
15190	element.queue( done );
15191
15192	$.effects.unshift( element, queuelen, anims + 1 );
15193} );
15194
15195
15196/*!
15197 * jQuery UI Effects Shake 1.13.2
15198 * http://jqueryui.com
15199 *
15200 * Copyright jQuery Foundation and other contributors
15201 * Released under the MIT license.
15202 * http://jquery.org/license
15203 */
15204
15205//>>label: Shake Effect
15206//>>group: Effects
15207//>>description: Shakes an element horizontally or vertically n times.
15208//>>docs: http://api.jqueryui.com/shake-effect/
15209//>>demos: http://jqueryui.com/effect/
15210
15211
15212var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
15213
15214	var i = 1,
15215		element = $( this ),
15216		direction = options.direction || "left",
15217		distance = options.distance || 20,
15218		times = options.times || 3,
15219		anims = times * 2 + 1,
15220		speed = Math.round( options.duration / anims ),
15221		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
15222		positiveMotion = ( direction === "up" || direction === "left" ),
15223		animation = {},
15224		animation1 = {},
15225		animation2 = {},
15226
15227		queuelen = element.queue().length;
15228
15229	$.effects.createPlaceholder( element );
15230
15231	// Animation
15232	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
15233	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
15234	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
15235
15236	// Animate
15237	element.animate( animation, speed, options.easing );
15238
15239	// Shakes
15240	for ( ; i < times; i++ ) {
15241		element
15242			.animate( animation1, speed, options.easing )
15243			.animate( animation2, speed, options.easing );
15244	}
15245
15246	element
15247		.animate( animation1, speed, options.easing )
15248		.animate( animation, speed / 2, options.easing )
15249		.queue( done );
15250
15251	$.effects.unshift( element, queuelen, anims + 1 );
15252} );
15253
15254
15255/*!
15256 * jQuery UI Effects Slide 1.13.2
15257 * http://jqueryui.com
15258 *
15259 * Copyright jQuery Foundation and other contributors
15260 * Released under the MIT license.
15261 * http://jquery.org/license
15262 */
15263
15264//>>label: Slide Effect
15265//>>group: Effects
15266//>>description: Slides an element in and out of the viewport.
15267//>>docs: http://api.jqueryui.com/slide-effect/
15268//>>demos: http://jqueryui.com/effect/
15269
15270
15271var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) {
15272	var startClip, startRef,
15273		element = $( this ),
15274		map = {
15275			up: [ "bottom", "top" ],
15276			down: [ "top", "bottom" ],
15277			left: [ "right", "left" ],
15278			right: [ "left", "right" ]
15279		},
15280		mode = options.mode,
15281		direction = options.direction || "left",
15282		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
15283		positiveMotion = ( direction === "up" || direction === "left" ),
15284		distance = options.distance ||
15285			element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
15286		animation = {};
15287
15288	$.effects.createPlaceholder( element );
15289
15290	startClip = element.cssClip();
15291	startRef = element.position()[ ref ];
15292
15293	// Define hide animation
15294	animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
15295	animation.clip = element.cssClip();
15296	animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
15297
15298	// Reverse the animation if we're showing
15299	if ( mode === "show" ) {
15300		element.cssClip( animation.clip );
15301		element.css( ref, animation[ ref ] );
15302		animation.clip = startClip;
15303		animation[ ref ] = startRef;
15304	}
15305
15306	// Actually animate
15307	element.animate( animation, {
15308		queue: false,
15309		duration: options.duration,
15310		easing: options.easing,
vendor: 9,661 bytes, lines 15311-15693
15311		complete: done
15312	} );
15313} );
15314
15315
15316/*!
15317 * jQuery UI Effects Transfer 1.13.2
15318 * http://jqueryui.com
15319 *
15320 * Copyright jQuery Foundation and other contributors
15321 * Released under the MIT license.
15322 * http://jquery.org/license
15323 */
15324
15325//>>label: Transfer Effect
15326//>>group: Effects
15327//>>description: Displays a transfer effect from one element to another.
15328//>>docs: http://api.jqueryui.com/transfer-effect/
15329//>>demos: http://jqueryui.com/effect/
15330
15331
15332var effect;
15333if ( $.uiBackCompat !== false ) {
15334	effect = $.effects.define( "transfer", function( options, done ) {
15335		$( this ).transfer( options, done );
15336	} );
15337}
15338var effectsEffectTransfer = effect;
15339
15340
15341/*!
15342 * jQuery UI Focusable 1.13.2
15343 * http://jqueryui.com
15344 *
15345 * Copyright jQuery Foundation and other contributors
15346 * Released under the MIT license.
15347 * http://jquery.org/license
15348 */
15349
15350//>>label: :focusable Selector
15351//>>group: Core
15352//>>description: Selects elements which can be focused.
15353//>>docs: http://api.jqueryui.com/focusable-selector/
15354
15355
15356// Selectors
15357$.ui.focusable = function( element, hasTabindex ) {
15358	var map, mapName, img, focusableIfVisible, fieldset,
15359		nodeName = element.nodeName.toLowerCase();
15360
15361	if ( "area" === nodeName ) {
15362		map = element.parentNode;
15363		mapName = map.name;
15364		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
15365			return false;
15366		}
15367		img = $( "img[usemap='#" + mapName + "']" );
15368		return img.length > 0 && img.is( ":visible" );
15369	}
15370
15371	if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
15372		focusableIfVisible = !element.disabled;
15373
15374		if ( focusableIfVisible ) {
15375
15376			// Form controls within a disabled fieldset are disabled.
15377			// However, controls within the fieldset's legend do not get disabled.
15378			// Since controls generally aren't placed inside legends, we skip
15379			// this portion of the check.
15380			fieldset = $( element ).closest( "fieldset" )[ 0 ];
15381			if ( fieldset ) {
15382				focusableIfVisible = !fieldset.disabled;
15383			}
15384		}
15385	} else if ( "a" === nodeName ) {
15386		focusableIfVisible = element.href || hasTabindex;
15387	} else {
15388		focusableIfVisible = hasTabindex;
15389	}
15390
15391	return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
15392};
15393
15394// Support: IE 8 only
15395// IE 8 doesn't resolve inherit to visible/hidden for computed values
15396function visible( element ) {
15397	var visibility = element.css( "visibility" );
15398	while ( visibility === "inherit" ) {
15399		element = element.parent();
15400		visibility = element.css( "visibility" );
15401	}
15402	return visibility === "visible";
15403}
15404
15405$.extend( $.expr.pseudos, {
15406	focusable: function( element ) {
15407		return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
15408	}
15409} );
15410
15411var focusable = $.ui.focusable;
15412
15413
15414
15415// Support: IE8 Only
15416// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
15417// with a string, so we need to find the proper form.
15418var form = $.fn._form = function() {
15419	return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
15420};
15421
15422
15423/*!
15424 * jQuery UI Form Reset Mixin 1.13.2
15425 * http://jqueryui.com
15426 *
15427 * Copyright jQuery Foundation and other contributors
15428 * Released under the MIT license.
15429 * http://jquery.org/license
15430 */
15431
15432//>>label: Form Reset Mixin
15433//>>group: Core
15434//>>description: Refresh input widgets when their form is reset
15435//>>docs: http://api.jqueryui.com/form-reset-mixin/
15436
15437
15438var formResetMixin = $.ui.formResetMixin = {
15439	_formResetHandler: function() {
15440		var form = $( this );
15441
15442		// Wait for the form reset to actually happen before refreshing
15443		setTimeout( function() {
15444			var instances = form.data( "ui-form-reset-instances" );
15445			$.each( instances, function() {
15446				this.refresh();
15447			} );
15448		} );
15449	},
15450
15451	_bindFormResetHandler: function() {
15452		this.form = this.element._form();
15453		if ( !this.form.length ) {
15454			return;
15455		}
15456
15457		var instances = this.form.data( "ui-form-reset-instances" ) || [];
15458		if ( !instances.length ) {
15459
15460			// We don't use _on() here because we use a single event handler per form
15461			this.form.on( "reset.ui-form-reset", this._formResetHandler );
15462		}
15463		instances.push( this );
15464		this.form.data( "ui-form-reset-instances", instances );
15465	},
15466
15467	_unbindFormResetHandler: function() {
15468		if ( !this.form.length ) {
15469			return;
15470		}
15471
15472		var instances = this.form.data( "ui-form-reset-instances" );
15473		instances.splice( $.inArray( this, instances ), 1 );
15474		if ( instances.length ) {
15475			this.form.data( "ui-form-reset-instances", instances );
15476		} else {
15477			this.form
15478				.removeData( "ui-form-reset-instances" )
15479				.off( "reset.ui-form-reset" );
15480		}
15481	}
15482};
15483
15484
15485/*!
15486 * jQuery UI Support for jQuery core 1.8.x and newer 1.13.2
15487 * http://jqueryui.com
15488 *
15489 * Copyright jQuery Foundation and other contributors
15490 * Released under the MIT license.
15491 * http://jquery.org/license
15492 *
15493 */
15494
15495//>>label: jQuery 1.8+ Support
15496//>>group: Core
15497//>>description: Support version 1.8.x and newer of jQuery core
15498
15499
15500// Support: jQuery 1.9.x or older
15501// $.expr[ ":" ] is deprecated.
15502if ( !$.expr.pseudos ) {
15503	$.expr.pseudos = $.expr[ ":" ];
15504}
15505
15506// Support: jQuery 1.11.x or older
15507// $.unique has been renamed to $.uniqueSort
15508if ( !$.uniqueSort ) {
15509	$.uniqueSort = $.unique;
15510}
15511
15512// Support: jQuery 2.2.x or older.
15513// This method has been defined in jQuery 3.0.0.
15514// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js
15515if ( !$.escapeSelector ) {
15516
15517	// CSS string/identifier serialization
15518	// https://drafts.csswg.org/cssom/#common-serializing-idioms
15519	var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
15520
15521	var fcssescape = function( ch, asCodePoint ) {
15522		if ( asCodePoint ) {
15523
15524			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
15525			if ( ch === "\0" ) {
15526				return "\uFFFD";
15527			}
15528
15529			// Control characters and (dependent upon position) numbers get escaped as code points
15530			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
15531		}
15532
15533		// Other potentially-special ASCII characters get backslash-escaped
15534		return "\\" + ch;
15535	};
15536
15537	$.escapeSelector = function( sel ) {
15538		return ( sel + "" ).replace( rcssescape, fcssescape );
15539	};
15540}
15541
15542// Support: jQuery 3.4.x or older
15543// These methods have been defined in jQuery 3.5.0.
15544if ( !$.fn.even || !$.fn.odd ) {
15545	$.fn.extend( {
15546		even: function() {
15547			return this.filter( function( i ) {
15548				return i % 2 === 0;
15549			} );
15550		},
15551		odd: function() {
15552			return this.filter( function( i ) {
15553				return i % 2 === 1;
15554			} );
15555		}
15556	} );
15557}
15558
15559;
15560/*!
15561 * jQuery UI Keycode 1.13.2
15562 * http://jqueryui.com
15563 *
15564 * Copyright jQuery Foundation and other contributors
15565 * Released under the MIT license.
15566 * http://jquery.org/license
15567 */
15568
15569//>>label: Keycode
15570//>>group: Core
15571//>>description: Provide keycodes as keynames
15572//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
15573
15574
15575var keycode = $.ui.keyCode = {
15576	BACKSPACE: 8,
15577	COMMA: 188,
15578	DELETE: 46,
15579	DOWN: 40,
15580	END: 35,
15581	ENTER: 13,
15582	ESCAPE: 27,
15583	HOME: 36,
15584	LEFT: 37,
15585	PAGE_DOWN: 34,
15586	PAGE_UP: 33,
15587	PERIOD: 190,
15588	RIGHT: 39,
15589	SPACE: 32,
15590	TAB: 9,
15591	UP: 38
15592};
15593
15594
15595/*!
15596 * jQuery UI Labels 1.13.2
15597 * http://jqueryui.com
15598 *
15599 * Copyright jQuery Foundation and other contributors
15600 * Released under the MIT license.
15601 * http://jquery.org/license
15602 */
15603
15604//>>label: labels
15605//>>group: Core
15606//>>description: Find all the labels associated with a given input
15607//>>docs: http://api.jqueryui.com/labels/
15608
15609
15610var labels = $.fn.labels = function() {
15611	var ancestor, selector, id, labels, ancestors;
15612
15613	if ( !this.length ) {
15614		return this.pushStack( [] );
15615	}
15616
15617	// Check control.labels first
15618	if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
15619		return this.pushStack( this[ 0 ].labels );
15620	}
15621
15622	// Support: IE <= 11, FF <= 37, Android <= 2.3 only
15623	// Above browsers do not support control.labels. Everything below is to support them
15624	// as well as document fragments. control.labels does not work on document fragments
15625	labels = this.eq( 0 ).parents( "label" );
15626
15627	// Look for the label based on the id
15628	id = this.attr( "id" );
15629	if ( id ) {
15630
15631		// We don't search against the document in case the element
15632		// is disconnected from the DOM
15633		ancestor = this.eq( 0 ).parents().last();
15634
15635		// Get a full set of top level ancestors
15636		ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
15637
15638		// Create a selector for the label based on the id
15639		selector = "label[for='" + $.escapeSelector( id ) + "']";
15640
15641		labels = labels.add( ancestors.find( selector ).addBack( selector ) );
15642
15643	}
15644
15645	// Return whatever we have found for labels
15646	return this.pushStack( labels );
15647};
15648
15649
15650/*!
15651 * jQuery UI Scroll Parent 1.13.2
15652 * http://jqueryui.com
15653 *
15654 * Copyright jQuery Foundation and other contributors
15655 * Released under the MIT license.
15656 * http://jquery.org/license
15657 */
15658
15659//>>label: scrollParent
15660//>>group: Core
15661//>>description: Get the closest ancestor element that is scrollable.
15662//>>docs: http://api.jqueryui.com/scrollParent/
15663
15664
15665var scrollParent = $.fn.scrollParent = function( includeHidden ) {
15666	var position = this.css( "position" ),
15667		excludeStaticParent = position === "absolute",
15668		overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
15669		scrollParent = this.parents().filter( function() {
15670			var parent = $( this );
15671			if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
15672				return false;
15673			}
15674			return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
15675				parent.css( "overflow-x" ) );
15676		} ).eq( 0 );
15677
15678	return position === "fixed" || !scrollParent.length ?
15679		$( this[ 0 ].ownerDocument || document ) :
15680		scrollParent;
15681};
15682
15683
15684/*!
15685 * jQuery UI Tabbable 1.13.2
15686 * http://jqueryui.com
15687 *
15688 * Copyright jQuery Foundation and other contributors
15689 * Released under the MIT license.
15690 * http://jquery.org/license
15691 */
15692
15693//>>label: :tabbable Selector
vendor: 1,775 bytes, lines 15694-15768
15694//>>group: Core
15695//>>description: Selects elements which can be tabbed to.
15696//>>docs: http://api.jqueryui.com/tabbable-selector/
15697
15698
15699var tabbable = $.extend( $.expr.pseudos, {
15700	tabbable: function( element ) {
15701		var tabIndex = $.attr( element, "tabindex" ),
15702			hasTabindex = tabIndex != null;
15703		return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
15704	}
15705} );
15706
15707
15708/*!
15709 * jQuery UI Unique ID 1.13.2
15710 * http://jqueryui.com
15711 *
15712 * Copyright jQuery Foundation and other contributors
15713 * Released under the MIT license.
15714 * http://jquery.org/license
15715 */
15716
15717//>>label: uniqueId
15718//>>group: Core
15719//>>description: Functions to generate and remove uniqueId's
15720//>>docs: http://api.jqueryui.com/uniqueId/
15721
15722
15723var uniqueId = $.fn.extend( {
15724	uniqueId: ( function() {
15725		var uuid = 0;
15726
15727		return function() {
15728			return this.each( function() {
15729				if ( !this.id ) {
15730					this.id = "ui-id-" + ( ++uuid );
15731				}
15732			} );
15733		};
15734	} )(),
15735
15736	removeUniqueId: function() {
15737		return this.each( function() {
15738			if ( /^ui-id-\d+$/.test( this.id ) ) {
15739				$( this ).removeAttr( "id" );
15740			}
15741		} );
15742	}
15743} );
15744
15745
15746/*!
15747 * jQuery UI Accordion 1.13.2
15748 * http://jqueryui.com
15749 *
15750 * Copyright jQuery Foundation and other contributors
15751 * Released under the MIT license.
15752 * http://jquery.org/license
15753 */
15754
15755//>>label: Accordion
15756//>>group: Widgets
15757/* eslint-disable max-len */
15758//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
15759/* eslint-enable max-len */
15760//>>docs: http://api.jqueryui.com/accordion/
15761//>>demos: http://jqueryui.com/accordion/
15762//>>css.structure: ../../themes/base/core.css
15763//>>css.structure: ../../themes/base/accordion.css
15764//>>css.theme: ../../themes/base/theme.css
15765
15766
15767var widgetsAccordion = $.widget( "ui.accordion", {
15768	version: "1.13.2
vendor: 15,900 bytes, lines 15768-16379
15768",
15769	options: {
15770		active: 0,
15771		animate: {},
15772		classes: {
15773			"ui-accordion-header": "ui-corner-top",
15774			"ui-accordion-header-collapsed": "ui-corner-all",
15775			"ui-accordion-content": "ui-corner-bottom"
15776		},
15777		collapsible: false,
15778		event: "click",
15779		header: function( elem ) {
15780			return elem.find( "> li > :first-child" ).add( elem.find( "> :not(li)" ).even() );
15781		},
15782		heightStyle: "auto",
15783		icons: {
15784			activeHeader: "ui-icon-triangle-1-s",
15785			header: "ui-icon-triangle-1-e"
15786		},
15787
15788		// Callbacks
15789		activate: null,
15790		beforeActivate: null
15791	},
15792
15793	hideProps: {
15794		borderTopWidth: "hide",
15795		borderBottomWidth: "hide",
15796		paddingTop: "hide",
15797		paddingBottom: "hide",
15798		height: "hide"
15799	},
15800
15801	showProps: {
15802		borderTopWidth: "show",
15803		borderBottomWidth: "show",
15804		paddingTop: "show",
15805		paddingBottom: "show",
15806		height: "show"
15807	},
15808
15809	_create: function() {
15810		var options = this.options;
15811
15812		this.prevShow = this.prevHide = $();
15813		this._addClass( "ui-accordion", "ui-widget ui-helper-reset" );
15814		this.element.attr( "role", "tablist" );
15815
15816		// Don't allow collapsible: false and active: false / null
15817		if ( !options.collapsible && ( options.active === false || options.active == null ) ) {
15818			options.active = 0;
15819		}
15820
15821		this._processPanels();
15822
15823		// handle negative values
15824		if ( options.active < 0 ) {
15825			options.active += this.headers.length;
15826		}
15827		this._refresh();
15828	},
15829
15830	_getCreateEventData: function() {
15831		return {
15832			header: this.active,
15833			panel: !this.active.length ? $() : this.active.next()
15834		};
15835	},
15836
15837	_createIcons: function() {
15838		var icon, children,
15839			icons = this.options.icons;
15840
15841		if ( icons ) {
15842			icon = $( "<span>" );
15843			this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header );
15844			icon.prependTo( this.headers );
15845			children = this.active.children( ".ui-accordion-header-icon" );
15846			this._removeClass( children, icons.header )
15847				._addClass( children, null, icons.activeHeader )
15848				._addClass( this.headers, "ui-accordion-icons" );
15849		}
15850	},
15851
15852	_destroyIcons: function() {
15853		this._removeClass( this.headers, "ui-accordion-icons" );
15854		this.headers.children( ".ui-accordion-header-icon" ).remove();
15855	},
15856
15857	_destroy: function() {
15858		var contents;
15859
15860		// Clean up main element
15861		this.element.removeAttr( "role" );
15862
15863		// Clean up headers
15864		this.headers
15865			.removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" )
15866			.removeUniqueId();
15867
15868		this._destroyIcons();
15869
15870		// Clean up content panels
15871		contents = this.headers.next()
15872			.css( "display", "" )
15873			.removeAttr( "role aria-hidden aria-labelledby" )
15874			.removeUniqueId();
15875
15876		if ( this.options.heightStyle !== "content" ) {
15877			contents.css( "height", "" );
15878		}
15879	},
15880
15881	_setOption: function( key, value ) {
15882		if ( key === "active" ) {
15883
15884			// _activate() will handle invalid values and update this.options
15885			this._activate( value );
15886			return;
15887		}
15888
15889		if ( key === "event" ) {
15890			if ( this.options.event ) {
15891				this._off( this.headers, this.options.event );
15892			}
15893			this._setupEvents( value );
15894		}
15895
15896		this._super( key, value );
15897
15898		// Setting collapsible: false while collapsed; open first panel
15899		if ( key === "collapsible" && !value && this.options.active === false ) {
15900			this._activate( 0 );
15901		}
15902
15903		if ( key === "icons" ) {
15904			this._destroyIcons();
15905			if ( value ) {
15906				this._createIcons();
15907			}
15908		}
15909	},
15910
15911	_setOptionDisabled: function( value ) {
15912		this._super( value );
15913
15914		this.element.attr( "aria-disabled", value );
15915
15916		// Support: IE8 Only
15917		// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
15918		// so we need to add the disabled class to the headers and panels
15919		this._toggleClass( null, "ui-state-disabled", !!value );
15920		this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled",
15921			!!value );
15922	},
15923
15924	_keydown: function( event ) {
15925		if ( event.altKey || event.ctrlKey ) {
15926			return;
15927		}
15928
15929		var keyCode = $.ui.keyCode,
15930			length = this.headers.length,
15931			currentIndex = this.headers.index( event.target ),
15932			toFocus = false;
15933
15934		switch ( event.keyCode ) {
15935		case keyCode.RIGHT:
15936		case keyCode.DOWN:
15937			toFocus = this.headers[ ( currentIndex + 1 ) % length ];
15938			break;
15939		case keyCode.LEFT:
15940		case keyCode.UP:
15941			toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
15942			break;
15943		case keyCode.SPACE:
15944		case keyCode.ENTER:
15945			this._eventHandler( event );
15946			break;
15947		case keyCode.HOME:
15948			toFocus = this.headers[ 0 ];
15949			break;
15950		case keyCode.END:
15951			toFocus = this.headers[ length - 1 ];
15952			break;
15953		}
15954
15955		if ( toFocus ) {
15956			$( event.target ).attr( "tabIndex", -1 );
15957			$( toFocus ).attr( "tabIndex", 0 );
15958			$( toFocus ).trigger( "focus" );
15959			event.preventDefault();
15960		}
15961	},
15962
15963	_panelKeyDown: function( event ) {
15964		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
15965			$( event.currentTarget ).prev().trigger( "focus" );
15966		}
15967	},
15968
15969	refresh: function() {
15970		var options = this.options;
15971		this._processPanels();
15972
15973		// Was collapsed or no panel
15974		if ( ( options.active === false && options.collapsible === true ) ||
15975				!this.headers.length ) {
15976			options.active = false;
15977			this.active = $();
15978
15979		// active false only when collapsible is true
15980		} else if ( options.active === false ) {
15981			this._activate( 0 );
15982
15983		// was active, but active panel is gone
15984		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
15985
15986			// all remaining panel are disabled
15987			if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) {
15988				options.active = false;
15989				this.active = $();
15990
15991			// activate previous panel
15992			} else {
15993				this._activate( Math.max( 0, options.active - 1 ) );
15994			}
15995
15996		// was active, active panel still exists
15997		} else {
15998
15999			// make sure active index is correct
16000			options.active = this.headers.index( this.active );
16001		}
16002
16003		this._destroyIcons();
16004
16005		this._refresh();
16006	},
16007
16008	_processPanels: function() {
16009		var prevHeaders = this.headers,
16010			prevPanels = this.panels;
16011
16012		if ( typeof this.options.header === "function" ) {
16013			this.headers = this.options.header( this.element );
16014		} else {
16015			this.headers = this.element.find( this.options.header );
16016		}
16017		this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed",
16018			"ui-state-default" );
16019
16020		this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide();
16021		this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" );
16022
16023		// Avoid memory leaks (#10056)
16024		if ( prevPanels ) {
16025			this._off( prevHeaders.not( this.headers ) );
16026			this._off( prevPanels.not( this.panels ) );
16027		}
16028	},
16029
16030	_refresh: function() {
16031		var maxHeight,
16032			options = this.options,
16033			heightStyle = options.heightStyle,
16034			parent = this.element.parent();
16035
16036		this.active = this._findActive( options.active );
16037		this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" )
16038			._removeClass( this.active, "ui-accordion-header-collapsed" );
16039		this._addClass( this.active.next(), "ui-accordion-content-active" );
16040		this.active.next().show();
16041
16042		this.headers
16043			.attr( "role", "tab" )
16044			.each( function() {
16045				var header = $( this ),
16046					headerId = header.uniqueId().attr( "id" ),
16047					panel = header.next(),
16048					panelId = panel.uniqueId().attr( "id" );
16049				header.attr( "aria-controls", panelId );
16050				panel.attr( "aria-labelledby", headerId );
16051			} )
16052			.next()
16053				.attr( "role", "tabpanel" );
16054
16055		this.headers
16056			.not( this.active )
16057				.attr( {
16058					"aria-selected": "false",
16059					"aria-expanded": "false",
16060					tabIndex: -1
16061				} )
16062				.next()
16063					.attr( {
16064						"aria-hidden": "true"
16065					} )
16066					.hide();
16067
16068		// Make sure at least one header is in the tab order
16069		if ( !this.active.length ) {
16070			this.headers.eq( 0 ).attr( "tabIndex", 0 );
16071		} else {
16072			this.active.attr( {
16073				"aria-selected": "true",
16074				"aria-expanded": "true",
16075				tabIndex: 0
16076			} )
16077				.next()
16078					.attr( {
16079						"aria-hidden": "false"
16080					} );
16081		}
16082
16083		this._createIcons();
16084
16085		this._setupEvents( options.event );
16086
16087		if ( heightStyle === "fill" ) {
16088			maxHeight = parent.height();
16089			this.element.siblings( ":visible" ).each( function() {
16090				var elem = $( this ),
16091					position = elem.css( "position" );
16092
16093				if ( position === "absolute" || position === "fixed" ) {
16094					return;
16095				}
16096				maxHeight -= elem.outerHeight( true );
16097			} );
16098
16099			this.headers.each( function() {
16100				maxHeight -= $( this ).outerHeight( true );
16101			} );
16102
16103			this.headers.next()
16104				.each( function() {
16105					$( this ).height( Math.max( 0, maxHeight -
16106						$( this ).innerHeight() + $( this ).height() ) );
16107				} )
16108				.css( "overflow", "auto" );
16109		} else if ( heightStyle === "auto" ) {
16110			maxHeight = 0;
16111			this.headers.next()
16112				.each( function() {
16113					var isVisible = $( this ).is( ":visible" );
16114					if ( !isVisible ) {
16115						$( this ).show();
16116					}
16117					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
16118					if ( !isVisible ) {
16119						$( this ).hide();
16120					}
16121				} )
16122				.height( maxHeight );
16123		}
16124	},
16125
16126	_activate: function( index ) {
16127		var active = this._findActive( index )[ 0 ];
16128
16129		// Trying to activate the already active panel
16130		if ( active === this.active[ 0 ] ) {
16131			return;
16132		}
16133
16134		// Trying to collapse, simulate a click on the currently active header
16135		active = active || this.active[ 0 ];
16136
16137		this._eventHandler( {
16138			target: active,
16139			currentTarget: active,
16140			preventDefault: $.noop
16141		} );
16142	},
16143
16144	_findActive: function( selector ) {
16145		return typeof selector === "number" ? this.headers.eq( selector ) : $();
16146	},
16147
16148	_setupEvents: function( event ) {
16149		var events = {
16150			keydown: "_keydown"
16151		};
16152		if ( event ) {
16153			$.each( event.split( " " ), function( index, eventName ) {
16154				events[ eventName ] = "_eventHandler";
16155			} );
16156		}
16157
16158		this._off( this.headers.add( this.headers.next() ) );
16159		this._on( this.headers, events );
16160		this._on( this.headers.next(), { keydown: "_panelKeyDown" } );
16161		this._hoverable( this.headers );
16162		this._focusable( this.headers );
16163	},
16164
16165	_eventHandler: function( event ) {
16166		var activeChildren, clickedChildren,
16167			options = this.options,
16168			active = this.active,
16169			clicked = $( event.currentTarget ),
16170			clickedIsActive = clicked[ 0 ] === active[ 0 ],
16171			collapsing = clickedIsActive && options.collapsible,
16172			toShow = collapsing ? $() : clicked.next(),
16173			toHide = active.next(),
16174			eventData = {
16175				oldHeader: active,
16176				oldPanel: toHide,
16177				newHeader: collapsing ? $() : clicked,
16178				newPanel: toShow
16179			};
16180
16181		event.preventDefault();
16182
16183		if (
16184
16185				// click on active header, but not collapsible
16186				( clickedIsActive && !options.collapsible ) ||
16187
16188				// allow canceling activation
16189				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
16190			return;
16191		}
16192
16193		options.active = collapsing ? false : this.headers.index( clicked );
16194
16195		// When the call to ._toggle() comes after the class changes
16196		// it causes a very odd bug in IE 8 (see #6720)
16197		this.active = clickedIsActive ? $() : clicked;
16198		this._toggle( eventData );
16199
16200		// Switch classes
16201		// corner classes on the previously active header stay after the animation
16202		this._removeClass( active, "ui-accordion-header-active", "ui-state-active" );
16203		if ( options.icons ) {
16204			activeChildren = active.children( ".ui-accordion-header-icon" );
16205			this._removeClass( activeChildren, null, options.icons.activeHeader )
16206				._addClass( activeChildren, null, options.icons.header );
16207		}
16208
16209		if ( !clickedIsActive ) {
16210			this._removeClass( clicked, "ui-accordion-header-collapsed" )
16211				._addClass( clicked, "ui-accordion-header-active", "ui-state-active" );
16212			if ( options.icons ) {
16213				clickedChildren = clicked.children( ".ui-accordion-header-icon" );
16214				this._removeClass( clickedChildren, null, options.icons.header )
16215					._addClass( clickedChildren, null, options.icons.activeHeader );
16216			}
16217
16218			this._addClass( clicked.next(), "ui-accordion-content-active" );
16219		}
16220	},
16221
16222	_toggle: function( data ) {
16223		var toShow = data.newPanel,
16224			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
16225
16226		// Handle activating a panel during the animation for another activation
16227		this.prevShow.add( this.prevHide ).stop( true, true );
16228		this.prevShow = toShow;
16229		this.prevHide = toHide;
16230
16231		if ( this.options.animate ) {
16232			this._animate( toShow, toHide, data );
16233		} else {
16234			toHide.hide();
16235			toShow.show();
16236			this._toggleComplete( data );
16237		}
16238
16239		toHide.attr( {
16240			"aria-hidden": "true"
16241		} );
16242		toHide.prev().attr( {
16243			"aria-selected": "false",
16244			"aria-expanded": "false"
16245		} );
16246
16247		// if we're switching panels, remove the old header from the tab order
16248		// if we're opening from collapsed state, remove the previous header from the tab order
16249		// if we're collapsing, then keep the collapsing header in the tab order
16250		if ( toShow.length && toHide.length ) {
16251			toHide.prev().attr( {
16252				"tabIndex": -1,
16253				"aria-expanded": "false"
16254			} );
16255		} else if ( toShow.length ) {
16256			this.headers.filter( function() {
16257				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
16258			} )
16259				.attr( "tabIndex", -1 );
16260		}
16261
16262		toShow
16263			.attr( "aria-hidden", "false" )
16264			.prev()
16265				.attr( {
16266					"aria-selected": "true",
16267					"aria-expanded": "true",
16268					tabIndex: 0
16269				} );
16270	},
16271
16272	_animate: function( toShow, toHide, data ) {
16273		var total, easing, duration,
16274			that = this,
16275			adjust = 0,
16276			boxSizing = toShow.css( "box-sizing" ),
16277			down = toShow.length &&
16278				( !toHide.length || ( toShow.index() < toHide.index() ) ),
16279			animate = this.options.animate || {},
16280			options = down && animate.down || animate,
16281			complete = function() {
16282				that._toggleComplete( data );
16283			};
16284
16285		if ( typeof options === "number" ) {
16286			duration = options;
16287		}
16288		if ( typeof options === "string" ) {
16289			easing = options;
16290		}
16291
16292		// fall back from options to animation in case of partial down settings
16293		easing = easing || options.easing || animate.easing;
16294		duration = duration || options.duration || animate.duration;
16295
16296		if ( !toHide.length ) {
16297			return toShow.animate( this.showProps, duration, easing, complete );
16298		}
16299		if ( !toShow.length ) {
16300			return toHide.animate( this.hideProps, duration, easing, complete );
16301		}
16302
16303		total = toShow.show().outerHeight();
16304		toHide.animate( this.hideProps, {
16305			duration: duration,
16306			easing: easing,
16307			step: function( now, fx ) {
16308				fx.now = Math.round( now );
16309			}
16310		} );
16311		toShow
16312			.hide()
16313			.animate( this.showProps, {
16314				duration: duration,
16315				easing: easing,
16316				complete: complete,
16317				step: function( now, fx ) {
16318					fx.now = Math.round( now );
16319					if ( fx.prop !== "height" ) {
16320						if ( boxSizing === "content-box" ) {
16321							adjust += fx.now;
16322						}
16323					} else if ( that.options.heightStyle !== "content" ) {
16324						fx.now = Math.round( total - toHide.outerHeight() - adjust );
16325						adjust = 0;
16326					}
16327				}
16328			} );
16329	},
16330
16331	_toggleComplete: function( data ) {
16332		var toHide = data.oldPanel,
16333			prev = toHide.prev();
16334
16335		this._removeClass( toHide, "ui-accordion-content-active" );
16336		this._removeClass( prev, "ui-accordion-header-active" )
16337			._addClass( prev, "ui-accordion-header-collapsed" );
16338
16339		// Work around for rendering bug in IE (#5421)
16340		if ( toHide.length ) {
16341			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
16342		}
16343		this._trigger( "activate", null, data );
16344	}
16345} );
16346
16347
16348
16349var safeActiveElement = $.ui.safeActiveElement = function( document ) {
16350	var activeElement;
16351
16352	// Support: IE 9 only
16353	// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
16354	try {
16355		activeElement = document.activeElement;
16356	} catch ( error ) {
16357		activeElement = document.body;
16358	}
16359
16360	// Support: IE 9 - 11 only
16361	// IE may return null instead of an element
16362	// Interestingly, this only seems to occur when NOT in an iframe
16363	if ( !activeElement ) {
16364		activeElement = document.body;
16365	}
16366
16367	// Support: IE 11 only
16368	// IE11 returns a seemingly empty object in some cases when accessing
16369	// document.activeElement from an <iframe>
16370	if ( !activeElement.nodeName ) {
16371		activeElement = document.body;
16372	}
16373
16374	return activeElement;
16375};
16376
16377
16378/*!
16379 * jQuery UI Menu 1.13.
163792
16380 * http://jqueryui.com
16381 *
16382 * Copyright jQuery Foundation and other contributors
16383 * Released under the MIT license.
16384 * http://jquery.org/license
16385 */
16386
16387//>>label: Menu
16388//>>group: Widgets
16389//>>description: Creates nestable menus.
16390//>>docs: http://api.jqueryui.com/menu/
16391//>>demos: http://jqueryui.com/menu/
16392//>>css.structure: ../../themes/base/core.css
16393//>>css.structure: ../../themes/base/menu.css
16394//>>css.theme: ../../themes/base/theme.css
16395
16396
16397var widgetsMenu = $.widget( "ui.menu", {
16398	version: "1.13.2
vendor: 2,668 bytes, lines 16398-16500
16398",
16399	defaultElement: "<ul>",
16400	delay: 300,
16401	options: {
16402		icons: {
16403			submenu: "ui-icon-caret-1-e"
16404		},
16405		items: "> *",
16406		menus: "ul",
16407		position: {
16408			my: "left top",
16409			at: "right top"
16410		},
16411		role: "menu",
16412
16413		// Callbacks
16414		blur: null,
16415		focus: null,
16416		select: null
16417	},
16418
16419	_create: function() {
16420		this.activeMenu = this.element;
16421
16422		// Flag used to prevent firing of the click handler
16423		// as the event bubbles up through nested menus
16424		this.mouseHandled = false;
16425		this.lastMousePosition = { x: null, y: null };
16426		this.element
16427			.uniqueId()
16428			.attr( {
16429				role: this.options.role,
16430				tabIndex: 0
16431			} );
16432
16433		this._addClass( "ui-menu", "ui-widget ui-widget-content" );
16434		this._on( {
16435
16436			// Prevent focus from sticking to links inside menu after clicking
16437			// them (focus should always stay on UL during navigation).
16438			"mousedown .ui-menu-item": function( event ) {
16439				event.preventDefault();
16440
16441				this._activateItem( event );
16442			},
16443			"click .ui-menu-item": function( event ) {
16444				var target = $( event.target );
16445				var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
16446				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
16447					this.select( event );
16448
16449					// Only set the mouseHandled flag if the event will bubble, see #9469.
16450					if ( !event.isPropagationStopped() ) {
16451						this.mouseHandled = true;
16452					}
16453
16454					// Open submenu on click
16455					if ( target.has( ".ui-menu" ).length ) {
16456						this.expand( event );
16457					} else if ( !this.element.is( ":focus" ) &&
16458							active.closest( ".ui-menu" ).length ) {
16459
16460						// Redirect focus to the menu
16461						this.element.trigger( "focus", [ true ] );
16462
16463						// If the active item is on the top level, let it stay active.
16464						// Otherwise, blur the active item since it is no longer visible.
16465						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
16466							clearTimeout( this.timer );
16467						}
16468					}
16469				}
16470			},
16471			"mouseenter .ui-menu-item": "_activateItem",
16472			"mousemove .ui-menu-item": "_activateItem",
16473			mouseleave: "collapseAll",
16474			"mouseleave .ui-menu": "collapseAll",
16475			focus: function( event, keepActiveItem ) {
16476
16477				// If there's already an active item, keep it active
16478				// If not, activate the first item
16479				var item = this.active || this._menuItems().first();
16480
16481				if ( !keepActiveItem ) {
16482					this.focus( event, item );
16483				}
16484			},
16485			blur: function( event ) {
16486				this._delay( function() {
16487					var notContained = !$.contains(
16488						this.element[ 0 ],
16489						$.ui.safeActiveElement( this.document[ 0 ] )
16490					);
16491					if ( notContained ) {
16492						this.collapseAll( event );
16493					}
16494				} );
16495			},
16496			keydown: "_keydown"
16497		} );
16498
16499		this.refresh();
16500
vendor: 3,056 bytes, lines 16501-16617
16501		// Clicks outside of a menu collapse any open menus
16502		this._on( this.document, {
16503			click: function( event ) {
16504				if ( this._closeOnDocumentClick( event ) ) {
16505					this.collapseAll( event, true );
16506				}
16507
16508				// Reset the mouseHandled flag
16509				this.mouseHandled = false;
16510			}
16511		} );
16512	},
16513
16514	_activateItem: function( event ) {
16515
16516		// Ignore mouse events while typeahead is active, see #10458.
16517		// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
16518		// is over an item in the menu
16519		if ( this.previousFilter ) {
16520			return;
16521		}
16522
16523		// If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)
16524		if ( event.clientX === this.lastMousePosition.x &&
16525				event.clientY === this.lastMousePosition.y ) {
16526			return;
16527		}
16528
16529		this.lastMousePosition = {
16530			x: event.clientX,
16531			y: event.clientY
16532		};
16533
16534		var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
16535			target = $( event.currentTarget );
16536
16537		// Ignore bubbled events on parent items, see #11641
16538		if ( actualTarget[ 0 ] !== target[ 0 ] ) {
16539			return;
16540		}
16541
16542		// If the item is already active, there's nothing to do
16543		if ( target.is( ".ui-state-active" ) ) {
16544			return;
16545		}
16546
16547		// Remove ui-state-active class from siblings of the newly focused menu item
16548		// to avoid a jump caused by adjacent elements both having a class with a border
16549		this._removeClass( target.siblings().children( ".ui-state-active" ),
16550			null, "ui-state-active" );
16551		this.focus( event, target );
16552	},
16553
16554	_destroy: function() {
16555		var items = this.element.find( ".ui-menu-item" )
16556				.removeAttr( "role aria-disabled" ),
16557			submenus = items.children( ".ui-menu-item-wrapper" )
16558				.removeUniqueId()
16559				.removeAttr( "tabIndex role aria-haspopup" );
16560
16561		// Destroy (sub)menus
16562		this.element
16563			.removeAttr( "aria-activedescendant" )
16564			.find( ".ui-menu" ).addBack()
16565				.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
16566					"tabIndex" )
16567				.removeUniqueId()
16568				.show();
16569
16570		submenus.children().each( function() {
16571			var elem = $( this );
16572			if ( elem.data( "ui-menu-submenu-caret" ) ) {
16573				elem.remove();
16574			}
16575		} );
16576	},
16577
16578	_keydown: function( event ) {
16579		var match, prev, character, skip,
16580			preventDefault = true;
16581
16582		switch ( event.keyCode ) {
16583		case $.ui.keyCode.PAGE_UP:
16584			this.previousPage( event );
16585			break;
16586		case $.ui.keyCode.PAGE_DOWN:
16587			this.nextPage( event );
16588			break;
16589		case $.ui.keyCode.HOME:
16590			this._move( "first", "first", event );
16591			break;
16592		case $.ui.keyCode.END:
16593			this._move( "last", "last", event );
16594			break;
16595		case $.ui.keyCode.UP:
16596			this.previous( event );
16597			break;
16598		case $.ui.keyCode.DOWN:
16599			this.next( event );
16600			break;
16601		case $.ui.keyCode.LEFT:
16602			this.collapse( event );
16603			break;
16604		case $.ui.keyCode.RIGHT:
16605			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
16606				this.expand( event );
16607			}
16608			break;
16609		case $.ui.keyCode.ENTER:
16610		case $.ui.keyCode.SPACE:
16611			this._activate( event );
16612			break;
16613		case $.ui.keyCode.ESCAPE:
16614			this.collapse( event );
16615			break;
16616		default:
16617			preventDefault = false;
vendor: 2,378 bytes, lines 16618-16703
16618			prev = this.previousFilter || "";
16619			skip = false;
16620
16621			// Support number pad values
16622			character = event.keyCode >= 96 && event.keyCode <= 105 ?
16623				( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
16624
16625			clearTimeout( this.filterTimer );
16626
16627			if ( character === prev ) {
16628				skip = true;
16629			} else {
16630				character = prev + character;
16631			}
16632
16633			match = this._filterMenuItems( character );
16634			match = skip && match.index( this.active.next() ) !== -1 ?
16635				this.active.nextAll( ".ui-menu-item" ) :
16636				match;
16637
16638			// If no matches on the current filter, reset to the last character pressed
16639			// to move down the menu to the first item that starts with that character
16640			if ( !match.length ) {
16641				character = String.fromCharCode( event.keyCode );
16642				match = this._filterMenuItems( character );
16643			}
16644
16645			if ( match.length ) {
16646				this.focus( event, match );
16647				this.previousFilter = character;
16648				this.filterTimer = this._delay( function() {
16649					delete this.previousFilter;
16650				}, 1000 );
16651			} else {
16652				delete this.previousFilter;
16653			}
16654		}
16655
16656		if ( preventDefault ) {
16657			event.preventDefault();
16658		}
16659	},
16660
16661	_activate: function( event ) {
16662		if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
16663			if ( this.active.children( "[aria-haspopup='true']" ).length ) {
16664				this.expand( event );
16665			} else {
16666				this.select( event );
16667			}
16668		}
16669	},
16670
16671	refresh: function() {
16672		var menus, items, newSubmenus, newItems, newWrappers,
16673			that = this,
16674			icon = this.options.icons.submenu,
16675			submenus = this.element.find( this.options.menus );
16676
16677		this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
16678
16679		// Initialize nested menus
16680		newSubmenus = submenus.filter( ":not(.ui-menu)" )
16681			.hide()
16682			.attr( {
16683				role: this.options.role,
16684				"aria-hidden": "true",
16685				"aria-expanded": "false"
16686			} )
16687			.each( function() {
16688				var menu = $( this ),
16689					item = menu.prev(),
16690					submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
16691
16692				that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
16693				item
16694					.attr( "aria-haspopup", "true" )
16695					.prepend( submenuCaret );
16696				menu.attr( "aria-labelledby", item.attr( "id" ) );
16697			} );
16698
16699		this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
16700
16701		menus = submenus.add( this.element );
16702		items = menus.find( this.options.items );
16703
vendor: 4,552 bytes, lines 16704-16866
16704		// Initialize menu-items containing spaces and/or dashes only as dividers
16705		items.not( ".ui-menu-item" ).each( function() {
16706			var item = $( this );
16707			if ( that._isDivider( item ) ) {
16708				that._addClass( item, "ui-menu-divider", "ui-widget-content" );
16709			}
16710		} );
16711
16712		// Don't refresh list items that are already adapted
16713		newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
16714		newWrappers = newItems.children()
16715			.not( ".ui-menu" )
16716				.uniqueId()
16717				.attr( {
16718					tabIndex: -1,
16719					role: this._itemRole()
16720				} );
16721		this._addClass( newItems, "ui-menu-item" )
16722			._addClass( newWrappers, "ui-menu-item-wrapper" );
16723
16724		// Add aria-disabled attribute to any disabled menu item
16725		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
16726
16727		// If the active item has been removed, blur the menu
16728		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
16729			this.blur();
16730		}
16731	},
16732
16733	_itemRole: function() {
16734		return {
16735			menu: "menuitem",
16736			listbox: "option"
16737		}[ this.options.role ];
16738	},
16739
16740	_setOption: function( key, value ) {
16741		if ( key === "icons" ) {
16742			var icons = this.element.find( ".ui-menu-icon" );
16743			this._removeClass( icons, null, this.options.icons.submenu )
16744				._addClass( icons, null, value.submenu );
16745		}
16746		this._super( key, value );
16747	},
16748
16749	_setOptionDisabled: function( value ) {
16750		this._super( value );
16751
16752		this.element.attr( "aria-disabled", String( value ) );
16753		this._toggleClass( null, "ui-state-disabled", !!value );
16754	},
16755
16756	focus: function( event, item ) {
16757		var nested, focused, activeParent;
16758		this.blur( event, event && event.type === "focus" );
16759
16760		this._scrollIntoView( item );
16761
16762		this.active = item.first();
16763
16764		focused = this.active.children( ".ui-menu-item-wrapper" );
16765		this._addClass( focused, null, "ui-state-active" );
16766
16767		// Only update aria-activedescendant if there's a role
16768		// otherwise we assume focus is managed elsewhere
16769		if ( this.options.role ) {
16770			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
16771		}
16772
16773		// Highlight active parent menu item, if any
16774		activeParent = this.active
16775			.parent()
16776				.closest( ".ui-menu-item" )
16777					.children( ".ui-menu-item-wrapper" );
16778		this._addClass( activeParent, null, "ui-state-active" );
16779
16780		if ( event && event.type === "keydown" ) {
16781			this._close();
16782		} else {
16783			this.timer = this._delay( function() {
16784				this._close();
16785			}, this.delay );
16786		}
16787
16788		nested = item.children( ".ui-menu" );
16789		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
16790			this._startOpening( nested );
16791		}
16792		this.activeMenu = item.parent();
16793
16794		this._trigger( "focus", event, { item: item } );
16795	},
16796
16797	_scrollIntoView: function( item ) {
16798		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
16799		if ( this._hasScroll() ) {
16800			borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
16801			paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
16802			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
16803			scroll = this.activeMenu.scrollTop();
16804			elementHeight = this.activeMenu.height();
16805			itemHeight = item.outerHeight();
16806
16807			if ( offset < 0 ) {
16808				this.activeMenu.scrollTop( scroll + offset );
16809			} else if ( offset + itemHeight > elementHeight ) {
16810				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
16811			}
16812		}
16813	},
16814
16815	blur: function( event, fromFocus ) {
16816		if ( !fromFocus ) {
16817			clearTimeout( this.timer );
16818		}
16819
16820		if ( !this.active ) {
16821			return;
16822		}
16823
16824		this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
16825			null, "ui-state-active" );
16826
16827		this._trigger( "blur", event, { item: this.active } );
16828		this.active = null;
16829	},
16830
16831	_startOpening: function( submenu ) {
16832		clearTimeout( this.timer );
16833
16834		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
16835		// shift in the submenu position when mousing over the caret icon
16836		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
16837			return;
16838		}
16839
16840		this.timer = this._delay( function() {
16841			this._close();
16842			this._open( submenu );
16843		}, this.delay );
16844	},
16845
16846	_open: function( submenu ) {
16847		var position = $.extend( {
16848			of: this.active
16849		}, this.options.position );
16850
16851		clearTimeout( this.timer );
16852		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
16853			.hide()
16854			.attr( "aria-hidden", "true" );
16855
16856		submenu
16857			.show()
16858			.removeAttr( "aria-hidden" )
16859			.attr( "aria-expanded", "true" )
16860			.position( position );
16861	},
16862
16863	collapseAll: function( event, all ) {
16864		clearTimeout( this.timer );
16865		this.timer = this._delay( function() {
16866
vendor: 5,432 bytes, lines 16867-17070
16867			// If we were passed an event, look for the submenu that contains the event
16868			var currentMenu = all ? this.element :
16869				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
16870
16871			// If we found no valid submenu ancestor, use the main menu to close all
16872			// sub menus anyway
16873			if ( !currentMenu.length ) {
16874				currentMenu = this.element;
16875			}
16876
16877			this._close( currentMenu );
16878
16879			this.blur( event );
16880
16881			// Work around active item staying active after menu is blurred
16882			this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
16883
16884			this.activeMenu = currentMenu;
16885		}, all ? 0 : this.delay );
16886	},
16887
16888	// With no arguments, closes the currently active menu - if nothing is active
16889	// it closes all menus.  If passed an argument, it will search for menus BELOW
16890	_close: function( startMenu ) {
16891		if ( !startMenu ) {
16892			startMenu = this.active ? this.active.parent() : this.element;
16893		}
16894
16895		startMenu.find( ".ui-menu" )
16896			.hide()
16897			.attr( "aria-hidden", "true" )
16898			.attr( "aria-expanded", "false" );
16899	},
16900
16901	_closeOnDocumentClick: function( event ) {
16902		return !$( event.target ).closest( ".ui-menu" ).length;
16903	},
16904
16905	_isDivider: function( item ) {
16906
16907		// Match hyphen, em dash, en dash
16908		return !/[^\-\u2014\u2013\s]/.test( item.text() );
16909	},
16910
16911	collapse: function( event ) {
16912		var newItem = this.active &&
16913			this.active.parent().closest( ".ui-menu-item", this.element );
16914		if ( newItem && newItem.length ) {
16915			this._close();
16916			this.focus( event, newItem );
16917		}
16918	},
16919
16920	expand: function( event ) {
16921		var newItem = this.active && this._menuItems( this.active.children( ".ui-menu" ) ).first();
16922
16923		if ( newItem && newItem.length ) {
16924			this._open( newItem.parent() );
16925
16926			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
16927			this._delay( function() {
16928				this.focus( event, newItem );
16929			} );
16930		}
16931	},
16932
16933	next: function( event ) {
16934		this._move( "next", "first", event );
16935	},
16936
16937	previous: function( event ) {
16938		this._move( "prev", "last", event );
16939	},
16940
16941	isFirstItem: function() {
16942		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
16943	},
16944
16945	isLastItem: function() {
16946		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
16947	},
16948
16949	_menuItems: function( menu ) {
16950		return ( menu || this.element )
16951			.find( this.options.items )
16952			.filter( ".ui-menu-item" );
16953	},
16954
16955	_move: function( direction, filter, event ) {
16956		var next;
16957		if ( this.active ) {
16958			if ( direction === "first" || direction === "last" ) {
16959				next = this.active
16960					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
16961					.last();
16962			} else {
16963				next = this.active
16964					[ direction + "All" ]( ".ui-menu-item" )
16965					.first();
16966			}
16967		}
16968		if ( !next || !next.length || !this.active ) {
16969			next = this._menuItems( this.activeMenu )[ filter ]();
16970		}
16971
16972		this.focus( event, next );
16973	},
16974
16975	nextPage: function( event ) {
16976		var item, base, height;
16977
16978		if ( !this.active ) {
16979			this.next( event );
16980			return;
16981		}
16982		if ( this.isLastItem() ) {
16983			return;
16984		}
16985		if ( this._hasScroll() ) {
16986			base = this.active.offset().top;
16987			height = this.element.innerHeight();
16988
16989			// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
16990			if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) {
16991				height += this.element[ 0 ].offsetHeight - this.element.outerHeight();
16992			}
16993
16994			this.active.nextAll( ".ui-menu-item" ).each( function() {
16995				item = $( this );
16996				return item.offset().top - base - height < 0;
16997			} );
16998
16999			this.focus( event, item );
17000		} else {
17001			this.focus( event, this._menuItems( this.activeMenu )
17002				[ !this.active ? "first" : "last" ]() );
17003		}
17004	},
17005
17006	previousPage: function( event ) {
17007		var item, base, height;
17008		if ( !this.active ) {
17009			this.next( event );
17010			return;
17011		}
17012		if ( this.isFirstItem() ) {
17013			return;
17014		}
17015		if ( this._hasScroll() ) {
17016			base = this.active.offset().top;
17017			height = this.element.innerHeight();
17018
17019			// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
17020			if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) {
17021				height += this.element[ 0 ].offsetHeight - this.element.outerHeight();
17022			}
17023
17024			this.active.prevAll( ".ui-menu-item" ).each( function() {
17025				item = $( this );
17026				return item.offset().top - base + height > 0;
17027			} );
17028
17029			this.focus( event, item );
17030		} else {
17031			this.focus( event, this._menuItems( this.activeMenu ).first() );
17032		}
17033	},
17034
17035	_hasScroll: function() {
17036		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
17037	},
17038
17039	select: function( event ) {
17040
17041		// TODO: It should never be possible to not have an active item at this
17042		// point, but the tests don't trigger mouseenter before click.
17043		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
17044		var ui = { item: this.active };
17045		if ( !this.active.has( ".ui-menu" ).length ) {
17046			this.collapseAll( event, true );
17047		}
17048		this._trigger( "select", event, ui );
17049	},
17050
17051	_filterMenuItems: function( character ) {
17052		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
17053			regex = new RegExp( "^" + escapedCharacter, "i" );
17054
17055		return this.activeMenu
17056			.find( this.options.items )
17057
17058				// Only match on items, not dividers or other content (#10571)
17059				.filter( ".ui-menu-item" )
17060					.filter( function() {
17061						return regex.test(
17062							String.prototype.trim.call(
17063								$( this ).children( ".ui-menu-item-wrapper" ).text() ) );
17064					} );
17065	}
17066} );
17067
17068
17069/*!
17070 * jQuery UI Autocomplete 1.1
170703.2
17071 * http://jqueryui.com
17072 *
17073 * Copyright jQuery Foundation and other contributors
17074 * Released under the MIT license.
17075 * http://jquery.org/license
17076 */
17077
17078//>>label: Autocomplete
17079//>>group: Widgets
17080//>>description: Lists suggested words as the user is typing.
17081//>>docs: http://api.jqueryui.com/autocomplete/
17082//>>demos: http://jqueryui.com/autocomplete/
17083//>>css.structure: ../../themes/base/core.css
17084//>>css.structure: ../../themes/base/autocomplete.css
17085//>>css.theme: ../../themes/base/theme.css
17086
17087
17088$.widget( "ui.autocomplete", {
17089	version: "1.13.2
vendor: 16,621 bytes, lines 17089-17726
17089",
17090	defaultElement: "<input>",
17091	options: {
17092		appendTo: null,
17093		autoFocus: false,
17094		delay: 300,
17095		minLength: 1,
17096		position: {
17097			my: "left top",
17098			at: "left bottom",
17099			collision: "none"
17100		},
17101		source: null,
17102
17103		// Callbacks
17104		change: null,
17105		close: null,
17106		focus: null,
17107		open: null,
17108		response: null,
17109		search: null,
17110		select: null
17111	},
17112
17113	requestIndex: 0,
17114	pending: 0,
17115	liveRegionTimer: null,
17116
17117	_create: function() {
17118
17119		// Some browsers only repeat keydown events, not keypress events,
17120		// so we use the suppressKeyPress flag to determine if we've already
17121		// handled the keydown event. #7269
17122		// Unfortunately the code for & in keypress is the same as the up arrow,
17123		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
17124		// events when we know the keydown event was used to modify the
17125		// search term. #7799
17126		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
17127			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
17128			isTextarea = nodeName === "textarea",
17129			isInput = nodeName === "input";
17130
17131		// Textareas are always multi-line
17132		// Inputs are always single-line, even if inside a contentEditable element
17133		// IE also treats inputs as contentEditable
17134		// All other element types are determined by whether or not they're contentEditable
17135		this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
17136
17137		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
17138		this.isNewMenu = true;
17139
17140		this._addClass( "ui-autocomplete-input" );
17141		this.element.attr( "autocomplete", "off" );
17142
17143		this._on( this.element, {
17144			keydown: function( event ) {
17145				if ( this.element.prop( "readOnly" ) ) {
17146					suppressKeyPress = true;
17147					suppressInput = true;
17148					suppressKeyPressRepeat = true;
17149					return;
17150				}
17151
17152				suppressKeyPress = false;
17153				suppressInput = false;
17154				suppressKeyPressRepeat = false;
17155				var keyCode = $.ui.keyCode;
17156				switch ( event.keyCode ) {
17157				case keyCode.PAGE_UP:
17158					suppressKeyPress = true;
17159					this._move( "previousPage", event );
17160					break;
17161				case keyCode.PAGE_DOWN:
17162					suppressKeyPress = true;
17163					this._move( "nextPage", event );
17164					break;
17165				case keyCode.UP:
17166					suppressKeyPress = true;
17167					this._keyEvent( "previous", event );
17168					break;
17169				case keyCode.DOWN:
17170					suppressKeyPress = true;
17171					this._keyEvent( "next", event );
17172					break;
17173				case keyCode.ENTER:
17174
17175					// when menu is open and has focus
17176					if ( this.menu.active ) {
17177
17178						// #6055 - Opera still allows the keypress to occur
17179						// which causes forms to submit
17180						suppressKeyPress = true;
17181						event.preventDefault();
17182						this.menu.select( event );
17183					}
17184					break;
17185				case keyCode.TAB:
17186					if ( this.menu.active ) {
17187						this.menu.select( event );
17188					}
17189					break;
17190				case keyCode.ESCAPE:
17191					if ( this.menu.element.is( ":visible" ) ) {
17192						if ( !this.isMultiLine ) {
17193							this._value( this.term );
17194						}
17195						this.close( event );
17196
17197						// Different browsers have different default behavior for escape
17198						// Single press can mean undo or clear
17199						// Double press in IE means clear the whole form
17200						event.preventDefault();
17201					}
17202					break;
17203				default:
17204					suppressKeyPressRepeat = true;
17205
17206					// search timeout should be triggered before the input value is changed
17207					this._searchTimeout( event );
17208					break;
17209				}
17210			},
17211			keypress: function( event ) {
17212				if ( suppressKeyPress ) {
17213					suppressKeyPress = false;
17214					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
17215						event.preventDefault();
17216					}
17217					return;
17218				}
17219				if ( suppressKeyPressRepeat ) {
17220					return;
17221				}
17222
17223				// Replicate some key handlers to allow them to repeat in Firefox and Opera
17224				var keyCode = $.ui.keyCode;
17225				switch ( event.keyCode ) {
17226				case keyCode.PAGE_UP:
17227					this._move( "previousPage", event );
17228					break;
17229				case keyCode.PAGE_DOWN:
17230					this._move( "nextPage", event );
17231					break;
17232				case keyCode.UP:
17233					this._keyEvent( "previous", event );
17234					break;
17235				case keyCode.DOWN:
17236					this._keyEvent( "next", event );
17237					break;
17238				}
17239			},
17240			input: function( event ) {
17241				if ( suppressInput ) {
17242					suppressInput = false;
17243					event.preventDefault();
17244					return;
17245				}
17246				this._searchTimeout( event );
17247			},
17248			focus: function() {
17249				this.selectedItem = null;
17250				this.previous = this._value();
17251			},
17252			blur: function( event ) {
17253				clearTimeout( this.searching );
17254				this.close( event );
17255				this._change( event );
17256			}
17257		} );
17258
17259		this._initSource();
17260		this.menu = $( "<ul>" )
17261			.appendTo( this._appendTo() )
17262			.menu( {
17263
17264				// disable ARIA support, the live region takes care of that
17265				role: null
17266			} )
17267			.hide()
17268
17269			// Support: IE 11 only, Edge <= 14
17270			// For other browsers, we preventDefault() on the mousedown event
17271			// to keep the dropdown from taking focus from the input. This doesn't
17272			// work for IE/Edge, causing problems with selection and scrolling (#9638)
17273			// Happily, IE and Edge support an "unselectable" attribute that
17274			// prevents an element from receiving focus, exactly what we want here.
17275			.attr( {
17276				"unselectable": "on"
17277			} )
17278			.menu( "instance" );
17279
17280		this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
17281		this._on( this.menu.element, {
17282			mousedown: function( event ) {
17283
17284				// Prevent moving focus out of the text field
17285				event.preventDefault();
17286			},
17287			menufocus: function( event, ui ) {
17288				var label, item;
17289
17290				// support: Firefox
17291				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
17292				if ( this.isNewMenu ) {
17293					this.isNewMenu = false;
17294					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
17295						this.menu.blur();
17296
17297						this.document.one( "mousemove", function() {
17298							$( event.target ).trigger( event.originalEvent );
17299						} );
17300
17301						return;
17302					}
17303				}
17304
17305				item = ui.item.data( "ui-autocomplete-item" );
17306				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
17307
17308					// use value to match what will end up in the input, if it was a key event
17309					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
17310						this._value( item.value );
17311					}
17312				}
17313
17314				// Announce the value in the liveRegion
17315				label = ui.item.attr( "aria-label" ) || item.value;
17316				if ( label && String.prototype.trim.call( label ).length ) {
17317					clearTimeout( this.liveRegionTimer );
17318					this.liveRegionTimer = this._delay( function() {
17319						this.liveRegion.html( $( "<div>" ).text( label ) );
17320					}, 100 );
17321				}
17322			},
17323			menuselect: function( event, ui ) {
17324				var item = ui.item.data( "ui-autocomplete-item" ),
17325					previous = this.previous;
17326
17327				// Only trigger when focus was lost (click on menu)
17328				if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
17329					this.element.trigger( "focus" );
17330					this.previous = previous;
17331
17332					// #6109 - IE triggers two focus events and the second
17333					// is asynchronous, so we need to reset the previous
17334					// term synchronously and asynchronously :-(
17335					this._delay( function() {
17336						this.previous = previous;
17337						this.selectedItem = item;
17338					} );
17339				}
17340
17341				if ( false !== this._trigger( "select", event, { item: item } ) ) {
17342					this._value( item.value );
17343				}
17344
17345				// reset the term after the select event
17346				// this allows custom select handling to work properly
17347				this.term = this._value();
17348
17349				this.close( event );
17350				this.selectedItem = item;
17351			}
17352		} );
17353
17354		this.liveRegion = $( "<div>", {
17355			role: "status",
17356			"aria-live": "assertive",
17357			"aria-relevant": "additions"
17358		} )
17359			.appendTo( this.document[ 0 ].body );
17360
17361		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
17362
17363		// Turning off autocomplete prevents the browser from remembering the
17364		// value when navigating through history, so we re-enable autocomplete
17365		// if the page is unloaded before the widget is destroyed. #7790
17366		this._on( this.window, {
17367			beforeunload: function() {
17368				this.element.removeAttr( "autocomplete" );
17369			}
17370		} );
17371	},
17372
17373	_destroy: function() {
17374		clearTimeout( this.searching );
17375		this.element.removeAttr( "autocomplete" );
17376		this.menu.element.remove();
17377		this.liveRegion.remove();
17378	},
17379
17380	_setOption: function( key, value ) {
17381		this._super( key, value );
17382		if ( key === "source" ) {
17383			this._initSource();
17384		}
17385		if ( key === "appendTo" ) {
17386			this.menu.element.appendTo( this._appendTo() );
17387		}
17388		if ( key === "disabled" && value && this.xhr ) {
17389			this.xhr.abort();
17390		}
17391	},
17392
17393	_isEventTargetInWidget: function( event ) {
17394		var menuElement = this.menu.element[ 0 ];
17395
17396		return event.target === this.element[ 0 ] ||
17397			event.target === menuElement ||
17398			$.contains( menuElement, event.target );
17399	},
17400
17401	_closeOnClickOutside: function( event ) {
17402		if ( !this._isEventTargetInWidget( event ) ) {
17403			this.close();
17404		}
17405	},
17406
17407	_appendTo: function() {
17408		var element = this.options.appendTo;
17409
17410		if ( element ) {
17411			element = element.jquery || element.nodeType ?
17412				$( element ) :
17413				this.document.find( element ).eq( 0 );
17414		}
17415
17416		if ( !element || !element[ 0 ] ) {
17417			element = this.element.closest( ".ui-front, dialog" );
17418		}
17419
17420		if ( !element.length ) {
17421			element = this.document[ 0 ].body;
17422		}
17423
17424		return element;
17425	},
17426
17427	_initSource: function() {
17428		var array, url,
17429			that = this;
17430		if ( Array.isArray( this.options.source ) ) {
17431			array = this.options.source;
17432			this.source = function( request, response ) {
17433				response( $.ui.autocomplete.filter( array, request.term ) );
17434			};
17435		} else if ( typeof this.options.source === "string" ) {
17436			url = this.options.source;
17437			this.source = function( request, response ) {
17438				if ( that.xhr ) {
17439					that.xhr.abort();
17440				}
17441				that.xhr = $.ajax( {
17442					url: url,
17443					data: request,
17444					dataType: "json",
17445					success: function( data ) {
17446						response( data );
17447					},
17448					error: function() {
17449						response( [] );
17450					}
17451				} );
17452			};
17453		} else {
17454			this.source = this.options.source;
17455		}
17456	},
17457
17458	_searchTimeout: function( event ) {
17459		clearTimeout( this.searching );
17460		this.searching = this._delay( function() {
17461
17462			// Search if the value has changed, or if the user retypes the same value (see #7434)
17463			var equalValues = this.term === this._value(),
17464				menuVisible = this.menu.element.is( ":visible" ),
17465				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
17466
17467			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
17468				this.selectedItem = null;
17469				this.search( null, event );
17470			}
17471		}, this.options.delay );
17472	},
17473
17474	search: function( value, event ) {
17475		value = value != null ? value : this._value();
17476
17477		// Always save the actual value, not the one passed as an argument
17478		this.term = this._value();
17479
17480		if ( value.length < this.options.minLength ) {
17481			return this.close( event );
17482		}
17483
17484		if ( this._trigger( "search", event ) === false ) {
17485			return;
17486		}
17487
17488		return this._search( value );
17489	},
17490
17491	_search: function( value ) {
17492		this.pending++;
17493		this._addClass( "ui-autocomplete-loading" );
17494		this.cancelSearch = false;
17495
17496		this.source( { term: value }, this._response() );
17497	},
17498
17499	_response: function() {
17500		var index = ++this.requestIndex;
17501
17502		return function( content ) {
17503			if ( index === this.requestIndex ) {
17504				this.__response( content );
17505			}
17506
17507			this.pending--;
17508			if ( !this.pending ) {
17509				this._removeClass( "ui-autocomplete-loading" );
17510			}
17511		}.bind( this );
17512	},
17513
17514	__response: function( content ) {
17515		if ( content ) {
17516			content = this._normalize( content );
17517		}
17518		this._trigger( "response", null, { content: content } );
17519		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
17520			this._suggest( content );
17521			this._trigger( "open" );
17522		} else {
17523
17524			// use ._close() instead of .close() so we don't cancel future searches
17525			this._close();
17526		}
17527	},
17528
17529	close: function( event ) {
17530		this.cancelSearch = true;
17531		this._close( event );
17532	},
17533
17534	_close: function( event ) {
17535
17536		// Remove the handler that closes the menu on outside clicks
17537		this._off( this.document, "mousedown" );
17538
17539		if ( this.menu.element.is( ":visible" ) ) {
17540			this.menu.element.hide();
17541			this.menu.blur();
17542			this.isNewMenu = true;
17543			this._trigger( "close", event );
17544		}
17545	},
17546
17547	_change: function( event ) {
17548		if ( this.previous !== this._value() ) {
17549			this._trigger( "change", event, { item: this.selectedItem } );
17550		}
17551	},
17552
17553	_normalize: function( items ) {
17554
17555		// assume all items have the right format when the first item is complete
17556		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
17557			return items;
17558		}
17559		return $.map( items, function( item ) {
17560			if ( typeof item === "string" ) {
17561				return {
17562					label: item,
17563					value: item
17564				};
17565			}
17566			return $.extend( {}, item, {
17567				label: item.label || item.value,
17568				value: item.value || item.label
17569			} );
17570		} );
17571	},
17572
17573	_suggest: function( items ) {
17574		var ul = this.menu.element.empty();
17575		this._renderMenu( ul, items );
17576		this.isNewMenu = true;
17577		this.menu.refresh();
17578
17579		// Size and position menu
17580		ul.show();
17581		this._resizeMenu();
17582		ul.position( $.extend( {
17583			of: this.element
17584		}, this.options.position ) );
17585
17586		if ( this.options.autoFocus ) {
17587			this.menu.next();
17588		}
17589
17590		// Listen for interactions outside of the widget (#6642)
17591		this._on( this.document, {
17592			mousedown: "_closeOnClickOutside"
17593		} );
17594	},
17595
17596	_resizeMenu: function() {
17597		var ul = this.menu.element;
17598		ul.outerWidth( Math.max(
17599
17600			// Firefox wraps long text (possibly a rounding bug)
17601			// so we add 1px to avoid the wrapping (#7513)
17602			ul.width( "" ).outerWidth() + 1,
17603			this.element.outerWidth()
17604		) );
17605	},
17606
17607	_renderMenu: function( ul, items ) {
17608		var that = this;
17609		$.each( items, function( index, item ) {
17610			that._renderItemData( ul, item );
17611		} );
17612	},
17613
17614	_renderItemData: function( ul, item ) {
17615		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
17616	},
17617
17618	_renderItem: function( ul, item ) {
17619		return $( "<li>" )
17620			.append( $( "<div>" ).text( item.label ) )
17621			.appendTo( ul );
17622	},
17623
17624	_move: function( direction, event ) {
17625		if ( !this.menu.element.is( ":visible" ) ) {
17626			this.search( null, event );
17627			return;
17628		}
17629		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
17630				this.menu.isLastItem() && /^next/.test( direction ) ) {
17631
17632			if ( !this.isMultiLine ) {
17633				this._value( this.term );
17634			}
17635
17636			this.menu.blur();
17637			return;
17638		}
17639		this.menu[ direction ]( event );
17640	},
17641
17642	widget: function() {
17643		return this.menu.element;
17644	},
17645
17646	_value: function() {
17647		return this.valueMethod.apply( this.element, arguments );
17648	},
17649
17650	_keyEvent: function( keyEvent, event ) {
17651		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
17652			this._move( keyEvent, event );
17653
17654			// Prevents moving cursor to beginning/end of the text field in some browsers
17655			event.preventDefault();
17656		}
17657	},
17658
17659	// Support: Chrome <=50
17660	// We should be able to just use this.element.prop( "isContentEditable" )
17661	// but hidden elements always report false in Chrome.
17662	// https://code.google.com/p/chromium/issues/detail?id=313082
17663	_isContentEditable: function( element ) {
17664		if ( !element.length ) {
17665			return false;
17666		}
17667
17668		var editable = element.prop( "contentEditable" );
17669
17670		if ( editable === "inherit" ) {
17671			return this._isContentEditable( element.parent() );
17672		}
17673
17674		return editable === "true";
17675	}
17676} );
17677
17678$.extend( $.ui.autocomplete, {
17679	escapeRegex: function( value ) {
17680		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
17681	},
17682	filter: function( array, term ) {
17683		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
17684		return $.grep( array, function( value ) {
17685			return matcher.test( value.label || value.value || value );
17686		} );
17687	}
17688} );
17689
17690// Live region extension, adding a `messages` option
17691// NOTE: This is an experimental API. We are still investigating
17692// a full solution for string manipulation and internationalization.
17693$.widget( "ui.autocomplete", $.ui.autocomplete, {
17694	options: {
17695		messages: {
17696			noResults: "No search results.",
17697			results: function( amount ) {
17698				return amount + ( amount > 1 ? " results are" : " result is" ) +
17699					" available, use up and down arrow keys to navigate.";
17700			}
17701		}
17702	},
17703
17704	__response: function( content ) {
17705		var message;
17706		this._superApply( arguments );
17707		if ( this.options.disabled || this.cancelSearch ) {
17708			return;
17709		}
17710		if ( content && content.length ) {
17711			message = this.options.messages.results( content.length );
17712		} else {
17713			message = this.options.messages.noResults;
17714		}
17715		clearTimeout( this.liveRegionTimer );
17716		this.liveRegionTimer = this._delay( function() {
17717			this.liveRegion.html( $( "<div>" ).text( message ) );
17718		}, 100 );
17719	}
17720} );
17721
17722var widgetsAutocomplete = $.ui.autocomplete;
17723
17724
17725/*!
17726 * jQuery UI Controlgroup 1.13.
177262
17727 * http://jqueryui.com
17728 *
17729 * Copyright jQuery Foundation and other contributors
17730 * Released under the MIT license.
17731 * http://jquery.org/license
17732 */
17733
17734//>>label: Controlgroup
17735//>>group: Widgets
17736//>>description: Visually groups form control widgets
17737//>>docs: http://api.jqueryui.com/controlgroup/
17738//>>demos: http://jqueryui.com/controlgroup/
17739//>>css.structure: ../../themes/base/core.css
17740//>>css.structure: ../../themes/base/controlgroup.css
17741//>>css.theme: ../../themes/base/theme.css
17742
17743
17744var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
17745
17746var widgetsControlgroup = $.widget( "ui.controlgroup", {
17747	version: "1.13
vendor: 7,736 bytes, lines 17747-18011
17747.2",
17748	defaultElement: "<div>",
17749	options: {
17750		direction: "horizontal",
17751		disabled: null,
17752		onlyVisible: true,
17753		items: {
17754			"button": "input[type=button], input[type=submit], input[type=reset], button, a",
17755			"controlgroupLabel": ".ui-controlgroup-label",
17756			"checkboxradio": "input[type='checkbox'], input[type='radio']",
17757			"selectmenu": "select",
17758			"spinner": ".ui-spinner-input"
17759		}
17760	},
17761
17762	_create: function() {
17763		this._enhance();
17764	},
17765
17766	// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
17767	_enhance: function() {
17768		this.element.attr( "role", "toolbar" );
17769		this.refresh();
17770	},
17771
17772	_destroy: function() {
17773		this._callChildMethod( "destroy" );
17774		this.childWidgets.removeData( "ui-controlgroup-data" );
17775		this.element.removeAttr( "role" );
17776		if ( this.options.items.controlgroupLabel ) {
17777			this.element
17778				.find( this.options.items.controlgroupLabel )
17779				.find( ".ui-controlgroup-label-contents" )
17780				.contents().unwrap();
17781		}
17782	},
17783
17784	_initWidgets: function() {
17785		var that = this,
17786			childWidgets = [];
17787
17788		// First we iterate over each of the items options
17789		$.each( this.options.items, function( widget, selector ) {
17790			var labels;
17791			var options = {};
17792
17793			// Make sure the widget has a selector set
17794			if ( !selector ) {
17795				return;
17796			}
17797
17798			if ( widget === "controlgroupLabel" ) {
17799				labels = that.element.find( selector );
17800				labels.each( function() {
17801					var element = $( this );
17802
17803					if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
17804						return;
17805					}
17806					element.contents()
17807						.wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
17808				} );
17809				that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
17810				childWidgets = childWidgets.concat( labels.get() );
17811				return;
17812			}
17813
17814			// Make sure the widget actually exists
17815			if ( !$.fn[ widget ] ) {
17816				return;
17817			}
17818
17819			// We assume everything is in the middle to start because we can't determine
17820			// first / last elements until all enhancments are done.
17821			if ( that[ "_" + widget + "Options" ] ) {
17822				options = that[ "_" + widget + "Options" ]( "middle" );
17823			} else {
17824				options = { classes: {} };
17825			}
17826
17827			// Find instances of this widget inside controlgroup and init them
17828			that.element
17829				.find( selector )
17830				.each( function() {
17831					var element = $( this );
17832					var instance = element[ widget ]( "instance" );
17833
17834					// We need to clone the default options for this type of widget to avoid
17835					// polluting the variable options which has a wider scope than a single widget.
17836					var instanceOptions = $.widget.extend( {}, options );
17837
17838					// If the button is the child of a spinner ignore it
17839					// TODO: Find a more generic solution
17840					if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
17841						return;
17842					}
17843
17844					// Create the widget if it doesn't exist
17845					if ( !instance ) {
17846						instance = element[ widget ]()[ widget ]( "instance" );
17847					}
17848					if ( instance ) {
17849						instanceOptions.classes =
17850							that._resolveClassesValues( instanceOptions.classes, instance );
17851					}
17852					element[ widget ]( instanceOptions );
17853
17854					// Store an instance of the controlgroup to be able to reference
17855					// from the outermost element for changing options and refresh
17856					var widgetElement = element[ widget ]( "widget" );
17857					$.data( widgetElement[ 0 ], "ui-controlgroup-data",
17858						instance ? instance : element[ widget ]( "instance" ) );
17859
17860					childWidgets.push( widgetElement[ 0 ] );
17861				} );
17862		} );
17863
17864		this.childWidgets = $( $.uniqueSort( childWidgets ) );
17865		this._addClass( this.childWidgets, "ui-controlgroup-item" );
17866	},
17867
17868	_callChildMethod: function( method ) {
17869		this.childWidgets.each( function() {
17870			var element = $( this ),
17871				data = element.data( "ui-controlgroup-data" );
17872			if ( data && data[ method ] ) {
17873				data[ method ]();
17874			}
17875		} );
17876	},
17877
17878	_updateCornerClass: function( element, position ) {
17879		var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
17880		var add = this._buildSimpleOptions( position, "label" ).classes.label;
17881
17882		this._removeClass( element, null, remove );
17883		this._addClass( element, null, add );
17884	},
17885
17886	_buildSimpleOptions: function( position, key ) {
17887		var direction = this.options.direction === "vertical";
17888		var result = {
17889			classes: {}
17890		};
17891		result.classes[ key ] = {
17892			"middle": "",
17893			"first": "ui-corner-" + ( direction ? "top" : "left" ),
17894			"last": "ui-corner-" + ( direction ? "bottom" : "right" ),
17895			"only": "ui-corner-all"
17896		}[ position ];
17897
17898		return result;
17899	},
17900
17901	_spinnerOptions: function( position ) {
17902		var options = this._buildSimpleOptions( position, "ui-spinner" );
17903
17904		options.classes[ "ui-spinner-up" ] = "";
17905		options.classes[ "ui-spinner-down" ] = "";
17906
17907		return options;
17908	},
17909
17910	_buttonOptions: function( position ) {
17911		return this._buildSimpleOptions( position, "ui-button" );
17912	},
17913
17914	_checkboxradioOptions: function( position ) {
17915		return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
17916	},
17917
17918	_selectmenuOptions: function( position ) {
17919		var direction = this.options.direction === "vertical";
17920		return {
17921			width: direction ? "auto" : false,
17922			classes: {
17923				middle: {
17924					"ui-selectmenu-button-open": "",
17925					"ui-selectmenu-button-closed": ""
17926				},
17927				first: {
17928					"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
17929					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
17930				},
17931				last: {
17932					"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
17933					"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
17934				},
17935				only: {
17936					"ui-selectmenu-button-open": "ui-corner-top",
17937					"ui-selectmenu-button-closed": "ui-corner-all"
17938				}
17939
17940			}[ position ]
17941		};
17942	},
17943
17944	_resolveClassesValues: function( classes, instance ) {
17945		var result = {};
17946		$.each( classes, function( key ) {
17947			var current = instance.options.classes[ key ] || "";
17948			current = String.prototype.trim.call( current.replace( controlgroupCornerRegex, "" ) );
17949			result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
17950		} );
17951		return result;
17952	},
17953
17954	_setOption: function( key, value ) {
17955		if ( key === "direction" ) {
17956			this._removeClass( "ui-controlgroup-" + this.options.direction );
17957		}
17958
17959		this._super( key, value );
17960		if ( key === "disabled" ) {
17961			this._callChildMethod( value ? "disable" : "enable" );
17962			return;
17963		}
17964
17965		this.refresh();
17966	},
17967
17968	refresh: function() {
17969		var children,
17970			that = this;
17971
17972		this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
17973
17974		if ( this.options.direction === "horizontal" ) {
17975			this._addClass( null, "ui-helper-clearfix" );
17976		}
17977		this._initWidgets();
17978
17979		children = this.childWidgets;
17980
17981		// We filter here because we need to track all childWidgets not just the visible ones
17982		if ( this.options.onlyVisible ) {
17983			children = children.filter( ":visible" );
17984		}
17985
17986		if ( children.length ) {
17987
17988			// We do this last because we need to make sure all enhancment is done
17989			// before determining first and last
17990			$.each( [ "first", "last" ], function( index, value ) {
17991				var instance = children[ value ]().data( "ui-controlgroup-data" );
17992
17993				if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
17994					var options = that[ "_" + instance.widgetName + "Options" ](
17995						children.length === 1 ? "only" : value
17996					);
17997					options.classes = that._resolveClassesValues( options.classes, instance );
17998					instance.element[ instance.widgetName ]( options );
17999				} else {
18000					that._updateCornerClass( children[ value ](), value );
18001				}
18002			} );
18003
18004			// Finally call the refresh method on each of the child widgets.
18005			this._callChildMethod( "refresh" );
18006		}
18007	}
18008} );
18009
18010/*!
18011 * jQuery UI Checkboxradio 1.1
vendor: 5,069 bytes, lines 18011-18194
180113.2
18012 * http://jqueryui.com
18013 *
18014 * Copyright jQuery Foundation and other contributors
18015 * Released under the MIT license.
18016 * http://jquery.org/license
18017 */
18018
18019//>>label: Checkboxradio
18020//>>group: Widgets
18021//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
18022//>>docs: http://api.jqueryui.com/checkboxradio/
18023//>>demos: http://jqueryui.com/checkboxradio/
18024//>>css.structure: ../../themes/base/core.css
18025//>>css.structure: ../../themes/base/button.css
18026//>>css.structure: ../../themes/base/checkboxradio.css
18027//>>css.theme: ../../themes/base/theme.css
18028
18029
18030$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
18031	version: "1.13.2",
18032	options: {
18033		disabled: null,
18034		label: null,
18035		icon: true,
18036		classes: {
18037			"ui-checkboxradio-label": "ui-corner-all",
18038			"ui-checkboxradio-icon": "ui-corner-all"
18039		}
18040	},
18041
18042	_getCreateOptions: function() {
18043		var disabled, labels, labelContents;
18044		var options = this._super() || {};
18045
18046		// We read the type here, because it makes more sense to throw a element type error first,
18047		// rather then the error for lack of a label. Often if its the wrong type, it
18048		// won't have a label (e.g. calling on a div, btn, etc)
18049		this._readType();
18050
18051		labels = this.element.labels();
18052
18053		// If there are multiple labels, use the last one
18054		this.label = $( labels[ labels.length - 1 ] );
18055		if ( !this.label.length ) {
18056			$.error( "No label found for checkboxradio widget" );
18057		}
18058
18059		this.originalLabel = "";
18060
18061		// We need to get the label text but this may also need to make sure it does not contain the
18062		// input itself.
18063		// The label contents could be text, html, or a mix. We wrap all elements
18064		// and read the wrapper's `innerHTML` to get a string representation of
18065		// the label, without the input as part of it.
18066		labelContents = this.label.contents().not( this.element[ 0 ] );
18067
18068		if ( labelContents.length ) {
18069			this.originalLabel += labelContents
18070				.clone()
18071				.wrapAll( "<div></div>" )
18072				.parent()
18073				.html();
18074		}
18075
18076		// Set the label option if we found label text
18077		if ( this.originalLabel ) {
18078			options.label = this.originalLabel;
18079		}
18080
18081		disabled = this.element[ 0 ].disabled;
18082		if ( disabled != null ) {
18083			options.disabled = disabled;
18084		}
18085		return options;
18086	},
18087
18088	_create: function() {
18089		var checked = this.element[ 0 ].checked;
18090
18091		this._bindFormResetHandler();
18092
18093		if ( this.options.disabled == null ) {
18094			this.options.disabled = this.element[ 0 ].disabled;
18095		}
18096
18097		this._setOption( "disabled", this.options.disabled );
18098		this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
18099		this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
18100
18101		if ( this.type === "radio" ) {
18102			this._addClass( this.label, "ui-checkboxradio-radio-label" );
18103		}
18104
18105		if ( this.options.label && this.options.label !== this.originalLabel ) {
18106			this._updateLabel();
18107		} else if ( this.originalLabel ) {
18108			this.options.label = this.originalLabel;
18109		}
18110
18111		this._enhance();
18112
18113		if ( checked ) {
18114			this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
18115		}
18116
18117		this._on( {
18118			change: "_toggleClasses",
18119			focus: function() {
18120				this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
18121			},
18122			blur: function() {
18123				this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
18124			}
18125		} );
18126	},
18127
18128	_readType: function() {
18129		var nodeName = this.element[ 0 ].nodeName.toLowerCase();
18130		this.type = this.element[ 0 ].type;
18131		if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
18132			$.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
18133				" and element.type=" + this.type );
18134		}
18135	},
18136
18137	// Support jQuery Mobile enhanced option
18138	_enhance: function() {
18139		this._updateIcon( this.element[ 0 ].checked );
18140	},
18141
18142	widget: function() {
18143		return this.label;
18144	},
18145
18146	_getRadioGroup: function() {
18147		var group;
18148		var name = this.element[ 0 ].name;
18149		var nameSelector = "input[name='" + $.escapeSelector( name ) + "']";
18150
18151		if ( !name ) {
18152			return $( [] );
18153		}
18154
18155		if ( this.form.length ) {
18156			group = $( this.form[ 0 ].elements ).filter( nameSelector );
18157		} else {
18158
18159			// Not inside a form, check all inputs that also are not inside a form
18160			group = $( nameSelector ).filter( function() {
18161				return $( this )._form().length === 0;
18162			} );
18163		}
18164
18165		return group.not( this.element );
18166	},
18167
18168	_toggleClasses: function() {
18169		var checked = this.element[ 0 ].checked;
18170		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
18171
18172		if ( this.options.icon && this.type === "checkbox" ) {
18173			this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
18174				._toggleClass( this.icon, null, "ui-icon-blank", !checked );
18175		}
18176
18177		if ( this.type === "radio" ) {
18178			this._getRadioGroup()
18179				.each( function() {
18180					var instance = $( this ).checkboxradio( "instance" );
18181
18182					if ( instance ) {
18183						instance._removeClass( instance.label,
18184							"ui-checkboxradio-checked", "ui-state-active" );
18185					}
18186				} );
18187		}
18188	},
18189
18190	_destroy: function() {
18191		this._unbindFormResetHandler();
18192
18193		if ( this.icon ) {
18194			this.icon.remove();
vendor: 2,708 bytes, lines 18195-18301
18195			this.iconSpace.remove();
18196		}
18197	},
18198
18199	_setOption: function( key, value ) {
18200
18201		// We don't allow the value to be set to nothing
18202		if ( key === "label" && !value ) {
18203			return;
18204		}
18205
18206		this._super( key, value );
18207
18208		if ( key === "disabled" ) {
18209			this._toggleClass( this.label, null, "ui-state-disabled", value );
18210			this.element[ 0 ].disabled = value;
18211
18212			// Don't refresh when setting disabled
18213			return;
18214		}
18215		this.refresh();
18216	},
18217
18218	_updateIcon: function( checked ) {
18219		var toAdd = "ui-icon ui-icon-background ";
18220
18221		if ( this.options.icon ) {
18222			if ( !this.icon ) {
18223				this.icon = $( "<span>" );
18224				this.iconSpace = $( "<span> </span>" );
18225				this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
18226			}
18227
18228			if ( this.type === "checkbox" ) {
18229				toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
18230				this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
18231			} else {
18232				toAdd += "ui-icon-blank";
18233			}
18234			this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
18235			if ( !checked ) {
18236				this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
18237			}
18238			this.icon.prependTo( this.label ).after( this.iconSpace );
18239		} else if ( this.icon !== undefined ) {
18240			this.icon.remove();
18241			this.iconSpace.remove();
18242			delete this.icon;
18243		}
18244	},
18245
18246	_updateLabel: function() {
18247
18248		// Remove the contents of the label ( minus the icon, icon space, and input )
18249		var contents = this.label.contents().not( this.element[ 0 ] );
18250		if ( this.icon ) {
18251			contents = contents.not( this.icon[ 0 ] );
18252		}
18253		if ( this.iconSpace ) {
18254			contents = contents.not( this.iconSpace[ 0 ] );
18255		}
18256		contents.remove();
18257
18258		this.label.append( this.options.label );
18259	},
18260
18261	refresh: function() {
18262		var checked = this.element[ 0 ].checked,
18263			isDisabled = this.element[ 0 ].disabled;
18264
18265		this._updateIcon( checked );
18266		this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
18267		if ( this.options.label !== null ) {
18268			this._updateLabel();
18269		}
18270
18271		if ( isDisabled !== this.options.disabled ) {
18272			this._setOptions( { "disabled": isDisabled } );
18273		}
18274	}
18275
18276} ] );
18277
18278var widgetsCheckboxradio = $.ui.checkboxradio;
18279
18280
18281/*!
18282 * jQuery UI Button 1.13.2
18283 * http://jqueryui.com
18284 *
18285 * Copyright jQuery Foundation and other contributors
18286 * Released under the MIT license.
18287 * http://jquery.org/license
18288 */
18289
18290//>>label: Button
18291//>>group: Widgets
18292//>>description: Enhances a form with themeable buttons.
18293//>>docs: http://api.jqueryui.com/button/
18294//>>demos: http://jqueryui.com/button/
18295//>>css.structure: ../../themes/base/core.css
18296//>>css.structure: ../../themes/base/button.css
18297//>>css.theme: ../../themes/base/theme.css
18298
18299
18300$.widget( "ui.button", {
18301	version: "1.13.2
vendor: 10,836 bytes, lines 18301-18708
18301",
18302	defaultElement: "<button>",
18303	options: {
18304		classes: {
18305			"ui-button": "ui-corner-all"
18306		},
18307		disabled: null,
18308		icon: null,
18309		iconPosition: "beginning",
18310		label: null,
18311		showLabel: true
18312	},
18313
18314	_getCreateOptions: function() {
18315		var disabled,
18316
18317			// This is to support cases like in jQuery Mobile where the base widget does have
18318			// an implementation of _getCreateOptions
18319			options = this._super() || {};
18320
18321		this.isInput = this.element.is( "input" );
18322
18323		disabled = this.element[ 0 ].disabled;
18324		if ( disabled != null ) {
18325			options.disabled = disabled;
18326		}
18327
18328		this.originalLabel = this.isInput ? this.element.val() : this.element.html();
18329		if ( this.originalLabel ) {
18330			options.label = this.originalLabel;
18331		}
18332
18333		return options;
18334	},
18335
18336	_create: function() {
18337		if ( !this.option.showLabel & !this.options.icon ) {
18338			this.options.showLabel = true;
18339		}
18340
18341		// We have to check the option again here even though we did in _getCreateOptions,
18342		// because null may have been passed on init which would override what was set in
18343		// _getCreateOptions
18344		if ( this.options.disabled == null ) {
18345			this.options.disabled = this.element[ 0 ].disabled || false;
18346		}
18347
18348		this.hasTitle = !!this.element.attr( "title" );
18349
18350		// Check to see if the label needs to be set or if its already correct
18351		if ( this.options.label && this.options.label !== this.originalLabel ) {
18352			if ( this.isInput ) {
18353				this.element.val( this.options.label );
18354			} else {
18355				this.element.html( this.options.label );
18356			}
18357		}
18358		this._addClass( "ui-button", "ui-widget" );
18359		this._setOption( "disabled", this.options.disabled );
18360		this._enhance();
18361
18362		if ( this.element.is( "a" ) ) {
18363			this._on( {
18364				"keyup": function( event ) {
18365					if ( event.keyCode === $.ui.keyCode.SPACE ) {
18366						event.preventDefault();
18367
18368						// Support: PhantomJS <= 1.9, IE 8 Only
18369						// If a native click is available use it so we actually cause navigation
18370						// otherwise just trigger a click event
18371						if ( this.element[ 0 ].click ) {
18372							this.element[ 0 ].click();
18373						} else {
18374							this.element.trigger( "click" );
18375						}
18376					}
18377				}
18378			} );
18379		}
18380	},
18381
18382	_enhance: function() {
18383		if ( !this.element.is( "button" ) ) {
18384			this.element.attr( "role", "button" );
18385		}
18386
18387		if ( this.options.icon ) {
18388			this._updateIcon( "icon", this.options.icon );
18389			this._updateTooltip();
18390		}
18391	},
18392
18393	_updateTooltip: function() {
18394		this.title = this.element.attr( "title" );
18395
18396		if ( !this.options.showLabel && !this.title ) {
18397			this.element.attr( "title", this.options.label );
18398		}
18399	},
18400
18401	_updateIcon: function( option, value ) {
18402		var icon = option !== "iconPosition",
18403			position = icon ? this.options.iconPosition : value,
18404			displayBlock = position === "top" || position === "bottom";
18405
18406		// Create icon
18407		if ( !this.icon ) {
18408			this.icon = $( "<span>" );
18409
18410			this._addClass( this.icon, "ui-button-icon", "ui-icon" );
18411
18412			if ( !this.options.showLabel ) {
18413				this._addClass( "ui-button-icon-only" );
18414			}
18415		} else if ( icon ) {
18416
18417			// If we are updating the icon remove the old icon class
18418			this._removeClass( this.icon, null, this.options.icon );
18419		}
18420
18421		// If we are updating the icon add the new icon class
18422		if ( icon ) {
18423			this._addClass( this.icon, null, value );
18424		}
18425
18426		this._attachIcon( position );
18427
18428		// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
18429		// the iconSpace if there is one.
18430		if ( displayBlock ) {
18431			this._addClass( this.icon, null, "ui-widget-icon-block" );
18432			if ( this.iconSpace ) {
18433				this.iconSpace.remove();
18434			}
18435		} else {
18436
18437			// Position is beginning or end so remove the ui-widget-icon-block class and add the
18438			// space if it does not exist
18439			if ( !this.iconSpace ) {
18440				this.iconSpace = $( "<span> </span>" );
18441				this._addClass( this.iconSpace, "ui-button-icon-space" );
18442			}
18443			this._removeClass( this.icon, null, "ui-wiget-icon-block" );
18444			this._attachIconSpace( position );
18445		}
18446	},
18447
18448	_destroy: function() {
18449		this.element.removeAttr( "role" );
18450
18451		if ( this.icon ) {
18452			this.icon.remove();
18453		}
18454		if ( this.iconSpace ) {
18455			this.iconSpace.remove();
18456		}
18457		if ( !this.hasTitle ) {
18458			this.element.removeAttr( "title" );
18459		}
18460	},
18461
18462	_attachIconSpace: function( iconPosition ) {
18463		this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
18464	},
18465
18466	_attachIcon: function( iconPosition ) {
18467		this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
18468	},
18469
18470	_setOptions: function( options ) {
18471		var newShowLabel = options.showLabel === undefined ?
18472				this.options.showLabel :
18473				options.showLabel,
18474			newIcon = options.icon === undefined ? this.options.icon : options.icon;
18475
18476		if ( !newShowLabel && !newIcon ) {
18477			options.showLabel = true;
18478		}
18479		this._super( options );
18480	},
18481
18482	_setOption: function( key, value ) {
18483		if ( key === "icon" ) {
18484			if ( value ) {
18485				this._updateIcon( key, value );
18486			} else if ( this.icon ) {
18487				this.icon.remove();
18488				if ( this.iconSpace ) {
18489					this.iconSpace.remove();
18490				}
18491			}
18492		}
18493
18494		if ( key === "iconPosition" ) {
18495			this._updateIcon( key, value );
18496		}
18497
18498		// Make sure we can't end up with a button that has neither text nor icon
18499		if ( key === "showLabel" ) {
18500				this._toggleClass( "ui-button-icon-only", null, !value );
18501				this._updateTooltip();
18502		}
18503
18504		if ( key === "label" ) {
18505			if ( this.isInput ) {
18506				this.element.val( value );
18507			} else {
18508
18509				// If there is an icon, append it, else nothing then append the value
18510				// this avoids removal of the icon when setting label text
18511				this.element.html( value );
18512				if ( this.icon ) {
18513					this._attachIcon( this.options.iconPosition );
18514					this._attachIconSpace( this.options.iconPosition );
18515				}
18516			}
18517		}
18518
18519		this._super( key, value );
18520
18521		if ( key === "disabled" ) {
18522			this._toggleClass( null, "ui-state-disabled", value );
18523			this.element[ 0 ].disabled = value;
18524			if ( value ) {
18525				this.element.trigger( "blur" );
18526			}
18527		}
18528	},
18529
18530	refresh: function() {
18531
18532		// Make sure to only check disabled if its an element that supports this otherwise
18533		// check for the disabled class to determine state
18534		var isDisabled = this.element.is( "input, button" ) ?
18535			this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
18536
18537		if ( isDisabled !== this.options.disabled ) {
18538			this._setOptions( { disabled: isDisabled } );
18539		}
18540
18541		this._updateTooltip();
18542	}
18543} );
18544
18545// DEPRECATED
18546if ( $.uiBackCompat !== false ) {
18547
18548	// Text and Icons options
18549	$.widget( "ui.button", $.ui.button, {
18550		options: {
18551			text: true,
18552			icons: {
18553				primary: null,
18554				secondary: null
18555			}
18556		},
18557
18558		_create: function() {
18559			if ( this.options.showLabel && !this.options.text ) {
18560				this.options.showLabel = this.options.text;
18561			}
18562			if ( !this.options.showLabel && this.options.text ) {
18563				this.options.text = this.options.showLabel;
18564			}
18565			if ( !this.options.icon && ( this.options.icons.primary ||
18566					this.options.icons.secondary ) ) {
18567				if ( this.options.icons.primary ) {
18568					this.options.icon = this.options.icons.primary;
18569				} else {
18570					this.options.icon = this.options.icons.secondary;
18571					this.options.iconPosition = "end";
18572				}
18573			} else if ( this.options.icon ) {
18574				this.options.icons.primary = this.options.icon;
18575			}
18576			this._super();
18577		},
18578
18579		_setOption: function( key, value ) {
18580			if ( key === "text" ) {
18581				this._super( "showLabel", value );
18582				return;
18583			}
18584			if ( key === "showLabel" ) {
18585				this.options.text = value;
18586			}
18587			if ( key === "icon" ) {
18588				this.options.icons.primary = value;
18589			}
18590			if ( key === "icons" ) {
18591				if ( value.primary ) {
18592					this._super( "icon", value.primary );
18593					this._super( "iconPosition", "beginning" );
18594				} else if ( value.secondary ) {
18595					this._super( "icon", value.secondary );
18596					this._super( "iconPosition", "end" );
18597				}
18598			}
18599			this._superApply( arguments );
18600		}
18601	} );
18602
18603	$.fn.button = ( function( orig ) {
18604		return function( options ) {
18605			var isMethodCall = typeof options === "string";
18606			var args = Array.prototype.slice.call( arguments, 1 );
18607			var returnValue = this;
18608
18609			if ( isMethodCall ) {
18610
18611				// If this is an empty collection, we need to have the instance method
18612				// return undefined instead of the jQuery instance
18613				if ( !this.length && options === "instance" ) {
18614					returnValue = undefined;
18615				} else {
18616					this.each( function() {
18617						var methodValue;
18618						var type = $( this ).attr( "type" );
18619						var name = type !== "checkbox" && type !== "radio" ?
18620							"button" :
18621							"checkboxradio";
18622						var instance = $.data( this, "ui-" + name );
18623
18624						if ( options === "instance" ) {
18625							returnValue = instance;
18626							return false;
18627						}
18628
18629						if ( !instance ) {
18630							return $.error( "cannot call methods on button" +
18631								" prior to initialization; " +
18632								"attempted to call method '" + options + "'" );
18633						}
18634
18635						if ( typeof instance[ options ] !== "function" ||
18636							options.charAt( 0 ) === "_" ) {
18637							return $.error( "no such method '" + options + "' for button" +
18638								" widget instance" );
18639						}
18640
18641						methodValue = instance[ options ].apply( instance, args );
18642
18643						if ( methodValue !== instance && methodValue !== undefined ) {
18644							returnValue = methodValue && methodValue.jquery ?
18645								returnValue.pushStack( methodValue.get() ) :
18646								methodValue;
18647							return false;
18648						}
18649					} );
18650				}
18651			} else {
18652
18653				// Allow multiple hashes to be passed on init
18654				if ( args.length ) {
18655					options = $.widget.extend.apply( null, [ options ].concat( args ) );
18656				}
18657
18658				this.each( function() {
18659					var type = $( this ).attr( "type" );
18660					var name = type !== "checkbox" && type !== "radio" ? "button" : "checkboxradio";
18661					var instance = $.data( this, "ui-" + name );
18662
18663					if ( instance ) {
18664						instance.option( options || {} );
18665						if ( instance._init ) {
18666							instance._init();
18667						}
18668					} else {
18669						if ( name === "button" ) {
18670							orig.call( $( this ), options );
18671							return;
18672						}
18673
18674						$( this ).checkboxradio( $.extend( { icon: false }, options ) );
18675					}
18676				} );
18677			}
18678
18679			return returnValue;
18680		};
18681	} )( $.fn.button );
18682
18683	$.fn.buttonset = function() {
18684		if ( !$.ui.controlgroup ) {
18685			$.error( "Controlgroup widget missing" );
18686		}
18687		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
18688			return this.controlgroup.apply( this,
18689				[ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
18690		}
18691		if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
18692			return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
18693		}
18694		if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
18695			arguments[ 0 ].items = {
18696				button: arguments[ 0 ].items
18697			};
18698		}
18699		return this.controlgroup.apply( this, arguments );
18700	};
18701}
18702
18703var widgetsButton = $.ui.button;
18704
18705
18706/* eslint-disable max-len, camelcase */
18707/*!
18708 * jQuery UI Datepicker 1.13.
187082
18709 * http://jqueryui.com
18710 *
18711 * Copyright jQuery Foundation and other contributors
18712 * Released under the MIT license.
18713 * http://jquery.org/license
18714 */
18715
18716//>>label: Datepicker
18717//>>group: Widgets
18718//>>description: Displays a calendar from an input or inline for selecting dates.
18719//>>docs: http://api.jqueryui.com/datepicker/
18720//>>demos: http://jqueryui.com/datepicker/
18721//>>css.structure: ../../themes/base/core.css
18722//>>css.structure: ../../themes/base/datepicker.css
18723//>>css.theme: ../../themes/base/theme.css
18724
18725
18726$.extend( $.ui, { datepicker: { version: "1.13
vendor: 14,164 bytes, lines 18726-19043
18726.2" } } );
18727
18728var datepicker_instActive;
18729
18730function datepicker_getZindex( elem ) {
18731	var position, value;
18732	while ( elem.length && elem[ 0 ] !== document ) {
18733
18734		// Ignore z-index if position is set to a value where z-index is ignored by the browser
18735		// This makes behavior of this function consistent across browsers
18736		// WebKit always returns auto if the element is positioned
18737		position = elem.css( "position" );
18738		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
18739
18740			// IE returns 0 when zIndex is not specified
18741			// other browsers return a string
18742			// we ignore the case of nested elements with an explicit value of 0
18743			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
18744			value = parseInt( elem.css( "zIndex" ), 10 );
18745			if ( !isNaN( value ) && value !== 0 ) {
18746				return value;
18747			}
18748		}
18749		elem = elem.parent();
18750	}
18751
18752	return 0;
18753}
18754
18755/* Date picker manager.
18756   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
18757   Settings for (groups of) date pickers are maintained in an instance object,
18758   allowing multiple different settings on the same page. */
18759
18760function Datepicker() {
18761	this._curInst = null; // The current instance in use
18762	this._keyEvent = false; // If the last event was a key event
18763	this._disabledInputs = []; // List of date picker inputs that have been disabled
18764	this._datepickerShowing = false; // True if the popup picker is showing , false if not
18765	this._inDialog = false; // True if showing within a "dialog", false if not
18766	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
18767	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
18768	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
18769	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
18770	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
18771	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
18772	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
18773	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
18774	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
18775	this.regional = []; // Available regional settings, indexed by language code
18776	this.regional[ "" ] = { // Default regional settings
18777		closeText: "Done", // Display text for close link
18778		prevText: "Prev", // Display text for previous month link
18779		nextText: "Next", // Display text for next month link
18780		currentText: "Today", // Display text for current month link
18781		monthNames: [ "January", "February", "March", "April", "May", "June",
18782			"July", "August", "September", "October", "November", "December" ], // Names of months for drop-down and formatting
18783		monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
18784		dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
18785		dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
18786		dayNamesMin: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ], // Column headings for days starting at Sunday
18787		weekHeader: "Wk", // Column header for week of the year
18788		dateFormat: "mm/dd/yy", // See format options on parseDate
18789		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
18790		isRTL: false, // True if right-to-left language, false if left-to-right
18791		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
18792		yearSuffix: "", // Additional text to append to the year in the month headers,
18793		selectMonthLabel: "Select month", // Invisible label for month selector
18794		selectYearLabel: "Select year" // Invisible label for year selector
18795	};
18796	this._defaults = { // Global defaults for all the date picker instances
18797		showOn: "focus", // "focus" for popup on focus,
18798			// "button" for trigger button, or "both" for either
18799		showAnim: "fadeIn", // Name of jQuery animation for popup
18800		showOptions: {}, // Options for enhanced animations
18801		defaultDate: null, // Used when field is blank: actual date,
18802			// +/-number for offset from today, null for today
18803		appendText: "", // Display text following the input box, e.g. showing the format
18804		buttonText: "...", // Text for trigger button
18805		buttonImage: "", // URL for trigger button image
18806		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
18807		hideIfNoPrevNext: false, // True to hide next/previous month links
18808			// if not applicable, false to just disable them
18809		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
18810		gotoCurrent: false, // True if today link goes back to current selection instead
18811		changeMonth: false, // True if month can be selected directly, false if only prev/next
18812		changeYear: false, // True if year can be selected directly, false if only prev/next
18813		yearRange: "c-10:c+10", // Range of years to display in drop-down,
18814			// either relative to today's year (-nn:+nn), relative to currently displayed year
18815			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
18816		showOtherMonths: false, // True to show dates in other months, false to leave blank
18817		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
18818		showWeek: false, // True to show week of the year, false to not show it
18819		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
18820			// takes a Date and returns the number of the week for it
18821		shortYearCutoff: "+10", // Short year values < this are in the current century,
18822			// > this are in the previous century,
18823			// string value starting with "+" for current year + value
18824		minDate: null, // The earliest selectable date, or null for no limit
18825		maxDate: null, // The latest selectable date, or null for no limit
18826		duration: "fast", // Duration of display/closure
18827		beforeShowDay: null, // Function that takes a date and returns an array with
18828			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
18829			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
18830		beforeShow: null, // Function that takes an input field and
18831			// returns a set of custom settings for the date picker
18832		onSelect: null, // Define a callback function when a date is selected
18833		onChangeMonthYear: null, // Define a callback function when the month or year is changed
18834		onClose: null, // Define a callback function when the datepicker is closed
18835		onUpdateDatepicker: null, // Define a callback function when the datepicker is updated
18836		numberOfMonths: 1, // Number of months to show at a time
18837		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
18838		stepMonths: 1, // Number of months to step back/forward
18839		stepBigMonths: 12, // Number of months to step back/forward for the big links
18840		altField: "", // Selector for an alternate field to store selected dates into
18841		altFormat: "", // The date format to use for the alternate field
18842		constrainInput: true, // The input is constrained by the current date format
18843		showButtonPanel: false, // True to show button panel, false to not show it
18844		autoSize: false, // True to size the input for the date format, false to leave as is
18845		disabled: false // The initial disabled state
18846	};
18847	$.extend( this._defaults, this.regional[ "" ] );
18848	this.regional.en = $.extend( true, {}, this.regional[ "" ] );
18849	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
18850	this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
18851}
18852
18853$.extend( Datepicker.prototype, {
18854
18855	/* Class name added to elements to indicate already configured with a date picker. */
18856	markerClassName: "hasDatepicker",
18857
18858	//Keep track of the maximum number of rows displayed (see #7043)
18859	maxRows: 4,
18860
18861	// TODO rename to "widget" when switching to widget factory
18862	_widgetDatepicker: function() {
18863		return this.dpDiv;
18864	},
18865
18866	/* Override the default settings for all instances of the date picker.
18867	 * @param  settings  object - the new settings to use as defaults (anonymous object)
18868	 * @return the manager object
18869	 */
18870	setDefaults: function( settings ) {
18871		datepicker_extendRemove( this._defaults, settings || {} );
18872		return this;
18873	},
18874
18875	/* Attach the date picker to a jQuery selection.
18876	 * @param  target	element - the target input field or division or span
18877	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
18878	 */
18879	_attachDatepicker: function( target, settings ) {
18880		var nodeName, inline, inst;
18881		nodeName = target.nodeName.toLowerCase();
18882		inline = ( nodeName === "div" || nodeName === "span" );
18883		if ( !target.id ) {
18884			this.uuid += 1;
18885			target.id = "dp" + this.uuid;
18886		}
18887		inst = this._newInst( $( target ), inline );
18888		inst.settings = $.extend( {}, settings || {} );
18889		if ( nodeName === "input" ) {
18890			this._connectDatepicker( target, inst );
18891		} else if ( inline ) {
18892			this._inlineDatepicker( target, inst );
18893		}
18894	},
18895
18896	/* Create a new instance object. */
18897	_newInst: function( target, inline ) {
18898		var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
18899		return { id: id, input: target, // associated target
18900			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
18901			drawMonth: 0, drawYear: 0, // month being drawn
18902			inline: inline, // is datepicker inline or not
18903			dpDiv: ( !inline ? this.dpDiv : // presentation div
18904			datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
18905	},
18906
18907	/* Attach the date picker to an input field. */
18908	_connectDatepicker: function( target, inst ) {
18909		var input = $( target );
18910		inst.append = $( [] );
18911		inst.trigger = $( [] );
18912		if ( input.hasClass( this.markerClassName ) ) {
18913			return;
18914		}
18915		this._attachments( input, inst );
18916		input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
18917			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
18918		this._autoSize( inst );
18919		$.data( target, "datepicker", inst );
18920
18921		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
18922		if ( inst.settings.disabled ) {
18923			this._disableDatepicker( target );
18924		}
18925	},
18926
18927	/* Make attachments based on settings. */
18928	_attachments: function( input, inst ) {
18929		var showOn, buttonText, buttonImage,
18930			appendText = this._get( inst, "appendText" ),
18931			isRTL = this._get( inst, "isRTL" );
18932
18933		if ( inst.append ) {
18934			inst.append.remove();
18935		}
18936		if ( appendText ) {
18937			inst.append = $( "<span>" )
18938				.addClass( this._appendClass )
18939				.text( appendText );
18940			input[ isRTL ? "before" : "after" ]( inst.append );
18941		}
18942
18943		input.off( "focus", this._showDatepicker );
18944
18945		if ( inst.trigger ) {
18946			inst.trigger.remove();
18947		}
18948
18949		showOn = this._get( inst, "showOn" );
18950		if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
18951			input.on( "focus", this._showDatepicker );
18952		}
18953		if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
18954			buttonText = this._get( inst, "buttonText" );
18955			buttonImage = this._get( inst, "buttonImage" );
18956
18957			if ( this._get( inst, "buttonImageOnly" ) ) {
18958				inst.trigger = $( "<img>" )
18959					.addClass( this._triggerClass )
18960					.attr( {
18961						src: buttonImage,
18962						alt: buttonText,
18963						title: buttonText
18964					} );
18965			} else {
18966				inst.trigger = $( "<button type='button'>" )
18967					.addClass( this._triggerClass );
18968				if ( buttonImage ) {
18969					inst.trigger.html(
18970						$( "<img>" )
18971							.attr( {
18972								src: buttonImage,
18973								alt: buttonText,
18974								title: buttonText
18975							} )
18976					);
18977				} else {
18978					inst.trigger.text( buttonText );
18979				}
18980			}
18981
18982			input[ isRTL ? "before" : "after" ]( inst.trigger );
18983			inst.trigger.on( "click", function() {
18984				if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
18985					$.datepicker._hideDatepicker();
18986				} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
18987					$.datepicker._hideDatepicker();
18988					$.datepicker._showDatepicker( input[ 0 ] );
18989				} else {
18990					$.datepicker._showDatepicker( input[ 0 ] );
18991				}
18992				return false;
18993			} );
18994		}
18995	},
18996
18997	/* Apply the maximum length for the date format. */
18998	_autoSize: function( inst ) {
18999		if ( this._get( inst, "autoSize" ) && !inst.inline ) {
19000			var findMax, max, maxI, i,
19001				date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
19002				dateFormat = this._get( inst, "dateFormat" );
19003
19004			if ( dateFormat.match( /[DM]/ ) ) {
19005				findMax = function( names ) {
19006					max = 0;
19007					maxI = 0;
19008					for ( i = 0; i < names.length; i++ ) {
19009						if ( names[ i ].length > max ) {
19010							max = names[ i ].length;
19011							maxI = i;
19012						}
19013					}
19014					return maxI;
19015				};
19016				date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
19017					"monthNames" : "monthNamesShort" ) ) ) );
19018				date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
19019					"dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
19020			}
19021			inst.input.attr( "size", this._formatDate( inst, date ).length );
19022		}
19023	},
19024
19025	/* Attach an inline date picker to a div. */
19026	_inlineDatepicker: function( target, inst ) {
19027		var divSpan = $( target );
19028		if ( divSpan.hasClass( this.markerClassName ) ) {
19029			return;
19030		}
19031		divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
19032		$.data( target, "datepicker", inst );
19033		this._setDate( inst, this._getDefaultDate( inst ), true );
19034		this._updateDatepicker( inst );
19035		this._updateAlternate( inst );
19036
19037		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
19038		if ( inst.settings.disabled ) {
19039			this._disableDatepicker( target );
19040		}
19041
19042		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
19043		// http
vendor: 14,693 bytes, lines 19043-19465
19043://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
19044		inst.dpDiv.css( "display", "block" );
19045	},
19046
19047	/* Pop-up the date picker in a "dialog" box.
19048	 * @param  input element - ignored
19049	 * @param  date	string or Date - the initial date to display
19050	 * @param  onSelect  function - the function to call when a date is selected
19051	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
19052	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
19053	 *					event - with x/y coordinates or
19054	 *					leave empty for default (screen centre)
19055	 * @return the manager object
19056	 */
19057	_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
19058		var id, browserWidth, browserHeight, scrollX, scrollY,
19059			inst = this._dialogInst; // internal instance
19060
19061		if ( !inst ) {
19062			this.uuid += 1;
19063			id = "dp" + this.uuid;
19064			this._dialogInput = $( "<input type='text' id='" + id +
19065				"' style='position: absolute; top: -100px; width: 0px;'/>" );
19066			this._dialogInput.on( "keydown", this._doKeyDown );
19067			$( "body" ).append( this._dialogInput );
19068			inst = this._dialogInst = this._newInst( this._dialogInput, false );
19069			inst.settings = {};
19070			$.data( this._dialogInput[ 0 ], "datepicker", inst );
19071		}
19072		datepicker_extendRemove( inst.settings, settings || {} );
19073		date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
19074		this._dialogInput.val( date );
19075
19076		this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
19077		if ( !this._pos ) {
19078			browserWidth = document.documentElement.clientWidth;
19079			browserHeight = document.documentElement.clientHeight;
19080			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
19081			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
19082			this._pos = // should use actual width/height below
19083				[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
19084		}
19085
19086		// Move input on screen for focus, but hidden behind dialog
19087		this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
19088		inst.settings.onSelect = onSelect;
19089		this._inDialog = true;
19090		this.dpDiv.addClass( this._dialogClass );
19091		this._showDatepicker( this._dialogInput[ 0 ] );
19092		if ( $.blockUI ) {
19093			$.blockUI( this.dpDiv );
19094		}
19095		$.data( this._dialogInput[ 0 ], "datepicker", inst );
19096		return this;
19097	},
19098
19099	/* Detach a datepicker from its control.
19100	 * @param  target	element - the target input field or division or span
19101	 */
19102	_destroyDatepicker: function( target ) {
19103		var nodeName,
19104			$target = $( target ),
19105			inst = $.data( target, "datepicker" );
19106
19107		if ( !$target.hasClass( this.markerClassName ) ) {
19108			return;
19109		}
19110
19111		nodeName = target.nodeName.toLowerCase();
19112		$.removeData( target, "datepicker" );
19113		if ( nodeName === "input" ) {
19114			inst.append.remove();
19115			inst.trigger.remove();
19116			$target.removeClass( this.markerClassName ).
19117				off( "focus", this._showDatepicker ).
19118				off( "keydown", this._doKeyDown ).
19119				off( "keypress", this._doKeyPress ).
19120				off( "keyup", this._doKeyUp );
19121		} else if ( nodeName === "div" || nodeName === "span" ) {
19122			$target.removeClass( this.markerClassName ).empty();
19123		}
19124
19125		if ( datepicker_instActive === inst ) {
19126			datepicker_instActive = null;
19127			this._curInst = null;
19128		}
19129	},
19130
19131	/* Enable the date picker to a jQuery selection.
19132	 * @param  target	element - the target input field or division or span
19133	 */
19134	_enableDatepicker: function( target ) {
19135		var nodeName, inline,
19136			$target = $( target ),
19137			inst = $.data( target, "datepicker" );
19138
19139		if ( !$target.hasClass( this.markerClassName ) ) {
19140			return;
19141		}
19142
19143		nodeName = target.nodeName.toLowerCase();
19144		if ( nodeName === "input" ) {
19145			target.disabled = false;
19146			inst.trigger.filter( "button" ).
19147				each( function() {
19148					this.disabled = false;
19149				} ).end().
19150				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
19151		} else if ( nodeName === "div" || nodeName === "span" ) {
19152			inline = $target.children( "." + this._inlineClass );
19153			inline.children().removeClass( "ui-state-disabled" );
19154			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
19155				prop( "disabled", false );
19156		}
19157		this._disabledInputs = $.map( this._disabledInputs,
19158
19159			// Delete entry
19160			function( value ) {
19161				return ( value === target ? null : value );
19162			} );
19163	},
19164
19165	/* Disable the date picker to a jQuery selection.
19166	 * @param  target	element - the target input field or division or span
19167	 */
19168	_disableDatepicker: function( target ) {
19169		var nodeName, inline,
19170			$target = $( target ),
19171			inst = $.data( target, "datepicker" );
19172
19173		if ( !$target.hasClass( this.markerClassName ) ) {
19174			return;
19175		}
19176
19177		nodeName = target.nodeName.toLowerCase();
19178		if ( nodeName === "input" ) {
19179			target.disabled = true;
19180			inst.trigger.filter( "button" ).
19181				each( function() {
19182					this.disabled = true;
19183				} ).end().
19184				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
19185		} else if ( nodeName === "div" || nodeName === "span" ) {
19186			inline = $target.children( "." + this._inlineClass );
19187			inline.children().addClass( "ui-state-disabled" );
19188			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
19189				prop( "disabled", true );
19190		}
19191		this._disabledInputs = $.map( this._disabledInputs,
19192
19193			// Delete entry
19194			function( value ) {
19195				return ( value === target ? null : value );
19196			} );
19197		this._disabledInputs[ this._disabledInputs.length ] = target;
19198	},
19199
19200	/* Is the first field in a jQuery collection disabled as a datepicker?
19201	 * @param  target	element - the target input field or division or span
19202	 * @return boolean - true if disabled, false if enabled
19203	 */
19204	_isDisabledDatepicker: function( target ) {
19205		if ( !target ) {
19206			return false;
19207		}
19208		for ( var i = 0; i < this._disabledInputs.length; i++ ) {
19209			if ( this._disabledInputs[ i ] === target ) {
19210				return true;
19211			}
19212		}
19213		return false;
19214	},
19215
19216	/* Retrieve the instance data for the target control.
19217	 * @param  target  element - the target input field or division or span
19218	 * @return  object - the associated instance data
19219	 * @throws  error if a jQuery problem getting data
19220	 */
19221	_getInst: function( target ) {
19222		try {
19223			return $.data( target, "datepicker" );
19224		} catch ( err ) {
19225			throw "Missing instance data for this datepicker";
19226		}
19227	},
19228
19229	/* Update or retrieve the settings for a date picker attached to an input field or division.
19230	 * @param  target  element - the target input field or division or span
19231	 * @param  name	object - the new settings to update or
19232	 *				string - the name of the setting to change or retrieve,
19233	 *				when retrieving also "all" for all instance settings or
19234	 *				"defaults" for all global defaults
19235	 * @param  value   any - the new value for the setting
19236	 *				(omit if above is an object or to retrieve a value)
19237	 */
19238	_optionDatepicker: function( target, name, value ) {
19239		var settings, date, minDate, maxDate,
19240			inst = this._getInst( target );
19241
19242		if ( arguments.length === 2 && typeof name === "string" ) {
19243			return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
19244				( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
19245				this._get( inst, name ) ) : null ) );
19246		}
19247
19248		settings = name || {};
19249		if ( typeof name === "string" ) {
19250			settings = {};
19251			settings[ name ] = value;
19252		}
19253
19254		if ( inst ) {
19255			if ( this._curInst === inst ) {
19256				this._hideDatepicker();
19257			}
19258
19259			date = this._getDateDatepicker( target, true );
19260			minDate = this._getMinMaxDate( inst, "min" );
19261			maxDate = this._getMinMaxDate( inst, "max" );
19262			datepicker_extendRemove( inst.settings, settings );
19263
19264			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
19265			if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
19266				inst.settings.minDate = this._formatDate( inst, minDate );
19267			}
19268			if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
19269				inst.settings.maxDate = this._formatDate( inst, maxDate );
19270			}
19271			if ( "disabled" in settings ) {
19272				if ( settings.disabled ) {
19273					this._disableDatepicker( target );
19274				} else {
19275					this._enableDatepicker( target );
19276				}
19277			}
19278			this._attachments( $( target ), inst );
19279			this._autoSize( inst );
19280			this._setDate( inst, date );
19281			this._updateAlternate( inst );
19282			this._updateDatepicker( inst );
19283		}
19284	},
19285
19286	// Change method deprecated
19287	_changeDatepicker: function( target, name, value ) {
19288		this._optionDatepicker( target, name, value );
19289	},
19290
19291	/* Redraw the date picker attached to an input field or division.
19292	 * @param  target  element - the target input field or division or span
19293	 */
19294	_refreshDatepicker: function( target ) {
19295		var inst = this._getInst( target );
19296		if ( inst ) {
19297			this._updateDatepicker( inst );
19298		}
19299	},
19300
19301	/* Set the dates for a jQuery selection.
19302	 * @param  target element - the target input field or division or span
19303	 * @param  date	Date - the new date
19304	 */
19305	_setDateDatepicker: function( target, date ) {
19306		var inst = this._getInst( target );
19307		if ( inst ) {
19308			this._setDate( inst, date );
19309			this._updateDatepicker( inst );
19310			this._updateAlternate( inst );
19311		}
19312	},
19313
19314	/* Get the date(s) for the first entry in a jQuery selection.
19315	 * @param  target element - the target input field or division or span
19316	 * @param  noDefault boolean - true if no default date is to be used
19317	 * @return Date - the current date
19318	 */
19319	_getDateDatepicker: function( target, noDefault ) {
19320		var inst = this._getInst( target );
19321		if ( inst && !inst.inline ) {
19322			this._setDateFromField( inst, noDefault );
19323		}
19324		return ( inst ? this._getDate( inst ) : null );
19325	},
19326
19327	/* Handle keystrokes. */
19328	_doKeyDown: function( event ) {
19329		var onSelect, dateStr, sel,
19330			inst = $.datepicker._getInst( event.target ),
19331			handled = true,
19332			isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
19333
19334		inst._keyEvent = true;
19335		if ( $.datepicker._datepickerShowing ) {
19336			switch ( event.keyCode ) {
19337				case 9: $.datepicker._hideDatepicker();
19338						handled = false;
19339						break; // hide on tab out
19340				case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
19341									$.datepicker._currentClass + ")", inst.dpDiv );
19342						if ( sel[ 0 ] ) {
19343							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
19344						}
19345
19346						onSelect = $.datepicker._get( inst, "onSelect" );
19347						if ( onSelect ) {
19348							dateStr = $.datepicker._formatDate( inst );
19349
19350							// Trigger custom callback
19351							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
19352						} else {
19353							$.datepicker._hideDatepicker();
19354						}
19355
19356						return false; // don't submit the form
19357				case 27: $.datepicker._hideDatepicker();
19358						break; // hide on escape
19359				case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
19360							-$.datepicker._get( inst, "stepBigMonths" ) :
19361							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
19362						break; // previous month/year on page up/+ ctrl
19363				case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
19364							+$.datepicker._get( inst, "stepBigMonths" ) :
19365							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
19366						break; // next month/year on page down/+ ctrl
19367				case 35: if ( event.ctrlKey || event.metaKey ) {
19368							$.datepicker._clearDate( event.target );
19369						}
19370						handled = event.ctrlKey || event.metaKey;
19371						break; // clear on ctrl or command +end
19372				case 36: if ( event.ctrlKey || event.metaKey ) {
19373							$.datepicker._gotoToday( event.target );
19374						}
19375						handled = event.ctrlKey || event.metaKey;
19376						break; // current on ctrl or command +home
19377				case 37: if ( event.ctrlKey || event.metaKey ) {
19378							$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
19379						}
19380						handled = event.ctrlKey || event.metaKey;
19381
19382						// -1 day on ctrl or command +left
19383						if ( event.originalEvent.altKey ) {
19384							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
19385								-$.datepicker._get( inst, "stepBigMonths" ) :
19386								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
19387						}
19388
19389						// next month/year on alt +left on Mac
19390						break;
19391				case 38: if ( event.ctrlKey || event.metaKey ) {
19392							$.datepicker._adjustDate( event.target, -7, "D" );
19393						}
19394						handled = event.ctrlKey || event.metaKey;
19395						break; // -1 week on ctrl or command +up
19396				case 39: if ( event.ctrlKey || event.metaKey ) {
19397							$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
19398						}
19399						handled = event.ctrlKey || event.metaKey;
19400
19401						// +1 day on ctrl or command +right
19402						if ( event.originalEvent.altKey ) {
19403							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
19404								+$.datepicker._get( inst, "stepBigMonths" ) :
19405								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
19406						}
19407
19408						// next month/year on alt +right
19409						break;
19410				case 40: if ( event.ctrlKey || event.metaKey ) {
19411							$.datepicker._adjustDate( event.target, +7, "D" );
19412						}
19413						handled = event.ctrlKey || event.metaKey;
19414						break; // +1 week on ctrl or command +down
19415				default: handled = false;
19416			}
19417		} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
19418			$.datepicker._showDatepicker( this );
19419		} else {
19420			handled = false;
19421		}
19422
19423		if ( handled ) {
19424			event.preventDefault();
19425			event.stopPropagation();
19426		}
19427	},
19428
19429	/* Filter entered characters - based on date format. */
19430	_doKeyPress: function( event ) {
19431		var chars, chr,
19432			inst = $.datepicker._getInst( event.target );
19433
19434		if ( $.datepicker._get( inst, "constrainInput" ) ) {
19435			chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
19436			chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
19437			return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
19438		}
19439	},
19440
19441	/* Synchronise manual entry and field/alternate field. */
19442	_doKeyUp: function( event ) {
19443		var date,
19444			inst = $.datepicker._getInst( event.target );
19445
19446		if ( inst.input.val() !== inst.lastVal ) {
19447			try {
19448				date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
19449					( inst.input ? inst.input.val() : null ),
19450					$.datepicker._getFormatConfig( inst ) );
19451
19452				if ( date ) { // only if valid
19453					$.datepicker._setDateFromField( inst );
19454					$.datepicker._updateAlternate( inst );
19455					$.datepicker._updateDatepicker( inst );
19456				}
19457			} catch ( err ) {
19458			}
19459		}
19460		return true;
19461	},
19462
19463	/* Pop-up the date picker for a given input field.
19464	 * If false returned from beforeShow event handler do not show.
19465	 * @param  input  element - the input field attached to the date picker or
vendor: 4,332 bytes, lines 19466-19588
19466	 *					event - if triggered by focus
19467	 */
19468	_showDatepicker: function( input ) {
19469		input = input.target || input;
19470		if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
19471			input = $( "input", input.parentNode )[ 0 ];
19472		}
19473
19474		if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
19475			return;
19476		}
19477
19478		var inst, beforeShow, beforeShowSettings, isFixed,
19479			offset, showAnim, duration;
19480
19481		inst = $.datepicker._getInst( input );
19482		if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
19483			$.datepicker._curInst.dpDiv.stop( true, true );
19484			if ( inst && $.datepicker._datepickerShowing ) {
19485				$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
19486			}
19487		}
19488
19489		beforeShow = $.datepicker._get( inst, "beforeShow" );
19490		beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
19491		if ( beforeShowSettings === false ) {
19492			return;
19493		}
19494		datepicker_extendRemove( inst.settings, beforeShowSettings );
19495
19496		inst.lastVal = null;
19497		$.datepicker._lastInput = input;
19498		$.datepicker._setDateFromField( inst );
19499
19500		if ( $.datepicker._inDialog ) { // hide cursor
19501			input.value = "";
19502		}
19503		if ( !$.datepicker._pos ) { // position below input
19504			$.datepicker._pos = $.datepicker._findPos( input );
19505			$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
19506		}
19507
19508		isFixed = false;
19509		$( input ).parents().each( function() {
19510			isFixed |= $( this ).css( "position" ) === "fixed";
19511			return !isFixed;
19512		} );
19513
19514		offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
19515		$.datepicker._pos = null;
19516
19517		//to avoid flashes on Firefox
19518		inst.dpDiv.empty();
19519
19520		// determine sizing offscreen
19521		inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
19522		$.datepicker._updateDatepicker( inst );
19523
19524		// fix width for dynamic number of date pickers
19525		// and adjust position before showing
19526		offset = $.datepicker._checkOffset( inst, offset, isFixed );
19527		inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
19528			"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
19529			left: offset.left + "px", top: offset.top + "px" } );
19530
19531		if ( !inst.inline ) {
19532			showAnim = $.datepicker._get( inst, "showAnim" );
19533			duration = $.datepicker._get( inst, "duration" );
19534			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
19535			$.datepicker._datepickerShowing = true;
19536
19537			if ( $.effects && $.effects.effect[ showAnim ] ) {
19538				inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
19539			} else {
19540				inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
19541			}
19542
19543			if ( $.datepicker._shouldFocusInput( inst ) ) {
19544				inst.input.trigger( "focus" );
19545			}
19546
19547			$.datepicker._curInst = inst;
19548		}
19549	},
19550
19551	/* Generate the date picker content. */
19552	_updateDatepicker: function( inst ) {
19553		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
19554		datepicker_instActive = inst; // for delegate hover events
19555		inst.dpDiv.empty().append( this._generateHTML( inst ) );
19556		this._attachHandlers( inst );
19557
19558		var origyearshtml,
19559			numMonths = this._getNumberOfMonths( inst ),
19560			cols = numMonths[ 1 ],
19561			width = 17,
19562			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" ),
19563			onUpdateDatepicker = $.datepicker._get( inst, "onUpdateDatepicker" );
19564
19565		if ( activeCell.length > 0 ) {
19566			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
19567		}
19568
19569		inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
19570		if ( cols > 1 ) {
19571			inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
19572		}
19573		inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
19574			"Class" ]( "ui-datepicker-multi" );
19575		inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
19576			"Class" ]( "ui-datepicker-rtl" );
19577
19578		if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
19579			inst.input.trigger( "focus" );
19580		}
19581
19582		// Deffered render of the years select (to avoid flashes on Firefox)
19583		if ( inst.yearshtml ) {
19584			origyearshtml = inst.yearshtml;
19585			setTimeout( function() {
19586
19587				//assure that inst.yearshtml didn't change.
19588				if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
vendor: 5,508 bytes, lines 19589-19747
19589					inst.dpDiv.find( "select.ui-datepicker-year" ).first().replaceWith( inst.yearshtml );
19590				}
19591				origyearshtml = inst.yearshtml = null;
19592			}, 0 );
19593		}
19594
19595		if ( onUpdateDatepicker ) {
19596			onUpdateDatepicker.apply( ( inst.input ? inst.input[ 0 ] : null ), [ inst ] );
19597		}
19598	},
19599
19600	// #6694 - don't focus the input if it's already focused
19601	// this breaks the change event in IE
19602	// Support: IE and jQuery <1.9
19603	_shouldFocusInput: function( inst ) {
19604		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
19605	},
19606
19607	/* Check positioning to remain on screen. */
19608	_checkOffset: function( inst, offset, isFixed ) {
19609		var dpWidth = inst.dpDiv.outerWidth(),
19610			dpHeight = inst.dpDiv.outerHeight(),
19611			inputWidth = inst.input ? inst.input.outerWidth() : 0,
19612			inputHeight = inst.input ? inst.input.outerHeight() : 0,
19613			viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
19614			viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
19615
19616		offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
19617		offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
19618		offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
19619
19620		// Now check if datepicker is showing outside window viewport - move to a better place if so.
19621		offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
19622			Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
19623		offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
19624			Math.abs( dpHeight + inputHeight ) : 0 );
19625
19626		return offset;
19627	},
19628
19629	/* Find an object's position on the screen. */
19630	_findPos: function( obj ) {
19631		var position,
19632			inst = this._getInst( obj ),
19633			isRTL = this._get( inst, "isRTL" );
19634
19635		while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.pseudos.hidden( obj ) ) ) {
19636			obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
19637		}
19638
19639		position = $( obj ).offset();
19640		return [ position.left, position.top ];
19641	},
19642
19643	/* Hide the date picker from view.
19644	 * @param  input  element - the input field attached to the date picker
19645	 */
19646	_hideDatepicker: function( input ) {
19647		var showAnim, duration, postProcess, onClose,
19648			inst = this._curInst;
19649
19650		if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
19651			return;
19652		}
19653
19654		if ( this._datepickerShowing ) {
19655			showAnim = this._get( inst, "showAnim" );
19656			duration = this._get( inst, "duration" );
19657			postProcess = function() {
19658				$.datepicker._tidyDialog( inst );
19659			};
19660
19661			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
19662			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
19663				inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
19664			} else {
19665				inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
19666					( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
19667			}
19668
19669			if ( !showAnim ) {
19670				postProcess();
19671			}
19672			this._datepickerShowing = false;
19673
19674			onClose = this._get( inst, "onClose" );
19675			if ( onClose ) {
19676				onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
19677			}
19678
19679			this._lastInput = null;
19680			if ( this._inDialog ) {
19681				this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
19682				if ( $.blockUI ) {
19683					$.unblockUI();
19684					$( "body" ).append( this.dpDiv );
19685				}
19686			}
19687			this._inDialog = false;
19688		}
19689	},
19690
19691	/* Tidy up after a dialog display. */
19692	_tidyDialog: function( inst ) {
19693		inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
19694	},
19695
19696	/* Close date picker if clicked elsewhere. */
19697	_checkExternalClick: function( event ) {
19698		if ( !$.datepicker._curInst ) {
19699			return;
19700		}
19701
19702		var $target = $( event.target ),
19703			inst = $.datepicker._getInst( $target[ 0 ] );
19704
19705		if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
19706				$target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
19707				!$target.hasClass( $.datepicker.markerClassName ) &&
19708				!$target.closest( "." + $.datepicker._triggerClass ).length &&
19709				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
19710			( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
19711				$.datepicker._hideDatepicker();
19712		}
19713	},
19714
19715	/* Adjust one of the date sub-fields. */
19716	_adjustDate: function( id, offset, period ) {
19717		var target = $( id ),
19718			inst = this._getInst( target[ 0 ] );
19719
19720		if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
19721			return;
19722		}
19723		this._adjustInstDate( inst, offset, period );
19724		this._updateDatepicker( inst );
19725	},
19726
19727	/* Action for current link. */
19728	_gotoToday: function( id ) {
19729		var date,
19730			target = $( id ),
19731			inst = this._getInst( target[ 0 ] );
19732
19733		if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
19734			inst.selectedDay = inst.currentDay;
19735			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
19736			inst.drawYear = inst.selectedYear = inst.currentYear;
19737		} else {
19738			date = new Date();
19739			inst.selectedDay = date.getDate();
19740			inst.drawMonth = inst.selectedMonth = date.getMonth();
19741			inst.drawYear = inst.selectedYear = date.getFullYear();
19742		}
19743		this._notifyChange( inst );
19744		this._adjustDate( target );
19745	},
19746
19747	/* Action for selecting a new month/year. */
vendor: 10,046 bytes, lines 19748-20069
19748	_selectMonthYear: function( id, select, period ) {
19749		var target = $( id ),
19750			inst = this._getInst( target[ 0 ] );
19751
19752		inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
19753		inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
19754			parseInt( select.options[ select.selectedIndex ].value, 10 );
19755
19756		this._notifyChange( inst );
19757		this._adjustDate( target );
19758	},
19759
19760	/* Action for selecting a day. */
19761	_selectDay: function( id, month, year, td ) {
19762		var inst,
19763			target = $( id );
19764
19765		if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
19766			return;
19767		}
19768
19769		inst = this._getInst( target[ 0 ] );
19770		inst.selectedDay = inst.currentDay = parseInt( $( "a", td ).attr( "data-date" ) );
19771		inst.selectedMonth = inst.currentMonth = month;
19772		inst.selectedYear = inst.currentYear = year;
19773		this._selectDate( id, this._formatDate( inst,
19774			inst.currentDay, inst.currentMonth, inst.currentYear ) );
19775	},
19776
19777	/* Erase the input field and hide the date picker. */
19778	_clearDate: function( id ) {
19779		var target = $( id );
19780		this._selectDate( target, "" );
19781	},
19782
19783	/* Update the input field with the selected date. */
19784	_selectDate: function( id, dateStr ) {
19785		var onSelect,
19786			target = $( id ),
19787			inst = this._getInst( target[ 0 ] );
19788
19789		dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
19790		if ( inst.input ) {
19791			inst.input.val( dateStr );
19792		}
19793		this._updateAlternate( inst );
19794
19795		onSelect = this._get( inst, "onSelect" );
19796		if ( onSelect ) {
19797			onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
19798		} else if ( inst.input ) {
19799			inst.input.trigger( "change" ); // fire the change event
19800		}
19801
19802		if ( inst.inline ) {
19803			this._updateDatepicker( inst );
19804		} else {
19805			this._hideDatepicker();
19806			this._lastInput = inst.input[ 0 ];
19807			if ( typeof( inst.input[ 0 ] ) !== "object" ) {
19808				inst.input.trigger( "focus" ); // restore focus
19809			}
19810			this._lastInput = null;
19811		}
19812	},
19813
19814	/* Update any alternate field to synchronise with the main field. */
19815	_updateAlternate: function( inst ) {
19816		var altFormat, date, dateStr,
19817			altField = this._get( inst, "altField" );
19818
19819		if ( altField ) { // update alternate field too
19820			altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
19821			date = this._getDate( inst );
19822			dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
19823			$( document ).find( altField ).val( dateStr );
19824		}
19825	},
19826
19827	/* Set as beforeShowDay function to prevent selection of weekends.
19828	 * @param  date  Date - the date to customise
19829	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
19830	 */
19831	noWeekends: function( date ) {
19832		var day = date.getDay();
19833		return [ ( day > 0 && day < 6 ), "" ];
19834	},
19835
19836	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
19837	 * @param  date  Date - the date to get the week for
19838	 * @return  number - the number of the week within the year that contains this date
19839	 */
19840	iso8601Week: function( date ) {
19841		var time,
19842			checkDate = new Date( date.getTime() );
19843
19844		// Find Thursday of this week starting on Monday
19845		checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
19846
19847		time = checkDate.getTime();
19848		checkDate.setMonth( 0 ); // Compare with Jan 1
19849		checkDate.setDate( 1 );
19850		return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
19851	},
19852
19853	/* Parse a string value into a date object.
19854	 * See formatDate below for the possible formats.
19855	 *
19856	 * @param  format string - the expected format of the date
19857	 * @param  value string - the date in the above format
19858	 * @param  settings Object - attributes include:
19859	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
19860	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
19861	 *					dayNames		string[7] - names of the days from Sunday (optional)
19862	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
19863	 *					monthNames		string[12] - names of the months (optional)
19864	 * @return  Date - the extracted date value or null if value is blank
19865	 */
19866	parseDate: function( format, value, settings ) {
19867		if ( format == null || value == null ) {
19868			throw "Invalid arguments";
19869		}
19870
19871		value = ( typeof value === "object" ? value.toString() : value + "" );
19872		if ( value === "" ) {
19873			return null;
19874		}
19875
19876		var iFormat, dim, extra,
19877			iValue = 0,
19878			shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
19879			shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
19880				new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
19881			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
19882			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
19883			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
19884			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
19885			year = -1,
19886			month = -1,
19887			day = -1,
19888			doy = -1,
19889			literal = false,
19890			date,
19891
19892			// Check whether a format character is doubled
19893			lookAhead = function( match ) {
19894				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
19895				if ( matches ) {
19896					iFormat++;
19897				}
19898				return matches;
19899			},
19900
19901			// Extract a number from the string value
19902			getNumber = function( match ) {
19903				var isDoubled = lookAhead( match ),
19904					size = ( match === "@" ? 14 : ( match === "!" ? 20 :
19905					( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
19906					minSize = ( match === "y" ? size : 1 ),
19907					digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
19908					num = value.substring( iValue ).match( digits );
19909				if ( !num ) {
19910					throw "Missing number at position " + iValue;
19911				}
19912				iValue += num[ 0 ].length;
19913				return parseInt( num[ 0 ], 10 );
19914			},
19915
19916			// Extract a name from the string value and convert to an index
19917			getName = function( match, shortNames, longNames ) {
19918				var index = -1,
19919					names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
19920						return [ [ k, v ] ];
19921					} ).sort( function( a, b ) {
19922						return -( a[ 1 ].length - b[ 1 ].length );
19923					} );
19924
19925				$.each( names, function( i, pair ) {
19926					var name = pair[ 1 ];
19927					if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
19928						index = pair[ 0 ];
19929						iValue += name.length;
19930						return false;
19931					}
19932				} );
19933				if ( index !== -1 ) {
19934					return index + 1;
19935				} else {
19936					throw "Unknown name at position " + iValue;
19937				}
19938			},
19939
19940			// Confirm that a literal character matches the string value
19941			checkLiteral = function() {
19942				if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
19943					throw "Unexpected literal at position " + iValue;
19944				}
19945				iValue++;
19946			};
19947
19948		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
19949			if ( literal ) {
19950				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
19951					literal = false;
19952				} else {
19953					checkLiteral();
19954				}
19955			} else {
19956				switch ( format.charAt( iFormat ) ) {
19957					case "d":
19958						day = getNumber( "d" );
19959						break;
19960					case "D":
19961						getName( "D", dayNamesShort, dayNames );
19962						break;
19963					case "o":
19964						doy = getNumber( "o" );
19965						break;
19966					case "m":
19967						month = getNumber( "m" );
19968						break;
19969					case "M":
19970						month = getName( "M", monthNamesShort, monthNames );
19971						break;
19972					case "y":
19973						year = getNumber( "y" );
19974						break;
19975					case "@":
19976						date = new Date( getNumber( "@" ) );
19977						year = date.getFullYear();
19978						month = date.getMonth() + 1;
19979						day = date.getDate();
19980						break;
19981					case "!":
19982						date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
19983						year = date.getFullYear();
19984						month = date.getMonth() + 1;
19985						day = date.getDate();
19986						break;
19987					case "'":
19988						if ( lookAhead( "'" ) ) {
19989							checkLiteral();
19990						} else {
19991							literal = true;
19992						}
19993						break;
19994					default:
19995						checkLiteral();
19996				}
19997			}
19998		}
19999
20000		if ( iValue < value.length ) {
20001			extra = value.substr( iValue );
20002			if ( !/^\s+/.test( extra ) ) {
20003				throw "Extra/unparsed characters found in date: " + extra;
20004			}
20005		}
20006
20007		if ( year === -1 ) {
20008			year = new Date().getFullYear();
20009		} else if ( year < 100 ) {
20010			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
20011				( year <= shortYearCutoff ? 0 : -100 );
20012		}
20013
20014		if ( doy > -1 ) {
20015			month = 1;
20016			day = doy;
20017			do {
20018				dim = this._getDaysInMonth( year, month - 1 );
20019				if ( day <= dim ) {
20020					break;
20021				}
20022				month++;
20023				day -= dim;
20024			} while ( true );
20025		}
20026
20027		date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
20028		if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
20029			throw "Invalid date"; // E.g. 31/02/00
20030		}
20031		return date;
20032	},
20033
20034	/* Standard date formats. */
20035	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
20036	COOKIE: "D, dd M yy",
20037	ISO_8601: "yy-mm-dd",
20038	RFC_822: "D, d M y",
20039	RFC_850: "DD, dd-M-y",
20040	RFC_1036: "D, d M y",
20041	RFC_1123: "D, d M yy",
20042	RFC_2822: "D, d M yy",
20043	RSS: "D, d M y", // RFC 822
20044	TICKS: "!",
20045	TIMESTAMP: "@",
20046	W3C: "yy-mm-dd", // ISO 8601
20047
20048	_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
20049		Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
20050
20051	/* Format a date object into a string value.
20052	 * The format can be combinations of the following:
20053	 * d  - day of month (no leading zero)
20054	 * dd - day of month (two digit)
20055	 * o  - day of year (no leading zeros)
20056	 * oo - day of year (three digit)
20057	 * D  - day name short
20058	 * DD - day name long
20059	 * m  - month of year (no leading zero)
20060	 * mm - month of year (two digit)
20061	 * M  - month name short
20062	 * MM - month name long
20063	 * y  - year (two digit)
20064	 * yy - year (four digit)
20065	 * @ - Unix timestamp (ms since 01/01/1970)
20066	 * ! - Windows ticks (100ns since 01/01/0001)
20067	 * "..." - literal text
20068	 * '' - single quote
20069	 *
vendor: 6,198 bytes, lines 20070-20269
20070	 * @param  format string - the desired format of the date
20071	 * @param  date Date - the date value to format
20072	 * @param  settings Object - attributes include:
20073	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
20074	 *					dayNames		string[7] - names of the days from Sunday (optional)
20075	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
20076	 *					monthNames		string[12] - names of the months (optional)
20077	 * @return  string - the date in the above format
20078	 */
20079	formatDate: function( format, date, settings ) {
20080		if ( !date ) {
20081			return "";
20082		}
20083
20084		var iFormat,
20085			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
20086			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
20087			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
20088			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
20089
20090			// Check whether a format character is doubled
20091			lookAhead = function( match ) {
20092				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
20093				if ( matches ) {
20094					iFormat++;
20095				}
20096				return matches;
20097			},
20098
20099			// Format a number, with leading zero if necessary
20100			formatNumber = function( match, value, len ) {
20101				var num = "" + value;
20102				if ( lookAhead( match ) ) {
20103					while ( num.length < len ) {
20104						num = "0" + num;
20105					}
20106				}
20107				return num;
20108			},
20109
20110			// Format a name, short or long as requested
20111			formatName = function( match, value, shortNames, longNames ) {
20112				return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
20113			},
20114			output = "",
20115			literal = false;
20116
20117		if ( date ) {
20118			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
20119				if ( literal ) {
20120					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
20121						literal = false;
20122					} else {
20123						output += format.charAt( iFormat );
20124					}
20125				} else {
20126					switch ( format.charAt( iFormat ) ) {
20127						case "d":
20128							output += formatNumber( "d", date.getDate(), 2 );
20129							break;
20130						case "D":
20131							output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
20132							break;
20133						case "o":
20134							output += formatNumber( "o",
20135								Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
20136							break;
20137						case "m":
20138							output += formatNumber( "m", date.getMonth() + 1, 2 );
20139							break;
20140						case "M":
20141							output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
20142							break;
20143						case "y":
20144							output += ( lookAhead( "y" ) ? date.getFullYear() :
20145								( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
20146							break;
20147						case "@":
20148							output += date.getTime();
20149							break;
20150						case "!":
20151							output += date.getTime() * 10000 + this._ticksTo1970;
20152							break;
20153						case "'":
20154							if ( lookAhead( "'" ) ) {
20155								output += "'";
20156							} else {
20157								literal = true;
20158							}
20159							break;
20160						default:
20161							output += format.charAt( iFormat );
20162					}
20163				}
20164			}
20165		}
20166		return output;
20167	},
20168
20169	/* Extract all possible characters from the date format. */
20170	_possibleChars: function( format ) {
20171		var iFormat,
20172			chars = "",
20173			literal = false,
20174
20175			// Check whether a format character is doubled
20176			lookAhead = function( match ) {
20177				var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
20178				if ( matches ) {
20179					iFormat++;
20180				}
20181				return matches;
20182			};
20183
20184		for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
20185			if ( literal ) {
20186				if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
20187					literal = false;
20188				} else {
20189					chars += format.charAt( iFormat );
20190				}
20191			} else {
20192				switch ( format.charAt( iFormat ) ) {
20193					case "d": case "m": case "y": case "@":
20194						chars += "0123456789";
20195						break;
20196					case "D": case "M":
20197						return null; // Accept anything
20198					case "'":
20199						if ( lookAhead( "'" ) ) {
20200							chars += "'";
20201						} else {
20202							literal = true;
20203						}
20204						break;
20205					default:
20206						chars += format.charAt( iFormat );
20207				}
20208			}
20209		}
20210		return chars;
20211	},
20212
20213	/* Get a setting value, defaulting if necessary. */
20214	_get: function( inst, name ) {
20215		return inst.settings[ name ] !== undefined ?
20216			inst.settings[ name ] : this._defaults[ name ];
20217	},
20218
20219	/* Parse existing date and initialise date picker. */
20220	_setDateFromField: function( inst, noDefault ) {
20221		if ( inst.input.val() === inst.lastVal ) {
20222			return;
20223		}
20224
20225		var dateFormat = this._get( inst, "dateFormat" ),
20226			dates = inst.lastVal = inst.input ? inst.input.val() : null,
20227			defaultDate = this._getDefaultDate( inst ),
20228			date = defaultDate,
20229			settings = this._getFormatConfig( inst );
20230
20231		try {
20232			date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
20233		} catch ( event ) {
20234			dates = ( noDefault ? "" : dates );
20235		}
20236		inst.selectedDay = date.getDate();
20237		inst.drawMonth = inst.selectedMonth = date.getMonth();
20238		inst.drawYear = inst.selectedYear = date.getFullYear();
20239		inst.currentDay = ( dates ? date.getDate() : 0 );
20240		inst.currentMonth = ( dates ? date.getMonth() : 0 );
20241		inst.currentYear = ( dates ? date.getFullYear() : 0 );
20242		this._adjustInstDate( inst );
20243	},
20244
20245	/* Retrieve the default date shown on opening. */
20246	_getDefaultDate: function( inst ) {
20247		return this._restrictMinMax( inst,
20248			this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
20249	},
20250
20251	/* A date may be specified as an exact value or a relative one. */
20252	_determineDate: function( inst, date, defaultDate ) {
20253		var offsetNumeric = function( offset ) {
20254				var date = new Date();
20255				date.setDate( date.getDate() + offset );
20256				return date;
20257			},
20258			offsetString = function( offset ) {
20259				try {
20260					return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
20261						offset, $.datepicker._getFormatConfig( inst ) );
20262				} catch ( e ) {
20263
20264					// Ignore
20265				}
20266
20267				var date = ( offset.toLowerCase().match( /^c/ ) ?
20268					$.datepicker._getDate( inst ) : null ) || new Date(),
20269					year = date.getFullYear(),
vendor: 26,616 bytes, lines 20270-20923
20270					month = date.getMonth(),
20271					day = date.getDate(),
20272					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
20273					matches = pattern.exec( offset );
20274
20275				while ( matches ) {
20276					switch ( matches[ 2 ] || "d" ) {
20277						case "d" : case "D" :
20278							day += parseInt( matches[ 1 ], 10 ); break;
20279						case "w" : case "W" :
20280							day += parseInt( matches[ 1 ], 10 ) * 7; break;
20281						case "m" : case "M" :
20282							month += parseInt( matches[ 1 ], 10 );
20283							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
20284							break;
20285						case "y": case "Y" :
20286							year += parseInt( matches[ 1 ], 10 );
20287							day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
20288							break;
20289					}
20290					matches = pattern.exec( offset );
20291				}
20292				return new Date( year, month, day );
20293			},
20294			newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
20295				( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
20296
20297		newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
20298		if ( newDate ) {
20299			newDate.setHours( 0 );
20300			newDate.setMinutes( 0 );
20301			newDate.setSeconds( 0 );
20302			newDate.setMilliseconds( 0 );
20303		}
20304		return this._daylightSavingAdjust( newDate );
20305	},
20306
20307	/* Handle switch to/from daylight saving.
20308	 * Hours may be non-zero on daylight saving cut-over:
20309	 * > 12 when midnight changeover, but then cannot generate
20310	 * midnight datetime, so jump to 1AM, otherwise reset.
20311	 * @param  date  (Date) the date to check
20312	 * @return  (Date) the corrected date
20313	 */
20314	_daylightSavingAdjust: function( date ) {
20315		if ( !date ) {
20316			return null;
20317		}
20318		date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
20319		return date;
20320	},
20321
20322	/* Set the date(s) directly. */
20323	_setDate: function( inst, date, noChange ) {
20324		var clear = !date,
20325			origMonth = inst.selectedMonth,
20326			origYear = inst.selectedYear,
20327			newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
20328
20329		inst.selectedDay = inst.currentDay = newDate.getDate();
20330		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
20331		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
20332		if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
20333			this._notifyChange( inst );
20334		}
20335		this._adjustInstDate( inst );
20336		if ( inst.input ) {
20337			inst.input.val( clear ? "" : this._formatDate( inst ) );
20338		}
20339	},
20340
20341	/* Retrieve the date(s) directly. */
20342	_getDate: function( inst ) {
20343		var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
20344			this._daylightSavingAdjust( new Date(
20345			inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
20346			return startDate;
20347	},
20348
20349	/* Attach the onxxx handlers.  These are declared statically so
20350	 * they work with static code transformers like Caja.
20351	 */
20352	_attachHandlers: function( inst ) {
20353		var stepMonths = this._get( inst, "stepMonths" ),
20354			id = "#" + inst.id.replace( /\\\\/g, "\\" );
20355		inst.dpDiv.find( "[data-handler]" ).map( function() {
20356			var handler = {
20357				prev: function() {
20358					$.datepicker._adjustDate( id, -stepMonths, "M" );
20359				},
20360				next: function() {
20361					$.datepicker._adjustDate( id, +stepMonths, "M" );
20362				},
20363				hide: function() {
20364					$.datepicker._hideDatepicker();
20365				},
20366				today: function() {
20367					$.datepicker._gotoToday( id );
20368				},
20369				selectDay: function() {
20370					$.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
20371					return false;
20372				},
20373				selectMonth: function() {
20374					$.datepicker._selectMonthYear( id, this, "M" );
20375					return false;
20376				},
20377				selectYear: function() {
20378					$.datepicker._selectMonthYear( id, this, "Y" );
20379					return false;
20380				}
20381			};
20382			$( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
20383		} );
20384	},
20385
20386	/* Generate the HTML for the current state of the date picker. */
20387	_generateHTML: function( inst ) {
20388		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
20389			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
20390			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
20391			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
20392			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
20393			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
20394			tempDate = new Date(),
20395			today = this._daylightSavingAdjust(
20396				new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
20397			isRTL = this._get( inst, "isRTL" ),
20398			showButtonPanel = this._get( inst, "showButtonPanel" ),
20399			hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
20400			navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
20401			numMonths = this._getNumberOfMonths( inst ),
20402			showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
20403			stepMonths = this._get( inst, "stepMonths" ),
20404			isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
20405			currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
20406				new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
20407			minDate = this._getMinMaxDate( inst, "min" ),
20408			maxDate = this._getMinMaxDate( inst, "max" ),
20409			drawMonth = inst.drawMonth - showCurrentAtPos,
20410			drawYear = inst.drawYear;
20411
20412		if ( drawMonth < 0 ) {
20413			drawMonth += 12;
20414			drawYear--;
20415		}
20416		if ( maxDate ) {
20417			maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
20418				maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
20419			maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
20420			while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
20421				drawMonth--;
20422				if ( drawMonth < 0 ) {
20423					drawMonth = 11;
20424					drawYear--;
20425				}
20426			}
20427		}
20428		inst.drawMonth = drawMonth;
20429		inst.drawYear = drawYear;
20430
20431		prevText = this._get( inst, "prevText" );
20432		prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
20433			this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
20434			this._getFormatConfig( inst ) ) );
20435
20436		if ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ) {
20437			prev = $( "<a>" )
20438				.attr( {
20439					"class": "ui-datepicker-prev ui-corner-all",
20440					"data-handler": "prev",
20441					"data-event": "click",
20442					title: prevText
20443				} )
20444				.append(
20445					$( "<span>" )
20446						.addClass( "ui-icon ui-icon-circle-triangle-" +
20447							( isRTL ? "e" : "w" ) )
20448						.text( prevText )
20449				)[ 0 ].outerHTML;
20450		} else if ( hideIfNoPrevNext ) {
20451			prev = "";
20452		} else {
20453			prev = $( "<a>" )
20454				.attr( {
20455					"class": "ui-datepicker-prev ui-corner-all ui-state-disabled",
20456					title: prevText
20457				} )
20458				.append(
20459					$( "<span>" )
20460						.addClass( "ui-icon ui-icon-circle-triangle-" +
20461							( isRTL ? "e" : "w" ) )
20462						.text( prevText )
20463				)[ 0 ].outerHTML;
20464		}
20465
20466		nextText = this._get( inst, "nextText" );
20467		nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
20468			this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
20469			this._getFormatConfig( inst ) ) );
20470
20471		if ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ) {
20472			next = $( "<a>" )
20473				.attr( {
20474					"class": "ui-datepicker-next ui-corner-all",
20475					"data-handler": "next",
20476					"data-event": "click",
20477					title: nextText
20478				} )
20479				.append(
20480					$( "<span>" )
20481						.addClass( "ui-icon ui-icon-circle-triangle-" +
20482							( isRTL ? "w" : "e" ) )
20483						.text( nextText )
20484				)[ 0 ].outerHTML;
20485		} else if ( hideIfNoPrevNext ) {
20486			next = "";
20487		} else {
20488			next = $( "<a>" )
20489				.attr( {
20490					"class": "ui-datepicker-next ui-corner-all ui-state-disabled",
20491					title: nextText
20492				} )
20493				.append(
20494					$( "<span>" )
20495						.attr( "class", "ui-icon ui-icon-circle-triangle-" +
20496							( isRTL ? "w" : "e" ) )
20497						.text( nextText )
20498				)[ 0 ].outerHTML;
20499		}
20500
20501		currentText = this._get( inst, "currentText" );
20502		gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
20503		currentText = ( !navigationAsDateFormat ? currentText :
20504			this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
20505
20506		controls = "";
20507		if ( !inst.inline ) {
20508			controls = $( "<button>" )
20509				.attr( {
20510					type: "button",
20511					"class": "ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all",
20512					"data-handler": "hide",
20513					"data-event": "click"
20514				} )
20515				.text( this._get( inst, "closeText" ) )[ 0 ].outerHTML;
20516		}
20517
20518		buttonPanel = "";
20519		if ( showButtonPanel ) {
20520			buttonPanel = $( "<div class='ui-datepicker-buttonpane ui-widget-content'>" )
20521				.append( isRTL ? controls : "" )
20522				.append( this._isInRange( inst, gotoDate ) ?
20523					$( "<button>" )
20524						.attr( {
20525							type: "button",
20526							"class": "ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all",
20527							"data-handler": "today",
20528							"data-event": "click"
20529						} )
20530						.text( currentText ) :
20531					"" )
20532				.append( isRTL ? "" : controls )[ 0 ].outerHTML;
20533		}
20534
20535		firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
20536		firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
20537
20538		showWeek = this._get( inst, "showWeek" );
20539		dayNames = this._get( inst, "dayNames" );
20540		dayNamesMin = this._get( inst, "dayNamesMin" );
20541		monthNames = this._get( inst, "monthNames" );
20542		monthNamesShort = this._get( inst, "monthNamesShort" );
20543		beforeShowDay = this._get( inst, "beforeShowDay" );
20544		showOtherMonths = this._get( inst, "showOtherMonths" );
20545		selectOtherMonths = this._get( inst, "selectOtherMonths" );
20546		defaultDate = this._getDefaultDate( inst );
20547		html = "";
20548
20549		for ( row = 0; row < numMonths[ 0 ]; row++ ) {
20550			group = "";
20551			this.maxRows = 4;
20552			for ( col = 0; col < numMonths[ 1 ]; col++ ) {
20553				selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
20554				cornerClass = " ui-corner-all";
20555				calender = "";
20556				if ( isMultiMonth ) {
20557					calender += "<div class='ui-datepicker-group";
20558					if ( numMonths[ 1 ] > 1 ) {
20559						switch ( col ) {
20560							case 0: calender += " ui-datepicker-group-first";
20561								cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
20562							case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
20563								cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
20564							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
20565						}
20566					}
20567					calender += "'>";
20568				}
20569				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
20570					( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
20571					( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
20572					this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
20573					row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
20574					"</div><table class='ui-datepicker-calendar'><thead>" +
20575					"<tr>";
20576				thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
20577				for ( dow = 0; dow < 7; dow++ ) { // days of the week
20578					day = ( dow + firstDay ) % 7;
20579					thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
20580						"<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
20581				}
20582				calender += thead + "</tr></thead><tbody>";
20583				daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
20584				if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
20585					inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
20586				}
20587				leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
20588				curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
20589				numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
20590				this.maxRows = numRows;
20591				printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
20592				for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
20593					calender += "<tr>";
20594					tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
20595						this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
20596					for ( dow = 0; dow < 7; dow++ ) { // create date picker days
20597						daySettings = ( beforeShowDay ?
20598							beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
20599						otherMonth = ( printDate.getMonth() !== drawMonth );
20600						unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
20601							( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
20602						tbody += "<td class='" +
20603							( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
20604							( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
20605							( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
20606							( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
20607
20608							// or defaultDate is current printedDate and defaultDate is selectedDate
20609							" " + this._dayOverClass : "" ) + // highlight selected day
20610							( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
20611							( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
20612							( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
20613							( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
20614							( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
20615							( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
20616							( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
20617							( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
20618							( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
20619							( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
20620							( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
20621							"' href='#' aria-current='" + ( printDate.getTime() === currentDate.getTime() ? "true" : "false" ) + // mark date as selected for screen reader
20622							"' data-date='" + printDate.getDate() + // store date as data
20623							"'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
20624						printDate.setDate( printDate.getDate() + 1 );
20625						printDate = this._daylightSavingAdjust( printDate );
20626					}
20627					calender += tbody + "</tr>";
20628				}
20629				drawMonth++;
20630				if ( drawMonth > 11 ) {
20631					drawMonth = 0;
20632					drawYear++;
20633				}
20634				calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
20635							( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
20636				group += calender;
20637			}
20638			html += group;
20639		}
20640		html += buttonPanel;
20641		inst._keyEvent = false;
20642		return html;
20643	},
20644
20645	/* Generate the month and year header. */
20646	_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
20647			secondary, monthNames, monthNamesShort ) {
20648
20649		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
20650			changeMonth = this._get( inst, "changeMonth" ),
20651			changeYear = this._get( inst, "changeYear" ),
20652			showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
20653			selectMonthLabel = this._get( inst, "selectMonthLabel" ),
20654			selectYearLabel = this._get( inst, "selectYearLabel" ),
20655			html = "<div class='ui-datepicker-title'>",
20656			monthHtml = "";
20657
20658		// Month selection
20659		if ( secondary || !changeMonth ) {
20660			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
20661		} else {
20662			inMinYear = ( minDate && minDate.getFullYear() === drawYear );
20663			inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
20664			monthHtml += "<select class='ui-datepicker-month' aria-label='" + selectMonthLabel + "' data-handler='selectMonth' data-event='change'>";
20665			for ( month = 0; month < 12; month++ ) {
20666				if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
20667					monthHtml += "<option value='" + month + "'" +
20668						( month === drawMonth ? " selected='selected'" : "" ) +
20669						">" + monthNamesShort[ month ] + "</option>";
20670				}
20671			}
20672			monthHtml += "</select>";
20673		}
20674
20675		if ( !showMonthAfterYear ) {
20676			html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
20677		}
20678
20679		// Year selection
20680		if ( !inst.yearshtml ) {
20681			inst.yearshtml = "";
20682			if ( secondary || !changeYear ) {
20683				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
20684			} else {
20685
20686				// determine range of years to display
20687				years = this._get( inst, "yearRange" ).split( ":" );
20688				thisYear = new Date().getFullYear();
20689				determineYear = function( value ) {
20690					var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
20691						( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
20692						parseInt( value, 10 ) ) );
20693					return ( isNaN( year ) ? thisYear : year );
20694				};
20695				year = determineYear( years[ 0 ] );
20696				endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
20697				year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
20698				endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
20699				inst.yearshtml += "<select class='ui-datepicker-year' aria-label='" + selectYearLabel + "' data-handler='selectYear' data-event='change'>";
20700				for ( ; year <= endYear; year++ ) {
20701					inst.yearshtml += "<option value='" + year + "'" +
20702						( year === drawYear ? " selected='selected'" : "" ) +
20703						">" + year + "</option>";
20704				}
20705				inst.yearshtml += "</select>";
20706
20707				html += inst.yearshtml;
20708				inst.yearshtml = null;
20709			}
20710		}
20711
20712		html += this._get( inst, "yearSuffix" );
20713		if ( showMonthAfterYear ) {
20714			html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
20715		}
20716		html += "</div>"; // Close datepicker_header
20717		return html;
20718	},
20719
20720	/* Adjust one of the date sub-fields. */
20721	_adjustInstDate: function( inst, offset, period ) {
20722		var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
20723			month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
20724			day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
20725			date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
20726
20727		inst.selectedDay = date.getDate();
20728		inst.drawMonth = inst.selectedMonth = date.getMonth();
20729		inst.drawYear = inst.selectedYear = date.getFullYear();
20730		if ( period === "M" || period === "Y" ) {
20731			this._notifyChange( inst );
20732		}
20733	},
20734
20735	/* Ensure a date is within any min/max bounds. */
20736	_restrictMinMax: function( inst, date ) {
20737		var minDate = this._getMinMaxDate( inst, "min" ),
20738			maxDate = this._getMinMaxDate( inst, "max" ),
20739			newDate = ( minDate && date < minDate ? minDate : date );
20740		return ( maxDate && newDate > maxDate ? maxDate : newDate );
20741	},
20742
20743	/* Notify change of month/year. */
20744	_notifyChange: function( inst ) {
20745		var onChange = this._get( inst, "onChangeMonthYear" );
20746		if ( onChange ) {
20747			onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
20748				[ inst.selectedYear, inst.selectedMonth + 1, inst ] );
20749		}
20750	},
20751
20752	/* Determine the number of months to show. */
20753	_getNumberOfMonths: function( inst ) {
20754		var numMonths = this._get( inst, "numberOfMonths" );
20755		return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
20756	},
20757
20758	/* Determine the current maximum date - ensure no time components are set. */
20759	_getMinMaxDate: function( inst, minMax ) {
20760		return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
20761	},
20762
20763	/* Find the number of days in a given month. */
20764	_getDaysInMonth: function( year, month ) {
20765		return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
20766	},
20767
20768	/* Find the day of the week of the first of a month. */
20769	_getFirstDayOfMonth: function( year, month ) {
20770		return new Date( year, month, 1 ).getDay();
20771	},
20772
20773	/* Determines if we should allow a "next/prev" month display change. */
20774	_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
20775		var numMonths = this._getNumberOfMonths( inst ),
20776			date = this._daylightSavingAdjust( new Date( curYear,
20777			curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
20778
20779		if ( offset < 0 ) {
20780			date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
20781		}
20782		return this._isInRange( inst, date );
20783	},
20784
20785	/* Is the given date in the accepted range? */
20786	_isInRange: function( inst, date ) {
20787		var yearSplit, currentYear,
20788			minDate = this._getMinMaxDate( inst, "min" ),
20789			maxDate = this._getMinMaxDate( inst, "max" ),
20790			minYear = null,
20791			maxYear = null,
20792			years = this._get( inst, "yearRange" );
20793			if ( years ) {
20794				yearSplit = years.split( ":" );
20795				currentYear = new Date().getFullYear();
20796				minYear = parseInt( yearSplit[ 0 ], 10 );
20797				maxYear = parseInt( yearSplit[ 1 ], 10 );
20798				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
20799					minYear += currentYear;
20800				}
20801				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
20802					maxYear += currentYear;
20803				}
20804			}
20805
20806		return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
20807			( !maxDate || date.getTime() <= maxDate.getTime() ) &&
20808			( !minYear || date.getFullYear() >= minYear ) &&
20809			( !maxYear || date.getFullYear() <= maxYear ) );
20810	},
20811
20812	/* Provide the configuration settings for formatting/parsing. */
20813	_getFormatConfig: function( inst ) {
20814		var shortYearCutoff = this._get( inst, "shortYearCutoff" );
20815		shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
20816			new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
20817		return { shortYearCutoff: shortYearCutoff,
20818			dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
20819			monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
20820	},
20821
20822	/* Format the given date for display. */
20823	_formatDate: function( inst, day, month, year ) {
20824		if ( !day ) {
20825			inst.currentDay = inst.selectedDay;
20826			inst.currentMonth = inst.selectedMonth;
20827			inst.currentYear = inst.selectedYear;
20828		}
20829		var date = ( day ? ( typeof day === "object" ? day :
20830			this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
20831			this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
20832		return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
20833	}
20834} );
20835
20836/*
20837 * Bind hover events for datepicker elements.
20838 * Done via delegate so the binding only occurs once in the lifetime of the parent div.
20839 * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
20840 */
20841function datepicker_bindHover( dpDiv ) {
20842	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
20843	return dpDiv.on( "mouseout", selector, function() {
20844			$( this ).removeClass( "ui-state-hover" );
20845			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
20846				$( this ).removeClass( "ui-datepicker-prev-hover" );
20847			}
20848			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
20849				$( this ).removeClass( "ui-datepicker-next-hover" );
20850			}
20851		} )
20852		.on( "mouseover", selector, datepicker_handleMouseover );
20853}
20854
20855function datepicker_handleMouseover() {
20856	if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
20857		$( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
20858		$( this ).addClass( "ui-state-hover" );
20859		if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
20860			$( this ).addClass( "ui-datepicker-prev-hover" );
20861		}
20862		if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
20863			$( this ).addClass( "ui-datepicker-next-hover" );
20864		}
20865	}
20866}
20867
20868/* jQuery extend now ignores nulls! */
20869function datepicker_extendRemove( target, props ) {
20870	$.extend( target, props );
20871	for ( var name in props ) {
20872		if ( props[ name ] == null ) {
20873			target[ name ] = props[ name ];
20874		}
20875	}
20876	return target;
20877}
20878
20879/* Invoke the datepicker functionality.
20880   @param  options  string - a command, optionally followed by additional parameters or
20881					Object - settings for attaching new datepicker functionality
20882   @return  jQuery object */
20883$.fn.datepicker = function( options ) {
20884
20885	/* Verify an empty collection wasn't passed - Fixes #6976 */
20886	if ( !this.length ) {
20887		return this;
20888	}
20889
20890	/* Initialise the date picker. */
20891	if ( !$.datepicker.initialized ) {
20892		$( document ).on( "mousedown", $.datepicker._checkExternalClick );
20893		$.datepicker.initialized = true;
20894	}
20895
20896	/* Append datepicker main container to body if not exist. */
20897	if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
20898		$( "body" ).append( $.datepicker.dpDiv );
20899	}
20900
20901	var otherArgs = Array.prototype.slice.call( arguments, 1 );
20902	if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
20903		return $.datepicker[ "_" + options + "Datepicker" ].
20904			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
20905	}
20906	if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
20907		return $.datepicker[ "_" + options + "Datepicker" ].
20908			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
20909	}
20910	return this.each( function() {
20911		if ( typeof options === "string" ) {
20912			$.datepicker[ "_" + options + "Datepicker" ]
20913				.apply( $.datepicker, [ this ].concat( otherArgs ) );
20914		} else {
20915			$.datepicker._attachDatepicker( this, options );
20916		}
20917	} );
20918};
20919
20920$.datepicker = new Datepicker(); // singleton instance
20921$.datepicker.initialized = false;
20922$.datepicker.uuid = new Date().getTime();
20923$.datepicker.version = "1.1
vendor: 7,560 bytes, lines 20923-21212
209233.2";
20924
20925var widgetsDatepicker = $.datepicker;
20926
20927
20928
20929// This file is deprecated
20930var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
20931
20932/*!
20933 * jQuery UI Mouse 1.13.2
20934 * http://jqueryui.com
20935 *
20936 * Copyright jQuery Foundation and other contributors
20937 * Released under the MIT license.
20938 * http://jquery.org/license
20939 */
20940
20941//>>label: Mouse
20942//>>group: Widgets
20943//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
20944//>>docs: http://api.jqueryui.com/mouse/
20945
20946
20947var mouseHandled = false;
20948$( document ).on( "mouseup", function() {
20949	mouseHandled = false;
20950} );
20951
20952var widgetsMouse = $.widget( "ui.mouse", {
20953	version: "1.13.2",
20954	options: {
20955		cancel: "input, textarea, button, select, option",
20956		distance: 1,
20957		delay: 0
20958	},
20959	_mouseInit: function() {
20960		var that = this;
20961
20962		this.element
20963			.on( "mousedown." + this.widgetName, function( event ) {
20964				return that._mouseDown( event );
20965			} )
20966			.on( "click." + this.widgetName, function( event ) {
20967				if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
20968					$.removeData( event.target, that.widgetName + ".preventClickEvent" );
20969					event.stopImmediatePropagation();
20970					return false;
20971				}
20972			} );
20973
20974		this.started = false;
20975	},
20976
20977	// TODO: make sure destroying one instance of mouse doesn't mess with
20978	// other instances of mouse
20979	_mouseDestroy: function() {
20980		this.element.off( "." + this.widgetName );
20981		if ( this._mouseMoveDelegate ) {
20982			this.document
20983				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
20984				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
20985		}
20986	},
20987
20988	_mouseDown: function( event ) {
20989
20990		// don't let more than one widget handle mouseStart
20991		if ( mouseHandled ) {
20992			return;
20993		}
20994
20995		this._mouseMoved = false;
20996
20997		// We may have missed mouseup (out of window)
20998		if ( this._mouseStarted ) {
20999			this._mouseUp( event );
21000		}
21001
21002		this._mouseDownEvent = event;
21003
21004		var that = this,
21005			btnIsLeft = ( event.which === 1 ),
21006
21007			// event.target.nodeName works around a bug in IE 8 with
21008			// disabled inputs (#7620)
21009			elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
21010				$( event.target ).closest( this.options.cancel ).length : false );
21011		if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
21012			return true;
21013		}
21014
21015		this.mouseDelayMet = !this.options.delay;
21016		if ( !this.mouseDelayMet ) {
21017			this._mouseDelayTimer = setTimeout( function() {
21018				that.mouseDelayMet = true;
21019			}, this.options.delay );
21020		}
21021
21022		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
21023			this._mouseStarted = ( this._mouseStart( event ) !== false );
21024			if ( !this._mouseStarted ) {
21025				event.preventDefault();
21026				return true;
21027			}
21028		}
21029
21030		// Click event may never have fired (Gecko & Opera)
21031		if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
21032			$.removeData( event.target, this.widgetName + ".preventClickEvent" );
21033		}
21034
21035		// These delegates are required to keep context
21036		this._mouseMoveDelegate = function( event ) {
21037			return that._mouseMove( event );
21038		};
21039		this._mouseUpDelegate = function( event ) {
21040			return that._mouseUp( event );
21041		};
21042
21043		this.document
21044			.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
21045			.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
21046
21047		event.preventDefault();
21048
21049		mouseHandled = true;
21050		return true;
21051	},
21052
21053	_mouseMove: function( event ) {
21054
21055		// Only check for mouseups outside the document if you've moved inside the document
21056		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
21057		// fire a mousemove event if content is placed under the cursor. See #7778
21058		// Support: IE <9
21059		if ( this._mouseMoved ) {
21060
21061			// IE mouseup check - mouseup happened when mouse was out of window
21062			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
21063					!event.button ) {
21064				return this._mouseUp( event );
21065
21066			// Iframe mouseup check - mouseup occurred in another document
21067			} else if ( !event.which ) {
21068
21069				// Support: Safari <=8 - 9
21070				// Safari sets which to 0 if you press any of the following keys
21071				// during a drag (#14461)
21072				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
21073						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
21074					this.ignoreMissingWhich = true;
21075				} else if ( !this.ignoreMissingWhich ) {
21076					return this._mouseUp( event );
21077				}
21078			}
21079		}
21080
21081		if ( event.which || event.button ) {
21082			this._mouseMoved = true;
21083		}
21084
21085		if ( this._mouseStarted ) {
21086			this._mouseDrag( event );
21087			return event.preventDefault();
21088		}
21089
21090		if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
21091			this._mouseStarted =
21092				( this._mouseStart( this._mouseDownEvent, event ) !== false );
21093			if ( this._mouseStarted ) {
21094				this._mouseDrag( event );
21095			} else {
21096				this._mouseUp( event );
21097			}
21098		}
21099
21100		return !this._mouseStarted;
21101	},
21102
21103	_mouseUp: function( event ) {
21104		this.document
21105			.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
21106			.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
21107
21108		if ( this._mouseStarted ) {
21109			this._mouseStarted = false;
21110
21111			if ( event.target === this._mouseDownEvent.target ) {
21112				$.data( event.target, this.widgetName + ".preventClickEvent", true );
21113			}
21114
21115			this._mouseStop( event );
21116		}
21117
21118		if ( this._mouseDelayTimer ) {
21119			clearTimeout( this._mouseDelayTimer );
21120			delete this._mouseDelayTimer;
21121		}
21122
21123		this.ignoreMissingWhich = false;
21124		mouseHandled = false;
21125		event.preventDefault();
21126	},
21127
21128	_mouseDistanceMet: function( event ) {
21129		return ( Math.max(
21130				Math.abs( this._mouseDownEvent.pageX - event.pageX ),
21131				Math.abs( this._mouseDownEvent.pageY - event.pageY )
21132			) >= this.options.distance
21133		);
21134	},
21135
21136	_mouseDelayMet: function( /* event */ ) {
21137		return this.mouseDelayMet;
21138	},
21139
21140	// These are placeholder methods, to be overriden by extending plugin
21141	_mouseStart: function( /* event */ ) {},
21142	_mouseDrag: function( /* event */ ) {},
21143	_mouseStop: function( /* event */ ) {},
21144	_mouseCapture: function( /* event */ ) {
21145		return true;
21146	}
21147} );
21148
21149
21150
21151// $.ui.plugin is deprecated. Use $.widget() extensions instead.
21152var plugin = $.ui.plugin = {
21153	add: function( module, option, set ) {
21154		var i,
21155			proto = $.ui[ module ].prototype;
21156		for ( i in set ) {
21157			proto.plugins[ i ] = proto.plugins[ i ] || [];
21158			proto.plugins[ i ].push( [ option, set[ i ] ] );
21159		}
21160	},
21161	call: function( instance, name, args, allowDisconnected ) {
21162		var i,
21163			set = instance.plugins[ name ];
21164
21165		if ( !set ) {
21166			return;
21167		}
21168
21169		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
21170				instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
21171			return;
21172		}
21173
21174		for ( i = 0; i < set.length; i++ ) {
21175			if ( instance.options[ set[ i ][ 0 ] ] ) {
21176				set[ i ][ 1 ].apply( instance.element, args );
21177			}
21178		}
21179	}
21180};
21181
21182
21183
21184var safeBlur = $.ui.safeBlur = function( element ) {
21185
21186	// Support: IE9 - 10 only
21187	// If the <body> is blurred, IE will switch windows, see #9420
21188	if ( element && element.nodeName.toLowerCase() !== "body" ) {
21189		$( element ).trigger( "blur" );
21190	}
21191};
21192
21193
21194/*!
21195 * jQuery UI Draggable 1.13.2
21196 * http://jqueryui.com
21197 *
21198 * Copyright jQuery Foundation and other contributors
21199 * Released under the MIT license.
21200 * http://jquery.org/license
21201 */
21202
21203//>>label: Draggable
21204//>>group: Interactions
21205//>>description: Enables dragging functionality for any element.
21206//>>docs: http://api.jqueryui.com/draggable/
21207//>>demos: http://jqueryui.com/draggable/
21208//>>css.structure: ../../themes/base/draggable.css
21209
21210
21211$.widget( "ui.draggable", $.ui.mouse, {
21212	version: "1.13.2
vendor: 8,684 bytes, lines 21212-21558
21212",
21213	widgetEventPrefix: "drag",
21214	options: {
21215		addClasses: true,
21216		appendTo: "parent",
21217		axis: false,
21218		connectToSortable: false,
21219		containment: false,
21220		cursor: "auto",
21221		cursorAt: false,
21222		grid: false,
21223		handle: false,
21224		helper: "original",
21225		iframeFix: false,
21226		opacity: false,
21227		refreshPositions: false,
21228		revert: false,
21229		revertDuration: 500,
21230		scope: "default",
21231		scroll: true,
21232		scrollSensitivity: 20,
21233		scrollSpeed: 20,
21234		snap: false,
21235		snapMode: "both",
21236		snapTolerance: 20,
21237		stack: false,
21238		zIndex: false,
21239
21240		// Callbacks
21241		drag: null,
21242		start: null,
21243		stop: null
21244	},
21245	_create: function() {
21246
21247		if ( this.options.helper === "original" ) {
21248			this._setPositionRelative();
21249		}
21250		if ( this.options.addClasses ) {
21251			this._addClass( "ui-draggable" );
21252		}
21253		this._setHandleClassName();
21254
21255		this._mouseInit();
21256	},
21257
21258	_setOption: function( key, value ) {
21259		this._super( key, value );
21260		if ( key === "handle" ) {
21261			this._removeHandleClassName();
21262			this._setHandleClassName();
21263		}
21264	},
21265
21266	_destroy: function() {
21267		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
21268			this.destroyOnClear = true;
21269			return;
21270		}
21271		this._removeHandleClassName();
21272		this._mouseDestroy();
21273	},
21274
21275	_mouseCapture: function( event ) {
21276		var o = this.options;
21277
21278		// Among others, prevent a drag on a resizable-handle
21279		if ( this.helper || o.disabled ||
21280				$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
21281			return false;
21282		}
21283
21284		//Quit if we're not on a valid handle
21285		this.handle = this._getHandle( event );
21286		if ( !this.handle ) {
21287			return false;
21288		}
21289
21290		this._blurActiveElement( event );
21291
21292		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
21293
21294		return true;
21295
21296	},
21297
21298	_blockFrames: function( selector ) {
21299		this.iframeBlocks = this.document.find( selector ).map( function() {
21300			var iframe = $( this );
21301
21302			return $( "<div>" )
21303				.css( "position", "absolute" )
21304				.appendTo( iframe.parent() )
21305				.outerWidth( iframe.outerWidth() )
21306				.outerHeight( iframe.outerHeight() )
21307				.offset( iframe.offset() )[ 0 ];
21308		} );
21309	},
21310
21311	_unblockFrames: function() {
21312		if ( this.iframeBlocks ) {
21313			this.iframeBlocks.remove();
21314			delete this.iframeBlocks;
21315		}
21316	},
21317
21318	_blurActiveElement: function( event ) {
21319		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
21320			target = $( event.target );
21321
21322		// Don't blur if the event occurred on an element that is within
21323		// the currently focused element
21324		// See #10527, #12472
21325		if ( target.closest( activeElement ).length ) {
21326			return;
21327		}
21328
21329		// Blur any element that currently has focus, see #4261
21330		$.ui.safeBlur( activeElement );
21331	},
21332
21333	_mouseStart: function( event ) {
21334
21335		var o = this.options;
21336
21337		//Create and append the visible helper
21338		this.helper = this._createHelper( event );
21339
21340		this._addClass( this.helper, "ui-draggable-dragging" );
21341
21342		//Cache the helper size
21343		this._cacheHelperProportions();
21344
21345		//If ddmanager is used for droppables, set the global draggable
21346		if ( $.ui.ddmanager ) {
21347			$.ui.ddmanager.current = this;
21348		}
21349
21350		/*
21351		 * - Position generation -
21352		 * This block generates everything position related - it's the core of draggables.
21353		 */
21354
21355		//Cache the margins of the original element
21356		this._cacheMargins();
21357
21358		//Store the helper's css position
21359		this.cssPosition = this.helper.css( "position" );
21360		this.scrollParent = this.helper.scrollParent( true );
21361		this.offsetParent = this.helper.offsetParent();
21362		this.hasFixedAncestor = this.helper.parents().filter( function() {
21363				return $( this ).css( "position" ) === "fixed";
21364			} ).length > 0;
21365
21366		//The element's absolute position on the page minus margins
21367		this.positionAbs = this.element.offset();
21368		this._refreshOffsets( event );
21369
21370		//Generate the original position
21371		this.originalPosition = this.position = this._generatePosition( event, false );
21372		this.originalPageX = event.pageX;
21373		this.originalPageY = event.pageY;
21374
21375		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
21376		if ( o.cursorAt ) {
21377			this._adjustOffsetFromHelper( o.cursorAt );
21378		}
21379
21380		//Set a containment if given in the options
21381		this._setContainment();
21382
21383		//Trigger event + callbacks
21384		if ( this._trigger( "start", event ) === false ) {
21385			this._clear();
21386			return false;
21387		}
21388
21389		//Recache the helper size
21390		this._cacheHelperProportions();
21391
21392		//Prepare the droppable offsets
21393		if ( $.ui.ddmanager && !o.dropBehaviour ) {
21394			$.ui.ddmanager.prepareOffsets( this, event );
21395		}
21396
21397		// Execute the drag once - this causes the helper not to be visible before getting its
21398		// correct position
21399		this._mouseDrag( event, true );
21400
21401		// If the ddmanager is used for droppables, inform the manager that dragging has started
21402		// (see #5003)
21403		if ( $.ui.ddmanager ) {
21404			$.ui.ddmanager.dragStart( this, event );
21405		}
21406
21407		return true;
21408	},
21409
21410	_refreshOffsets: function( event ) {
21411		this.offset = {
21412			top: this.positionAbs.top - this.margins.top,
21413			left: this.positionAbs.left - this.margins.left,
21414			scroll: false,
21415			parent: this._getParentOffset(),
21416			relative: this._getRelativeOffset()
21417		};
21418
21419		this.offset.click = {
21420			left: event.pageX - this.offset.left,
21421			top: event.pageY - this.offset.top
21422		};
21423	},
21424
21425	_mouseDrag: function( event, noPropagation ) {
21426
21427		// reset any necessary cached properties (see #5009)
21428		if ( this.hasFixedAncestor ) {
21429			this.offset.parent = this._getParentOffset();
21430		}
21431
21432		//Compute the helpers position
21433		this.position = this._generatePosition( event, true );
21434		this.positionAbs = this._convertPositionTo( "absolute" );
21435
21436		//Call plugins and callbacks and use the resulting position if something is returned
21437		if ( !noPropagation ) {
21438			var ui = this._uiHash();
21439			if ( this._trigger( "drag", event, ui ) === false ) {
21440				this._mouseUp( new $.Event( "mouseup", event ) );
21441				return false;
21442			}
21443			this.position = ui.position;
21444		}
21445
21446		this.helper[ 0 ].style.left = this.position.left + "px";
21447		this.helper[ 0 ].style.top = this.position.top + "px";
21448
21449		if ( $.ui.ddmanager ) {
21450			$.ui.ddmanager.drag( this, event );
21451		}
21452
21453		return false;
21454	},
21455
21456	_mouseStop: function( event ) {
21457
21458		//If we are using droppables, inform the manager about the drop
21459		var that = this,
21460			dropped = false;
21461		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
21462			dropped = $.ui.ddmanager.drop( this, event );
21463		}
21464
21465		//if a drop comes from outside (a sortable)
21466		if ( this.dropped ) {
21467			dropped = this.dropped;
21468			this.dropped = false;
21469		}
21470
21471		if ( ( this.options.revert === "invalid" && !dropped ) ||
21472				( this.options.revert === "valid" && dropped ) ||
21473				this.options.revert === true || ( typeof this.options.revert === "function" &&
21474				this.options.revert.call( this.element, dropped ) )
21475		) {
21476			$( this.helper ).animate(
21477				this.originalPosition,
21478				parseInt( this.options.revertDuration, 10 ),
21479				function() {
21480					if ( that._trigger( "stop", event ) !== false ) {
21481						that._clear();
21482					}
21483				}
21484			);
21485		} else {
21486			if ( this._trigger( "stop", event ) !== false ) {
21487				this._clear();
21488			}
21489		}
21490
21491		return false;
21492	},
21493
21494	_mouseUp: function( event ) {
21495		this._unblockFrames();
21496
21497		// If the ddmanager is used for droppables, inform the manager that dragging has stopped
21498		// (see #5003)
21499		if ( $.ui.ddmanager ) {
21500			$.ui.ddmanager.dragStop( this, event );
21501		}
21502
21503		// Only need to focus if the event occurred on the draggable itself, see #10527
21504		if ( this.handleElement.is( event.target ) ) {
21505
21506			// The interaction is over; whether or not the click resulted in a drag,
21507			// focus the element
21508			this.element.trigger( "focus" );
21509		}
21510
21511		return $.ui.mouse.prototype._mouseUp.call( this, event );
21512	},
21513
21514	cancel: function() {
21515
21516		if ( this.helper.is( ".ui-draggable-dragging" ) ) {
21517			this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
21518		} else {
21519			this._clear();
21520		}
21521
21522		return this;
21523
21524	},
21525
21526	_getHandle: function( event ) {
21527		return this.options.handle ?
21528			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
21529			true;
21530	},
21531
21532	_setHandleClassName: function() {
21533		this.handleElement = this.options.handle ?
21534			this.element.find( this.options.handle ) : this.element;
21535		this._addClass( this.handleElement, "ui-draggable-handle" );
21536	},
21537
21538	_removeHandleClassName: function() {
21539		this._removeClass( this.handleElement, "ui-draggable-handle" );
21540	},
21541
21542	_createHelper: function( event ) {
21543
21544		var o = this.options,
21545			helperIsFunction = typeof o.helper === "function",
21546			helper = helperIsFunction ?
21547				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
21548				( o.helper === "clone" ?
21549					this.element.clone().removeAttr( "id" ) :
21550					this.element );
21551
21552		if ( !helper.parents( "body" ).length ) {
21553			helper.appendTo( ( o.appendTo === "parent" ?
21554				this.element[ 0 ].parentNode :
21555				o.appendTo ) );
21556		}
21557
21558		// 
21558Http
vendor: 25,991 bytes, lines 21558-22430
21558://bugs.jqueryui.com/ticket/9446
21559		// a helper function can return the original element
21560		// which wouldn't have been set to relative in _create
21561		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
21562			this._setPositionRelative();
21563		}
21564
21565		if ( helper[ 0 ] !== this.element[ 0 ] &&
21566				!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
21567			helper.css( "position", "absolute" );
21568		}
21569
21570		return helper;
21571
21572	},
21573
21574	_setPositionRelative: function() {
21575		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
21576			this.element[ 0 ].style.position = "relative";
21577		}
21578	},
21579
21580	_adjustOffsetFromHelper: function( obj ) {
21581		if ( typeof obj === "string" ) {
21582			obj = obj.split( " " );
21583		}
21584		if ( Array.isArray( obj ) ) {
21585			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
21586		}
21587		if ( "left" in obj ) {
21588			this.offset.click.left = obj.left + this.margins.left;
21589		}
21590		if ( "right" in obj ) {
21591			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
21592		}
21593		if ( "top" in obj ) {
21594			this.offset.click.top = obj.top + this.margins.top;
21595		}
21596		if ( "bottom" in obj ) {
21597			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
21598		}
21599	},
21600
21601	_isRootNode: function( element ) {
21602		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
21603	},
21604
21605	_getParentOffset: function() {
21606
21607		//Get the offsetParent and cache its position
21608		var po = this.offsetParent.offset(),
21609			document = this.document[ 0 ];
21610
21611		// This is a special case where we need to modify a offset calculated on start, since the
21612		// following happened:
21613		// 1. The position of the helper is absolute, so it's position is calculated based on the
21614		// next positioned parent
21615		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
21616		// the document, which means that the scroll is included in the initial calculation of the
21617		// offset of the parent, and never recalculated upon drag
21618		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
21619				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
21620			po.left += this.scrollParent.scrollLeft();
21621			po.top += this.scrollParent.scrollTop();
21622		}
21623
21624		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
21625			po = { top: 0, left: 0 };
21626		}
21627
21628		return {
21629			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
21630			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
21631		};
21632
21633	},
21634
21635	_getRelativeOffset: function() {
21636		if ( this.cssPosition !== "relative" ) {
21637			return { top: 0, left: 0 };
21638		}
21639
21640		var p = this.element.position(),
21641			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
21642
21643		return {
21644			top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
21645				( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
21646			left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
21647				( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
21648		};
21649
21650	},
21651
21652	_cacheMargins: function() {
21653		this.margins = {
21654			left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
21655			top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
21656			right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
21657			bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
21658		};
21659	},
21660
21661	_cacheHelperProportions: function() {
21662		this.helperProportions = {
21663			width: this.helper.outerWidth(),
21664			height: this.helper.outerHeight()
21665		};
21666	},
21667
21668	_setContainment: function() {
21669
21670		var isUserScrollable, c, ce,
21671			o = this.options,
21672			document = this.document[ 0 ];
21673
21674		this.relativeContainer = null;
21675
21676		if ( !o.containment ) {
21677			this.containment = null;
21678			return;
21679		}
21680
21681		if ( o.containment === "window" ) {
21682			this.containment = [
21683				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
21684				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
21685				$( window ).scrollLeft() + $( window ).width() -
21686					this.helperProportions.width - this.margins.left,
21687				$( window ).scrollTop() +
21688					( $( window ).height() || document.body.parentNode.scrollHeight ) -
21689					this.helperProportions.height - this.margins.top
21690			];
21691			return;
21692		}
21693
21694		if ( o.containment === "document" ) {
21695			this.containment = [
21696				0,
21697				0,
21698				$( document ).width() - this.helperProportions.width - this.margins.left,
21699				( $( document ).height() || document.body.parentNode.scrollHeight ) -
21700					this.helperProportions.height - this.margins.top
21701			];
21702			return;
21703		}
21704
21705		if ( o.containment.constructor === Array ) {
21706			this.containment = o.containment;
21707			return;
21708		}
21709
21710		if ( o.containment === "parent" ) {
21711			o.containment = this.helper[ 0 ].parentNode;
21712		}
21713
21714		c = $( o.containment );
21715		ce = c[ 0 ];
21716
21717		if ( !ce ) {
21718			return;
21719		}
21720
21721		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
21722
21723		this.containment = [
21724			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
21725				( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
21726			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
21727				( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
21728			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
21729				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
21730				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
21731				this.helperProportions.width -
21732				this.margins.left -
21733				this.margins.right,
21734			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
21735				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
21736				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
21737				this.helperProportions.height -
21738				this.margins.top -
21739				this.margins.bottom
21740		];
21741		this.relativeContainer = c;
21742	},
21743
21744	_convertPositionTo: function( d, pos ) {
21745
21746		if ( !pos ) {
21747			pos = this.position;
21748		}
21749
21750		var mod = d === "absolute" ? 1 : -1,
21751			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
21752
21753		return {
21754			top: (
21755
21756				// The absolute mouse position
21757				pos.top	+
21758
21759				// Only for relative positioned nodes: Relative offset from element to offset parent
21760				this.offset.relative.top * mod +
21761
21762				// The offsetParent's offset without borders (offset + border)
21763				this.offset.parent.top * mod -
21764				( ( this.cssPosition === "fixed" ?
21765					-this.offset.scroll.top :
21766					( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
21767			),
21768			left: (
21769
21770				// The absolute mouse position
21771				pos.left +
21772
21773				// Only for relative positioned nodes: Relative offset from element to offset parent
21774				this.offset.relative.left * mod +
21775
21776				// The offsetParent's offset without borders (offset + border)
21777				this.offset.parent.left * mod	-
21778				( ( this.cssPosition === "fixed" ?
21779					-this.offset.scroll.left :
21780					( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
21781			)
21782		};
21783
21784	},
21785
21786	_generatePosition: function( event, constrainPosition ) {
21787
21788		var containment, co, top, left,
21789			o = this.options,
21790			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
21791			pageX = event.pageX,
21792			pageY = event.pageY;
21793
21794		// Cache the scroll
21795		if ( !scrollIsRootNode || !this.offset.scroll ) {
21796			this.offset.scroll = {
21797				top: this.scrollParent.scrollTop(),
21798				left: this.scrollParent.scrollLeft()
21799			};
21800		}
21801
21802		/*
21803		 * - Position constraining -
21804		 * Constrain the position to a mix of grid, containment.
21805		 */
21806
21807		// If we are not dragging yet, we won't check for options
21808		if ( constrainPosition ) {
21809			if ( this.containment ) {
21810				if ( this.relativeContainer ) {
21811					co = this.relativeContainer.offset();
21812					containment = [
21813						this.containment[ 0 ] + co.left,
21814						this.containment[ 1 ] + co.top,
21815						this.containment[ 2 ] + co.left,
21816						this.containment[ 3 ] + co.top
21817					];
21818				} else {
21819					containment = this.containment;
21820				}
21821
21822				if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
21823					pageX = containment[ 0 ] + this.offset.click.left;
21824				}
21825				if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
21826					pageY = containment[ 1 ] + this.offset.click.top;
21827				}
21828				if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
21829					pageX = containment[ 2 ] + this.offset.click.left;
21830				}
21831				if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
21832					pageY = containment[ 3 ] + this.offset.click.top;
21833				}
21834			}
21835
21836			if ( o.grid ) {
21837
21838				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
21839				// argument errors in IE (see ticket #6950)
21840				top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
21841					this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
21842				pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
21843					top - this.offset.click.top > containment[ 3 ] ) ?
21844						top :
21845						( ( top - this.offset.click.top >= containment[ 1 ] ) ?
21846							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
21847
21848				left = o.grid[ 0 ] ? this.originalPageX +
21849					Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
21850					this.originalPageX;
21851				pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
21852					left - this.offset.click.left > containment[ 2 ] ) ?
21853						left :
21854						( ( left - this.offset.click.left >= containment[ 0 ] ) ?
21855							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
21856			}
21857
21858			if ( o.axis === "y" ) {
21859				pageX = this.originalPageX;
21860			}
21861
21862			if ( o.axis === "x" ) {
21863				pageY = this.originalPageY;
21864			}
21865		}
21866
21867		return {
21868			top: (
21869
21870				// The absolute mouse position
21871				pageY -
21872
21873				// Click offset (relative to the element)
21874				this.offset.click.top -
21875
21876				// Only for relative positioned nodes: Relative offset from element to offset parent
21877				this.offset.relative.top -
21878
21879				// The offsetParent's offset without borders (offset + border)
21880				this.offset.parent.top +
21881				( this.cssPosition === "fixed" ?
21882					-this.offset.scroll.top :
21883					( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
21884			),
21885			left: (
21886
21887				// The absolute mouse position
21888				pageX -
21889
21890				// Click offset (relative to the element)
21891				this.offset.click.left -
21892
21893				// Only for relative positioned nodes: Relative offset from element to offset parent
21894				this.offset.relative.left -
21895
21896				// The offsetParent's offset without borders (offset + border)
21897				this.offset.parent.left +
21898				( this.cssPosition === "fixed" ?
21899					-this.offset.scroll.left :
21900					( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
21901			)
21902		};
21903
21904	},
21905
21906	_clear: function() {
21907		this._removeClass( this.helper, "ui-draggable-dragging" );
21908		if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
21909			this.helper.remove();
21910		}
21911		this.helper = null;
21912		this.cancelHelperRemoval = false;
21913		if ( this.destroyOnClear ) {
21914			this.destroy();
21915		}
21916	},
21917
21918	// From now on bulk stuff - mainly helpers
21919
21920	_trigger: function( type, event, ui ) {
21921		ui = ui || this._uiHash();
21922		$.ui.plugin.call( this, type, [ event, ui, this ], true );
21923
21924		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
21925		if ( /^(drag|start|stop)/.test( type ) ) {
21926			this.positionAbs = this._convertPositionTo( "absolute" );
21927			ui.offset = this.positionAbs;
21928		}
21929		return $.Widget.prototype._trigger.call( this, type, event, ui );
21930	},
21931
21932	plugins: {},
21933
21934	_uiHash: function() {
21935		return {
21936			helper: this.helper,
21937			position: this.position,
21938			originalPosition: this.originalPosition,
21939			offset: this.positionAbs
21940		};
21941	}
21942
21943} );
21944
21945$.ui.plugin.add( "draggable", "connectToSortable", {
21946	start: function( event, ui, draggable ) {
21947		var uiSortable = $.extend( {}, ui, {
21948			item: draggable.element
21949		} );
21950
21951		draggable.sortables = [];
21952		$( draggable.options.connectToSortable ).each( function() {
21953			var sortable = $( this ).sortable( "instance" );
21954
21955			if ( sortable && !sortable.options.disabled ) {
21956				draggable.sortables.push( sortable );
21957
21958				// RefreshPositions is called at drag start to refresh the containerCache
21959				// which is used in drag. This ensures it's initialized and synchronized
21960				// with any changes that might have happened on the page since initialization.
21961				sortable.refreshPositions();
21962				sortable._trigger( "activate", event, uiSortable );
21963			}
21964		} );
21965	},
21966	stop: function( event, ui, draggable ) {
21967		var uiSortable = $.extend( {}, ui, {
21968			item: draggable.element
21969		} );
21970
21971		draggable.cancelHelperRemoval = false;
21972
21973		$.each( draggable.sortables, function() {
21974			var sortable = this;
21975
21976			if ( sortable.isOver ) {
21977				sortable.isOver = 0;
21978
21979				// Allow this sortable to handle removing the helper
21980				draggable.cancelHelperRemoval = true;
21981				sortable.cancelHelperRemoval = false;
21982
21983				// Use _storedCSS To restore properties in the sortable,
21984				// as this also handles revert (#9675) since the draggable
21985				// may have modified them in unexpected ways (#8809)
21986				sortable._storedCSS = {
21987					position: sortable.placeholder.css( "position" ),
21988					top: sortable.placeholder.css( "top" ),
21989					left: sortable.placeholder.css( "left" )
21990				};
21991
21992				sortable._mouseStop( event );
21993
21994				// Once drag has ended, the sortable should return to using
21995				// its original helper, not the shared helper from draggable
21996				sortable.options.helper = sortable.options._helper;
21997			} else {
21998
21999				// Prevent this Sortable from removing the helper.
22000				// However, don't set the draggable to remove the helper
22001				// either as another connected Sortable may yet handle the removal.
22002				sortable.cancelHelperRemoval = true;
22003
22004				sortable._trigger( "deactivate", event, uiSortable );
22005			}
22006		} );
22007	},
22008	drag: function( event, ui, draggable ) {
22009		$.each( draggable.sortables, function() {
22010			var innermostIntersecting = false,
22011				sortable = this;
22012
22013			// Copy over variables that sortable's _intersectsWith uses
22014			sortable.positionAbs = draggable.positionAbs;
22015			sortable.helperProportions = draggable.helperProportions;
22016			sortable.offset.click = draggable.offset.click;
22017
22018			if ( sortable._intersectsWith( sortable.containerCache ) ) {
22019				innermostIntersecting = true;
22020
22021				$.each( draggable.sortables, function() {
22022
22023					// Copy over variables that sortable's _intersectsWith uses
22024					this.positionAbs = draggable.positionAbs;
22025					this.helperProportions = draggable.helperProportions;
22026					this.offset.click = draggable.offset.click;
22027
22028					if ( this !== sortable &&
22029							this._intersectsWith( this.containerCache ) &&
22030							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
22031						innermostIntersecting = false;
22032					}
22033
22034					return innermostIntersecting;
22035				} );
22036			}
22037
22038			if ( innermostIntersecting ) {
22039
22040				// If it intersects, we use a little isOver variable and set it once,
22041				// so that the move-in stuff gets fired only once.
22042				if ( !sortable.isOver ) {
22043					sortable.isOver = 1;
22044
22045					// Store draggable's parent in case we need to reappend to it later.
22046					draggable._parent = ui.helper.parent();
22047
22048					sortable.currentItem = ui.helper
22049						.appendTo( sortable.element )
22050						.data( "ui-sortable-item", true );
22051
22052					// Store helper option to later restore it
22053					sortable.options._helper = sortable.options.helper;
22054
22055					sortable.options.helper = function() {
22056						return ui.helper[ 0 ];
22057					};
22058
22059					// Fire the start events of the sortable with our passed browser event,
22060					// and our own helper (so it doesn't create a new one)
22061					event.target = sortable.currentItem[ 0 ];
22062					sortable._mouseCapture( event, true );
22063					sortable._mouseStart( event, true, true );
22064
22065					// Because the browser event is way off the new appended portlet,
22066					// modify necessary variables to reflect the changes
22067					sortable.offset.click.top = draggable.offset.click.top;
22068					sortable.offset.click.left = draggable.offset.click.left;
22069					sortable.offset.parent.left -= draggable.offset.parent.left -
22070						sortable.offset.parent.left;
22071					sortable.offset.parent.top -= draggable.offset.parent.top -
22072						sortable.offset.parent.top;
22073
22074					draggable._trigger( "toSortable", event );
22075
22076					// Inform draggable that the helper is in a valid drop zone,
22077					// used solely in the revert option to handle "valid/invalid".
22078					draggable.dropped = sortable.element;
22079
22080					// Need to refreshPositions of all sortables in the case that
22081					// adding to one sortable changes the location of the other sortables (#9675)
22082					$.each( draggable.sortables, function() {
22083						this.refreshPositions();
22084					} );
22085
22086					// Hack so receive/update callbacks work (mostly)
22087					draggable.currentItem = draggable.element;
22088					sortable.fromOutside = draggable;
22089				}
22090
22091				if ( sortable.currentItem ) {
22092					sortable._mouseDrag( event );
22093
22094					// Copy the sortable's position because the draggable's can potentially reflect
22095					// a relative position, while sortable is always absolute, which the dragged
22096					// element has now become. (#8809)
22097					ui.position = sortable.position;
22098				}
22099			} else {
22100
22101				// If it doesn't intersect with the sortable, and it intersected before,
22102				// we fake the drag stop of the sortable, but make sure it doesn't remove
22103				// the helper by using cancelHelperRemoval.
22104				if ( sortable.isOver ) {
22105
22106					sortable.isOver = 0;
22107					sortable.cancelHelperRemoval = true;
22108
22109					// Calling sortable's mouseStop would trigger a revert,
22110					// so revert must be temporarily false until after mouseStop is called.
22111					sortable.options._revert = sortable.options.revert;
22112					sortable.options.revert = false;
22113
22114					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
22115					sortable._mouseStop( event, true );
22116
22117					// Restore sortable behaviors that were modfied
22118					// when the draggable entered the sortable area (#9481)
22119					sortable.options.revert = sortable.options._revert;
22120					sortable.options.helper = sortable.options._helper;
22121
22122					if ( sortable.placeholder ) {
22123						sortable.placeholder.remove();
22124					}
22125
22126					// Restore and recalculate the draggable's offset considering the sortable
22127					// may have modified them in unexpected ways. (#8809, #10669)
22128					ui.helper.appendTo( draggable._parent );
22129					draggable._refreshOffsets( event );
22130					ui.position = draggable._generatePosition( event, true );
22131
22132					draggable._trigger( "fromSortable", event );
22133
22134					// Inform draggable that the helper is no longer in a valid drop zone
22135					draggable.dropped = false;
22136
22137					// Need to refreshPositions of all sortables just in case removing
22138					// from one sortable changes the location of other sortables (#9675)
22139					$.each( draggable.sortables, function() {
22140						this.refreshPositions();
22141					} );
22142				}
22143			}
22144		} );
22145	}
22146} );
22147
22148$.ui.plugin.add( "draggable", "cursor", {
22149	start: function( event, ui, instance ) {
22150		var t = $( "body" ),
22151			o = instance.options;
22152
22153		if ( t.css( "cursor" ) ) {
22154			o._cursor = t.css( "cursor" );
22155		}
22156		t.css( "cursor", o.cursor );
22157	},
22158	stop: function( event, ui, instance ) {
22159		var o = instance.options;
22160		if ( o._cursor ) {
22161			$( "body" ).css( "cursor", o._cursor );
22162		}
22163	}
22164} );
22165
22166$.ui.plugin.add( "draggable", "opacity", {
22167	start: function( event, ui, instance ) {
22168		var t = $( ui.helper ),
22169			o = instance.options;
22170		if ( t.css( "opacity" ) ) {
22171			o._opacity = t.css( "opacity" );
22172		}
22173		t.css( "opacity", o.opacity );
22174	},
22175	stop: function( event, ui, instance ) {
22176		var o = instance.options;
22177		if ( o._opacity ) {
22178			$( ui.helper ).css( "opacity", o._opacity );
22179		}
22180	}
22181} );
22182
22183$.ui.plugin.add( "draggable", "scroll", {
22184	start: function( event, ui, i ) {
22185		if ( !i.scrollParentNotHidden ) {
22186			i.scrollParentNotHidden = i.helper.scrollParent( false );
22187		}
22188
22189		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
22190				i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
22191			i.overflowOffset = i.scrollParentNotHidden.offset();
22192		}
22193	},
22194	drag: function( event, ui, i  ) {
22195
22196		var o = i.options,
22197			scrolled = false,
22198			scrollParent = i.scrollParentNotHidden[ 0 ],
22199			document = i.document[ 0 ];
22200
22201		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
22202			if ( !o.axis || o.axis !== "x" ) {
22203				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
22204						o.scrollSensitivity ) {
22205					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
22206				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
22207					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
22208				}
22209			}
22210
22211			if ( !o.axis || o.axis !== "y" ) {
22212				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
22213						o.scrollSensitivity ) {
22214					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
22215				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
22216					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
22217				}
22218			}
22219
22220		} else {
22221
22222			if ( !o.axis || o.axis !== "x" ) {
22223				if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
22224					scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
22225				} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
22226						o.scrollSensitivity ) {
22227					scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
22228				}
22229			}
22230
22231			if ( !o.axis || o.axis !== "y" ) {
22232				if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
22233					scrolled = $( document ).scrollLeft(
22234						$( document ).scrollLeft() - o.scrollSpeed
22235					);
22236				} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
22237						o.scrollSensitivity ) {
22238					scrolled = $( document ).scrollLeft(
22239						$( document ).scrollLeft() + o.scrollSpeed
22240					);
22241				}
22242			}
22243
22244		}
22245
22246		if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
22247			$.ui.ddmanager.prepareOffsets( i, event );
22248		}
22249
22250	}
22251} );
22252
22253$.ui.plugin.add( "draggable", "snap", {
22254	start: function( event, ui, i ) {
22255
22256		var o = i.options;
22257
22258		i.snapElements = [];
22259
22260		$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
22261			.each( function() {
22262				var $t = $( this ),
22263					$o = $t.offset();
22264				if ( this !== i.element[ 0 ] ) {
22265					i.snapElements.push( {
22266						item: this,
22267						width: $t.outerWidth(), height: $t.outerHeight(),
22268						top: $o.top, left: $o.left
22269					} );
22270				}
22271			} );
22272
22273	},
22274	drag: function( event, ui, inst ) {
22275
22276		var ts, bs, ls, rs, l, r, t, b, i, first,
22277			o = inst.options,
22278			d = o.snapTolerance,
22279			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
22280			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
22281
22282		for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
22283
22284			l = inst.snapElements[ i ].left - inst.margins.left;
22285			r = l + inst.snapElements[ i ].width;
22286			t = inst.snapElements[ i ].top - inst.margins.top;
22287			b = t + inst.snapElements[ i ].height;
22288
22289			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
22290					!$.contains( inst.snapElements[ i ].item.ownerDocument,
22291					inst.snapElements[ i ].item ) ) {
22292				if ( inst.snapElements[ i ].snapping ) {
22293					if ( inst.options.snap.release ) {
22294						inst.options.snap.release.call(
22295							inst.element,
22296							event,
22297							$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
22298						);
22299					}
22300				}
22301				inst.snapElements[ i ].snapping = false;
22302				continue;
22303			}
22304
22305			if ( o.snapMode !== "inner" ) {
22306				ts = Math.abs( t - y2 ) <= d;
22307				bs = Math.abs( b - y1 ) <= d;
22308				ls = Math.abs( l - x2 ) <= d;
22309				rs = Math.abs( r - x1 ) <= d;
22310				if ( ts ) {
22311					ui.position.top = inst._convertPositionTo( "relative", {
22312						top: t - inst.helperProportions.height,
22313						left: 0
22314					} ).top;
22315				}
22316				if ( bs ) {
22317					ui.position.top = inst._convertPositionTo( "relative", {
22318						top: b,
22319						left: 0
22320					} ).top;
22321				}
22322				if ( ls ) {
22323					ui.position.left = inst._convertPositionTo( "relative", {
22324						top: 0,
22325						left: l - inst.helperProportions.width
22326					} ).left;
22327				}
22328				if ( rs ) {
22329					ui.position.left = inst._convertPositionTo( "relative", {
22330						top: 0,
22331						left: r
22332					} ).left;
22333				}
22334			}
22335
22336			first = ( ts || bs || ls || rs );
22337
22338			if ( o.snapMode !== "outer" ) {
22339				ts = Math.abs( t - y1 ) <= d;
22340				bs = Math.abs( b - y2 ) <= d;
22341				ls = Math.abs( l - x1 ) <= d;
22342				rs = Math.abs( r - x2 ) <= d;
22343				if ( ts ) {
22344					ui.position.top = inst._convertPositionTo( "relative", {
22345						top: t,
22346						left: 0
22347					} ).top;
22348				}
22349				if ( bs ) {
22350					ui.position.top = inst._convertPositionTo( "relative", {
22351						top: b - inst.helperProportions.height,
22352						left: 0
22353					} ).top;
22354				}
22355				if ( ls ) {
22356					ui.position.left = inst._convertPositionTo( "relative", {
22357						top: 0,
22358						left: l
22359					} ).left;
22360				}
22361				if ( rs ) {
22362					ui.position.left = inst._convertPositionTo( "relative", {
22363						top: 0,
22364						left: r - inst.helperProportions.width
22365					} ).left;
22366				}
22367			}
22368
22369			if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
22370				if ( inst.options.snap.snap ) {
22371					inst.options.snap.snap.call(
22372						inst.element,
22373						event,
22374						$.extend( inst._uiHash(), {
22375							snapItem: inst.snapElements[ i ].item
22376						} ) );
22377				}
22378			}
22379			inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
22380
22381		}
22382
22383	}
22384} );
22385
22386$.ui.plugin.add( "draggable", "stack", {
22387	start: function( event, ui, instance ) {
22388		var min,
22389			o = instance.options,
22390			group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
22391				return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
22392					( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
22393			} );
22394
22395		if ( !group.length ) {
22396			return;
22397		}
22398
22399		min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
22400		$( group ).each( function( i ) {
22401			$( this ).css( "zIndex", min + i );
22402		} );
22403		this.css( "zIndex", ( min + group.length ) );
22404	}
22405} );
22406
22407$.ui.plugin.add( "draggable", "zIndex", {
22408	start: function( event, ui, instance ) {
22409		var t = $( ui.helper ),
22410			o = instance.options;
22411
22412		if ( t.css( "zIndex" ) ) {
22413			o._zIndex = t.css( "zIndex" );
22414		}
22415		t.css( "zIndex", o.zIndex );
22416	},
22417	stop: function( event, ui, instance ) {
22418		var o = instance.options;
22419
22420		if ( o._zIndex ) {
22421			$( ui.helper ).css( "zIndex", o._zIndex );
22422		}
22423	}
22424} );
22425
22426var widgetsDraggable = $.ui.draggable;
22427
22428
22429/*!
22430 * jQuery UI Resizable 1.13.
224302
22431 * http://jqueryui.com
22432 *
22433 * Copyright jQuery Foundation and other contributors
22434 * Released under the MIT license.
22435 * http://jquery.org/license
22436 */
22437
22438//>>label: Resizable
22439//>>group: Interactions
22440//>>description: Enables resize functionality for any element.
22441//>>docs: http://api.jqueryui.com/resizable/
22442//>>demos: http://jqueryui.com/resizable/
22443//>>css.structure: ../../themes/base/core.css
22444//>>css.structure: ../../themes/base/resizable.css
22445//>>css.theme: ../../themes/base/theme.css
22446
22447
22448$.widget( "ui.resizable", $.ui.mouse, {
22449	version: "1.13.2
vendor: 11,739 bytes, lines 22449-22942
22449",
22450	widgetEventPrefix: "resize",
22451	options: {
22452		alsoResize: false,
22453		animate: false,
22454		animateDuration: "slow",
22455		animateEasing: "swing",
22456		aspectRatio: false,
22457		autoHide: false,
22458		classes: {
22459			"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
22460		},
22461		containment: false,
22462		ghost: false,
22463		grid: false,
22464		handles: "e,s,se",
22465		helper: false,
22466		maxHeight: null,
22467		maxWidth: null,
22468		minHeight: 10,
22469		minWidth: 10,
22470
22471		// See #7960
22472		zIndex: 90,
22473
22474		// Callbacks
22475		resize: null,
22476		start: null,
22477		stop: null
22478	},
22479
22480	_num: function( value ) {
22481		return parseFloat( value ) || 0;
22482	},
22483
22484	_isNumber: function( value ) {
22485		return !isNaN( parseFloat( value ) );
22486	},
22487
22488	_hasScroll: function( el, a ) {
22489
22490		if ( $( el ).css( "overflow" ) === "hidden" ) {
22491			return false;
22492		}
22493
22494		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
22495			has = false;
22496
22497		if ( el[ scroll ] > 0 ) {
22498			return true;
22499		}
22500
22501		// TODO: determine which cases actually cause this to happen
22502		// if the element doesn't have the scroll set, see if it's possible to
22503		// set the scroll
22504		try {
22505			el[ scroll ] = 1;
22506			has = ( el[ scroll ] > 0 );
22507			el[ scroll ] = 0;
22508		} catch ( e ) {
22509
22510			// `el` might be a string, then setting `scroll` will throw
22511			// an error in strict mode; ignore it.
22512		}
22513		return has;
22514	},
22515
22516	_create: function() {
22517
22518		var margins,
22519			o = this.options,
22520			that = this;
22521		this._addClass( "ui-resizable" );
22522
22523		$.extend( this, {
22524			_aspectRatio: !!( o.aspectRatio ),
22525			aspectRatio: o.aspectRatio,
22526			originalElement: this.element,
22527			_proportionallyResizeElements: [],
22528			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
22529		} );
22530
22531		// Wrap the element if it cannot hold child nodes
22532		if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
22533
22534			this.element.wrap(
22535				$( "<div class='ui-wrapper'></div>" ).css( {
22536					overflow: "hidden",
22537					position: this.element.css( "position" ),
22538					width: this.element.outerWidth(),
22539					height: this.element.outerHeight(),
22540					top: this.element.css( "top" ),
22541					left: this.element.css( "left" )
22542				} )
22543			);
22544
22545			this.element = this.element.parent().data(
22546				"ui-resizable", this.element.resizable( "instance" )
22547			);
22548
22549			this.elementIsWrapper = true;
22550
22551			margins = {
22552				marginTop: this.originalElement.css( "marginTop" ),
22553				marginRight: this.originalElement.css( "marginRight" ),
22554				marginBottom: this.originalElement.css( "marginBottom" ),
22555				marginLeft: this.originalElement.css( "marginLeft" )
22556			};
22557
22558			this.element.css( margins );
22559			this.originalElement.css( "margin", 0 );
22560
22561			// support: Safari
22562			// Prevent Safari textarea resize
22563			this.originalResizeStyle = this.originalElement.css( "resize" );
22564			this.originalElement.css( "resize", "none" );
22565
22566			this._proportionallyResizeElements.push( this.originalElement.css( {
22567				position: "static",
22568				zoom: 1,
22569				display: "block"
22570			} ) );
22571
22572			// Support: IE9
22573			// avoid IE jump (hard set the margin)
22574			this.originalElement.css( margins );
22575
22576			this._proportionallyResize();
22577		}
22578
22579		this._setupHandles();
22580
22581		if ( o.autoHide ) {
22582			$( this.element )
22583				.on( "mouseenter", function() {
22584					if ( o.disabled ) {
22585						return;
22586					}
22587					that._removeClass( "ui-resizable-autohide" );
22588					that._handles.show();
22589				} )
22590				.on( "mouseleave", function() {
22591					if ( o.disabled ) {
22592						return;
22593					}
22594					if ( !that.resizing ) {
22595						that._addClass( "ui-resizable-autohide" );
22596						that._handles.hide();
22597					}
22598				} );
22599		}
22600
22601		this._mouseInit();
22602	},
22603
22604	_destroy: function() {
22605
22606		this._mouseDestroy();
22607		this._addedHandles.remove();
22608
22609		var wrapper,
22610			_destroy = function( exp ) {
22611				$( exp )
22612					.removeData( "resizable" )
22613					.removeData( "ui-resizable" )
22614					.off( ".resizable" );
22615			};
22616
22617		// TODO: Unwrap at same DOM position
22618		if ( this.elementIsWrapper ) {
22619			_destroy( this.element );
22620			wrapper = this.element;
22621			this.originalElement.css( {
22622				position: wrapper.css( "position" ),
22623				width: wrapper.outerWidth(),
22624				height: wrapper.outerHeight(),
22625				top: wrapper.css( "top" ),
22626				left: wrapper.css( "left" )
22627			} ).insertAfter( wrapper );
22628			wrapper.remove();
22629		}
22630
22631		this.originalElement.css( "resize", this.originalResizeStyle );
22632		_destroy( this.originalElement );
22633
22634		return this;
22635	},
22636
22637	_setOption: function( key, value ) {
22638		this._super( key, value );
22639
22640		switch ( key ) {
22641		case "handles":
22642			this._removeHandles();
22643			this._setupHandles();
22644			break;
22645		case "aspectRatio":
22646			this._aspectRatio = !!value;
22647			break;
22648		default:
22649			break;
22650		}
22651	},
22652
22653	_setupHandles: function() {
22654		var o = this.options, handle, i, n, hname, axis, that = this;
22655		this.handles = o.handles ||
22656			( !$( ".ui-resizable-handle", this.element ).length ?
22657				"e,s,se" : {
22658					n: ".ui-resizable-n",
22659					e: ".ui-resizable-e",
22660					s: ".ui-resizable-s",
22661					w: ".ui-resizable-w",
22662					se: ".ui-resizable-se",
22663					sw: ".ui-resizable-sw",
22664					ne: ".ui-resizable-ne",
22665					nw: ".ui-resizable-nw"
22666				} );
22667
22668		this._handles = $();
22669		this._addedHandles = $();
22670		if ( this.handles.constructor === String ) {
22671
22672			if ( this.handles === "all" ) {
22673				this.handles = "n,e,s,w,se,sw,ne,nw";
22674			}
22675
22676			n = this.handles.split( "," );
22677			this.handles = {};
22678
22679			for ( i = 0; i < n.length; i++ ) {
22680
22681				handle = String.prototype.trim.call( n[ i ] );
22682				hname = "ui-resizable-" + handle;
22683				axis = $( "<div>" );
22684				this._addClass( axis, "ui-resizable-handle " + hname );
22685
22686				axis.css( { zIndex: o.zIndex } );
22687
22688				this.handles[ handle ] = ".ui-resizable-" + handle;
22689				if ( !this.element.children( this.handles[ handle ] ).length ) {
22690					this.element.append( axis );
22691					this._addedHandles = this._addedHandles.add( axis );
22692				}
22693			}
22694
22695		}
22696
22697		this._renderAxis = function( target ) {
22698
22699			var i, axis, padPos, padWrapper;
22700
22701			target = target || this.element;
22702
22703			for ( i in this.handles ) {
22704
22705				if ( this.handles[ i ].constructor === String ) {
22706					this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
22707				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
22708					this.handles[ i ] = $( this.handles[ i ] );
22709					this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
22710				}
22711
22712				if ( this.elementIsWrapper &&
22713						this.originalElement[ 0 ]
22714							.nodeName
22715							.match( /^(textarea|input|select|button)$/i ) ) {
22716					axis = $( this.handles[ i ], this.element );
22717
22718					padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
22719						axis.outerHeight() :
22720						axis.outerWidth();
22721
22722					padPos = [ "padding",
22723						/ne|nw|n/.test( i ) ? "Top" :
22724						/se|sw|s/.test( i ) ? "Bottom" :
22725						/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
22726
22727					target.css( padPos, padWrapper );
22728
22729					this._proportionallyResize();
22730				}
22731
22732				this._handles = this._handles.add( this.handles[ i ] );
22733			}
22734		};
22735
22736		// TODO: make renderAxis a prototype function
22737		this._renderAxis( this.element );
22738
22739		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
22740		this._handles.disableSelection();
22741
22742		this._handles.on( "mouseover", function() {
22743			if ( !that.resizing ) {
22744				if ( this.className ) {
22745					axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
22746				}
22747				that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
22748			}
22749		} );
22750
22751		if ( o.autoHide ) {
22752			this._handles.hide();
22753			this._addClass( "ui-resizable-autohide" );
22754		}
22755	},
22756
22757	_removeHandles: function() {
22758		this._addedHandles.remove();
22759	},
22760
22761	_mouseCapture: function( event ) {
22762		var i, handle,
22763			capture = false;
22764
22765		for ( i in this.handles ) {
22766			handle = $( this.handles[ i ] )[ 0 ];
22767			if ( handle === event.target || $.contains( handle, event.target ) ) {
22768				capture = true;
22769			}
22770		}
22771
22772		return !this.options.disabled && capture;
22773	},
22774
22775	_mouseStart: function( event ) {
22776
22777		var curleft, curtop, cursor,
22778			o = this.options,
22779			el = this.element;
22780
22781		this.resizing = true;
22782
22783		this._renderProxy();
22784
22785		curleft = this._num( this.helper.css( "left" ) );
22786		curtop = this._num( this.helper.css( "top" ) );
22787
22788		if ( o.containment ) {
22789			curleft += $( o.containment ).scrollLeft() || 0;
22790			curtop += $( o.containment ).scrollTop() || 0;
22791		}
22792
22793		this.offset = this.helper.offset();
22794		this.position = { left: curleft, top: curtop };
22795
22796		this.size = this._helper ? {
22797				width: this.helper.width(),
22798				height: this.helper.height()
22799			} : {
22800				width: el.width(),
22801				height: el.height()
22802			};
22803
22804		this.originalSize = this._helper ? {
22805				width: el.outerWidth(),
22806				height: el.outerHeight()
22807			} : {
22808				width: el.width(),
22809				height: el.height()
22810			};
22811
22812		this.sizeDiff = {
22813			width: el.outerWidth() - el.width(),
22814			height: el.outerHeight() - el.height()
22815		};
22816
22817		this.originalPosition = { left: curleft, top: curtop };
22818		this.originalMousePosition = { left: event.pageX, top: event.pageY };
22819
22820		this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
22821			o.aspectRatio :
22822			( ( this.originalSize.width / this.originalSize.height ) || 1 );
22823
22824		cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
22825		$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
22826
22827		this._addClass( "ui-resizable-resizing" );
22828		this._propagate( "start", event );
22829		return true;
22830	},
22831
22832	_mouseDrag: function( event ) {
22833
22834		var data, props,
22835			smp = this.originalMousePosition,
22836			a = this.axis,
22837			dx = ( event.pageX - smp.left ) || 0,
22838			dy = ( event.pageY - smp.top ) || 0,
22839			trigger = this._change[ a ];
22840
22841		this._updatePrevProperties();
22842
22843		if ( !trigger ) {
22844			return false;
22845		}
22846
22847		data = trigger.apply( this, [ event, dx, dy ] );
22848
22849		this._updateVirtualBoundaries( event.shiftKey );
22850		if ( this._aspectRatio || event.shiftKey ) {
22851			data = this._updateRatio( data, event );
22852		}
22853
22854		data = this._respectSize( data, event );
22855
22856		this._updateCache( data );
22857
22858		this._propagate( "resize", event );
22859
22860		props = this._applyChanges();
22861
22862		if ( !this._helper && this._proportionallyResizeElements.length ) {
22863			this._proportionallyResize();
22864		}
22865
22866		if ( !$.isEmptyObject( props ) ) {
22867			this._updatePrevProperties();
22868			this._trigger( "resize", event, this.ui() );
22869			this._applyChanges();
22870		}
22871
22872		return false;
22873	},
22874
22875	_mouseStop: function( event ) {
22876
22877		this.resizing = false;
22878		var pr, ista, soffseth, soffsetw, s, left, top,
22879			o = this.options, that = this;
22880
22881		if ( this._helper ) {
22882
22883			pr = this._proportionallyResizeElements;
22884			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
22885			soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
22886			soffsetw = ista ? 0 : that.sizeDiff.width;
22887
22888			s = {
22889				width: ( that.helper.width()  - soffsetw ),
22890				height: ( that.helper.height() - soffseth )
22891			};
22892			left = ( parseFloat( that.element.css( "left" ) ) +
22893				( that.position.left - that.originalPosition.left ) ) || null;
22894			top = ( parseFloat( that.element.css( "top" ) ) +
22895				( that.position.top - that.originalPosition.top ) ) || null;
22896
22897			if ( !o.animate ) {
22898				this.element.css( $.extend( s, { top: top, left: left } ) );
22899			}
22900
22901			that.helper.height( that.size.height );
22902			that.helper.width( that.size.width );
22903
22904			if ( this._helper && !o.animate ) {
22905				this._proportionallyResize();
22906			}
22907		}
22908
22909		$( "body" ).css( "cursor", "auto" );
22910
22911		this._removeClass( "ui-resizable-resizing" );
22912
22913		this._propagate( "stop", event );
22914
22915		if ( this._helper ) {
22916			this.helper.remove();
22917		}
22918
22919		return false;
22920
22921	},
22922
22923	_updatePrevProperties: function() {
22924		this.prevPosition = {
22925			top: this.position.top,
22926			left: this.position.left
22927		};
22928		this.prevSize = {
22929			width: this.size.width,
22930			height: this.size.height
22931		};
22932	},
22933
22934	_applyChanges: function() {
22935		var props = {};
22936
22937		if ( this.position.top !== this.prevPosition.top ) {
22938			props.top = this.position.top + "px";
22939		}
22940		if ( this.position.left !== this.prevPosition.left ) {
22941			props.left = this.position.left + "px";
22942		}
vendor: 9,533 bytes, lines 22943-23310
22943		if ( this.size.width !== this.prevSize.width ) {
22944			props.width = this.size.width + "px";
22945		}
22946		if ( this.size.height !== this.prevSize.height ) {
22947			props.height = this.size.height + "px";
22948		}
22949
22950		this.helper.css( props );
22951
22952		return props;
22953	},
22954
22955	_updateVirtualBoundaries: function( forceAspectRatio ) {
22956		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
22957			o = this.options;
22958
22959		b = {
22960			minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
22961			maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
22962			minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
22963			maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
22964		};
22965
22966		if ( this._aspectRatio || forceAspectRatio ) {
22967			pMinWidth = b.minHeight * this.aspectRatio;
22968			pMinHeight = b.minWidth / this.aspectRatio;
22969			pMaxWidth = b.maxHeight * this.aspectRatio;
22970			pMaxHeight = b.maxWidth / this.aspectRatio;
22971
22972			if ( pMinWidth > b.minWidth ) {
22973				b.minWidth = pMinWidth;
22974			}
22975			if ( pMinHeight > b.minHeight ) {
22976				b.minHeight = pMinHeight;
22977			}
22978			if ( pMaxWidth < b.maxWidth ) {
22979				b.maxWidth = pMaxWidth;
22980			}
22981			if ( pMaxHeight < b.maxHeight ) {
22982				b.maxHeight = pMaxHeight;
22983			}
22984		}
22985		this._vBoundaries = b;
22986	},
22987
22988	_updateCache: function( data ) {
22989		this.offset = this.helper.offset();
22990		if ( this._isNumber( data.left ) ) {
22991			this.position.left = data.left;
22992		}
22993		if ( this._isNumber( data.top ) ) {
22994			this.position.top = data.top;
22995		}
22996		if ( this._isNumber( data.height ) ) {
22997			this.size.height = data.height;
22998		}
22999		if ( this._isNumber( data.width ) ) {
23000			this.size.width = data.width;
23001		}
23002	},
23003
23004	_updateRatio: function( data ) {
23005
23006		var cpos = this.position,
23007			csize = this.size,
23008			a = this.axis;
23009
23010		if ( this._isNumber( data.height ) ) {
23011			data.width = ( data.height * this.aspectRatio );
23012		} else if ( this._isNumber( data.width ) ) {
23013			data.height = ( data.width / this.aspectRatio );
23014		}
23015
23016		if ( a === "sw" ) {
23017			data.left = cpos.left + ( csize.width - data.width );
23018			data.top = null;
23019		}
23020		if ( a === "nw" ) {
23021			data.top = cpos.top + ( csize.height - data.height );
23022			data.left = cpos.left + ( csize.width - data.width );
23023		}
23024
23025		return data;
23026	},
23027
23028	_respectSize: function( data ) {
23029
23030		var o = this._vBoundaries,
23031			a = this.axis,
23032			ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
23033			ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
23034			isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
23035			isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
23036			dw = this.originalPosition.left + this.originalSize.width,
23037			dh = this.originalPosition.top + this.originalSize.height,
23038			cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
23039		if ( isminw ) {
23040			data.width = o.minWidth;
23041		}
23042		if ( isminh ) {
23043			data.height = o.minHeight;
23044		}
23045		if ( ismaxw ) {
23046			data.width = o.maxWidth;
23047		}
23048		if ( ismaxh ) {
23049			data.height = o.maxHeight;
23050		}
23051
23052		if ( isminw && cw ) {
23053			data.left = dw - o.minWidth;
23054		}
23055		if ( ismaxw && cw ) {
23056			data.left = dw - o.maxWidth;
23057		}
23058		if ( isminh && ch ) {
23059			data.top = dh - o.minHeight;
23060		}
23061		if ( ismaxh && ch ) {
23062			data.top = dh - o.maxHeight;
23063		}
23064
23065		// Fixing jump error on top/left - bug #2330
23066		if ( !data.width && !data.height && !data.left && data.top ) {
23067			data.top = null;
23068		} else if ( !data.width && !data.height && !data.top && data.left ) {
23069			data.left = null;
23070		}
23071
23072		return data;
23073	},
23074
23075	_getPaddingPlusBorderDimensions: function( element ) {
23076		var i = 0,
23077			widths = [],
23078			borders = [
23079				element.css( "borderTopWidth" ),
23080				element.css( "borderRightWidth" ),
23081				element.css( "borderBottomWidth" ),
23082				element.css( "borderLeftWidth" )
23083			],
23084			paddings = [
23085				element.css( "paddingTop" ),
23086				element.css( "paddingRight" ),
23087				element.css( "paddingBottom" ),
23088				element.css( "paddingLeft" )
23089			];
23090
23091		for ( ; i < 4; i++ ) {
23092			widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
23093			widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
23094		}
23095
23096		return {
23097			height: widths[ 0 ] + widths[ 2 ],
23098			width: widths[ 1 ] + widths[ 3 ]
23099		};
23100	},
23101
23102	_proportionallyResize: function() {
23103
23104		if ( !this._proportionallyResizeElements.length ) {
23105			return;
23106		}
23107
23108		var prel,
23109			i = 0,
23110			element = this.helper || this.element;
23111
23112		for ( ; i < this._proportionallyResizeElements.length; i++ ) {
23113
23114			prel = this._proportionallyResizeElements[ i ];
23115
23116			// TODO: Seems like a bug to cache this.outerDimensions
23117			// considering that we are in a loop.
23118			if ( !this.outerDimensions ) {
23119				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
23120			}
23121
23122			prel.css( {
23123				height: ( element.height() - this.outerDimensions.height ) || 0,
23124				width: ( element.width() - this.outerDimensions.width ) || 0
23125			} );
23126
23127		}
23128
23129	},
23130
23131	_renderProxy: function() {
23132
23133		var el = this.element, o = this.options;
23134		this.elementOffset = el.offset();
23135
23136		if ( this._helper ) {
23137
23138			this.helper = this.helper || $( "<div></div>" ).css( { overflow: "hidden" } );
23139
23140			this._addClass( this.helper, this._helper );
23141			this.helper.css( {
23142				width: this.element.outerWidth(),
23143				height: this.element.outerHeight(),
23144				position: "absolute",
23145				left: this.elementOffset.left + "px",
23146				top: this.elementOffset.top + "px",
23147				zIndex: ++o.zIndex //TODO: Don't modify option
23148			} );
23149
23150			this.helper
23151				.appendTo( "body" )
23152				.disableSelection();
23153
23154		} else {
23155			this.helper = this.element;
23156		}
23157
23158	},
23159
23160	_change: {
23161		e: function( event, dx ) {
23162			return { width: this.originalSize.width + dx };
23163		},
23164		w: function( event, dx ) {
23165			var cs = this.originalSize, sp = this.originalPosition;
23166			return { left: sp.left + dx, width: cs.width - dx };
23167		},
23168		n: function( event, dx, dy ) {
23169			var cs = this.originalSize, sp = this.originalPosition;
23170			return { top: sp.top + dy, height: cs.height - dy };
23171		},
23172		s: function( event, dx, dy ) {
23173			return { height: this.originalSize.height + dy };
23174		},
23175		se: function( event, dx, dy ) {
23176			return $.extend( this._change.s.apply( this, arguments ),
23177				this._change.e.apply( this, [ event, dx, dy ] ) );
23178		},
23179		sw: function( event, dx, dy ) {
23180			return $.extend( this._change.s.apply( this, arguments ),
23181				this._change.w.apply( this, [ event, dx, dy ] ) );
23182		},
23183		ne: function( event, dx, dy ) {
23184			return $.extend( this._change.n.apply( this, arguments ),
23185				this._change.e.apply( this, [ event, dx, dy ] ) );
23186		},
23187		nw: function( event, dx, dy ) {
23188			return $.extend( this._change.n.apply( this, arguments ),
23189				this._change.w.apply( this, [ event, dx, dy ] ) );
23190		}
23191	},
23192
23193	_propagate: function( n, event ) {
23194		$.ui.plugin.call( this, n, [ event, this.ui() ] );
23195		if ( n !== "resize" ) {
23196			this._trigger( n, event, this.ui() );
23197		}
23198	},
23199
23200	plugins: {},
23201
23202	ui: function() {
23203		return {
23204			originalElement: this.originalElement,
23205			element: this.element,
23206			helper: this.helper,
23207			position: this.position,
23208			size: this.size,
23209			originalSize: this.originalSize,
23210			originalPosition: this.originalPosition
23211		};
23212	}
23213
23214} );
23215
23216/*
23217 * Resizable Extensions
23218 */
23219
23220$.ui.plugin.add( "resizable", "animate", {
23221
23222	stop: function( event ) {
23223		var that = $( this ).resizable( "instance" ),
23224			o = that.options,
23225			pr = that._proportionallyResizeElements,
23226			ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
23227			soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
23228			soffsetw = ista ? 0 : that.sizeDiff.width,
23229			style = {
23230				width: ( that.size.width - soffsetw ),
23231				height: ( that.size.height - soffseth )
23232			},
23233			left = ( parseFloat( that.element.css( "left" ) ) +
23234				( that.position.left - that.originalPosition.left ) ) || null,
23235			top = ( parseFloat( that.element.css( "top" ) ) +
23236				( that.position.top - that.originalPosition.top ) ) || null;
23237
23238		that.element.animate(
23239			$.extend( style, top && left ? { top: top, left: left } : {} ), {
23240				duration: o.animateDuration,
23241				easing: o.animateEasing,
23242				step: function() {
23243
23244					var data = {
23245						width: parseFloat( that.element.css( "width" ) ),
23246						height: parseFloat( that.element.css( "height" ) ),
23247						top: parseFloat( that.element.css( "top" ) ),
23248						left: parseFloat( that.element.css( "left" ) )
23249					};
23250
23251					if ( pr && pr.length ) {
23252						$( pr[ 0 ] ).css( { width: data.width, height: data.height } );
23253					}
23254
23255					// Propagating resize, and updating values for each animation step
23256					that._updateCache( data );
23257					that._propagate( "resize", event );
23258
23259				}
23260			}
23261		);
23262	}
23263
23264} );
23265
23266$.ui.plugin.add( "resizable", "containment", {
23267
23268	start: function() {
23269		var element, p, co, ch, cw, width, height,
23270			that = $( this ).resizable( "instance" ),
23271			o = that.options,
23272			el = that.element,
23273			oc = o.containment,
23274			ce = ( oc instanceof $ ) ?
23275				oc.get( 0 ) :
23276				( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
23277
23278		if ( !ce ) {
23279			return;
23280		}
23281
23282		that.containerElement = $( ce );
23283
23284		if ( /document/.test( oc ) || oc === document ) {
23285			that.containerOffset = {
23286				left: 0,
23287				top: 0
23288			};
23289			that.containerPosition = {
23290				left: 0,
23291				top: 0
23292			};
23293
23294			that.parentData = {
23295				element: $( document ),
23296				left: 0,
23297				top: 0,
23298				width: $( document ).width(),
23299				height: $( document ).height() || document.body.parentNode.scrollHeight
23300			};
23301		} else {
23302			element = $( ce );
23303			p = [];
23304			$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
23305				p[ i ] = that._num( element.css( "padding" + name ) );
23306			} );
23307
23308			that.containerOffset = element.offset();
23309			that.containerPosition = element.position();
23310			that.containerSize = {
vendor: 5,871 bytes, lines 23311-23535
23311				height: ( element.innerHeight() - p[ 3 ] ),
23312				width: ( element.innerWidth() - p[ 1 ] )
23313			};
23314
23315			co = that.containerOffset;
23316			ch = that.containerSize.height;
23317			cw = that.containerSize.width;
23318			width = ( that._hasScroll( ce, "left" ) ? ce.scrollWidth : cw );
23319			height = ( that._hasScroll( ce ) ? ce.scrollHeight : ch );
23320
23321			that.parentData = {
23322				element: ce,
23323				left: co.left,
23324				top: co.top,
23325				width: width,
23326				height: height
23327			};
23328		}
23329	},
23330
23331	resize: function( event ) {
23332		var woset, hoset, isParent, isOffsetRelative,
23333			that = $( this ).resizable( "instance" ),
23334			o = that.options,
23335			co = that.containerOffset,
23336			cp = that.position,
23337			pRatio = that._aspectRatio || event.shiftKey,
23338			cop = {
23339				top: 0,
23340				left: 0
23341			},
23342			ce = that.containerElement,
23343			continueResize = true;
23344
23345		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
23346			cop = co;
23347		}
23348
23349		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
23350			that.size.width = that.size.width +
23351				( that._helper ?
23352					( that.position.left - co.left ) :
23353					( that.position.left - cop.left ) );
23354
23355			if ( pRatio ) {
23356				that.size.height = that.size.width / that.aspectRatio;
23357				continueResize = false;
23358			}
23359			that.position.left = o.helper ? co.left : 0;
23360		}
23361
23362		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
23363			that.size.height = that.size.height +
23364				( that._helper ?
23365					( that.position.top - co.top ) :
23366					that.position.top );
23367
23368			if ( pRatio ) {
23369				that.size.width = that.size.height * that.aspectRatio;
23370				continueResize = false;
23371			}
23372			that.position.top = that._helper ? co.top : 0;
23373		}
23374
23375		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
23376		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
23377
23378		if ( isParent && isOffsetRelative ) {
23379			that.offset.left = that.parentData.left + that.position.left;
23380			that.offset.top = that.parentData.top + that.position.top;
23381		} else {
23382			that.offset.left = that.element.offset().left;
23383			that.offset.top = that.element.offset().top;
23384		}
23385
23386		woset = Math.abs( that.sizeDiff.width +
23387			( that._helper ?
23388				that.offset.left - cop.left :
23389				( that.offset.left - co.left ) ) );
23390
23391		hoset = Math.abs( that.sizeDiff.height +
23392			( that._helper ?
23393				that.offset.top - cop.top :
23394				( that.offset.top - co.top ) ) );
23395
23396		if ( woset + that.size.width >= that.parentData.width ) {
23397			that.size.width = that.parentData.width - woset;
23398			if ( pRatio ) {
23399				that.size.height = that.size.width / that.aspectRatio;
23400				continueResize = false;
23401			}
23402		}
23403
23404		if ( hoset + that.size.height >= that.parentData.height ) {
23405			that.size.height = that.parentData.height - hoset;
23406			if ( pRatio ) {
23407				that.size.width = that.size.height * that.aspectRatio;
23408				continueResize = false;
23409			}
23410		}
23411
23412		if ( !continueResize ) {
23413			that.position.left = that.prevPosition.left;
23414			that.position.top = that.prevPosition.top;
23415			that.size.width = that.prevSize.width;
23416			that.size.height = that.prevSize.height;
23417		}
23418	},
23419
23420	stop: function() {
23421		var that = $( this ).resizable( "instance" ),
23422			o = that.options,
23423			co = that.containerOffset,
23424			cop = that.containerPosition,
23425			ce = that.containerElement,
23426			helper = $( that.helper ),
23427			ho = helper.offset(),
23428			w = helper.outerWidth() - that.sizeDiff.width,
23429			h = helper.outerHeight() - that.sizeDiff.height;
23430
23431		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
23432			$( this ).css( {
23433				left: ho.left - cop.left - co.left,
23434				width: w,
23435				height: h
23436			} );
23437		}
23438
23439		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
23440			$( this ).css( {
23441				left: ho.left - cop.left - co.left,
23442				width: w,
23443				height: h
23444			} );
23445		}
23446	}
23447} );
23448
23449$.ui.plugin.add( "resizable", "alsoResize", {
23450
23451	start: function() {
23452		var that = $( this ).resizable( "instance" ),
23453			o = that.options;
23454
23455		$( o.alsoResize ).each( function() {
23456			var el = $( this );
23457			el.data( "ui-resizable-alsoresize", {
23458				width: parseFloat( el.width() ), height: parseFloat( el.height() ),
23459				left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
23460			} );
23461		} );
23462	},
23463
23464	resize: function( event, ui ) {
23465		var that = $( this ).resizable( "instance" ),
23466			o = that.options,
23467			os = that.originalSize,
23468			op = that.originalPosition,
23469			delta = {
23470				height: ( that.size.height - os.height ) || 0,
23471				width: ( that.size.width - os.width ) || 0,
23472				top: ( that.position.top - op.top ) || 0,
23473				left: ( that.position.left - op.left ) || 0
23474			};
23475
23476			$( o.alsoResize ).each( function() {
23477				var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
23478					css = el.parents( ui.originalElement[ 0 ] ).length ?
23479							[ "width", "height" ] :
23480							[ "width", "height", "top", "left" ];
23481
23482				$.each( css, function( i, prop ) {
23483					var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
23484					if ( sum && sum >= 0 ) {
23485						style[ prop ] = sum || null;
23486					}
23487				} );
23488
23489				el.css( style );
23490			} );
23491	},
23492
23493	stop: function() {
23494		$( this ).removeData( "ui-resizable-alsoresize" );
23495	}
23496} );
23497
23498$.ui.plugin.add( "resizable", "ghost", {
23499
23500	start: function() {
23501
23502		var that = $( this ).resizable( "instance" ), cs = that.size;
23503
23504		that.ghost = that.originalElement.clone();
23505		that.ghost.css( {
23506			opacity: 0.25,
23507			display: "block",
23508			position: "relative",
23509			height: cs.height,
23510			width: cs.width,
23511			margin: 0,
23512			left: 0,
23513			top: 0
23514		} );
23515
23516		that._addClass( that.ghost, "ui-resizable-ghost" );
23517
23518		// DEPRECATED
23519		// TODO: remove after 1.12
23520		if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
23521
23522			// Ghost option
23523			that.ghost.addClass( this.options.ghost );
23524		}
23525
23526		that.ghost.appendTo( that.helper );
23527
23528	},
23529
23530	resize: function() {
23531		var that = $( this ).resizable( "instance" );
23532		if ( that.ghost ) {
23533			that.ghost.css( {
23534				position: "relative",
23535				height: that.size.height,
vendor: 2,863 bytes, lines 23536-23647
23536				width: that.size.width
23537			} );
23538		}
23539	},
23540
23541	stop: function() {
23542		var that = $( this ).resizable( "instance" );
23543		if ( that.ghost && that.helper ) {
23544			that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
23545		}
23546	}
23547
23548} );
23549
23550$.ui.plugin.add( "resizable", "grid", {
23551
23552	resize: function() {
23553		var outerDimensions,
23554			that = $( this ).resizable( "instance" ),
23555			o = that.options,
23556			cs = that.size,
23557			os = that.originalSize,
23558			op = that.originalPosition,
23559			a = that.axis,
23560			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
23561			gridX = ( grid[ 0 ] || 1 ),
23562			gridY = ( grid[ 1 ] || 1 ),
23563			ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
23564			oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
23565			newWidth = os.width + ox,
23566			newHeight = os.height + oy,
23567			isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
23568			isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
23569			isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
23570			isMinHeight = o.minHeight && ( o.minHeight > newHeight );
23571
23572		o.grid = grid;
23573
23574		if ( isMinWidth ) {
23575			newWidth += gridX;
23576		}
23577		if ( isMinHeight ) {
23578			newHeight += gridY;
23579		}
23580		if ( isMaxWidth ) {
23581			newWidth -= gridX;
23582		}
23583		if ( isMaxHeight ) {
23584			newHeight -= gridY;
23585		}
23586
23587		if ( /^(se|s|e)$/.test( a ) ) {
23588			that.size.width = newWidth;
23589			that.size.height = newHeight;
23590		} else if ( /^(ne)$/.test( a ) ) {
23591			that.size.width = newWidth;
23592			that.size.height = newHeight;
23593			that.position.top = op.top - oy;
23594		} else if ( /^(sw)$/.test( a ) ) {
23595			that.size.width = newWidth;
23596			that.size.height = newHeight;
23597			that.position.left = op.left - ox;
23598		} else {
23599			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
23600				outerDimensions = that._getPaddingPlusBorderDimensions( this );
23601			}
23602
23603			if ( newHeight - gridY > 0 ) {
23604				that.size.height = newHeight;
23605				that.position.top = op.top - oy;
23606			} else {
23607				newHeight = gridY - outerDimensions.height;
23608				that.size.height = newHeight;
23609				that.position.top = op.top + os.height - newHeight;
23610			}
23611			if ( newWidth - gridX > 0 ) {
23612				that.size.width = newWidth;
23613				that.position.left = op.left - ox;
23614			} else {
23615				newWidth = gridX - outerDimensions.width;
23616				that.size.width = newWidth;
23617				that.position.left = op.left + os.width - newWidth;
23618			}
23619		}
23620	}
23621
23622} );
23623
23624var widgetsResizable = $.ui.resizable;
23625
23626
23627/*!
23628 * jQuery UI Dialog 1.13.2
23629 * http://jqueryui.com
23630 *
23631 * Copyright jQuery Foundation and other contributors
23632 * Released under the MIT license.
23633 * http://jquery.org/license
23634 */
23635
23636//>>label: Dialog
23637//>>group: Widgets
23638//>>description: Displays customizable dialog windows.
23639//>>docs: http://api.jqueryui.com/dialog/
23640//>>demos: http://jqueryui.com/dialog/
23641//>>css.structure: ../../themes/base/core.css
23642//>>css.structure: ../../themes/base/dialog.css
23643//>>css.theme: ../../themes/base/theme.css
23644
23645
23646$.widget( "ui.dialog", {
23647	version: "1.13.2
vendor: 20,928 bytes, lines 23647-24481
23647",
23648	options: {
23649		appendTo: "body",
23650		autoOpen: true,
23651		buttons: [],
23652		classes: {
23653			"ui-dialog": "ui-corner-all",
23654			"ui-dialog-titlebar": "ui-corner-all"
23655		},
23656		closeOnEscape: true,
23657		closeText: "Close",
23658		draggable: true,
23659		hide: null,
23660		height: "auto",
23661		maxHeight: null,
23662		maxWidth: null,
23663		minHeight: 150,
23664		minWidth: 150,
23665		modal: false,
23666		position: {
23667			my: "center",
23668			at: "center",
23669			of: window,
23670			collision: "fit",
23671
23672			// Ensure the titlebar is always visible
23673			using: function( pos ) {
23674				var topOffset = $( this ).css( pos ).offset().top;
23675				if ( topOffset < 0 ) {
23676					$( this ).css( "top", pos.top - topOffset );
23677				}
23678			}
23679		},
23680		resizable: true,
23681		show: null,
23682		title: null,
23683		width: 300,
23684
23685		// Callbacks
23686		beforeClose: null,
23687		close: null,
23688		drag: null,
23689		dragStart: null,
23690		dragStop: null,
23691		focus: null,
23692		open: null,
23693		resize: null,
23694		resizeStart: null,
23695		resizeStop: null
23696	},
23697
23698	sizeRelatedOptions: {
23699		buttons: true,
23700		height: true,
23701		maxHeight: true,
23702		maxWidth: true,
23703		minHeight: true,
23704		minWidth: true,
23705		width: true
23706	},
23707
23708	resizableRelatedOptions: {
23709		maxHeight: true,
23710		maxWidth: true,
23711		minHeight: true,
23712		minWidth: true
23713	},
23714
23715	_create: function() {
23716		this.originalCss = {
23717			display: this.element[ 0 ].style.display,
23718			width: this.element[ 0 ].style.width,
23719			minHeight: this.element[ 0 ].style.minHeight,
23720			maxHeight: this.element[ 0 ].style.maxHeight,
23721			height: this.element[ 0 ].style.height
23722		};
23723		this.originalPosition = {
23724			parent: this.element.parent(),
23725			index: this.element.parent().children().index( this.element )
23726		};
23727		this.originalTitle = this.element.attr( "title" );
23728		if ( this.options.title == null && this.originalTitle != null ) {
23729			this.options.title = this.originalTitle;
23730		}
23731
23732		// Dialogs can't be disabled
23733		if ( this.options.disabled ) {
23734			this.options.disabled = false;
23735		}
23736
23737		this._createWrapper();
23738
23739		this.element
23740			.show()
23741			.removeAttr( "title" )
23742			.appendTo( this.uiDialog );
23743
23744		this._addClass( "ui-dialog-content", "ui-widget-content" );
23745
23746		this._createTitlebar();
23747		this._createButtonPane();
23748
23749		if ( this.options.draggable && $.fn.draggable ) {
23750			this._makeDraggable();
23751		}
23752		if ( this.options.resizable && $.fn.resizable ) {
23753			this._makeResizable();
23754		}
23755
23756		this._isOpen = false;
23757
23758		this._trackFocus();
23759	},
23760
23761	_init: function() {
23762		if ( this.options.autoOpen ) {
23763			this.open();
23764		}
23765	},
23766
23767	_appendTo: function() {
23768		var element = this.options.appendTo;
23769		if ( element && ( element.jquery || element.nodeType ) ) {
23770			return $( element );
23771		}
23772		return this.document.find( element || "body" ).eq( 0 );
23773	},
23774
23775	_destroy: function() {
23776		var next,
23777			originalPosition = this.originalPosition;
23778
23779		this._untrackInstance();
23780		this._destroyOverlay();
23781
23782		this.element
23783			.removeUniqueId()
23784			.css( this.originalCss )
23785
23786			// Without detaching first, the following becomes really slow
23787			.detach();
23788
23789		this.uiDialog.remove();
23790
23791		if ( this.originalTitle ) {
23792			this.element.attr( "title", this.originalTitle );
23793		}
23794
23795		next = originalPosition.parent.children().eq( originalPosition.index );
23796
23797		// Don't try to place the dialog next to itself (#8613)
23798		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
23799			next.before( this.element );
23800		} else {
23801			originalPosition.parent.append( this.element );
23802		}
23803	},
23804
23805	widget: function() {
23806		return this.uiDialog;
23807	},
23808
23809	disable: $.noop,
23810	enable: $.noop,
23811
23812	close: function( event ) {
23813		var that = this;
23814
23815		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
23816			return;
23817		}
23818
23819		this._isOpen = false;
23820		this._focusedElement = null;
23821		this._destroyOverlay();
23822		this._untrackInstance();
23823
23824		if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
23825
23826			// Hiding a focused element doesn't trigger blur in WebKit
23827			// so in case we have nothing to focus on, explicitly blur the active element
23828			// https://bugs.webkit.org/show_bug.cgi?id=47182
23829			$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
23830		}
23831
23832		this._hide( this.uiDialog, this.options.hide, function() {
23833			that._trigger( "close", event );
23834		} );
23835	},
23836
23837	isOpen: function() {
23838		return this._isOpen;
23839	},
23840
23841	moveToTop: function() {
23842		this._moveToTop();
23843	},
23844
23845	_moveToTop: function( event, silent ) {
23846		var moved = false,
23847			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
23848				return +$( this ).css( "z-index" );
23849			} ).get(),
23850			zIndexMax = Math.max.apply( null, zIndices );
23851
23852		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
23853			this.uiDialog.css( "z-index", zIndexMax + 1 );
23854			moved = true;
23855		}
23856
23857		if ( moved && !silent ) {
23858			this._trigger( "focus", event );
23859		}
23860		return moved;
23861	},
23862
23863	open: function() {
23864		var that = this;
23865		if ( this._isOpen ) {
23866			if ( this._moveToTop() ) {
23867				this._focusTabbable();
23868			}
23869			return;
23870		}
23871
23872		this._isOpen = true;
23873		this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
23874
23875		this._size();
23876		this._position();
23877		this._createOverlay();
23878		this._moveToTop( null, true );
23879
23880		// Ensure the overlay is moved to the top with the dialog, but only when
23881		// opening. The overlay shouldn't move after the dialog is open so that
23882		// modeless dialogs opened after the modal dialog stack properly.
23883		if ( this.overlay ) {
23884			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
23885		}
23886
23887		this._show( this.uiDialog, this.options.show, function() {
23888			that._focusTabbable();
23889			that._trigger( "focus" );
23890		} );
23891
23892		// Track the dialog immediately upon opening in case a focus event
23893		// somehow occurs outside of the dialog before an element inside the
23894		// dialog is focused (#10152)
23895		this._makeFocusTarget();
23896
23897		this._trigger( "open" );
23898	},
23899
23900	_focusTabbable: function() {
23901
23902		// Set focus to the first match:
23903		// 1. An element that was focused previously
23904		// 2. First element inside the dialog matching [autofocus]
23905		// 3. Tabbable element inside the content element
23906		// 4. Tabbable element inside the buttonpane
23907		// 5. The close button
23908		// 6. The dialog itself
23909		var hasFocus = this._focusedElement;
23910		if ( !hasFocus ) {
23911			hasFocus = this.element.find( "[autofocus]" );
23912		}
23913		if ( !hasFocus.length ) {
23914			hasFocus = this.element.find( ":tabbable" );
23915		}
23916		if ( !hasFocus.length ) {
23917			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
23918		}
23919		if ( !hasFocus.length ) {
23920			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
23921		}
23922		if ( !hasFocus.length ) {
23923			hasFocus = this.uiDialog;
23924		}
23925		hasFocus.eq( 0 ).trigger( "focus" );
23926	},
23927
23928	_restoreTabbableFocus: function() {
23929		var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
23930			isActive = this.uiDialog[ 0 ] === activeElement ||
23931				$.contains( this.uiDialog[ 0 ], activeElement );
23932		if ( !isActive ) {
23933			this._focusTabbable();
23934		}
23935	},
23936
23937	_keepFocus: function( event ) {
23938		event.preventDefault();
23939		this._restoreTabbableFocus();
23940
23941		// support: IE
23942		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
23943		// so we check again later
23944		this._delay( this._restoreTabbableFocus );
23945	},
23946
23947	_createWrapper: function() {
23948		this.uiDialog = $( "<div>" )
23949			.hide()
23950			.attr( {
23951
23952				// Setting tabIndex makes the div focusable
23953				tabIndex: -1,
23954				role: "dialog"
23955			} )
23956			.appendTo( this._appendTo() );
23957
23958		this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
23959		this._on( this.uiDialog, {
23960			keydown: function( event ) {
23961				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
23962						event.keyCode === $.ui.keyCode.ESCAPE ) {
23963					event.preventDefault();
23964					this.close( event );
23965					return;
23966				}
23967
23968				// Prevent tabbing out of dialogs
23969				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
23970					return;
23971				}
23972				var tabbables = this.uiDialog.find( ":tabbable" ),
23973					first = tabbables.first(),
23974					last = tabbables.last();
23975
23976				if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
23977						!event.shiftKey ) {
23978					this._delay( function() {
23979						first.trigger( "focus" );
23980					} );
23981					event.preventDefault();
23982				} else if ( ( event.target === first[ 0 ] ||
23983						event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
23984					this._delay( function() {
23985						last.trigger( "focus" );
23986					} );
23987					event.preventDefault();
23988				}
23989			},
23990			mousedown: function( event ) {
23991				if ( this._moveToTop( event ) ) {
23992					this._focusTabbable();
23993				}
23994			}
23995		} );
23996
23997		// We assume that any existing aria-describedby attribute means
23998		// that the dialog content is marked up properly
23999		// otherwise we brute force the content as the description
24000		if ( !this.element.find( "[aria-describedby]" ).length ) {
24001			this.uiDialog.attr( {
24002				"aria-describedby": this.element.uniqueId().attr( "id" )
24003			} );
24004		}
24005	},
24006
24007	_createTitlebar: function() {
24008		var uiDialogTitle;
24009
24010		this.uiDialogTitlebar = $( "<div>" );
24011		this._addClass( this.uiDialogTitlebar,
24012			"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
24013		this._on( this.uiDialogTitlebar, {
24014			mousedown: function( event ) {
24015
24016				// Don't prevent click on close button (#8838)
24017				// Focusing a dialog that is partially scrolled out of view
24018				// causes the browser to scroll it into view, preventing the click event
24019				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
24020
24021					// Dialog isn't getting focus when dragging (#8063)
24022					this.uiDialog.trigger( "focus" );
24023				}
24024			}
24025		} );
24026
24027		// Support: IE
24028		// Use type="button" to prevent enter keypresses in textboxes from closing the
24029		// dialog in IE (#9312)
24030		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
24031			.button( {
24032				label: $( "<a>" ).text( this.options.closeText ).html(),
24033				icon: "ui-icon-closethick",
24034				showLabel: false
24035			} )
24036			.appendTo( this.uiDialogTitlebar );
24037
24038		this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
24039		this._on( this.uiDialogTitlebarClose, {
24040			click: function( event ) {
24041				event.preventDefault();
24042				this.close( event );
24043			}
24044		} );
24045
24046		uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
24047		this._addClass( uiDialogTitle, "ui-dialog-title" );
24048		this._title( uiDialogTitle );
24049
24050		this.uiDialogTitlebar.prependTo( this.uiDialog );
24051
24052		this.uiDialog.attr( {
24053			"aria-labelledby": uiDialogTitle.attr( "id" )
24054		} );
24055	},
24056
24057	_title: function( title ) {
24058		if ( this.options.title ) {
24059			title.text( this.options.title );
24060		} else {
24061			title.html( "&#160;" );
24062		}
24063	},
24064
24065	_createButtonPane: function() {
24066		this.uiDialogButtonPane = $( "<div>" );
24067		this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
24068			"ui-widget-content ui-helper-clearfix" );
24069
24070		this.uiButtonSet = $( "<div>" )
24071			.appendTo( this.uiDialogButtonPane );
24072		this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
24073
24074		this._createButtons();
24075	},
24076
24077	_createButtons: function() {
24078		var that = this,
24079			buttons = this.options.buttons;
24080
24081		// If we already have a button pane, remove it
24082		this.uiDialogButtonPane.remove();
24083		this.uiButtonSet.empty();
24084
24085		if ( $.isEmptyObject( buttons ) || ( Array.isArray( buttons ) && !buttons.length ) ) {
24086			this._removeClass( this.uiDialog, "ui-dialog-buttons" );
24087			return;
24088		}
24089
24090		$.each( buttons, function( name, props ) {
24091			var click, buttonOptions;
24092			props = typeof props === "function" ?
24093				{ click: props, text: name } :
24094				props;
24095
24096			// Default to a non-submitting button
24097			props = $.extend( { type: "button" }, props );
24098
24099			// Change the context for the click callback to be the main element
24100			click = props.click;
24101			buttonOptions = {
24102				icon: props.icon,
24103				iconPosition: props.iconPosition,
24104				showLabel: props.showLabel,
24105
24106				// Deprecated options
24107				icons: props.icons,
24108				text: props.text
24109			};
24110
24111			delete props.click;
24112			delete props.icon;
24113			delete props.iconPosition;
24114			delete props.showLabel;
24115
24116			// Deprecated options
24117			delete props.icons;
24118			if ( typeof props.text === "boolean" ) {
24119				delete props.text;
24120			}
24121
24122			$( "<button></button>", props )
24123				.button( buttonOptions )
24124				.appendTo( that.uiButtonSet )
24125				.on( "click", function() {
24126					click.apply( that.element[ 0 ], arguments );
24127				} );
24128		} );
24129		this._addClass( this.uiDialog, "ui-dialog-buttons" );
24130		this.uiDialogButtonPane.appendTo( this.uiDialog );
24131	},
24132
24133	_makeDraggable: function() {
24134		var that = this,
24135			options = this.options;
24136
24137		function filteredUi( ui ) {
24138			return {
24139				position: ui.position,
24140				offset: ui.offset
24141			};
24142		}
24143
24144		this.uiDialog.draggable( {
24145			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
24146			handle: ".ui-dialog-titlebar",
24147			containment: "document",
24148			start: function( event, ui ) {
24149				that._addClass( $( this ), "ui-dialog-dragging" );
24150				that._blockFrames();
24151				that._trigger( "dragStart", event, filteredUi( ui ) );
24152			},
24153			drag: function( event, ui ) {
24154				that._trigger( "drag", event, filteredUi( ui ) );
24155			},
24156			stop: function( event, ui ) {
24157				var left = ui.offset.left - that.document.scrollLeft(),
24158					top = ui.offset.top - that.document.scrollTop();
24159
24160				options.position = {
24161					my: "left top",
24162					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
24163						"top" + ( top >= 0 ? "+" : "" ) + top,
24164					of: that.window
24165				};
24166				that._removeClass( $( this ), "ui-dialog-dragging" );
24167				that._unblockFrames();
24168				that._trigger( "dragStop", event, filteredUi( ui ) );
24169			}
24170		} );
24171	},
24172
24173	_makeResizable: function() {
24174		var that = this,
24175			options = this.options,
24176			handles = options.resizable,
24177
24178			// .ui-resizable has position: relative defined in the stylesheet
24179			// but dialogs have to use absolute or fixed positioning
24180			position = this.uiDialog.css( "position" ),
24181			resizeHandles = typeof handles === "string" ?
24182				handles :
24183				"n,e,s,w,se,sw,ne,nw";
24184
24185		function filteredUi( ui ) {
24186			return {
24187				originalPosition: ui.originalPosition,
24188				originalSize: ui.originalSize,
24189				position: ui.position,
24190				size: ui.size
24191			};
24192		}
24193
24194		this.uiDialog.resizable( {
24195			cancel: ".ui-dialog-content",
24196			containment: "document",
24197			alsoResize: this.element,
24198			maxWidth: options.maxWidth,
24199			maxHeight: options.maxHeight,
24200			minWidth: options.minWidth,
24201			minHeight: this._minHeight(),
24202			handles: resizeHandles,
24203			start: function( event, ui ) {
24204				that._addClass( $( this ), "ui-dialog-resizing" );
24205				that._blockFrames();
24206				that._trigger( "resizeStart", event, filteredUi( ui ) );
24207			},
24208			resize: function( event, ui ) {
24209				that._trigger( "resize", event, filteredUi( ui ) );
24210			},
24211			stop: function( event, ui ) {
24212				var offset = that.uiDialog.offset(),
24213					left = offset.left - that.document.scrollLeft(),
24214					top = offset.top - that.document.scrollTop();
24215
24216				options.height = that.uiDialog.height();
24217				options.width = that.uiDialog.width();
24218				options.position = {
24219					my: "left top",
24220					at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
24221						"top" + ( top >= 0 ? "+" : "" ) + top,
24222					of: that.window
24223				};
24224				that._removeClass( $( this ), "ui-dialog-resizing" );
24225				that._unblockFrames();
24226				that._trigger( "resizeStop", event, filteredUi( ui ) );
24227			}
24228		} )
24229			.css( "position", position );
24230	},
24231
24232	_trackFocus: function() {
24233		this._on( this.widget(), {
24234			focusin: function( event ) {
24235				this._makeFocusTarget();
24236				this._focusedElement = $( event.target );
24237			}
24238		} );
24239	},
24240
24241	_makeFocusTarget: function() {
24242		this._untrackInstance();
24243		this._trackingInstances().unshift( this );
24244	},
24245
24246	_untrackInstance: function() {
24247		var instances = this._trackingInstances(),
24248			exists = $.inArray( this, instances );
24249		if ( exists !== -1 ) {
24250			instances.splice( exists, 1 );
24251		}
24252	},
24253
24254	_trackingInstances: function() {
24255		var instances = this.document.data( "ui-dialog-instances" );
24256		if ( !instances ) {
24257			instances = [];
24258			this.document.data( "ui-dialog-instances", instances );
24259		}
24260		return instances;
24261	},
24262
24263	_minHeight: function() {
24264		var options = this.options;
24265
24266		return options.height === "auto" ?
24267			options.minHeight :
24268			Math.min( options.minHeight, options.height );
24269	},
24270
24271	_position: function() {
24272
24273		// Need to show the dialog to get the actual offset in the position plugin
24274		var isVisible = this.uiDialog.is( ":visible" );
24275		if ( !isVisible ) {
24276			this.uiDialog.show();
24277		}
24278		this.uiDialog.position( this.options.position );
24279		if ( !isVisible ) {
24280			this.uiDialog.hide();
24281		}
24282	},
24283
24284	_setOptions: function( options ) {
24285		var that = this,
24286			resize = false,
24287			resizableOptions = {};
24288
24289		$.each( options, function( key, value ) {
24290			that._setOption( key, value );
24291
24292			if ( key in that.sizeRelatedOptions ) {
24293				resize = true;
24294			}
24295			if ( key in that.resizableRelatedOptions ) {
24296				resizableOptions[ key ] = value;
24297			}
24298		} );
24299
24300		if ( resize ) {
24301			this._size();
24302			this._position();
24303		}
24304		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
24305			this.uiDialog.resizable( "option", resizableOptions );
24306		}
24307	},
24308
24309	_setOption: function( key, value ) {
24310		var isDraggable, isResizable,
24311			uiDialog = this.uiDialog;
24312
24313		if ( key === "disabled" ) {
24314			return;
24315		}
24316
24317		this._super( key, value );
24318
24319		if ( key === "appendTo" ) {
24320			this.uiDialog.appendTo( this._appendTo() );
24321		}
24322
24323		if ( key === "buttons" ) {
24324			this._createButtons();
24325		}
24326
24327		if ( key === "closeText" ) {
24328			this.uiDialogTitlebarClose.button( {
24329
24330				// Ensure that we always pass a string
24331				label: $( "<a>" ).text( "" + this.options.closeText ).html()
24332			} );
24333		}
24334
24335		if ( key === "draggable" ) {
24336			isDraggable = uiDialog.is( ":data(ui-draggable)" );
24337			if ( isDraggable && !value ) {
24338				uiDialog.draggable( "destroy" );
24339			}
24340
24341			if ( !isDraggable && value ) {
24342				this._makeDraggable();
24343			}
24344		}
24345
24346		if ( key === "position" ) {
24347			this._position();
24348		}
24349
24350		if ( key === "resizable" ) {
24351
24352			// currently resizable, becoming non-resizable
24353			isResizable = uiDialog.is( ":data(ui-resizable)" );
24354			if ( isResizable && !value ) {
24355				uiDialog.resizable( "destroy" );
24356			}
24357
24358			// Currently resizable, changing handles
24359			if ( isResizable && typeof value === "string" ) {
24360				uiDialog.resizable( "option", "handles", value );
24361			}
24362
24363			// Currently non-resizable, becoming resizable
24364			if ( !isResizable && value !== false ) {
24365				this._makeResizable();
24366			}
24367		}
24368
24369		if ( key === "title" ) {
24370			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
24371		}
24372	},
24373
24374	_size: function() {
24375
24376		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
24377		// divs will both have width and height set, so we need to reset them
24378		var nonContentHeight, minContentHeight, maxContentHeight,
24379			options = this.options;
24380
24381		// Reset content sizing
24382		this.element.show().css( {
24383			width: "auto",
24384			minHeight: 0,
24385			maxHeight: "none",
24386			height: 0
24387		} );
24388
24389		if ( options.minWidth > options.width ) {
24390			options.width = options.minWidth;
24391		}
24392
24393		// Reset wrapper sizing
24394		// determine the height of all the non-content elements
24395		nonContentHeight = this.uiDialog.css( {
24396			height: "auto",
24397			width: options.width
24398		} )
24399			.outerHeight();
24400		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
24401		maxContentHeight = typeof options.maxHeight === "number" ?
24402			Math.max( 0, options.maxHeight - nonContentHeight ) :
24403			"none";
24404
24405		if ( options.height === "auto" ) {
24406			this.element.css( {
24407				minHeight: minContentHeight,
24408				maxHeight: maxContentHeight,
24409				height: "auto"
24410			} );
24411		} else {
24412			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
24413		}
24414
24415		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
24416			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
24417		}
24418	},
24419
24420	_blockFrames: function() {
24421		this.iframeBlocks = this.document.find( "iframe" ).map( function() {
24422			var iframe = $( this );
24423
24424			return $( "<div>" )
24425				.css( {
24426					position: "absolute",
24427					width: iframe.outerWidth(),
24428					height: iframe.outerHeight()
24429				} )
24430				.appendTo( iframe.parent() )
24431				.offset( iframe.offset() )[ 0 ];
24432		} );
24433	},
24434
24435	_unblockFrames: function() {
24436		if ( this.iframeBlocks ) {
24437			this.iframeBlocks.remove();
24438			delete this.iframeBlocks;
24439		}
24440	},
24441
24442	_allowInteraction: function( event ) {
24443		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
24444			return true;
24445		}
24446
24447		// TODO: Remove hack when datepicker implements
24448		// the .ui-front logic (#8989)
24449		return !!$( event.target ).closest( ".ui-datepicker" ).length;
24450	},
24451
24452	_createOverlay: function() {
24453		if ( !this.options.modal ) {
24454			return;
24455		}
24456
24457		var jqMinor = $.fn.jquery.substring( 0, 4 );
24458
24459		// We use a delay in case the overlay is created from an
24460		// event that we're going to be cancelling (#2804)
24461		var isOpening = true;
24462		this._delay( function() {
24463			isOpening = false;
24464		} );
24465
24466		if ( !this.document.data( "ui-dialog-overlays" ) ) {
24467
24468			// Prevent use of anchors and inputs
24469			// This doesn't use `_on()` because it is a shared event handler
24470			// across all open modal dialogs.
24471			this.document.on( "focusin.ui-dialog", function( event ) {
24472				if ( isOpening ) {
24473					return;
24474				}
24475
24476				var instance = this._trackingInstances()[ 0 ];
24477				if ( !instance._allowInteraction( event ) ) {
24478					event.preventDefault();
24479					instance._focusTabbable();
24480
24481					// Support: jQuery >=3.4 <3.
vendor: 2,202 bytes, lines 24481-24569
244816 only
24482					// Focus re-triggering in jQuery 3.4/3.5 makes the original element
24483					// have its focus event propagated last, breaking the re-targeting.
24484					// Trigger focus in a delay in addition if needed to avoid the issue
24485					// See https://github.com/jquery/jquery/issues/4382
24486					if ( jqMinor === "3.4." || jqMinor === "3.5." ) {
24487						instance._delay( instance._restoreTabbableFocus );
24488					}
24489				}
24490			}.bind( this ) );
24491		}
24492
24493		this.overlay = $( "<div>" )
24494			.appendTo( this._appendTo() );
24495
24496		this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
24497		this._on( this.overlay, {
24498			mousedown: "_keepFocus"
24499		} );
24500		this.document.data( "ui-dialog-overlays",
24501			( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
24502	},
24503
24504	_destroyOverlay: function() {
24505		if ( !this.options.modal ) {
24506			return;
24507		}
24508
24509		if ( this.overlay ) {
24510			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
24511
24512			if ( !overlays ) {
24513				this.document.off( "focusin.ui-dialog" );
24514				this.document.removeData( "ui-dialog-overlays" );
24515			} else {
24516				this.document.data( "ui-dialog-overlays", overlays );
24517			}
24518
24519			this.overlay.remove();
24520			this.overlay = null;
24521		}
24522	}
24523} );
24524
24525// DEPRECATED
24526// TODO: switch return back to widget declaration at top of file when this is removed
24527if ( $.uiBackCompat !== false ) {
24528
24529	// Backcompat for dialogClass option
24530	$.widget( "ui.dialog", $.ui.dialog, {
24531		options: {
24532			dialogClass: ""
24533		},
24534		_createWrapper: function() {
24535			this._super();
24536			this.uiDialog.addClass( this.options.dialogClass );
24537		},
24538		_setOption: function( key, value ) {
24539			if ( key === "dialogClass" ) {
24540				this.uiDialog
24541					.removeClass( this.options.dialogClass )
24542					.addClass( value );
24543			}
24544			this._superApply( arguments );
24545		}
24546	} );
24547}
24548
24549var widgetsDialog = $.ui.dialog;
24550
24551
24552/*!
24553 * jQuery UI Droppable 1.13.2
24554 * http://jqueryui.com
24555 *
24556 * Copyright jQuery Foundation and other contributors
24557 * Released under the MIT license.
24558 * http://jquery.org/license
24559 */
24560
24561//>>label: Droppable
24562//>>group: Interactions
24563//>>description: Enables drop targets for draggable elements.
24564//>>docs: http://api.jqueryui.com/droppable/
24565//>>demos: http://jqueryui.com/droppable/
24566
24567
24568$.widget( "ui.droppable", {
24569	version: "1.13
vendor: 11,313 bytes, lines 24569-24997
24569.2",
24570	widgetEventPrefix: "drop",
24571	options: {
24572		accept: "*",
24573		addClasses: true,
24574		greedy: false,
24575		scope: "default",
24576		tolerance: "intersect",
24577
24578		// Callbacks
24579		activate: null,
24580		deactivate: null,
24581		drop: null,
24582		out: null,
24583		over: null
24584	},
24585	_create: function() {
24586
24587		var proportions,
24588			o = this.options,
24589			accept = o.accept;
24590
24591		this.isover = false;
24592		this.isout = true;
24593
24594		this.accept = typeof accept === "function" ? accept : function( d ) {
24595			return d.is( accept );
24596		};
24597
24598		this.proportions = function( /* valueToWrite */ ) {
24599			if ( arguments.length ) {
24600
24601				// Store the droppable's proportions
24602				proportions = arguments[ 0 ];
24603			} else {
24604
24605				// Retrieve or derive the droppable's proportions
24606				return proportions ?
24607					proportions :
24608					proportions = {
24609						width: this.element[ 0 ].offsetWidth,
24610						height: this.element[ 0 ].offsetHeight
24611					};
24612			}
24613		};
24614
24615		this._addToManager( o.scope );
24616
24617		if ( o.addClasses ) {
24618			this._addClass( "ui-droppable" );
24619		}
24620
24621	},
24622
24623	_addToManager: function( scope ) {
24624
24625		// Add the reference and positions to the manager
24626		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
24627		$.ui.ddmanager.droppables[ scope ].push( this );
24628	},
24629
24630	_splice: function( drop ) {
24631		var i = 0;
24632		for ( ; i < drop.length; i++ ) {
24633			if ( drop[ i ] === this ) {
24634				drop.splice( i, 1 );
24635			}
24636		}
24637	},
24638
24639	_destroy: function() {
24640		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
24641
24642		this._splice( drop );
24643	},
24644
24645	_setOption: function( key, value ) {
24646
24647		if ( key === "accept" ) {
24648			this.accept = typeof value === "function" ? value : function( d ) {
24649				return d.is( value );
24650			};
24651		} else if ( key === "scope" ) {
24652			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
24653
24654			this._splice( drop );
24655			this._addToManager( value );
24656		}
24657
24658		this._super( key, value );
24659	},
24660
24661	_activate: function( event ) {
24662		var draggable = $.ui.ddmanager.current;
24663
24664		this._addActiveClass();
24665		if ( draggable ) {
24666			this._trigger( "activate", event, this.ui( draggable ) );
24667		}
24668	},
24669
24670	_deactivate: function( event ) {
24671		var draggable = $.ui.ddmanager.current;
24672
24673		this._removeActiveClass();
24674		if ( draggable ) {
24675			this._trigger( "deactivate", event, this.ui( draggable ) );
24676		}
24677	},
24678
24679	_over: function( event ) {
24680
24681		var draggable = $.ui.ddmanager.current;
24682
24683		// Bail if draggable and droppable are same element
24684		if ( !draggable || ( draggable.currentItem ||
24685				draggable.element )[ 0 ] === this.element[ 0 ] ) {
24686			return;
24687		}
24688
24689		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
24690				draggable.element ) ) ) {
24691			this._addHoverClass();
24692			this._trigger( "over", event, this.ui( draggable ) );
24693		}
24694
24695	},
24696
24697	_out: function( event ) {
24698
24699		var draggable = $.ui.ddmanager.current;
24700
24701		// Bail if draggable and droppable are same element
24702		if ( !draggable || ( draggable.currentItem ||
24703				draggable.element )[ 0 ] === this.element[ 0 ] ) {
24704			return;
24705		}
24706
24707		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
24708				draggable.element ) ) ) {
24709			this._removeHoverClass();
24710			this._trigger( "out", event, this.ui( draggable ) );
24711		}
24712
24713	},
24714
24715	_drop: function( event, custom ) {
24716
24717		var draggable = custom || $.ui.ddmanager.current,
24718			childrenIntersection = false;
24719
24720		// Bail if draggable and droppable are same element
24721		if ( !draggable || ( draggable.currentItem ||
24722				draggable.element )[ 0 ] === this.element[ 0 ] ) {
24723			return false;
24724		}
24725
24726		this.element
24727			.find( ":data(ui-droppable)" )
24728			.not( ".ui-draggable-dragging" )
24729			.each( function() {
24730				var inst = $( this ).droppable( "instance" );
24731				if (
24732					inst.options.greedy &&
24733					!inst.options.disabled &&
24734					inst.options.scope === draggable.options.scope &&
24735					inst.accept.call(
24736						inst.element[ 0 ], ( draggable.currentItem || draggable.element )
24737					) &&
24738					$.ui.intersect(
24739						draggable,
24740						$.extend( inst, { offset: inst.element.offset() } ),
24741						inst.options.tolerance, event
24742					)
24743				) {
24744					childrenIntersection = true;
24745					return false;
24746				}
24747			} );
24748		if ( childrenIntersection ) {
24749			return false;
24750		}
24751
24752		if ( this.accept.call( this.element[ 0 ],
24753				( draggable.currentItem || draggable.element ) ) ) {
24754			this._removeActiveClass();
24755			this._removeHoverClass();
24756
24757			this._trigger( "drop", event, this.ui( draggable ) );
24758			return this.element;
24759		}
24760
24761		return false;
24762
24763	},
24764
24765	ui: function( c ) {
24766		return {
24767			draggable: ( c.currentItem || c.element ),
24768			helper: c.helper,
24769			position: c.position,
24770			offset: c.positionAbs
24771		};
24772	},
24773
24774	// Extension points just to make backcompat sane and avoid duplicating logic
24775	// TODO: Remove in 1.14 along with call to it below
24776	_addHoverClass: function() {
24777		this._addClass( "ui-droppable-hover" );
24778	},
24779
24780	_removeHoverClass: function() {
24781		this._removeClass( "ui-droppable-hover" );
24782	},
24783
24784	_addActiveClass: function() {
24785		this._addClass( "ui-droppable-active" );
24786	},
24787
24788	_removeActiveClass: function() {
24789		this._removeClass( "ui-droppable-active" );
24790	}
24791} );
24792
24793$.ui.intersect = ( function() {
24794	function isOverAxis( x, reference, size ) {
24795		return ( x >= reference ) && ( x < ( reference + size ) );
24796	}
24797
24798	return function( draggable, droppable, toleranceMode, event ) {
24799
24800		if ( !droppable.offset ) {
24801			return false;
24802		}
24803
24804		var x1 = ( draggable.positionAbs ||
24805				draggable.position.absolute ).left + draggable.margins.left,
24806			y1 = ( draggable.positionAbs ||
24807				draggable.position.absolute ).top + draggable.margins.top,
24808			x2 = x1 + draggable.helperProportions.width,
24809			y2 = y1 + draggable.helperProportions.height,
24810			l = droppable.offset.left,
24811			t = droppable.offset.top,
24812			r = l + droppable.proportions().width,
24813			b = t + droppable.proportions().height;
24814
24815		switch ( toleranceMode ) {
24816		case "fit":
24817			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
24818		case "intersect":
24819			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
24820				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
24821				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
24822				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
24823		case "pointer":
24824			return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
24825				isOverAxis( event.pageX, l, droppable.proportions().width );
24826		case "touch":
24827			return (
24828				( y1 >= t && y1 <= b ) || // Top edge touching
24829				( y2 >= t && y2 <= b ) || // Bottom edge touching
24830				( y1 < t && y2 > b ) // Surrounded vertically
24831			) && (
24832				( x1 >= l && x1 <= r ) || // Left edge touching
24833				( x2 >= l && x2 <= r ) || // Right edge touching
24834				( x1 < l && x2 > r ) // Surrounded horizontally
24835			);
24836		default:
24837			return false;
24838		}
24839	};
24840} )();
24841
24842/*
24843	This manager tracks offsets of draggables and droppables
24844*/
24845$.ui.ddmanager = {
24846	current: null,
24847	droppables: { "default": [] },
24848	prepareOffsets: function( t, event ) {
24849
24850		var i, j,
24851			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
24852			type = event ? event.type : null, // workaround for #2317
24853			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
24854
24855		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
24856
24857			// No disabled and non-accepted
24858			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
24859					( t.currentItem || t.element ) ) ) ) {
24860				continue;
24861			}
24862
24863			// Filter out elements in the current dragged item
24864			for ( j = 0; j < list.length; j++ ) {
24865				if ( list[ j ] === m[ i ].element[ 0 ] ) {
24866					m[ i ].proportions().height = 0;
24867					continue droppablesLoop;
24868				}
24869			}
24870
24871			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
24872			if ( !m[ i ].visible ) {
24873				continue;
24874			}
24875
24876			// Activate the droppable if used directly from draggables
24877			if ( type === "mousedown" ) {
24878				m[ i ]._activate.call( m[ i ], event );
24879			}
24880
24881			m[ i ].offset = m[ i ].element.offset();
24882			m[ i ].proportions( {
24883				width: m[ i ].element[ 0 ].offsetWidth,
24884				height: m[ i ].element[ 0 ].offsetHeight
24885			} );
24886
24887		}
24888
24889	},
24890	drop: function( draggable, event ) {
24891
24892		var dropped = false;
24893
24894		// Create a copy of the droppables in case the list changes during the drop (#9116)
24895		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
24896
24897			if ( !this.options ) {
24898				return;
24899			}
24900			if ( !this.options.disabled && this.visible &&
24901					$.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
24902				dropped = this._drop.call( this, event ) || dropped;
24903			}
24904
24905			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
24906					( draggable.currentItem || draggable.element ) ) ) {
24907				this.isout = true;
24908				this.isover = false;
24909				this._deactivate.call( this, event );
24910			}
24911
24912		} );
24913		return dropped;
24914
24915	},
24916	dragStart: function( draggable, event ) {
24917
24918		// Listen for scrolling so that if the dragging causes scrolling the position of the
24919		// droppables can be recalculated (see #5003)
24920		draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
24921			if ( !draggable.options.refreshPositions ) {
24922				$.ui.ddmanager.prepareOffsets( draggable, event );
24923			}
24924		} );
24925	},
24926	drag: function( draggable, event ) {
24927
24928		// If you have a highly dynamic page, you might try this option. It renders positions
24929		// every time you move the mouse.
24930		if ( draggable.options.refreshPositions ) {
24931			$.ui.ddmanager.prepareOffsets( draggable, event );
24932		}
24933
24934		// Run through all droppables and check their positions based on specific tolerance options
24935		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
24936
24937			if ( this.options.disabled || this.greedyChild || !this.visible ) {
24938				return;
24939			}
24940
24941			var parentInstance, scope, parent,
24942				intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
24943				c = !intersects && this.isover ?
24944					"isout" :
24945					( intersects && !this.isover ? "isover" : null );
24946			if ( !c ) {
24947				return;
24948			}
24949
24950			if ( this.options.greedy ) {
24951
24952				// find droppable parents with same scope
24953				scope = this.options.scope;
24954				parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
24955					return $( this ).droppable( "instance" ).options.scope === scope;
24956				} );
24957
24958				if ( parent.length ) {
24959					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
24960					parentInstance.greedyChild = ( c === "isover" );
24961				}
24962			}
24963
24964			// We just moved into a greedy child
24965			if ( parentInstance && c === "isover" ) {
24966				parentInstance.isover = false;
24967				parentInstance.isout = true;
24968				parentInstance._out.call( parentInstance, event );
24969			}
24970
24971			this[ c ] = true;
24972			this[ c === "isout" ? "isover" : "isout" ] = false;
24973			this[ c === "isover" ? "_over" : "_out" ].call( this, event );
24974
24975			// We just moved out of a greedy child
24976			if ( parentInstance && c === "isout" ) {
24977				parentInstance.isout = false;
24978				parentInstance.isover = true;
24979				parentInstance._over.call( parentInstance, event );
24980			}
24981		} );
24982
24983	},
24984	dragStop: function( draggable, event ) {
24985		draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
24986
24987		// Call prepareOffsets one final time since IE does not fire return scroll events when
24988		// overflow was caused by drag (see #5003)
24989		if ( !draggable.options.refreshPositions ) {
24990			$.ui.ddmanager.prepareOffsets( draggable, event );
24991		}
24992	}
24993};
24994
24995// DEPRECATED
24996// TODO: switch return back to widget declaration at top of file when this is removed
24997if ( $.uiBackCompat 
24997!== false ) {
24998
24999	// Backcompat for activeClass and hoverClass options
25000	$.widget( "ui.droppable", $.ui.droppable, {
25001		options: {
25002			hoverClass: false,
25003			activeClass: false
25004		},
25005		_addActiveClass: function() {
25006			this._super();
25007			if ( this.options.activeClass ) {
25008				this.element.addClass( this.options.activeClass );
25009			}
25010		},
25011		_removeActiveClass: function() {
25012			this._super();
25013			if ( this.options.activeClass ) {
25014				this.element.removeClass( this.options.activeClass );
25015			}
25016		},
25017		_addHoverClass: function() {
25018			this._super();
25019			if ( this.options.hoverClass ) {
25020				this.element.addClass( this.options.hoverClass );
25021			}
25022		},
25023		_removeHoverClass: function() {
25024			this._super();
25025			if ( this.options.hoverClass ) {
25026				this.element.removeClass( this.options.hoverClass );
25027			}
25028		}
25029	} );
25030}
25031
25032var widgetsDroppable = $.ui.droppable;
25033
25034
25035/*!
25036 * jQuery UI Progressbar 1.13.2
25037 * http://jqueryui.com
25038 *
25039 * Copyright jQuery Foundation and other contributors
25040 * Released under the MIT license.
25041 * http://jquery.org/license
25042 */
25043
25044//>>label: Progressbar
25045//>>group: Widgets
25046/* eslint-disable max-len */
25047//>>
vendor: 4,215 bytes, lines 25047-25216
25047description: Displays a status indicator for loading state, standard percentage, and other progress indicators.
25048/* eslint-enable max-len */
25049//>>docs: http://api.jqueryui.com/progressbar/
25050//>>demos: http://jqueryui.com/progressbar/
25051//>>css.structure: ../../themes/base/core.css
25052//>>css.structure: ../../themes/base/progressbar.css
25053//>>css.theme: ../../themes/base/theme.css
25054
25055
25056var widgetsProgressbar = $.widget( "ui.progressbar", {
25057	version: "1.13.2",
25058	options: {
25059		classes: {
25060			"ui-progressbar": "ui-corner-all",
25061			"ui-progressbar-value": "ui-corner-left",
25062			"ui-progressbar-complete": "ui-corner-right"
25063		},
25064		max: 100,
25065		value: 0,
25066
25067		change: null,
25068		complete: null
25069	},
25070
25071	min: 0,
25072
25073	_create: function() {
25074
25075		// Constrain initial value
25076		this.oldValue = this.options.value = this._constrainedValue();
25077
25078		this.element.attr( {
25079
25080			// Only set static values; aria-valuenow and aria-valuemax are
25081			// set inside _refreshValue()
25082			role: "progressbar",
25083			"aria-valuemin": this.min
25084		} );
25085		this._addClass( "ui-progressbar", "ui-widget ui-widget-content" );
25086
25087		this.valueDiv = $( "<div>" ).appendTo( this.element );
25088		this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" );
25089		this._refreshValue();
25090	},
25091
25092	_destroy: function() {
25093		this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" );
25094
25095		this.valueDiv.remove();
25096	},
25097
25098	value: function( newValue ) {
25099		if ( newValue === undefined ) {
25100			return this.options.value;
25101		}
25102
25103		this.options.value = this._constrainedValue( newValue );
25104		this._refreshValue();
25105	},
25106
25107	_constrainedValue: function( newValue ) {
25108		if ( newValue === undefined ) {
25109			newValue = this.options.value;
25110		}
25111
25112		this.indeterminate = newValue === false;
25113
25114		// Sanitize value
25115		if ( typeof newValue !== "number" ) {
25116			newValue = 0;
25117		}
25118
25119		return this.indeterminate ? false :
25120			Math.min( this.options.max, Math.max( this.min, newValue ) );
25121	},
25122
25123	_setOptions: function( options ) {
25124
25125		// Ensure "value" option is set after other values (like max)
25126		var value = options.value;
25127		delete options.value;
25128
25129		this._super( options );
25130
25131		this.options.value = this._constrainedValue( value );
25132		this._refreshValue();
25133	},
25134
25135	_setOption: function( key, value ) {
25136		if ( key === "max" ) {
25137
25138			// Don't allow a max less than min
25139			value = Math.max( this.min, value );
25140		}
25141		this._super( key, value );
25142	},
25143
25144	_setOptionDisabled: function( value ) {
25145		this._super( value );
25146
25147		this.element.attr( "aria-disabled", value );
25148		this._toggleClass( null, "ui-state-disabled", !!value );
25149	},
25150
25151	_percentage: function() {
25152		return this.indeterminate ?
25153			100 :
25154			100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
25155	},
25156
25157	_refreshValue: function() {
25158		var value = this.options.value,
25159			percentage = this._percentage();
25160
25161		this.valueDiv
25162			.toggle( this.indeterminate || value > this.min )
25163			.width( percentage.toFixed( 0 ) + "%" );
25164
25165		this
25166			._toggleClass( this.valueDiv, "ui-progressbar-complete", null,
25167				value === this.options.max )
25168			._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate );
25169
25170		if ( this.indeterminate ) {
25171			this.element.removeAttr( "aria-valuenow" );
25172			if ( !this.overlayDiv ) {
25173				this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv );
25174				this._addClass( this.overlayDiv, "ui-progressbar-overlay" );
25175			}
25176		} else {
25177			this.element.attr( {
25178				"aria-valuemax": this.options.max,
25179				"aria-valuenow": value
25180			} );
25181			if ( this.overlayDiv ) {
25182				this.overlayDiv.remove();
25183				this.overlayDiv = null;
25184			}
25185		}
25186
25187		if ( this.oldValue !== value ) {
25188			this.oldValue = value;
25189			this._trigger( "change" );
25190		}
25191		if ( value === this.options.max ) {
25192			this._trigger( "complete" );
25193		}
25194	}
25195} );
25196
25197
25198/*!
25199 * jQuery UI Selectable 1.13.2
25200 * http://jqueryui.com
25201 *
25202 * Copyright jQuery Foundation and other contributors
25203 * Released under the MIT license.
25204 * http://jquery.org/license
25205 */
25206
25207//>>label: Selectable
25208//>>group: Interactions
25209//>>description: Allows groups of elements to be selected with the mouse.
25210//>>docs: http://api.jqueryui.com/selectable/
25211//>>demos: http://jqueryui.com/selectable/
25212//>>css.structure: ../../themes/base/selectable.css
25213
25214
25215var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
25216	version: "1.13
vendor: 7,327 bytes, lines 25216-25497
25216.2",
25217	options: {
25218		appendTo: "body",
25219		autoRefresh: true,
25220		distance: 0,
25221		filter: "*",
25222		tolerance: "touch",
25223
25224		// Callbacks
25225		selected: null,
25226		selecting: null,
25227		start: null,
25228		stop: null,
25229		unselected: null,
25230		unselecting: null
25231	},
25232	_create: function() {
25233		var that = this;
25234
25235		this._addClass( "ui-selectable" );
25236
25237		this.dragged = false;
25238
25239		// Cache selectee children based on filter
25240		this.refresh = function() {
25241			that.elementPos = $( that.element[ 0 ] ).offset();
25242			that.selectees = $( that.options.filter, that.element[ 0 ] );
25243			that._addClass( that.selectees, "ui-selectee" );
25244			that.selectees.each( function() {
25245				var $this = $( this ),
25246					selecteeOffset = $this.offset(),
25247					pos = {
25248						left: selecteeOffset.left - that.elementPos.left,
25249						top: selecteeOffset.top - that.elementPos.top
25250					};
25251				$.data( this, "selectable-item", {
25252					element: this,
25253					$element: $this,
25254					left: pos.left,
25255					top: pos.top,
25256					right: pos.left + $this.outerWidth(),
25257					bottom: pos.top + $this.outerHeight(),
25258					startselected: false,
25259					selected: $this.hasClass( "ui-selected" ),
25260					selecting: $this.hasClass( "ui-selecting" ),
25261					unselecting: $this.hasClass( "ui-unselecting" )
25262				} );
25263			} );
25264		};
25265		this.refresh();
25266
25267		this._mouseInit();
25268
25269		this.helper = $( "<div>" );
25270		this._addClass( this.helper, "ui-selectable-helper" );
25271	},
25272
25273	_destroy: function() {
25274		this.selectees.removeData( "selectable-item" );
25275		this._mouseDestroy();
25276	},
25277
25278	_mouseStart: function( event ) {
25279		var that = this,
25280			options = this.options;
25281
25282		this.opos = [ event.pageX, event.pageY ];
25283		this.elementPos = $( this.element[ 0 ] ).offset();
25284
25285		if ( this.options.disabled ) {
25286			return;
25287		}
25288
25289		this.selectees = $( options.filter, this.element[ 0 ] );
25290
25291		this._trigger( "start", event );
25292
25293		$( options.appendTo ).append( this.helper );
25294
25295		// position helper (lasso)
25296		this.helper.css( {
25297			"left": event.pageX,
25298			"top": event.pageY,
25299			"width": 0,
25300			"height": 0
25301		} );
25302
25303		if ( options.autoRefresh ) {
25304			this.refresh();
25305		}
25306
25307		this.selectees.filter( ".ui-selected" ).each( function() {
25308			var selectee = $.data( this, "selectable-item" );
25309			selectee.startselected = true;
25310			if ( !event.metaKey && !event.ctrlKey ) {
25311				that._removeClass( selectee.$element, "ui-selected" );
25312				selectee.selected = false;
25313				that._addClass( selectee.$element, "ui-unselecting" );
25314				selectee.unselecting = true;
25315
25316				// selectable UNSELECTING callback
25317				that._trigger( "unselecting", event, {
25318					unselecting: selectee.element
25319				} );
25320			}
25321		} );
25322
25323		$( event.target ).parents().addBack().each( function() {
25324			var doSelect,
25325				selectee = $.data( this, "selectable-item" );
25326			if ( selectee ) {
25327				doSelect = ( !event.metaKey && !event.ctrlKey ) ||
25328					!selectee.$element.hasClass( "ui-selected" );
25329				that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" )
25330					._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" );
25331				selectee.unselecting = !doSelect;
25332				selectee.selecting = doSelect;
25333				selectee.selected = doSelect;
25334
25335				// selectable (UN)SELECTING callback
25336				if ( doSelect ) {
25337					that._trigger( "selecting", event, {
25338						selecting: selectee.element
25339					} );
25340				} else {
25341					that._trigger( "unselecting", event, {
25342						unselecting: selectee.element
25343					} );
25344				}
25345				return false;
25346			}
25347		} );
25348
25349	},
25350
25351	_mouseDrag: function( event ) {
25352
25353		this.dragged = true;
25354
25355		if ( this.options.disabled ) {
25356			return;
25357		}
25358
25359		var tmp,
25360			that = this,
25361			options = this.options,
25362			x1 = this.opos[ 0 ],
25363			y1 = this.opos[ 1 ],
25364			x2 = event.pageX,
25365			y2 = event.pageY;
25366
25367		if ( x1 > x2 ) {
25368			tmp = x2; x2 = x1; x1 = tmp;
25369		}
25370		if ( y1 > y2 ) {
25371			tmp = y2; y2 = y1; y1 = tmp;
25372		}
25373		this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );
25374
25375		this.selectees.each( function() {
25376			var selectee = $.data( this, "selectable-item" ),
25377				hit = false,
25378				offset = {};
25379
25380			//prevent helper from being selected if appendTo: selectable
25381			if ( !selectee || selectee.element === that.element[ 0 ] ) {
25382				return;
25383			}
25384
25385			offset.left   = selectee.left   + that.elementPos.left;
25386			offset.right  = selectee.right  + that.elementPos.left;
25387			offset.top    = selectee.top    + that.elementPos.top;
25388			offset.bottom = selectee.bottom + that.elementPos.top;
25389
25390			if ( options.tolerance === "touch" ) {
25391				hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
25392                    offset.bottom < y1 ) );
25393			} else if ( options.tolerance === "fit" ) {
25394				hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
25395                    offset.bottom < y2 );
25396			}
25397
25398			if ( hit ) {
25399
25400				// SELECT
25401				if ( selectee.selected ) {
25402					that._removeClass( selectee.$element, "ui-selected" );
25403					selectee.selected = false;
25404				}
25405				if ( selectee.unselecting ) {
25406					that._removeClass( selectee.$element, "ui-unselecting" );
25407					selectee.unselecting = false;
25408				}
25409				if ( !selectee.selecting ) {
25410					that._addClass( selectee.$element, "ui-selecting" );
25411					selectee.selecting = true;
25412
25413					// selectable SELECTING callback
25414					that._trigger( "selecting", event, {
25415						selecting: selectee.element
25416					} );
25417				}
25418			} else {
25419
25420				// UNSELECT
25421				if ( selectee.selecting ) {
25422					if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {
25423						that._removeClass( selectee.$element, "ui-selecting" );
25424						selectee.selecting = false;
25425						that._addClass( selectee.$element, "ui-selected" );
25426						selectee.selected = true;
25427					} else {
25428						that._removeClass( selectee.$element, "ui-selecting" );
25429						selectee.selecting = false;
25430						if ( selectee.startselected ) {
25431							that._addClass( selectee.$element, "ui-unselecting" );
25432							selectee.unselecting = true;
25433						}
25434
25435						// selectable UNSELECTING callback
25436						that._trigger( "unselecting", event, {
25437							unselecting: selectee.element
25438						} );
25439					}
25440				}
25441				if ( selectee.selected ) {
25442					if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {
25443						that._removeClass( selectee.$element, "ui-selected" );
25444						selectee.selected = false;
25445
25446						that._addClass( selectee.$element, "ui-unselecting" );
25447						selectee.unselecting = true;
25448
25449						// selectable UNSELECTING callback
25450						that._trigger( "unselecting", event, {
25451							unselecting: selectee.element
25452						} );
25453					}
25454				}
25455			}
25456		} );
25457
25458		return false;
25459	},
25460
25461	_mouseStop: function( event ) {
25462		var that = this;
25463
25464		this.dragged = false;
25465
25466		$( ".ui-unselecting", this.element[ 0 ] ).each( function() {
25467			var selectee = $.data( this, "selectable-item" );
25468			that._removeClass( selectee.$element, "ui-unselecting" );
25469			selectee.unselecting = false;
25470			selectee.startselected = false;
25471			that._trigger( "unselected", event, {
25472				unselected: selectee.element
25473			} );
25474		} );
25475		$( ".ui-selecting", this.element[ 0 ] ).each( function() {
25476			var selectee = $.data( this, "selectable-item" );
25477			that._removeClass( selectee.$element, "ui-selecting" )
25478				._addClass( selectee.$element, "ui-selected" );
25479			selectee.selecting = false;
25480			selectee.selected = true;
25481			selectee.startselected = true;
25482			that._trigger( "selected", event, {
25483				selected: selectee.element
25484			} );
25485		} );
25486		this._trigger( "stop", event );
25487
25488		this.helper.remove();
25489
25490		return false;
25491	}
25492
25493} );
25494
25495
25496/*!
25497 * jQuery UI Selectmenu 1.1
vendor: 1,951 bytes, lines 25497-25573
254973.2
25498 * http://jqueryui.com
25499 *
25500 * Copyright jQuery Foundation and other contributors
25501 * Released under the MIT license.
25502 * http://jquery.org/license
25503 */
25504
25505//>>label: Selectmenu
25506//>>group: Widgets
25507/* eslint-disable max-len */
25508//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
25509/* eslint-enable max-len */
25510//>>docs: http://api.jqueryui.com/selectmenu/
25511//>>demos: http://jqueryui.com/selectmenu/
25512//>>css.structure: ../../themes/base/core.css
25513//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
25514//>>css.theme: ../../themes/base/theme.css
25515
25516
25517var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
25518	version: "1.13.2",
25519	defaultElement: "<select>",
25520	options: {
25521		appendTo: null,
25522		classes: {
25523			"ui-selectmenu-button-open": "ui-corner-top",
25524			"ui-selectmenu-button-closed": "ui-corner-all"
25525		},
25526		disabled: null,
25527		icons: {
25528			button: "ui-icon-triangle-1-s"
25529		},
25530		position: {
25531			my: "left top",
25532			at: "left bottom",
25533			collision: "none"
25534		},
25535		width: false,
25536
25537		// Callbacks
25538		change: null,
25539		close: null,
25540		focus: null,
25541		open: null,
25542		select: null
25543	},
25544
25545	_create: function() {
25546		var selectmenuId = this.element.uniqueId().attr( "id" );
25547		this.ids = {
25548			element: selectmenuId,
25549			button: selectmenuId + "-button",
25550			menu: selectmenuId + "-menu"
25551		};
25552
25553		this._drawButton();
25554		this._drawMenu();
25555		this._bindFormResetHandler();
25556
25557		this._rendered = false;
25558		this.menuItems = $();
25559	},
25560
25561	_drawButton: function() {
25562		var icon,
25563			that = this,
25564			item = this._parseOption(
25565				this.element.find( "option:selected" ),
25566				this.element[ 0 ].selectedIndex
25567			);
25568
25569		// Associate existing label with the new button
25570		this.labels = this.element.labels().attr( "for", this.ids.button );
25571		this._on( this.labels, {
25572			click: function( event ) {
25573				this.button.trigger( "focus" 
vendor: 7,319 bytes, lines 25573-25882
25573);
25574				event.preventDefault();
25575			}
25576		} );
25577
25578		// Hide original select element
25579		this.element.hide();
25580
25581		// Create button
25582		this.button = $( "<span>", {
25583			tabindex: this.options.disabled ? -1 : 0,
25584			id: this.ids.button,
25585			role: "combobox",
25586			"aria-expanded": "false",
25587			"aria-autocomplete": "list",
25588			"aria-owns": this.ids.menu,
25589			"aria-haspopup": "true",
25590			title: this.element.attr( "title" )
25591		} )
25592			.insertAfter( this.element );
25593
25594		this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
25595			"ui-button ui-widget" );
25596
25597		icon = $( "<span>" ).appendTo( this.button );
25598		this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button );
25599		this.buttonItem = this._renderButtonItem( item )
25600			.appendTo( this.button );
25601
25602		if ( this.options.width !== false ) {
25603			this._resizeButton();
25604		}
25605
25606		this._on( this.button, this._buttonEvents );
25607		this.button.one( "focusin", function() {
25608
25609			// Delay rendering the menu items until the button receives focus.
25610			// The menu may have already been rendered via a programmatic open.
25611			if ( !that._rendered ) {
25612				that._refreshMenu();
25613			}
25614		} );
25615	},
25616
25617	_drawMenu: function() {
25618		var that = this;
25619
25620		// Create menu
25621		this.menu = $( "<ul>", {
25622			"aria-hidden": "true",
25623			"aria-labelledby": this.ids.button,
25624			id: this.ids.menu
25625		} );
25626
25627		// Wrap menu
25628		this.menuWrap = $( "<div>" ).append( this.menu );
25629		this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
25630		this.menuWrap.appendTo( this._appendTo() );
25631
25632		// Initialize menu widget
25633		this.menuInstance = this.menu
25634			.menu( {
25635				classes: {
25636					"ui-menu": "ui-corner-bottom"
25637				},
25638				role: "listbox",
25639				select: function( event, ui ) {
25640					event.preventDefault();
25641
25642					// Support: IE8
25643					// If the item was selected via a click, the text selection
25644					// will be destroyed in IE
25645					that._setSelection();
25646
25647					that._select( ui.item.data( "ui-selectmenu-item" ), event );
25648				},
25649				focus: function( event, ui ) {
25650					var item = ui.item.data( "ui-selectmenu-item" );
25651
25652					// Prevent inital focus from firing and check if its a newly focused item
25653					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
25654						that._trigger( "focus", event, { item: item } );
25655						if ( !that.isOpen ) {
25656							that._select( item, event );
25657						}
25658					}
25659					that.focusIndex = item.index;
25660
25661					that.button.attr( "aria-activedescendant",
25662						that.menuItems.eq( item.index ).attr( "id" ) );
25663				}
25664			} )
25665			.menu( "instance" );
25666
25667		// Don't close the menu on mouseleave
25668		this.menuInstance._off( this.menu, "mouseleave" );
25669
25670		// Cancel the menu's collapseAll on document click
25671		this.menuInstance._closeOnDocumentClick = function() {
25672			return false;
25673		};
25674
25675		// Selects often contain empty items, but never contain dividers
25676		this.menuInstance._isDivider = function() {
25677			return false;
25678		};
25679	},
25680
25681	refresh: function() {
25682		this._refreshMenu();
25683		this.buttonItem.replaceWith(
25684			this.buttonItem = this._renderButtonItem(
25685
25686				// Fall back to an empty object in case there are no options
25687				this._getSelectedItem().data( "ui-selectmenu-item" ) || {}
25688			)
25689		);
25690		if ( this.options.width === null ) {
25691			this._resizeButton();
25692		}
25693	},
25694
25695	_refreshMenu: function() {
25696		var item,
25697			options = this.element.find( "option" );
25698
25699		this.menu.empty();
25700
25701		this._parseOptions( options );
25702		this._renderMenu( this.menu, this.items );
25703
25704		this.menuInstance.refresh();
25705		this.menuItems = this.menu.find( "li" )
25706			.not( ".ui-selectmenu-optgroup" )
25707				.find( ".ui-menu-item-wrapper" );
25708
25709		this._rendered = true;
25710
25711		if ( !options.length ) {
25712			return;
25713		}
25714
25715		item = this._getSelectedItem();
25716
25717		// Update the menu to have the correct item focused
25718		this.menuInstance.focus( null, item );
25719		this._setAria( item.data( "ui-selectmenu-item" ) );
25720
25721		// Set disabled state
25722		this._setOption( "disabled", this.element.prop( "disabled" ) );
25723	},
25724
25725	open: function( event ) {
25726		if ( this.options.disabled ) {
25727			return;
25728		}
25729
25730		// If this is the first time the menu is being opened, render the items
25731		if ( !this._rendered ) {
25732			this._refreshMenu();
25733		} else {
25734
25735			// Menu clears focus on close, reset focus to selected item
25736			this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
25737			this.menuInstance.focus( null, this._getSelectedItem() );
25738		}
25739
25740		// If there are no options, don't open the menu
25741		if ( !this.menuItems.length ) {
25742			return;
25743		}
25744
25745		this.isOpen = true;
25746		this._toggleAttr();
25747		this._resizeMenu();
25748		this._position();
25749
25750		this._on( this.document, this._documentClick );
25751
25752		this._trigger( "open", event );
25753	},
25754
25755	_position: function() {
25756		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
25757	},
25758
25759	close: function( event ) {
25760		if ( !this.isOpen ) {
25761			return;
25762		}
25763
25764		this.isOpen = false;
25765		this._toggleAttr();
25766
25767		this.range = null;
25768		this._off( this.document );
25769
25770		this._trigger( "close", event );
25771	},
25772
25773	widget: function() {
25774		return this.button;
25775	},
25776
25777	menuWidget: function() {
25778		return this.menu;
25779	},
25780
25781	_renderButtonItem: function( item ) {
25782		var buttonItem = $( "<span>" );
25783
25784		this._setText( buttonItem, item.label );
25785		this._addClass( buttonItem, "ui-selectmenu-text" );
25786
25787		return buttonItem;
25788	},
25789
25790	_renderMenu: function( ul, items ) {
25791		var that = this,
25792			currentOptgroup = "";
25793
25794		$.each( items, function( index, item ) {
25795			var li;
25796
25797			if ( item.optgroup !== currentOptgroup ) {
25798				li = $( "<li>", {
25799					text: item.optgroup
25800				} );
25801				that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
25802					( item.element.parent( "optgroup" ).prop( "disabled" ) ?
25803						" ui-state-disabled" :
25804						"" ) );
25805
25806				li.appendTo( ul );
25807
25808				currentOptgroup = item.optgroup;
25809			}
25810
25811			that._renderItemData( ul, item );
25812		} );
25813	},
25814
25815	_renderItemData: function( ul, item ) {
25816		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
25817	},
25818
25819	_renderItem: function( ul, item ) {
25820		var li = $( "<li>" ),
25821			wrapper = $( "<div>", {
25822				title: item.element.attr( "title" )
25823			} );
25824
25825		if ( item.disabled ) {
25826			this._addClass( li, null, "ui-state-disabled" );
25827		}
25828		this._setText( wrapper, item.label );
25829
25830		return li.append( wrapper ).appendTo( ul );
25831	},
25832
25833	_setText: function( element, value ) {
25834		if ( value ) {
25835			element.text( value );
25836		} else {
25837			element.html( "&#160;" );
25838		}
25839	},
25840
25841	_move: function( direction, event ) {
25842		var item, next,
25843			filter = ".ui-menu-item";
25844
25845		if ( this.isOpen ) {
25846			item = this.menuItems.eq( this.focusIndex ).parent( "li" );
25847		} else {
25848			item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
25849			filter += ":not(.ui-state-disabled)";
25850		}
25851
25852		if ( direction === "first" || direction === "last" ) {
25853			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
25854		} else {
25855			next = item[ direction + "All" ]( filter ).eq( 0 );
25856		}
25857
25858		if ( next.length ) {
25859			this.menuInstance.focus( event, next );
25860		}
25861	},
25862
25863	_getSelectedItem: function() {
25864		return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
25865	},
25866
25867	_toggle: function( event ) {
25868		this[ this.isOpen ? "close" : "open" ]( event );
25869	},
25870
25871	_setSelection: function() {
25872		var selection;
25873
25874		if ( !this.range ) {
25875			return;
25876		}
25877
25878		if ( window.getSelection ) {
25879			selection = window.getSelection();
25880			selection.removeAllRanges();
25881			selection.addRange( this.range );
25882
vendor: 5,889 bytes, lines 25883-26132
25883		// Support: IE8
25884		} else {
25885			this.range.select();
25886		}
25887
25888		// Support: IE
25889		// Setting the text selection kills the button focus in IE, but
25890		// restoring the focus doesn't kill the selection.
25891		this.button.trigger( "focus" );
25892	},
25893
25894	_documentClick: {
25895		mousedown: function( event ) {
25896			if ( !this.isOpen ) {
25897				return;
25898			}
25899
25900			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" +
25901				$.escapeSelector( this.ids.button ) ).length ) {
25902				this.close( event );
25903			}
25904		}
25905	},
25906
25907	_buttonEvents: {
25908
25909		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
25910		mousedown: function() {
25911			var selection;
25912
25913			if ( window.getSelection ) {
25914				selection = window.getSelection();
25915				if ( selection.rangeCount ) {
25916					this.range = selection.getRangeAt( 0 );
25917				}
25918
25919			// Support: IE8
25920			} else {
25921				this.range = document.selection.createRange();
25922			}
25923		},
25924
25925		click: function( event ) {
25926			this._setSelection();
25927			this._toggle( event );
25928		},
25929
25930		keydown: function( event ) {
25931			var preventDefault = true;
25932			switch ( event.keyCode ) {
25933			case $.ui.keyCode.TAB:
25934			case $.ui.keyCode.ESCAPE:
25935				this.close( event );
25936				preventDefault = false;
25937				break;
25938			case $.ui.keyCode.ENTER:
25939				if ( this.isOpen ) {
25940					this._selectFocusedItem( event );
25941				}
25942				break;
25943			case $.ui.keyCode.UP:
25944				if ( event.altKey ) {
25945					this._toggle( event );
25946				} else {
25947					this._move( "prev", event );
25948				}
25949				break;
25950			case $.ui.keyCode.DOWN:
25951				if ( event.altKey ) {
25952					this._toggle( event );
25953				} else {
25954					this._move( "next", event );
25955				}
25956				break;
25957			case $.ui.keyCode.SPACE:
25958				if ( this.isOpen ) {
25959					this._selectFocusedItem( event );
25960				} else {
25961					this._toggle( event );
25962				}
25963				break;
25964			case $.ui.keyCode.LEFT:
25965				this._move( "prev", event );
25966				break;
25967			case $.ui.keyCode.RIGHT:
25968				this._move( "next", event );
25969				break;
25970			case $.ui.keyCode.HOME:
25971			case $.ui.keyCode.PAGE_UP:
25972				this._move( "first", event );
25973				break;
25974			case $.ui.keyCode.END:
25975			case $.ui.keyCode.PAGE_DOWN:
25976				this._move( "last", event );
25977				break;
25978			default:
25979				this.menu.trigger( event );
25980				preventDefault = false;
25981			}
25982
25983			if ( preventDefault ) {
25984				event.preventDefault();
25985			}
25986		}
25987	},
25988
25989	_selectFocusedItem: function( event ) {
25990		var item = this.menuItems.eq( this.focusIndex ).parent( "li" );
25991		if ( !item.hasClass( "ui-state-disabled" ) ) {
25992			this._select( item.data( "ui-selectmenu-item" ), event );
25993		}
25994	},
25995
25996	_select: function( item, event ) {
25997		var oldIndex = this.element[ 0 ].selectedIndex;
25998
25999		// Change native select element
26000		this.element[ 0 ].selectedIndex = item.index;
26001		this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );
26002		this._setAria( item );
26003		this._trigger( "select", event, { item: item } );
26004
26005		if ( item.index !== oldIndex ) {
26006			this._trigger( "change", event, { item: item } );
26007		}
26008
26009		this.close( event );
26010	},
26011
26012	_setAria: function( item ) {
26013		var id = this.menuItems.eq( item.index ).attr( "id" );
26014
26015		this.button.attr( {
26016			"aria-labelledby": id,
26017			"aria-activedescendant": id
26018		} );
26019		this.menu.attr( "aria-activedescendant", id );
26020	},
26021
26022	_setOption: function( key, value ) {
26023		if ( key === "icons" ) {
26024			var icon = this.button.find( "span.ui-icon" );
26025			this._removeClass( icon, null, this.options.icons.button )
26026				._addClass( icon, null, value.button );
26027		}
26028
26029		this._super( key, value );
26030
26031		if ( key === "appendTo" ) {
26032			this.menuWrap.appendTo( this._appendTo() );
26033		}
26034
26035		if ( key === "width" ) {
26036			this._resizeButton();
26037		}
26038	},
26039
26040	_setOptionDisabled: function( value ) {
26041		this._super( value );
26042
26043		this.menuInstance.option( "disabled", value );
26044		this.button.attr( "aria-disabled", value );
26045		this._toggleClass( this.button, null, "ui-state-disabled", value );
26046
26047		this.element.prop( "disabled", value );
26048		if ( value ) {
26049			this.button.attr( "tabindex", -1 );
26050			this.close();
26051		} else {
26052			this.button.attr( "tabindex", 0 );
26053		}
26054	},
26055
26056	_appendTo: function() {
26057		var element = this.options.appendTo;
26058
26059		if ( element ) {
26060			element = element.jquery || element.nodeType ?
26061				$( element ) :
26062				this.document.find( element ).eq( 0 );
26063		}
26064
26065		if ( !element || !element[ 0 ] ) {
26066			element = this.element.closest( ".ui-front, dialog" );
26067		}
26068
26069		if ( !element.length ) {
26070			element = this.document[ 0 ].body;
26071		}
26072
26073		return element;
26074	},
26075
26076	_toggleAttr: function() {
26077		this.button.attr( "aria-expanded", this.isOpen );
26078
26079		// We can't use two _toggleClass() calls here, because we need to make sure
26080		// we always remove classes first and add them second, otherwise if both classes have the
26081		// same theme class, it will be removed after we add it.
26082		this._removeClass( this.button, "ui-selectmenu-button-" +
26083			( this.isOpen ? "closed" : "open" ) )
26084			._addClass( this.button, "ui-selectmenu-button-" +
26085				( this.isOpen ? "open" : "closed" ) )
26086			._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
26087
26088		this.menu.attr( "aria-hidden", !this.isOpen );
26089	},
26090
26091	_resizeButton: function() {
26092		var width = this.options.width;
26093
26094		// For `width: false`, just remove inline style and stop
26095		if ( width === false ) {
26096			this.button.css( "width", "" );
26097			return;
26098		}
26099
26100		// For `width: null`, match the width of the original element
26101		if ( width === null ) {
26102			width = this.element.show().outerWidth();
26103			this.element.hide();
26104		}
26105
26106		this.button.outerWidth( width );
26107	},
26108
26109	_resizeMenu: function() {
26110		this.menu.outerWidth( Math.max(
26111			this.button.outerWidth(),
26112
26113			// Support: IE10
26114			// IE10 wraps long text (possibly a rounding bug)
26115			// so we add 1px to avoid the wrapping
26116			this.menu.width( "" ).outerWidth() + 1
26117		) );
26118	},
26119
26120	_getCreateOptions: function() {
26121		var options = this._super();
26122
26123		options.disabled = this.element.prop( "disabled" );
26124
26125		return options;
26126	},
26127
26128	_parseOptions: function( options ) {
26129		var that = this,
26130			data = [];
26131		options.each( function( index, item ) {
26132			
vendor: 3,668 bytes, lines 26132-26282
26132if ( item.hidden ) {
26133				return;
26134			}
26135
26136			data.push( that._parseOption( $( item ), index ) );
26137		} );
26138		this.items = data;
26139	},
26140
26141	_parseOption: function( option, index ) {
26142		var optgroup = option.parent( "optgroup" );
26143
26144		return {
26145			element: option,
26146			index: index,
26147			value: option.val(),
26148			label: option.text(),
26149			optgroup: optgroup.attr( "label" ) || "",
26150			disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
26151		};
26152	},
26153
26154	_destroy: function() {
26155		this._unbindFormResetHandler();
26156		this.menuWrap.remove();
26157		this.button.remove();
26158		this.element.show();
26159		this.element.removeUniqueId();
26160		this.labels.attr( "for", this.ids.element );
26161	}
26162} ] );
26163
26164
26165/*!
26166 * jQuery UI Slider 1.13.2
26167 * http://jqueryui.com
26168 *
26169 * Copyright jQuery Foundation and other contributors
26170 * Released under the MIT license.
26171 * http://jquery.org/license
26172 */
26173
26174//>>label: Slider
26175//>>group: Widgets
26176//>>description: Displays a flexible slider with ranges and accessibility via keyboard.
26177//>>docs: http://api.jqueryui.com/slider/
26178//>>demos: http://jqueryui.com/slider/
26179//>>css.structure: ../../themes/base/core.css
26180//>>css.structure: ../../themes/base/slider.css
26181//>>css.theme: ../../themes/base/theme.css
26182
26183
26184var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
26185	version: "1.13.2",
26186	widgetEventPrefix: "slide",
26187
26188	options: {
26189		animate: false,
26190		classes: {
26191			"ui-slider": "ui-corner-all",
26192			"ui-slider-handle": "ui-corner-all",
26193
26194			// Note: ui-widget-header isn't the most fittingly semantic framework class for this
26195			// element, but worked best visually with a variety of themes
26196			"ui-slider-range": "ui-corner-all ui-widget-header"
26197		},
26198		distance: 0,
26199		max: 100,
26200		min: 0,
26201		orientation: "horizontal",
26202		range: false,
26203		step: 1,
26204		value: 0,
26205		values: null,
26206
26207		// Callbacks
26208		change: null,
26209		slide: null,
26210		start: null,
26211		stop: null
26212	},
26213
26214	// Number of pages in a slider
26215	// (how many times can you page up/down to go through the whole range)
26216	numPages: 5,
26217
26218	_create: function() {
26219		this._keySliding = false;
26220		this._mouseSliding = false;
26221		this._animateOff = true;
26222		this._handleIndex = null;
26223		this._detectOrientation();
26224		this._mouseInit();
26225		this._calculateNewMax();
26226
26227		this._addClass( "ui-slider ui-slider-" + this.orientation,
26228			"ui-widget ui-widget-content" );
26229
26230		this._refresh();
26231
26232		this._animateOff = false;
26233	},
26234
26235	_refresh: function() {
26236		this._createRange();
26237		this._createHandles();
26238		this._setupEvents();
26239		this._refreshValue();
26240	},
26241
26242	_createHandles: function() {
26243		var i, handleCount,
26244			options = this.options,
26245			existingHandles = this.element.find( ".ui-slider-handle" ),
26246			handle = "<span tabindex='0'></span>",
26247			handles = [];
26248
26249		handleCount = ( options.values && options.values.length ) || 1;
26250
26251		if ( existingHandles.length > handleCount ) {
26252			existingHandles.slice( handleCount ).remove();
26253			existingHandles = existingHandles.slice( 0, handleCount );
26254		}
26255
26256		for ( i = existingHandles.length; i < handleCount; i++ ) {
26257			handles.push( handle );
26258		}
26259
26260		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
26261
26262		this._addClass( this.handles, "ui-slider-handle", "ui-state-default" );
26263
26264		this.handle = this.handles.eq( 0 );
26265
26266		this.handles.each( function( i ) {
26267			$( this )
26268				.data( "ui-slider-handle-index", i )
26269				.attr( "tabIndex", 0 );
26270		} );
26271	},
26272
26273	_createRange: function() {
26274		var options = this.options;
26275
26276		if ( options.range ) {
26277			if ( options.range === true ) {
26278				if ( !options.values ) {
26279					options.values = [ this._valueMin(), this._valueMin() ];
26280				} else if ( options.values.length && options.values.length !== 2 ) {
26281					options.values = [ options.values[ 0 ], options.values[ 0 ] ];
26282				} else if ( Array
vendor: 6,343 bytes, lines 26282-26528
26282.isArray( options.values ) ) {
26283					options.values = options.values.slice( 0 );
26284				}
26285			}
26286
26287			if ( !this.range || !this.range.length ) {
26288				this.range = $( "<div>" )
26289					.appendTo( this.element );
26290
26291				this._addClass( this.range, "ui-slider-range" );
26292			} else {
26293				this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" );
26294
26295				// Handle range switching from true to min/max
26296				this.range.css( {
26297					"left": "",
26298					"bottom": ""
26299				} );
26300			}
26301			if ( options.range === "min" || options.range === "max" ) {
26302				this._addClass( this.range, "ui-slider-range-" + options.range );
26303			}
26304		} else {
26305			if ( this.range ) {
26306				this.range.remove();
26307			}
26308			this.range = null;
26309		}
26310	},
26311
26312	_setupEvents: function() {
26313		this._off( this.handles );
26314		this._on( this.handles, this._handleEvents );
26315		this._hoverable( this.handles );
26316		this._focusable( this.handles );
26317	},
26318
26319	_destroy: function() {
26320		this.handles.remove();
26321		if ( this.range ) {
26322			this.range.remove();
26323		}
26324
26325		this._mouseDestroy();
26326	},
26327
26328	_mouseCapture: function( event ) {
26329		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
26330			that = this,
26331			o = this.options;
26332
26333		if ( o.disabled ) {
26334			return false;
26335		}
26336
26337		this.elementSize = {
26338			width: this.element.outerWidth(),
26339			height: this.element.outerHeight()
26340		};
26341		this.elementOffset = this.element.offset();
26342
26343		position = { x: event.pageX, y: event.pageY };
26344		normValue = this._normValueFromMouse( position );
26345		distance = this._valueMax() - this._valueMin() + 1;
26346		this.handles.each( function( i ) {
26347			var thisDistance = Math.abs( normValue - that.values( i ) );
26348			if ( ( distance > thisDistance ) ||
26349				( distance === thisDistance &&
26350					( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {
26351				distance = thisDistance;
26352				closestHandle = $( this );
26353				index = i;
26354			}
26355		} );
26356
26357		allowed = this._start( event, index );
26358		if ( allowed === false ) {
26359			return false;
26360		}
26361		this._mouseSliding = true;
26362
26363		this._handleIndex = index;
26364
26365		this._addClass( closestHandle, null, "ui-state-active" );
26366		closestHandle.trigger( "focus" );
26367
26368		offset = closestHandle.offset();
26369		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
26370		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
26371			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
26372			top: event.pageY - offset.top -
26373				( closestHandle.height() / 2 ) -
26374				( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) -
26375				( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) +
26376				( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 )
26377		};
26378
26379		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
26380			this._slide( event, index, normValue );
26381		}
26382		this._animateOff = true;
26383		return true;
26384	},
26385
26386	_mouseStart: function() {
26387		return true;
26388	},
26389
26390	_mouseDrag: function( event ) {
26391		var position = { x: event.pageX, y: event.pageY },
26392			normValue = this._normValueFromMouse( position );
26393
26394		this._slide( event, this._handleIndex, normValue );
26395
26396		return false;
26397	},
26398
26399	_mouseStop: function( event ) {
26400		this._removeClass( this.handles, null, "ui-state-active" );
26401		this._mouseSliding = false;
26402
26403		this._stop( event, this._handleIndex );
26404		this._change( event, this._handleIndex );
26405
26406		this._handleIndex = null;
26407		this._clickOffset = null;
26408		this._animateOff = false;
26409
26410		return false;
26411	},
26412
26413	_detectOrientation: function() {
26414		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
26415	},
26416
26417	_normValueFromMouse: function( position ) {
26418		var pixelTotal,
26419			pixelMouse,
26420			percentMouse,
26421			valueTotal,
26422			valueMouse;
26423
26424		if ( this.orientation === "horizontal" ) {
26425			pixelTotal = this.elementSize.width;
26426			pixelMouse = position.x - this.elementOffset.left -
26427				( this._clickOffset ? this._clickOffset.left : 0 );
26428		} else {
26429			pixelTotal = this.elementSize.height;
26430			pixelMouse = position.y - this.elementOffset.top -
26431				( this._clickOffset ? this._clickOffset.top : 0 );
26432		}
26433
26434		percentMouse = ( pixelMouse / pixelTotal );
26435		if ( percentMouse > 1 ) {
26436			percentMouse = 1;
26437		}
26438		if ( percentMouse < 0 ) {
26439			percentMouse = 0;
26440		}
26441		if ( this.orientation === "vertical" ) {
26442			percentMouse = 1 - percentMouse;
26443		}
26444
26445		valueTotal = this._valueMax() - this._valueMin();
26446		valueMouse = this._valueMin() + percentMouse * valueTotal;
26447
26448		return this._trimAlignValue( valueMouse );
26449	},
26450
26451	_uiHash: function( index, value, values ) {
26452		var uiHash = {
26453			handle: this.handles[ index ],
26454			handleIndex: index,
26455			value: value !== undefined ? value : this.value()
26456		};
26457
26458		if ( this._hasMultipleValues() ) {
26459			uiHash.value = value !== undefined ? value : this.values( index );
26460			uiHash.values = values || this.values();
26461		}
26462
26463		return uiHash;
26464	},
26465
26466	_hasMultipleValues: function() {
26467		return this.options.values && this.options.values.length;
26468	},
26469
26470	_start: function( event, index ) {
26471		return this._trigger( "start", event, this._uiHash( index ) );
26472	},
26473
26474	_slide: function( event, index, newVal ) {
26475		var allowed, otherVal,
26476			currentValue = this.value(),
26477			newValues = this.values();
26478
26479		if ( this._hasMultipleValues() ) {
26480			otherVal = this.values( index ? 0 : 1 );
26481			currentValue = this.values( index );
26482
26483			if ( this.options.values.length === 2 && this.options.range === true ) {
26484				newVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );
26485			}
26486
26487			newValues[ index ] = newVal;
26488		}
26489
26490		if ( newVal === currentValue ) {
26491			return;
26492		}
26493
26494		allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) );
26495
26496		// A slide can be canceled by returning false from the slide callback
26497		if ( allowed === false ) {
26498			return;
26499		}
26500
26501		if ( this._hasMultipleValues() ) {
26502			this.values( index, newVal );
26503		} else {
26504			this.value( newVal );
26505		}
26506	},
26507
26508	_stop: function( event, index ) {
26509		this._trigger( "stop", event, this._uiHash( index ) );
26510	},
26511
26512	_change: function( event, index ) {
26513		if ( !this._keySliding && !this._mouseSliding ) {
26514
26515			//store the last changed value index for reference when handles overlap
26516			this._lastChangedValue = index;
26517			this._trigger( "change", event, this._uiHash( index ) );
26518		}
26519	},
26520
26521	value: function( newValue ) {
26522		if ( arguments.length ) {
26523			this.options.value = this._trimAlignValue( newValue );
26524			this._refreshValue();
26525			this._change( null, 0 );
26526			return;
26527		}
26528
vendor: 4,358 bytes, lines 26529-26701
26529		return this._value();
26530	},
26531
26532	values: function( index, newValue ) {
26533		var vals,
26534			newValues,
26535			i;
26536
26537		if ( arguments.length > 1 ) {
26538			this.options.values[ index ] = this._trimAlignValue( newValue );
26539			this._refreshValue();
26540			this._change( null, index );
26541			return;
26542		}
26543
26544		if ( arguments.length ) {
26545			if ( Array.isArray( arguments[ 0 ] ) ) {
26546				vals = this.options.values;
26547				newValues = arguments[ 0 ];
26548				for ( i = 0; i < vals.length; i += 1 ) {
26549					vals[ i ] = this._trimAlignValue( newValues[ i ] );
26550					this._change( null, i );
26551				}
26552				this._refreshValue();
26553			} else {
26554				if ( this._hasMultipleValues() ) {
26555					return this._values( index );
26556				} else {
26557					return this.value();
26558				}
26559			}
26560		} else {
26561			return this._values();
26562		}
26563	},
26564
26565	_setOption: function( key, value ) {
26566		var i,
26567			valsLength = 0;
26568
26569		if ( key === "range" && this.options.range === true ) {
26570			if ( value === "min" ) {
26571				this.options.value = this._values( 0 );
26572				this.options.values = null;
26573			} else if ( value === "max" ) {
26574				this.options.value = this._values( this.options.values.length - 1 );
26575				this.options.values = null;
26576			}
26577		}
26578
26579		if ( Array.isArray( this.options.values ) ) {
26580			valsLength = this.options.values.length;
26581		}
26582
26583		this._super( key, value );
26584
26585		switch ( key ) {
26586			case "orientation":
26587				this._detectOrientation();
26588				this._removeClass( "ui-slider-horizontal ui-slider-vertical" )
26589					._addClass( "ui-slider-" + this.orientation );
26590				this._refreshValue();
26591				if ( this.options.range ) {
26592					this._refreshRange( value );
26593				}
26594
26595				// Reset positioning from previous orientation
26596				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
26597				break;
26598			case "value":
26599				this._animateOff = true;
26600				this._refreshValue();
26601				this._change( null, 0 );
26602				this._animateOff = false;
26603				break;
26604			case "values":
26605				this._animateOff = true;
26606				this._refreshValue();
26607
26608				// Start from the last handle to prevent unreachable handles (#9046)
26609				for ( i = valsLength - 1; i >= 0; i-- ) {
26610					this._change( null, i );
26611				}
26612				this._animateOff = false;
26613				break;
26614			case "step":
26615			case "min":
26616			case "max":
26617				this._animateOff = true;
26618				this._calculateNewMax();
26619				this._refreshValue();
26620				this._animateOff = false;
26621				break;
26622			case "range":
26623				this._animateOff = true;
26624				this._refresh();
26625				this._animateOff = false;
26626				break;
26627		}
26628	},
26629
26630	_setOptionDisabled: function( value ) {
26631		this._super( value );
26632
26633		this._toggleClass( null, "ui-state-disabled", !!value );
26634	},
26635
26636	//internal value getter
26637	// _value() returns value trimmed by min and max, aligned by step
26638	_value: function() {
26639		var val = this.options.value;
26640		val = this._trimAlignValue( val );
26641
26642		return val;
26643	},
26644
26645	//internal values getter
26646	// _values() returns array of values trimmed by min and max, aligned by step
26647	// _values( index ) returns single value trimmed by min and max, aligned by step
26648	_values: function( index ) {
26649		var val,
26650			vals,
26651			i;
26652
26653		if ( arguments.length ) {
26654			val = this.options.values[ index ];
26655			val = this._trimAlignValue( val );
26656
26657			return val;
26658		} else if ( this._hasMultipleValues() ) {
26659
26660			// .slice() creates a copy of the array
26661			// this copy gets trimmed by min and max and then returned
26662			vals = this.options.values.slice();
26663			for ( i = 0; i < vals.length; i += 1 ) {
26664				vals[ i ] = this._trimAlignValue( vals[ i ] );
26665			}
26666
26667			return vals;
26668		} else {
26669			return [];
26670		}
26671	},
26672
26673	// Returns the step-aligned value that val is closest to, between (inclusive) min and max
26674	_trimAlignValue: function( val ) {
26675		if ( val <= this._valueMin() ) {
26676			return this._valueMin();
26677		}
26678		if ( val >= this._valueMax() ) {
26679			return this._valueMax();
26680		}
26681		var step = ( this.options.step > 0 ) ? this.options.step : 1,
26682			valModStep = ( val - this._valueMin() ) % step,
26683			alignValue = val - valModStep;
26684
26685		if ( Math.abs( valModStep ) * 2 >= step ) {
26686			alignValue += ( valModStep > 0 ) ? step : ( -step );
26687		}
26688
26689		// Since JavaScript has problems with large floats, round
26690		// the final value to 5 digits after the decimal point (see #4124)
26691		return parseFloat( alignValue.toFixed( 5 ) );
26692	},
26693
26694	_calculateNewMax: function() {
26695		var max = this.options.max,
26696			min = this._valueMin(),
26697			step = this.options.step,
26698			aboveMin = Math.round( ( max - min ) / step ) * step;
26699		max = aboveMin + min;
26700		if ( max > this.options.max ) {
26701
vendor: 5,594 bytes, lines 26702-26901
26702			//If max is not divisible by step, rounding off may increase its value
26703			max -= step;
26704		}
26705		this.max = parseFloat( max.toFixed( this._precision() ) );
26706	},
26707
26708	_precision: function() {
26709		var precision = this._precisionOf( this.options.step );
26710		if ( this.options.min !== null ) {
26711			precision = Math.max( precision, this._precisionOf( this.options.min ) );
26712		}
26713		return precision;
26714	},
26715
26716	_precisionOf: function( num ) {
26717		var str = num.toString(),
26718			decimal = str.indexOf( "." );
26719		return decimal === -1 ? 0 : str.length - decimal - 1;
26720	},
26721
26722	_valueMin: function() {
26723		return this.options.min;
26724	},
26725
26726	_valueMax: function() {
26727		return this.max;
26728	},
26729
26730	_refreshRange: function( orientation ) {
26731		if ( orientation === "vertical" ) {
26732			this.range.css( { "width": "", "left": "" } );
26733		}
26734		if ( orientation === "horizontal" ) {
26735			this.range.css( { "height": "", "bottom": "" } );
26736		}
26737	},
26738
26739	_refreshValue: function() {
26740		var lastValPercent, valPercent, value, valueMin, valueMax,
26741			oRange = this.options.range,
26742			o = this.options,
26743			that = this,
26744			animate = ( !this._animateOff ) ? o.animate : false,
26745			_set = {};
26746
26747		if ( this._hasMultipleValues() ) {
26748			this.handles.each( function( i ) {
26749				valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -
26750					that._valueMin() ) * 100;
26751				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
26752				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
26753				if ( that.options.range === true ) {
26754					if ( that.orientation === "horizontal" ) {
26755						if ( i === 0 ) {
26756							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
26757								left: valPercent + "%"
26758							}, o.animate );
26759						}
26760						if ( i === 1 ) {
26761							that.range[ animate ? "animate" : "css" ]( {
26762								width: ( valPercent - lastValPercent ) + "%"
26763							}, {
26764								queue: false,
26765								duration: o.animate
26766							} );
26767						}
26768					} else {
26769						if ( i === 0 ) {
26770							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
26771								bottom: ( valPercent ) + "%"
26772							}, o.animate );
26773						}
26774						if ( i === 1 ) {
26775							that.range[ animate ? "animate" : "css" ]( {
26776								height: ( valPercent - lastValPercent ) + "%"
26777							}, {
26778								queue: false,
26779								duration: o.animate
26780							} );
26781						}
26782					}
26783				}
26784				lastValPercent = valPercent;
26785			} );
26786		} else {
26787			value = this.value();
26788			valueMin = this._valueMin();
26789			valueMax = this._valueMax();
26790			valPercent = ( valueMax !== valueMin ) ?
26791					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
26792					0;
26793			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
26794			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
26795
26796			if ( oRange === "min" && this.orientation === "horizontal" ) {
26797				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
26798					width: valPercent + "%"
26799				}, o.animate );
26800			}
26801			if ( oRange === "max" && this.orientation === "horizontal" ) {
26802				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
26803					width: ( 100 - valPercent ) + "%"
26804				}, o.animate );
26805			}
26806			if ( oRange === "min" && this.orientation === "vertical" ) {
26807				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
26808					height: valPercent + "%"
26809				}, o.animate );
26810			}
26811			if ( oRange === "max" && this.orientation === "vertical" ) {
26812				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
26813					height: ( 100 - valPercent ) + "%"
26814				}, o.animate );
26815			}
26816		}
26817	},
26818
26819	_handleEvents: {
26820		keydown: function( event ) {
26821			var allowed, curVal, newVal, step,
26822				index = $( event.target ).data( "ui-slider-handle-index" );
26823
26824			switch ( event.keyCode ) {
26825				case $.ui.keyCode.HOME:
26826				case $.ui.keyCode.END:
26827				case $.ui.keyCode.PAGE_UP:
26828				case $.ui.keyCode.PAGE_DOWN:
26829				case $.ui.keyCode.UP:
26830				case $.ui.keyCode.RIGHT:
26831				case $.ui.keyCode.DOWN:
26832				case $.ui.keyCode.LEFT:
26833					event.preventDefault();
26834					if ( !this._keySliding ) {
26835						this._keySliding = true;
26836						this._addClass( $( event.target ), null, "ui-state-active" );
26837						allowed = this._start( event, index );
26838						if ( allowed === false ) {
26839							return;
26840						}
26841					}
26842					break;
26843			}
26844
26845			step = this.options.step;
26846			if ( this._hasMultipleValues() ) {
26847				curVal = newVal = this.values( index );
26848			} else {
26849				curVal = newVal = this.value();
26850			}
26851
26852			switch ( event.keyCode ) {
26853				case $.ui.keyCode.HOME:
26854					newVal = this._valueMin();
26855					break;
26856				case $.ui.keyCode.END:
26857					newVal = this._valueMax();
26858					break;
26859				case $.ui.keyCode.PAGE_UP:
26860					newVal = this._trimAlignValue(
26861						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
26862					);
26863					break;
26864				case $.ui.keyCode.PAGE_DOWN:
26865					newVal = this._trimAlignValue(
26866						curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );
26867					break;
26868				case $.ui.keyCode.UP:
26869				case $.ui.keyCode.RIGHT:
26870					if ( curVal === this._valueMax() ) {
26871						return;
26872					}
26873					newVal = this._trimAlignValue( curVal + step );
26874					break;
26875				case $.ui.keyCode.DOWN:
26876				case $.ui.keyCode.LEFT:
26877					if ( curVal === this._valueMin() ) {
26878						return;
26879					}
26880					newVal = this._trimAlignValue( curVal - step );
26881					break;
26882			}
26883
26884			this._slide( event, index, newVal );
26885		},
26886		keyup: function( event ) {
26887			var index = $( event.target ).data( "ui-slider-handle-index" );
26888
26889			if ( this._keySliding ) {
26890				this._keySliding = false;
26891				this._stop( event, index );
26892				this._change( event, index );
26893				this._removeClass( $( event.target ), null, "ui-state-active" );
26894			}
26895		}
26896	}
26897} );
26898
26899
26900/*!
26901 * jQuery UI Sortable 1.1
269013.2
26902 * http://jqueryui.com
26903 *
26904 * Copyright jQuery Foundation and other contributors
26905 * Released under the MIT license.
26906 * http://jquery.org/license
26907 */
26908
26909//>>label: Sortable
26910//>>group: Interactions
26911//>>description: Enables items in a list to be sorted using the mouse.
26912//>>docs: http://api.jqueryui.com/sortable/
26913//>>demos: http://jqueryui.com/sortable/
26914//>>css.structure: ../../themes/base/sortable.css
26915
26916
26917var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
26918	version: "1.13.2
vendor: 7,925 bytes, lines 26918-27237
26918",
26919	widgetEventPrefix: "sort",
26920	ready: false,
26921	options: {
26922		appendTo: "parent",
26923		axis: false,
26924		connectWith: false,
26925		containment: false,
26926		cursor: "auto",
26927		cursorAt: false,
26928		dropOnEmpty: true,
26929		forcePlaceholderSize: false,
26930		forceHelperSize: false,
26931		grid: false,
26932		handle: false,
26933		helper: "original",
26934		items: "> *",
26935		opacity: false,
26936		placeholder: false,
26937		revert: false,
26938		scroll: true,
26939		scrollSensitivity: 20,
26940		scrollSpeed: 20,
26941		scope: "default",
26942		tolerance: "intersect",
26943		zIndex: 1000,
26944
26945		// Callbacks
26946		activate: null,
26947		beforeStop: null,
26948		change: null,
26949		deactivate: null,
26950		out: null,
26951		over: null,
26952		receive: null,
26953		remove: null,
26954		sort: null,
26955		start: null,
26956		stop: null,
26957		update: null
26958	},
26959
26960	_isOverAxis: function( x, reference, size ) {
26961		return ( x >= reference ) && ( x < ( reference + size ) );
26962	},
26963
26964	_isFloating: function( item ) {
26965		return ( /left|right/ ).test( item.css( "float" ) ) ||
26966			( /inline|table-cell/ ).test( item.css( "display" ) );
26967	},
26968
26969	_create: function() {
26970		this.containerCache = {};
26971		this._addClass( "ui-sortable" );
26972
26973		//Get the items
26974		this.refresh();
26975
26976		//Let's determine the parent's offset
26977		this.offset = this.element.offset();
26978
26979		//Initialize mouse events for interaction
26980		this._mouseInit();
26981
26982		this._setHandleClassName();
26983
26984		//We're ready to go
26985		this.ready = true;
26986
26987	},
26988
26989	_setOption: function( key, value ) {
26990		this._super( key, value );
26991
26992		if ( key === "handle" ) {
26993			this._setHandleClassName();
26994		}
26995	},
26996
26997	_setHandleClassName: function() {
26998		var that = this;
26999		this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
27000		$.each( this.items, function() {
27001			that._addClass(
27002				this.instance.options.handle ?
27003					this.item.find( this.instance.options.handle ) :
27004					this.item,
27005				"ui-sortable-handle"
27006			);
27007		} );
27008	},
27009
27010	_destroy: function() {
27011		this._mouseDestroy();
27012
27013		for ( var i = this.items.length - 1; i >= 0; i-- ) {
27014			this.items[ i ].item.removeData( this.widgetName + "-item" );
27015		}
27016
27017		return this;
27018	},
27019
27020	_mouseCapture: function( event, overrideHandle ) {
27021		var currentItem = null,
27022			validHandle = false,
27023			that = this;
27024
27025		if ( this.reverting ) {
27026			return false;
27027		}
27028
27029		if ( this.options.disabled || this.options.type === "static" ) {
27030			return false;
27031		}
27032
27033		//We have to refresh the items data once first
27034		this._refreshItems( event );
27035
27036		//Find out if the clicked node (or one of its parents) is a actual item in this.items
27037		$( event.target ).parents().each( function() {
27038			if ( $.data( this, that.widgetName + "-item" ) === that ) {
27039				currentItem = $( this );
27040				return false;
27041			}
27042		} );
27043		if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
27044			currentItem = $( event.target );
27045		}
27046
27047		if ( !currentItem ) {
27048			return false;
27049		}
27050		if ( this.options.handle && !overrideHandle ) {
27051			$( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
27052				if ( this === event.target ) {
27053					validHandle = true;
27054				}
27055			} );
27056			if ( !validHandle ) {
27057				return false;
27058			}
27059		}
27060
27061		this.currentItem = currentItem;
27062		this._removeCurrentsFromItems();
27063		return true;
27064
27065	},
27066
27067	_mouseStart: function( event, overrideHandle, noActivation ) {
27068
27069		var i, body,
27070			o = this.options;
27071
27072		this.currentContainer = this;
27073
27074		//We only need to call refreshPositions, because the refreshItems call has been moved to
27075		// mouseCapture
27076		this.refreshPositions();
27077
27078		//Prepare the dragged items parent
27079		this.appendTo = $( o.appendTo !== "parent" ?
27080				o.appendTo :
27081				this.currentItem.parent() );
27082
27083		//Create and append the visible helper
27084		this.helper = this._createHelper( event );
27085
27086		//Cache the helper size
27087		this._cacheHelperProportions();
27088
27089		/*
27090		 * - Position generation -
27091		 * This block generates everything position related - it's the core of draggables.
27092		 */
27093
27094		//Cache the margins of the original element
27095		this._cacheMargins();
27096
27097		//The element's absolute position on the page minus margins
27098		this.offset = this.currentItem.offset();
27099		this.offset = {
27100			top: this.offset.top - this.margins.top,
27101			left: this.offset.left - this.margins.left
27102		};
27103
27104		$.extend( this.offset, {
27105			click: { //Where the click happened, relative to the element
27106				left: event.pageX - this.offset.left,
27107				top: event.pageY - this.offset.top
27108			},
27109
27110			// This is a relative to absolute position minus the actual position calculation -
27111			// only used for relative positioned helper
27112			relative: this._getRelativeOffset()
27113		} );
27114
27115		// After we get the helper offset, but before we get the parent offset we can
27116		// change the helper's position to absolute
27117		// TODO: Still need to figure out a way to make relative sorting possible
27118		this.helper.css( "position", "absolute" );
27119		this.cssPosition = this.helper.css( "position" );
27120
27121		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
27122		if ( o.cursorAt ) {
27123			this._adjustOffsetFromHelper( o.cursorAt );
27124		}
27125
27126		//Cache the former DOM position
27127		this.domPosition = {
27128			prev: this.currentItem.prev()[ 0 ],
27129			parent: this.currentItem.parent()[ 0 ]
27130		};
27131
27132		// If the helper is not the original, hide the original so it's not playing any role during
27133		// the drag, won't cause anything bad this way
27134		if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
27135			this.currentItem.hide();
27136		}
27137
27138		//Create the placeholder
27139		this._createPlaceholder();
27140
27141		//Get the next scrolling parent
27142		this.scrollParent = this.placeholder.scrollParent();
27143
27144		$.extend( this.offset, {
27145			parent: this._getParentOffset()
27146		} );
27147
27148		//Set a containment if given in the options
27149		if ( o.containment ) {
27150			this._setContainment();
27151		}
27152
27153		if ( o.cursor && o.cursor !== "auto" ) { // cursor option
27154			body = this.document.find( "body" );
27155
27156			// Support: IE
27157			this.storedCursor = body.css( "cursor" );
27158			body.css( "cursor", o.cursor );
27159
27160			this.storedStylesheet =
27161				$( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
27162		}
27163
27164		// We need to make sure to grab the zIndex before setting the
27165		// opacity, because setting the opacity to anything lower than 1
27166		// causes the zIndex to change from "auto" to 0.
27167		if ( o.zIndex ) { // zIndex option
27168			if ( this.helper.css( "zIndex" ) ) {
27169				this._storedZIndex = this.helper.css( "zIndex" );
27170			}
27171			this.helper.css( "zIndex", o.zIndex );
27172		}
27173
27174		if ( o.opacity ) { // opacity option
27175			if ( this.helper.css( "opacity" ) ) {
27176				this._storedOpacity = this.helper.css( "opacity" );
27177			}
27178			this.helper.css( "opacity", o.opacity );
27179		}
27180
27181		//Prepare scrolling
27182		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
27183				this.scrollParent[ 0 ].tagName !== "HTML" ) {
27184			this.overflowOffset = this.scrollParent.offset();
27185		}
27186
27187		//Call callbacks
27188		this._trigger( "start", event, this._uiHash() );
27189
27190		//Recache the helper size
27191		if ( !this._preserveHelperProportions ) {
27192			this._cacheHelperProportions();
27193		}
27194
27195		//Post "activate" events to possible containers
27196		if ( !noActivation ) {
27197			for ( i = this.containers.length - 1; i >= 0; i-- ) {
27198				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
27199			}
27200		}
27201
27202		//Prepare possible droppables
27203		if ( $.ui.ddmanager ) {
27204			$.ui.ddmanager.current = this;
27205		}
27206
27207		if ( $.ui.ddmanager && !o.dropBehaviour ) {
27208			$.ui.ddmanager.prepareOffsets( this, event );
27209		}
27210
27211		this.dragging = true;
27212
27213		this._addClass( this.helper, "ui-sortable-helper" );
27214
27215		//Move the helper, if needed
27216		if ( !this.helper.parent().is( this.appendTo ) ) {
27217			this.helper.detach().appendTo( this.appendTo );
27218
27219			//Update position
27220			this.offset.parent = this._getParentOffset();
27221		}
27222
27223		//Generate the original position
27224		this.position = this.originalPosition = this._generatePosition( event );
27225		this.originalPageX = event.pageX;
27226		this.originalPageY = event.pageY;
27227		this.lastPositionAbs = this.positionAbs = this._convertPositionTo( "absolute" );
27228
27229		this._mouseDrag( event );
27230
27231		return true;
27232
27233	},
27234
27235	_scroll: function( event ) {
27236		var o = this.options,
27237			scrolled = false;
vendor: 18,070 bytes, lines 27238-27845
27238
27239		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
27240				this.scrollParent[ 0 ].tagName !== "HTML" ) {
27241
27242			if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
27243					event.pageY < o.scrollSensitivity ) {
27244				this.scrollParent[ 0 ].scrollTop =
27245					scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
27246			} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
27247				this.scrollParent[ 0 ].scrollTop =
27248					scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
27249			}
27250
27251			if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
27252					event.pageX < o.scrollSensitivity ) {
27253				this.scrollParent[ 0 ].scrollLeft = scrolled =
27254					this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
27255			} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
27256				this.scrollParent[ 0 ].scrollLeft = scrolled =
27257					this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
27258			}
27259
27260		} else {
27261
27262			if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
27263				scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
27264			} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
27265					o.scrollSensitivity ) {
27266				scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
27267			}
27268
27269			if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
27270				scrolled = this.document.scrollLeft(
27271					this.document.scrollLeft() - o.scrollSpeed
27272				);
27273			} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
27274					o.scrollSensitivity ) {
27275				scrolled = this.document.scrollLeft(
27276					this.document.scrollLeft() + o.scrollSpeed
27277				);
27278			}
27279
27280		}
27281
27282		return scrolled;
27283	},
27284
27285	_mouseDrag: function( event ) {
27286		var i, item, itemElement, intersection,
27287			o = this.options;
27288
27289		//Compute the helpers position
27290		this.position = this._generatePosition( event );
27291		this.positionAbs = this._convertPositionTo( "absolute" );
27292
27293		//Set the helper position
27294		if ( !this.options.axis || this.options.axis !== "y" ) {
27295			this.helper[ 0 ].style.left = this.position.left + "px";
27296		}
27297		if ( !this.options.axis || this.options.axis !== "x" ) {
27298			this.helper[ 0 ].style.top = this.position.top + "px";
27299		}
27300
27301		//Do scrolling
27302		if ( o.scroll ) {
27303			if ( this._scroll( event ) !== false ) {
27304
27305				//Update item positions used in position checks
27306				this._refreshItemPositions( true );
27307
27308				if ( $.ui.ddmanager && !o.dropBehaviour ) {
27309					$.ui.ddmanager.prepareOffsets( this, event );
27310				}
27311			}
27312		}
27313
27314		this.dragDirection = {
27315			vertical: this._getDragVerticalDirection(),
27316			horizontal: this._getDragHorizontalDirection()
27317		};
27318
27319		//Rearrange
27320		for ( i = this.items.length - 1; i >= 0; i-- ) {
27321
27322			//Cache variables and intersection, continue if no intersection
27323			item = this.items[ i ];
27324			itemElement = item.item[ 0 ];
27325			intersection = this._intersectsWithPointer( item );
27326			if ( !intersection ) {
27327				continue;
27328			}
27329
27330			// Only put the placeholder inside the current Container, skip all
27331			// items from other containers. This works because when moving
27332			// an item from one container to another the
27333			// currentContainer is switched before the placeholder is moved.
27334			//
27335			// Without this, moving items in "sub-sortables" can cause
27336			// the placeholder to jitter between the outer and inner container.
27337			if ( item.instance !== this.currentContainer ) {
27338				continue;
27339			}
27340
27341			// Cannot intersect with itself
27342			// no useless actions that have been done before
27343			// no action if the item moved is the parent of the item checked
27344			if ( itemElement !== this.currentItem[ 0 ] &&
27345				this.placeholder[ intersection === 1 ?
27346				"next" : "prev" ]()[ 0 ] !== itemElement &&
27347				!$.contains( this.placeholder[ 0 ], itemElement ) &&
27348				( this.options.type === "semi-dynamic" ?
27349					!$.contains( this.element[ 0 ], itemElement ) :
27350					true
27351				)
27352			) {
27353
27354				this.direction = intersection === 1 ? "down" : "up";
27355
27356				if ( this.options.tolerance === "pointer" ||
27357						this._intersectsWithSides( item ) ) {
27358					this._rearrange( event, item );
27359				} else {
27360					break;
27361				}
27362
27363				this._trigger( "change", event, this._uiHash() );
27364				break;
27365			}
27366		}
27367
27368		//Post events to containers
27369		this._contactContainers( event );
27370
27371		//Interconnect with droppables
27372		if ( $.ui.ddmanager ) {
27373			$.ui.ddmanager.drag( this, event );
27374		}
27375
27376		//Call callbacks
27377		this._trigger( "sort", event, this._uiHash() );
27378
27379		this.lastPositionAbs = this.positionAbs;
27380		return false;
27381
27382	},
27383
27384	_mouseStop: function( event, noPropagation ) {
27385
27386		if ( !event ) {
27387			return;
27388		}
27389
27390		//If we are using droppables, inform the manager about the drop
27391		if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
27392			$.ui.ddmanager.drop( this, event );
27393		}
27394
27395		if ( this.options.revert ) {
27396			var that = this,
27397				cur = this.placeholder.offset(),
27398				axis = this.options.axis,
27399				animation = {};
27400
27401			if ( !axis || axis === "x" ) {
27402				animation.left = cur.left - this.offset.parent.left - this.margins.left +
27403					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
27404						0 :
27405						this.offsetParent[ 0 ].scrollLeft
27406					);
27407			}
27408			if ( !axis || axis === "y" ) {
27409				animation.top = cur.top - this.offset.parent.top - this.margins.top +
27410					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
27411						0 :
27412						this.offsetParent[ 0 ].scrollTop
27413					);
27414			}
27415			this.reverting = true;
27416			$( this.helper ).animate(
27417				animation,
27418				parseInt( this.options.revert, 10 ) || 500,
27419				function() {
27420					that._clear( event );
27421				}
27422			);
27423		} else {
27424			this._clear( event, noPropagation );
27425		}
27426
27427		return false;
27428
27429	},
27430
27431	cancel: function() {
27432
27433		if ( this.dragging ) {
27434
27435			this._mouseUp( new $.Event( "mouseup", { target: null } ) );
27436
27437			if ( this.options.helper === "original" ) {
27438				this.currentItem.css( this._storedCSS );
27439				this._removeClass( this.currentItem, "ui-sortable-helper" );
27440			} else {
27441				this.currentItem.show();
27442			}
27443
27444			//Post deactivating events to containers
27445			for ( var i = this.containers.length - 1; i >= 0; i-- ) {
27446				this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
27447				if ( this.containers[ i ].containerCache.over ) {
27448					this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
27449					this.containers[ i ].containerCache.over = 0;
27450				}
27451			}
27452
27453		}
27454
27455		if ( this.placeholder ) {
27456
27457			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
27458			// it unbinds ALL events from the original node!
27459			if ( this.placeholder[ 0 ].parentNode ) {
27460				this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
27461			}
27462			if ( this.options.helper !== "original" && this.helper &&
27463					this.helper[ 0 ].parentNode ) {
27464				this.helper.remove();
27465			}
27466
27467			$.extend( this, {
27468				helper: null,
27469				dragging: false,
27470				reverting: false,
27471				_noFinalSort: null
27472			} );
27473
27474			if ( this.domPosition.prev ) {
27475				$( this.domPosition.prev ).after( this.currentItem );
27476			} else {
27477				$( this.domPosition.parent ).prepend( this.currentItem );
27478			}
27479		}
27480
27481		return this;
27482
27483	},
27484
27485	serialize: function( o ) {
27486
27487		var items = this._getItemsAsjQuery( o && o.connected ),
27488			str = [];
27489		o = o || {};
27490
27491		$( items ).each( function() {
27492			var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
27493				.match( o.expression || ( /(.+)[\-=_](.+)/ ) );
27494			if ( res ) {
27495				str.push(
27496					( o.key || res[ 1 ] + "[]" ) +
27497					"=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
27498			}
27499		} );
27500
27501		if ( !str.length && o.key ) {
27502			str.push( o.key + "=" );
27503		}
27504
27505		return str.join( "&" );
27506
27507	},
27508
27509	toArray: function( o ) {
27510
27511		var items = this._getItemsAsjQuery( o && o.connected ),
27512			ret = [];
27513
27514		o = o || {};
27515
27516		items.each( function() {
27517			ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
27518		} );
27519		return ret;
27520
27521	},
27522
27523	/* Be careful with the following core functions */
27524	_intersectsWith: function( item ) {
27525
27526		var x1 = this.positionAbs.left,
27527			x2 = x1 + this.helperProportions.width,
27528			y1 = this.positionAbs.top,
27529			y2 = y1 + this.helperProportions.height,
27530			l = item.left,
27531			r = l + item.width,
27532			t = item.top,
27533			b = t + item.height,
27534			dyClick = this.offset.click.top,
27535			dxClick = this.offset.click.left,
27536			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
27537				( y1 + dyClick ) < b ),
27538			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
27539				( x1 + dxClick ) < r ),
27540			isOverElement = isOverElementHeight && isOverElementWidth;
27541
27542		if ( this.options.tolerance === "pointer" ||
27543			this.options.forcePointerForContainers ||
27544			( this.options.tolerance !== "pointer" &&
27545				this.helperProportions[ this.floating ? "width" : "height" ] >
27546				item[ this.floating ? "width" : "height" ] )
27547		) {
27548			return isOverElement;
27549		} else {
27550
27551			return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
27552				x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
27553				t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
27554				y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
27555
27556		}
27557	},
27558
27559	_intersectsWithPointer: function( item ) {
27560		var verticalDirection, horizontalDirection,
27561			isOverElementHeight = ( this.options.axis === "x" ) ||
27562				this._isOverAxis(
27563					this.positionAbs.top + this.offset.click.top, item.top, item.height ),
27564			isOverElementWidth = ( this.options.axis === "y" ) ||
27565				this._isOverAxis(
27566					this.positionAbs.left + this.offset.click.left, item.left, item.width ),
27567			isOverElement = isOverElementHeight && isOverElementWidth;
27568
27569		if ( !isOverElement ) {
27570			return false;
27571		}
27572
27573		verticalDirection = this.dragDirection.vertical;
27574		horizontalDirection = this.dragDirection.horizontal;
27575
27576		return this.floating ?
27577			( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 ) :
27578			( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
27579
27580	},
27581
27582	_intersectsWithSides: function( item ) {
27583
27584		var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
27585				this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
27586			isOverRightHalf = this._isOverAxis( this.positionAbs.left +
27587				this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
27588			verticalDirection = this.dragDirection.vertical,
27589			horizontalDirection = this.dragDirection.horizontal;
27590
27591		if ( this.floating && horizontalDirection ) {
27592			return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
27593				( horizontalDirection === "left" && !isOverRightHalf ) );
27594		} else {
27595			return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
27596				( verticalDirection === "up" && !isOverBottomHalf ) );
27597		}
27598
27599	},
27600
27601	_getDragVerticalDirection: function() {
27602		var delta = this.positionAbs.top - this.lastPositionAbs.top;
27603		return delta !== 0 && ( delta > 0 ? "down" : "up" );
27604	},
27605
27606	_getDragHorizontalDirection: function() {
27607		var delta = this.positionAbs.left - this.lastPositionAbs.left;
27608		return delta !== 0 && ( delta > 0 ? "right" : "left" );
27609	},
27610
27611	refresh: function( event ) {
27612		this._refreshItems( event );
27613		this._setHandleClassName();
27614		this.refreshPositions();
27615		return this;
27616	},
27617
27618	_connectWith: function() {
27619		var options = this.options;
27620		return options.connectWith.constructor === String ?
27621			[ options.connectWith ] :
27622			options.connectWith;
27623	},
27624
27625	_getItemsAsjQuery: function( connected ) {
27626
27627		var i, j, cur, inst,
27628			items = [],
27629			queries = [],
27630			connectWith = this._connectWith();
27631
27632		if ( connectWith && connected ) {
27633			for ( i = connectWith.length - 1; i >= 0; i-- ) {
27634				cur = $( connectWith[ i ], this.document[ 0 ] );
27635				for ( j = cur.length - 1; j >= 0; j-- ) {
27636					inst = $.data( cur[ j ], this.widgetFullName );
27637					if ( inst && inst !== this && !inst.options.disabled ) {
27638						queries.push( [ typeof inst.options.items === "function" ?
27639							inst.options.items.call( inst.element ) :
27640							$( inst.options.items, inst.element )
27641								.not( ".ui-sortable-helper" )
27642								.not( ".ui-sortable-placeholder" ), inst ] );
27643					}
27644				}
27645			}
27646		}
27647
27648		queries.push( [ typeof this.options.items === "function" ?
27649			this.options.items
27650				.call( this.element, null, { options: this.options, item: this.currentItem } ) :
27651			$( this.options.items, this.element )
27652				.not( ".ui-sortable-helper" )
27653				.not( ".ui-sortable-placeholder" ), this ] );
27654
27655		function addItems() {
27656			items.push( this );
27657		}
27658		for ( i = queries.length - 1; i >= 0; i-- ) {
27659			queries[ i ][ 0 ].each( addItems );
27660		}
27661
27662		return $( items );
27663
27664	},
27665
27666	_removeCurrentsFromItems: function() {
27667
27668		var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
27669
27670		this.items = $.grep( this.items, function( item ) {
27671			for ( var j = 0; j < list.length; j++ ) {
27672				if ( list[ j ] === item.item[ 0 ] ) {
27673					return false;
27674				}
27675			}
27676			return true;
27677		} );
27678
27679	},
27680
27681	_refreshItems: function( event ) {
27682
27683		this.items = [];
27684		this.containers = [ this ];
27685
27686		var i, j, cur, inst, targetData, _queries, item, queriesLength,
27687			items = this.items,
27688			queries = [ [ typeof this.options.items === "function" ?
27689				this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
27690				$( this.options.items, this.element ), this ] ],
27691			connectWith = this._connectWith();
27692
27693		//Shouldn't be run the first time through due to massive slow-down
27694		if ( connectWith && this.ready ) {
27695			for ( i = connectWith.length - 1; i >= 0; i-- ) {
27696				cur = $( connectWith[ i ], this.document[ 0 ] );
27697				for ( j = cur.length - 1; j >= 0; j-- ) {
27698					inst = $.data( cur[ j ], this.widgetFullName );
27699					if ( inst && inst !== this && !inst.options.disabled ) {
27700						queries.push( [ typeof inst.options.items === "function" ?
27701							inst.options.items
27702								.call( inst.element[ 0 ], event, { item: this.currentItem } ) :
27703							$( inst.options.items, inst.element ), inst ] );
27704						this.containers.push( inst );
27705					}
27706				}
27707			}
27708		}
27709
27710		for ( i = queries.length - 1; i >= 0; i-- ) {
27711			targetData = queries[ i ][ 1 ];
27712			_queries = queries[ i ][ 0 ];
27713
27714			for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
27715				item = $( _queries[ j ] );
27716
27717				// Data for target checking (mouse manager)
27718				item.data( this.widgetName + "-item", targetData );
27719
27720				items.push( {
27721					item: item,
27722					instance: targetData,
27723					width: 0, height: 0,
27724					left: 0, top: 0
27725				} );
27726			}
27727		}
27728
27729	},
27730
27731	_refreshItemPositions: function( fast ) {
27732		var i, item, t, p;
27733
27734		for ( i = this.items.length - 1; i >= 0; i-- ) {
27735			item = this.items[ i ];
27736
27737			//We ignore calculating positions of all connected containers when we're not over them
27738			if ( this.currentContainer && item.instance !== this.currentContainer &&
27739					item.item[ 0 ] !== this.currentItem[ 0 ] ) {
27740				continue;
27741			}
27742
27743			t = this.options.toleranceElement ?
27744				$( this.options.toleranceElement, item.item ) :
27745				item.item;
27746
27747			if ( !fast ) {
27748				item.width = t.outerWidth();
27749				item.height = t.outerHeight();
27750			}
27751
27752			p = t.offset();
27753			item.left = p.left;
27754			item.top = p.top;
27755		}
27756	},
27757
27758	refreshPositions: function( fast ) {
27759
27760		// Determine whether items are being displayed horizontally
27761		this.floating = this.items.length ?
27762			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
27763			false;
27764
27765		// This has to be redone because due to the item being moved out/into the offsetParent,
27766		// the offsetParent's position will change
27767		if ( this.offsetParent && this.helper ) {
27768			this.offset.parent = this._getParentOffset();
27769		}
27770
27771		this._refreshItemPositions( fast );
27772
27773		var i, p;
27774
27775		if ( this.options.custom && this.options.custom.refreshContainers ) {
27776			this.options.custom.refreshContainers.call( this );
27777		} else {
27778			for ( i = this.containers.length - 1; i >= 0; i-- ) {
27779				p = this.containers[ i ].element.offset();
27780				this.containers[ i ].containerCache.left = p.left;
27781				this.containers[ i ].containerCache.top = p.top;
27782				this.containers[ i ].containerCache.width =
27783					this.containers[ i ].element.outerWidth();
27784				this.containers[ i ].containerCache.height =
27785					this.containers[ i ].element.outerHeight();
27786			}
27787		}
27788
27789		return this;
27790	},
27791
27792	_createPlaceholder: function( that ) {
27793		that = that || this;
27794		var className, nodeName,
27795			o = that.options;
27796
27797		if ( !o.placeholder || o.placeholder.constructor === String ) {
27798			className = o.placeholder;
27799			nodeName = that.currentItem[ 0 ].nodeName.toLowerCase();
27800			o.placeholder = {
27801				element: function() {
27802
27803					var element = $( "<" + nodeName + ">", that.document[ 0 ] );
27804
27805					that._addClass( element, "ui-sortable-placeholder",
27806							className || that.currentItem[ 0 ].className )
27807						._removeClass( element, "ui-sortable-helper" );
27808
27809					if ( nodeName === "tbody" ) {
27810						that._createTrPlaceholder(
27811							that.currentItem.find( "tr" ).eq( 0 ),
27812							$( "<tr>", that.document[ 0 ] ).appendTo( element )
27813						);
27814					} else if ( nodeName === "tr" ) {
27815						that._createTrPlaceholder( that.currentItem, element );
27816					} else if ( nodeName === "img" ) {
27817						element.attr( "src", that.currentItem.attr( "src" ) );
27818					}
27819
27820					if ( !className ) {
27821						element.css( "visibility", "hidden" );
27822					}
27823
27824					return element;
27825				},
27826				update: function( container, p ) {
27827
27828					// 1. If a className is set as 'placeholder option, we don't force sizes -
27829					// the class is responsible for that
27830					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a
27831					// class name is specified
27832					if ( className && !o.forcePlaceholderSize ) {
27833						return;
27834					}
27835
27836					// If the element doesn't have a actual height or width by itself (without
27837					// styles coming from a stylesheet), it receives the inline height and width
27838					// from the dragged item. Or, if it's a tbody or tr, it's going to have a height
27839					// anyway since we're populating them with <td>s above, but they're unlikely to
27840					// be the correct height on their own if the row heights are dynamic, so we'll
27841					// always assign the height of the dragged item given forcePlaceholderSize
27842					// is true.
27843					if ( !p.height() || ( o.forcePlaceholderSize &&
27844							( nodeName === "tbody" || nodeName === "tr" ) ) ) {
27845						p.height(
vendor: 10,145 bytes, lines 27846-28153
27846							that.currentItem.innerHeight() -
27847							parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
27848							parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
27849					}
27850					if ( !p.width() ) {
27851						p.width(
27852							that.currentItem.innerWidth() -
27853							parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
27854							parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
27855					}
27856				}
27857			};
27858		}
27859
27860		//Create the placeholder
27861		that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
27862
27863		//Append it after the actual current item
27864		that.currentItem.after( that.placeholder );
27865
27866		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
27867		o.placeholder.update( that, that.placeholder );
27868
27869	},
27870
27871	_createTrPlaceholder: function( sourceTr, targetTr ) {
27872		var that = this;
27873
27874		sourceTr.children().each( function() {
27875			$( "<td>&#160;</td>", that.document[ 0 ] )
27876				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
27877				.appendTo( targetTr );
27878		} );
27879	},
27880
27881	_contactContainers: function( event ) {
27882		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
27883			floating, axis,
27884			innermostContainer = null,
27885			innermostIndex = null;
27886
27887		// Get innermost container that intersects with item
27888		for ( i = this.containers.length - 1; i >= 0; i-- ) {
27889
27890			// Never consider a container that's located within the item itself
27891			if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
27892				continue;
27893			}
27894
27895			if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
27896
27897				// If we've already found a container and it's more "inner" than this, then continue
27898				if ( innermostContainer &&
27899						$.contains(
27900							this.containers[ i ].element[ 0 ],
27901							innermostContainer.element[ 0 ] ) ) {
27902					continue;
27903				}
27904
27905				innermostContainer = this.containers[ i ];
27906				innermostIndex = i;
27907
27908			} else {
27909
27910				// container doesn't intersect. trigger "out" event if necessary
27911				if ( this.containers[ i ].containerCache.over ) {
27912					this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
27913					this.containers[ i ].containerCache.over = 0;
27914				}
27915			}
27916
27917		}
27918
27919		// If no intersecting containers found, return
27920		if ( !innermostContainer ) {
27921			return;
27922		}
27923
27924		// Move the item into the container if it's not there already
27925		if ( this.containers.length === 1 ) {
27926			if ( !this.containers[ innermostIndex ].containerCache.over ) {
27927				this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
27928				this.containers[ innermostIndex ].containerCache.over = 1;
27929			}
27930		} else {
27931
27932			// When entering a new container, we will find the item with the least distance and
27933			// append our item near it
27934			dist = 10000;
27935			itemWithLeastDistance = null;
27936			floating = innermostContainer.floating || this._isFloating( this.currentItem );
27937			posProperty = floating ? "left" : "top";
27938			sizeProperty = floating ? "width" : "height";
27939			axis = floating ? "pageX" : "pageY";
27940
27941			for ( j = this.items.length - 1; j >= 0; j-- ) {
27942				if ( !$.contains(
27943						this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
27944				) {
27945					continue;
27946				}
27947				if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
27948					continue;
27949				}
27950
27951				cur = this.items[ j ].item.offset()[ posProperty ];
27952				nearBottom = false;
27953				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
27954					nearBottom = true;
27955				}
27956
27957				if ( Math.abs( event[ axis ] - cur ) < dist ) {
27958					dist = Math.abs( event[ axis ] - cur );
27959					itemWithLeastDistance = this.items[ j ];
27960					this.direction = nearBottom ? "up" : "down";
27961				}
27962			}
27963
27964			//Check if dropOnEmpty is enabled
27965			if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
27966				return;
27967			}
27968
27969			if ( this.currentContainer === this.containers[ innermostIndex ] ) {
27970				if ( !this.currentContainer.containerCache.over ) {
27971					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
27972					this.currentContainer.containerCache.over = 1;
27973				}
27974				return;
27975			}
27976
27977			if ( itemWithLeastDistance ) {
27978				this._rearrange( event, itemWithLeastDistance, null, true );
27979			} else {
27980				this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
27981			}
27982			this._trigger( "change", event, this._uiHash() );
27983			this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
27984			this.currentContainer = this.containers[ innermostIndex ];
27985
27986			//Update the placeholder
27987			this.options.placeholder.update( this.currentContainer, this.placeholder );
27988
27989			//Update scrollParent
27990			this.scrollParent = this.placeholder.scrollParent();
27991
27992			//Update overflowOffset
27993			if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
27994					this.scrollParent[ 0 ].tagName !== "HTML" ) {
27995				this.overflowOffset = this.scrollParent.offset();
27996			}
27997
27998			this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
27999			this.containers[ innermostIndex ].containerCache.over = 1;
28000		}
28001
28002	},
28003
28004	_createHelper: function( event ) {
28005
28006		var o = this.options,
28007			helper = typeof o.helper === "function" ?
28008				$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
28009				( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
28010
28011		//Add the helper to the DOM if that didn't happen already
28012		if ( !helper.parents( "body" ).length ) {
28013			this.appendTo[ 0 ].appendChild( helper[ 0 ] );
28014		}
28015
28016		if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
28017			this._storedCSS = {
28018				width: this.currentItem[ 0 ].style.width,
28019				height: this.currentItem[ 0 ].style.height,
28020				position: this.currentItem.css( "position" ),
28021				top: this.currentItem.css( "top" ),
28022				left: this.currentItem.css( "left" )
28023			};
28024		}
28025
28026		if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
28027			helper.width( this.currentItem.width() );
28028		}
28029		if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
28030			helper.height( this.currentItem.height() );
28031		}
28032
28033		return helper;
28034
28035	},
28036
28037	_adjustOffsetFromHelper: function( obj ) {
28038		if ( typeof obj === "string" ) {
28039			obj = obj.split( " " );
28040		}
28041		if ( Array.isArray( obj ) ) {
28042			obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
28043		}
28044		if ( "left" in obj ) {
28045			this.offset.click.left = obj.left + this.margins.left;
28046		}
28047		if ( "right" in obj ) {
28048			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
28049		}
28050		if ( "top" in obj ) {
28051			this.offset.click.top = obj.top + this.margins.top;
28052		}
28053		if ( "bottom" in obj ) {
28054			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
28055		}
28056	},
28057
28058	_getParentOffset: function() {
28059
28060		//Get the offsetParent and cache its position
28061		this.offsetParent = this.helper.offsetParent();
28062		var po = this.offsetParent.offset();
28063
28064		// This is a special case where we need to modify a offset calculated on start, since the
28065		// following happened:
28066		// 1. The position of the helper is absolute, so it's position is calculated based on the
28067		// next positioned parent
28068		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
28069		// the document, which means that the scroll is included in the initial calculation of the
28070		// offset of the parent, and never recalculated upon drag
28071		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
28072				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
28073			po.left += this.scrollParent.scrollLeft();
28074			po.top += this.scrollParent.scrollTop();
28075		}
28076
28077		// This needs to be actually done for all browsers, since pageX/pageY includes this
28078		// information with an ugly IE fix
28079		if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
28080				( this.offsetParent[ 0 ].tagName &&
28081				this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
28082			po = { top: 0, left: 0 };
28083		}
28084
28085		return {
28086			top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
28087			left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
28088		};
28089
28090	},
28091
28092	_getRelativeOffset: function() {
28093
28094		if ( this.cssPosition === "relative" ) {
28095			var p = this.currentItem.position();
28096			return {
28097				top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
28098					this.scrollParent.scrollTop(),
28099				left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
28100					this.scrollParent.scrollLeft()
28101			};
28102		} else {
28103			return { top: 0, left: 0 };
28104		}
28105
28106	},
28107
28108	_cacheMargins: function() {
28109		this.margins = {
28110			left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
28111			top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
28112		};
28113	},
28114
28115	_cacheHelperProportions: function() {
28116		this.helperProportions = {
28117			width: this.helper.outerWidth(),
28118			height: this.helper.outerHeight()
28119		};
28120	},
28121
28122	_setContainment: function() {
28123
28124		var ce, co, over,
28125			o = this.options;
28126		if ( o.containment === "parent" ) {
28127			o.containment = this.helper[ 0 ].parentNode;
28128		}
28129		if ( o.containment === "document" || o.containment === "window" ) {
28130			this.containment = [
28131				0 - this.offset.relative.left - this.offset.parent.left,
28132				0 - this.offset.relative.top - this.offset.parent.top,
28133				o.containment === "document" ?
28134					this.document.width() :
28135					this.window.width() - this.helperProportions.width - this.margins.left,
28136				( o.containment === "document" ?
28137					( this.document.height() || document.body.parentNode.scrollHeight ) :
28138					this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
28139				) - this.helperProportions.height - this.margins.top
28140			];
28141		}
28142
28143		if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
28144			ce = $( o.containment )[ 0 ];
28145			co = $( o.containment ).offset();
28146			over = ( $( ce ).css( "overflow" ) !== "hidden" );
28147
28148			this.containment = [
28149				co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
28150					( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
28151				co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
28152					( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
28153				co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) 
vendor: 6,379 bytes, lines 28153-28349
28153: ce.offsetWidth ) -
28154					( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
28155					( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
28156					this.helperProportions.width - this.margins.left,
28157				co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
28158					( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
28159					( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
28160					this.helperProportions.height - this.margins.top
28161			];
28162		}
28163
28164	},
28165
28166	_convertPositionTo: function( d, pos ) {
28167
28168		if ( !pos ) {
28169			pos = this.position;
28170		}
28171		var mod = d === "absolute" ? 1 : -1,
28172			scroll = this.cssPosition === "absolute" &&
28173				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
28174				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
28175					this.offsetParent :
28176					this.scrollParent,
28177			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
28178
28179		return {
28180			top: (
28181
28182				// The absolute mouse position
28183				pos.top	+
28184
28185				// Only for relative positioned nodes: Relative offset from element to offset parent
28186				this.offset.relative.top * mod +
28187
28188				// The offsetParent's offset without borders (offset + border)
28189				this.offset.parent.top * mod -
28190				( ( this.cssPosition === "fixed" ?
28191					-this.scrollParent.scrollTop() :
28192					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
28193			),
28194			left: (
28195
28196				// The absolute mouse position
28197				pos.left +
28198
28199				// Only for relative positioned nodes: Relative offset from element to offset parent
28200				this.offset.relative.left * mod +
28201
28202				// The offsetParent's offset without borders (offset + border)
28203				this.offset.parent.left * mod	-
28204				( ( this.cssPosition === "fixed" ?
28205					-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
28206					scroll.scrollLeft() ) * mod )
28207			)
28208		};
28209
28210	},
28211
28212	_generatePosition: function( event ) {
28213
28214		var top, left,
28215			o = this.options,
28216			pageX = event.pageX,
28217			pageY = event.pageY,
28218			scroll = this.cssPosition === "absolute" &&
28219				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
28220				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
28221					this.offsetParent :
28222					this.scrollParent,
28223				scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
28224
28225		// This is another very weird special case that only happens for relative elements:
28226		// 1. If the css position is relative
28227		// 2. and the scroll parent is the document or similar to the offset parent
28228		// we have to refresh the relative offset during the scroll so there are no jumps
28229		if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
28230				this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
28231			this.offset.relative = this._getRelativeOffset();
28232		}
28233
28234		/*
28235		 * - Position constraining -
28236		 * Constrain the position to a mix of grid, containment.
28237		 */
28238
28239		if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
28240
28241			if ( this.containment ) {
28242				if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
28243					pageX = this.containment[ 0 ] + this.offset.click.left;
28244				}
28245				if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
28246					pageY = this.containment[ 1 ] + this.offset.click.top;
28247				}
28248				if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
28249					pageX = this.containment[ 2 ] + this.offset.click.left;
28250				}
28251				if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
28252					pageY = this.containment[ 3 ] + this.offset.click.top;
28253				}
28254			}
28255
28256			if ( o.grid ) {
28257				top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
28258					o.grid[ 1 ] ) * o.grid[ 1 ];
28259				pageY = this.containment ?
28260					( ( top - this.offset.click.top >= this.containment[ 1 ] &&
28261						top - this.offset.click.top <= this.containment[ 3 ] ) ?
28262							top :
28263							( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
28264								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
28265								top;
28266
28267				left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
28268					o.grid[ 0 ] ) * o.grid[ 0 ];
28269				pageX = this.containment ?
28270					( ( left - this.offset.click.left >= this.containment[ 0 ] &&
28271						left - this.offset.click.left <= this.containment[ 2 ] ) ?
28272							left :
28273							( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
28274								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
28275								left;
28276			}
28277
28278		}
28279
28280		return {
28281			top: (
28282
28283				// The absolute mouse position
28284				pageY -
28285
28286				// Click offset (relative to the element)
28287				this.offset.click.top -
28288
28289				// Only for relative positioned nodes: Relative offset from element to offset parent
28290				this.offset.relative.top -
28291
28292				// The offsetParent's offset without borders (offset + border)
28293				this.offset.parent.top +
28294				( ( this.cssPosition === "fixed" ?
28295					-this.scrollParent.scrollTop() :
28296					( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
28297			),
28298			left: (
28299
28300				// The absolute mouse position
28301				pageX -
28302
28303				// Click offset (relative to the element)
28304				this.offset.click.left -
28305
28306				// Only for relative positioned nodes: Relative offset from element to offset parent
28307				this.offset.relative.left -
28308
28309				// The offsetParent's offset without borders (offset + border)
28310				this.offset.parent.left +
28311				( ( this.cssPosition === "fixed" ?
28312					-this.scrollParent.scrollLeft() :
28313					scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
28314			)
28315		};
28316
28317	},
28318
28319	_rearrange: function( event, i, a, hardRefresh ) {
28320
28321		if ( a ) {
28322			a[ 0 ].appendChild( this.placeholder[ 0 ] );
28323		} else {
28324			i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
28325				( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
28326		}
28327
28328		//Various things done here to improve the performance:
28329		// 1. we create a setTimeout, that calls refreshPositions
28330		// 2. on the instance, we have a counter variable, that get's higher after every append
28331		// 3. on the local scope, we copy the counter variable, and check in the timeout,
28332		// if it's still the same
28333		// 4. this lets only the last addition to the timeout stack through
28334		this.counter = this.counter ? ++this.counter : 1;
28335		var counter = this.counter;
28336
28337		this._delay( function() {
28338			if ( counter === this.counter ) {
28339
28340				//Precompute after each DOM insertion, NOT on mousemove
28341				this.refreshPositions( !hardRefresh );
28342			}
28343		} );
28344
28345	},
28346
28347	_clear: function( event, noPropagation ) {
28348
28349		this.reverting = false;
vendor: 4,283 bytes, lines 28350-28494
28350
28351		// We delay all events that have to be triggered to after the point where the placeholder
28352		// has been removed and everything else normalized again
28353		var i,
28354			delayedTriggers = [];
28355
28356		// We first have to update the dom position of the actual currentItem
28357		// Note: don't do it if the current item is already removed (by a user), or it gets
28358		// reappended (see #4088)
28359		if ( !this._noFinalSort && this.currentItem.parent().length ) {
28360			this.placeholder.before( this.currentItem );
28361		}
28362		this._noFinalSort = null;
28363
28364		if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
28365			for ( i in this._storedCSS ) {
28366				if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
28367					this._storedCSS[ i ] = "";
28368				}
28369			}
28370			this.currentItem.css( this._storedCSS );
28371			this._removeClass( this.currentItem, "ui-sortable-helper" );
28372		} else {
28373			this.currentItem.show();
28374		}
28375
28376		if ( this.fromOutside && !noPropagation ) {
28377			delayedTriggers.push( function( event ) {
28378				this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
28379			} );
28380		}
28381		if ( ( this.fromOutside ||
28382				this.domPosition.prev !==
28383				this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
28384				this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
28385
28386			// Trigger update callback if the DOM position has changed
28387			delayedTriggers.push( function( event ) {
28388				this._trigger( "update", event, this._uiHash() );
28389			} );
28390		}
28391
28392		// Check if the items Container has Changed and trigger appropriate
28393		// events.
28394		if ( this !== this.currentContainer ) {
28395			if ( !noPropagation ) {
28396				delayedTriggers.push( function( event ) {
28397					this._trigger( "remove", event, this._uiHash() );
28398				} );
28399				delayedTriggers.push( ( function( c ) {
28400					return function( event ) {
28401						c._trigger( "receive", event, this._uiHash( this ) );
28402					};
28403				} ).call( this, this.currentContainer ) );
28404				delayedTriggers.push( ( function( c ) {
28405					return function( event ) {
28406						c._trigger( "update", event, this._uiHash( this ) );
28407					};
28408				} ).call( this, this.currentContainer ) );
28409			}
28410		}
28411
28412		//Post events to containers
28413		function delayEvent( type, instance, container ) {
28414			return function( event ) {
28415				container._trigger( type, event, instance._uiHash( instance ) );
28416			};
28417		}
28418		for ( i = this.containers.length - 1; i >= 0; i-- ) {
28419			if ( !noPropagation ) {
28420				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
28421			}
28422			if ( this.containers[ i ].containerCache.over ) {
28423				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
28424				this.containers[ i ].containerCache.over = 0;
28425			}
28426		}
28427
28428		//Do what was originally in plugins
28429		if ( this.storedCursor ) {
28430			this.document.find( "body" ).css( "cursor", this.storedCursor );
28431			this.storedStylesheet.remove();
28432		}
28433		if ( this._storedOpacity ) {
28434			this.helper.css( "opacity", this._storedOpacity );
28435		}
28436		if ( this._storedZIndex ) {
28437			this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
28438		}
28439
28440		this.dragging = false;
28441
28442		if ( !noPropagation ) {
28443			this._trigger( "beforeStop", event, this._uiHash() );
28444		}
28445
28446		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
28447		// it unbinds ALL events from the original node!
28448		this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
28449
28450		if ( !this.cancelHelperRemoval ) {
28451			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
28452				this.helper.remove();
28453			}
28454			this.helper = null;
28455		}
28456
28457		if ( !noPropagation ) {
28458			for ( i = 0; i < delayedTriggers.length; i++ ) {
28459
28460				// Trigger all delayed events
28461				delayedTriggers[ i ].call( this, event );
28462			}
28463			this._trigger( "stop", event, this._uiHash() );
28464		}
28465
28466		this.fromOutside = false;
28467		return !this.cancelHelperRemoval;
28468
28469	},
28470
28471	_trigger: function() {
28472		if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
28473			this.cancel();
28474		}
28475	},
28476
28477	_uiHash: function( _inst ) {
28478		var inst = _inst || this;
28479		return {
28480			helper: inst.helper,
28481			placeholder: inst.placeholder || $( [] ),
28482			position: inst.position,
28483			originalPosition: inst.originalPosition,
28484			offset: inst.positionAbs,
28485			item: inst.currentItem,
28486			sender: _inst ? _inst.element : null
28487		};
28488	}
28489
28490} );
28491
28492
28493/*!
28494 * jQuery UI Spinner 1.13.
284942
28495 * http://jqueryui.com
28496 *
28497 * Copyright jQuery Foundation and other contributors
28498 * Released under the MIT license.
28499 * http://jquery.org/license
28500 */
28501
28502//>>label: Spinner
28503//>>group: Widgets
28504//>>description: Displays buttons to easily input numbers via the keyboard or mouse.
28505//>>docs: http://api.jqueryui.com/spinner/
28506//>>demos: http://jqueryui.com/spinner/
28507//>>css.structure: ../../themes/base/core.css
28508//>>css.structure: ../../themes/base/spinner.css
28509//>>css.theme: ../../themes/base/theme.css
28510
28511
28512function spinnerModifier( fn ) {
28513	return function() {
28514		var previous = this.element.val();
28515		fn.apply( this, arguments );
28516		this._refresh();
28517		if ( previous !== this.element.val() ) {
28518			this._trigger( "change" );
28519		}
28520	};
28521}
28522
28523$.widget( "ui.spinner", {
28524	version: "1.13.2
vendor: 13,310 bytes, lines 28524-29055
28524",
28525	defaultElement: "<input>",
28526	widgetEventPrefix: "spin",
28527	options: {
28528		classes: {
28529			"ui-spinner": "ui-corner-all",
28530			"ui-spinner-down": "ui-corner-br",
28531			"ui-spinner-up": "ui-corner-tr"
28532		},
28533		culture: null,
28534		icons: {
28535			down: "ui-icon-triangle-1-s",
28536			up: "ui-icon-triangle-1-n"
28537		},
28538		incremental: true,
28539		max: null,
28540		min: null,
28541		numberFormat: null,
28542		page: 10,
28543		step: 1,
28544
28545		change: null,
28546		spin: null,
28547		start: null,
28548		stop: null
28549	},
28550
28551	_create: function() {
28552
28553		// handle string values that need to be parsed
28554		this._setOption( "max", this.options.max );
28555		this._setOption( "min", this.options.min );
28556		this._setOption( "step", this.options.step );
28557
28558		// Only format if there is a value, prevents the field from being marked
28559		// as invalid in Firefox, see #9573.
28560		if ( this.value() !== "" ) {
28561
28562			// Format the value, but don't constrain.
28563			this._value( this.element.val(), true );
28564		}
28565
28566		this._draw();
28567		this._on( this._events );
28568		this._refresh();
28569
28570		// Turning off autocomplete prevents the browser from remembering the
28571		// value when navigating through history, so we re-enable autocomplete
28572		// if the page is unloaded before the widget is destroyed. #7790
28573		this._on( this.window, {
28574			beforeunload: function() {
28575				this.element.removeAttr( "autocomplete" );
28576			}
28577		} );
28578	},
28579
28580	_getCreateOptions: function() {
28581		var options = this._super();
28582		var element = this.element;
28583
28584		$.each( [ "min", "max", "step" ], function( i, option ) {
28585			var value = element.attr( option );
28586			if ( value != null && value.length ) {
28587				options[ option ] = value;
28588			}
28589		} );
28590
28591		return options;
28592	},
28593
28594	_events: {
28595		keydown: function( event ) {
28596			if ( this._start( event ) && this._keydown( event ) ) {
28597				event.preventDefault();
28598			}
28599		},
28600		keyup: "_stop",
28601		focus: function() {
28602			this.previous = this.element.val();
28603		},
28604		blur: function( event ) {
28605			if ( this.cancelBlur ) {
28606				delete this.cancelBlur;
28607				return;
28608			}
28609
28610			this._stop();
28611			this._refresh();
28612			if ( this.previous !== this.element.val() ) {
28613				this._trigger( "change", event );
28614			}
28615		},
28616		mousewheel: function( event, delta ) {
28617			var activeElement = $.ui.safeActiveElement( this.document[ 0 ] );
28618			var isActive = this.element[ 0 ] === activeElement;
28619
28620			if ( !isActive || !delta ) {
28621				return;
28622			}
28623
28624			if ( !this.spinning && !this._start( event ) ) {
28625				return false;
28626			}
28627
28628			this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );
28629			clearTimeout( this.mousewheelTimer );
28630			this.mousewheelTimer = this._delay( function() {
28631				if ( this.spinning ) {
28632					this._stop( event );
28633				}
28634			}, 100 );
28635			event.preventDefault();
28636		},
28637		"mousedown .ui-spinner-button": function( event ) {
28638			var previous;
28639
28640			// We never want the buttons to have focus; whenever the user is
28641			// interacting with the spinner, the focus should be on the input.
28642			// If the input is focused then this.previous is properly set from
28643			// when the input first received focus. If the input is not focused
28644			// then we need to set this.previous based on the value before spinning.
28645			previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?
28646				this.previous : this.element.val();
28647			function checkFocus() {
28648				var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );
28649				if ( !isActive ) {
28650					this.element.trigger( "focus" );
28651					this.previous = previous;
28652
28653					// support: IE
28654					// IE sets focus asynchronously, so we need to check if focus
28655					// moved off of the input because the user clicked on the button.
28656					this._delay( function() {
28657						this.previous = previous;
28658					} );
28659				}
28660			}
28661
28662			// Ensure focus is on (or stays on) the text field
28663			event.preventDefault();
28664			checkFocus.call( this );
28665
28666			// Support: IE
28667			// IE doesn't prevent moving focus even with event.preventDefault()
28668			// so we set a flag to know when we should ignore the blur event
28669			// and check (again) if focus moved off of the input.
28670			this.cancelBlur = true;
28671			this._delay( function() {
28672				delete this.cancelBlur;
28673				checkFocus.call( this );
28674			} );
28675
28676			if ( this._start( event ) === false ) {
28677				return;
28678			}
28679
28680			this._repeat( null, $( event.currentTarget )
28681				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
28682		},
28683		"mouseup .ui-spinner-button": "_stop",
28684		"mouseenter .ui-spinner-button": function( event ) {
28685
28686			// button will add ui-state-active if mouse was down while mouseleave and kept down
28687			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
28688				return;
28689			}
28690
28691			if ( this._start( event ) === false ) {
28692				return false;
28693			}
28694			this._repeat( null, $( event.currentTarget )
28695				.hasClass( "ui-spinner-up" ) ? 1 : -1, event );
28696		},
28697
28698		// TODO: do we really want to consider this a stop?
28699		// shouldn't we just stop the repeater and wait until mouseup before
28700		// we trigger the stop event?
28701		"mouseleave .ui-spinner-button": "_stop"
28702	},
28703
28704	// Support mobile enhanced option and make backcompat more sane
28705	_enhance: function() {
28706		this.uiSpinner = this.element
28707			.attr( "autocomplete", "off" )
28708			.wrap( "<span>" )
28709			.parent()
28710
28711				// Add buttons
28712				.append(
28713					"<a></a><a></a>"
28714				);
28715	},
28716
28717	_draw: function() {
28718		this._enhance();
28719
28720		this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
28721		this._addClass( "ui-spinner-input" );
28722
28723		this.element.attr( "role", "spinbutton" );
28724
28725		// Button bindings
28726		this.buttons = this.uiSpinner.children( "a" )
28727			.attr( "tabIndex", -1 )
28728			.attr( "aria-hidden", true )
28729			.button( {
28730				classes: {
28731					"ui-button": ""
28732				}
28733			} );
28734
28735		// TODO: Right now button does not support classes this is already updated in button PR
28736		this._removeClass( this.buttons, "ui-corner-all" );
28737
28738		this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
28739		this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
28740		this.buttons.first().button( {
28741			"icon": this.options.icons.up,
28742			"showLabel": false
28743		} );
28744		this.buttons.last().button( {
28745			"icon": this.options.icons.down,
28746			"showLabel": false
28747		} );
28748
28749		// IE 6 doesn't understand height: 50% for the buttons
28750		// unless the wrapper has an explicit height
28751		if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
28752				this.uiSpinner.height() > 0 ) {
28753			this.uiSpinner.height( this.uiSpinner.height() );
28754		}
28755	},
28756
28757	_keydown: function( event ) {
28758		var options = this.options,
28759			keyCode = $.ui.keyCode;
28760
28761		switch ( event.keyCode ) {
28762		case keyCode.UP:
28763			this._repeat( null, 1, event );
28764			return true;
28765		case keyCode.DOWN:
28766			this._repeat( null, -1, event );
28767			return true;
28768		case keyCode.PAGE_UP:
28769			this._repeat( null, options.page, event );
28770			return true;
28771		case keyCode.PAGE_DOWN:
28772			this._repeat( null, -options.page, event );
28773			return true;
28774		}
28775
28776		return false;
28777	},
28778
28779	_start: function( event ) {
28780		if ( !this.spinning && this._trigger( "start", event ) === false ) {
28781			return false;
28782		}
28783
28784		if ( !this.counter ) {
28785			this.counter = 1;
28786		}
28787		this.spinning = true;
28788		return true;
28789	},
28790
28791	_repeat: function( i, steps, event ) {
28792		i = i || 500;
28793
28794		clearTimeout( this.timer );
28795		this.timer = this._delay( function() {
28796			this._repeat( 40, steps, event );
28797		}, i );
28798
28799		this._spin( steps * this.options.step, event );
28800	},
28801
28802	_spin: function( step, event ) {
28803		var value = this.value() || 0;
28804
28805		if ( !this.counter ) {
28806			this.counter = 1;
28807		}
28808
28809		value = this._adjustValue( value + step * this._increment( this.counter ) );
28810
28811		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) {
28812			this._value( value );
28813			this.counter++;
28814		}
28815	},
28816
28817	_increment: function( i ) {
28818		var incremental = this.options.incremental;
28819
28820		if ( incremental ) {
28821			return typeof incremental === "function" ?
28822				incremental( i ) :
28823				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
28824		}
28825
28826		return 1;
28827	},
28828
28829	_precision: function() {
28830		var precision = this._precisionOf( this.options.step );
28831		if ( this.options.min !== null ) {
28832			precision = Math.max( precision, this._precisionOf( this.options.min ) );
28833		}
28834		return precision;
28835	},
28836
28837	_precisionOf: function( num ) {
28838		var str = num.toString(),
28839			decimal = str.indexOf( "." );
28840		return decimal === -1 ? 0 : str.length - decimal - 1;
28841	},
28842
28843	_adjustValue: function( value ) {
28844		var base, aboveMin,
28845			options = this.options;
28846
28847		// Make sure we're at a valid step
28848		// - find out where we are relative to the base (min or 0)
28849		base = options.min !== null ? options.min : 0;
28850		aboveMin = value - base;
28851
28852		// - round to the nearest step
28853		aboveMin = Math.round( aboveMin / options.step ) * options.step;
28854
28855		// - rounding is based on 0, so adjust back to our base
28856		value = base + aboveMin;
28857
28858		// Fix precision from bad JS floating point math
28859		value = parseFloat( value.toFixed( this._precision() ) );
28860
28861		// Clamp the value
28862		if ( options.max !== null && value > options.max ) {
28863			return options.max;
28864		}
28865		if ( options.min !== null && value < options.min ) {
28866			return options.min;
28867		}
28868
28869		return value;
28870	},
28871
28872	_stop: function( event ) {
28873		if ( !this.spinning ) {
28874			return;
28875		}
28876
28877		clearTimeout( this.timer );
28878		clearTimeout( this.mousewheelTimer );
28879		this.counter = 0;
28880		this.spinning = false;
28881		this._trigger( "stop", event );
28882	},
28883
28884	_setOption: function( key, value ) {
28885		var prevValue, first, last;
28886
28887		if ( key === "culture" || key === "numberFormat" ) {
28888			prevValue = this._parse( this.element.val() );
28889			this.options[ key ] = value;
28890			this.element.val( this._format( prevValue ) );
28891			return;
28892		}
28893
28894		if ( key === "max" || key === "min" || key === "step" ) {
28895			if ( typeof value === "string" ) {
28896				value = this._parse( value );
28897			}
28898		}
28899		if ( key === "icons" ) {
28900			first = this.buttons.first().find( ".ui-icon" );
28901			this._removeClass( first, null, this.options.icons.up );
28902			this._addClass( first, null, value.up );
28903			last = this.buttons.last().find( ".ui-icon" );
28904			this._removeClass( last, null, this.options.icons.down );
28905			this._addClass( last, null, value.down );
28906		}
28907
28908		this._super( key, value );
28909	},
28910
28911	_setOptionDisabled: function( value ) {
28912		this._super( value );
28913
28914		this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
28915		this.element.prop( "disabled", !!value );
28916		this.buttons.button( value ? "disable" : "enable" );
28917	},
28918
28919	_setOptions: spinnerModifier( function( options ) {
28920		this._super( options );
28921	} ),
28922
28923	_parse: function( val ) {
28924		if ( typeof val === "string" && val !== "" ) {
28925			val = window.Globalize && this.options.numberFormat ?
28926				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
28927		}
28928		return val === "" || isNaN( val ) ? null : val;
28929	},
28930
28931	_format: function( value ) {
28932		if ( value === "" ) {
28933			return "";
28934		}
28935		return window.Globalize && this.options.numberFormat ?
28936			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
28937			value;
28938	},
28939
28940	_refresh: function() {
28941		this.element.attr( {
28942			"aria-valuemin": this.options.min,
28943			"aria-valuemax": this.options.max,
28944
28945			// TODO: what should we do with values that can't be parsed?
28946			"aria-valuenow": this._parse( this.element.val() )
28947		} );
28948	},
28949
28950	isValid: function() {
28951		var value = this.value();
28952
28953		// Null is invalid
28954		if ( value === null ) {
28955			return false;
28956		}
28957
28958		// If value gets adjusted, it's invalid
28959		return value === this._adjustValue( value );
28960	},
28961
28962	// Update the value without triggering change
28963	_value: function( value, allowAny ) {
28964		var parsed;
28965		if ( value !== "" ) {
28966			parsed = this._parse( value );
28967			if ( parsed !== null ) {
28968				if ( !allowAny ) {
28969					parsed = this._adjustValue( parsed );
28970				}
28971				value = this._format( parsed );
28972			}
28973		}
28974		this.element.val( value );
28975		this._refresh();
28976	},
28977
28978	_destroy: function() {
28979		this.element
28980			.prop( "disabled", false )
28981			.removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" );
28982
28983		this.uiSpinner.replaceWith( this.element );
28984	},
28985
28986	stepUp: spinnerModifier( function( steps ) {
28987		this._stepUp( steps );
28988	} ),
28989	_stepUp: function( steps ) {
28990		if ( this._start() ) {
28991			this._spin( ( steps || 1 ) * this.options.step );
28992			this._stop();
28993		}
28994	},
28995
28996	stepDown: spinnerModifier( function( steps ) {
28997		this._stepDown( steps );
28998	} ),
28999	_stepDown: function( steps ) {
29000		if ( this._start() ) {
29001			this._spin( ( steps || 1 ) * -this.options.step );
29002			this._stop();
29003		}
29004	},
29005
29006	pageUp: spinnerModifier( function( pages ) {
29007		this._stepUp( ( pages || 1 ) * this.options.page );
29008	} ),
29009
29010	pageDown: spinnerModifier( function( pages ) {
29011		this._stepDown( ( pages || 1 ) * this.options.page );
29012	} ),
29013
29014	value: function( newVal ) {
29015		if ( !arguments.length ) {
29016			return this._parse( this.element.val() );
29017		}
29018		spinnerModifier( this._value ).call( this, newVal );
29019	},
29020
29021	widget: function() {
29022		return this.uiSpinner;
29023	}
29024} );
29025
29026// DEPRECATED
29027// TODO: switch return back to widget declaration at top of file when this is removed
29028if ( $.uiBackCompat !== false ) {
29029
29030	// Backcompat for spinner html extension points
29031	$.widget( "ui.spinner", $.ui.spinner, {
29032		_enhance: function() {
29033			this.uiSpinner = this.element
29034				.attr( "autocomplete", "off" )
29035				.wrap( this._uiSpinnerHtml() )
29036				.parent()
29037
29038					// Add buttons
29039					.append( this._buttonHtml() );
29040		},
29041		_uiSpinnerHtml: function() {
29042			return "<span>";
29043		},
29044
29045		_buttonHtml: function() {
29046			return "<a></a><a></a>";
29047		}
29048	} );
29049}
29050
29051var widgetsSpinner = $.ui.spinner;
29052
29053
29054/*!
29055 * jQuery UI Tabs 1.13.
290552
29056 * http://jqueryui.com
29057 *
29058 * Copyright jQuery Foundation and other contributors
29059 * Released under the MIT license.
29060 * http://jquery.org/license
29061 */
29062
29063//>>label: Tabs
29064//>>group: Widgets
29065//>>description: Transforms a set of container elements into a tab structure.
29066//>>docs: http://api.jqueryui.com/tabs/
29067//>>demos: http://jqueryui.com/tabs/
29068//>>css.structure: ../../themes/base/core.css
29069//>>css.structure: ../../themes/base/tabs.css
29070//>>css.theme: ../../themes/base/theme.css
29071
29072
29073$.widget( "ui.tabs", {
29074	version: "1.13.2
vendor: 21,408 bytes, lines 29074-29903
29074",
29075	delay: 300,
29076	options: {
29077		active: null,
29078		classes: {
29079			"ui-tabs": "ui-corner-all",
29080			"ui-tabs-nav": "ui-corner-all",
29081			"ui-tabs-panel": "ui-corner-bottom",
29082			"ui-tabs-tab": "ui-corner-top"
29083		},
29084		collapsible: false,
29085		event: "click",
29086		heightStyle: "content",
29087		hide: null,
29088		show: null,
29089
29090		// Callbacks
29091		activate: null,
29092		beforeActivate: null,
29093		beforeLoad: null,
29094		load: null
29095	},
29096
29097	_isLocal: ( function() {
29098		var rhash = /#.*$/;
29099
29100		return function( anchor ) {
29101			var anchorUrl, locationUrl;
29102
29103			anchorUrl = anchor.href.replace( rhash, "" );
29104			locationUrl = location.href.replace( rhash, "" );
29105
29106			// Decoding may throw an error if the URL isn't UTF-8 (#9518)
29107			try {
29108				anchorUrl = decodeURIComponent( anchorUrl );
29109			} catch ( error ) {}
29110			try {
29111				locationUrl = decodeURIComponent( locationUrl );
29112			} catch ( error ) {}
29113
29114			return anchor.hash.length > 1 && anchorUrl === locationUrl;
29115		};
29116	} )(),
29117
29118	_create: function() {
29119		var that = this,
29120			options = this.options;
29121
29122		this.running = false;
29123
29124		this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
29125		this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
29126
29127		this._processTabs();
29128		options.active = this._initialActive();
29129
29130		// Take disabling tabs via class attribute from HTML
29131		// into account and update option properly.
29132		if ( Array.isArray( options.disabled ) ) {
29133			options.disabled = $.uniqueSort( options.disabled.concat(
29134				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
29135					return that.tabs.index( li );
29136				} )
29137			) ).sort();
29138		}
29139
29140		// Check for length avoids error when initializing empty list
29141		if ( this.options.active !== false && this.anchors.length ) {
29142			this.active = this._findActive( options.active );
29143		} else {
29144			this.active = $();
29145		}
29146
29147		this._refresh();
29148
29149		if ( this.active.length ) {
29150			this.load( options.active );
29151		}
29152	},
29153
29154	_initialActive: function() {
29155		var active = this.options.active,
29156			collapsible = this.options.collapsible,
29157			locationHash = location.hash.substring( 1 );
29158
29159		if ( active === null ) {
29160
29161			// check the fragment identifier in the URL
29162			if ( locationHash ) {
29163				this.tabs.each( function( i, tab ) {
29164					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
29165						active = i;
29166						return false;
29167					}
29168				} );
29169			}
29170
29171			// Check for a tab marked active via a class
29172			if ( active === null ) {
29173				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
29174			}
29175
29176			// No active tab, set to false
29177			if ( active === null || active === -1 ) {
29178				active = this.tabs.length ? 0 : false;
29179			}
29180		}
29181
29182		// Handle numbers: negative, out of range
29183		if ( active !== false ) {
29184			active = this.tabs.index( this.tabs.eq( active ) );
29185			if ( active === -1 ) {
29186				active = collapsible ? false : 0;
29187			}
29188		}
29189
29190		// Don't allow collapsible: false and active: false
29191		if ( !collapsible && active === false && this.anchors.length ) {
29192			active = 0;
29193		}
29194
29195		return active;
29196	},
29197
29198	_getCreateEventData: function() {
29199		return {
29200			tab: this.active,
29201			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
29202		};
29203	},
29204
29205	_tabKeydown: function( event ) {
29206		var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
29207			selectedIndex = this.tabs.index( focusedTab ),
29208			goingForward = true;
29209
29210		if ( this._handlePageNav( event ) ) {
29211			return;
29212		}
29213
29214		switch ( event.keyCode ) {
29215		case $.ui.keyCode.RIGHT:
29216		case $.ui.keyCode.DOWN:
29217			selectedIndex++;
29218			break;
29219		case $.ui.keyCode.UP:
29220		case $.ui.keyCode.LEFT:
29221			goingForward = false;
29222			selectedIndex--;
29223			break;
29224		case $.ui.keyCode.END:
29225			selectedIndex = this.anchors.length - 1;
29226			break;
29227		case $.ui.keyCode.HOME:
29228			selectedIndex = 0;
29229			break;
29230		case $.ui.keyCode.SPACE:
29231
29232			// Activate only, no collapsing
29233			event.preventDefault();
29234			clearTimeout( this.activating );
29235			this._activate( selectedIndex );
29236			return;
29237		case $.ui.keyCode.ENTER:
29238
29239			// Toggle (cancel delayed activation, allow collapsing)
29240			event.preventDefault();
29241			clearTimeout( this.activating );
29242
29243			// Determine if we should collapse or activate
29244			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
29245			return;
29246		default:
29247			return;
29248		}
29249
29250		// Focus the appropriate tab, based on which key was pressed
29251		event.preventDefault();
29252		clearTimeout( this.activating );
29253		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
29254
29255		// Navigating with control/command key will prevent automatic activation
29256		if ( !event.ctrlKey && !event.metaKey ) {
29257
29258			// Update aria-selected immediately so that AT think the tab is already selected.
29259			// Otherwise AT may confuse the user by stating that they need to activate the tab,
29260			// but the tab will already be activated by the time the announcement finishes.
29261			focusedTab.attr( "aria-selected", "false" );
29262			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
29263
29264			this.activating = this._delay( function() {
29265				this.option( "active", selectedIndex );
29266			}, this.delay );
29267		}
29268	},
29269
29270	_panelKeydown: function( event ) {
29271		if ( this._handlePageNav( event ) ) {
29272			return;
29273		}
29274
29275		// Ctrl+up moves focus to the current tab
29276		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
29277			event.preventDefault();
29278			this.active.trigger( "focus" );
29279		}
29280	},
29281
29282	// Alt+page up/down moves focus to the previous/next tab (and activates)
29283	_handlePageNav: function( event ) {
29284		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
29285			this._activate( this._focusNextTab( this.options.active - 1, false ) );
29286			return true;
29287		}
29288		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
29289			this._activate( this._focusNextTab( this.options.active + 1, true ) );
29290			return true;
29291		}
29292	},
29293
29294	_findNextTab: function( index, goingForward ) {
29295		var lastTabIndex = this.tabs.length - 1;
29296
29297		function constrain() {
29298			if ( index > lastTabIndex ) {
29299				index = 0;
29300			}
29301			if ( index < 0 ) {
29302				index = lastTabIndex;
29303			}
29304			return index;
29305		}
29306
29307		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
29308			index = goingForward ? index + 1 : index - 1;
29309		}
29310
29311		return index;
29312	},
29313
29314	_focusNextTab: function( index, goingForward ) {
29315		index = this._findNextTab( index, goingForward );
29316		this.tabs.eq( index ).trigger( "focus" );
29317		return index;
29318	},
29319
29320	_setOption: function( key, value ) {
29321		if ( key === "active" ) {
29322
29323			// _activate() will handle invalid values and update this.options
29324			this._activate( value );
29325			return;
29326		}
29327
29328		this._super( key, value );
29329
29330		if ( key === "collapsible" ) {
29331			this._toggleClass( "ui-tabs-collapsible", null, value );
29332
29333			// Setting collapsible: false while collapsed; open first panel
29334			if ( !value && this.options.active === false ) {
29335				this._activate( 0 );
29336			}
29337		}
29338
29339		if ( key === "event" ) {
29340			this._setupEvents( value );
29341		}
29342
29343		if ( key === "heightStyle" ) {
29344			this._setupHeightStyle( value );
29345		}
29346	},
29347
29348	_sanitizeSelector: function( hash ) {
29349		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
29350	},
29351
29352	refresh: function() {
29353		var options = this.options,
29354			lis = this.tablist.children( ":has(a[href])" );
29355
29356		// Get disabled tabs from class attribute from HTML
29357		// this will get converted to a boolean if needed in _refresh()
29358		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
29359			return lis.index( tab );
29360		} );
29361
29362		this._processTabs();
29363
29364		// Was collapsed or no tabs
29365		if ( options.active === false || !this.anchors.length ) {
29366			options.active = false;
29367			this.active = $();
29368
29369		// was active, but active tab is gone
29370		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
29371
29372			// all remaining tabs are disabled
29373			if ( this.tabs.length === options.disabled.length ) {
29374				options.active = false;
29375				this.active = $();
29376
29377			// activate previous tab
29378			} else {
29379				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
29380			}
29381
29382		// was active, active tab still exists
29383		} else {
29384
29385			// make sure active index is correct
29386			options.active = this.tabs.index( this.active );
29387		}
29388
29389		this._refresh();
29390	},
29391
29392	_refresh: function() {
29393		this._setOptionDisabled( this.options.disabled );
29394		this._setupEvents( this.options.event );
29395		this._setupHeightStyle( this.options.heightStyle );
29396
29397		this.tabs.not( this.active ).attr( {
29398			"aria-selected": "false",
29399			"aria-expanded": "false",
29400			tabIndex: -1
29401		} );
29402		this.panels.not( this._getPanelForTab( this.active ) )
29403			.hide()
29404			.attr( {
29405				"aria-hidden": "true"
29406			} );
29407
29408		// Make sure one tab is in the tab order
29409		if ( !this.active.length ) {
29410			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
29411		} else {
29412			this.active
29413				.attr( {
29414					"aria-selected": "true",
29415					"aria-expanded": "true",
29416					tabIndex: 0
29417				} );
29418			this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
29419			this._getPanelForTab( this.active )
29420				.show()
29421				.attr( {
29422					"aria-hidden": "false"
29423				} );
29424		}
29425	},
29426
29427	_processTabs: function() {
29428		var that = this,
29429			prevTabs = this.tabs,
29430			prevAnchors = this.anchors,
29431			prevPanels = this.panels;
29432
29433		this.tablist = this._getList().attr( "role", "tablist" );
29434		this._addClass( this.tablist, "ui-tabs-nav",
29435			"ui-helper-reset ui-helper-clearfix ui-widget-header" );
29436
29437		// Prevent users from focusing disabled tabs via click
29438		this.tablist
29439			.on( "mousedown" + this.eventNamespace, "> li", function( event ) {
29440				if ( $( this ).is( ".ui-state-disabled" ) ) {
29441					event.preventDefault();
29442				}
29443			} )
29444
29445			// Support: IE <9
29446			// Preventing the default action in mousedown doesn't prevent IE
29447			// from focusing the element, so if the anchor gets focused, blur.
29448			// We don't have to worry about focusing the previously focused
29449			// element since clicking on a non-focusable element should focus
29450			// the body anyway.
29451			.on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
29452				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
29453					this.blur();
29454				}
29455			} );
29456
29457		this.tabs = this.tablist.find( "> li:has(a[href])" )
29458			.attr( {
29459				role: "tab",
29460				tabIndex: -1
29461			} );
29462		this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
29463
29464		this.anchors = this.tabs.map( function() {
29465			return $( "a", this )[ 0 ];
29466		} )
29467			.attr( {
29468				tabIndex: -1
29469			} );
29470		this._addClass( this.anchors, "ui-tabs-anchor" );
29471
29472		this.panels = $();
29473
29474		this.anchors.each( function( i, anchor ) {
29475			var selector, panel, panelId,
29476				anchorId = $( anchor ).uniqueId().attr( "id" ),
29477				tab = $( anchor ).closest( "li" ),
29478				originalAriaControls = tab.attr( "aria-controls" );
29479
29480			// Inline tab
29481			if ( that._isLocal( anchor ) ) {
29482				selector = anchor.hash;
29483				panelId = selector.substring( 1 );
29484				panel = that.element.find( that._sanitizeSelector( selector ) );
29485
29486			// remote tab
29487			} else {
29488
29489				// If the tab doesn't already have aria-controls,
29490				// generate an id by using a throw-away element
29491				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
29492				selector = "#" + panelId;
29493				panel = that.element.find( selector );
29494				if ( !panel.length ) {
29495					panel = that._createPanel( panelId );
29496					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
29497				}
29498				panel.attr( "aria-live", "polite" );
29499			}
29500
29501			if ( panel.length ) {
29502				that.panels = that.panels.add( panel );
29503			}
29504			if ( originalAriaControls ) {
29505				tab.data( "ui-tabs-aria-controls", originalAriaControls );
29506			}
29507			tab.attr( {
29508				"aria-controls": panelId,
29509				"aria-labelledby": anchorId
29510			} );
29511			panel.attr( "aria-labelledby", anchorId );
29512		} );
29513
29514		this.panels.attr( "role", "tabpanel" );
29515		this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
29516
29517		// Avoid memory leaks (#10056)
29518		if ( prevTabs ) {
29519			this._off( prevTabs.not( this.tabs ) );
29520			this._off( prevAnchors.not( this.anchors ) );
29521			this._off( prevPanels.not( this.panels ) );
29522		}
29523	},
29524
29525	// Allow overriding how to find the list for rare usage scenarios (#7715)
29526	_getList: function() {
29527		return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
29528	},
29529
29530	_createPanel: function( id ) {
29531		return $( "<div>" )
29532			.attr( "id", id )
29533			.data( "ui-tabs-destroy", true );
29534	},
29535
29536	_setOptionDisabled: function( disabled ) {
29537		var currentItem, li, i;
29538
29539		if ( Array.isArray( disabled ) ) {
29540			if ( !disabled.length ) {
29541				disabled = false;
29542			} else if ( disabled.length === this.anchors.length ) {
29543				disabled = true;
29544			}
29545		}
29546
29547		// Disable tabs
29548		for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
29549			currentItem = $( li );
29550			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
29551				currentItem.attr( "aria-disabled", "true" );
29552				this._addClass( currentItem, null, "ui-state-disabled" );
29553			} else {
29554				currentItem.removeAttr( "aria-disabled" );
29555				this._removeClass( currentItem, null, "ui-state-disabled" );
29556			}
29557		}
29558
29559		this.options.disabled = disabled;
29560
29561		this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
29562			disabled === true );
29563	},
29564
29565	_setupEvents: function( event ) {
29566		var events = {};
29567		if ( event ) {
29568			$.each( event.split( " " ), function( index, eventName ) {
29569				events[ eventName ] = "_eventHandler";
29570			} );
29571		}
29572
29573		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
29574
29575		// Always prevent the default action, even when disabled
29576		this._on( true, this.anchors, {
29577			click: function( event ) {
29578				event.preventDefault();
29579			}
29580		} );
29581		this._on( this.anchors, events );
29582		this._on( this.tabs, { keydown: "_tabKeydown" } );
29583		this._on( this.panels, { keydown: "_panelKeydown" } );
29584
29585		this._focusable( this.tabs );
29586		this._hoverable( this.tabs );
29587	},
29588
29589	_setupHeightStyle: function( heightStyle ) {
29590		var maxHeight,
29591			parent = this.element.parent();
29592
29593		if ( heightStyle === "fill" ) {
29594			maxHeight = parent.height();
29595			maxHeight -= this.element.outerHeight() - this.element.height();
29596
29597			this.element.siblings( ":visible" ).each( function() {
29598				var elem = $( this ),
29599					position = elem.css( "position" );
29600
29601				if ( position === "absolute" || position === "fixed" ) {
29602					return;
29603				}
29604				maxHeight -= elem.outerHeight( true );
29605			} );
29606
29607			this.element.children().not( this.panels ).each( function() {
29608				maxHeight -= $( this ).outerHeight( true );
29609			} );
29610
29611			this.panels.each( function() {
29612				$( this ).height( Math.max( 0, maxHeight -
29613					$( this ).innerHeight() + $( this ).height() ) );
29614			} )
29615				.css( "overflow", "auto" );
29616		} else if ( heightStyle === "auto" ) {
29617			maxHeight = 0;
29618			this.panels.each( function() {
29619				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
29620			} ).height( maxHeight );
29621		}
29622	},
29623
29624	_eventHandler: function( event ) {
29625		var options = this.options,
29626			active = this.active,
29627			anchor = $( event.currentTarget ),
29628			tab = anchor.closest( "li" ),
29629			clickedIsActive = tab[ 0 ] === active[ 0 ],
29630			collapsing = clickedIsActive && options.collapsible,
29631			toShow = collapsing ? $() : this._getPanelForTab( tab ),
29632			toHide = !active.length ? $() : this._getPanelForTab( active ),
29633			eventData = {
29634				oldTab: active,
29635				oldPanel: toHide,
29636				newTab: collapsing ? $() : tab,
29637				newPanel: toShow
29638			};
29639
29640		event.preventDefault();
29641
29642		if ( tab.hasClass( "ui-state-disabled" ) ||
29643
29644				// tab is already loading
29645				tab.hasClass( "ui-tabs-loading" ) ||
29646
29647				// can't switch durning an animation
29648				this.running ||
29649
29650				// click on active header, but not collapsible
29651				( clickedIsActive && !options.collapsible ) ||
29652
29653				// allow canceling activation
29654				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
29655			return;
29656		}
29657
29658		options.active = collapsing ? false : this.tabs.index( tab );
29659
29660		this.active = clickedIsActive ? $() : tab;
29661		if ( this.xhr ) {
29662			this.xhr.abort();
29663		}
29664
29665		if ( !toHide.length && !toShow.length ) {
29666			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
29667		}
29668
29669		if ( toShow.length ) {
29670			this.load( this.tabs.index( tab ), event );
29671		}
29672		this._toggle( event, eventData );
29673	},
29674
29675	// Handles show/hide for selecting tabs
29676	_toggle: function( event, eventData ) {
29677		var that = this,
29678			toShow = eventData.newPanel,
29679			toHide = eventData.oldPanel;
29680
29681		this.running = true;
29682
29683		function complete() {
29684			that.running = false;
29685			that._trigger( "activate", event, eventData );
29686		}
29687
29688		function show() {
29689			that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
29690
29691			if ( toShow.length && that.options.show ) {
29692				that._show( toShow, that.options.show, complete );
29693			} else {
29694				toShow.show();
29695				complete();
29696			}
29697		}
29698
29699		// Start out by hiding, then showing, then completing
29700		if ( toHide.length && this.options.hide ) {
29701			this._hide( toHide, this.options.hide, function() {
29702				that._removeClass( eventData.oldTab.closest( "li" ),
29703					"ui-tabs-active", "ui-state-active" );
29704				show();
29705			} );
29706		} else {
29707			this._removeClass( eventData.oldTab.closest( "li" ),
29708				"ui-tabs-active", "ui-state-active" );
29709			toHide.hide();
29710			show();
29711		}
29712
29713		toHide.attr( "aria-hidden", "true" );
29714		eventData.oldTab.attr( {
29715			"aria-selected": "false",
29716			"aria-expanded": "false"
29717		} );
29718
29719		// If we're switching tabs, remove the old tab from the tab order.
29720		// If we're opening from collapsed state, remove the previous tab from the tab order.
29721		// If we're collapsing, then keep the collapsing tab in the tab order.
29722		if ( toShow.length && toHide.length ) {
29723			eventData.oldTab.attr( "tabIndex", -1 );
29724		} else if ( toShow.length ) {
29725			this.tabs.filter( function() {
29726				return $( this ).attr( "tabIndex" ) === 0;
29727			} )
29728				.attr( "tabIndex", -1 );
29729		}
29730
29731		toShow.attr( "aria-hidden", "false" );
29732		eventData.newTab.attr( {
29733			"aria-selected": "true",
29734			"aria-expanded": "true",
29735			tabIndex: 0
29736		} );
29737	},
29738
29739	_activate: function( index ) {
29740		var anchor,
29741			active = this._findActive( index );
29742
29743		// Trying to activate the already active panel
29744		if ( active[ 0 ] === this.active[ 0 ] ) {
29745			return;
29746		}
29747
29748		// Trying to collapse, simulate a click on the current active header
29749		if ( !active.length ) {
29750			active = this.active;
29751		}
29752
29753		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
29754		this._eventHandler( {
29755			target: anchor,
29756			currentTarget: anchor,
29757			preventDefault: $.noop
29758		} );
29759	},
29760
29761	_findActive: function( index ) {
29762		return index === false ? $() : this.tabs.eq( index );
29763	},
29764
29765	_getIndex: function( index ) {
29766
29767		// meta-function to give users option to provide a href string instead of a numerical index.
29768		if ( typeof index === "string" ) {
29769			index = this.anchors.index( this.anchors.filter( "[href$='" +
29770				$.escapeSelector( index ) + "']" ) );
29771		}
29772
29773		return index;
29774	},
29775
29776	_destroy: function() {
29777		if ( this.xhr ) {
29778			this.xhr.abort();
29779		}
29780
29781		this.tablist
29782			.removeAttr( "role" )
29783			.off( this.eventNamespace );
29784
29785		this.anchors
29786			.removeAttr( "role tabIndex" )
29787			.removeUniqueId();
29788
29789		this.tabs.add( this.panels ).each( function() {
29790			if ( $.data( this, "ui-tabs-destroy" ) ) {
29791				$( this ).remove();
29792			} else {
29793				$( this ).removeAttr( "role tabIndex " +
29794					"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
29795			}
29796		} );
29797
29798		this.tabs.each( function() {
29799			var li = $( this ),
29800				prev = li.data( "ui-tabs-aria-controls" );
29801			if ( prev ) {
29802				li
29803					.attr( "aria-controls", prev )
29804					.removeData( "ui-tabs-aria-controls" );
29805			} else {
29806				li.removeAttr( "aria-controls" );
29807			}
29808		} );
29809
29810		this.panels.show();
29811
29812		if ( this.options.heightStyle !== "content" ) {
29813			this.panels.css( "height", "" );
29814		}
29815	},
29816
29817	enable: function( index ) {
29818		var disabled = this.options.disabled;
29819		if ( disabled === false ) {
29820			return;
29821		}
29822
29823		if ( index === undefined ) {
29824			disabled = false;
29825		} else {
29826			index = this._getIndex( index );
29827			if ( Array.isArray( disabled ) ) {
29828				disabled = $.map( disabled, function( num ) {
29829					return num !== index ? num : null;
29830				} );
29831			} else {
29832				disabled = $.map( this.tabs, function( li, num ) {
29833					return num !== index ? num : null;
29834				} );
29835			}
29836		}
29837		this._setOptionDisabled( disabled );
29838	},
29839
29840	disable: function( index ) {
29841		var disabled = this.options.disabled;
29842		if ( disabled === true ) {
29843			return;
29844		}
29845
29846		if ( index === undefined ) {
29847			disabled = true;
29848		} else {
29849			index = this._getIndex( index );
29850			if ( $.inArray( index, disabled ) !== -1 ) {
29851				return;
29852			}
29853			if ( Array.isArray( disabled ) ) {
29854				disabled = $.merge( [ index ], disabled ).sort();
29855			} else {
29856				disabled = [ index ];
29857			}
29858		}
29859		this._setOptionDisabled( disabled );
29860	},
29861
29862	load: function( index, event ) {
29863		index = this._getIndex( index );
29864		var that = this,
29865			tab = this.tabs.eq( index ),
29866			anchor = tab.find( ".ui-tabs-anchor" ),
29867			panel = this._getPanelForTab( tab ),
29868			eventData = {
29869				tab: tab,
29870				panel: panel
29871			},
29872			complete = function( jqXHR, status ) {
29873				if ( status === "abort" ) {
29874					that.panels.stop( false, true );
29875				}
29876
29877				that._removeClass( tab, "ui-tabs-loading" );
29878				panel.removeAttr( "aria-busy" );
29879
29880				if ( jqXHR === that.xhr ) {
29881					delete that.xhr;
29882				}
29883			};
29884
29885		// Not remote
29886		if ( this._isLocal( anchor[ 0 ] ) ) {
29887			return;
29888		}
29889
29890		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
29891
29892		// Support: jQuery <1.8
29893		// jQuery <1.8 returns false if the request is canceled in beforeSend,
29894		// but as of 1.8, $.ajax() always returns a jqXHR object.
29895		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
29896			this._addClass( tab, "ui-tabs-loading" );
29897			panel.attr( "aria-busy", "true" );
29898
29899			this.xhr
29900				.done( function( response, status, jqXHR ) {
29901
29902					// support: jQuery <1.8
29903					// http
29903://bugs.jquery.com/ticket/11778
29904					setTimeout( function() {
29905						panel.html( response );
29906						that._trigger( "load", event, eventData );
29907
29908						complete( jqXHR, status );
29909					}, 1 );
29910				} )
29911				.fail( function( jqXHR, status ) {
29912
29913					// support: jQuery <1.8
29914					// http://bugs.jquery.com/ticket/11778
29915					setTimeout( function() {
29916						complete( jqXHR, status );
29917					}, 1 );
29918				} );
29919		}
29920	},
29921
29922	_ajaxSettings: function( anchor, event, eventData ) {
29923		var that = this;
29924		return {
29925
vendor: 1,423 bytes, lines 29926-29978
29926			// Support: IE <11 only
29927			// Strip any hash that exists to prevent errors with the Ajax request
29928			url: anchor.attr( "href" ).replace( /#.*$/, "" ),
29929			beforeSend: function( jqXHR, settings ) {
29930				return that._trigger( "beforeLoad", event,
29931					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
29932			}
29933		};
29934	},
29935
29936	_getPanelForTab: function( tab ) {
29937		var id = $( tab ).attr( "aria-controls" );
29938		return this.element.find( this._sanitizeSelector( "#" + id ) );
29939	}
29940} );
29941
29942// DEPRECATED
29943// TODO: Switch return back to widget declaration at top of file when this is removed
29944if ( $.uiBackCompat !== false ) {
29945
29946	// Backcompat for ui-tab class (now ui-tabs-tab)
29947	$.widget( "ui.tabs", $.ui.tabs, {
29948		_processTabs: function() {
29949			this._superApply( arguments );
29950			this._addClass( this.tabs, "ui-tab" );
29951		}
29952	} );
29953}
29954
29955var widgetsTabs = $.ui.tabs;
29956
29957
29958/*!
29959 * jQuery UI Tooltip 1.13.2
29960 * http://jqueryui.com
29961 *
29962 * Copyright jQuery Foundation and other contributors
29963 * Released under the MIT license.
29964 * http://jquery.org/license
29965 */
29966
29967//>>label: Tooltip
29968//>>group: Widgets
29969//>>description: Shows additional information for any element on hover or focus.
29970//>>docs: http://api.jqueryui.com/tooltip/
29971//>>demos: http://jqueryui.com/tooltip/
29972//>>css.structure: ../../themes/base/core.css
29973//>>css.structure: ../../themes/base/tooltip.css
29974//>>css.theme: ../../themes/base/theme.css
29975
29976
29977$.widget( "ui.tooltip", {
29978	version: "1.13.2
vendor: 13,567 bytes, lines 29978-30466
29978",
29979	options: {
29980		classes: {
29981			"ui-tooltip": "ui-corner-all ui-widget-shadow"
29982		},
29983		content: function() {
29984			var title = $( this ).attr( "title" );
29985
29986			// Escape title, since we're going from an attribute to raw HTML
29987			return $( "<a>" ).text( title ).html();
29988		},
29989		hide: true,
29990
29991		// Disabled elements have inconsistent behavior across browsers (#8661)
29992		items: "[title]:not([disabled])",
29993		position: {
29994			my: "left top+15",
29995			at: "left bottom",
29996			collision: "flipfit flip"
29997		},
29998		show: true,
29999		track: false,
30000
30001		// Callbacks
30002		close: null,
30003		open: null
30004	},
30005
30006	_addDescribedBy: function( elem, id ) {
30007		var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ );
30008		describedby.push( id );
30009		elem
30010			.data( "ui-tooltip-id", id )
30011			.attr( "aria-describedby", String.prototype.trim.call( describedby.join( " " ) ) );
30012	},
30013
30014	_removeDescribedBy: function( elem ) {
30015		var id = elem.data( "ui-tooltip-id" ),
30016			describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ),
30017			index = $.inArray( id, describedby );
30018
30019		if ( index !== -1 ) {
30020			describedby.splice( index, 1 );
30021		}
30022
30023		elem.removeData( "ui-tooltip-id" );
30024		describedby = String.prototype.trim.call( describedby.join( " " ) );
30025		if ( describedby ) {
30026			elem.attr( "aria-describedby", describedby );
30027		} else {
30028			elem.removeAttr( "aria-describedby" );
30029		}
30030	},
30031
30032	_create: function() {
30033		this._on( {
30034			mouseover: "open",
30035			focusin: "open"
30036		} );
30037
30038		// IDs of generated tooltips, needed for destroy
30039		this.tooltips = {};
30040
30041		// IDs of parent tooltips where we removed the title attribute
30042		this.parents = {};
30043
30044		// Append the aria-live region so tooltips announce correctly
30045		this.liveRegion = $( "<div>" )
30046			.attr( {
30047				role: "log",
30048				"aria-live": "assertive",
30049				"aria-relevant": "additions"
30050			} )
30051			.appendTo( this.document[ 0 ].body );
30052		this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
30053
30054		this.disabledTitles = $( [] );
30055	},
30056
30057	_setOption: function( key, value ) {
30058		var that = this;
30059
30060		this._super( key, value );
30061
30062		if ( key === "content" ) {
30063			$.each( this.tooltips, function( id, tooltipData ) {
30064				that._updateContent( tooltipData.element );
30065			} );
30066		}
30067	},
30068
30069	_setOptionDisabled: function( value ) {
30070		this[ value ? "_disable" : "_enable" ]();
30071	},
30072
30073	_disable: function() {
30074		var that = this;
30075
30076		// Close open tooltips
30077		$.each( this.tooltips, function( id, tooltipData ) {
30078			var event = $.Event( "blur" );
30079			event.target = event.currentTarget = tooltipData.element[ 0 ];
30080			that.close( event, true );
30081		} );
30082
30083		// Remove title attributes to prevent native tooltips
30084		this.disabledTitles = this.disabledTitles.add(
30085			this.element.find( this.options.items ).addBack()
30086				.filter( function() {
30087					var element = $( this );
30088					if ( element.is( "[title]" ) ) {
30089						return element
30090							.data( "ui-tooltip-title", element.attr( "title" ) )
30091							.removeAttr( "title" );
30092					}
30093				} )
30094		);
30095	},
30096
30097	_enable: function() {
30098
30099		// restore title attributes
30100		this.disabledTitles.each( function() {
30101			var element = $( this );
30102			if ( element.data( "ui-tooltip-title" ) ) {
30103				element.attr( "title", element.data( "ui-tooltip-title" ) );
30104			}
30105		} );
30106		this.disabledTitles = $( [] );
30107	},
30108
30109	open: function( event ) {
30110		var that = this,
30111			target = $( event ? event.target : this.element )
30112
30113				// we need closest here due to mouseover bubbling,
30114				// but always pointing at the same event target
30115				.closest( this.options.items );
30116
30117		// No element to show a tooltip for or the tooltip is already open
30118		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
30119			return;
30120		}
30121
30122		if ( target.attr( "title" ) ) {
30123			target.data( "ui-tooltip-title", target.attr( "title" ) );
30124		}
30125
30126		target.data( "ui-tooltip-open", true );
30127
30128		// Kill parent tooltips, custom or native, for hover
30129		if ( event && event.type === "mouseover" ) {
30130			target.parents().each( function() {
30131				var parent = $( this ),
30132					blurEvent;
30133				if ( parent.data( "ui-tooltip-open" ) ) {
30134					blurEvent = $.Event( "blur" );
30135					blurEvent.target = blurEvent.currentTarget = this;
30136					that.close( blurEvent, true );
30137				}
30138				if ( parent.attr( "title" ) ) {
30139					parent.uniqueId();
30140					that.parents[ this.id ] = {
30141						element: this,
30142						title: parent.attr( "title" )
30143					};
30144					parent.attr( "title", "" );
30145				}
30146			} );
30147		}
30148
30149		this._registerCloseHandlers( event, target );
30150		this._updateContent( target, event );
30151	},
30152
30153	_updateContent: function( target, event ) {
30154		var content,
30155			contentOption = this.options.content,
30156			that = this,
30157			eventType = event ? event.type : null;
30158
30159		if ( typeof contentOption === "string" || contentOption.nodeType ||
30160				contentOption.jquery ) {
30161			return this._open( event, target, contentOption );
30162		}
30163
30164		content = contentOption.call( target[ 0 ], function( response ) {
30165
30166			// IE may instantly serve a cached response for ajax requests
30167			// delay this call to _open so the other call to _open runs first
30168			that._delay( function() {
30169
30170				// Ignore async response if tooltip was closed already
30171				if ( !target.data( "ui-tooltip-open" ) ) {
30172					return;
30173				}
30174
30175				// JQuery creates a special event for focusin when it doesn't
30176				// exist natively. To improve performance, the native event
30177				// object is reused and the type is changed. Therefore, we can't
30178				// rely on the type being correct after the event finished
30179				// bubbling, so we set it back to the previous value. (#8740)
30180				if ( event ) {
30181					event.type = eventType;
30182				}
30183				this._open( event, target, response );
30184			} );
30185		} );
30186		if ( content ) {
30187			this._open( event, target, content );
30188		}
30189	},
30190
30191	_open: function( event, target, content ) {
30192		var tooltipData, tooltip, delayedShow, a11yContent,
30193			positionOption = $.extend( {}, this.options.position );
30194
30195		if ( !content ) {
30196			return;
30197		}
30198
30199		// Content can be updated multiple times. If the tooltip already
30200		// exists, then just update the content and bail.
30201		tooltipData = this._find( target );
30202		if ( tooltipData ) {
30203			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
30204			return;
30205		}
30206
30207		// If we have a title, clear it to prevent the native tooltip
30208		// we have to check first to avoid defining a title if none exists
30209		// (we don't want to cause an element to start matching [title])
30210		//
30211		// We use removeAttr only for key events, to allow IE to export the correct
30212		// accessible attributes. For mouse events, set to empty string to avoid
30213		// native tooltip showing up (happens only when removing inside mouseover).
30214		if ( target.is( "[title]" ) ) {
30215			if ( event && event.type === "mouseover" ) {
30216				target.attr( "title", "" );
30217			} else {
30218				target.removeAttr( "title" );
30219			}
30220		}
30221
30222		tooltipData = this._tooltip( target );
30223		tooltip = tooltipData.tooltip;
30224		this._addDescribedBy( target, tooltip.attr( "id" ) );
30225		tooltip.find( ".ui-tooltip-content" ).html( content );
30226
30227		// Support: Voiceover on OS X, JAWS on IE <= 9
30228		// JAWS announces deletions even when aria-relevant="additions"
30229		// Voiceover will sometimes re-read the entire log region's contents from the beginning
30230		this.liveRegion.children().hide();
30231		a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() );
30232		a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" );
30233		a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
30234		a11yContent.appendTo( this.liveRegion );
30235
30236		function position( event ) {
30237			positionOption.of = event;
30238			if ( tooltip.is( ":hidden" ) ) {
30239				return;
30240			}
30241			tooltip.position( positionOption );
30242		}
30243		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
30244			this._on( this.document, {
30245				mousemove: position
30246			} );
30247
30248			// trigger once to override element-relative positioning
30249			position( event );
30250		} else {
30251			tooltip.position( $.extend( {
30252				of: target
30253			}, this.options.position ) );
30254		}
30255
30256		tooltip.hide();
30257
30258		this._show( tooltip, this.options.show );
30259
30260		// Handle tracking tooltips that are shown with a delay (#8644). As soon
30261		// as the tooltip is visible, position the tooltip using the most recent
30262		// event.
30263		// Adds the check to add the timers only when both delay and track options are set (#14682)
30264		if ( this.options.track && this.options.show && this.options.show.delay ) {
30265			delayedShow = this.delayedShow = setInterval( function() {
30266				if ( tooltip.is( ":visible" ) ) {
30267					position( positionOption.of );
30268					clearInterval( delayedShow );
30269				}
30270			}, 13 );
30271		}
30272
30273		this._trigger( "open", event, { tooltip: tooltip } );
30274	},
30275
30276	_registerCloseHandlers: function( event, target ) {
30277		var events = {
30278			keyup: function( event ) {
30279				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
30280					var fakeEvent = $.Event( event );
30281					fakeEvent.currentTarget = target[ 0 ];
30282					this.close( fakeEvent, true );
30283				}
30284			}
30285		};
30286
30287		// Only bind remove handler for delegated targets. Non-delegated
30288		// tooltips will handle this in destroy.
30289		if ( target[ 0 ] !== this.element[ 0 ] ) {
30290			events.remove = function() {
30291				var targetElement = this._find( target );
30292				if ( targetElement ) {
30293					this._removeTooltip( targetElement.tooltip );
30294				}
30295			};
30296		}
30297
30298		if ( !event || event.type === "mouseover" ) {
30299			events.mouseleave = "close";
30300		}
30301		if ( !event || event.type === "focusin" ) {
30302			events.focusout = "close";
30303		}
30304		this._on( true, target, events );
30305	},
30306
30307	close: function( event ) {
30308		var tooltip,
30309			that = this,
30310			target = $( event ? event.currentTarget : this.element ),
30311			tooltipData = this._find( target );
30312
30313		// The tooltip may already be closed
30314		if ( !tooltipData ) {
30315
30316			// We set ui-tooltip-open immediately upon open (in open()), but only set the
30317			// additional data once there's actually content to show (in _open()). So even if the
30318			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
30319			// the period between open() and _open().
30320			target.removeData( "ui-tooltip-open" );
30321			return;
30322		}
30323
30324		tooltip = tooltipData.tooltip;
30325
30326		// Disabling closes the tooltip, so we need to track when we're closing
30327		// to avoid an infinite loop in case the tooltip becomes disabled on close
30328		if ( tooltipData.closing ) {
30329			return;
30330		}
30331
30332		// Clear the interval for delayed tracking tooltips
30333		clearInterval( this.delayedShow );
30334
30335		// Only set title if we had one before (see comment in _open())
30336		// If the title attribute has changed since open(), don't restore
30337		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
30338			target.attr( "title", target.data( "ui-tooltip-title" ) );
30339		}
30340
30341		this._removeDescribedBy( target );
30342
30343		tooltipData.hiding = true;
30344		tooltip.stop( true );
30345		this._hide( tooltip, this.options.hide, function() {
30346			that._removeTooltip( $( this ) );
30347		} );
30348
30349		target.removeData( "ui-tooltip-open" );
30350		this._off( target, "mouseleave focusout keyup" );
30351
30352		// Remove 'remove' binding only on delegated targets
30353		if ( target[ 0 ] !== this.element[ 0 ] ) {
30354			this._off( target, "remove" );
30355		}
30356		this._off( this.document, "mousemove" );
30357
30358		if ( event && event.type === "mouseleave" ) {
30359			$.each( this.parents, function( id, parent ) {
30360				$( parent.element ).attr( "title", parent.title );
30361				delete that.parents[ id ];
30362			} );
30363		}
30364
30365		tooltipData.closing = true;
30366		this._trigger( "close", event, { tooltip: tooltip } );
30367		if ( !tooltipData.hiding ) {
30368			tooltipData.closing = false;
30369		}
30370	},
30371
30372	_tooltip: function( element ) {
30373		var tooltip = $( "<div>" ).attr( "role", "tooltip" ),
30374			content = $( "<div>" ).appendTo( tooltip ),
30375			id = tooltip.uniqueId().attr( "id" );
30376
30377		this._addClass( content, "ui-tooltip-content" );
30378		this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" );
30379
30380		tooltip.appendTo( this._appendTo( element ) );
30381
30382		return this.tooltips[ id ] = {
30383			element: element,
30384			tooltip: tooltip
30385		};
30386	},
30387
30388	_find: function( target ) {
30389		var id = target.data( "ui-tooltip-id" );
30390		return id ? this.tooltips[ id ] : null;
30391	},
30392
30393	_removeTooltip: function( tooltip ) {
30394
30395		// Clear the interval for delayed tracking tooltips
30396		clearInterval( this.delayedShow );
30397
30398		tooltip.remove();
30399		delete this.tooltips[ tooltip.attr( "id" ) ];
30400	},
30401
30402	_appendTo: function( target ) {
30403		var element = target.closest( ".ui-front, dialog" );
30404
30405		if ( !element.length ) {
30406			element = this.document[ 0 ].body;
30407		}
30408
30409		return element;
30410	},
30411
30412	_destroy: function() {
30413		var that = this;
30414
30415		// Close open tooltips
30416		$.each( this.tooltips, function( id, tooltipData ) {
30417
30418			// Delegate to close method to handle common cleanup
30419			var event = $.Event( "blur" ),
30420				element = tooltipData.element;
30421			event.target = event.currentTarget = element[ 0 ];
30422			that.close( event, true );
30423
30424			// Remove immediately; destroying an open tooltip doesn't use the
30425			// hide animation
30426			$( "#" + id ).remove();
30427
30428			// Restore the title
30429			if ( element.data( "ui-tooltip-title" ) ) {
30430
30431				// If the title attribute has changed since open(), don't restore
30432				if ( !element.attr( "title" ) ) {
30433					element.attr( "title", element.data( "ui-tooltip-title" ) );
30434				}
30435				element.removeData( "ui-tooltip-title" );
30436			}
30437		} );
30438		this.liveRegion.remove();
30439	}
30440} );
30441
30442// DEPRECATED
30443// TODO: Switch return back to widget declaration at top of file when this is removed
30444if ( $.uiBackCompat !== false ) {
30445
30446	// Backcompat for tooltipClass option
30447	$.widget( "ui.tooltip", $.ui.tooltip, {
30448		options: {
30449			tooltipClass: null
30450		},
30451		_tooltip: function() {
30452			var tooltipData = this._superApply( arguments );
30453			if ( this.options.tooltipClass ) {
30454				tooltipData.tooltip.addClass( this.options.tooltipClass );
30455			}
30456			return tooltipData;
30457		}
30458	} );
30459}
30460
30461var widgetsTooltip = $.ui.tooltip;
30462
30463
30464
30465
30466} );
vendor: 11,466 bytes, lines 30466-30805
30466
30467function setCustomJsonStringify ()
30468{
30469    'use strict';
30470
30471    function f(n)
30472    {
30473        // Format integers to have at least two digits.
30474        return n < 10 ? '0' + n : n;
30475    }
30476
30477    if (typeof Date.prototype.toJSON !== 'function')
30478    {
30479
30480        Date.prototype.toJSON = function (key)
30481        {
30482
30483            return isFinite(this.valueOf())
30484                ? this.getUTCFullYear() + '-' +
30485                    f(this.getUTCMonth() + 1) + '-' +
30486                    f(this.getUTCDate()) + 'T' +
30487                    f(this.getUTCHours()) + ':' +
30488                    f(this.getUTCMinutes()) + ':' +
30489                    f(this.getUTCSeconds()) + 'Z'
30490                : null;
30491        };
30492
30493        String.prototype.toJSON =
30494            Number.prototype.toJSON =
30495            Boolean.prototype.toJSON = function (key)
30496            {
30497                return this.valueOf();
30498            };
30499    }
30500
30501    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
30502        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
30503        gap,
30504        indent,
30505        meta = {    // table of character substitutions
30506            '\b': '\\b',
30507            '\t': '\\t',
30508            '\n': '\\n',
30509            '\f': '\\f',
30510            '\r': '\\r',
30511            '"': '\\"',
30512            '\\': '\\\\'
30513        },
30514        rep;
30515
30516
30517    function quote(string)
30518    {
30519
30520        // If the string contains no control characters, no quote characters, and no
30521        // backslash characters, then we can safely slap some quotes around it.
30522        // Otherwise we must also replace the offending characters with safe escape
30523        // sequences.
30524
30525        escapable.lastIndex = 0;
30526        return escapable.test(string) ? '"' + string.replace(escapable, function (a)
30527        {
30528            var c = meta[a];
30529            return typeof c === 'string'
30530                ? c
30531                : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
30532        }) + '"' : '"' + string + '"';
30533    }
30534
30535
30536    function str(key, holder)
30537    {
30538
30539        // Produce a string from holder[key].
30540
30541        var i,          // The loop counter.
30542            k,          // The member key.
30543            v,          // The member value.
30544            length,
30545            mind = gap,
30546            partial,
30547            value = holder[key];
30548
30549        // If the value has a toJSON method, call it to obtain a replacement value.
30550
30551        if (value && typeof value === 'object' &&
30552                typeof value.toJSON === 'function')
30553        {
30554            value = value.toJSON(key);
30555        }
30556
30557        // If we were called with a replacer function, then call the replacer to
30558        // obtain a replacement value.
30559
30560        if (typeof rep === 'function')
30561        {
30562            value = rep.call(holder, key, value);
30563        }
30564
30565        // What happens next depends on the value's type.
30566
30567        switch (typeof value)
30568        {
30569            case 'string':
30570                return quote(value);
30571
30572            case 'number':
30573
30574                // JSON numbers must be finite. Encode non-finite numbers as null.
30575
30576                return isFinite(value) ? String(value) : 'null';
30577
30578            case 'boolean':
30579            case 'null':
30580
30581                // If the value is a boolean or null, convert it to a string. Note:
30582                // typeof null does not produce 'null'. The case is included here in
30583                // the remote chance that this gets fixed someday.
30584
30585                return String(value);
30586
30587                // If the type is 'object', we might be dealing with an object or an array or
30588                // null.
30589
30590            case 'object':
30591
30592                // Due to a specification blunder in ECMAScript, typeof null is 'object',
30593                // so watch out for that case.
30594
30595                if (!value)
30596                {
30597                    return 'null';
30598                }
30599
30600                // Make an array to hold the partial results of stringifying this object value.
30601
30602                gap += indent;
30603                partial = [];
30604
30605                // Is the value an array?
30606
30607                if (Object.prototype.toString.apply(value) === '[object Array]')
30608                {
30609
30610                    // The value is an array. Stringify every element. Use null as a placeholder
30611                    // for non-JSON values.
30612
30613                    length = value.length;
30614                    for (i = 0; i < length; i += 1)
30615                    {
30616                        partial[i] = str(i, value) || 'null';
30617                    }
30618
30619                    // Join all of the elements together, separated with commas, and wrap them in
30620                    // brackets.
30621
30622                    v = partial.length === 0
30623                    ? '[]'
30624                    : gap
30625                    ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
30626                    : '[' + partial.join(',') + ']';
30627                    gap = mind;
30628                    return v;
30629                }
30630
30631                // If the replacer is an array, use it to select the members to be stringified.
30632
30633                if (rep && typeof rep === 'object')
30634                {
30635                    length = rep.length;
30636                    for (i = 0; i < length; i += 1)
30637                    {
30638                        if (typeof rep[i] === 'string')
30639                        {
30640                            k = rep[i];
30641                            v = str(k, value);
30642                            if (v)
30643                            {
30644                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
30645                            }
30646                        }
30647                    }
30648                } else
30649                {
30650
30651                    // Otherwise, iterate through all of the keys in the object.
30652
30653                    for (k in value)
30654                    {
30655                        if (Object.prototype.hasOwnProperty.call(value, k))
30656                        {
30657                            v = str(k, value);
30658                            if (v)
30659                            {
30660                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
30661                            }
30662                        }
30663                    }
30664                }
30665
30666                // Join all of the member texts together, separated with commas,
30667                // and wrap them in braces.
30668
30669                v = partial.length === 0
30670                ? '{}'
30671                : gap
30672                ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
30673                : '{' + partial.join(',') + '}';
30674                gap = mind;
30675                return v;
30676        }
30677    }
30678
30679    // If the JSON object does not yet have a stringify method, give it one.
30680
30681    JSON.stringify = function (value, replacer, space)
30682    {
30683
30684        // The stringify method takes a value and an optional replacer, and an optional
30685        // space parameter, and returns a JSON text. The replacer can be a function
30686        // that can replace values, or an array of strings that will select the keys.
30687        // A default replacer method can be provided. Use of the space parameter can
30688        // produce text that is more easily readable.
30689
30690        var i;
30691        gap = '';
30692        indent = '';
30693
30694        // If the space parameter is a number, make an indent string containing that
30695        // many spaces.
30696
30697        if (typeof space === 'number')
30698        {
30699            for (i = 0; i < space; i += 1)
30700            {
30701                indent += ' ';
30702            }
30703
30704            // If the space parameter is a string, it will be used as the indent string.
30705
30706        } else if (typeof space === 'string')
30707        {
30708            indent = space;
30709        }
30710
30711        // If there is a replacer, it must be a function or an array.
30712        // Otherwise, throw an error.
30713
30714        rep = replacer;
30715        if (replacer && typeof replacer !== 'function' &&
30716                (typeof replacer !== 'object' ||
30717                typeof replacer.length !== 'number'))
30718        {
30719            throw new Error('JSON.stringify');
30720        }
30721
30722        // Make a fake root object containing our value under the key of ''.
30723        // Return the result of stringifying the value.
30724
30725        return str('', { '': value });
30726    };
30727
30728
30729    // If the JSON object does not yet have a parse method, give it one.
30730
30731    JSON.parse = function (text, reviver)
30732    {
30733
30734        // The parse method takes a text and an optional reviver function, and returns
30735        // a JavaScript value if the text is a valid JSON text.
30736
30737        var j;
30738
30739        function walk(holder, key)
30740        {
30741
30742            // The walk method is used to recursively walk the resulting structure so
30743            // that modifications can be made.
30744
30745            var k, v, value = holder[key];
30746            if (value && typeof value === 'object')
30747            {
30748                for (k in value)
30749                {
30750                    if (Object.prototype.hasOwnProperty.call(value, k))
30751                    {
30752                        v = walk(value, k);
30753                        if (v !== undefined)
30754                        {
30755                            value[k] = v;
30756                        } else
30757                        {
30758                            delete value[k];
30759                        }
30760                    }
30761                }
30762            }
30763            return reviver.call(holder, key, value);
30764        }
30765
30766
30767        // Parsing happens in four stages. In the first stage, we replace certain
30768        // Unicode characters with escape sequences. JavaScript handles many characters
30769        // incorrectly, either silently deleting them, or treating them as line endings.
30770
30771        text = String(text);
30772        cx.lastIndex = 0;
30773        if (cx.test(text))
30774        {
30775            text = text.replace(cx, function (a)
30776            {
30777                return '\\u' +
30778                    ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
30779            });
30780        }
30781
30782        // In the second stage, we run the text against regular expressions that look
30783        // for non-JSON patterns. We are especially concerned with '()' and 'new'
30784        // because they can cause invocation, and '=' because it can cause mutation.
30785        // But just to be safe, we want to reject all unexpected forms.
30786
30787        // We split the second stage into 4 regexp operations in order to work around
30788        // crippling inefficiencies in IE's and Safari's regexp engines. First we
30789        // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
30790        // replace all simple value tokens with ']' characters. Third, we delete all
30791        // open brackets that follow a colon or comma or that begin the text. Finally,
30792        // we look to see that the remaining characters are only whitespace or ']' or
30793        // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
30794
30795        if (/^[\],:{}\s]*$/
30796                .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
30797                    .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
30798                    .replace(/(?:^|:|,)(?:\s*\[)+/g, '')))
30799        {
30800
30801            // In the third stage we use the eval function to compile the text into a
30802            // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
30803            // in JavaScript: it can begin a block or an object literal. We wrap the text
30804            // in parens to eliminate the ambiguity.
30805
30806            j = eval('(' + text + ')');
30807
30808            // In the optional fourth stage, we recursively walk the new structure, passing
30809            // each name/value pair to a reviver function for possible transformation.
30810
30811            return typeof reviver === 'function'
30812                ? walk({ '': j }, '')
30813                : j;
30814        }
30815
30816        // If the text is not JSON parseable, then a SyntaxError is thrown.
30817
30818        throw new SyntaxError('JSON.parse');
30819    };
30820}
30821
30822$(function ()
30823{
30824    if (/MSIE 8.0/i.test(navigator.userAgent))
30825        setCustomJsonStringify();
30826});
30827/*! DataTables
30828 * ©2008-2015 SpryMedia Ltd - datatables.net/license
30829 */
30830
30831/**
30832 * @summary     DataTables
30833 * @description Paginate, search and order HTML tables
30834 * @file        jquery.dataTables.js
30835 * @author      SpryMedia Ltd (www.sprymedia.co.uk)
30836 * @contact     www.sprymedia.co.uk/contact
30837 * @copyright   Copyright 2008-2015 SpryMedia Ltd.
30838 *
30839 * This source file is free software, available under the following license:
30840 *   MIT license - http://datatables.net/license
30841 *
30842 * This source file is distributed in the hope that it will be useful, but
30843 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
30844 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
30845 *
30846 * For details please refer to: http://www.datatables.net
30847 */
30848
30849/*jslint evil: true, undef: true, browser: true */
30850/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
30851
30852(/** @lends <global> */function( window, document, undefined ) {
30853
30854(function( factory ) {
30855	"use strict";
30856
30857	if ( typeof define === 'function' && define.amd ) {
30858		// Define as an AMD module if possible
30859		define( 'datatables', ['jquery'], factory );
30860	}
30861	else if ( typeof exports === 'object' ) {
30862		// Node/CommonJS
30863		module.exports = factory( require( 'jquery' ) );
30864	}
30865	else if ( jQuery && !jQuery.fn.dataTable ) {
30866		// Define using browser globals otherwise
30867		// Prevent multiple instantiations if the script is loaded twice
30868		factory( jQuery );
30869	}
30870}
30871(/** @lends <global> */function( $ ) {
30872	"use strict";
30873
30874	/**
30875	 * DataTables is a plug-in for the jQuery Javascript library. It is a highly
30876	 * flexible tool, based upon the foundations of progressive enhancement,
30877	 * which will add advanced interaction controls to any HTML table. For a
30878	 * full list of features please refer to
30879	 * [DataTables.net](href="http://datatables.net).
30880	 *
30881	 * Note that the `DataTable` object is not a global variable but is aliased
30882	 * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
30883	 * be  accessed.
30884	 *
30885	 *  @class
30886	 *  @param {object} [init={}] Configuration object for DataTables. Options
30887	 *    are defined by {@link DataTable.defaults}
30888	 *  @requires jQuery 1.7+
30889	 *
30890	 *  @example
30891	 *    // Basic initialisation
30892	 *    $(document).ready( function {
30893	 *      $('#example').dataTable();
30894	 *    } );
30895	 *
30896	 *  @example
30897	 *    // Initialisation with configuration options - in this case, disable
30898	 *    // pagination and sorting.
30899	 *    $(document).ready( function {
30900	 *      $('#example').dataTable( {
30901	 *        "paginate": false,
30902	 *        "sort": false
30903	 *      } );
30904	 *    } );
30905	 */
30906	var DataTable;
30907
30908	
30909	/*
30910	 * It is useful to have variables which are scoped locally so only the
30911	 * DataTables functions can access them and they don't leak into global space.
30912	 * At the same time these functions are often useful over multiple files in the
30913	 * core and API, so we list, or at least document, all variables which are used
30914	 * by DataTables as private variables here. This also ensures that there is no
30915	 * clashing of variable names and that they can easily referenced for reuse.
30916	 */
30917	
30918	
30919	// Defined else where
30920	//  _selector_run
30921	//  _selector_opts
30922	//  _selector_first
30923	//  _selector_row_indexes
30924	
30925	var _ext; // DataTable.ext
30926	var _Api; // DataTable.Api
30927	var _api_register; // DataTable.Api.register
30928	var _api_registerPlural; // DataTable.Api.registerPlural
30929	
30930	var _re_dic = {};
30931	var _re_new_lines = /[\r\n]/g;
30932	var _re_html = /<.*?>/g;
30933	var _re_date_start = /^[\w\+\-]/;
30934	var _re_date_end = /[\w\+\-]$/;
30935	
30936	// Escape regular expression special characters
30937	var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
30938	
30939	// http://en.wikipedia.org/wiki/Foreign_exchange_market
30940	// - \u20BD - Russian ruble.
30941	// - \u20a9 - South Korean Won
30942	// - \u20BA - Turkish Lira
30943	// - \u20B9 - Indian Rupee
30944	// - R - Brazil (R$) and South Africa
30945	// - fr - Swiss Franc
30946	// - kr - Swedish krona, Norwegian krone and Danish krone
30947	// - \u2009 is thin space and \u202F is narrow no-break space, both used in many
30948	//   standards as thousands separators.
30949	var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
30950	
30951	
30952	var _empty = function ( d ) {
30953		return !d || d === true || d === '-' ? true : false;
30954	};
30955	
30956	
30957	var _intVal = function ( s ) {
30958		var integer = parseInt( s, 10 );
30959		return !isNaN(integer) && isFinite(s) ? integer : null;
30960	};
30961	
30962	// Convert from a formatted number with characters other than `.` as the
30963	// decimal place, to a Javascript number
30964	var _numToDecimal = function ( num, decimalPoint ) {
30965		// Cache created regular expressions for speed as this function is called often
30966		if ( ! _re_dic[ decimalPoint ] ) {
30967			_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
30968		}
30969		return typeof num === 'string' && decimalPoint !== '.' ?
30970			num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
30971			num;
30972	};
30973	
30974	
30975	var _isNumber = function ( d, decimalPoint, formatted ) {
30976		var strType = typeof d === 'string';
30977	
30978		// If empty return immediately so there must be a number if it is a
30979		// formatted string (this stops the string "k", or "kr", etc being detected
30980		// as a formatted number for currency
30981		if ( _empty( d ) ) {
30982			return true;
30983		}
30984	
30985		if ( decimalPoint && strType ) {
30986			d = _numToDecimal( d, decimalPoint );
30987		}
30988	
30989		if ( formatted && strType ) {
30990			d = d.replace( _re_formatted_numeric, '' );
30991		}
30992	
30993		return !isNaN( parseFloat(d) ) && isFinite( d );
30994	};
30995	
30996	
30997	// A string without HTML in it can be considered to be HTML still
30998	var _isHtml = function ( d ) {
30999		return _empty( d ) || typeof d === 'string';
31000	};
31001	
31002	
31003	var _htmlNumeric = function ( d, decimalPoint, formatted ) {
31004		if ( _empty( d ) ) {
31005			return true;
31006		}
31007	
31008		var html = _isHtml( d );
31009		return ! html ?
31010			null :
31011			_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
31012				true :
31013				null;
31014	};
31015	
31016	
31017	var _pluck = function ( a, prop, prop2 ) {
31018		var out = [];
31019		var i=0, ien=a.length;
31020	
31021		// Could have the test in the loop for slightly smaller code, but speed
31022		// is essential here
31023		if ( prop2 !== undefined ) {
31024			for ( ; i<ien ; i++ ) {
31025				if ( a[i] && a[i][ prop ] ) {
31026					out.push( a[i][ prop ][ prop2 ] );
31027				}
31028			}
31029		}
31030		else {
31031			for ( ; i<ien ; i++ ) {
31032				if ( a[i] ) {
31033					out.push( a[i][ prop ] );
31034				}
31035			}
31036		}
31037	
31038		return out;
31039	};
31040	
31041	
31042	// Basically the same as _pluck, but rather than looping over `a` we use `order`
31043	// as the indexes to pick from `a`
31044	var _pluck_order = function ( a, order, prop, prop2 )
31045	{
31046		var out = [];
31047		var i=0, ien=order.length;
31048	
31049		// Could have the test in the loop for slightly smaller code, but speed
31050		// is essential here
31051		if ( prop2 !== undefined ) {
31052			for ( ; i<ien ; i++ ) {
31053				if ( a[ order[i] ][ prop ] ) {
31054					out.push( a[ order[i] ][ prop ][ prop2 ] );
31055				}
31056			}
31057		}
31058		else {
31059			for ( ; i<ien ; i++ ) {
31060				out.push( a[ order[i] ][ prop ] );
31061			}
31062		}
31063	
31064		return out;
31065	};
31066	
31067	
31068	var _range = function ( len, start )
31069	{
31070		var out = [];
31071		var end;
31072	
31073		if ( start === undefined ) {
31074			start = 0;
31075			end = len;
31076		}
31077		else {
31078			end = start;
31079			start = len;
31080		}
31081	
31082		for ( var i=start ; i<end ; i++ ) {
31083			out.push( i );
31084		}
31085	
31086		return out;
31087	};
31088	
31089	
31090	var _removeEmpty = function ( a )
31091	{
31092		var out = [];
31093	
31094		for ( var i=0, ien=a.length ; i<ien ; i++ ) {
31095			if ( a[i] ) { // careful - will remove all falsy values!
31096				out.push( a[i] );
31097			}
31098		}
31099	
31100		return out;
31101	};
31102	
31103	
31104	var _stripHtml = function ( d ) {
31105		return d.replace( _re_html, '' );
31106	};
31107	
31108	
31109	/**
31110	 * Find the unique elements in a source array.
31111	 *
31112	 * @param  {array} src Source array
31113	 * @return {array} Array of unique items
31114	 * @ignore
31115	 */
31116	var _unique = function ( src )
31117	{
31118		// A faster unique method is to use object keys to identify used values,
31119		// but this doesn't work with arrays or objects, which we must also
31120		// consider. See jsperf.com/compare-array-unique-versions/4 for more
31121		// information.
31122		var
31123			out = [],
31124			val,
31125			i, ien=src.length,
31126			j, k=0;
31127	
31128		again: for ( i=0 ; i<ien ; i++ ) {
31129			val = src[i];
31130	
31131			for ( j=0 ; j<k ; j++ ) {
31132				if ( out[j] === val ) {
31133					continue again;
31134				}
31135			}
31136	
31137			out.push( val );
31138			k++;
31139		}
31140	
31141		return out;
31142	};
31143	
31144	
31145	
31146	/**
31147	 * Create a mapping object that allows camel case parameters to be looked up
31148	 * for their Hungarian counterparts. The mapping is stored in a private
31149	 * parameter called `_hungarianMap` which can be accessed on the source object.
31150	 *  @param {object} o
31151	 *  @memberof DataTable#oApi
31152	 */
31153	function _fnHungarianMap ( o )
31154	{
31155		var
31156			hungarian = 'a aa ai ao as b fn i m o s ',
31157			match,
31158			newKey,
31159			map = {};
31160	
31161		$.each( o, function (key, val) {
31162			match = key.match(/^([^A-Z]+?)([A-Z])/);
31163	
31164			if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
31165			{
31166				newKey = key.replace( match[0], match[2].toLowerCase() );
31167				map[ newKey ] = key;
31168	
31169				if ( match[1] === 'o' )
31170				{
31171					_fnHungarianMap( o[key] );
31172				}
31173			}
31174		} );
31175	
31176		o._hungarianMap = map;
31177	}
31178	
31179	
31180	/**
31181	 * Convert from camel case parameters to Hungarian, based on a Hungarian map
31182	 * created by _fnHungarianMap.
31183	 *  @param {object} src The model object which holds all parameters that can be
31184	 *    mapped.
31185	 *  @param {object} user The object to convert from camel case to Hungarian.
31186	 *  @param {boolean} force When set to `true`, properties which already have a
31187	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
31188	 *    won't be.
31189	 *  @memberof DataTable#oApi
31190	 */
31191	function _fnCamelToHungarian ( src, user, force )
31192	{
31193		if ( ! src._hungarianMap ) {
31194			_fnHungarianMap( src );
31195		}
31196	
31197		var hungarianKey;
31198	
31199		$.each( user, function (key, val) {
31200			hungarianKey = src._hungarianMap[ key ];
31201	
31202			if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
31203			{
31204				// For objects, we need to buzz down into the object to copy parameters
31205				if ( hungarianKey.charAt(0) === 'o' )
31206				{
31207					// Copy the camelCase options over to the hungarian
31208					if ( ! user[ hungarianKey ] ) {
31209						user[ hungarianKey ] = {};
31210					}
31211					$.extend( true, user[hungarianKey], user[key] );
31212	
31213					_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
31214				}
31215				else {
31216					user[hungarianKey] = user[ key ];
31217				}
31218			}
31219		} );
31220	}
31221	
31222	
31223	/**
31224	 * Language compatibility - when certain options are given, and others aren't, we
31225	 * need to duplicate the values over, in order to provide backwards compatibility
31226	 * with older language files.
31227	 *  @param {object} oSettings dataTables settings object
31228	 *  @memberof DataTable#oApi
31229	 */
31230	function _fnLanguageCompat( lang )
31231	{
31232		var defaults = DataTable.defaults.oLanguage;
31233		var zeroRecords = lang.sZeroRecords;
31234	
31235		/* Backwards compatibility - if there is no sEmptyTable given, then use the same as
31236		 * sZeroRecords - assuming that is given.
31237		 */
31238		if ( ! lang.sEmptyTable && zeroRecords &&
31239			defaults.sEmptyTable === "No data available in table" )
31240		{
31241			_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
31242		}
31243	
31244		/* Likewise with loading records */
31245		if ( ! lang.sLoadingRecords && zeroRecords &&
31246			defaults.sLoadingRecords === "Loading..." )
31247		{
31248			_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
31249		}
31250	
31251		// Old parameter name of the thousands separator mapped onto the new
31252		if ( lang.sInfoThousands ) {
31253			lang.sThousands = lang.sInfoThousands;
31254		}
31255	
31256		var decimal = lang.sDecimal;
31257		if ( decimal ) {
31258			_addNumericSort( decimal );
31259		}
31260	}
31261	
31262	
31263	/**
31264	 * Map one parameter onto another
31265	 *  @param {object} o Object to map
31266	 *  @param {*} knew The new parameter name
31267	 *  @param {*} old The old parameter name
31268	 */
31269	var _fnCompatMap = function ( o, knew, old ) {
31270		if ( o[ knew ] !== undefined ) {
31271			o[ old ] = o[ knew ];
31272		}
31273	};
31274	
31275	
31276	/**
31277	 * Provide backwards compatibility for the main DT options. Note that the new
31278	 * options are mapped onto the old parameters, so this is an external interface
31279	 * change only.
31280	 *  @param {object} init Object to map
31281	 */
31282	function _fnCompatOpts ( init )
31283	{
31284		_fnCompatMap( init, 'ordering',      'bSort' );
31285		_fnCompatMap( init, 'orderMulti',    'bSortMulti' );
31286		_fnCompatMap( init, 'orderClasses',  'bSortClasses' );
31287		_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
31288		_fnCompatMap( init, 'order',         'aaSorting' );
31289		_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );
31290		_fnCompatMap( init, 'paging',        'bPaginate' );
31291		_fnCompatMap( init, 'pagingType',    'sPaginationType' );
31292		_fnCompatMap( init, 'pageLength',    'iDisplayLength' );
31293		_fnCompatMap( init, 'searching',     'bFilter' );
31294	
31295		// Boolean initialisation of x-scrolling
31296		if ( typeof init.sScrollX === 'boolean' ) {
31297			init.sScrollX = init.sScrollX ? '100%' : '';
31298		}
31299	
31300		// Column search objects are in an array, so it needs to be converted
31301		// element by element
31302		var searchCols = init.aoSearchCols;
31303	
31304		if ( searchCols ) {
31305			for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
31306				if ( searchCols[i] ) {
31307					_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
31308				}
31309			}
31310		}
31311	}
31312	
31313	
31314	/**
31315	 * Provide backwards compatibility for column options. Note that the new options
31316	 * are mapped onto the old parameters, so this is an external interface change
31317	 * only.
31318	 *  @param {object} init Object to map
31319	 */
31320	function _fnCompatCols ( init )
31321	{
31322		_fnCompatMap( init, 'orderable',     'bSortable' );
31323		_fnCompatMap( init, 'orderData',     'aDataSort' );
31324		_fnCompatMap( init, 'orderSequence', 'asSorting' );
31325		_fnCompatMap( init, 'orderDataType', 'sortDataType' );
31326	
31327		// orderData can be given as an integer
31328		var dataSort = init.aDataSort;
31329		if ( dataSort && ! $.isArray( dataSort ) ) {
31330			init.aDataSort = [ dataSort ];
31331		}
31332	}
31333	
31334	
31335	/**
31336	 * Browser feature detection for capabilities, quirks
31337	 *  @param {object} settings dataTables settings object
31338	 *  @memberof DataTable#oApi
31339	 */
31340	function _fnBrowserDetect( settings )
31341	{
31342		// We don't need to do this every time DataTables is constructed, the values
31343		// calculated are specific to the browser and OS configuration which we
31344		// don't expect to change between initialisations
31345		if ( ! DataTable.__browser ) {
31346			var browser = {};
31347			DataTable.__browser = browser;
31348	
31349			// Scrolling feature / quirks detection
31350			var n = $('<div/>')
31351				.css( {
31352					position: 'fixed',
31353					top: 0,
31354					left: 0,
31355					height: 1,
31356					width: 1,
31357					overflow: 'hidden'
31358				} )
31359				.append(
31360					$('<div/>')
31361						.css( {
31362							position: 'absolute',
31363							top: 1,
31364							left: 1,
31365							width: 100,
31366							overflow: 'scroll'
31367						} )
31368						.append(
31369							$('<div/>')
31370								.css( {
31371									width: '100%',
31372									height: 10
31373								} )
31374						)
31375				)
31376				.appendTo( 'body' );
31377	
31378			var outer = n.children();
31379			var inner = outer.children();
31380	
31381			// Numbers below, in order, are:
31382			// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
31383			//
31384			// IE6 XP:                           100 100 100  83
31385			// IE7 Vista:                        100 100 100  83
31386			// IE 8+ Windows:                     83  83 100  83
31387			// Evergreen Windows:                 83  83 100  83
31388			// Evergreen Mac with scrollbars:     85  85 100  85
31389			// Evergreen Mac without scrollbars: 100 100 100 100
31390	
31391			// Get scrollbar width
31392			browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
31393	
31394			// IE6/7 will oversize a width 100% element inside a scrolling element, to
31395			// include the width of the scrollbar, while other browsers ensure the inner
31396			// element is contained without forcing scrolling
31397			//console.log( inner.offsetWidth );
31398			browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
31399	
31400			// In rtl text layout, some browsers (most, but not all) will place the
31401			// scrollbar on the left, rather than the right.
31402			browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
31403	
31404			// IE8- don't provide height and width for getBoundingClientRect
31405			browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
31406	
31407			n.remove();
31408		}
31409	
31410		$.extend( settings.oBrowser, DataTable.__browser );
31411		settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
31412	}
31413	
31414	
31415	/**
31416	 * Array.prototype reduce[Right] method, used for browsers which don't support
31417	 * JS 1.6. Done this way to reduce code size, since we iterate either way
31418	 *  @param {object} settings dataTables settings object
31419	 *  @memberof DataTable#oApi
31420	 */
31421	function _fnReduce ( that, fn, init, start, end, inc )
31422	{
31423		var
31424			i = start,
31425			value,
31426			isSet = false;
31427	
31428		if ( init !== undefined ) {
31429			value = init;
31430			isSet = true;
31431		}
31432	
31433		while ( i !== end ) {
31434			if ( ! that.hasOwnProperty(i) ) {
31435				continue;
31436			}
31437	
31438			value = isSet ?
31439				fn( value, that[i], i, that ) :
31440				that[i];
31441	
31442			isSet = true;
31443			i += inc;
31444		}
31445	
31446		return value;
31447	}
31448	
31449	/**
31450	 * Add a column to the list used for the table with default values
31451	 *  @param {object} oSettings dataTables settings object
31452	 *  @param {node} nTh The th element for this column
31453	 *  @memberof DataTable#oApi
31454	 */
31455	function _fnAddColumn( oSettings, nTh )
31456	{
31457		// Add column to aoColumns array
31458		var oDefaults = DataTable.defaults.column;
31459		var iCol = oSettings.aoColumns.length;
31460		var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
31461			"nTh": nTh ? nTh : document.createElement('th'),
31462			"sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
31463			"aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
31464			"mData": oDefaults.mData ? oDefaults.mData : iCol,
31465			idx: iCol
31466		} );
31467		oSettings.aoColumns.push( oCol );
31468	
31469		// Add search object for column specific search. Note that the `searchCols[ iCol ]`
31470		// passed into extend can be undefined. This allows the user to give a default
31471		// with only some of the parameters defined, and also not give a default
31472		var searchCols = oSettings.aoPreSearchCols;
31473		searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
31474	
31475		// Use the default column options function to initialise classes etc
31476		_fnColumnOptions( oSettings, iCol, $(nTh).data() );
31477	}
31478	
31479	
31480	/**
31481	 * Apply options for a column
31482	 *  @param {object} oSettings dataTables settings object
31483	 *  @param {int} iCol column index to consider
31484	 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
31485	 *  @memberof DataTable#oApi
31486	 */
31487	function _fnColumnOptions( oSettings, iCol, oOptions )
31488	{
31489		var oCol = oSettings.aoColumns[ iCol ];
31490		var oClasses = oSettings.oClasses;
31491		var th = $(oCol.nTh);
31492	
31493		// Try to get width information from the DOM. We can't get it from CSS
31494		// as we'd need to parse the CSS stylesheet. `width` option can override
31495		if ( ! oCol.sWidthOrig ) {
31496			// Width attribute
31497			oCol.sWidthOrig = th.attr('width') || null;
31498	
31499			// Style attribute
31500			var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
31501			if ( t ) {
31502				oCol.sWidthOrig = t[1];
31503			}
31504		}
31505	
31506		/* User specified column options */
31507		if ( oOptions !== undefined && oOptions !== null )
31508		{
31509			// Backwards compatibility
31510			_fnCompatCols( oOptions );
31511	
31512			// Map camel case parameters to their Hungarian counterparts
31513			_fnCamelToHungarian( DataTable.defaults.column, oOptions );
31514	
31515			/* Backwards compatibility for mDataProp */
31516			if ( oOptions.mDataProp !== undefined && !oOptions.mData )
31517			{
31518				oOptions.mData = oOptions.mDataProp;
31519			}
31520	
31521			if ( oOptions.sType )
31522			{
31523				oCol._sManualType = oOptions.sType;
31524			}
31525	
31526			// `class` is a reserved word in Javascript, so we need to provide
31527			// the ability to use a valid name for the camel case input
31528			if ( oOptions.className && ! oOptions.sClass )
31529			{
31530				oOptions.sClass = oOptions.className;
31531			}
31532	
31533			$.extend( oCol, oOptions );
31534			_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
31535	
31536			/* iDataSort to be applied (backwards compatibility), but aDataSort will take
31537			 * priority if defined
31538			 */
31539			if ( oOptions.iDataSort !== undefined )
31540			{
31541				oCol.aDataSort = [ oOptions.iDataSort ];
31542			}
31543			_fnMap( oCol, oOptions, "aDataSort" );
31544		}
31545	
31546		/* Cache the data get and set functions for speed */
31547		var mDataSrc = oCol.mData;
31548		var mData = _fnGetObjectDataFn( mDataSrc );
31549		var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
31550	
31551		var attrTest = function( src ) {
31552			return typeof src === 'string' && src.indexOf('@') !== -1;
31553		};
31554		oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
31555			attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
31556		);
31557	
31558		oCol.fnGetData = function (rowData, type, meta) {
31559			var innerData = mData( rowData, type, undefined, meta );
31560	
31561			return mRender && type ?
31562				mRender( innerData, type, rowData, meta ) :
31563				innerData;
31564		};
31565		oCol.fnSetData = function ( rowData, val, meta ) {
31566			return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
31567		};
31568	
31569		// Indicate if DataTables should read DOM data as an object or array
31570		// Used in _fnGetRowElements
31571		if ( typeof mDataSrc !== 'number' ) {
31572			oSettings._rowReadObject = true;
31573		}
31574	
31575		/* Feature sorting overrides column specific when off */
31576		if ( !oSettings.oFeatures.bSort )
31577		{
31578			oCol.bSortable = false;
31579			th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
31580		}
31581	
31582		/* Check that the class assignment is correct for sorting */
31583		var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
31584		var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
31585		if ( !oCol.bSortable || (!bAsc && !bDesc) )
31586		{
31587			oCol.sSortingClass = oClasses.sSortableNone;
31588			oCol.sSortingClassJUI = "";
31589		}
31590		else if ( bAsc && !bDesc )
31591		{
31592			oCol.sSortingClass = oClasses.sSortableAsc;
31593			oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
31594		}
31595		else if ( !bAsc && bDesc )
31596		{
31597			oCol.sSortingClass = oClasses.sSortableDesc;
31598			oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
31599		}
31600		else
31601		{
31602			oCol.sSortingClass = oClasses.sSortable;
31603			oCol.sSortingClassJUI = oClasses.sSortJUI;
31604		}
31605	}
31606	
31607	
31608	/**
31609	 * Adjust the table column widths for new data. Note: you would probably want to
31610	 * do a redraw after calling this function!
31611	 *  @param {object} settings dataTables settings object
31612	 *  @memberof DataTable#oApi
31613	 */
31614	function _fnAdjustColumnSizing ( settings )
31615	{
31616		/* Not interested in doing column width calculation if auto-width is disabled */
31617		if ( settings.oFeatures.bAutoWidth !== false )
31618		{
31619			var columns = settings.aoColumns;
31620	
31621			_fnCalculateColumnWidths( settings );
31622			for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
31623			{
31624				columns[i].nTh.style.width = columns[i].sWidth;
31625			}
31626		}
31627	
31628		var scroll = settings.oScroll;
31629		if ( scroll.sY !== '' || scroll.sX !== '')
31630		{
31631			_fnScrollDraw( settings );
31632		}
31633	
31634		_fnCallbackFire( settings, null, 'column-sizing', [settings] );
31635	}
31636	
31637	
31638	/**
31639	 * Covert the index of a visible column to the index in the data array (take account
31640	 * of hidden columns)
31641	 *  @param {object} oSettings dataTables settings object
31642	 *  @param {int} iMatch Visible column index to lookup
31643	 *  @returns {int} i the data index
31644	 *  @memberof DataTable#oApi
31645	 */
31646	function _fnVisibleToColumnIndex( oSettings, iMatch )
31647	{
31648		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
31649	
31650		return typeof aiVis[iMatch] === 'number' ?
31651			aiVis[iMatch] :
31652			null;
31653	}
31654	
31655	
31656	/**
31657	 * Covert the index of an index in the data array and convert it to the visible
31658	 *   column index (take account of hidden columns)
31659	 *  @param {int} iMatch Column index to lookup
31660	 *  @param {object} oSettings dataTables settings object
31661	 *  @returns {int} i the data index
31662	 *  @memberof DataTable#oApi
31663	 */
31664	function _fnColumnIndexToVisible( oSettings, iMatch )
31665	{
31666		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
31667		var iPos = $.inArray( iMatch, aiVis );
31668	
31669		return iPos !== -1 ? iPos : null;
31670	}
31671	
31672	
31673	/**
31674	 * Get the number of visible columns
31675	 *  @param {object} oSettings dataTables settings object
31676	 *  @returns {int} i the number of visible columns
31677	 *  @memberof DataTable#oApi
31678	 */
31679	function _fnVisbleColumns( oSettings )
31680	{
31681		return _fnGetColumns( oSettings, 'bVisible' ).length;
31682	}
31683	
31684	
31685	/**
31686	 * Get an array of column indexes that match a given property
31687	 *  @param {object} oSettings dataTables settings object
31688	 *  @param {string} sParam Parameter in aoColumns to look for - typically
31689	 *    bVisible or bSearchable
31690	 *  @returns {array} Array of indexes with matched properties
31691	 *  @memberof DataTable#oApi
31692	 */
31693	function _fnGetColumns( oSettings, sParam )
31694	{
31695		var a = [];
31696	
31697		$.map( oSettings.aoColumns, function(val, i) {
31698			if ( val[sParam] ) {
31699				a.push( i );
31700			}
31701		} );
31702	
31703		return a;
31704	}
31705	
31706	
31707	/**
31708	 * Calculate the 'type' of a column
31709	 *  @param {object} settings dataTables settings object
31710	 *  @memberof DataTable#oApi
31711	 */
31712	function _fnColumnTypes ( settings )
31713	{
31714		var columns = settings.aoColumns;
31715		var data = settings.aoData;
31716		var types = DataTable.ext.type.detect;
31717		var i, ien, j, jen, k, ken;
31718		var col, cell, detectedType, cache;
31719	
31720		// For each column, spin over the 
31721		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
31722			col = columns[i];
31723			cache = [];
31724	
31725			if ( ! col.sType && col._sManualType ) {
31726				col.sType = col._sManualType;
31727			}
31728			else if ( ! col.sType ) {
31729				for ( j=0, jen=types.length ; j<jen ; j++ ) {
31730					for ( k=0, ken=data.length ; k<ken ; k++ ) {
31731						// Use a cache array so we only need to get the type data
31732						// from the formatter once (when using multiple detectors)
31733						if ( cache[k] === undefined ) {
31734							cache[k] = _fnGetCellData( settings, k, i, 'type' );
31735						}
31736	
31737						detectedType = types[j]( cache[k], settings );
31738	
31739						// If null, then this type can't apply to this column, so
31740						// rather than testing all cells, break out. There is an
31741						// exception for the last type which is `html`. We need to
31742						// scan all rows since it is possible to mix string and HTML
31743						// types
31744						if ( ! detectedType && j !== types.length-1 ) {
31745							break;
31746						}
31747	
31748						// Only a single match is needed for html type since it is
31749						// bottom of the pile and very similar to string
31750						if ( detectedType === 'html' ) {
31751							break;
31752						}
31753					}
31754	
31755					// Type is valid for all data points in the column - use this
31756					// type
31757					if ( detectedType ) {
31758						col.sType = detectedType;
31759						break;
31760					}
31761				}
31762	
31763				// Fall back - if no type was detected, always use string
31764				if ( ! col.sType ) {
31765					col.sType = 'string';
31766				}
31767			}
31768		}
31769	}
31770	
31771	
31772	/**
31773	 * Take the column definitions and static columns arrays and calculate how
31774	 * they relate to column indexes. The callback function will then apply the
31775	 * definition found for a column to a suitable configuration object.
31776	 *  @param {object} oSettings dataTables settings object
31777	 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
31778	 *  @param {array} aoCols The aoColumns array that defines columns individually
31779	 *  @param {function} fn Callback function - takes two parameters, the calculated
31780	 *    column index and the definition for that column.
31781	 *  @memberof DataTable#oApi
31782	 */
31783	function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
31784	{
31785		var i, iLen, j, jLen, k, kLen, def;
31786		var columns = oSettings.aoColumns;
31787	
31788		// Column definitions with aTargets
31789		if ( aoColDefs )
31790		{
31791			/* Loop over the definitions array - loop in reverse so first instance has priority */
31792			for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
31793			{
31794				def = aoColDefs[i];
31795	
31796				/* Each definition can target multiple columns, as it is an array */
31797				var aTargets = def.targets !== undefined ?
31798					def.targets :
31799					def.aTargets;
31800	
31801				if ( ! $.isArray( aTargets ) )
31802				{
31803					aTargets = [ aTargets ];
31804				}
31805	
31806				for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
31807				{
31808					if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
31809					{
31810						/* Add columns that we don't yet know about */
31811						while( columns.length <= aTargets[j] )
31812						{
31813							_fnAddColumn( oSettings );
31814						}
31815	
31816						/* Integer, basic index */
31817						fn( aTargets[j], def );
31818					}
31819					else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
31820					{
31821						/* Negative integer, right to left column counting */
31822						fn( columns.length+aTargets[j], def );
31823					}
31824					else if ( typeof aTargets[j] === 'string' )
31825					{
31826						/* Class name matching on TH element */
31827						for ( k=0, kLen=columns.length ; k<kLen ; k++ )
31828						{
31829							if ( aTargets[j] == "_all" ||
31830							     $(columns[k].nTh).hasClass( aTargets[j] ) )
31831							{
31832								fn( k, def );
31833							}
31834						}
31835					}
31836				}
31837			}
31838		}
31839	
31840		// Statically defined columns array
31841		if ( aoCols )
31842		{
31843			for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
31844			{
31845				fn( i, aoCols[i] );
31846			}
31847		}
31848	}
31849	
31850	/**
31851	 * Add a data array to the table, creating DOM node etc. This is the parallel to
31852	 * _fnGatherData, but for adding rows from a Javascript source, rather than a
31853	 * DOM source.
31854	 *  @param {object} oSettings dataTables settings object
31855	 *  @param {array} aData data array to be added
31856	 *  @param {node} [nTr] TR element to add to the table - optional. If not given,
31857	 *    DataTables will create a row automatically
31858	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
31859	 *    if nTr is.
31860	 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
31861	 *  @memberof DataTable#oApi
31862	 */
31863	function _fnAddData ( oSettings, aDataIn, nTr, anTds )
31864	{
31865		/* Create the object for storing information about this new row */
31866		var iRow = oSettings.aoData.length;
31867		var oData = $.extend( true, {}, DataTable.models.oRow, {
31868			src: nTr ? 'dom' : 'data',
31869			idx: iRow
31870		} );
31871	
31872		oData._aData = aDataIn;
31873		oSettings.aoData.push( oData );
31874	
31875		/* Create the cells */
31876		var nTd, sThisType;
31877		var columns = oSettings.aoColumns;
31878	
31879		// Invalidate the column types as the new data needs to be revalidated
31880		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
31881		{
31882			columns[i].sType = null;
31883		}
31884	
31885		/* Add to the display array */
31886		oSettings.aiDisplayMaster.push( iRow );
31887	
31888		var id = oSettings.rowIdFn( aDataIn );
31889		if ( id !== undefined ) {
31890			oSettings.aIds[ id ] = oData;
31891		}
31892	
31893		/* Create the DOM information, or register it if already present */
31894		if ( nTr || ! oSettings.oFeatures.bDeferRender )
31895		{
31896			_fnCreateTr( oSettings, iRow, nTr, anTds );
31897		}
31898	
31899		return iRow;
31900	}
31901	
31902	
31903	/**
31904	 * Add one or more TR elements to the table. Generally we'd expect to
31905	 * use this for reading data from a DOM sourced table, but it could be
31906	 * used for an TR element. Note that if a TR is given, it is used (i.e.
31907	 * it is not cloned).
31908	 *  @param {object} settings dataTables settings object
31909	 *  @param {array|node|jQuery} trs The TR element(s) to add to the table
31910	 *  @returns {array} Array of indexes for the added rows
31911	 *  @memberof DataTable#oApi
31912	 */
31913	function _fnAddTr( settings, trs )
31914	{
31915		var row;
31916	
31917		// Allow an individual node to be passed in
31918		if ( ! (trs instanceof $) ) {
31919			trs = $(trs);
31920		}
31921	
31922		return trs.map( function (i, el) {
31923			row = _fnGetRowElements( settings, el );
31924			return _fnAddData( settings, row.data, el, row.cells );
31925		} );
31926	}
31927	
31928	
31929	/**
31930	 * Take a TR element and convert it to an index in aoData
31931	 *  @param {object} oSettings dataTables settings object
31932	 *  @param {node} n the TR element to find
31933	 *  @returns {int} index if the node is found, null if not
31934	 *  @memberof DataTable#oApi
31935	 */
31936	function _fnNodeToDataIndex( oSettings, n )
31937	{
31938		return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
31939	}
31940	
31941	
31942	/**
31943	 * Take a TD element and convert it into a column data index (not the visible index)
31944	 *  @param {object} oSettings dataTables settings object
31945	 *  @param {int} iRow The row number the TD/TH can be found in
31946	 *  @param {node} n The TD/TH element to find
31947	 *  @returns {int} index if the node is found, -1 if not
31948	 *  @memberof DataTable#oApi
31949	 */
31950	function _fnNodeToColumnIndex( oSettings, iRow, n )
31951	{
31952		return $.inArray( n, oSettings.aoData[ iRow ].anCells );
31953	}
31954	
31955	
31956	/**
31957	 * Get the data for a given cell from the internal cache, taking into account data mapping
31958	 *  @param {object} settings dataTables settings object
31959	 *  @param {int} rowIdx aoData row id
31960	 *  @param {int} colIdx Column index
31961	 *  @param {string} type data get type ('display', 'type' 'filter' 'sort')
31962	 *  @returns {*} Cell data
31963	 *  @memberof DataTable#oApi
31964	 */
31965	function _fnGetCellData( settings, rowIdx, colIdx, type )
31966	{
31967		var draw           = settings.iDraw;
31968		var col            = settings.aoColumns[colIdx];
31969		var rowData        = settings.aoData[rowIdx]._aData;
31970		var defaultContent = col.sDefaultContent;
31971		var cellData       = col.fnGetData( rowData, type, {
31972			settings: settings,
31973			row:      rowIdx,
31974			col:      colIdx
31975		} );
31976	
31977		if ( cellData === undefined ) {
31978			if ( settings.iDrawError != draw && defaultContent === null ) {
31979				_fnLog( settings, 0, "Requested unknown parameter "+
31980					(typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
31981					" for row "+rowIdx, 4 );
31982				settings.iDrawError = draw;
31983			}
31984			return defaultContent;
31985		}
31986	
31987		/* When the data source is null, we can use default column data */
31988		if ( (cellData === rowData || cellData === null) && defaultContent !== null ) {
31989			cellData = defaultContent;
31990		}
31991		else if ( typeof cellData === 'function' ) {
31992			// If the data source is a function, then we run it and use the return,
31993			// executing in the scope of the data object (for instances)
31994			return cellData.call( rowData );
31995		}
31996	
31997		if ( cellData === null && type == 'display' ) {
31998			return '';
31999		}
32000		return cellData;
32001	}
32002	
32003	
32004	/**
32005	 * Set the value for a specific cell, into the internal data cache
32006	 *  @param {object} settings dataTables settings object
32007	 *  @param {int} rowIdx aoData row id
32008	 *  @param {int} colIdx Column index
32009	 *  @param {*} val Value to set
32010	 *  @memberof DataTable#oApi
32011	 */
32012	function _fnSetCellData( settings, rowIdx, colIdx, val )
32013	{
32014		var col     = settings.aoColumns[colIdx];
32015		var rowData = settings.aoData[rowIdx]._aData;
32016	
32017		col.fnSetData( rowData, val, {
32018			settings: settings,
32019			row:      rowIdx,
32020			col:      colIdx
32021		}  );
32022	}
32023	
32024	
32025	// Private variable that is used to match action syntax in the data property object
32026	var __reArray = /\[.*?\]$/;
32027	var __reFn = /\(\)$/;
32028	
32029	/**
32030	 * Split string on periods, taking into account escaped periods
32031	 * @param  {string} str String to split
32032	 * @return {array} Split string
32033	 */
32034	function _fnSplitObjNotation( str )
32035	{
32036		return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) {
32037			return s.replace(/\\./g, '.');
32038		} );
32039	}
32040	
32041	
32042	/**
32043	 * Return a function that can be used to get data from a source object, taking
32044	 * into account the ability to use nested objects as a source
32045	 *  @param {string|int|function} mSource The data source for the object
32046	 *  @returns {function} Data get function
32047	 *  @memberof DataTable#oApi
32048	 */
32049	function _fnGetObjectDataFn( mSource )
32050	{
32051		if ( $.isPlainObject( mSource ) )
32052		{
32053			/* Build an object of get functions, and wrap them in a single call */
32054			var o = {};
32055			$.each( mSource, function (key, val) {
32056				if ( val ) {
32057					o[key] = _fnGetObjectDataFn( val );
32058				}
32059			} );
32060	
32061			return function (data, type, row, meta) {
32062				var t = o[type] || o._;
32063				return t !== undefined ?
32064					t(data, type, row, meta) :
32065					data;
32066			};
32067		}
32068		else if ( mSource === null )
32069		{
32070			/* Give an empty string for rendering / sorting etc */
32071			return function (data) { // type, row and meta also passed, but not used
32072				return data;
32073			};
32074		}
32075		else if ( typeof mSource === 'function' )
32076		{
32077			return function (data, type, row, meta) {
32078				return mSource( data, type, row, meta );
32079			};
32080		}
32081		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
32082			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
32083		{
32084			/* If there is a . in the source string then the data source is in a
32085			 * nested object so we loop over the data for each level to get the next
32086			 * level down. On each loop we test for undefined, and if found immediately
32087			 * return. This allows entire objects to be missing and sDefaultContent to
32088			 * be used if defined, rather than throwing an error
32089			 */
32090			var fetchData = function (data, type, src) {
32091				var arrayNotation, funcNotation, out, innerSrc;
32092	
32093				if ( src !== "" )
32094				{
32095					var a = _fnSplitObjNotation( src );
32096	
32097					for ( var i=0, iLen=a.length ; i<iLen ; i++ )
32098					{
32099						// Check if we are dealing with special notation
32100						arrayNotation = a[i].match(__reArray);
32101						funcNotation = a[i].match(__reFn);
32102	
32103						if ( arrayNotation )
32104						{
32105							// Array notation
32106							a[i] = a[i].replace(__reArray, '');
32107	
32108							// Condition allows simply [] to be passed in
32109							if ( a[i] !== "" ) {
32110								data = data[ a[i] ];
32111							}
32112							out = [];
32113	
32114							// Get the remainder of the nested object to get
32115							a.splice( 0, i+1 );
32116							innerSrc = a.join('.');
32117	
32118							// Traverse each entry in the array getting the properties requested
32119							if ( $.isArray( data ) ) {
32120								for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
32121									out.push( fetchData( data[j], type, innerSrc ) );
32122								}
32123							}
32124	
32125							// If a string is given in between the array notation indicators, that
32126							// is used to join the strings together, otherwise an array is returned
32127							var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
32128							data = (join==="") ? out : out.join(join);
32129	
32130							// The inner call to fetchData has already traversed through the remainder
32131							// of the source requested, so we exit from the loop
32132							break;
32133						}
32134						else if ( funcNotation )
32135						{
32136							// Function call
32137							a[i] = a[i].replace(__reFn, '');
32138							data = data[ a[i] ]();
32139							continue;
32140						}
32141	
32142						if ( data === null || data[ a[i] ] === undefined )
32143						{
32144							return undefined;
32145						}
32146						data = data[ a[i] ];
32147					}
32148				}
32149	
32150				return data;
32151			};
32152	
32153			return function (data, type) { // row and meta also passed, but not used
32154				return fetchData( data, type, mSource );
32155			};
32156		}
32157		else
32158		{
32159			/* Array or flat object mapping */
32160			return function (data, type) { // row and meta also passed, but not used
32161				return data[mSource];
32162			};
32163		}
32164	}
32165	
32166	
32167	/**
32168	 * Return a function that can be used to set data from a source object, taking
32169	 * into account the ability to use nested objects as a source
32170	 *  @param {string|int|function} mSource The data source for the object
32171	 *  @returns {function} Data set function
32172	 *  @memberof DataTable#oApi
32173	 */
32174	function _fnSetObjectDataFn( mSource )
32175	{
32176		if ( $.isPlainObject( mSource ) )
32177		{
32178			/* Unlike get, only the underscore (global) option is used for for
32179			 * setting data since we don't know the type here. This is why an object
32180			 * option is not documented for `mData` (which is read/write), but it is
32181			 * for `mRender` which is read only.
32182			 */
32183			return _fnSetObjectDataFn( mSource._ );
32184		}
32185		else if ( mSource === null )
32186		{
32187			/* Nothing to do when the data source is null */
32188			return function () {};
32189		}
32190		else if ( typeof mSource === 'function' )
32191		{
32192			return function (data, val, meta) {
32193				mSource( data, 'set', val, meta );
32194			};
32195		}
32196		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
32197			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
32198		{
32199			/* Like the get, we need to get data from a nested object */
32200			var setData = function (data, val, src) {
32201				var a = _fnSplitObjNotation( src ), b;
32202				var aLast = a[a.length-1];
32203				var arrayNotation, funcNotation, o, innerSrc;
32204	
32205				for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
32206				{
32207					// Check if we are dealing with an array notation request
32208					arrayNotation = a[i].match(__reArray);
32209					funcNotation = a[i].match(__reFn);
32210	
32211					if ( arrayNotation )
32212					{
32213						a[i] = a[i].replace(__reArray, '');
32214						data[ a[i] ] = [];
32215	
32216						// Get the remainder of the nested object to set so we can recurse
32217						b = a.slice();
32218						b.splice( 0, i+1 );
32219						innerSrc = b.join('.');
32220	
32221						// Traverse each entry in the array setting the properties requested
32222						if ( $.isArray( val ) )
32223						{
32224							for ( var j=0, jLen=val.length ; j<jLen ; j++ )
32225							{
32226								o = {};
32227								setData( o, val[j], innerSrc );
32228								data[ a[i] ].push( o );
32229							}
32230						}
32231						else
32232						{
32233							// We've been asked to save data to an array, but it
32234							// isn't array data to be saved. Best that can be done
32235							// is to just save the value.
32236							data[ a[i] ] = val;
32237						}
32238	
32239						// The inner call to setData has already traversed through the remainder
32240						// of the source and has set the data, thus we can exit here
32241						return;
32242					}
32243					else if ( funcNotation )
32244					{
32245						// Function call
32246						a[i] = a[i].replace(__reFn, '');
32247						data = data[ a[i] ]( val );
32248					}
32249	
32250					// If the nested object doesn't currently exist - since we are
32251					// trying to set the value - create it
32252					if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
32253					{
32254						data[ a[i] ] = {};
32255					}
32256					data = data[ a[i] ];
32257				}
32258	
32259				// Last item in the input - i.e, the actual set
32260				if ( aLast.match(__reFn ) )
32261				{
32262					// Function call
32263					data = data[ aLast.replace(__reFn, '') ]( val );
32264				}
32265				else
32266				{
32267					// If array notation is used, we just want to strip it and use the property name
32268					// and assign the value. If it isn't used, then we get the result we want anyway
32269					data[ aLast.replace(__reArray, '') ] = val;
32270				}
32271			};
32272	
32273			return function (data, val) { // meta is also passed in, but not used
32274				return setData( data, val, mSource );
32275			};
32276		}
32277		else
32278		{
32279			/* Array or flat object mapping */
32280			return function (data, val) { // meta is also passed in, but not used
32281				data[mSource] = val;
32282			};
32283		}
32284	}
32285	
32286	
32287	/**
32288	 * Return an array with the full table data
32289	 *  @param {object} oSettings dataTables settings object
32290	 *  @returns array {array} aData Master data array
32291	 *  @memberof DataTable#oApi
32292	 */
32293	function _fnGetDataMaster ( settings )
32294	{
32295		return _pluck( settings.aoData, '_aData' );
32296	}
32297	
32298	
32299	/**
32300	 * Nuke the table
32301	 *  @param {object} oSettings dataTables settings object
32302	 *  @memberof DataTable#oApi
32303	 */
32304	function _fnClearTable( settings )
32305	{
32306		settings.aoData.length = 0;
32307		settings.aiDisplayMaster.length = 0;
32308		settings.aiDisplay.length = 0;
32309		settings.aIds = {};
32310	}
32311	
32312	
32313	 /**
32314	 * Take an array of integers (index array) and remove a target integer (value - not
32315	 * the key!)
32316	 *  @param {array} a Index array to target
32317	 *  @param {int} iTarget value to find
32318	 *  @memberof DataTable#oApi
32319	 */
32320	function _fnDeleteIndex( a, iTarget, splice )
32321	{
32322		var iTargetIndex = -1;
32323	
32324		for ( var i=0, iLen=a.length ; i<iLen ; i++ )
32325		{
32326			if ( a[i] == iTarget )
32327			{
32328				iTargetIndex = i;
32329			}
32330			else if ( a[i] > iTarget )
32331			{
32332				a[i]--;
32333			}
32334		}
32335	
32336		if ( iTargetIndex != -1 && splice === undefined )
32337		{
32338			a.splice( iTargetIndex, 1 );
32339		}
32340	}
32341	
32342	
32343	/**
32344	 * Mark cached data as invalid such that a re-read of the data will occur when
32345	 * the cached data is next requested. Also update from the data source object.
32346	 *
32347	 * @param {object} settings DataTables settings object
32348	 * @param {int}    rowIdx   Row index to invalidate
32349	 * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
32350	 *     or 'data'
32351	 * @param {int}    [colIdx] Column index to invalidate. If undefined the whole
32352	 *     row will be invalidated
32353	 * @memberof DataTable#oApi
32354	 *
32355	 * @todo For the modularisation of v1.11 this will need to become a callback, so
32356	 *   the sort and filter methods can subscribe to it. That will required
32357	 *   initialisation options for sorting, which is why it is not already baked in
32358	 */
32359	function _fnInvalidate( settings, rowIdx, src, colIdx )
32360	{
32361		var row = settings.aoData[ rowIdx ];
32362		var i, ien;
32363		var cellWrite = function ( cell, col ) {
32364			// This is very frustrating, but in IE if you just write directly
32365			// to innerHTML, and elements that are overwritten are GC'ed,
32366			// even if there is a reference to them elsewhere
32367			while ( cell.childNodes.length ) {
32368				cell.removeChild( cell.firstChild );
32369			}
32370	
32371			cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
32372		};
32373	
32374		// Are we reading last data from DOM or the data object?
32375		if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
32376			// Read the data from the DOM
32377			row._aData = _fnGetRowElements(
32378					settings, row, colIdx, colIdx === undefined ? undefined : row._aData
32379				)
32380				.data;
32381		}
32382		else {
32383			// Reading from data object, update the DOM
32384			var cells = row.anCells;
32385	
32386			if ( cells ) {
32387				if ( colIdx !== undefined ) {
32388					cellWrite( cells[colIdx], colIdx );
32389				}
32390				else {
32391					for ( i=0, ien=cells.length ; i<ien ; i++ ) {
32392						cellWrite( cells[i], i );
32393					}
32394				}
32395			}
32396		}
32397	
32398		// For both row and cell invalidation, the cached data for sorting and
32399		// filtering is nulled out
32400		row._aSortData = null;
32401		row._aFilterData = null;
32402	
32403		// Invalidate the type for a specific column (if given) or all columns since
32404		// the data might have changed
32405		var cols = settings.aoColumns;
32406		if ( colIdx !== undefined ) {
32407			cols[ colIdx ].sType = null;
32408		}
32409		else {
32410			for ( i=0, ien=cols.length ; i<ien ; i++ ) {
32411				cols[i].sType = null;
32412			}
32413	
32414			// Update DataTables special `DT_*` attributes for the row
32415			_fnRowAttributes( settings, row );
32416		}
32417	}
32418	
32419	
32420	/**
32421	 * Build a data source object from an HTML row, reading the contents of the
32422	 * cells that are in the row.
32423	 *
32424	 * @param {object} settings DataTables settings object
32425	 * @param {node|object} TR element from which to read data or existing row
32426	 *   object from which to re-read the data from the cells
32427	 * @param {int} [colIdx] Optional column index
32428	 * @param {array|object} [d] Data source object. If `colIdx` is given then this
32429	 *   parameter should also be given and will be used to write the data into.
32430	 *   Only the column in question will be written
32431	 * @returns {object} Object with two parameters: `data` the data read, in
32432	 *   document order, and `cells` and array of nodes (they can be useful to the
32433	 *   caller, so rather than needing a second traversal to get them, just return
32434	 *   them from here).
32435	 * @memberof DataTable#oApi
32436	 */
32437	function _fnGetRowElements( settings, row, colIdx, d )
32438	{
32439		var
32440			tds = [],
32441			td = row.firstChild,
32442			name, col, o, i=0, contents,
32443			columns = settings.aoColumns,
32444			objectRead = settings._rowReadObject;
32445	
32446		// Allow the data object to be passed in, or construct
32447		d = d !== undefined ?
32448			d :
32449			objectRead ?
32450				{} :
32451				[];
32452	
32453		var attr = function ( str, td  ) {
32454			if ( typeof str === 'string' ) {
32455				var idx = str.indexOf('@');
32456	
32457				if ( idx !== -1 ) {
32458					var attr = str.substring( idx+1 );
32459					var setter = _fnSetObjectDataFn( str );
32460					setter( d, td.getAttribute( attr ) );
32461				}
32462			}
32463		};
32464	
32465		// Read data from a cell and store into the data object
32466		var cellProcess = function ( cell ) {
32467			if ( colIdx === undefined || colIdx === i ) {
32468				col = columns[i];
32469				contents = $.trim(cell.innerHTML);
32470	
32471				if ( col && col._bAttrSrc ) {
32472					var setter = _fnSetObjectDataFn( col.mData._ );
32473					setter( d, contents );
32474	
32475					attr( col.mData.sort, cell );
32476					attr( col.mData.type, cell );
32477					attr( col.mData.filter, cell );
32478				}
32479				else {
32480					// Depending on the `data` option for the columns the data can
32481					// be read to either an object or an array.
32482					if ( objectRead ) {
32483						if ( ! col._setter ) {
32484							// Cache the setter function
32485							col._setter = _fnSetObjectDataFn( col.mData );
32486						}
32487						col._setter( d, contents );
32488					}
32489					else {
32490						d[i] = contents;
32491					}
32492				}
32493			}
32494	
32495			i++;
32496		};
32497	
32498		if ( td ) {
32499			// `tr` element was passed in
32500			while ( td ) {
32501				name = td.nodeName.toUpperCase();
32502	
32503				if ( name == "TD" || name == "TH" ) {
32504					cellProcess( td );
32505					tds.push( td );
32506				}
32507	
32508				td = td.nextSibling;
32509			}
32510		}
32511		else {
32512			// Existing row object passed in
32513			tds = row.anCells;
32514	
32515			for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
32516				cellProcess( tds[j] );
32517			}
32518		}
32519	
32520		// Read the ID from the DOM if present
32521		var rowNode = td ? row : row.nTr;
32522	
32523		if ( rowNode ) {
32524			var id = rowNode.getAttribute( 'id' );
32525	
32526			if ( id ) {
32527				_fnSetObjectDataFn( settings.rowId )( d, id );
32528			}
32529		}
32530	
32531		return {
32532			data: d,
32533			cells: tds
32534		};
32535	}
32536	/**
32537	 * Create a new TR element (and it's TD children) for a row
32538	 *  @param {object} oSettings dataTables settings object
32539	 *  @param {int} iRow Row to consider
32540	 *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,
32541	 *    DataTables will create a row automatically
32542	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
32543	 *    if nTr is.
32544	 *  @memberof DataTable#oApi
32545	 */
32546	function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
32547	{
32548		var
32549			row = oSettings.aoData[iRow],
32550			rowData = row._aData,
32551			cells = [],
32552			nTr, nTd, oCol,
32553			i, iLen;
32554	
32555		if ( row.nTr === null )
32556		{
32557			nTr = nTrIn || document.createElement('tr');
32558	
32559			row.nTr = nTr;
32560			row.anCells = cells;
32561	
32562			/* Use a private property on the node to allow reserve mapping from the node
32563			 * to the aoData array for fast look up
32564			 */
32565			nTr._DT_RowIndex = iRow;
32566	
32567			/* Special parameters can be given by the data source to be used on the row */
32568			_fnRowAttributes( oSettings, row );
32569	
32570			/* Process each column */
32571			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
32572			{
32573				oCol = oSettings.aoColumns[i];
32574	
32575				nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
32576				cells.push( nTd );
32577	
32578				// Need to create the HTML if new, or if a rendering function is defined
32579				if ( !nTrIn || oCol.mRender || oCol.mData !== i )
32580				{
32581					nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
32582				}
32583	
32584				/* Add user defined class */
32585				if ( oCol.sClass )
32586				{
32587					nTd.className += ' '+oCol.sClass;
32588				}
32589	
32590				// Visibility - add or remove as required
32591				if ( oCol.bVisible && ! nTrIn )
32592				{
32593					nTr.appendChild( nTd );
32594				}
32595				else if ( ! oCol.bVisible && nTrIn )
32596				{
32597					nTd.parentNode.removeChild( nTd );
32598				}
32599	
32600				if ( oCol.fnCreatedCell )
32601				{
32602					oCol.fnCreatedCell.call( oSettings.oInstance,
32603						nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
32604					);
32605				}
32606			}
32607	
32608			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );
32609		}
32610	
32611		// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
32612		// and deployed
32613		row.nTr.setAttribute( 'role', 'row' );
32614	}
32615	
32616	
32617	/**
32618	 * Add attributes to a row based on the special `DT_*` parameters in a data
32619	 * source object.
32620	 *  @param {object} settings DataTables settings object
32621	 *  @param {object} DataTables row object for the row to be modified
32622	 *  @memberof DataTable#oApi
32623	 */
32624	function _fnRowAttributes( settings, row )
32625	{
32626		var tr = row.nTr;
32627		var data = row._aData;
32628	
32629		if ( tr ) {
32630			var id = settings.rowIdFn( data );
32631	
32632			if ( id ) {
32633				tr.id = id;
32634			}
32635	
32636			if ( data.DT_RowClass ) {
32637				// Remove any classes added by DT_RowClass before
32638				var a = data.DT_RowClass.split(' ');
32639				row.__rowc = row.__rowc ?
32640					_unique( row.__rowc.concat( a ) ) :
32641					a;
32642	
32643				$(tr)
32644					.removeClass( row.__rowc.join(' ') )
32645					.addClass( data.DT_RowClass );
32646			}
32647	
32648			if ( data.DT_RowAttr ) {
32649				$(tr).attr( data.DT_RowAttr );
32650			}
32651	
32652			if ( data.DT_RowData ) {
32653				$(tr).data( data.DT_RowData );
32654			}
32655		}
32656	}
32657	
32658	
32659	/**
32660	 * Create the HTML header for the table
32661	 *  @param {object} oSettings dataTables settings object
32662	 *  @memberof DataTable#oApi
32663	 */
32664	function _fnBuildHead( oSettings )
32665	{
32666		var i, ien, cell, row, column;
32667		var thead = oSettings.nTHead;
32668		var tfoot = oSettings.nTFoot;
32669		var createHeader = $('th, td', thead).length === 0;
32670		var classes = oSettings.oClasses;
32671		var columns = oSettings.aoColumns;
32672	
32673		if ( createHeader ) {
32674			row = $('<tr/>').appendTo( thead );
32675		}
32676	
32677		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
32678			column = columns[i];
32679			cell = $( column.nTh ).addClass( column.sClass );
32680	
32681			if ( createHeader ) {
32682				cell.appendTo( row );
32683			}
32684	
32685			// 1.11 move into sorting
32686			if ( oSettings.oFeatures.bSort ) {
32687				cell.addClass( column.sSortingClass );
32688	
32689				if ( column.bSortable !== false ) {
32690					cell
32691						.attr( 'tabindex', oSettings.iTabIndex )
32692						.attr( 'aria-controls', oSettings.sTableId );
32693	
32694					_fnSortAttachListener( oSettings, column.nTh, i );
32695				}
32696			}
32697	
32698			if ( column.sTitle != cell[0].innerHTML ) {
32699				cell.html( column.sTitle );
32700			}
32701	
32702			_fnRenderer( oSettings, 'header' )(
32703				oSettings, cell, column, classes
32704			);
32705		}
32706	
32707		if ( createHeader ) {
32708			_fnDetectHeader( oSettings.aoHeader, thead );
32709		}
32710		
32711		/* ARIA role for the rows */
32712	 	$(thead).find('>tr').attr('role', 'row');
32713	
32714		/* Deal with the footer - add classes if required */
32715		$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
32716		$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
32717	
32718		// Cache the footer cells. Note that we only take the cells from the first
32719		// row in the footer. If there is more than one row the user wants to
32720		// interact with, they need to use the table().foot() method. Note also this
32721		// allows cells to be used for multiple columns using colspan
32722		if ( tfoot !== null ) {
32723			var cells = oSettings.aoFooter[0];
32724	
32725			for ( i=0, ien=cells.length ; i<ien ; i++ ) {
32726				column = columns[i];
32727				column.nTf = cells[i].cell;
32728	
32729				if ( column.sClass ) {
32730					$(column.nTf).addClass( column.sClass );
32731				}
32732			}
32733		}
32734	}
32735	
32736	
32737	/**
32738	 * Draw the header (or footer) element based on the column visibility states. The
32739	 * methodology here is to use the layout array from _fnDetectHeader, modified for
32740	 * the instantaneous column visibility, to construct the new layout. The grid is
32741	 * traversed over cell at a time in a rows x columns grid fashion, although each
32742	 * cell insert can cover multiple elements in the grid - which is tracks using the
32743	 * aApplied array. Cell inserts in the grid will only occur where there isn't
32744	 * already a cell in that position.
32745	 *  @param {object} oSettings dataTables settings object
32746	 *  @param array {objects} aoSource Layout array from _fnDetectHeader
32747	 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
32748	 *  @memberof DataTable#oApi
32749	 */
32750	function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
32751	{
32752		var i, iLen, j, jLen, k, kLen, n, nLocalTr;
32753		var aoLocal = [];
32754		var aApplied = [];
32755		var iColumns = oSettings.aoColumns.length;
32756		var iRowspan, iColspan;
32757	
32758		if ( ! aoSource )
32759		{
32760			return;
32761		}
32762	
32763		if (  bIncludeHidden === undefined )
32764		{
32765			bIncludeHidden = false;
32766		}
32767	
32768		/* Make a copy of the master layout array, but without the visible columns in it */
32769		for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
32770		{
32771			aoLocal[i] = aoSource[i].slice();
32772			aoLocal[i].nTr = aoSource[i].nTr;
32773	
32774			/* Remove any columns which are currently hidden */
32775			for ( j=iColumns-1 ; j>=0 ; j-- )
32776			{
32777				if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
32778				{
32779					aoLocal[i].splice( j, 1 );
32780				}
32781			}
32782	
32783			/* Prep the applied array - it needs an element for each row */
32784			aApplied.push( [] );
32785		}
32786	
32787		for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
32788		{
32789			nLocalTr = aoLocal[i].nTr;
32790	
32791			/* All cells are going to be replaced, so empty out the row */
32792			if ( nLocalTr )
32793			{
32794				while( (n = nLocalTr.firstChild) )
32795				{
32796					nLocalTr.removeChild( n );
32797				}
32798			}
32799	
32800			for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
32801			{
32802				iRowspan = 1;
32803				iColspan = 1;
32804	
32805				/* Check to see if there is already a cell (row/colspan) covering our target
32806				 * insert point. If there is, then there is nothing to do.
32807				 */
32808				if ( aApplied[i][j] === undefined )
32809				{
32810					nLocalTr.appendChild( aoLocal[i][j].cell );
32811					aApplied[i][j] = 1;
32812	
32813					/* Expand the cell to cover as many rows as needed */
32814					while ( aoLocal[i+iRowspan] !== undefined &&
32815					        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
32816					{
32817						aApplied[i+iRowspan][j] = 1;
32818						iRowspan++;
32819					}
32820	
32821					/* Expand the cell to cover as many columns as needed */
32822					while ( aoLocal[i][j+iColspan] !== undefined &&
32823					        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
32824					{
32825						/* Must update the applied array over the rows for the columns */
32826						for ( k=0 ; k<iRowspan ; k++ )
32827						{
32828							aApplied[i+k][j+iColspan] = 1;
32829						}
32830						iColspan++;
32831					}
32832	
32833					/* Do the actual expansion in the DOM */
32834					$(aoLocal[i][j].cell)
32835						.attr('rowspan', iRowspan)
32836						.attr('colspan', iColspan);
32837				}
32838			}
32839		}
32840	}
32841	
32842	
32843	/**
32844	 * Insert the required TR nodes into the table for display
32845	 *  @param {object} oSettings dataTables settings object
32846	 *  @memberof DataTable#oApi
32847	 */
32848	function _fnDraw( oSettings )
32849	{
32850		/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
32851		var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
32852		if ( $.inArray( false, aPreDraw ) !== -1 )
32853		{
32854			_fnProcessingDisplay( oSettings, false );
32855			return;
32856		}
32857	
32858		var i, iLen, n;
32859		var anRows = [];
32860		var iRowCount = 0;
32861		var asStripeClasses = oSettings.asStripeClasses;
32862		var iStripes = asStripeClasses.length;
32863		var iOpenRows = oSettings.aoOpenRows.length;
32864		var oLang = oSettings.oLanguage;
32865		var iInitDisplayStart = oSettings.iInitDisplayStart;
32866		var bServerSide = _fnDataSource( oSettings ) == 'ssp';
32867		var aiDisplay = oSettings.aiDisplay;
32868	
32869		oSettings.bDrawing = true;
32870	
32871		/* Check and see if we have an initial draw position from state saving */
32872		if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
32873		{
32874			oSettings._iDisplayStart = bServerSide ?
32875				iInitDisplayStart :
32876				iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
32877					0 :
32878					iInitDisplayStart;
32879	
32880			oSettings.iInitDisplayStart = -1;
32881		}
32882	
32883		var iDisplayStart = oSettings._iDisplayStart;
32884		var iDisplayEnd = oSettings.fnDisplayEnd();
32885	
32886		/* Server-side processing draw intercept */
32887		if ( oSettings.bDeferLoading )
32888		{
32889			oSettings.bDeferLoading = false;
32890			oSettings.iDraw++;
32891			_fnProcessingDisplay( oSettings, false );
32892		}
32893		else if ( !bServerSide )
32894		{
32895			oSettings.iDraw++;
32896		}
32897		else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
32898		{
32899			return;
32900		}
32901	
32902		if ( aiDisplay.length !== 0 )
32903		{
32904			var iStart = bServerSide ? 0 : iDisplayStart;
32905			var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
32906	
32907			for ( var j=iStart ; j<iEnd ; j++ )
32908			{
32909				var iDataIndex = aiDisplay[j];
32910				var aoData = oSettings.aoData[ iDataIndex ];
32911				if ( aoData.nTr === null )
32912				{
32913					_fnCreateTr( oSettings, iDataIndex );
32914				}
32915	
32916				var nRow = aoData.nTr;
32917	
32918				/* Remove the old striping classes and then add the new one */
32919				if ( iStripes !== 0 )
32920				{
32921					var sStripe = asStripeClasses[ iRowCount % iStripes ];
32922					if ( aoData._sRowStripe != sStripe )
32923					{
32924						$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
32925						aoData._sRowStripe = sStripe;
32926					}
32927				}
32928	
32929				// Row callback functions - might want to manipulate the row
32930				// iRowCount and j are not currently documented. Are they at all
32931				// useful?
32932				_fnCallbackFire( oSettings, 'aoRowCallback', null,
32933					[nRow, aoData._aData, iRowCount, j] );
32934	
32935				anRows.push( nRow );
32936				iRowCount++;
32937			}
32938		}
32939		else
32940		{
32941			/* Table is empty - create a row with an empty message in it */
32942			var sZero = oLang.sZeroRecords;
32943			if ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )
32944			{
32945				sZero = oLang.sLoadingRecords;
32946			}
32947			else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
32948			{
32949				sZero = oLang.sEmptyTable;
32950			}
32951	
32952			anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
32953				.append( $('<td />', {
32954					'valign':  'top',
32955					'colSpan': _fnVisbleColumns( oSettings ),
32956					'class':   oSettings.oClasses.sRowEmpty
32957				} ).html( sZero ) )[0];
32958		}
32959	
32960		/* Header and footer callbacks */
32961		_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
32962			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
32963	
32964		_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
32965			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
32966	
32967		var body = $(oSettings.nTBody);
32968	
32969		body.children().detach();
32970		body.append( $(anRows) );
32971	
32972		/* Call all required callback functions for the end of a draw */
32973		_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
32974	
32975		/* Draw is complete, sorting and filtering must be as well */
32976		oSettings.bSorted = false;
32977		oSettings.bFiltered = false;
32978		oSettings.bDrawing = false;
32979	}
32980	
32981	
32982	/**
32983	 * Redraw the table - taking account of the various features which are enabled
32984	 *  @param {object} oSettings dataTables settings object
32985	 *  @param {boolean} [holdPosition] Keep the current paging position. By default
32986	 *    the paging is reset to the first page
32987	 *  @memberof DataTable#oApi
32988	 */
32989	function _fnReDraw( settings, holdPosition )
32990	{
32991		var
32992			features = settings.oFeatures,
32993			sort     = features.bSort,
32994			filter   = features.bFilter;
32995	
32996		if ( sort ) {
32997			_fnSort( settings );
32998		}
32999	
33000		if ( filter ) {
33001			_fnFilterComplete( settings, settings.oPreviousSearch );
33002		}
33003		else {
33004			// No filtering, so we want to just use the display master
33005			settings.aiDisplay = settings.aiDisplayMaster.slice();
33006		}
33007	
33008		if ( holdPosition !== true ) {
33009			settings._iDisplayStart = 0;
33010		}
33011	
33012		// Let any modules know about the draw hold position state (used by
33013		// scrolling internally)
33014		settings._drawHold = holdPosition;
33015	
33016		_fnDraw( settings );
33017	
33018		settings._drawHold = false;
33019	}
33020	
33021	
33022	/**
33023	 * Add the options to the page HTML for the table
33024	 *  @param {object} oSettings dataTables settings object
33025	 *  @memberof DataTable#oApi
33026	 */
33027	function _fnAddOptionsHtml ( oSettings )
33028	{
33029		var classes = oSettings.oClasses;
33030		var table = $(oSettings.nTable);
33031		var holding = $('<div/>').insertBefore( table ); // Holding element for speed
33032		var features = oSettings.oFeatures;
33033	
33034		// All DataTables are wrapped in a div
33035		var insert = $('<div/>', {
33036			id:      oSettings.sTableId+'_wrapper',
33037			'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
33038		} );
33039	
33040		oSettings.nHolding = holding[0];
33041		oSettings.nTableWrapper = insert[0];
33042		oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
33043	
33044		/* Loop over the user set positioning and place the elements as needed */
33045		var aDom = oSettings.sDom.split('');
33046		var featureNode, cOption, nNewNode, cNext, sAttr, j;
33047		for ( var i=0 ; i<aDom.length ; i++ )
33048		{
33049			featureNode = null;
33050			cOption = aDom[i];
33051	
33052			if ( cOption == '<' )
33053			{
33054				/* New container div */
33055				nNewNode = $('<div/>')[0];
33056	
33057				/* Check to see if we should append an id and/or a class name to the container */
33058				cNext = aDom[i+1];
33059				if ( cNext == "'" || cNext == '"' )
33060				{
33061					sAttr = "";
33062					j = 2;
33063					while ( aDom[i+j] != cNext )
33064					{
33065						sAttr += aDom[i+j];
33066						j++;
33067					}
33068	
33069					/* Replace jQuery UI constants @todo depreciated */
33070					if ( sAttr == "H" )
33071					{
33072						sAttr = classes.sJUIHeader;
33073					}
33074					else if ( sAttr == "F" )
33075					{
33076						sAttr = classes.sJUIFooter;
33077					}
33078	
33079					/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
33080					 * breaks the string into parts and applies them as needed
33081					 */
33082					if ( sAttr.indexOf('.') != -1 )
33083					{
33084						var aSplit = sAttr.split('.');
33085						nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
33086						nNewNode.className = aSplit[1];
33087					}
33088					else if ( sAttr.charAt(0) == "#" )
33089					{
33090						nNewNode.id = sAttr.substr(1, sAttr.length-1);
33091					}
33092					else
33093					{
33094						nNewNode.className = sAttr;
33095					}
33096	
33097					i += j; /* Move along the position array */
33098				}
33099	
33100				insert.append( nNewNode );
33101				insert = $(nNewNode);
33102			}
33103			else if ( cOption == '>' )
33104			{
33105				/* End container div */
33106				insert = insert.parent();
33107			}
33108			// @todo Move options into their own plugins?
33109			else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
33110			{
33111				/* Length */
33112				featureNode = _fnFeatureHtmlLength( oSettings );
33113			}
33114			else if ( cOption == 'f' && features.bFilter )
33115			{
33116				/* Filter */
33117				featureNode = _fnFeatureHtmlFilter( oSettings );
33118			}
33119			else if ( cOption == 'r' && features.bProcessing )
33120			{
33121				/* pRocessing */
33122				featureNode = _fnFeatureHtmlProcessing( oSettings );
33123			}
33124			else if ( cOption == 't' )
33125			{
33126				/* Table */
33127				featureNode = _fnFeatureHtmlTable( oSettings );
33128			}
33129			else if ( cOption ==  'i' && features.bInfo )
33130			{
33131				/* Info */
33132				featureNode = _fnFeatureHtmlInfo( oSettings );
33133			}
33134			else if ( cOption == 'p' && features.bPaginate )
33135			{
33136				/* Pagination */
33137				featureNode = _fnFeatureHtmlPaginate( oSettings );
33138			}
33139			else if ( DataTable.ext.feature.length !== 0 )
33140			{
33141				/* Plug-in features */
33142				var aoFeatures = DataTable.ext.feature;
33143				for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
33144				{
33145					if ( cOption == aoFeatures[k].cFeature )
33146					{
33147						featureNode = aoFeatures[k].fnInit( oSettings );
33148						break;
33149					}
33150				}
33151			}
33152	
33153			/* Add to the 2D features array */
33154			if ( featureNode )
33155			{
33156				var aanFeatures = oSettings.aanFeatures;
33157	
33158				if ( ! aanFeatures[cOption] )
33159				{
33160					aanFeatures[cOption] = [];
33161				}
33162	
33163				aanFeatures[cOption].push( featureNode );
33164				insert.append( featureNode );
33165			}
33166		}
33167	
33168		/* Built our DOM structure - replace the holding div with what we want */
33169		holding.replaceWith( insert );
33170		oSettings.nHolding = null;
33171	}
33172	
33173	
33174	/**
33175	 * Use the DOM source to create up an array of header cells. The idea here is to
33176	 * create a layout grid (array) of rows x columns, which contains a reference
33177	 * to the cell that that point in the grid (regardless of col/rowspan), such that
33178	 * any column / row could be removed and the new grid constructed
33179	 *  @param array {object} aLayout Array to store the calculated layout in
33180	 *  @param {node} nThead The header/footer element for the table
33181	 *  @memberof DataTable#oApi
33182	 */
33183	function _fnDetectHeader ( aLayout, nThead )
33184	{
33185		var nTrs = $(nThead).children('tr');
33186		var nTr, nCell;
33187		var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
33188		var bUnique;
33189		var fnShiftCol = function ( a, i, j ) {
33190			var k = a[i];
33191	                while ( k[j] ) {
33192				j++;
33193			}
33194			return j;
33195		};
33196	
33197		aLayout.splice( 0, aLayout.length );
33198	
33199		/* We know how many rows there are in the layout - so prep it */
33200		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
33201		{
33202			aLayout.push( [] );
33203		}
33204	
33205		/* Calculate a layout array */
33206		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
33207		{
33208			nTr = nTrs[i];
33209			iColumn = 0;
33210	
33211			/* For every cell in the row... */
33212			nCell = nTr.firstChild;
33213			while ( nCell ) {
33214				if ( nCell.nodeName.toUpperCase() == "TD" ||
33215				     nCell.nodeName.toUpperCase() == "TH" )
33216				{
33217					/* Get the col and rowspan attributes from the DOM and sanitise them */
33218					iColspan = nCell.getAttribute('colspan') * 1;
33219					iRowspan = nCell.getAttribute('rowspan') * 1;
33220					iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
33221					iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
33222	
33223					/* There might be colspan cells already in this row, so shift our target
33224					 * accordingly
33225					 */
33226					iColShifted = fnShiftCol( aLayout, i, iColumn );
33227	
33228					/* Cache calculation for unique columns */
33229					bUnique = iColspan === 1 ? true : false;
33230	
33231					/* If there is col / rowspan, copy the information into the layout grid */
33232					for ( l=0 ; l<iColspan ; l++ )
33233					{
33234						for ( k=0 ; k<iRowspan ; k++ )
33235						{
33236							aLayout[i+k][iColShifted+l] = {
33237								"cell": nCell,
33238								"unique": bUnique
33239							};
33240							aLayout[i+k].nTr = nTr;
33241						}
33242					}
33243				}
33244				nCell = nCell.nextSibling;
33245			}
33246		}
33247	}
33248	
33249	
33250	/**
33251	 * Get an array of unique th elements, one for each column
33252	 *  @param {object} oSettings dataTables settings object
33253	 *  @param {node} nHeader automatically detect the layout from this node - optional
33254	 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
33255	 *  @returns array {node} aReturn list of unique th's
33256	 *  @memberof DataTable#oApi
33257	 */
33258	function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
33259	{
33260		var aReturn = [];
33261		if ( !aLayout )
33262		{
33263			aLayout = oSettings.aoHeader;
33264			if ( nHeader )
33265			{
33266				aLayout = [];
33267				_fnDetectHeader( aLayout, nHeader );
33268			}
33269		}
33270	
33271		for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
33272		{
33273			for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
33274			{
33275				if ( aLayout[i][j].unique &&
33276					 (!aReturn[j] || !oSettings.bSortCellsTop) )
33277				{
33278					aReturn[j] = aLayout[i][j].cell;
33279				}
33280			}
33281		}
33282	
33283		return aReturn;
33284	}
33285	
33286	/**
33287	 * Create an Ajax call based on the table's settings, taking into account that
33288	 * parameters can have multiple forms, and backwards compatibility.
33289	 *
33290	 * @param {object} oSettings dataTables settings object
33291	 * @param {array} data Data to send to the server, required by
33292	 *     DataTables - may be augmented by developer callbacks
33293	 * @param {function} fn Callback function to run when data is obtained
33294	 */
33295	function _fnBuildAjax( oSettings, data, fn )
33296	{
33297		// Compatibility with 1.9-, allow fnServerData and event to manipulate
33298		_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
33299	
33300		// Convert to object based for 1.10+ if using the old array scheme which can
33301		// come from server-side processing or serverParams
33302		if ( data && $.isArray(data) ) {
33303			var tmp = {};
33304			var rbracket = /(.*?)\[\]$/;
33305	
33306			$.each( data, function (key, val) {
33307				var match = val.name.match(rbracket);
33308	
33309				if ( match ) {
33310					// Support for arrays
33311					var name = match[0];
33312	
33313					if ( ! tmp[ name ] ) {
33314						tmp[ name ] = [];
33315					}
33316					tmp[ name ].push( val.value );
33317				}
33318				else {
33319					tmp[val.name] = val.value;
33320				}
33321			} );
33322			data = tmp;
33323		}
33324	
33325		var ajaxData;
33326		var ajax = oSettings.ajax;
33327		var instance = oSettings.oInstance;
33328		var callback = function ( json ) {
33329			_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
33330			fn( json );
33331		};
33332	
33333		if ( $.isPlainObject( ajax ) && ajax.data )
33334		{
33335			ajaxData = ajax.data;
33336	
33337			var newData = $.isFunction( ajaxData ) ?
33338				ajaxData( data, oSettings ) :  // fn can manipulate data or return
33339				ajaxData;                      // an object object or array to merge
33340	
33341			// If the function returned something, use that alone
33342			data = $.isFunction( ajaxData ) && newData ?
33343				newData :
33344				$.extend( true, data, newData );
33345	
33346			// Remove the data property as we've resolved it already and don't want
33347			// jQuery to do it again (it is restored at the end of the function)
33348			delete ajax.data;
33349		}
33350	
33351		var baseAjax = {
33352			"data": data,
33353			"success": function (json) {
33354				var error = json.error || json.sError;
33355				if ( error ) {
33356					_fnLog( oSettings, 0, error );
33357				}
33358	
33359				oSettings.json = json;
33360				callback( json );
33361			},
33362			"dataType": "json",
33363			"cache": false,
33364			"type": oSettings.sServerMethod,
33365			"error": function (xhr, error, thrown) {
33366				var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );
33367	
33368				if ( $.inArray( true, ret ) === -1 ) {
33369					if ( error == "parsererror" ) {
33370						_fnLog( oSettings, 0, 'Invalid JSON response', 1 );
33371					}
33372					else if ( xhr.readyState === 4 ) {
33373						_fnLog( oSettings, 0, 'Ajax error', 7 );
33374					}
33375				}
33376	
33377				_fnProcessingDisplay( oSettings, false );
33378			}
33379		};
33380	
33381		// Store the data submitted for the API
33382		oSettings.oAjaxData = data;
33383	
33384		// Allow plug-ins and external processes to modify the data
33385		_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );
33386	
33387		if ( oSettings.fnServerData )
33388		{
33389			// DataTables 1.9- compatibility
33390			oSettings.fnServerData.call( instance,
33391				oSettings.sAjaxSource,
33392				$.map( data, function (val, key) { // Need to convert back to 1.9 trad format
33393					return { name: key, value: val };
33394				} ),
33395				callback,
33396				oSettings
33397			);
33398		}
33399		else if ( oSettings.sAjaxSource || typeof ajax === 'string' )
33400		{
33401			// DataTables 1.9- compatibility
33402			oSettings.jqXHR = $.ajax( $.extend( baseAjax, {
33403				url: ajax || oSettings.sAjaxSource
33404			} ) );
33405		}
33406		else if ( $.isFunction( ajax ) )
33407		{
33408			// Is a function - let the caller define what needs to be done
33409			oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
33410		}
33411		else
33412		{
33413			// Object to extend the base settings
33414			oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );
33415	
33416			// Restore for next time around
33417			ajax.data = ajaxData;
33418		}
33419	}
33420	
33421	
33422	/**
33423	 * Update the table using an Ajax call
33424	 *  @param {object} settings dataTables settings object
33425	 *  @returns {boolean} Block the table drawing or not
33426	 *  @memberof DataTable#oApi
33427	 */
33428	function _fnAjaxUpdate( settings )
33429	{
33430		if ( settings.bAjaxDataGet ) {
33431			settings.iDraw++;
33432			_fnProcessingDisplay( settings, true );
33433	
33434			_fnBuildAjax(
33435				settings,
33436				_fnAjaxParameters( settings ),
33437				function(json) {
33438					_fnAjaxUpdateDraw( settings, json );
33439				}
33440			);
33441	
33442			return false;
33443		}
33444		return true;
33445	}
33446	
33447	
33448	/**
33449	 * Build up the parameters in an object needed for a server-side processing
33450	 * request. Note that this is basically done twice, is different ways - a modern
33451	 * method which is used by default in DataTables 1.10 which uses objects and
33452	 * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
33453	 * the sAjaxSource option is used in the initialisation, or the legacyAjax
33454	 * option is set.
33455	 *  @param {object} oSettings dataTables settings object
33456	 *  @returns {bool} block the table drawing or not
33457	 *  @memberof DataTable#oApi
33458	 */
33459	function _fnAjaxParameters( settings )
33460	{
33461		var
33462			columns = settings.aoColumns,
33463			columnCount = columns.length,
33464			features = settings.oFeatures,
33465			preSearch = settings.oPreviousSearch,
33466			preColSearch = settings.aoPreSearchCols,
33467			i, data = [], dataProp, column, columnSearch,
33468			sort = _fnSortFlatten( settings ),
33469			displayStart = settings._iDisplayStart,
33470			displayLength = features.bPaginate !== false ?
33471				settings._iDisplayLength :
33472				-1;
33473	
33474		var param = function ( name, value ) {
33475			data.push( { 'name': name, 'value': value } );
33476		};
33477	
33478		// DataTables 1.9- compatible method
33479		param( 'sEcho',          settings.iDraw );
33480		param( 'iColumns',       columnCount );
33481		param( 'sColumns',       _pluck( columns, 'sName' ).join(',') );
33482		param( 'iDisplayStart',  displayStart );
33483		param( 'iDisplayLength', displayLength );
33484	
33485		// DataTables 1.10+ method
33486		var d = {
33487			draw:    settings.iDraw,
33488			columns: [],
33489			order:   [],
33490			start:   displayStart,
33491			length:  displayLength,
33492			search:  {
33493				value: preSearch.sSearch,
33494				regex: preSearch.bRegex
33495			}
33496		};
33497	
33498		for ( i=0 ; i<columnCount ; i++ ) {
33499			column = columns[i];
33500			columnSearch = preColSearch[i];
33501			dataProp = typeof column.mData=="function" ? 'function' : column.mData ;
33502	
33503			d.columns.push( {
33504				data:       dataProp,
33505				name:       column.sName,
33506				searchable: column.bSearchable,
33507				orderable:  column.bSortable,
33508				search:     {
33509					value: columnSearch.sSearch,
33510					regex: columnSearch.bRegex
33511				}
33512			} );
33513	
33514			param( "mDataProp_"+i, dataProp );
33515	
33516			if ( features.bFilter ) {
33517				param( 'sSearch_'+i,     columnSearch.sSearch );
33518				param( 'bRegex_'+i,      columnSearch.bRegex );
33519				param( 'bSearchable_'+i, column.bSearchable );
33520			}
33521	
33522			if ( features.bSort ) {
33523				param( 'bSortable_'+i, column.bSortable );
33524			}
33525		}
33526	
33527		if ( features.bFilter ) {
33528			param( 'sSearch', preSearch.sSearch );
33529			param( 'bRegex', preSearch.bRegex );
33530		}
33531	
33532		if ( features.bSort ) {
33533			$.each( sort, function ( i, val ) {
33534				d.order.push( { column: val.col, dir: val.dir } );
33535	
33536				param( 'iSortCol_'+i, val.col );
33537				param( 'sSortDir_'+i, val.dir );
33538			} );
33539	
33540			param( 'iSortingCols', sort.length );
33541		}
33542	
33543		// If the legacy.ajax parameter is null, then we automatically decide which
33544		// form to use, based on sAjaxSource
33545		var legacy = DataTable.ext.legacy.ajax;
33546		if ( legacy === null ) {
33547			return settings.sAjaxSource ? data : d;
33548		}
33549	
33550		// Otherwise, if legacy has been specified then we use that to decide on the
33551		// form
33552		return legacy ? data : d;
33553	}
33554	
33555	
33556	/**
33557	 * Data the data from the server (nuking the old) and redraw the table
33558	 *  @param {object} oSettings dataTables settings object
33559	 *  @param {object} json json data return from the server.
33560	 *  @param {string} json.sEcho Tracking flag for DataTables to match requests
33561	 *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
33562	 *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
33563	 *  @param {array} json.aaData The data to display on this page
33564	 *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
33565	 *  @memberof DataTable#oApi
33566	 */
33567	function _fnAjaxUpdateDraw ( settings, json )
33568	{
33569		// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
33570		// Support both
33571		var compat = function ( old, modern ) {
33572			return json[old] !== undefined ? json[old] : json[modern];
33573		};
33574	
33575		var data = _fnAjaxDataSrc( settings, json );
33576		var draw            = compat( 'sEcho',                'draw' );
33577		var recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );
33578		var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );
33579	
33580		if ( draw ) {
33581			// Protect against out of sequence returns
33582			if ( draw*1 < settings.iDraw ) {
33583				return;
33584			}
33585			settings.iDraw = draw * 1;
33586		}
33587	
33588		_fnClearTable( settings );
33589		settings._iRecordsTotal   = parseInt(recordsTotal, 10);
33590		settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
33591	
33592		for ( var i=0, ien=data.length ; i<ien ; i++ ) {
33593			_fnAddData( settings, data[i] );
33594		}
33595		settings.aiDisplay = settings.aiDisplayMaster.slice();
33596	
33597		settings.bAjaxDataGet = false;
33598		_fnDraw( settings );
33599	
33600		if ( ! settings._bInitComplete ) {
33601			_fnInitComplete( settings, json );
33602		}
33603	
33604		settings.bAjaxDataGet = true;
33605		_fnProcessingDisplay( settings, false );
33606	}
33607	
33608	
33609	/**
33610	 * Get the data from the JSON data source to use for drawing a table. Using
33611	 * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
33612	 * source object, or from a processing function.
33613	 *  @param {object} oSettings dataTables settings object
33614	 *  @param  {object} json Data source object / array from the server
33615	 *  @return {array} Array of data to use
33616	 */
33617	function _fnAjaxDataSrc ( oSettings, json )
33618	{
33619		var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?
33620			oSettings.ajax.dataSrc :
33621			oSettings.sAjaxDataProp; // Compatibility with 1.9-.
33622	
33623		// Compatibility with 1.9-. In order to read from aaData, check if the
33624		// default has been changed, if not, check for aaData
33625		if ( dataSrc === 'data' ) {
33626			return json.aaData || json[dataSrc];
33627		}
33628	
33629		return dataSrc !== "" ?
33630			_fnGetObjectDataFn( dataSrc )( json ) :
33631			json;
33632	}
33633	
33634	/**
33635	 * Generate the node required for filtering text
33636	 *  @returns {node} Filter control element
33637	 *  @param {object} oSettings dataTables settings object
33638	 *  @memberof DataTable#oApi
33639	 */
33640	function _fnFeatureHtmlFilter ( settings )
33641	{
33642		var classes = settings.oClasses;
33643		var tableId = settings.sTableId;
33644		var language = settings.oLanguage;
33645		var previousSearch = settings.oPreviousSearch;
33646		var features = settings.aanFeatures;
33647		var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
33648	
33649		var str = language.sSearch;
33650		str = str.match(/_INPUT_/) ?
33651			str.replace('_INPUT_', input) :
33652			str+input;
33653	
33654		var filter = $('<div/>', {
33655				'id': ! features.f ? tableId+'_filter' : null,
33656				'class': classes.sFilter
33657			} )
33658			.append( $('<label/>' ).append( str ) );
33659	
33660		var searchFn = function() {
33661			/* Update all other filter input elements for the new display */
33662			var n = features.f;
33663			var val = !this.value ? "" : this.value; // mental IE8 fix :-(
33664	
33665			/* Now do the filter */
33666			if ( val != previousSearch.sSearch ) {
33667				_fnFilterComplete( settings, {
33668					"sSearch": val,
33669					"bRegex": previousSearch.bRegex,
33670					"bSmart": previousSearch.bSmart ,
33671					"bCaseInsensitive": previousSearch.bCaseInsensitive
33672				} );
33673	
33674				// Need to redraw, without resorting
33675				settings._iDisplayStart = 0;
33676				_fnDraw( settings );
33677			}
33678		};
33679	
33680		var searchDelay = settings.searchDelay !== null ?
33681			settings.searchDelay :
33682			_fnDataSource( settings ) === 'ssp' ?
33683				400 :
33684				0;
33685	
33686		var jqFilter = $('input', filter)
33687			.val( previousSearch.sSearch )
33688			.attr( 'placeholder', language.sSearchPlaceholder )
33689			.bind(
33690				'keyup.DT search.DT input.DT paste.DT cut.DT',
33691				searchDelay ?
33692					_fnThrottle( searchFn, searchDelay ) :
33693					searchFn
33694			)
33695			.bind( 'keypress.DT', function(e) {
33696				/* Prevent form submission */
33697				if ( e.keyCode == 13 ) {
33698					return false;
33699				}
33700			} )
33701			.attr('aria-controls', tableId);
33702	
33703		// Update the input elements whenever the table is filtered
33704		$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
33705			if ( settings === s ) {
33706				// IE9 throws an 'unknown error' if document.activeElement is used
33707				// inside an iframe or frame...
33708				try {
33709					if ( jqFilter[0] !== document.activeElement ) {
33710						jqFilter.val( previousSearch.sSearch );
33711					}
33712				}
33713				catch ( e ) {}
33714			}
33715		} );
33716	
33717		return filter[0];
33718	}
33719	
33720	
33721	/**
33722	 * Filter the table using both the global filter and column based filtering
33723	 *  @param {object} oSettings dataTables settings object
33724	 *  @param {object} oSearch search information
33725	 *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
33726	 *  @memberof DataTable#oApi
33727	 */
33728	function _fnFilterComplete ( oSettings, oInput, iForce )
33729	{
33730		var oPrevSearch = oSettings.oPreviousSearch;
33731		var aoPrevSearch = oSettings.aoPreSearchCols;
33732		var fnSaveFilter = function ( oFilter ) {
33733			/* Save the filtering values */
33734			oPrevSearch.sSearch = oFilter.sSearch;
33735			oPrevSearch.bRegex = oFilter.bRegex;
33736			oPrevSearch.bSmart = oFilter.bSmart;
33737			oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
33738		};
33739		var fnRegex = function ( o ) {
33740			// Backwards compatibility with the bEscapeRegex option
33741			return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
33742		};
33743	
33744		// Resolve any column types that are unknown due to addition or invalidation
33745		// @todo As per sort - can this be moved into an event handler?
33746		_fnColumnTypes( oSettings );
33747	
33748		/* In server-side processing all filtering is done by the server, so no point hanging around here */
33749		if ( _fnDataSource( oSettings ) != 'ssp' )
33750		{
33751			/* Global filter */
33752			_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
33753			fnSaveFilter( oInput );
33754	
33755			/* Now do the individual column filter */
33756			for ( var i=0 ; i<aoPrevSearch.length ; i++ )
33757			{
33758				_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
33759					aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
33760			}
33761	
33762			/* Custom filtering */
33763			_fnFilterCustom( oSettings );
33764		}
33765		else
33766		{
33767			fnSaveFilter( oInput );
33768		}
33769	
33770		/* Tell the draw function we have been filtering */
33771		oSettings.bFiltered = true;
33772		_fnCallbackFire( oSettings, null, 'search', [oSettings] );
33773	}
33774	
33775	
33776	/**
33777	 * Apply custom filtering functions
33778	 *  @param {object} oSettings dataTables settings object
33779	 *  @memberof DataTable#oApi
33780	 */
33781	function _fnFilterCustom( settings )
33782	{
33783		var filters = DataTable.ext.search;
33784		var displayRows = settings.aiDisplay;
33785		var row, rowIdx;
33786	
33787		for ( var i=0, ien=filters.length ; i<ien ; i++ ) {
33788			var rows = [];
33789	
33790			// Loop over each row and see if it should be included
33791			for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {
33792				rowIdx = displayRows[ j ];
33793				row = settings.aoData[ rowIdx ];
33794	
33795				if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {
33796					rows.push( rowIdx );
33797				}
33798			}
33799	
33800			// So the array reference doesn't break set the results into the
33801			// existing array
33802			displayRows.length = 0;
33803			$.merge( displayRows, rows );
33804		}
33805	}
33806	
33807	
33808	/**
33809	 * Filter the table on a per-column basis
33810	 *  @param {object} oSettings dataTables settings object
33811	 *  @param {string} sInput string to filter on
33812	 *  @param {int} iColumn column to filter
33813	 *  @param {bool} bRegex treat search string as a regular expression or not
33814	 *  @param {bool} bSmart use smart filtering or not
33815	 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
33816	 *  @memberof DataTable#oApi
33817	 */
33818	function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )
33819	{
33820		if ( searchStr === '' ) {
33821			return;
33822		}
33823	
33824		var data;
33825		var display = settings.aiDisplay;
33826		var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );
33827	
33828		for ( var i=display.length-1 ; i>=0 ; i-- ) {
33829			data = settings.aoData[ display[i] ]._aFilterData[ colIdx ];
33830	
33831			if ( ! rpSearch.test( data ) ) {
33832				display.splice( i, 1 );
33833			}
33834		}
33835	}
33836	
33837	
33838	/**
33839	 * Filter the data table based on user input and draw the table
33840	 *  @param {object} settings dataTables settings object
33841	 *  @param {string} input string to filter on
33842	 *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)
33843	 *  @param {bool} regex treat as a regular expression or not
33844	 *  @param {bool} smart perform smart filtering or not
33845	 *  @param {bool} caseInsensitive Do case insenstive matching or not
33846	 *  @memberof DataTable#oApi
33847	 */
33848	function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
33849	{
33850		var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );
33851		var prevSearch = settings.oPreviousSearch.sSearch;
33852		var displayMaster = settings.aiDisplayMaster;
33853		var display, invalidated, i;
33854	
33855		// Need to take account of custom filtering functions - always filter
33856		if ( DataTable.ext.search.length !== 0 ) {
33857			force = true;
33858		}
33859	
33860		// Check if any of the rows were invalidated
33861		invalidated = _fnFilterData( settings );
33862	
33863		// If the input is blank - we just want the full data set
33864		if ( input.length <= 0 ) {
33865			settings.aiDisplay = displayMaster.slice();
33866		}
33867		else {
33868			// New search - start from the master array
33869			if ( invalidated ||
33870				 force ||
33871				 prevSearch.length > input.length ||
33872				 input.indexOf(prevSearch) !== 0 ||
33873				 settings.bSorted // On resort, the display master needs to be
33874				                  // re-filtered since indexes will have changed
33875			) {
33876				settings.aiDisplay = displayMaster.slice();
33877			}
33878	
33879			// Search the display array
33880			display = settings.aiDisplay;
33881	
33882			for ( i=display.length-1 ; i>=0 ; i-- ) {
33883				if ( ! rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {
33884					display.splice( i, 1 );
33885				}
33886			}
33887		}
33888	}
33889	
33890	
33891	/**
33892	 * Build a regular expression object suitable for searching a table
33893	 *  @param {string} sSearch string to search for
33894	 *  @param {bool} bRegex treat as a regular expression or not
33895	 *  @param {bool} bSmart perform smart filtering or not
33896	 *  @param {bool} bCaseInsensitive Do case insensitive matching or not
33897	 *  @returns {RegExp} constructed object
33898	 *  @memberof DataTable#oApi
33899	 */
33900	function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
33901	{
33902		search = regex ?
33903			search :
33904			_fnEscapeRegex( search );
33905		
33906		if ( smart ) {
33907			/* For smart filtering we want to allow the search to work regardless of
33908			 * word order. We also want double quoted text to be preserved, so word
33909			 * order is important - a la google. So this is what we want to
33910			 * generate:
33911			 * 
33912			 * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
33913			 */
33914			var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) {
33915				if ( word.charAt(0) === '"' ) {
33916					var m = word.match( /^"(.*)"$/ );
33917					word = m ? m[1] : word;
33918				}
33919	
33920				return word.replace('"', '');
33921			} );
33922	
33923			search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';
33924		}
33925	
33926		return new RegExp( search, caseInsensitive ? 'i' : '' );
33927	}
33928	
33929	
33930	/**
33931	 * Escape a string such that it can be used in a regular expression
33932	 *  @param {string} sVal string to escape
33933	 *  @returns {string} escaped string
33934	 *  @memberof DataTable#oApi
33935	 */
33936	function _fnEscapeRegex ( sVal )
33937	{
33938		return sVal.replace( _re_escape_regex, '\\$1' );
33939	}
33940	
33941	
33942	
33943	var __filter_div = $('<div>')[0];
33944	var __filter_div_textContent = __filter_div.textContent !== undefined;
33945	
33946	// Update the filtering data for each row if needed (by invalidation or first run)
33947	function _fnFilterData ( settings )
33948	{
33949		var columns = settings.aoColumns;
33950		var column;
33951		var i, j, ien, jen, filterData, cellData, row;
33952		var fomatters = DataTable.ext.type.search;
33953		var wasInvalidated = false;
33954	
33955		for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
33956			row = settings.aoData[i];
33957	
33958			if ( ! row._aFilterData ) {
33959				filterData = [];
33960	
33961				for ( j=0, jen=columns.length ; j<jen ; j++ ) {
33962					column = columns[j];
33963	
33964					if ( column.bSearchable ) {
33965						cellData = _fnGetCellData( settings, i, j, 'filter' );
33966	
33967						if ( fomatters[ column.sType ] ) {
33968							cellData = fomatters[ column.sType ]( cellData );
33969						}
33970	
33971						// Search in DataTables 1.10 is string based. In 1.11 this
33972						// should be altered to also allow strict type checking.
33973						if ( cellData === null ) {
33974							cellData = '';
33975						}
33976	
33977						if ( typeof cellData !== 'string' && cellData.toString ) {
33978							cellData = cellData.toString();
33979						}
33980					}
33981					else {
33982						cellData = '';
33983					}
33984	
33985					// If it looks like there is an HTML entity in the string,
33986					// attempt to decode it so sorting works as expected. Note that
33987					// we could use a single line of jQuery to do this, but the DOM
33988					// method used here is much faster http://jsperf.com/html-decode
33989					if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
33990						__filter_div.innerHTML = cellData;
33991						cellData = __filter_div_textContent ?
33992							__filter_div.textContent :
33993							__filter_div.innerText;
33994					}
33995	
33996					if ( cellData.replace ) {
33997						cellData = cellData.replace(/[\r\n]/g, '');
33998					}
33999	
34000					filterData.push( cellData );
34001				}
34002	
34003				row._aFilterData = filterData;
34004				row._sFilterRow = filterData.join('  ');
34005				wasInvalidated = true;
34006			}
34007		}
34008	
34009		return wasInvalidated;
34010	}
34011	
34012	
34013	/**
34014	 * Convert from the internal Hungarian notation to camelCase for external
34015	 * interaction
34016	 *  @param {object} obj Object to convert
34017	 *  @returns {object} Inverted object
34018	 *  @memberof DataTable#oApi
34019	 */
34020	function _fnSearchToCamel ( obj )
34021	{
34022		return {
34023			search:          obj.sSearch,
34024			smart:           obj.bSmart,
34025			regex:           obj.bRegex,
34026			caseInsensitive: obj.bCaseInsensitive
34027		};
34028	}
34029	
34030	
34031	
34032	/**
34033	 * Convert from camelCase notation to the internal Hungarian. We could use the
34034	 * Hungarian convert function here, but this is cleaner
34035	 *  @param {object} obj Object to convert
34036	 *  @returns {object} Inverted object
34037	 *  @memberof DataTable#oApi
34038	 */
34039	function _fnSearchToHung ( obj )
34040	{
34041		return {
34042			sSearch:          obj.search,
34043			bSmart:           obj.smart,
34044			bRegex:           obj.regex,
34045			bCaseInsensitive: obj.caseInsensitive
34046		};
34047	}
34048	
34049	/**
34050	 * Generate the node required for the info display
34051	 *  @param {object} oSettings dataTables settings object
34052	 *  @returns {node} Information element
34053	 *  @memberof DataTable#oApi
34054	 */
34055	function _fnFeatureHtmlInfo ( settings )
34056	{
34057		var
34058			tid = settings.sTableId,
34059			nodes = settings.aanFeatures.i,
34060			n = $('<div/>', {
34061				'class': settings.oClasses.sInfo,
34062				'id': ! nodes ? tid+'_info' : null
34063			} );
34064	
34065		if ( ! nodes ) {
34066			// Update display on each draw
34067			settings.aoDrawCallback.push( {
34068				"fn": _fnUpdateInfo,
34069				"sName": "information"
34070			} );
34071	
34072			n
34073				.attr( 'role', 'status' )
34074				.attr( 'aria-live', 'polite' );
34075	
34076			// Table is described by our info div
34077			$(settings.nTable).attr( 'aria-describedby', tid+'_info' );
34078		}
34079	
34080		return n[0];
34081	}
34082	
34083	
34084	/**
34085	 * Update the information elements in the display
34086	 *  @param {object} settings dataTables settings object
34087	 *  @memberof DataTable#oApi
34088	 */
34089	function _fnUpdateInfo ( settings )
34090	{
34091		/* Show information about the table */
34092		var nodes = settings.aanFeatures.i;
34093		if ( nodes.length === 0 ) {
34094			return;
34095		}
34096	
34097		var
34098			lang  = settings.oLanguage,
34099			start = settings._iDisplayStart+1,
34100			end   = settings.fnDisplayEnd(),
34101			max   = settings.fnRecordsTotal(),
34102			total = settings.fnRecordsDisplay(),
34103			out   = total ?
34104				lang.sInfo :
34105				lang.sInfoEmpty;
34106	
34107		if ( total !== max ) {
34108			/* Record set after filtering */
34109			out += ' ' + lang.sInfoFiltered;
34110		}
34111	
34112		// Convert the macros
34113		out += lang.sInfoPostFix;
34114		out = _fnInfoMacros( settings, out );
34115	
34116		var callback = lang.fnInfoCallback;
34117		if ( callback !== null ) {
34118			out = callback.call( settings.oInstance,
34119				settings, start, end, max, total, out
34120			);
34121		}
34122	
34123		$(nodes).html( out );
34124	}
34125	
34126	
34127	function _fnInfoMacros ( settings, str )
34128	{
34129		// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
34130		// internally
34131		var
34132			formatter  = settings.fnFormatNumber,
34133			start      = settings._iDisplayStart+1,
34134			len        = settings._iDisplayLength,
34135			vis        = settings.fnRecordsDisplay(),
34136			all        = len === -1;
34137	
34138		return str.
34139			replace(/_START_/g, formatter.call( settings, start ) ).
34140			replace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).
34141			replace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).
34142			replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
34143			replace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
34144			replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
34145	}
34146	
34147	
34148	
34149	/**
34150	 * Draw the table for the first time, adding all required features
34151	 *  @param {object} settings dataTables settings object
34152	 *  @memberof DataTable#oApi
34153	 */
34154	function _fnInitialise ( settings )
34155	{
34156		var i, iLen, iAjaxStart=settings.iInitDisplayStart;
34157		var columns = settings.aoColumns, column;
34158		var features = settings.oFeatures;
34159		var deferLoading = settings.bDeferLoading; // value modified by the draw
34160	
34161		/* Ensure that the table data is fully initialised */
34162		if ( ! settings.bInitialised ) {
34163			setTimeout( function(){ _fnInitialise( settings ); }, 200 );
34164			return;
34165		}
34166	
34167		/* Show the display HTML options */
34168		_fnAddOptionsHtml( settings );
34169	
34170		/* Build and draw the header / footer for the table */
34171		_fnBuildHead( settings );
34172		_fnDrawHead( settings, settings.aoHeader );
34173		_fnDrawHead( settings, settings.aoFooter );
34174	
34175		/* Okay to show that something is going on now */
34176		_fnProcessingDisplay( settings, true );
34177	
34178		/* Calculate sizes for columns */
34179		if ( features.bAutoWidth ) {
34180			_fnCalculateColumnWidths( settings );
34181		}
34182	
34183		for ( i=0, iLen=columns.length ; i<iLen ; i++ ) {
34184			column = columns[i];
34185	
34186			if ( column.sWidth ) {
34187				column.nTh.style.width = _fnStringToCss( column.sWidth );
34188			}
34189		}
34190	
34191		_fnCallbackFire( settings, null, 'preInit', [settings] );
34192	
34193		// If there is default sorting required - let's do it. The sort function
34194		// will do the drawing for us. Otherwise we draw the table regardless of the
34195		// Ajax source - this allows the table to look initialised for Ajax sourcing
34196		// data (show 'loading' message possibly)
34197		_fnReDraw( settings );
34198	
34199		// Server-side processing init complete is done by _fnAjaxUpdateDraw
34200		var dataSrc = _fnDataSource( settings );
34201		if ( dataSrc != 'ssp' || deferLoading ) {
34202			// if there is an ajax source load the data
34203			if ( dataSrc == 'ajax' ) {
34204				_fnBuildAjax( settings, [], function(json) {
34205					var aData = _fnAjaxDataSrc( settings, json );
34206	
34207					// Got the data - add it to the table
34208					for ( i=0 ; i<aData.length ; i++ ) {
34209						_fnAddData( settings, aData[i] );
34210					}
34211	
34212					// Reset the init display for cookie saving. We've already done
34213					// a filter, and therefore cleared it before. So we need to make
34214					// it appear 'fresh'
34215					settings.iInitDisplayStart = iAjaxStart;
34216	
34217					_fnReDraw( settings );
34218	
34219					_fnProcessingDisplay( settings, false );
34220					_fnInitComplete( settings, json );
34221				}, settings );
34222			}
34223			else {
34224				_fnProcessingDisplay( settings, false );
34225				_fnInitComplete( settings );
34226			}
34227		}
34228	}
34229	
34230	
34231	/**
34232	 * Draw the table for the first time, adding all required features
34233	 *  @param {object} oSettings dataTables settings object
34234	 *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
34235	 *    with client-side processing (optional)
34236	 *  @memberof DataTable#oApi
34237	 */
34238	function _fnInitComplete ( settings, json )
34239	{
34240		settings._bInitComplete = true;
34241	
34242		// When data was added after the initialisation (data or Ajax) we need to
34243		// calculate the column sizing
34244		if ( json || settings.oInit.aaData ) {
34245			_fnAdjustColumnSizing( settings );
34246		}
34247	
34248		_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );
34249	}
34250	
34251	
34252	function _fnLengthChange ( settings, val )
34253	{
34254		var len = parseInt( val, 10 );
34255		settings._iDisplayLength = len;
34256	
34257		_fnLengthOverflow( settings );
34258	
34259		// Fire length change event
34260		_fnCallbackFire( settings, null, 'length', [settings, len] );
34261	}
34262	
34263	
34264	/**
34265	 * Generate the node required for user display length changing
34266	 *  @param {object} settings dataTables settings object
34267	 *  @returns {node} Display length feature node
34268	 *  @memberof DataTable#oApi
34269	 */
34270	function _fnFeatureHtmlLength ( settings )
34271	{
34272		var
34273			classes  = settings.oClasses,
34274			tableId  = settings.sTableId,
34275			menu     = settings.aLengthMenu,
34276			d2       = $.isArray( menu[0] ),
34277			lengths  = d2 ? menu[0] : menu,
34278			language = d2 ? menu[1] : menu;
34279	
34280		var select = $('<select/>', {
34281			'name':          tableId+'_length',
34282			'aria-controls': tableId,
34283			'class':         classes.sLengthSelect
34284		} );
34285	
34286		for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
34287			select[0][ i ] = new Option( language[i], lengths[i] );
34288		}
34289	
34290		var div = $('<div><label/></div>').addClass( classes.sLength );
34291		if ( ! settings.aanFeatures.l ) {
34292			div[0].id = tableId+'_length';
34293		}
34294	
34295		div.children().append(
34296			settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
34297		);
34298	
34299		// Can't use `select` variable as user might provide their own and the
34300		// reference is broken by the use of outerHTML
34301		$('select', div)
34302			.val( settings._iDisplayLength )
34303			.bind( 'change.DT', function(e) {
34304				_fnLengthChange( settings, $(this).val() );
34305				_fnDraw( settings );
34306			} );
34307	
34308		// Update node value whenever anything changes the table's length
34309		$(settings.nTable).bind( 'length.dt.DT', function (e, s, len) {
34310			if ( settings === s ) {
34311				$('select', div).val( len );
34312			}
34313		} );
34314	
34315		return div[0];
34316	}
34317	
34318	
34319	
34320	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
34321	 * Note that most of the paging logic is done in
34322	 * DataTable.ext.pager
34323	 */
34324	
34325	/**
34326	 * Generate the node required for default pagination
34327	 *  @param {object} oSettings dataTables settings object
34328	 *  @returns {node} Pagination feature node
34329	 *  @memberof DataTable#oApi
34330	 */
34331	function _fnFeatureHtmlPaginate ( settings )
34332	{
34333		var
34334			type   = settings.sPaginationType,
34335			plugin = DataTable.ext.pager[ type ],
34336			modern = typeof plugin === 'function',
34337			redraw = function( settings ) {
34338				_fnDraw( settings );
34339			},
34340			node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],
34341			features = settings.aanFeatures;
34342	
34343		if ( ! modern ) {
34344			plugin.fnInit( settings, node, redraw );
34345		}
34346	
34347		/* Add a draw callback for the pagination on first instance, to update the paging display */
34348		if ( ! features.p )
34349		{
34350			node.id = settings.sTableId+'_paginate';
34351	
34352			settings.aoDrawCallback.push( {
34353				"fn": function( settings ) {
34354					if ( modern ) {
34355						var
34356							start      = settings._iDisplayStart,
34357							len        = settings._iDisplayLength,
34358							visRecords = settings.fnRecordsDisplay(),
34359							all        = len === -1,
34360							page = all ? 0 : Math.ceil( start / len ),
34361							pages = all ? 1 : Math.ceil( visRecords / len ),
34362							buttons = plugin(page, pages),
34363							i, ien;
34364	
34365						for ( i=0, ien=features.p.length ; i<ien ; i++ ) {
34366							_fnRenderer( settings, 'pageButton' )(
34367								settings, features.p[i], i, buttons, page, pages
34368							);
34369						}
34370					}
34371					else {
34372						plugin.fnUpdate( settings, redraw );
34373					}
34374				},
34375				"sName": "pagination"
34376			} );
34377		}
34378	
34379		return node;
34380	}
34381	
34382	
34383	/**
34384	 * Alter the display settings to change the page
34385	 *  @param {object} settings DataTables settings object
34386	 *  @param {string|int} action Paging action to take: "first", "previous",
34387	 *    "next" or "last" or page number to jump to (integer)
34388	 *  @param [bool] redraw Automatically draw the update or not
34389	 *  @returns {bool} true page has changed, false - no change
34390	 *  @memberof DataTable#oApi
34391	 */
34392	function _fnPageChange ( settings, action, redraw )
34393	{
34394		var
34395			start     = settings._iDisplayStart,
34396			len       = settings._iDisplayLength,
34397			records   = settings.fnRecordsDisplay();
34398	
34399		if ( records === 0 || len === -1 )
34400		{
34401			start = 0;
34402		}
34403		else if ( typeof action === "number" )
34404		{
34405			start = action * len;
34406	
34407			if ( start > records )
34408			{
34409				start = 0;
34410			}
34411		}
34412		else if ( action == "first" )
34413		{
34414			start = 0;
34415		}
34416		else if ( action == "previous" )
34417		{
34418			start = len >= 0 ?
34419				start - len :
34420				0;
34421	
34422			if ( start < 0 )
34423			{
34424			  start = 0;
34425			}
34426		}
34427		else if ( action == "next" )
34428		{
34429			if ( start + len < records )
34430			{
34431				start += len;
34432			}
34433		}
34434		else if ( action == "last" )
34435		{
34436			start = Math.floor( (records-1) / len) * len;
34437		}
34438		else
34439		{
34440			_fnLog( settings, 0, "Unknown paging action: "+action, 5 );
34441		}
34442	
34443		var changed = settings._iDisplayStart !== start;
34444		settings._iDisplayStart = start;
34445	
34446		if ( changed ) {
34447			_fnCallbackFire( settings, null, 'page', [settings] );
34448	
34449			if ( redraw ) {
34450				_fnDraw( settings );
34451			}
34452		}
34453	
34454		return changed;
34455	}
34456	
34457	
34458	
34459	/**
34460	 * Generate the node required for the processing node
34461	 *  @param {object} settings dataTables settings object
34462	 *  @returns {node} Processing element
34463	 *  @memberof DataTable#oApi
34464	 */
34465	function _fnFeatureHtmlProcessing ( settings )
34466	{
34467		return $('<div/>', {
34468				'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
34469				'class': settings.oClasses.sProcessing
34470			} )
34471			.html( settings.oLanguage.sProcessing )
34472			.insertBefore( settings.nTable )[0];
34473	}
34474	
34475	
34476	/**
34477	 * Display or hide the processing indicator
34478	 *  @param {object} settings dataTables settings object
34479	 *  @param {bool} show Show the processing indicator (true) or not (false)
34480	 *  @memberof DataTable#oApi
34481	 */
34482	function _fnProcessingDisplay ( settings, show )
34483	{
34484		if ( settings.oFeatures.bProcessing ) {
34485			$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
34486		}
34487	
34488		_fnCallbackFire( settings, null, 'processing', [settings, show] );
34489	}
34490	
34491	/**
34492	 * Add any control elements for the table - specifically scrolling
34493	 *  @param {object} settings dataTables settings object
34494	 *  @returns {node} Node to add to the DOM
34495	 *  @memberof DataTable#oApi
34496	 */
34497	function _fnFeatureHtmlTable ( settings )
34498	{
34499		var table = $(settings.nTable);
34500	
34501		// Add the ARIA grid role to the table
34502		table.attr( 'role', 'grid' );
34503	
34504		// Scrolling from here on in
34505		var scroll = settings.oScroll;
34506	
34507		if ( scroll.sX === '' && scroll.sY === '' ) {
34508			return settings.nTable;
34509		}
34510	
34511		var scrollX = scroll.sX;
34512		var scrollY = scroll.sY;
34513		var classes = settings.oClasses;
34514		var caption = table.children('caption');
34515		var captionSide = caption.length ? caption[0]._captionSide : null;
34516		var headerClone = $( table[0].cloneNode(false) );
34517		var footerClone = $( table[0].cloneNode(false) );
34518		var footer = table.children('tfoot');
34519		var _div = '<div/>';
34520		var size = function ( s ) {
34521			return !s ? null : _fnStringToCss( s );
34522		};
34523	
34524		// This is fairly messy, but with x scrolling enabled, if the table has a
34525		// width attribute, regardless of any width applied using the column width
34526		// options, the browser will shrink or grow the table as needed to fit into
34527		// that 100%. That would make the width options useless. So we remove it.
34528		// This is okay, under the assumption that width:100% is applied to the
34529		// table in CSS (it is in the default stylesheet) which will set the table
34530		// width as appropriate (the attribute and css behave differently...)
34531		if ( scroll.sX && table.attr('width') === '100%' ) {
34532			table.removeAttr('width');
34533		}
34534	
34535		if ( ! footer.length ) {
34536			footer = null;
34537		}
34538	
34539		/*
34540		 * The HTML structure that we want to generate in this function is:
34541		 *  div - scroller
34542		 *    div - scroll head
34543		 *      div - scroll head inner
34544		 *        table - scroll head table
34545		 *          thead - thead
34546		 *    div - scroll body
34547		 *      table - table (master table)
34548		 *        thead - thead clone for sizing
34549		 *        tbody - tbody
34550		 *    div - scroll foot
34551		 *      div - scroll foot inner
34552		 *        table - scroll foot table
34553		 *          tfoot - tfoot
34554		 */
34555		var scroller = $( _div, { 'class': classes.sScrollWrapper } )
34556			.append(
34557				$(_div, { 'class': classes.sScrollHead } )
34558					.css( {
34559						overflow: 'hidden',
34560						position: 'relative',
34561						border: 0,
34562						width: scrollX ? size(scrollX) : '100%'
34563					} )
34564					.append(
34565						$(_div, { 'class': classes.sScrollHeadInner } )
34566							.css( {
34567								'box-sizing': 'content-box',
34568								width: scroll.sXInner || '100%'
34569							} )
34570							.append(
34571								headerClone
34572									.removeAttr('id')
34573									.css( 'margin-left', 0 )
34574									.append( captionSide === 'top' ? caption : null )
34575									.append(
34576										table.children('thead')
34577									)
34578							)
34579					)
34580			)
34581			.append(
34582				$(_div, { 'class': classes.sScrollBody } )
34583					.css( {
34584						position: 'relative',
34585						overflow: 'auto',
34586						width: size( scrollX )
34587					} )
34588					.append( table )
34589			);
34590	
34591		if ( footer ) {
34592			scroller.append(
34593				$(_div, { 'class': classes.sScrollFoot } )
34594					.css( {
34595						overflow: 'hidden',
34596						border: 0,
34597						width: scrollX ? size(scrollX) : '100%'
34598					} )
34599					.append(
34600						$(_div, { 'class': classes.sScrollFootInner } )
34601							.append(
34602								footerClone
34603									.removeAttr('id')
34604									.css( 'margin-left', 0 )
34605									.append( captionSide === 'bottom' ? caption : null )
34606									.append(
34607										table.children('tfoot')
34608									)
34609							)
34610					)
34611			);
34612		}
34613	
34614		var children = scroller.children();
34615		var scrollHead = children[0];
34616		var scrollBody = children[1];
34617		var scrollFoot = footer ? children[2] : null;
34618	
34619		// When the body is scrolled, then we also want to scroll the headers
34620		if ( scrollX ) {
34621			$(scrollBody).on( 'scroll.DT', function (e) {
34622				var scrollLeft = this.scrollLeft;
34623	
34624				scrollHead.scrollLeft = scrollLeft;
34625	
34626				if ( footer ) {
34627					scrollFoot.scrollLeft = scrollLeft;
34628				}
34629			} );
34630		}
34631	
34632		$(scrollBody).css(
34633			scrollY && scroll.bCollapse ? 'max-height' : 'height', 
34634			scrollY
34635		);
34636	
34637		settings.nScrollHead = scrollHead;
34638		settings.nScrollBody = scrollBody;
34639		settings.nScrollFoot = scrollFoot;
34640	
34641		// On redraw - align columns
34642		settings.aoDrawCallback.push( {
34643			"fn": _fnScrollDraw,
34644			"sName": "scrolling"
34645		} );
34646	
34647		return scroller[0];
34648	}
34649	
34650	
34651	
34652	/**
34653	 * Update the header, footer and body tables for resizing - i.e. column
34654	 * alignment.
34655	 *
34656	 * Welcome to the most horrible function DataTables. The process that this
34657	 * function follows is basically:
34658	 *   1. Re-create the table inside the scrolling div
34659	 *   2. Take live measurements from the DOM
34660	 *   3. Apply the measurements to align the columns
34661	 *   4. Clean up
34662	 *
34663	 *  @param {object} settings dataTables settings object
34664	 *  @memberof DataTable#oApi
34665	 */
34666	function _fnScrollDraw ( settings )
34667	{
34668		// Given that this is such a monster function, a lot of variables are use
34669		// to try and keep the minimised size as small as possible
34670		var
34671			scroll         = settings.oScroll,
34672			scrollX        = scroll.sX,
34673			scrollXInner   = scroll.sXInner,
34674			scrollY        = scroll.sY,
34675			barWidth       = scroll.iBarWidth,
34676			divHeader      = $(settings.nScrollHead),
34677			divHeaderStyle = divHeader[0].style,
34678			divHeaderInner = divHeader.children('div'),
34679			divHeaderInnerStyle = divHeaderInner[0].style,
34680			divHeaderTable = divHeaderInner.children('table'),
34681			divBodyEl      = settings.nScrollBody,
34682			divBody        = $(divBodyEl),
34683			divBodyStyle   = divBodyEl.style,
34684			divFooter      = $(settings.nScrollFoot),
34685			divFooterInner = divFooter.children('div'),
34686			divFooterTable = divFooterInner.children('table'),
34687			header         = $(settings.nTHead),
34688			table          = $(settings.nTable),
34689			tableEl        = table[0],
34690			tableStyle     = tableEl.style,
34691			footer         = settings.nTFoot ? $(settings.nTFoot) : null,
34692			browser        = settings.oBrowser,
34693			ie67           = browser.bScrollOversize,
34694			headerTrgEls, footerTrgEls,
34695			headerSrcEls, footerSrcEls,
34696			headerCopy, footerCopy,
34697			headerWidths=[], footerWidths=[],
34698			headerContent=[],
34699			idx, correction, sanityWidth,
34700			zeroOut = function(nSizer) {
34701				var style = nSizer.style;
34702				style.paddingTop = "0";
34703				style.paddingBottom = "0";
34704				style.borderTopWidth = "0";
34705				style.borderBottomWidth = "0";
34706				style.height = 0;
34707			};
34708	
34709		/*
34710		 * 1. Re-create the table inside the scrolling div
34711		 */
34712	
34713		// Remove the old minimised thead and tfoot elements in the inner table
34714		table.children('thead, tfoot').remove();
34715	
34716		// Clone the current header and footer elements and then place it into the inner table
34717		headerCopy = header.clone().prependTo( table );
34718		headerTrgEls = header.find('tr'); // original header is in its own table
34719		headerSrcEls = headerCopy.find('tr');
34720		headerCopy.find('th, td').removeAttr('tabindex');
34721	
34722		if ( footer ) {
34723			footerCopy = footer.clone().prependTo( table );
34724			footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
34725			footerSrcEls = footerCopy.find('tr');
34726		}
34727	
34728	
34729		/*
34730		 * 2. Take live measurements from the DOM - do not alter the DOM itself!
34731		 */
34732	
34733		// Remove old sizing and apply the calculated column widths
34734		// Get the unique column headers in the newly created (cloned) header. We want to apply the
34735		// calculated sizes to this header
34736		if ( ! scrollX )
34737		{
34738			divBodyStyle.width = '100%';
34739			divHeader[0].style.width = '100%';
34740		}
34741	
34742		$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
34743			idx = _fnVisibleToColumnIndex( settings, i );
34744			el.style.width = settings.aoColumns[idx].sWidth;
34745		} );
34746	
34747		if ( footer ) {
34748			_fnApplyToChildren( function(n) {
34749				n.style.width = "";
34750			}, footerSrcEls );
34751		}
34752	
34753		// Size the table as a whole
34754		sanityWidth = table.outerWidth();
34755		if ( scrollX === "" ) {
34756			// No x scrolling
34757			tableStyle.width = "100%";
34758	
34759			// IE7 will make the width of the table when 100% include the scrollbar
34760			// - which is shouldn't. When there is a scrollbar we need to take this
34761			// into account.
34762			if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
34763				divBody.css('overflow-y') == "scroll")
34764			) {
34765				tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
34766			}
34767	
34768			// Recalculate the sanity width
34769			sanityWidth = table.outerWidth();
34770		}
34771		else if ( scrollXInner !== "" ) {
34772			// legacy x scroll inner has been given - use it
34773			tableStyle.width = _fnStringToCss(scrollXInner);
34774	
34775			// Recalculate the sanity width
34776			sanityWidth = table.outerWidth();
34777		}
34778	
34779		// Hidden header should have zero height, so remove padding and borders. Then
34780		// set the width based on the real headers
34781	
34782		// Apply all styles in one pass
34783		_fnApplyToChildren( zeroOut, headerSrcEls );
34784	
34785		// Read all widths in next pass
34786		_fnApplyToChildren( function(nSizer) {
34787			headerContent.push( nSizer.innerHTML );
34788			headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
34789		}, headerSrcEls );
34790	
34791		// Apply all widths in final pass
34792		_fnApplyToChildren( function(nToSize, i) {
34793			nToSize.style.width = headerWidths[i];
34794		}, headerTrgEls );
34795	
34796		$(headerSrcEls).height(0);
34797	
34798		/* Same again with the footer if we have one */
34799		if ( footer )
34800		{
34801			_fnApplyToChildren( zeroOut, footerSrcEls );
34802	
34803			_fnApplyToChildren( function(nSizer) {
34804				footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
34805			}, footerSrcEls );
34806	
34807			_fnApplyToChildren( function(nToSize, i) {
34808				nToSize.style.width = footerWidths[i];
34809			}, footerTrgEls );
34810	
34811			$(footerSrcEls).height(0);
34812		}
34813	
34814	
34815		/*
34816		 * 3. Apply the measurements
34817		 */
34818	
34819		// "Hide" the header and footer that we used for the sizing. We need to keep
34820		// the content of the cell so that the width applied to the header and body
34821		// both match, but we want to hide it completely. We want to also fix their
34822		// width to what they currently are
34823		_fnApplyToChildren( function(nSizer, i) {
34824			nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+headerContent[i]+'</div>';
34825			nSizer.style.width = headerWidths[i];
34826		}, headerSrcEls );
34827	
34828		if ( footer )
34829		{
34830			_fnApplyToChildren( function(nSizer, i) {
34831				nSizer.innerHTML = "";
34832				nSizer.style.width = footerWidths[i];
34833			}, footerSrcEls );
34834		}
34835	
34836		// Sanity check that the table is of a sensible width. If not then we are going to get
34837		// misalignment - try to prevent this by not allowing the table to shrink below its min width
34838		if ( table.outerWidth() < sanityWidth )
34839		{
34840			// The min width depends upon if we have a vertical scrollbar visible or not */
34841			correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
34842				divBody.css('overflow-y') == "scroll")) ?
34843					sanityWidth+barWidth :
34844					sanityWidth;
34845	
34846			// IE6/7 are a law unto themselves...
34847			if ( ie67 && (divBodyEl.scrollHeight >
34848				divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
34849			) {
34850				tableStyle.width = _fnStringToCss( correction-barWidth );
34851			}
34852	
34853			// And give the user a warning that we've stopped the table getting too small
34854			if ( scrollX === "" || scrollXInner !== "" ) {
34855				_fnLog( settings, 1, 'Possible column misalignment', 6 );
34856			}
34857		}
34858		else
34859		{
34860			correction = '100%';
34861		}
34862	
34863		// Apply to the container elements
34864		divBodyStyle.width = _fnStringToCss( correction );
34865		divHeaderStyle.width = _fnStringToCss( correction );
34866	
34867		if ( footer ) {
34868			settings.nScrollFoot.style.width = _fnStringToCss( correction );
34869		}
34870	
34871	
34872		/*
34873		 * 4. Clean up
34874		 */
34875		if ( ! scrollY ) {
34876			/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
34877			 * the scrollbar height from the visible display, rather than adding it on. We need to
34878			 * set the height in order to sort this. Don't want to do it in any other browsers.
34879			 */
34880			if ( ie67 ) {
34881				divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
34882			}
34883		}
34884	
34885		/* Finally set the width's of the header and footer tables */
34886		var iOuterWidth = table.outerWidth();
34887		divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
34888		divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
34889	
34890		// Figure out if there are scrollbar present - if so then we need a the header and footer to
34891		// provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
34892		var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
34893		var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
34894		divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
34895	
34896		if ( footer ) {
34897			divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
34898			divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
34899			divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
34900		}
34901	
34902		/* Adjust the position of the header in case we loose the y-scrollbar */
34903		divBody.scroll();
34904	
34905		// If sorting or filtering has occurred, jump the scrolling back to the top
34906		// only if we aren't holding the position
34907		if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
34908			divBodyEl.scrollTop = 0;
34909		}
34910	}
34911	
34912	
34913	
34914	/**
34915	 * Apply a given function to the display child nodes of an element array (typically
34916	 * TD children of TR rows
34917	 *  @param {function} fn Method to apply to the objects
34918	 *  @param array {nodes} an1 List of elements to look through for display children
34919	 *  @param array {nodes} an2 Another list (identical structure to the first) - optional
34920	 *  @memberof DataTable#oApi
34921	 */
34922	function _fnApplyToChildren( fn, an1, an2 )
34923	{
34924		var index=0, i=0, iLen=an1.length;
34925		var nNode1, nNode2;
34926	
34927		while ( i < iLen ) {
34928			nNode1 = an1[i].firstChild;
34929			nNode2 = an2 ? an2[i].firstChild : null;
34930	
34931			while ( nNode1 ) {
34932				if ( nNode1.nodeType === 1 ) {
34933					if ( an2 ) {
34934						fn( nNode1, nNode2, index );
34935					}
34936					else {
34937						fn( nNode1, index );
34938					}
34939	
34940					index++;
34941				}
34942	
34943				nNode1 = nNode1.nextSibling;
34944				nNode2 = an2 ? nNode2.nextSibling : null;
34945			}
34946	
34947			i++;
34948		}
34949	}
34950	
34951	
34952	
34953	var __re_html_remove = /<.*?>/g;
34954	
34955	
34956	/**
34957	 * Calculate the width of columns for the table
34958	 *  @param {object} oSettings dataTables settings object
34959	 *  @memberof DataTable#oApi
34960	 */
34961	function _fnCalculateColumnWidths ( oSettings )
34962	{
34963		var
34964			table = oSettings.nTable,
34965			columns = oSettings.aoColumns,
34966			scroll = oSettings.oScroll,
34967			scrollY = scroll.sY,
34968			scrollX = scroll.sX,
34969			scrollXInner = scroll.sXInner,
34970			columnCount = columns.length,
34971			visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
34972			headerCells = $('th', oSettings.nTHead),
34973			tableWidthAttr = table.getAttribute('width'), // from DOM element
34974			tableContainer = table.parentNode,
34975			userInputs = false,
34976			i, column, columnIdx, width, outerWidth,
34977			browser = oSettings.oBrowser,
34978			ie67 = browser.bScrollOversize;
34979	
34980		var styleWidth = table.style.width;
34981		if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
34982			tableWidthAttr = styleWidth;
34983		}
34984	
34985		/* Convert any user input sizes into pixel sizes */
34986		for ( i=0 ; i<visibleColumns.length ; i++ ) {
34987			column = columns[ visibleColumns[i] ];
34988	
34989			if ( column.sWidth !== null ) {
34990				column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );
34991	
34992				userInputs = true;
34993			}
34994		}
34995	
34996		/* If the number of columns in the DOM equals the number that we have to
34997		 * process in DataTables, then we can use the offsets that are created by
34998		 * the web- browser. No custom sizes can be set in order for this to happen,
34999		 * nor scrolling used
35000		 */
35001		if ( ie67 || ! userInputs && ! scrollX && ! scrollY &&
35002		     columnCount == _fnVisbleColumns( oSettings ) &&
35003		     columnCount == headerCells.length
35004		) {
35005			for ( i=0 ; i<columnCount ; i++ ) {
35006				var colIdx = _fnVisibleToColumnIndex( oSettings, i );
35007	
35008				if ( colIdx ) {
35009					columns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );
35010				}
35011			}
35012		}
35013		else
35014		{
35015			// Otherwise construct a single row, worst case, table with the widest
35016			// node in the data, assign any user defined widths, then insert it into
35017			// the DOM and allow the browser to do all the hard work of calculating
35018			// table widths
35019			var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table
35020				.css( 'visibility', 'hidden' )
35021				.removeAttr( 'id' );
35022	
35023			// Clean up the table body
35024			tmpTable.find('tbody tr').remove();
35025			var tr = $('<tr/>').appendTo( tmpTable.find('tbody') );
35026	
35027			// Clone the table header and footer - we can't use the header / footer
35028			// from the cloned table, since if scrolling is active, the table's
35029			// real header and footer are contained in different table tags
35030			tmpTable.find('thead, tfoot').remove();
35031			tmpTable
35032				.append( $(oSettings.nTHead).clone() )
35033				.append( $(oSettings.nTFoot).clone() );
35034	
35035			// Remove any assigned widths from the footer (from scrolling)
35036			tmpTable.find('tfoot th, tfoot td').css('width', '');
35037	
35038			// Apply custom sizing to the cloned header
35039			headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
35040	
35041			for ( i=0 ; i<visibleColumns.length ; i++ ) {
35042				column = columns[ visibleColumns[i] ];
35043	
35044				headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?
35045					_fnStringToCss( column.sWidthOrig ) :
35046					'';
35047			}
35048	
35049			// Find the widest cell for each column and put it into the table
35050			if ( oSettings.aoData.length ) {
35051				for ( i=0 ; i<visibleColumns.length ; i++ ) {
35052					columnIdx = visibleColumns[i];
35053					column = columns[ columnIdx ];
35054	
35055					$( _fnGetWidestNode( oSettings, columnIdx ) )
35056						.clone( false )
35057						.append( column.sContentPadding )
35058						.appendTo( tr );
35059				}
35060			}
35061	
35062			// Table has been built, attach to the document so we can work with it.
35063			// A holding element is used, positioned at the top of the container
35064			// with minimal height, so it has no effect on if the container scrolls
35065			// or not. Otherwise it might trigger scrolling when it actually isn't
35066			// needed
35067			var holder = $('<div/>').css( scrollX || scrollY ?
35068					{
35069						position: 'absolute',
35070						top: 0,
35071						left: 0,
35072						height: 1,
35073						right: 0,
35074						overflow: 'hidden'
35075					} :
35076					{}
35077				)
35078				.append( tmpTable )
35079				.appendTo( tableContainer );
35080	
35081			// When scrolling (X or Y) we want to set the width of the table as 
35082			// appropriate. However, when not scrolling leave the table width as it
35083			// is. This results in slightly different, but I think correct behaviour
35084			if ( scrollX && scrollXInner ) {
35085				tmpTable.width( scrollXInner );
35086			}
35087			else if ( scrollX ) {
35088				tmpTable.css( 'width', 'auto' );
35089	
35090				if ( tmpTable.width() < tableContainer.clientWidth ) {
35091					tmpTable.width( tableContainer.clientWidth );
35092				}
35093			}
35094			else if ( scrollY ) {
35095				tmpTable.width( tableContainer.clientWidth );
35096			}
35097			else if ( tableWidthAttr ) {
35098				tmpTable.width( tableWidthAttr );
35099			}
35100	
35101			// Browsers need a bit of a hand when a width is assigned to any columns
35102			// when x-scrolling as they tend to collapse the table to the min-width,
35103			// even if we sent the column widths. So we need to keep track of what
35104			// the table width should be by summing the user given values, and the
35105			// automatic values
35106			if ( scrollX )
35107			{
35108				var total = 0;
35109	
35110				for ( i=0 ; i<visibleColumns.length ; i++ ) {
35111					column = columns[ visibleColumns[i] ];
35112	
35113					// Much prefer to use getBoundingClientRect due to its sub-pixel
35114					// resolution, but IE8- do not support the width property.
35115					outerWidth = browser.bBounding ?
35116						headerCells[i].getBoundingClientRect().width :
35117						$(headerCells[i]).outerWidth();
35118	
35119					total += column.sWidthOrig === null ?
35120						outerWidth :
35121						parseInt( column.sWidth, 10 ) + outerWidth - $(headerCells[i]).width();
35122				}
35123	
35124				tmpTable.width( _fnStringToCss( total ) );
35125				table.style.width = _fnStringToCss( total );
35126			}
35127	
35128			// Get the width of each column in the constructed table
35129			for ( i=0 ; i<visibleColumns.length ; i++ ) {
35130				column = columns[ visibleColumns[i] ];
35131				width = $(headerCells[i]).width();
35132	
35133				if ( width ) {
35134					column.sWidth = _fnStringToCss( width );
35135				}
35136			}
35137	
35138			table.style.width = _fnStringToCss( tmpTable.css('width') );
35139	
35140			// Finished with the table - ditch it
35141			holder.remove();
35142		}
35143	
35144		// If there is a width attr, we want to attach an event listener which
35145		// allows the table sizing to automatically adjust when the window is
35146		// resized. Use the width attr rather than CSS, since we can't know if the
35147		// CSS is a relative value or absolute - DOM read is always px.
35148		if ( tableWidthAttr ) {
35149			table.style.width = _fnStringToCss( tableWidthAttr );
35150		}
35151	
35152		if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {
35153			var bindResize = function () {
35154				$(window).bind('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {
35155					_fnAdjustColumnSizing( oSettings );
35156				} ) );
35157			};
35158	
35159			// IE6/7 will crash if we bind a resize event handler on page load.
35160			// To be removed in 1.11 which drops IE6/7 support
35161			if ( ie67 ) {
35162				setTimeout( bindResize, 1000 );
35163			}
35164			else {
35165				bindResize();
35166			}
35167	
35168			oSettings._reszEvt = true;
35169		}
35170	}
35171	
35172	
35173	/**
35174	 * Throttle the calls to a function. Arguments and context are maintained for
35175	 * the throttled function
35176	 *  @param {function} fn Function to be called
35177	 *  @param {int} [freq=200] call frequency in mS
35178	 *  @returns {function} wrapped function
35179	 *  @memberof DataTable#oApi
35180	 */
35181	function _fnThrottle( fn, freq ) {
35182		var
35183			frequency = freq !== undefined ? freq : 200,
35184			last,
35185			timer;
35186	
35187		return function () {
35188			var
35189				that = this,
35190				now  = +new Date(),
35191				args = arguments;
35192	
35193			if ( last && now < last + frequency ) {
35194				clearTimeout( timer );
35195	
35196				timer = setTimeout( function () {
35197					last = undefined;
35198					fn.apply( that, args );
35199				}, frequency );
35200			}
35201			else {
35202				last = now;
35203				fn.apply( that, args );
35204			}
35205		};
35206	}
35207	
35208	
35209	/**
35210	 * Convert a CSS unit width to pixels (e.g. 2em)
35211	 *  @param {string} width width to be converted
35212	 *  @param {node} parent parent to get the with for (required for relative widths) - optional
35213	 *  @returns {int} width in pixels
35214	 *  @memberof DataTable#oApi
35215	 */
35216	function _fnConvertToWidth ( width, parent )
35217	{
35218		if ( ! width ) {
35219			return 0;
35220		}
35221	
35222		var n = $('<div/>')
35223			.css( 'width', _fnStringToCss( width ) )
35224			.appendTo( parent || document.body );
35225	
35226		var val = n[0].offsetWidth;
35227		n.remove();
35228	
35229		return val;
35230	}
35231	
35232	
35233	/**
35234	 * Get the widest node
35235	 *  @param {object} settings dataTables settings object
35236	 *  @param {int} colIdx column of interest
35237	 *  @returns {node} widest table node
35238	 *  @memberof DataTable#oApi
35239	 */
35240	function _fnGetWidestNode( settings, colIdx )
35241	{
35242		var idx = _fnGetMaxLenString( settings, colIdx );
35243		if ( idx < 0 ) {
35244			return null;
35245		}
35246	
35247		var data = settings.aoData[ idx ];
35248		return ! data.nTr ? // Might not have been created when deferred rendering
35249			$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
35250			data.anCells[ colIdx ];
35251	}
35252	
35253	
35254	/**
35255	 * Get the maximum strlen for each data column
35256	 *  @param {object} settings dataTables settings object
35257	 *  @param {int} colIdx column of interest
35258	 *  @returns {string} max string length for each column
35259	 *  @memberof DataTable#oApi
35260	 */
35261	function _fnGetMaxLenString( settings, colIdx )
35262	{
35263		var s, max=-1, maxIdx = -1;
35264	
35265		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
35266			s = _fnGetCellData( settings, i, colIdx, 'display' )+'';
35267			s = s.replace( __re_html_remove, '' );
35268	
35269			if ( s.length > max ) {
35270				max = s.length;
35271				maxIdx = i;
35272			}
35273		}
35274	
35275		return maxIdx;
35276	}
35277	
35278	
35279	/**
35280	 * Append a CSS unit (only if required) to a string
35281	 *  @param {string} value to css-ify
35282	 *  @returns {string} value with css unit
35283	 *  @memberof DataTable#oApi
35284	 */
35285	function _fnStringToCss( s )
35286	{
35287		if ( s === null ) {
35288			return '0px';
35289		}
35290	
35291		if ( typeof s == 'number' ) {
35292			return s < 0 ?
35293				'0px' :
35294				s+'px';
35295		}
35296	
35297		// Check it has a unit character already
35298		return s.match(/\d$/) ?
35299			s+'px' :
35300			s;
35301	}
35302	
35303	
35304	
35305	function _fnSortFlatten ( settings )
35306	{
35307		var
35308			i, iLen, k, kLen,
35309			aSort = [],
35310			aiOrig = [],
35311			aoColumns = settings.aoColumns,
35312			aDataSort, iCol, sType, srcCol,
35313			fixed = settings.aaSortingFixed,
35314			fixedObj = $.isPlainObject( fixed ),
35315			nestedSort = [],
35316			add = function ( a ) {
35317				if ( a.length && ! $.isArray( a[0] ) ) {
35318					// 1D array
35319					nestedSort.push( a );
35320				}
35321				else {
35322					// 2D array
35323					$.merge( nestedSort, a );
35324				}
35325			};
35326	
35327		// Build the sort array, with pre-fix and post-fix options if they have been
35328		// specified
35329		if ( $.isArray( fixed ) ) {
35330			add( fixed );
35331		}
35332	
35333		if ( fixedObj && fixed.pre ) {
35334			add( fixed.pre );
35335		}
35336	
35337		add( settings.aaSorting );
35338	
35339		if (fixedObj && fixed.post ) {
35340			add( fixed.post );
35341		}
35342	
35343		for ( i=0 ; i<nestedSort.length ; i++ )
35344		{
35345			srcCol = nestedSort[i][0];
35346			aDataSort = aoColumns[ srcCol ].aDataSort;
35347	
35348			for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
35349			{
35350				iCol = aDataSort[k];
35351				sType = aoColumns[ iCol ].sType || 'string';
35352	
35353				if ( nestedSort[i]._idx === undefined ) {
35354					nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );
35355				}
35356	
35357				aSort.push( {
35358					src:       srcCol,
35359					col:       iCol,
35360					dir:       nestedSort[i][1],
35361					index:     nestedSort[i]._idx,
35362					type:      sType,
35363					formatter: DataTable.ext.type.order[ sType+"-pre" ]
35364				} );
35365			}
35366		}
35367	
35368		return aSort;
35369	}
35370	
35371	/**
35372	 * Change the order of the table
35373	 *  @param {object} oSettings dataTables settings object
35374	 *  @memberof DataTable#oApi
35375	 *  @todo This really needs split up!
35376	 */
35377	function _fnSort ( oSettings )
35378	{
35379		var
35380			i, ien, iLen, j, jLen, k, kLen,
35381			sDataType, nTh,
35382			aiOrig = [],
35383			oExtSort = DataTable.ext.type.order,
35384			aoData = oSettings.aoData,
35385			aoColumns = oSettings.aoColumns,
35386			aDataSort, data, iCol, sType, oSort,
35387			formatters = 0,
35388			sortCol,
35389			displayMaster = oSettings.aiDisplayMaster,
35390			aSort;
35391	
35392		// Resolve any column types that are unknown due to addition or invalidation
35393		// @todo Can this be moved into a 'data-ready' handler which is called when
35394		//   data is going to be used in the table?
35395		_fnColumnTypes( oSettings );
35396	
35397		aSort = _fnSortFlatten( oSettings );
35398	
35399		for ( i=0, ien=aSort.length ; i<ien ; i++ ) {
35400			sortCol = aSort[i];
35401	
35402			// Track if we can use the fast sort algorithm
35403			if ( sortCol.formatter ) {
35404				formatters++;
35405			}
35406	
35407			// Load the data needed for the sort, for each cell
35408			_fnSortData( oSettings, sortCol.col );
35409		}
35410	
35411		/* No sorting required if server-side or no sorting array */
35412		if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )
35413		{
35414			// Create a value - key array of the current row positions such that we can use their
35415			// current position during the sort, if values match, in order to perform stable sorting
35416			for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {
35417				aiOrig[ displayMaster[i] ] = i;
35418			}
35419	
35420			/* Do the sort - here we want multi-column sorting based on a given data source (column)
35421			 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
35422			 * follow on it's own, but this is what we want (example two column sorting):
35423			 *  fnLocalSorting = function(a,b){
35424			 *    var iTest;
35425			 *    iTest = oSort['string-asc']('data11', 'data12');
35426			 *      if (iTest !== 0)
35427			 *        return iTest;
35428			 *    iTest = oSort['numeric-desc']('data21', 'data22');
35429			 *    if (iTest !== 0)
35430			 *      return iTest;
35431			 *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
35432			 *  }
35433			 * Basically we have a test for each sorting column, if the data in that column is equal,
35434			 * test the next column. If all columns match, then we use a numeric sort on the row
35435			 * positions in the original data array to provide a stable sort.
35436			 *
35437			 * Note - I know it seems excessive to have two sorting methods, but the first is around
35438			 * 15% faster, so the second is only maintained for backwards compatibility with sorting
35439			 * methods which do not have a pre-sort formatting function.
35440			 */
35441			if ( formatters === aSort.length ) {
35442				// All sort types have formatting functions
35443				displayMaster.sort( function ( a, b ) {
35444					var
35445						x, y, k, test, sort,
35446						len=aSort.length,
35447						dataA = aoData[a]._aSortData,
35448						dataB = aoData[b]._aSortData;
35449	
35450					for ( k=0 ; k<len ; k++ ) {
35451						sort = aSort[k];
35452	
35453						x = dataA[ sort.col ];
35454						y = dataB[ sort.col ];
35455	
35456						test = x<y ? -1 : x>y ? 1 : 0;
35457						if ( test !== 0 ) {
35458							return sort.dir === 'asc' ? test : -test;
35459						}
35460					}
35461	
35462					x = aiOrig[a];
35463					y = aiOrig[b];
35464					return x<y ? -1 : x>y ? 1 : 0;
35465				} );
35466			}
35467			else {
35468				// Depreciated - remove in 1.11 (providing a plug-in option)
35469				// Not all sort types have formatting methods, so we have to call their sorting
35470				// methods.
35471				displayMaster.sort( function ( a, b ) {
35472					var
35473						x, y, k, l, test, sort, fn,
35474						len=aSort.length,
35475						dataA = aoData[a]._aSortData,
35476						dataB = aoData[b]._aSortData;
35477	
35478					for ( k=0 ; k<len ; k++ ) {
35479						sort = aSort[k];
35480	
35481						x = dataA[ sort.col ];
35482						y = dataB[ sort.col ];
35483	
35484						fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ];
35485						test = fn( x, y );
35486						if ( test !== 0 ) {
35487							return test;
35488						}
35489					}
35490	
35491					x = aiOrig[a];
35492					y = aiOrig[b];
35493					return x<y ? -1 : x>y ? 1 : 0;
35494				} );
35495			}
35496		}
35497	
35498		/* Tell the draw function that we have sorted the data */
35499		oSettings.bSorted = true;
35500	}
35501	
35502	
35503	function _fnSortAria ( settings )
35504	{
35505		var label;
35506		var nextSort;
35507		var columns = settings.aoColumns;
35508		var aSort = _fnSortFlatten( settings );
35509		var oAria = settings.oLanguage.oAria;
35510	
35511		// ARIA attributes - need to loop all columns, to update all (removing old
35512		// attributes as needed)
35513		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
35514		{
35515			var col = columns[i];
35516			var asSorting = col.asSorting;
35517			var sTitle = col.sTitle.replace( /<.*?>/g, "" );
35518			var th = col.nTh;
35519	
35520			// IE7 is throwing an error when setting these properties with jQuery's
35521			// attr() and removeAttr() methods...
35522			th.removeAttribute('aria-sort');
35523	
35524			/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
35525			if ( col.bSortable ) {
35526				if ( aSort.length > 0 && aSort[0].col == i ) {
35527					th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
35528					nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
35529				}
35530				else {
35531					nextSort = asSorting[0];
35532				}
35533	
35534				label = sTitle + ( nextSort === "asc" ?
35535					oAria.sSortAscending :
35536					oAria.sSortDescending
35537				);
35538			}
35539			else {
35540				label = sTitle;
35541			}
35542	
35543			th.setAttribute('aria-label', label);
35544		}
35545	}
35546	
35547	
35548	/**
35549	 * Function to run on user sort request
35550	 *  @param {object} settings dataTables settings object
35551	 *  @param {node} attachTo node to attach the handler to
35552	 *  @param {int} colIdx column sorting index
35553	 *  @param {boolean} [append=false] Append the requested sort to the existing
35554	 *    sort if true (i.e. multi-column sort)
35555	 *  @param {function} [callback] callback function
35556	 *  @memberof DataTable#oApi
35557	 */
35558	function _fnSortListener ( settings, colIdx, append, callback )
35559	{
35560		var col = settings.aoColumns[ colIdx ];
35561		var sorting = settings.aaSorting;
35562		var asSorting = col.asSorting;
35563		var nextSortIdx;
35564		var next = function ( a, overflow ) {
35565			var idx = a._idx;
35566			if ( idx === undefined ) {
35567				idx = $.inArray( a[1], asSorting );
35568			}
35569	
35570			return idx+1 < asSorting.length ?
35571				idx+1 :
35572				overflow ?
35573					null :
35574					0;
35575		};
35576	
35577		// Convert to 2D array if needed
35578		if ( typeof sorting[0] === 'number' ) {
35579			sorting = settings.aaSorting = [ sorting ];
35580		}
35581	
35582		// If appending the sort then we are multi-column sorting
35583		if ( append && settings.oFeatures.bSortMulti ) {
35584			// Are we already doing some kind of sort on this column?
35585			var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
35586	
35587			if ( sortIdx !== -1 ) {
35588				// Yes, modify the sort
35589				nextSortIdx = next( sorting[sortIdx], true );
35590	
35591				if ( nextSortIdx === null && sorting.length === 1 ) {
35592					nextSortIdx = 0; // can't remove sorting completely
35593				}
35594	
35595				if ( nextSortIdx === null ) {
35596					sorting.splice( sortIdx, 1 );
35597				}
35598				else {
35599					sorting[sortIdx][1] = asSorting[ nextSortIdx ];
35600					sorting[sortIdx]._idx = nextSortIdx;
35601				}
35602			}
35603			else {
35604				// No sort on this column yet
35605				sorting.push( [ colIdx, asSorting[0], 0 ] );
35606				sorting[sorting.length-1]._idx = 0;
35607			}
35608		}
35609		else if ( sorting.length && sorting[0][0] == colIdx ) {
35610			// Single column - already sorting on this column, modify the sort
35611			nextSortIdx = next( sorting[0] );
35612	
35613			sorting.length = 1;
35614			sorting[0][1] = asSorting[ nextSortIdx ];
35615			sorting[0]._idx = nextSortIdx;
35616		}
35617		else {
35618			// Single column - sort only on this column
35619			sorting.length = 0;
35620			sorting.push( [ colIdx, asSorting[0] ] );
35621			sorting[0]._idx = 0;
35622		}
35623	
35624		// Run the sort by calling a full redraw
35625		_fnReDraw( settings );
35626	
35627		// callback used for async user interaction
35628		if ( typeof callback == 'function' ) {
35629			callback( settings );
35630		}
35631	}
35632	
35633	
35634	/**
35635	 * Attach a sort handler (click) to a node
35636	 *  @param {object} settings dataTables settings object
35637	 *  @param {node} attachTo node to attach the handler to
35638	 *  @param {int} colIdx column sorting index
35639	 *  @param {function} [callback] callback function
35640	 *  @memberof DataTable#oApi
35641	 */
35642	function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
35643	{
35644		var col = settings.aoColumns[ colIdx ];
35645	
35646		_fnBindAction( attachTo, {}, function (e) {
35647			/* If the column is not sortable - don't to anything */
35648			if ( col.bSortable === false ) {
35649				return;
35650			}
35651	
35652			// If processing is enabled use a timeout to allow the processing
35653			// display to be shown - otherwise to it synchronously
35654			if ( settings.oFeatures.bProcessing ) {
35655				_fnProcessingDisplay( settings, true );
35656	
35657				setTimeout( function() {
35658					_fnSortListener( settings, colIdx, e.shiftKey, callback );
35659	
35660					// In server-side processing, the draw callback will remove the
35661					// processing display
35662					if ( _fnDataSource( settings ) !== 'ssp' ) {
35663						_fnProcessingDisplay( settings, false );
35664					}
35665				}, 0 );
35666			}
35667			else {
35668				_fnSortListener( settings, colIdx, e.shiftKey, callback );
35669			}
35670		} );
35671	}
35672	
35673	
35674	/**
35675	 * Set the sorting classes on table's body, Note: it is safe to call this function
35676	 * when bSort and bSortClasses are false
35677	 *  @param {object} oSettings dataTables settings object
35678	 *  @memberof DataTable#oApi
35679	 */
35680	function _fnSortingClasses( settings )
35681	{
35682		var oldSort = settings.aLastSort;
35683		var sortClass = settings.oClasses.sSortColumn;
35684		var sort = _fnSortFlatten( settings );
35685		var features = settings.oFeatures;
35686		var i, ien, colIdx;
35687	
35688		if ( features.bSort && features.bSortClasses ) {
35689			// Remove old sorting classes
35690			for ( i=0, ien=oldSort.length ; i<ien ; i++ ) {
35691				colIdx = oldSort[i].src;
35692	
35693				// Remove column sorting
35694				$( _pluck( settings.aoData, 'anCells', colIdx ) )
35695					.removeClass( sortClass + (i<2 ? i+1 : 3) );
35696			}
35697	
35698			// Add new column sorting
35699			for ( i=0, ien=sort.length ; i<ien ; i++ ) {
35700				colIdx = sort[i].src;
35701	
35702				$( _pluck( settings.aoData, 'anCells', colIdx ) )
35703					.addClass( sortClass + (i<2 ? i+1 : 3) );
35704			}
35705		}
35706	
35707		settings.aLastSort = sort;
35708	}
35709	
35710	
35711	// Get the data to sort a column, be it from cache, fresh (populating the
35712	// cache), or from a sort formatter
35713	function _fnSortData( settings, idx )
35714	{
35715		// Custom sorting function - provided by the sort data type
35716		var column = settings.aoColumns[ idx ];
35717		var customSort = DataTable.ext.order[ column.sSortDataType ];
35718		var customData;
35719	
35720		if ( customSort ) {
35721			customData = customSort.call( settings.oInstance, settings, idx,
35722				_fnColumnIndexToVisible( settings, idx )
35723			);
35724		}
35725	
35726		// Use / populate cache
35727		var row, cellData;
35728		var formatter = DataTable.ext.type.order[ column.sType+"-pre" ];
35729	
35730		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
35731			row = settings.aoData[i];
35732	
35733			if ( ! row._aSortData ) {
35734				row._aSortData = [];
35735			}
35736	
35737			if ( ! row._aSortData[idx] || customSort ) {
35738				cellData = customSort ?
35739					customData[i] : // If there was a custom sort function, use data from there
35740					_fnGetCellData( settings, i, idx, 'sort' );
35741	
35742				row._aSortData[ idx ] = formatter ?
35743					formatter( cellData ) :
35744					cellData;
35745			}
35746		}
35747	}
35748	
35749	
35750	
35751	/**
35752	 * Save the state of a table
35753	 *  @param {object} oSettings dataTables settings object
35754	 *  @memberof DataTable#oApi
35755	 */
35756	function _fnSaveState ( settings )
35757	{
35758		if ( !settings.oFeatures.bStateSave || settings.bDestroying )
35759		{
35760			return;
35761		}
35762	
35763		/* Store the interesting variables */
35764		var state = {
35765			time:    +new Date(),
35766			start:   settings._iDisplayStart,
35767			length:  settings._iDisplayLength,
35768			order:   $.extend( true, [], settings.aaSorting ),
35769			search:  _fnSearchToCamel( settings.oPreviousSearch ),
35770			columns: $.map( settings.aoColumns, function ( col, i ) {
35771				return {
35772					visible: col.bVisible,
35773					search: _fnSearchToCamel( settings.aoPreSearchCols[i] )
35774				};
35775			} )
35776		};
35777	
35778		_fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] );
35779	
35780		settings.oSavedState = state;
35781		settings.fnStateSaveCallback.call( settings.oInstance, settings, state );
35782	}
35783	
35784	
35785	/**
35786	 * Attempt to load a saved table state
35787	 *  @param {object} oSettings dataTables settings object
35788	 *  @param {object} oInit DataTables init object so we can override settings
35789	 *  @memberof DataTable#oApi
35790	 */
35791	function _fnLoadState ( settings, oInit )
35792	{
35793		var i, ien;
35794		var columns = settings.aoColumns;
35795	
35796		if ( ! settings.oFeatures.bStateSave ) {
35797			return;
35798		}
35799	
35800		var state = settings.fnStateLoadCallback.call( settings.oInstance, settings );
35801		if ( ! state || ! state.time ) {
35802			return;
35803		}
35804	
35805		/* Allow custom and plug-in manipulation functions to alter the saved data set and
35806		 * cancelling of loading by returning false
35807		 */
35808		var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, state] );
35809		if ( $.inArray( false, abStateLoad ) !== -1 ) {
35810			return;
35811		}
35812	
35813		/* Reject old data */
35814		var duration = settings.iStateDuration;
35815		if ( duration > 0 && state.time < +new Date() - (duration*1000) ) {
35816			return;
35817		}
35818	
35819		// Number of columns have changed - all bets are off, no restore of settings
35820		if ( columns.length !== state.columns.length ) {
35821			return;
35822		}
35823	
35824		// Store the saved state so it might be accessed at any time
35825		settings.oLoadedState = $.extend( true, {}, state );
35826	
35827		// Restore key features - todo - for 1.11 this needs to be done by
35828		// subscribed events
35829		if ( state.start !== undefined ) {
35830			settings._iDisplayStart    = state.start;
35831			settings.iInitDisplayStart = state.start;
35832		}
35833		if ( state.length !== undefined ) {
35834			settings._iDisplayLength   = state.length;
35835		}
35836	
35837		// Order
35838		if ( state.order !== undefined ) {
35839			settings.aaSorting = [];
35840			$.each( state.order, function ( i, col ) {
35841				settings.aaSorting.push( col[0] >= columns.length ?
35842					[ 0, col[1] ] :
35843					col
35844				);
35845			} );
35846		}
35847	
35848		// Search
35849		if ( state.search !== undefined ) {
35850			$.extend( settings.oPreviousSearch, _fnSearchToHung( state.search ) );
35851		}
35852	
35853		// Columns
35854		for ( i=0, ien=state.columns.length ; i<ien ; i++ ) {
35855			var col = state.columns[i];
35856	
35857			// Visibility
35858			if ( col.visible !== undefined ) {
35859				columns[i].bVisible = col.visible;
35860			}
35861	
35862			// Search
35863			if ( col.search !== undefined ) {
35864				$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );
35865			}
35866		}
35867	
35868		_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, state] );
35869	}
35870	
35871	
35872	/**
35873	 * Return the settings object for a particular table
35874	 *  @param {node} table table we are using as a dataTable
35875	 *  @returns {object} Settings object - or null if not found
35876	 *  @memberof DataTable#oApi
35877	 */
35878	function _fnSettingsFromNode ( table )
35879	{
35880		var settings = DataTable.settings;
35881		var idx = $.inArray( table, _pluck( settings, 'nTable' ) );
35882	
35883		return idx !== -1 ?
35884			settings[ idx ] :
35885			null;
35886	}
35887	
35888	
35889	/**
35890	 * Log an error message
35891	 *  @param {object} settings dataTables settings object
35892	 *  @param {int} level log error messages, or display them to the user
35893	 *  @param {string} msg error message
35894	 *  @param {int} tn Technical note id to get more information about the error.
35895	 *  @memberof DataTable#oApi
35896	 */
35897	function _fnLog( settings, level, msg, tn )
35898	{
35899		msg = 'DataTables warning: '+
35900			(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;
35901	
35902		if ( tn ) {
35903			msg += '. For more information about this error, please see '+
35904			'http://datatables.net/tn/'+tn;
35905		}
35906	
35907		if ( ! level  ) {
35908			// Backwards compatibility pre 1.10
35909			var ext = DataTable.ext;
35910			var type = ext.sErrMode || ext.errMode;
35911	
35912			if ( settings ) {
35913				_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
35914			}
35915	
35916			if ( type == 'alert' ) {
35917				alert( msg );
35918			}
35919			else if ( type == 'throw' ) {
35920				throw new Error(msg);
35921			}
35922			else if ( typeof type == 'function' ) {
35923				type( settings, tn, msg );
35924			}
35925		}
35926		else if ( window.console && console.log ) {
35927			console.log( msg );
35928		}
35929	}
35930	
35931	
35932	/**
35933	 * See if a property is defined on one object, if so assign it to the other object
35934	 *  @param {object} ret target object
35935	 *  @param {object} src source object
35936	 *  @param {string} name property
35937	 *  @param {string} [mappedName] name to map too - optional, name used if not given
35938	 *  @memberof DataTable#oApi
35939	 */
35940	function _fnMap( ret, src, name, mappedName )
35941	{
35942		if ( $.isArray( name ) ) {
35943			$.each( name, function (i, val) {
35944				if ( $.isArray( val ) ) {
35945					_fnMap( ret, src, val[0], val[1] );
35946				}
35947				else {
35948					_fnMap( ret, src, val );
35949				}
35950			} );
35951	
35952			return;
35953		}
35954	
35955		if ( mappedName === undefined ) {
35956			mappedName = name;
35957		}
35958	
35959		if ( src[name] !== undefined ) {
35960			ret[mappedName] = src[name];
35961		}
35962	}
35963	
35964	
35965	/**
35966	 * Extend objects - very similar to jQuery.extend, but deep copy objects, and
35967	 * shallow copy arrays. The reason we need to do this, is that we don't want to
35968	 * deep copy array init values (such as aaSorting) since the dev wouldn't be
35969	 * able to override them, but we do want to deep copy arrays.
35970	 *  @param {object} out Object to extend
35971	 *  @param {object} extender Object from which the properties will be applied to
35972	 *      out
35973	 *  @param {boolean} breakRefs If true, then arrays will be sliced to take an
35974	 *      independent copy with the exception of the `data` or `aaData` parameters
35975	 *      if they are present. This is so you can pass in a collection to
35976	 *      DataTables and have that used as your data source without breaking the
35977	 *      references
35978	 *  @returns {object} out Reference, just for convenience - out === the return.
35979	 *  @memberof DataTable#oApi
35980	 *  @todo This doesn't take account of arrays inside the deep copied objects.
35981	 */
35982	function _fnExtend( out, extender, breakRefs )
35983	{
35984		var val;
35985	
35986		for ( var prop in extender ) {
35987			if ( extender.hasOwnProperty(prop) ) {
35988				val = extender[prop];
35989	
35990				if ( $.isPlainObject( val ) ) {
35991					if ( ! $.isPlainObject( out[prop] ) ) {
35992						out[prop] = {};
35993					}
35994					$.extend( true, out[prop], val );
35995				}
35996				else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {
35997					out[prop] = val.slice();
35998				}
35999				else {
36000					out[prop] = val;
36001				}
36002			}
36003		}
36004	
36005		return out;
36006	}
36007	
36008	
36009	/**
36010	 * Bind an event handers to allow a click or return key to activate the callback.
36011	 * This is good for accessibility since a return on the keyboard will have the
36012	 * same effect as a click, if the element has focus.
36013	 *  @param {element} n Element to bind the action to
36014	 *  @param {object} oData Data object to pass to the triggered function
36015	 *  @param {function} fn Callback function for when the event is triggered
36016	 *  @memberof DataTable#oApi
36017	 */
36018	function _fnBindAction( n, oData, fn )
36019	{
36020		$(n)
36021			.bind( 'click.DT', oData, function (e) {
36022					n.blur(); // Remove focus outline for mouse users
36023					fn(e);
36024				} )
36025			.bind( 'keypress.DT', oData, function (e){
36026					if ( e.which === 13 ) {
36027						e.preventDefault();
36028						fn(e);
36029					}
36030				} )
36031			.bind( 'selectstart.DT', function () {
36032					/* Take the brutal approach to cancelling text selection */
36033					return false;
36034				} );
36035	}
36036	
36037	
36038	/**
36039	 * Register a callback function. Easily allows a callback function to be added to
36040	 * an array store of callback functions that can then all be called together.
36041	 *  @param {object} oSettings dataTables settings object
36042	 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
36043	 *  @param {function} fn Function to be called back
36044	 *  @param {string} sName Identifying name for the callback (i.e. a label)
36045	 *  @memberof DataTable#oApi
36046	 */
36047	function _fnCallbackReg( oSettings, sStore, fn, sName )
36048	{
36049		if ( fn )
36050		{
36051			oSettings[sStore].push( {
36052				"fn": fn,
36053				"sName": sName
36054			} );
36055		}
36056	}
36057	
36058	
36059	/**
36060	 * Fire callback functions and trigger events. Note that the loop over the
36061	 * callback array store is done backwards! Further note that you do not want to
36062	 * fire off triggers in time sensitive applications (for example cell creation)
36063	 * as its slow.
36064	 *  @param {object} settings dataTables settings object
36065	 *  @param {string} callbackArr Name of the array storage for the callbacks in
36066	 *      oSettings
36067	 *  @param {string} eventName Name of the jQuery custom event to trigger. If
36068	 *      null no trigger is fired
36069	 *  @param {array} args Array of arguments to pass to the callback function /
36070	 *      trigger
36071	 *  @memberof DataTable#oApi
36072	 */
36073	function _fnCallbackFire( settings, callbackArr, eventName, args )
36074	{
36075		var ret = [];
36076	
36077		if ( callbackArr ) {
36078			ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {
36079				return val.fn.apply( settings.oInstance, args );
36080			} );
36081		}
36082	
36083		if ( eventName !== null ) {
36084			var e = $.Event( eventName+'.dt' );
36085	
36086			$(settings.nTable).trigger( e, args );
36087	
36088			ret.push( e.result );
36089		}
36090	
36091		return ret;
36092	}
36093	
36094	
36095	function _fnLengthOverflow ( settings )
36096	{
36097		var
36098			start = settings._iDisplayStart,
36099			end = settings.fnDisplayEnd(),
36100			len = settings._iDisplayLength;
36101	
36102		/* If we have space to show extra rows (backing up from the end point - then do so */
36103		if ( start >= end )
36104		{
36105			start = end - len;
36106		}
36107	
36108		// Keep the start record on the current page
36109		start -= (start % len);
36110	
36111		if ( len === -1 || start < 0 )
36112		{
36113			start = 0;
36114		}
36115	
36116		settings._iDisplayStart = start;
36117	}
36118	
36119	
36120	function _fnRenderer( settings, type )
36121	{
36122		var renderer = settings.renderer;
36123		var host = DataTable.ext.renderer[type];
36124	
36125		if ( $.isPlainObject( renderer ) && renderer[type] ) {
36126			// Specific renderer for this type. If available use it, otherwise use
36127			// the default.
36128			return host[renderer[type]] || host._;
36129		}
36130		else if ( typeof renderer === 'string' ) {
36131			// Common renderer - if there is one available for this type use it,
36132			// otherwise use the default
36133			return host[renderer] || host._;
36134		}
36135	
36136		// Use the default
36137		return host._;
36138	}
36139	
36140	
36141	/**
36142	 * Detect the data source being used for the table. Used to simplify the code
36143	 * a little (ajax) and to make it compress a little smaller.
36144	 *
36145	 *  @param {object} settings dataTables settings object
36146	 *  @returns {string} Data source
36147	 *  @memberof DataTable#oApi
36148	 */
36149	function _fnDataSource ( settings )
36150	{
36151		if ( settings.oFeatures.bServerSide ) {
36152			return 'ssp';
36153		}
36154		else if ( settings.ajax || settings.sAjaxSource ) {
36155			return 'ajax';
36156		}
36157		return 'dom';
36158	}
36159	
36160
36161	DataTable = function( options )
36162	{
36163		/**
36164		 * Perform a jQuery selector action on the table's TR elements (from the tbody) and
36165		 * return the resulting jQuery object.
36166		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
36167		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
36168		 *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
36169		 *    criterion ("applied") or all TR elements (i.e. no filter).
36170		 *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
36171		 *    Can be either 'current', whereby the current sorting of the table is used, or
36172		 *    'original' whereby the original order the data was read into the table is used.
36173		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
36174		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
36175		 *    'current' and filter is 'applied', regardless of what they might be given as.
36176		 *  @returns {object} jQuery object, filtered by the given selector.
36177		 *  @dtopt API
36178		 *  @deprecated Since v1.10
36179		 *
36180		 *  @example
36181		 *    $(document).ready(function() {
36182		 *      var oTable = $('#example').dataTable();
36183		 *
36184		 *      // Highlight every second row
36185		 *      oTable.$('tr:odd').css('backgroundColor', 'blue');
36186		 *    } );
36187		 *
36188		 *  @example
36189		 *    $(document).ready(function() {
36190		 *      var oTable = $('#example').dataTable();
36191		 *
36192		 *      // Filter to rows with 'Webkit' in them, add a background colour and then
36193		 *      // remove the filter, thus highlighting the 'Webkit' rows only.
36194		 *      oTable.fnFilter('Webkit');
36195		 *      oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
36196		 *      oTable.fnFilter('');
36197		 *    } );
36198		 */
36199		this.$ = function ( sSelector, oOpts )
36200		{
36201			return this.api(true).$( sSelector, oOpts );
36202		};
36203		
36204		
36205		/**
36206		 * Almost identical to $ in operation, but in this case returns the data for the matched
36207		 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
36208		 * rather than any descendants, so the data can be obtained for the row/cell. If matching
36209		 * rows are found, the data returned is the original data array/object that was used to
36210		 * create the row (or a generated array if from a DOM source).
36211		 *
36212		 * This method is often useful in-combination with $ where both functions are given the
36213		 * same parameters and the array indexes will match identically.
36214		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
36215		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
36216		 *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
36217		 *    criterion ("applied") or all elements (i.e. no filter).
36218		 *  @param {string} [oOpts.order=current] Order of the data in the processed array.
36219		 *    Can be either 'current', whereby the current sorting of the table is used, or
36220		 *    'original' whereby the original order the data was read into the table is used.
36221		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
36222		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
36223		 *    'current' and filter is 'applied', regardless of what they might be given as.
36224		 *  @returns {array} Data for the matched elements. If any elements, as a result of the
36225		 *    selector, were not TR, TD or TH elements in the DataTable, they will have a null
36226		 *    entry in the array.
36227		 *  @dtopt API
36228		 *  @deprecated Since v1.10
36229		 *
36230		 *  @example
36231		 *    $(document).ready(function() {
36232		 *      var oTable = $('#example').dataTable();
36233		 *
36234		 *      // Get the data from the first row in the table
36235		 *      var data = oTable._('tr:first');
36236		 *
36237		 *      // Do something useful with the data
36238		 *      alert( "First cell is: "+data[0] );
36239		 *    } );
36240		 *
36241		 *  @example
36242		 *    $(document).ready(function() {
36243		 *      var oTable = $('#example').dataTable();
36244		 *
36245		 *      // Filter to 'Webkit' and get all data for
36246		 *      oTable.fnFilter('Webkit');
36247		 *      var data = oTable._('tr', {"search": "applied"});
36248		 *
36249		 *      // Do something with the data
36250		 *      alert( data.length+" rows matched the search" );
36251		 *    } );
36252		 */
36253		this._ = function ( sSelector, oOpts )
36254		{
36255			return this.api(true).rows( sSelector, oOpts ).data();
36256		};
36257		
36258		
36259		/**
36260		 * Create a DataTables Api instance, with the currently selected tables for
36261		 * the Api's context.
36262		 * @param {boolean} [traditional=false] Set the API instance's context to be
36263		 *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was
36264		 *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),
36265		 *   or if all tables captured in the jQuery object should be used.
36266		 * @return {DataTables.Api}
36267		 */
36268		this.api = function ( traditional )
36269		{
36270			return traditional ?
36271				new _Api(
36272					_fnSettingsFromNode( this[ _ext.iApiIndex ] )
36273				) :
36274				new _Api( this );
36275		};
36276		
36277		
36278		/**
36279		 * Add a single new row or multiple rows of data to the table. Please note
36280		 * that this is suitable for client-side processing only - if you are using
36281		 * server-side processing (i.e. "bServerSide": true), then to add data, you
36282		 * must add it to the data source, i.e. the server-side, through an Ajax call.
36283		 *  @param {array|object} data The data to be added to the table. This can be:
36284		 *    <ul>
36285		 *      <li>1D array of data - add a single row with the data provided</li>
36286		 *      <li>2D array of arrays - add multiple rows in a single call</li>
36287		 *      <li>object - data object when using <i>mData</i></li>
36288		 *      <li>array of objects - multiple data objects when using <i>mData</i></li>
36289		 *    </ul>
36290		 *  @param {bool} [redraw=true] redraw the table or not
36291		 *  @returns {array} An array of integers, representing the list of indexes in
36292		 *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
36293		 *    the table.
36294		 *  @dtopt API
36295		 *  @deprecated Since v1.10
36296		 *
36297		 *  @example
36298		 *    // Global var for counter
36299		 *    var giCount = 2;
36300		 *
36301		 *    $(document).ready(function() {
36302		 *      $('#example').dataTable();
36303		 *    } );
36304		 *
36305		 *    function fnClickAddRow() {
36306		 *      $('#example').dataTable().fnAddData( [
36307		 *        giCount+".1",
36308		 *        giCount+".2",
36309		 *        giCount+".3",
36310		 *        giCount+".4" ]
36311		 *      );
36312		 *
36313		 *      giCount++;
36314		 *    }
36315		 */
36316		this.fnAddData = function( data, redraw )
36317		{
36318			var api = this.api( true );
36319		
36320			/* Check if we want to add multiple rows or not */
36321			var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
36322				api.rows.add( data ) :
36323				api.row.add( data );
36324		
36325			if ( redraw === undefined || redraw ) {
36326				api.draw();
36327			}
36328		
36329			return rows.flatten().toArray();
36330		};
36331		
36332		
36333		/**
36334		 * This function will make DataTables recalculate the column sizes, based on the data
36335		 * contained in the table and the sizes applied to the columns (in the DOM, CSS or
36336		 * through the sWidth parameter). This can be useful when the width of the table's
36337		 * parent element changes (for example a window resize).
36338		 *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
36339		 *  @dtopt API
36340		 *  @deprecated Since v1.10
36341		 *
36342		 *  @example
36343		 *    $(document).ready(function() {
36344		 *      var oTable = $('#example').dataTable( {
36345		 *        "sScrollY": "200px",
36346		 *        "bPaginate": false
36347		 *      } );
36348		 *
36349		 *      $(window).bind('resize', function () {
36350		 *        oTable.fnAdjustColumnSizing();
36351		 *      } );
36352		 *    } );
36353		 */
36354		this.fnAdjustColumnSizing = function ( bRedraw )
36355		{
36356			var api = this.api( true ).columns.adjust();
36357			var settings = api.settings()[0];
36358			var scroll = settings.oScroll;
36359		
36360			if ( bRedraw === undefined || bRedraw ) {
36361				api.draw( false );
36362			}
36363			else if ( scroll.sX !== "" || scroll.sY !== "" ) {
36364				/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
36365				_fnScrollDraw( settings );
36366			}
36367		};
36368		
36369		
36370		/**
36371		 * Quickly and simply clear a table
36372		 *  @param {bool} [bRedraw=true] redraw the table or not
36373		 *  @dtopt API
36374		 *  @deprecated Since v1.10
36375		 *
36376		 *  @example
36377		 *    $(document).ready(function() {
36378		 *      var oTable = $('#example').dataTable();
36379		 *
36380		 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
36381		 *      oTable.fnClearTable();
36382		 *    } );
36383		 */
36384		this.fnClearTable = function( bRedraw )
36385		{
36386			var api = this.api( true ).clear();
36387		
36388			if ( bRedraw === undefined || bRedraw ) {
36389				api.draw();
36390			}
36391		};
36392		
36393		
36394		/**
36395		 * The exact opposite of 'opening' a row, this function will close any rows which
36396		 * are currently 'open'.
36397		 *  @param {node} nTr the table row to 'close'
36398		 *  @returns {int} 0 on success, or 1 if failed (can't find the row)
36399		 *  @dtopt API
36400		 *  @deprecated Since v1.10
36401		 *
36402		 *  @example
36403		 *    $(document).ready(function() {
36404		 *      var oTable;
36405		 *
36406		 *      // 'open' an information row when a row is clicked on
36407		 *      $('#example tbody tr').click( function () {
36408		 *        if ( oTable.fnIsOpen(this) ) {
36409		 *          oTable.fnClose( this );
36410		 *        } else {
36411		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
36412		 *        }
36413		 *      } );
36414		 *
36415		 *      oTable = $('#example').dataTable();
36416		 *    } );
36417		 */
36418		this.fnClose = function( nTr )
36419		{
36420			this.api( true ).row( nTr ).child.hide();
36421		};
36422		
36423		
36424		/**
36425		 * Remove a row for the table
36426		 *  @param {mixed} target The index of the row from aoData to be deleted, or
36427		 *    the TR element you want to delete
36428		 *  @param {function|null} [callBack] Callback function
36429		 *  @param {bool} [redraw=true] Redraw the table or not
36430		 *  @returns {array} The row that was deleted
36431		 *  @dtopt API
36432		 *  @deprecated Since v1.10
36433		 *
36434		 *  @example
36435		 *    $(document).ready(function() {
36436		 *      var oTable = $('#example').dataTable();
36437		 *
36438		 *      // Immediately remove the first row
36439		 *      oTable.fnDeleteRow( 0 );
36440		 *    } );
36441		 */
36442		this.fnDeleteRow = function( target, callback, redraw )
36443		{
36444			var api = this.api( true );
36445			var rows = api.rows( target );
36446			var settings = rows.settings()[0];
36447			var data = settings.aoData[ rows[0][0] ];
36448		
36449			rows.remove();
36450		
36451			if ( callback ) {
36452				callback.call( this, settings, data );
36453			}
36454		
36455			if ( redraw === undefined || redraw ) {
36456				api.draw();
36457			}
36458		
36459			return data;
36460		};
36461		
36462		
36463		/**
36464		 * Restore the table to it's original state in the DOM by removing all of DataTables
36465		 * enhancements, alterations to the DOM structure of the table and event listeners.
36466		 *  @param {boolean} [remove=false] Completely remove the table from the DOM
36467		 *  @dtopt API
36468		 *  @deprecated Since v1.10
36469		 *
36470		 *  @example
36471		 *    $(document).ready(function() {
36472		 *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
36473		 *      var oTable = $('#example').dataTable();
36474		 *      oTable.fnDestroy();
36475		 *    } );
36476		 */
36477		this.fnDestroy = function ( remove )
36478		{
36479			this.api( true ).destroy( remove );
36480		};
36481		
36482		
36483		/**
36484		 * Redraw the table
36485		 *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
36486		 *  @dtopt API
36487		 *  @deprecated Since v1.10
36488		 *
36489		 *  @example
36490		 *    $(document).ready(function() {
36491		 *      var oTable = $('#example').dataTable();
36492		 *
36493		 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
36494		 *      oTable.fnDraw();
36495		 *    } );
36496		 */
36497		this.fnDraw = function( complete )
36498		{
36499			// Note that this isn't an exact match to the old call to _fnDraw - it takes
36500			// into account the new data, but can hold position.
36501			this.api( true ).draw( complete );
36502		};
36503		
36504		
36505		/**
36506		 * Filter the input based on data
36507		 *  @param {string} sInput String to filter the table on
36508		 *  @param {int|null} [iColumn] Column to limit filtering to
36509		 *  @param {bool} [bRegex=false] Treat as regular expression or not
36510		 *  @param {bool} [bSmart=true] Perform smart filtering or not
36511		 *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
36512		 *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
36513		 *  @dtopt API
36514		 *  @deprecated Since v1.10
36515		 *
36516		 *  @example
36517		 *    $(document).ready(function() {
36518		 *      var oTable = $('#example').dataTable();
36519		 *
36520		 *      // Sometime later - filter...
36521		 *      oTable.fnFilter( 'test string' );
36522		 *    } );
36523		 */
36524		this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
36525		{
36526			var api = this.api( true );
36527		
36528			if ( iColumn === null || iColumn === undefined ) {
36529				api.search( sInput, bRegex, bSmart, bCaseInsensitive );
36530			}
36531			else {
36532				api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
36533			}
36534		
36535			api.draw();
36536		};
36537		
36538		
36539		/**
36540		 * Get the data for the whole table, an individual row or an individual cell based on the
36541		 * provided parameters.
36542		 *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
36543		 *    a TR node then the data source for the whole row will be returned. If given as a
36544		 *    TD/TH cell node then iCol will be automatically calculated and the data for the
36545		 *    cell returned. If given as an integer, then this is treated as the aoData internal
36546		 *    data index for the row (see fnGetPosition) and the data for that row used.
36547		 *  @param {int} [col] Optional column index that you want the data of.
36548		 *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
36549		 *    returned. If mRow is defined, just data for that row, and is iCol is
36550		 *    defined, only data for the designated cell is returned.
36551		 *  @dtopt API
36552		 *  @deprecated Since v1.10
36553		 *
36554		 *  @example
36555		 *    // Row data
36556		 *    $(document).ready(function() {
36557		 *      oTable = $('#example').dataTable();
36558		 *
36559		 *      oTable.$('tr').click( function () {
36560		 *        var data = oTable.fnGetData( this );
36561		 *        // ... do something with the array / object of data for the row
36562		 *      } );
36563		 *    } );
36564		 *
36565		 *  @example
36566		 *    // Individual cell data
36567		 *    $(document).ready(function() {
36568		 *      oTable = $('#example').dataTable();
36569		 *
36570		 *      oTable.$('td').click( function () {
36571		 *        var sData = oTable.fnGetData( this );
36572		 *        alert( 'The cell clicked on had the value of '+sData );
36573		 *      } );
36574		 *    } );
36575		 */
36576		this.fnGetData = function( src, col )
36577		{
36578			var api = this.api( true );
36579		
36580			if ( src !== undefined ) {
36581				var type = src.nodeName ? src.nodeName.toLowerCase() : '';
36582		
36583				return col !== undefined || type == 'td' || type == 'th' ?
36584					api.cell( src, col ).data() :
36585					api.row( src ).data() || null;
36586			}
36587		
36588			return api.data().toArray();
36589		};
36590		
36591		
36592		/**
36593		 * Get an array of the TR nodes that are used in the table's body. Note that you will
36594		 * typically want to use the '$' API method in preference to this as it is more
36595		 * flexible.
36596		 *  @param {int} [iRow] Optional row index for the TR element you want
36597		 *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
36598		 *    in the table's body, or iRow is defined, just the TR element requested.
36599		 *  @dtopt API
36600		 *  @deprecated Since v1.10
36601		 *
36602		 *  @example
36603		 *    $(document).ready(function() {
36604		 *      var oTable = $('#example').dataTable();
36605		 *
36606		 *      // Get the nodes from the table
36607		 *      var nNodes = oTable.fnGetNodes( );
36608		 *    } );
36609		 */
36610		this.fnGetNodes = function( iRow )
36611		{
36612			var api = this.api( true );
36613		
36614			return iRow !== undefined ?
36615				api.row( iRow ).node() :
36616				api.rows().nodes().flatten().toArray();
36617		};
36618		
36619		
36620		/**
36621		 * Get the array indexes of a particular cell from it's DOM element
36622		 * and column index including hidden columns
36623		 *  @param {node} node this can either be a TR, TD or TH in the table's body
36624		 *  @returns {int} If nNode is given as a TR, then a single index is returned, or
36625		 *    if given as a cell, an array of [row index, column index (visible),
36626		 *    column index (all)] is given.
36627		 *  @dtopt API
36628		 *  @deprecated Since v1.10
36629		 *
36630		 *  @example
36631		 *    $(document).ready(function() {
36632		 *      $('#example tbody td').click( function () {
36633		 *        // Get the position of the current data from the node
36634		 *        var aPos = oTable.fnGetPosition( this );
36635		 *
36636		 *        // Get the data array for this row
36637		 *        var aData = oTable.fnGetData( aPos[0] );
36638		 *
36639		 *        // Update the data array and return the value
36640		 *        aData[ aPos[1] ] = 'clicked';
36641		 *        this.innerHTML = 'clicked';
36642		 *      } );
36643		 *
36644		 *      // Init DataTables
36645		 *      oTable = $('#example').dataTable();
36646		 *    } );
36647		 */
36648		this.fnGetPosition = function( node )
36649		{
36650			var api = this.api( true );
36651			var nodeName = node.nodeName.toUpperCase();
36652		
36653			if ( nodeName == 'TR' ) {
36654				return api.row( node ).index();
36655			}
36656			else if ( nodeName == 'TD' || nodeName == 'TH' ) {
36657				var cell = api.cell( node ).index();
36658		
36659				return [
36660					cell.row,
36661					cell.columnVisible,
36662					cell.column
36663				];
36664			}
36665			return null;
36666		};
36667		
36668		
36669		/**
36670		 * Check to see if a row is 'open' or not.
36671		 *  @param {node} nTr the table row to check
36672		 *  @returns {boolean} true if the row is currently open, false otherwise
36673		 *  @dtopt API
36674		 *  @deprecated Since v1.10
36675		 *
36676		 *  @example
36677		 *    $(document).ready(function() {
36678		 *      var oTable;
36679		 *
36680		 *      // 'open' an information row when a row is clicked on
36681		 *      $('#example tbody tr').click( function () {
36682		 *        if ( oTable.fnIsOpen(this) ) {
36683		 *          oTable.fnClose( this );
36684		 *        } else {
36685		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
36686		 *        }
36687		 *      } );
36688		 *
36689		 *      oTable = $('#example').dataTable();
36690		 *    } );
36691		 */
36692		this.fnIsOpen = function( nTr )
36693		{
36694			return this.api( true ).row( nTr ).child.isShown();
36695		};
36696		
36697		
36698		/**
36699		 * This function will place a new row directly after a row which is currently
36700		 * on display on the page, with the HTML contents that is passed into the
36701		 * function. This can be used, for example, to ask for confirmation that a
36702		 * particular record should be deleted.
36703		 *  @param {node} nTr The table row to 'open'
36704		 *  @param {string|node|jQuery} mHtml The HTML to put into the row
36705		 *  @param {string} sClass Class to give the new TD cell
36706		 *  @returns {node} The row opened. Note that if the table row passed in as the
36707		 *    first parameter, is not found in the table, this method will silently
36708		 *    return.
36709		 *  @dtopt API
36710		 *  @deprecated Since v1.10
36711		 *
36712		 *  @example
36713		 *    $(document).ready(function() {
36714		 *      var oTable;
36715		 *
36716		 *      // 'open' an information row when a row is clicked on
36717		 *      $('#example tbody tr').click( function () {
36718		 *        if ( oTable.fnIsOpen(this) ) {
36719		 *          oTable.fnClose( this );
36720		 *        } else {
36721		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
36722		 *        }
36723		 *      } );
36724		 *
36725		 *      oTable = $('#example').dataTable();
36726		 *    } );
36727		 */
36728		this.fnOpen = function( nTr, mHtml, sClass )
36729		{
36730			return this.api( true )
36731				.row( nTr )
36732				.child( mHtml, sClass )
36733				.show()
36734				.child()[0];
36735		};
36736		
36737		
36738		/**
36739		 * Change the pagination - provides the internal logic for pagination in a simple API
36740		 * function. With this function you can have a DataTables table go to the next,
36741		 * previous, first or last pages.
36742		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
36743		 *    or page number to jump to (integer), note that page 0 is the first page.
36744		 *  @param {bool} [bRedraw=true] Redraw the table or not
36745		 *  @dtopt API
36746		 *  @deprecated Since v1.10
36747		 *
36748		 *  @example
36749		 *    $(document).ready(function() {
36750		 *      var oTable = $('#example').dataTable();
36751		 *      oTable.fnPageChange( 'next' );
36752		 *    } );
36753		 */
36754		this.fnPageChange = function ( mAction, bRedraw )
36755		{
36756			var api = this.api( true ).page( mAction );
36757		
36758			if ( bRedraw === undefined || bRedraw ) {
36759				api.draw(false);
36760			}
36761		};
36762		
36763		
36764		/**
36765		 * Show a particular column
36766		 *  @param {int} iCol The column whose display should be changed
36767		 *  @param {bool} bShow Show (true) or hide (false) the column
36768		 *  @param {bool} [bRedraw=true] Redraw the table or not
36769		 *  @dtopt API
36770		 *  @deprecated Since v1.10
36771		 *
36772		 *  @example
36773		 *    $(document).ready(function() {
36774		 *      var oTable = $('#example').dataTable();
36775		 *
36776		 *      // Hide the second column after initialisation
36777		 *      oTable.fnSetColumnVis( 1, false );
36778		 *    } );
36779		 */
36780		this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
36781		{
36782			var api = this.api( true ).column( iCol ).visible( bShow );
36783		
36784			if ( bRedraw === undefined || bRedraw ) {
36785				api.columns.adjust().draw();
36786			}
36787		};
36788		
36789		
36790		/**
36791		 * Get the settings for a particular table for external manipulation
36792		 *  @returns {object} DataTables settings object. See
36793		 *    {@link DataTable.models.oSettings}
36794		 *  @dtopt API
36795		 *  @deprecated Since v1.10
36796		 *
36797		 *  @example
36798		 *    $(document).ready(function() {
36799		 *      var oTable = $('#example').dataTable();
36800		 *      var oSettings = oTable.fnSettings();
36801		 *
36802		 *      // Show an example parameter from the settings
36803		 *      alert( oSettings._iDisplayStart );
36804		 *    } );
36805		 */
36806		this.fnSettings = function()
36807		{
36808			return _fnSettingsFromNode( this[_ext.iApiIndex] );
36809		};
36810		
36811		
36812		/**
36813		 * Sort the table by a particular column
36814		 *  @param {int} iCol the data index to sort on. Note that this will not match the
36815		 *    'display index' if you have hidden data entries
36816		 *  @dtopt API
36817		 *  @deprecated Since v1.10
36818		 *
36819		 *  @example
36820		 *    $(document).ready(function() {
36821		 *      var oTable = $('#example').dataTable();
36822		 *
36823		 *      // Sort immediately with columns 0 and 1
36824		 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
36825		 *    } );
36826		 */
36827		this.fnSort = function( aaSort )
36828		{
36829			this.api( true ).order( aaSort ).draw();
36830		};
36831		
36832		
36833		/**
36834		 * Attach a sort listener to an element for a given column
36835		 *  @param {node} nNode the element to attach the sort listener to
36836		 *  @param {int} iColumn the column that a click on this node will sort on
36837		 *  @param {function} [fnCallback] callback function when sort is run
36838		 *  @dtopt API
36839		 *  @deprecated Since v1.10
36840		 *
36841		 *  @example
36842		 *    $(document).ready(function() {
36843		 *      var oTable = $('#example').dataTable();
36844		 *
36845		 *      // Sort on column 1, when 'sorter' is clicked on
36846		 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
36847		 *    } );
36848		 */
36849		this.fnSortListener = function( nNode, iColumn, fnCallback )
36850		{
36851			this.api( true ).order.listener( nNode, iColumn, fnCallback );
36852		};
36853		
36854		
36855		/**
36856		 * Update a table cell or row - this method will accept either a single value to
36857		 * update the cell with, an array of values with one element for each column or
36858		 * an object in the same format as the original data source. The function is
36859		 * self-referencing in order to make the multi column updates easier.
36860		 *  @param {object|array|string} mData Data to update the cell/row with
36861		 *  @param {node|int} mRow TR element you want to update or the aoData index
36862		 *  @param {int} [iColumn] The column to update, give as null or undefined to
36863		 *    update a whole row.
36864		 *  @param {bool} [bRedraw=true] Redraw the table or not
36865		 *  @param {bool} [bAction=true] Perform pre-draw actions or not
36866		 *  @returns {int} 0 on success, 1 on error
36867		 *  @dtopt API
36868		 *  @deprecated Since v1.10
36869		 *
36870		 *  @example
36871		 *    $(document).ready(function() {
36872		 *      var oTable = $('#example').dataTable();
36873		 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
36874		 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
36875		 *    } );
36876		 */
36877		this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
36878		{
36879			var api = this.api( true );
36880		
36881			if ( iColumn === undefined || iColumn === null ) {
36882				api.row( mRow ).data( mData );
36883			}
36884			else {
36885				api.cell( mRow, iColumn ).data( mData );
36886			}
36887		
36888			if ( bAction === undefined || bAction ) {
36889				api.columns.adjust();
36890			}
36891		
36892			if ( bRedraw === undefined || bRedraw ) {
36893				api.draw();
36894			}
36895			return 0;
36896		};
36897		
36898		
36899		/**
36900		 * Provide a common method for plug-ins to check the version of DataTables being used, in order
36901		 * to ensure compatibility.
36902		 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
36903		 *    formats "X" and "X.Y" are also acceptable.
36904		 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
36905		 *    version, or false if this version of DataTales is not suitable
36906		 *  @method
36907		 *  @dtopt API
36908		 *  @deprecated Since v1.10
36909		 *
36910		 *  @example
36911		 *    $(document).ready(function() {
36912		 *      var oTable = $('#example').dataTable();
36913		 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
36914		 *    } );
36915		 */
36916		this.fnVersionCheck = _ext.fnVersionCheck;
36917		
36918
36919		var _that = this;
36920		var emptyInit = options === undefined;
36921		var len = this.length;
36922
36923		if ( emptyInit ) {
36924			options = {};
36925		}
36926
36927		this.oApi = this.internal = _ext.internal;
36928
36929		// Extend with old style plug-in API methods
36930		for ( var fn in DataTable.ext.internal ) {
36931			if ( fn ) {
36932				this[fn] = _fnExternApiFunc(fn);
36933			}
36934		}
36935
36936		this.each(function() {
36937			// For each initialisation we want to give it a clean initialisation
36938			// object that can be bashed around
36939			var o = {};
36940			var oInit = len > 1 ? // optimisation for single table case
36941				_fnExtend( o, options, true ) :
36942				options;
36943
36944			/*global oInit,_that,emptyInit*/
36945			var i=0, iLen, j, jLen, k, kLen;
36946			var sId = this.getAttribute( 'id' );
36947			var bInitHandedOff = false;
36948			var defaults = DataTable.defaults;
36949			var $this = $(this);
36950			
36951			
36952			/* Sanity check */
36953			if ( this.nodeName.toLowerCase() != 'table' )
36954			{
36955				_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
36956				return;
36957			}
36958			
36959			/* Backwards compatibility for the defaults */
36960			_fnCompatOpts( defaults );
36961			_fnCompatCols( defaults.column );
36962			
36963			/* Convert the camel-case defaults to Hungarian */
36964			_fnCamelToHungarian( defaults, defaults, true );
36965			_fnCamelToHungarian( defaults.column, defaults.column, true );
36966			
36967			/* Setting up the initialisation object */
36968			_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
36969			
36970			
36971			
36972			/* Check to see if we are re-initialising a table */
36973			var allSettings = DataTable.settings;
36974			for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
36975			{
36976				var s = allSettings[i];
36977			
36978				/* Base check on table node */
36979				if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )
36980				{
36981					var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
36982					var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
36983			
36984					if ( emptyInit || bRetrieve )
36985					{
36986						return s.oInstance;
36987					}
36988					else if ( bDestroy )
36989					{
36990						s.oInstance.fnDestroy();
36991						break;
36992					}
36993					else
36994					{
36995						_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
36996						return;
36997					}
36998				}
36999			
37000				/* If the element we are initialising has the same ID as a table which was previously
37001				 * initialised, but the table nodes don't match (from before) then we destroy the old
37002				 * instance by simply deleting it. This is under the assumption that the table has been
37003				 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
37004				 */
37005				if ( s.sTableId == this.id )
37006				{
37007					allSettings.splice( i, 1 );
37008					break;
37009				}
37010			}
37011			
37012			/* Ensure the table has an ID - required for accessibility */
37013			if ( sId === null || sId === "" )
37014			{
37015				sId = "DataTables_Table_"+(DataTable.ext._unique++);
37016				this.id = sId;
37017			}
37018			
37019			/* Create the settings object for this table and set some of the default parameters */
37020			var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
37021				"sDestroyWidth": $this[0].style.width,
37022				"sInstance":     sId,
37023				"sTableId":      sId
37024			} );
37025			oSettings.nTable = this;
37026			oSettings.oApi   = _that.internal;
37027			oSettings.oInit  = oInit;
37028			
37029			allSettings.push( oSettings );
37030			
37031			// Need to add the instance after the instance after the settings object has been added
37032			// to the settings array, so we can self reference the table instance if more than one
37033			oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
37034			
37035			// Backwards compatibility, before we apply all the defaults
37036			_fnCompatOpts( oInit );
37037			
37038			if ( oInit.oLanguage )
37039			{
37040				_fnLanguageCompat( oInit.oLanguage );
37041			}
37042			
37043			// If the length menu is given, but the init display length is not, use the length menu
37044			if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
37045			{
37046				oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
37047					oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
37048			}
37049			
37050			// Apply the defaults and init options to make a single init object will all
37051			// options defined from defaults and instance options.
37052			oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
37053			
37054			
37055			// Map the initialisation options onto the settings object
37056			_fnMap( oSettings.oFeatures, oInit, [
37057				"bPaginate",
37058				"bLengthChange",
37059				"bFilter",
37060				"bSort",
37061				"bSortMulti",
37062				"bInfo",
37063				"bProcessing",
37064				"bAutoWidth",
37065				"bSortClasses",
37066				"bServerSide",
37067				"bDeferRender"
37068			] );
37069			_fnMap( oSettings, oInit, [
37070				"asStripeClasses",
37071				"ajax",
37072				"fnServerData",
37073				"fnFormatNumber",
37074				"sServerMethod",
37075				"aaSorting",
37076				"aaSortingFixed",
37077				"aLengthMenu",
37078				"sPaginationType",
37079				"sAjaxSource",
37080				"sAjaxDataProp",
37081				"iStateDuration",
37082				"sDom",
37083				"bSortCellsTop",
37084				"iTabIndex",
37085				"fnStateLoadCallback",
37086				"fnStateSaveCallback",
37087				"renderer",
37088				"searchDelay",
37089				"rowId",
37090				[ "iCookieDuration", "iStateDuration" ], // backwards compat
37091				[ "oSearch", "oPreviousSearch" ],
37092				[ "aoSearchCols", "aoPreSearchCols" ],
37093				[ "iDisplayLength", "_iDisplayLength" ],
37094				[ "bJQueryUI", "bJUI" ]
37095			] );
37096			_fnMap( oSettings.oScroll, oInit, [
37097				[ "sScrollX", "sX" ],
37098				[ "sScrollXInner", "sXInner" ],
37099				[ "sScrollY", "sY" ],
37100				[ "bScrollCollapse", "bCollapse" ]
37101			] );
37102			_fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
37103			
37104			/* Callback functions which are array driven */
37105			_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
37106			_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
37107			_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
37108			_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
37109			_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
37110			_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
37111			_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
37112			_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
37113			_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
37114			_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
37115			_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
37116			
37117			oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );
37118			
37119			/* Browser support detection */
37120			_fnBrowserDetect( oSettings );
37121			
37122			var oClasses = oSettings.oClasses;
37123			
37124			// @todo Remove in 1.11
37125			if ( oInit.bJQueryUI )
37126			{
37127				/* Use the JUI classes object for display. You could clone the oStdClasses object if
37128				 * you want to have multiple tables with multiple independent classes
37129				 */
37130				$.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );
37131			
37132				if ( oInit.sDom === defaults.sDom && defaults.sDom === "lfrtip" )
37133				{
37134					/* Set the DOM to use a layout suitable for jQuery UI's theming */
37135					oSettings.sDom = '<"H"lfr>t<"F"ip>';
37136				}
37137			
37138				if ( ! oSettings.renderer ) {
37139					oSettings.renderer = 'jqueryui';
37140				}
37141				else if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {
37142					oSettings.renderer.header = 'jqueryui';
37143				}
37144			}
37145			else
37146			{
37147				$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
37148			}
37149			$this.addClass( oClasses.sTable );
37150			
37151			
37152			if ( oSettings.iInitDisplayStart === undefined )
37153			{
37154				/* Display start point, taking into account the save saving */
37155				oSettings.iInitDisplayStart = oInit.iDisplayStart;
37156				oSettings._iDisplayStart = oInit.iDisplayStart;
37157			}
37158			
37159			if ( oInit.iDeferLoading !== null )
37160			{
37161				oSettings.bDeferLoading = true;
37162				var tmp = $.isArray( oInit.iDeferLoading );
37163				oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
37164				oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
37165			}
37166			
37167			/* Language definitions */
37168			var oLanguage = oSettings.oLanguage;
37169			$.extend( true, oLanguage, oInit.oLanguage );
37170			
37171			if ( oLanguage.sUrl !== "" )
37172			{
37173				/* Get the language definitions from a file - because this Ajax call makes the language
37174				 * get async to the remainder of this function we use bInitHandedOff to indicate that
37175				 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
37176				 */
37177				$.ajax( {
37178					dataType: 'json',
37179					url: oLanguage.sUrl,
37180					success: function ( json ) {
37181						_fnLanguageCompat( json );
37182						_fnCamelToHungarian( defaults.oLanguage, json );
37183						$.extend( true, oLanguage, json );
37184						_fnInitialise( oSettings );
37185					},
37186					error: function () {
37187						// Error occurred loading language file, continue on as best we can
37188						_fnInitialise( oSettings );
37189					}
37190				} );
37191				bInitHandedOff = true;
37192			}
37193			
37194			/*
37195			 * Stripes
37196			 */
37197			if ( oInit.asStripeClasses === null )
37198			{
37199				oSettings.asStripeClasses =[
37200					oClasses.sStripeOdd,
37201					oClasses.sStripeEven
37202				];
37203			}
37204			
37205			/* Remove row stripe classes if they are already on the table row */
37206			var stripeClasses = oSettings.asStripeClasses;
37207			var rowOne = $this.children('tbody').find('tr').eq(0);
37208			if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
37209				return rowOne.hasClass(el);
37210			} ) ) !== -1 ) {
37211				$('tbody tr', this).removeClass( stripeClasses.join(' ') );
37212				oSettings.asDestroyStripes = stripeClasses.slice();
37213			}
37214			
37215			/*
37216			 * Columns
37217			 * See if we should load columns automatically or use defined ones
37218			 */
37219			var anThs = [];
37220			var aoColumnsInit;
37221			var nThead = this.getElementsByTagName('thead');
37222			if ( nThead.length !== 0 )
37223			{
37224				_fnDetectHeader( oSettings.aoHeader, nThead[0] );
37225				anThs = _fnGetUniqueThs( oSettings );
37226			}
37227			
37228			/* If not given a column array, generate one with nulls */
37229			if ( oInit.aoColumns === null )
37230			{
37231				aoColumnsInit = [];
37232				for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
37233				{
37234					aoColumnsInit.push( null );
37235				}
37236			}
37237			else
37238			{
37239				aoColumnsInit = oInit.aoColumns;
37240			}
37241			
37242			/* Add the columns */
37243			for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
37244			{
37245				_fnAddColumn( oSettings, anThs ? anThs[i] : null );
37246			}
37247			
37248			/* Apply the column definitions */
37249			_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
37250				_fnColumnOptions( oSettings, iCol, oDef );
37251			} );
37252			
37253			/* HTML5 attribute detection - build an mData object automatically if the
37254			 * attributes are found
37255			 */
37256			if ( rowOne.length ) {
37257				var a = function ( cell, name ) {
37258					return cell.getAttribute( 'data-'+name ) !== null ? name : null;
37259				};
37260			
37261				$( rowOne[0] ).children('th, td').each( function (i, cell) {
37262					var col = oSettings.aoColumns[i];
37263			
37264					if ( col.mData === i ) {
37265						var sort = a( cell, 'sort' ) || a( cell, 'order' );
37266						var filter = a( cell, 'filter' ) || a( cell, 'search' );
37267			
37268						if ( sort !== null || filter !== null ) {
37269							col.mData = {
37270								_:      i+'.display',
37271								sort:   sort !== null   ? i+'.@data-'+sort   : undefined,
37272								type:   sort !== null   ? i+'.@data-'+sort   : undefined,
37273								filter: filter !== null ? i+'.@data-'+filter : undefined
37274							};
37275			
37276							_fnColumnOptions( oSettings, i );
37277						}
37278					}
37279				} );
37280			}
37281			
37282			var features = oSettings.oFeatures;
37283			
37284			/* Must be done after everything which can be overridden by the state saving! */
37285			if ( oInit.bStateSave )
37286			{
37287				features.bStateSave = true;
37288				_fnLoadState( oSettings, oInit );
37289				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
37290			}
37291			
37292			
37293			/*
37294			 * Sorting
37295			 * @todo For modularisation (1.11) this needs to do into a sort start up handler
37296			 */
37297			
37298			// If aaSorting is not defined, then we use the first indicator in asSorting
37299			// in case that has been altered, so the default sort reflects that option
37300			if ( oInit.aaSorting === undefined )
37301			{
37302				var sorting = oSettings.aaSorting;
37303				for ( i=0, iLen=sorting.length ; i<iLen ; i++ )
37304				{
37305					sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
37306				}
37307			}
37308			
37309			/* Do a first pass on the sorting classes (allows any size changes to be taken into
37310			 * account, and also will apply sorting disabled classes if disabled
37311			 */
37312			_fnSortingClasses( oSettings );
37313			
37314			if ( features.bSort )
37315			{
37316				_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
37317					if ( oSettings.bSorted ) {
37318						var aSort = _fnSortFlatten( oSettings );
37319						var sortedColumns = {};
37320			
37321						$.each( aSort, function (i, val) {
37322							sortedColumns[ val.src ] = val.dir;
37323						} );
37324			
37325						_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
37326						_fnSortAria( oSettings );
37327					}
37328				} );
37329			}
37330			
37331			_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
37332				if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
37333					_fnSortingClasses( oSettings );
37334				}
37335			}, 'sc' );
37336			
37337			
37338			/*
37339			 * Final init
37340			 * Cache the header, body and footer as required, creating them if needed
37341			 */
37342			
37343			// Work around for Webkit bug 83867 - store the caption-side before removing from doc
37344			var captions = $this.children('caption').each( function () {
37345				this._captionSide = $this.css('caption-side');
37346			} );
37347			
37348			var thead = $this.children('thead');
37349			if ( thead.length === 0 )
37350			{
37351				thead = $('<thead/>').appendTo(this);
37352			}
37353			oSettings.nTHead = thead[0];
37354			
37355			var tbody = $this.children('tbody');
37356			if ( tbody.length === 0 )
37357			{
37358				tbody = $('<tbody/>').appendTo(this);
37359			}
37360			oSettings.nTBody = tbody[0];
37361			
37362			var tfoot = $this.children('tfoot');
37363			if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
37364			{
37365				// If we are a scrolling table, and no footer has been given, then we need to create
37366				// a tfoot element for the caption element to be appended to
37367				tfoot = $('<tfoot/>').appendTo(this);
37368			}
37369			
37370			if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
37371				$this.addClass( oClasses.sNoFooter );
37372			}
37373			else if ( tfoot.length > 0 ) {
37374				oSettings.nTFoot = tfoot[0];
37375				_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
37376			}
37377			
37378			/* Check if there is data passing into the constructor */
37379			if ( oInit.aaData )
37380			{
37381				for ( i=0 ; i<oInit.aaData.length ; i++ )
37382				{
37383					_fnAddData( oSettings, oInit.aaData[ i ] );
37384				}
37385			}
37386			else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' )
37387			{
37388				/* Grab the data from the page - only do this when deferred loading or no Ajax
37389				 * source since there is no point in reading the DOM data if we are then going
37390				 * to replace it with Ajax data
37391				 */
37392				_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
37393			}
37394			
37395			/* Copy the data index array */
37396			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
37397			
37398			/* Initialisation complete - table can be drawn */
37399			oSettings.bInitialised = true;
37400			
37401			/* Check if we need to initialise the table (it might not have been handed off to the
37402			 * language processor)
37403			 */
37404			if ( bInitHandedOff === false )
37405			{
37406				_fnInitialise( oSettings );
37407			}
37408		} );
37409		_that = null;
37410		return this;
37411	};
37412
37413	
37414	
37415	/**
37416	 * Computed structure of the DataTables API, defined by the options passed to
37417	 * `DataTable.Api.register()` when building the API.
37418	 *
37419	 * The structure is built in order to speed creation and extension of the Api
37420	 * objects since the extensions are effectively pre-parsed.
37421	 *
37422	 * The array is an array of objects with the following structure, where this
37423	 * base array represents the Api prototype base:
37424	 *
37425	 *     [
37426	 *       {
37427	 *         name:      'data'                -- string   - Property name
37428	 *         val:       function () {},       -- function - Api method (or undefined if just an object
37429	 *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
37430	 *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
37431	 *       },
37432	 *       {
37433	 *         name:     'row'
37434	 *         val:       {},
37435	 *         methodExt: [ ... ],
37436	 *         propExt:   [
37437	 *           {
37438	 *             name:      'data'
37439	 *             val:       function () {},
37440	 *             methodExt: [ ... ],
37441	 *             propExt:   [ ... ]
37442	 *           },
37443	 *           ...
37444	 *         ]
37445	 *       }
37446	 *     ]
37447	 *
37448	 * @type {Array}
37449	 * @ignore
37450	 */
37451	var __apiStruct = [];
37452	
37453	
37454	/**
37455	 * `Array.prototype` reference.
37456	 *
37457	 * @type object
37458	 * @ignore
37459	 */
37460	var __arrayProto = Array.prototype;
37461	
37462	
37463	/**
37464	 * Abstraction for `context` parameter of the `Api` constructor to allow it to
37465	 * take several different forms for ease of use.
37466	 *
37467	 * Each of the input parameter types will be converted to a DataTables settings
37468	 * object where possible.
37469	 *
37470	 * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one
37471	 *   of:
37472	 *
37473	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
37474	 *     with be found and used.
37475	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
37476	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
37477	 *   * `object` - DataTables settings object
37478	 *   * `DataTables.Api` - API instance
37479	 * @return {array|null} Matching DataTables settings objects. `null` or
37480	 *   `undefined` is returned if no matching DataTable is found.
37481	 * @ignore
37482	 */
37483	var _toSettings = function ( mixed )
37484	{
37485		var idx, jq;
37486		var settings = DataTable.settings;
37487		var tables = $.map( settings, function (el, i) {
37488			return el.nTable;
37489		} );
37490	
37491		if ( ! mixed ) {
37492			return [];
37493		}
37494		else if ( mixed.nTable && mixed.oApi ) {
37495			// DataTables settings object
37496			return [ mixed ];
37497		}
37498		else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
37499			// Table node
37500			idx = $.inArray( mixed, tables );
37501			return idx !== -1 ? [ settings[idx] ] : null;
37502		}
37503		else if ( mixed && typeof mixed.settings === 'function' ) {
37504			return mixed.settings().toArray();
37505		}
37506		else if ( typeof mixed === 'string' ) {
37507			// jQuery selector
37508			jq = $(mixed);
37509		}
37510		else if ( mixed instanceof $ ) {
37511			// jQuery object (also DataTables instance)
37512			jq = mixed;
37513		}
37514	
37515		if ( jq ) {
37516			return jq.map( function(i) {
37517				idx = $.inArray( this, tables );
37518				return idx !== -1 ? settings[idx] : null;
37519			} ).toArray();
37520		}
37521	};
37522	
37523	
37524	/**
37525	 * DataTables API class - used to control and interface with  one or more
37526	 * DataTables enhanced tables.
37527	 *
37528	 * The API class is heavily based on jQuery, presenting a chainable interface
37529	 * that you can use to interact with tables. Each instance of the API class has
37530	 * a "context" - i.e. the tables that it will operate on. This could be a single
37531	 * table, all tables on a page or a sub-set thereof.
37532	 *
37533	 * Additionally the API is designed to allow you to easily work with the data in
37534	 * the tables, retrieving and manipulating it as required. This is done by
37535	 * presenting the API class as an array like interface. The contents of the
37536	 * array depend upon the actions requested by each method (for example
37537	 * `rows().nodes()` will return an array of nodes, while `rows().data()` will
37538	 * return an array of objects or arrays depending upon your table's
37539	 * configuration). The API object has a number of array like methods (`push`,
37540	 * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
37541	 * `unique` etc) to assist your working with the data held in a table.
37542	 *
37543	 * Most methods (those which return an Api instance) are chainable, which means
37544	 * the return from a method call also has all of the methods available that the
37545	 * top level object had. For example, these two calls are equivalent:
37546	 *
37547	 *     // Not chained
37548	 *     api.row.add( {...} );
37549	 *     api.draw();
37550	 *
37551	 *     // Chained
37552	 *     api.row.add( {...} ).draw();
37553	 *
37554	 * @class DataTable.Api
37555	 * @param {array|object|string|jQuery} context DataTable identifier. This is
37556	 *   used to define which DataTables enhanced tables this API will operate on.
37557	 *   Can be one of:
37558	 *
37559	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
37560	 *     with be found and used.
37561	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
37562	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
37563	 *   * `object` - DataTables settings object
37564	 * @param {array} [data] Data to initialise the Api instance with.
37565	 *
37566	 * @example
37567	 *   // Direct initialisation during DataTables construction
37568	 *   var api = $('#example').DataTable();
37569	 *
37570	 * @example
37571	 *   // Initialisation using a DataTables jQuery object
37572	 *   var api = $('#example').dataTable().api();
37573	 *
37574	 * @example
37575	 *   // Initialisation as a constructor
37576	 *   var api = new $.fn.DataTable.Api( 'table.dataTable' );
37577	 */
37578	_Api = function ( context, data )
37579	{
37580		if ( ! (this instanceof _Api) ) {
37581			return new _Api( context, data );
37582		}
37583	
37584		var settings = [];
37585		var ctxSettings = function ( o ) {
37586			var a = _toSettings( o );
37587			if ( a ) {
37588				settings = settings.concat( a );
37589			}
37590		};
37591	
37592		if ( $.isArray( context ) ) {
37593			for ( var i=0, ien=context.length ; i<ien ; i++ ) {
37594				ctxSettings( context[i] );
37595			}
37596		}
37597		else {
37598			ctxSettings( context );
37599		}
37600	
37601		// Remove duplicates
37602		this.context = _unique( settings );
37603	
37604		// Initial data
37605		if ( data ) {
37606			$.merge( this, data );
37607		}
37608	
37609		// selector
37610		this.selector = {
37611			rows: null,
37612			cols: null,
37613			opts: null
37614		};
37615	
37616		_Api.extend( this, this, __apiStruct );
37617	};
37618	
37619	DataTable.Api = _Api;
37620	
37621	// Don't destroy the existing prototype, just extend it. Required for jQuery 2's
37622	// isPlainObject.
37623	$.extend( _Api.prototype, {
37624		any: function ()
37625		{
37626			return this.count() !== 0;
37627		},
37628	
37629	
37630		concat:  __arrayProto.concat,
37631	
37632	
37633		context: [], // array of table settings objects
37634	
37635	
37636		count: function ()
37637		{
37638			return this.flatten().length;
37639		},
37640	
37641	
37642		each: function ( fn )
37643		{
37644			for ( var i=0, ien=this.length ; i<ien; i++ ) {
37645				fn.call( this, this[i], i, this );
37646			}
37647	
37648			return this;
37649		},
37650	
37651	
37652		eq: function ( idx )
37653		{
37654			var ctx = this.context;
37655	
37656			return ctx.length > idx ?
37657				new _Api( ctx[idx], this[idx] ) :
37658				null;
37659		},
37660	
37661	
37662		filter: function ( fn )
37663		{
37664			var a = [];
37665	
37666			if ( __arrayProto.filter ) {
37667				a = __arrayProto.filter.call( this, fn, this );
37668			}
37669			else {
37670				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
37671				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
37672					if ( fn.call( this, this[i], i, this ) ) {
37673						a.push( this[i] );
37674					}
37675				}
37676			}
37677	
37678			return new _Api( this.context, a );
37679		},
37680	
37681	
37682		flatten: function ()
37683		{
37684			var a = [];
37685			return new _Api( this.context, a.concat.apply( a, this.toArray() ) );
37686		},
37687	
37688	
37689		join:    __arrayProto.join,
37690	
37691	
37692		indexOf: __arrayProto.indexOf || function (obj, start)
37693		{
37694			for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {
37695				if ( this[i] === obj ) {
37696					return i;
37697				}
37698			}
37699			return -1;
37700		},
37701	
37702		iterator: function ( flatten, type, fn, alwaysNew ) {
37703			var
37704				a = [], ret,
37705				i, ien, j, jen,
37706				context = this.context,
37707				rows, items, item,
37708				selector = this.selector;
37709	
37710			// Argument shifting
37711			if ( typeof flatten === 'string' ) {
37712				alwaysNew = fn;
37713				fn = type;
37714				type = flatten;
37715				flatten = false;
37716			}
37717	
37718			for ( i=0, ien=context.length ; i<ien ; i++ ) {
37719				var apiInst = new _Api( context[i] );
37720	
37721				if ( type === 'table' ) {
37722					ret = fn.call( apiInst, context[i], i );
37723	
37724					if ( ret !== undefined ) {
37725						a.push( ret );
37726					}
37727				}
37728				else if ( type === 'columns' || type === 'rows' ) {
37729					// this has same length as context - one entry for each table
37730					ret = fn.call( apiInst, context[i], this[i], i );
37731	
37732					if ( ret !== undefined ) {
37733						a.push( ret );
37734					}
37735				}
37736				else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {
37737					// columns and rows share the same structure.
37738					// 'this' is an array of column indexes for each context
37739					items = this[i];
37740	
37741					if ( type === 'column-rows' ) {
37742						rows = _selector_row_indexes( context[i], selector.opts );
37743					}
37744	
37745					for ( j=0, jen=items.length ; j<jen ; j++ ) {
37746						item = items[j];
37747	
37748						if ( type === 'cell' ) {
37749							ret = fn.call( apiInst, context[i], item.row, item.column, i, j );
37750						}
37751						else {
37752							ret = fn.call( apiInst, context[i], item, i, j, rows );
37753						}
37754	
37755						if ( ret !== undefined ) {
37756							a.push( ret );
37757						}
37758					}
37759				}
37760			}
37761	
37762			if ( a.length || alwaysNew ) {
37763				var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );
37764				var apiSelector = api.selector;
37765				apiSelector.rows = selector.rows;
37766				apiSelector.cols = selector.cols;
37767				apiSelector.opts = selector.opts;
37768				return api;
37769			}
37770			return this;
37771		},
37772	
37773	
37774		lastIndexOf: __arrayProto.lastIndexOf || function (obj, start)
37775		{
37776			// Bit cheeky...
37777			return this.indexOf.apply( this.toArray.reverse(), arguments );
37778		},
37779	
37780	
37781		length:  0,
37782	
37783	
37784		map: function ( fn )
37785		{
37786			var a = [];
37787	
37788			if ( __arrayProto.map ) {
37789				a = __arrayProto.map.call( this, fn, this );
37790			}
37791			else {
37792				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
37793				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
37794					a.push( fn.call( this, this[i], i ) );
37795				}
37796			}
37797	
37798			return new _Api( this.context, a );
37799		},
37800	
37801	
37802		pluck: function ( prop )
37803		{
37804			return this.map( function ( el ) {
37805				return el[ prop ];
37806			} );
37807		},
37808	
37809		pop:     __arrayProto.pop,
37810	
37811	
37812		push:    __arrayProto.push,
37813	
37814	
37815		// Does not return an API instance
37816		reduce: __arrayProto.reduce || function ( fn, init )
37817		{
37818			return _fnReduce( this, fn, init, 0, this.length, 1 );
37819		},
37820	
37821	
37822		reduceRight: __arrayProto.reduceRight || function ( fn, init )
37823		{
37824			return _fnReduce( this, fn, init, this.length-1, -1, -1 );
37825		},
37826	
37827	
37828		reverse: __arrayProto.reverse,
37829	
37830	
37831		// Object with rows, columns and opts
37832		selector: null,
37833	
37834	
37835		shift:   __arrayProto.shift,
37836	
37837	
37838		sort:    __arrayProto.sort, // ? name - order?
37839	
37840	
37841		splice:  __arrayProto.splice,
37842	
37843	
37844		toArray: function ()
37845		{
37846			return __arrayProto.slice.call( this );
37847		},
37848	
37849	
37850		to$: function ()
37851		{
37852			return $( this );
37853		},
37854	
37855	
37856		toJQuery: function ()
37857		{
37858			return $( this );
37859		},
37860	
37861	
37862		unique: function ()
37863		{
37864			return new _Api( this.context, _unique(this) );
37865		},
37866	
37867	
37868		unshift: __arrayProto.unshift
37869	} );
37870	
37871	
37872	_Api.extend = function ( scope, obj, ext )
37873	{
37874		// Only extend API instances and static properties of the API
37875		if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {
37876			return;
37877		}
37878	
37879		var
37880			i, ien,
37881			j, jen,
37882			struct, inner,
37883			methodScoping = function ( scope, fn, struc ) {
37884				return function () {
37885					var ret = fn.apply( scope, arguments );
37886	
37887					// Method extension
37888					_Api.extend( ret, ret, struc.methodExt );
37889					return ret;
37890				};
37891			};
37892	
37893		for ( i=0, ien=ext.length ; i<ien ; i++ ) {
37894			struct = ext[i];
37895	
37896			// Value
37897			obj[ struct.name ] = typeof struct.val === 'function' ?
37898				methodScoping( scope, struct.val, struct ) :
37899				$.isPlainObject( struct.val ) ?
37900					{} :
37901					struct.val;
37902	
37903			obj[ struct.name ].__dt_wrapper = true;
37904	
37905			// Property extension
37906			_Api.extend( scope, obj[ struct.name ], struct.propExt );
37907		}
37908	};
37909	
37910	
37911	// @todo - Is there need for an augment function?
37912	// _Api.augment = function ( inst, name )
37913	// {
37914	// 	// Find src object in the structure from the name
37915	// 	var parts = name.split('.');
37916	
37917	// 	_Api.extend( inst, obj );
37918	// };
37919	
37920	
37921	//     [
37922	//       {
37923	//         name:      'data'                -- string   - Property name
37924	//         val:       function () {},       -- function - Api method (or undefined if just an object
37925	//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
37926	//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
37927	//       },
37928	//       {
37929	//         name:     'row'
37930	//         val:       {},
37931	//         methodExt: [ ... ],
37932	//         propExt:   [
37933	//           {
37934	//             name:      'data'
37935	//             val:       function () {},
37936	//             methodExt: [ ... ],
37937	//             propExt:   [ ... ]
37938	//           },
37939	//           ...
37940	//         ]
37941	//       }
37942	//     ]
37943	
37944	_Api.register = _api_register = function ( name, val )
37945	{
37946		if ( $.isArray( name ) ) {
37947			for ( var j=0, jen=name.length ; j<jen ; j++ ) {
37948				_Api.register( name[j], val );
37949			}
37950			return;
37951		}
37952	
37953		var
37954			i, ien,
37955			heir = name.split('.'),
37956			struct = __apiStruct,
37957			key, method;
37958	
37959		var find = function ( src, name ) {
37960			for ( var i=0, ien=src.length ; i<ien ; i++ ) {
37961				if ( src[i].name === name ) {
37962					return src[i];
37963				}
37964			}
37965			return null;
37966		};
37967	
37968		for ( i=0, ien=heir.length ; i<ien ; i++ ) {
37969			method = heir[i].indexOf('()') !== -1;
37970			key = method ?
37971				heir[i].replace('()', '') :
37972				heir[i];
37973	
37974			var src = find( struct, key );
37975			if ( ! src ) {
37976				src = {
37977					name:      key,
37978					val:       {},
37979					methodExt: [],
37980					propExt:   []
37981				};
37982				struct.push( src );
37983			}
37984	
37985			if ( i === ien-1 ) {
37986				src.val = val;
37987			}
37988			else {
37989				struct = method ?
37990					src.methodExt :
37991					src.propExt;
37992			}
37993		}
37994	};
37995	
37996	
37997	_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {
37998		_Api.register( pluralName, val );
37999	
38000		_Api.register( singularName, function () {
38001			var ret = val.apply( this, arguments );
38002	
38003			if ( ret === this ) {
38004				// Returned item is the API instance that was passed in, return it
38005				return this;
38006			}
38007			else if ( ret instanceof _Api ) {
38008				// New API instance returned, want the value from the first item
38009				// in the returned array for the singular result.
38010				return ret.length ?
38011					$.isArray( ret[0] ) ?
38012						new _Api( ret.context, ret[0] ) : // Array results are 'enhanced'
38013						ret[0] :
38014					undefined;
38015			}
38016	
38017			// Non-API return - just fire it back
38018			return ret;
38019		} );
38020	};
38021	
38022	
38023	/**
38024	 * Selector for HTML tables. Apply the given selector to the give array of
38025	 * DataTables settings objects.
38026	 *
38027	 * @param {string|integer} [selector] jQuery selector string or integer
38028	 * @param  {array} Array of DataTables settings objects to be filtered
38029	 * @return {array}
38030	 * @ignore
38031	 */
38032	var __table_selector = function ( selector, a )
38033	{
38034		// Integer is used to pick out a table by index
38035		if ( typeof selector === 'number' ) {
38036			return [ a[ selector ] ];
38037		}
38038	
38039		// Perform a jQuery selector on the table nodes
38040		var nodes = $.map( a, function (el, i) {
38041			return el.nTable;
38042		} );
38043	
38044		return $(nodes)
38045			.filter( selector )
38046			.map( function (i) {
38047				// Need to translate back from the table node to the settings
38048				var idx = $.inArray( this, nodes );
38049				return a[ idx ];
38050			} )
38051			.toArray();
38052	};
38053	
38054	
38055	
38056	/**
38057	 * Context selector for the API's context (i.e. the tables the API instance
38058	 * refers to.
38059	 *
38060	 * @name    DataTable.Api#tables
38061	 * @param {string|integer} [selector] Selector to pick which tables the iterator
38062	 *   should operate on. If not given, all tables in the current context are
38063	 *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to
38064	 *   select multiple tables or as an integer to select a single table.
38065	 * @returns {DataTable.Api} Returns a new API instance if a selector is given.
38066	 */
38067	_api_register( 'tables()', function ( selector ) {
38068		// A new instance is created if there was a selector specified
38069		return selector ?
38070			new _Api( __table_selector( selector, this.context ) ) :
38071			this;
38072	} );
38073	
38074	
38075	_api_register( 'table()', function ( selector ) {
38076		var tables = this.tables( selector );
38077		var ctx = tables.context;
38078	
38079		// Truncate to the first matched table
38080		return ctx.length ?
38081			new _Api( ctx[0] ) :
38082			tables;
38083	} );
38084	
38085	
38086	_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {
38087		return this.iterator( 'table', function ( ctx ) {
38088			return ctx.nTable;
38089		}, 1 );
38090	} );
38091	
38092	
38093	_api_registerPlural( 'tables().body()', 'table().body()' , function () {
38094		return this.iterator( 'table', function ( ctx ) {
38095			return ctx.nTBody;
38096		}, 1 );
38097	} );
38098	
38099	
38100	_api_registerPlural( 'tables().header()', 'table().header()' , function () {
38101		return this.iterator( 'table', function ( ctx ) {
38102			return ctx.nTHead;
38103		}, 1 );
38104	} );
38105	
38106	
38107	_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {
38108		return this.iterator( 'table', function ( ctx ) {
38109			return ctx.nTFoot;
38110		}, 1 );
38111	} );
38112	
38113	
38114	_api_registerPlural( 'tables().containers()', 'table().container()' , function () {
38115		return this.iterator( 'table', function ( ctx ) {
38116			return ctx.nTableWrapper;
38117		}, 1 );
38118	} );
38119	
38120	
38121	
38122	/**
38123	 * Redraw the tables in the current context.
38124	 */
38125	_api_register( 'draw()', function ( paging ) {
38126		return this.iterator( 'table', function ( settings ) {
38127			if ( paging === 'page' ) {
38128				_fnDraw( settings );
38129			}
38130			else {
38131				if ( typeof paging === 'string' ) {
38132					paging = paging === 'full-hold' ?
38133						false :
38134						true;
38135				}
38136	
38137				_fnReDraw( settings, paging===false );
38138			}
38139		} );
38140	} );
38141	
38142	
38143	
38144	/**
38145	 * Get the current page index.
38146	 *
38147	 * @return {integer} Current page index (zero based)
38148	 *//**
38149	 * Set the current page.
38150	 *
38151	 * Note that if you attempt to show a page which does not exist, DataTables will
38152	 * not throw an error, but rather reset the paging.
38153	 *
38154	 * @param {integer|string} action The paging action to take. This can be one of:
38155	 *  * `integer` - The page index to jump to
38156	 *  * `string` - An action to take:
38157	 *    * `first` - Jump to first page.
38158	 *    * `next` - Jump to the next page
38159	 *    * `previous` - Jump to previous page
38160	 *    * `last` - Jump to the last page.
38161	 * @returns {DataTables.Api} this
38162	 */
38163	_api_register( 'page()', function ( action ) {
38164		if ( action === undefined ) {
38165			return this.page.info().page; // not an expensive call
38166		}
38167	
38168		// else, have an action to take on all tables
38169		return this.iterator( 'table', function ( settings ) {
38170			_fnPageChange( settings, action );
38171		} );
38172	} );
38173	
38174	
38175	/**
38176	 * Paging information for the first table in the current context.
38177	 *
38178	 * If you require paging information for another table, use the `table()` method
38179	 * with a suitable selector.
38180	 *
38181	 * @return {object} Object with the following properties set:
38182	 *  * `page` - Current page index (zero based - i.e. the first page is `0`)
38183	 *  * `pages` - Total number of pages
38184	 *  * `start` - Display index for the first record shown on the current page
38185	 *  * `end` - Display index for the last record shown on the current page
38186	 *  * `length` - Display length (number of records). Note that generally `start
38187	 *    + length = end`, but this is not always true, for example if there are
38188	 *    only 2 records to show on the final page, with a length of 10.
38189	 *  * `recordsTotal` - Full data set length
38190	 *  * `recordsDisplay` - Data set length once the current filtering criterion
38191	 *    are applied.
38192	 */
38193	_api_register( 'page.info()', function ( action ) {
38194		if ( this.context.length === 0 ) {
38195			return undefined;
38196		}
38197	
38198		var
38199			settings   = this.context[0],
38200			start      = settings._iDisplayStart,
38201			len        = settings._iDisplayLength,
38202			visRecords = settings.fnRecordsDisplay(),
38203			all        = len === -1;
38204	
38205		return {
38206			"page":           all ? 0 : Math.floor( start / len ),
38207			"pages":          all ? 1 : Math.ceil( visRecords / len ),
38208			"start":          start,
38209			"end":            settings.fnDisplayEnd(),
38210			"length":         len,
38211			"recordsTotal":   settings.fnRecordsTotal(),
38212			"recordsDisplay": visRecords,
38213			"serverSide":     _fnDataSource( settings ) === 'ssp'
38214		};
38215	} );
38216	
38217	
38218	/**
38219	 * Get the current page length.
38220	 *
38221	 * @return {integer} Current page length. Note `-1` indicates that all records
38222	 *   are to be shown.
38223	 *//**
38224	 * Set the current page length.
38225	 *
38226	 * @param {integer} Page length to set. Use `-1` to show all records.
38227	 * @returns {DataTables.Api} this
38228	 */
38229	_api_register( 'page.len()', function ( len ) {
38230		// Note that we can't call this function 'length()' because `length`
38231		// is a Javascript property of functions which defines how many arguments
38232		// the function expects.
38233		if ( len === undefined ) {
38234			return this.context.length !== 0 ?
38235				this.context[0]._iDisplayLength :
38236				undefined;
38237		}
38238	
38239		// else, set the page length
38240		return this.iterator( 'table', function ( settings ) {
38241			_fnLengthChange( settings, len );
38242		} );
38243	} );
38244	
38245	
38246	
38247	var __reload = function ( settings, holdPosition, callback ) {
38248		// Use the draw event to trigger a callback
38249		if ( callback ) {
38250			var api = new _Api( settings );
38251	
38252			api.one( 'draw', function () {
38253				callback( api.ajax.json() );
38254			} );
38255		}
38256	
38257		if ( _fnDataSource( settings ) == 'ssp' ) {
38258			_fnReDraw( settings, holdPosition );
38259		}
38260		else {
38261			_fnProcessingDisplay( settings, true );
38262	
38263			// Cancel an existing request
38264			var xhr = settings.jqXHR;
38265			if ( xhr && xhr.readyState !== 4 ) {
38266				xhr.abort();
38267			}
38268	
38269			// Trigger xhr
38270			_fnBuildAjax( settings, [], function( json ) {
38271				_fnClearTable( settings );
38272	
38273				var data = _fnAjaxDataSrc( settings, json );
38274				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
38275					_fnAddData( settings, data[i] );
38276				}
38277	
38278				_fnReDraw( settings, holdPosition );
38279				_fnProcessingDisplay( settings, false );
38280			} );
38281		}
38282	};
38283	
38284	
38285	/**
38286	 * Get the JSON response from the last Ajax request that DataTables made to the
38287	 * server. Note that this returns the JSON from the first table in the current
38288	 * context.
38289	 *
38290	 * @return {object} JSON received from the server.
38291	 */
38292	_api_register( 'ajax.json()', function () {
38293		var ctx = this.context;
38294	
38295		if ( ctx.length > 0 ) {
38296			return ctx[0].json;
38297		}
38298	
38299		// else return undefined;
38300	} );
38301	
38302	
38303	/**
38304	 * Get the data submitted in the last Ajax request
38305	 */
38306	_api_register( 'ajax.params()', function () {
38307		var ctx = this.context;
38308	
38309		if ( ctx.length > 0 ) {
38310			return ctx[0].oAjaxData;
38311		}
38312	
38313		// else return undefined;
38314	} );
38315	
38316	
38317	/**
38318	 * Reload tables from the Ajax data source. Note that this function will
38319	 * automatically re-draw the table when the remote data has been loaded.
38320	 *
38321	 * @param {boolean} [reset=true] Reset (default) or hold the current paging
38322	 *   position. A full re-sort and re-filter is performed when this method is
38323	 *   called, which is why the pagination reset is the default action.
38324	 * @returns {DataTables.Api} this
38325	 */
38326	_api_register( 'ajax.reload()', function ( callback, resetPaging ) {
38327		return this.iterator( 'table', function (settings) {
38328			__reload( settings, resetPaging===false, callback );
38329		} );
38330	} );
38331	
38332	
38333	/**
38334	 * Get the current Ajax URL. Note that this returns the URL from the first
38335	 * table in the current context.
38336	 *
38337	 * @return {string} Current Ajax source URL
38338	 *//**
38339	 * Set the Ajax URL. Note that this will set the URL for all tables in the
38340	 * current context.
38341	 *
38342	 * @param {string} url URL to set.
38343	 * @returns {DataTables.Api} this
38344	 */
38345	_api_register( 'ajax.url()', function ( url ) {
38346		var ctx = this.context;
38347	
38348		if ( url === undefined ) {
38349			// get
38350			if ( ctx.length === 0 ) {
38351				return undefined;
38352			}
38353			ctx = ctx[0];
38354	
38355			return ctx.ajax ?
38356				$.isPlainObject( ctx.ajax ) ?
38357					ctx.ajax.url :
38358					ctx.ajax :
38359				ctx.sAjaxSource;
38360		}
38361	
38362		// set
38363		return this.iterator( 'table', function ( settings ) {
38364			if ( $.isPlainObject( settings.ajax ) ) {
38365				settings.ajax.url = url;
38366			}
38367			else {
38368				settings.ajax = url;
38369			}
38370			// No need to consider sAjaxSource here since DataTables gives priority
38371			// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
38372			// value of `sAjaxSource` redundant.
38373		} );
38374	} );
38375	
38376	
38377	/**
38378	 * Load data from the newly set Ajax URL. Note that this method is only
38379	 * available when `ajax.url()` is used to set a URL. Additionally, this method
38380	 * has the same effect as calling `ajax.reload()` but is provided for
38381	 * convenience when setting a new URL. Like `ajax.reload()` it will
38382	 * automatically redraw the table once the remote data has been loaded.
38383	 *
38384	 * @returns {DataTables.Api} this
38385	 */
38386	_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
38387		// Same as a reload, but makes sense to present it for easy access after a
38388		// url change
38389		return this.iterator( 'table', function ( ctx ) {
38390			__reload( ctx, resetPaging===false, callback );
38391		} );
38392	} );
38393	
38394	
38395	
38396	
38397	var _selector_run = function ( type, selector, selectFn, settings, opts )
38398	{
38399		var
38400			out = [], res,
38401			a, i, ien, j, jen,
38402			selectorType = typeof selector;
38403	
38404		// Can't just check for isArray here, as an API or jQuery instance might be
38405		// given with their array like look
38406		if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
38407			selector = [ selector ];
38408		}
38409	
38410		for ( i=0, ien=selector.length ; i<ien ; i++ ) {
38411			a = selector[i] && selector[i].split ?
38412				selector[i].split(',') :
38413				[ selector[i] ];
38414	
38415			for ( j=0, jen=a.length ; j<jen ; j++ ) {
38416				res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );
38417	
38418				if ( res && res.length ) {
38419					out = out.concat( res );
38420				}
38421			}
38422		}
38423	
38424		// selector extensions
38425		var ext = _ext.selector[ type ];
38426		if ( ext.length ) {
38427			for ( i=0, ien=ext.length ; i<ien ; i++ ) {
38428				out = ext[i]( settings, opts, out );
38429			}
38430		}
38431	
38432		return _unique( out );
38433	};
38434	
38435	
38436	var _selector_opts = function ( opts )
38437	{
38438		if ( ! opts ) {
38439			opts = {};
38440		}
38441	
38442		// Backwards compatibility for 1.9- which used the terminology filter rather
38443		// than search
38444		if ( opts.filter && opts.search === undefined ) {
38445			opts.search = opts.filter;
38446		}
38447	
38448		return $.extend( {
38449			search: 'none',
38450			order: 'current',
38451			page: 'all'
38452		}, opts );
38453	};
38454	
38455	
38456	var _selector_first = function ( inst )
38457	{
38458		// Reduce the API instance to the first item found
38459		for ( var i=0, ien=inst.length ; i<ien ; i++ ) {
38460			if ( inst[i].length > 0 ) {
38461				// Assign the first element to the first item in the instance
38462				// and truncate the instance and context
38463				inst[0] = inst[i];
38464				inst[0].length = 1;
38465				inst.length = 1;
38466				inst.context = [ inst.context[i] ];
38467	
38468				return inst;
38469			}
38470		}
38471	
38472		// Not found - return an empty instance
38473		inst.length = 0;
38474		return inst;
38475	};
38476	
38477	
38478	var _selector_row_indexes = function ( settings, opts )
38479	{
38480		var
38481			i, ien, tmp, a=[],
38482			displayFiltered = settings.aiDisplay,
38483			displayMaster = settings.aiDisplayMaster;
38484	
38485		var
38486			search = opts.search,  // none, applied, removed
38487			order  = opts.order,   // applied, current, index (original - compatibility with 1.9)
38488			page   = opts.page;    // all, current
38489	
38490		if ( _fnDataSource( settings ) == 'ssp' ) {
38491			// In server-side processing mode, most options are irrelevant since
38492			// rows not shown don't exist and the index order is the applied order
38493			// Removed is a special case - for consistency just return an empty
38494			// array
38495			return search === 'removed' ?
38496				[] :
38497				_range( 0, displayMaster.length );
38498		}
38499		else if ( page == 'current' ) {
38500			// Current page implies that order=current and fitler=applied, since it is
38501			// fairly senseless otherwise, regardless of what order and search actually
38502			// are
38503			for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {
38504				a.push( displayFiltered[i] );
38505			}
38506		}
38507		else if ( order == 'current' || order == 'applied' ) {
38508			a = search == 'none' ?
38509				displayMaster.slice() :                      // no search
38510				search == 'applied' ?
38511					displayFiltered.slice() :                // applied search
38512					$.map( displayMaster, function (el, i) { // removed search
38513						return $.inArray( el, displayFiltered ) === -1 ? el : null;
38514					} );
38515		}
38516		else if ( order == 'index' || order == 'original' ) {
38517			for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
38518				if ( search == 'none' ) {
38519					a.push( i );
38520				}
38521				else { // applied | removed
38522					tmp = $.inArray( i, displayFiltered );
38523	
38524					if ((tmp === -1 && search == 'removed') ||
38525						(tmp >= 0   && search == 'applied') )
38526					{
38527						a.push( i );
38528					}
38529				}
38530			}
38531		}
38532	
38533		return a;
38534	};
38535	
38536	
38537	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
38538	 * Rows
38539	 *
38540	 * {}          - no selector - use all available rows
38541	 * {integer}   - row aoData index
38542	 * {node}      - TR node
38543	 * {string}    - jQuery selector to apply to the TR elements
38544	 * {array}     - jQuery array of nodes, or simply an array of TR nodes
38545	 *
38546	 */
38547	
38548	
38549	var __row_selector = function ( settings, selector, opts )
38550	{
38551		var run = function ( sel ) {
38552			var selInt = _intVal( sel );
38553			var i, ien;
38554	
38555			// Short cut - selector is a number and no options provided (default is
38556			// all records, so no need to check if the index is in there, since it
38557			// must be - dev error if the index doesn't exist).
38558			if ( selInt !== null && ! opts ) {
38559				return [ selInt ];
38560			}
38561	
38562			var rows = _selector_row_indexes( settings, opts );
38563	
38564			if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
38565				// Selector - integer
38566				return [ selInt ];
38567			}
38568			else if ( ! sel ) {
38569				// Selector - none
38570				return rows;
38571			}
38572	
38573			// Selector - function
38574			if ( typeof sel === 'function' ) {
38575				return $.map( rows, function (idx) {
38576					var row = settings.aoData[ idx ];
38577					return sel( idx, row._aData, row.nTr ) ? idx : null;
38578				} );
38579			}
38580	
38581			// Get nodes in the order from the `rows` array with null values removed
38582			var nodes = _removeEmpty(
38583				_pluck_order( settings.aoData, rows, 'nTr' )
38584			);
38585	
38586			// Selector - node
38587			if ( sel.nodeName ) {
38588				if ( $.inArray( sel, nodes ) !== -1 ) {
38589					return [ sel._DT_RowIndex ]; // sel is a TR node that is in the table
38590					                             // and DataTables adds a prop for fast lookup
38591				}
38592			}
38593	
38594			// ID selector. Want to always be able to select rows by id, regardless
38595			// of if the tr element has been created or not, so can't rely upon
38596			// jQuery here - hence a custom implementation. This does not match
38597			// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,
38598			// but to select it using a CSS selector engine (like Sizzle or
38599			// querySelect) it would need to need to be escaped for some characters.
38600			// DataTables simplifies this for row selectors since you can select
38601			// only a row. A # indicates an id any anything that follows is the id -
38602			// unescaped.
38603			if ( typeof sel === 'string' && sel.charAt(0) === '#' ) {
38604				// get row index from id
38605				var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];
38606				if ( rowObj !== undefined ) {
38607					return [ rowObj.idx ];
38608				}
38609	
38610				// need to fall through to jQuery in case there is DOM id that
38611				// matches
38612			}
38613	
38614			// Selector - jQuery selector string, array of nodes or jQuery object/
38615			// As jQuery's .filter() allows jQuery objects to be passed in filter,
38616			// it also allows arrays, so this will cope with all three options
38617			return $(nodes)
38618				.filter( sel )
38619				.map( function () {
38620					return this._DT_RowIndex;
38621				} )
38622				.toArray();
38623		};
38624	
38625		return _selector_run( 'row', selector, run, settings, opts );
38626	};
38627	
38628	
38629	_api_register( 'rows()', function ( selector, opts ) {
38630		// argument shifting
38631		if ( selector === undefined ) {
38632			selector = '';
38633		}
38634		else if ( $.isPlainObject( selector ) ) {
38635			opts = selector;
38636			selector = '';
38637		}
38638	
38639		opts = _selector_opts( opts );
38640	
38641		var inst = this.iterator( 'table', function ( settings ) {
38642			return __row_selector( settings, selector, opts );
38643		}, 1 );
38644	
38645		// Want argument shifting here and in __row_selector?
38646		inst.selector.rows = selector;
38647		inst.selector.opts = opts;
38648	
38649		return inst;
38650	} );
38651	
38652	_api_register( 'rows().nodes()', function () {
38653		return this.iterator( 'row', function ( settings, row ) {
38654			return settings.aoData[ row ].nTr || undefined;
38655		}, 1 );
38656	} );
38657	
38658	_api_register( 'rows().data()', function () {
38659		return this.iterator( true, 'rows', function ( settings, rows ) {
38660			return _pluck_order( settings.aoData, rows, '_aData' );
38661		}, 1 );
38662	} );
38663	
38664	_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
38665		return this.iterator( 'row', function ( settings, row ) {
38666			var r = settings.aoData[ row ];
38667			return type === 'search' ? r._aFilterData : r._aSortData;
38668		}, 1 );
38669	} );
38670	
38671	_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
38672		return this.iterator( 'row', function ( settings, row ) {
38673			_fnInvalidate( settings, row, src );
38674		} );
38675	} );
38676	
38677	_api_registerPlural( 'rows().indexes()', 'row().index()', function () {
38678		return this.iterator( 'row', function ( settings, row ) {
38679			return row;
38680		}, 1 );
38681	} );
38682	
38683	_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {
38684		var a = [];
38685		var context = this.context;
38686	
38687		// `iterator` will drop undefined values, but in this case we want them
38688		for ( var i=0, ien=context.length ; i<ien ; i++ ) {
38689			for ( var j=0, jen=this[i].length ; j<jen ; j++ ) {
38690				var id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );
38691				a.push( (hash === true ? '#' : '' )+ id );
38692			}
38693		}
38694	
38695		return new _Api( context, a );
38696	} );
38697	
38698	_api_registerPlural( 'rows().remove()', 'row().remove()', function () {
38699		var that = this;
38700	
38701		this.iterator( 'row', function ( settings, row, thatIdx ) {
38702			var data = settings.aoData;
38703			var rowData = data[ row ];
38704	
38705			data.splice( row, 1 );
38706	
38707			// Update the _DT_RowIndex parameter on all rows in the table
38708			for ( var i=0, ien=data.length ; i<ien ; i++ ) {
38709				if ( data[i].nTr !== null ) {
38710					data[i].nTr._DT_RowIndex = i;
38711				}
38712			}
38713	
38714			// Delete from the display arrays
38715			_fnDeleteIndex( settings.aiDisplayMaster, row );
38716			_fnDeleteIndex( settings.aiDisplay, row );
38717			_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
38718	
38719			// Check for an 'overflow' they case for displaying the table
38720			_fnLengthOverflow( settings );
38721	
38722			// Remove the row's ID reference if there is one
38723			var id = settings.rowIdFn( rowData._aData );
38724			if ( id !== undefined ) {
38725				delete settings.aIds[ id ];
38726			}
38727		} );
38728	
38729		this.iterator( 'table', function ( settings ) {
38730			for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
38731				settings.aoData[i].idx = i;
38732			}
38733		} );
38734	
38735		return this;
38736	} );
38737	
38738	
38739	_api_register( 'rows.add()', function ( rows ) {
38740		var newRows = this.iterator( 'table', function ( settings ) {
38741				var row, i, ien;
38742				var out = [];
38743	
38744				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
38745					row = rows[i];
38746	
38747					if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
38748						out.push( _fnAddTr( settings, row )[0] );
38749					}
38750					else {
38751						out.push( _fnAddData( settings, row ) );
38752					}
38753				}
38754	
38755				return out;
38756			}, 1 );
38757	
38758		// Return an Api.rows() extended instance, so rows().nodes() etc can be used
38759		var modRows = this.rows( -1 );
38760		modRows.pop();
38761		$.merge( modRows, newRows );
38762	
38763		return modRows;
38764	} );
38765	
38766	
38767	
38768	
38769	
38770	/**
38771	 *
38772	 */
38773	_api_register( 'row()', function ( selector, opts ) {
38774		return _selector_first( this.rows( selector, opts ) );
38775	} );
38776	
38777	
38778	_api_register( 'row().data()', function ( data ) {
38779		var ctx = this.context;
38780	
38781		if ( data === undefined ) {
38782			// Get
38783			return ctx.length && this.length ?
38784				ctx[0].aoData[ this[0] ]._aData :
38785				undefined;
38786		}
38787	
38788		// Set
38789		ctx[0].aoData[ this[0] ]._aData = data;
38790	
38791		// Automatically invalidate
38792		_fnInvalidate( ctx[0], this[0], 'data' );
38793	
38794		return this;
38795	} );
38796	
38797	
38798	_api_register( 'row().node()', function () {
38799		var ctx = this.context;
38800	
38801		return ctx.length && this.length ?
38802			ctx[0].aoData[ this[0] ].nTr || null :
38803			null;
38804	} );
38805	
38806	
38807	_api_register( 'row.add()', function ( row ) {
38808		// Allow a jQuery object to be passed in - only a single row is added from
38809		// it though - the first element in the set
38810		if ( row instanceof $ && row.length ) {
38811			row = row[0];
38812		}
38813	
38814		var rows = this.iterator( 'table', function ( settings ) {
38815			if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
38816				return _fnAddTr( settings, row )[0];
38817			}
38818			return _fnAddData( settings, row );
38819		} );
38820	
38821		// Return an Api.rows() extended instance, with the newly added row selected
38822		return this.row( rows[0] );
38823	} );
38824	
38825	
38826	
38827	var __details_add = function ( ctx, row, data, klass )
38828	{
38829		// Convert to array of TR elements
38830		var rows = [];
38831		var addRow = function ( r, k ) {
38832			// Recursion to allow for arrays of jQuery objects
38833			if ( $.isArray( r ) || r instanceof $ ) {
38834				for ( var i=0, ien=r.length ; i<ien ; i++ ) {
38835					addRow( r[i], k );
38836				}
38837				return;
38838			}
38839	
38840			// If we get a TR element, then just add it directly - up to the dev
38841			// to add the correct number of columns etc
38842			if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {
38843				rows.push( r );
38844			}
38845			else {
38846				// Otherwise create a row with a wrapper
38847				var created = $('<tr><td/></tr>').addClass( k );
38848				$('td', created)
38849					.addClass( k )
38850					.html( r )
38851					[0].colSpan = _fnVisbleColumns( ctx );
38852	
38853				rows.push( created[0] );
38854			}
38855		};
38856	
38857		addRow( data, klass );
38858	
38859		if ( row._details ) {
38860			row._details.remove();
38861		}
38862	
38863		row._details = $(rows);
38864	
38865		// If the children were already shown, that state should be retained
38866		if ( row._detailsShow ) {
38867			row._details.insertAfter( row.nTr );
38868		}
38869	};
38870	
38871	
38872	var __details_remove = function ( api, idx )
38873	{
38874		var ctx = api.context;
38875	
38876		if ( ctx.length ) {
38877			var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
38878	
38879			if ( row && row._details ) {
38880				row._details.remove();
38881	
38882				row._detailsShow = undefined;
38883				row._details = undefined;
38884			}
38885		}
38886	};
38887	
38888	
38889	var __details_display = function ( api, show ) {
38890		var ctx = api.context;
38891	
38892		if ( ctx.length && api.length ) {
38893			var row = ctx[0].aoData[ api[0] ];
38894	
38895			if ( row._details ) {
38896				row._detailsShow = show;
38897	
38898				if ( show ) {
38899					row._details.insertAfter( row.nTr );
38900				}
38901				else {
38902					row._details.detach();
38903				}
38904	
38905				__details_events( ctx[0] );
38906			}
38907		}
38908	};
38909	
38910	
38911	var __details_events = function ( settings )
38912	{
38913		var api = new _Api( settings );
38914		var namespace = '.dt.DT_details';
38915		var drawEvent = 'draw'+namespace;
38916		var colvisEvent = 'column-visibility'+namespace;
38917		var destroyEvent = 'destroy'+namespace;
38918		var data = settings.aoData;
38919	
38920		api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
38921	
38922		if ( _pluck( data, '_details' ).length > 0 ) {
38923			// On each draw, insert the required elements into the document
38924			api.on( drawEvent, function ( e, ctx ) {
38925				if ( settings !== ctx ) {
38926					return;
38927				}
38928	
38929				api.rows( {page:'current'} ).eq(0).each( function (idx) {
38930					// Internal data grab
38931					var row = data[ idx ];
38932	
38933					if ( row._detailsShow ) {
38934						row._details.insertAfter( row.nTr );
38935					}
38936				} );
38937			} );
38938	
38939			// Column visibility change - update the colspan
38940			api.on( colvisEvent, function ( e, ctx, idx, vis ) {
38941				if ( settings !== ctx ) {
38942					return;
38943				}
38944	
38945				// Update the colspan for the details rows (note, only if it already has
38946				// a colspan)
38947				var row, visible = _fnVisbleColumns( ctx );
38948	
38949				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
38950					row = data[i];
38951	
38952					if ( row._details ) {
38953						row._details.children('td[colspan]').attr('colspan', visible );
38954					}
38955				}
38956			} );
38957	
38958			// Table destroyed - nuke any child rows
38959			api.on( destroyEvent, function ( e, ctx ) {
38960				if ( settings !== ctx ) {
38961					return;
38962				}
38963	
38964				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
38965					if ( data[i]._details ) {
38966						__details_remove( api, i );
38967					}
38968				}
38969			} );
38970		}
38971	};
38972	
38973	// Strings for the method names to help minification
38974	var _emp = '';
38975	var _child_obj = _emp+'row().child';
38976	var _child_mth = _child_obj+'()';
38977	
38978	// data can be:
38979	//  tr
38980	//  string
38981	//  jQuery or array of any of the above
38982	_api_register( _child_mth, function ( data, klass ) {
38983		var ctx = this.context;
38984	
38985		if ( data === undefined ) {
38986			// get
38987			return ctx.length && this.length ?
38988				ctx[0].aoData[ this[0] ]._details :
38989				undefined;
38990		}
38991		else if ( data === true ) {
38992			// show
38993			this.child.show();
38994		}
38995		else if ( data === false ) {
38996			// remove
38997			__details_remove( this );
38998		}
38999		else if ( ctx.length && this.length ) {
39000			// set
39001			__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );
39002		}
39003	
39004		return this;
39005	} );
39006	
39007	
39008	_api_register( [
39009		_child_obj+'.show()',
39010		_child_mth+'.show()' // only when `child()` was called with parameters (without
39011	], function ( show ) {   // it returns an object and this method is not executed)
39012		__details_display( this, true );
39013		return this;
39014	} );
39015	
39016	
39017	_api_register( [
39018		_child_obj+'.hide()',
39019		_child_mth+'.hide()' // only when `child()` was called with parameters (without
39020	], function () {         // it returns an object and this method is not executed)
39021		__details_display( this, false );
39022		return this;
39023	} );
39024	
39025	
39026	_api_register( [
39027		_child_obj+'.remove()',
39028		_child_mth+'.remove()' // only when `child()` was called with parameters (without
39029	], function () {           // it returns an object and this method is not executed)
39030		__details_remove( this );
39031		return this;
39032	} );
39033	
39034	
39035	_api_register( _child_obj+'.isShown()', function () {
39036		var ctx = this.context;
39037	
39038		if ( ctx.length && this.length ) {
39039			// _detailsShown as false or undefined will fall through to return false
39040			return ctx[0].aoData[ this[0] ]._detailsShow || false;
39041		}
39042		return false;
39043	} );
39044	
39045	
39046	
39047	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
39048	 * Columns
39049	 *
39050	 * {integer}           - column index (>=0 count from left, <0 count from right)
39051	 * "{integer}:visIdx"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)
39052	 * "{integer}:visible" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)
39053	 * "{string}:name"     - column name
39054	 * "{string}"          - jQuery selector on column header nodes
39055	 *
39056	 */
39057	
39058	// can be an array of these items, comma separated list, or an array of comma
39059	// separated lists
39060	
39061	var __re_column_selector = /^(.+):(name|visIdx|visible)$/;
39062	
39063	
39064	// r1 and r2 are redundant - but it means that the parameters match for the
39065	// iterator callback in columns().data()
39066	var __columnData = function ( settings, column, r1, r2, rows ) {
39067		var a = [];
39068		for ( var row=0, ien=rows.length ; row<ien ; row++ ) {
39069			a.push( _fnGetCellData( settings, rows[row], column ) );
39070		}
39071		return a;
39072	};
39073	
39074	
39075	var __column_selector = function ( settings, selector, opts )
39076	{
39077		var
39078			columns = settings.aoColumns,
39079			names = _pluck( columns, 'sName' ),
39080			nodes = _pluck( columns, 'nTh' );
39081	
39082		var run = function ( s ) {
39083			var selInt = _intVal( s );
39084	
39085			// Selector - all
39086			if ( s === '' ) {
39087				return _range( columns.length );
39088			}
39089			
39090			// Selector - index
39091			if ( selInt !== null ) {
39092				return [ selInt >= 0 ?
39093					selInt : // Count from left
39094					columns.length + selInt // Count from right (+ because its a negative value)
39095				];
39096			}
39097			
39098			// Selector = function
39099			if ( typeof s === 'function' ) {
39100				var rows = _selector_row_indexes( settings, opts );
39101	
39102				return $.map( columns, function (col, idx) {
39103					return s(
39104							idx,
39105							__columnData( settings, idx, 0, 0, rows ),
39106							nodes[ idx ]
39107						) ? idx : null;
39108				} );
39109			}
39110	
39111			// jQuery or string selector
39112			var match = typeof s === 'string' ?
39113				s.match( __re_column_selector ) :
39114				'';
39115	
39116			if ( match ) {
39117				switch( match[2] ) {
39118					case 'visIdx':
39119					case 'visible':
39120						var idx = parseInt( match[1], 10 );
39121						// Visible index given, convert to column index
39122						if ( idx < 0 ) {
39123							// Counting from the right
39124							var visColumns = $.map( columns, function (col,i) {
39125								return col.bVisible ? i : null;
39126							} );
39127							return [ visColumns[ visColumns.length + idx ] ];
39128						}
39129						// Counting from the left
39130						return [ _fnVisibleToColumnIndex( settings, idx ) ];
39131	
39132					case 'name':
39133						// match by name. `names` is column index complete and in order
39134						return $.map( names, function (name, i) {
39135							return name === match[1] ? i : null;
39136						} );
39137				}
39138			}
39139			else {
39140				// jQuery selector on the TH elements for the columns
39141				return $( nodes )
39142					.filter( s )
39143					.map( function () {
39144						return $.inArray( this, nodes ); // `nodes` is column index complete and in order
39145					} )
39146					.toArray();
39147			}
39148		};
39149	
39150		return _selector_run( 'column', selector, run, settings, opts );
39151	};
39152	
39153	
39154	var __setColumnVis = function ( settings, column, vis, recalc ) {
39155		var
39156			cols = settings.aoColumns,
39157			col  = cols[ column ],
39158			data = settings.aoData,
39159			row, cells, i, ien, tr;
39160	
39161		// Get
39162		if ( vis === undefined ) {
39163			return col.bVisible;
39164		}
39165	
39166		// Set
39167		// No change
39168		if ( col.bVisible === vis ) {
39169			return;
39170		}
39171	
39172		if ( vis ) {
39173			// Insert column
39174			// Need to decide if we should use appendChild or insertBefore
39175			var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
39176	
39177			for ( i=0, ien=data.length ; i<ien ; i++ ) {
39178				tr = data[i].nTr;
39179				cells = data[i].anCells;
39180	
39181				if ( tr ) {
39182					// insertBefore can act like appendChild if 2nd arg is null
39183					tr.insertBefore( cells[ column ], cells[ insertBefore ] || null );
39184				}
39185			}
39186		}
39187		else {
39188			// Remove column
39189			$( _pluck( settings.aoData, 'anCells', column ) ).detach();
39190		}
39191	
39192		// Common actions
39193		col.bVisible = vis;
39194		_fnDrawHead( settings, settings.aoHeader );
39195		_fnDrawHead( settings, settings.aoFooter );
39196	
39197		if ( recalc === undefined || recalc ) {
39198			// Automatically adjust column sizing
39199			_fnAdjustColumnSizing( settings );
39200	
39201			// Realign columns for scrolling
39202			if ( settings.oScroll.sX || settings.oScroll.sY ) {
39203				_fnScrollDraw( settings );
39204			}
39205		}
39206	
39207		_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis] );
39208	
39209		_fnSaveState( settings );
39210	};
39211	
39212	
39213	_api_register( 'columns()', function ( selector, opts ) {
39214		// argument shifting
39215		if ( selector === undefined ) {
39216			selector = '';
39217		}
39218		else if ( $.isPlainObject( selector ) ) {
39219			opts = selector;
39220			selector = '';
39221		}
39222	
39223		opts = _selector_opts( opts );
39224	
39225		var inst = this.iterator( 'table', function ( settings ) {
39226			return __column_selector( settings, selector, opts );
39227		}, 1 );
39228	
39229		// Want argument shifting here and in _row_selector?
39230		inst.selector.cols = selector;
39231		inst.selector.opts = opts;
39232	
39233		return inst;
39234	} );
39235	
39236	_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {
39237		return this.iterator( 'column', function ( settings, column ) {
39238			return settings.aoColumns[column].nTh;
39239		}, 1 );
39240	} );
39241	
39242	_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {
39243		return this.iterator( 'column', function ( settings, column ) {
39244			return settings.aoColumns[column].nTf;
39245		}, 1 );
39246	} );
39247	
39248	_api_registerPlural( 'columns().data()', 'column().data()', function () {
39249		return this.iterator( 'column-rows', __columnData, 1 );
39250	} );
39251	
39252	_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {
39253		return this.iterator( 'column', function ( settings, column ) {
39254			return settings.aoColumns[column].mData;
39255		}, 1 );
39256	} );
39257	
39258	_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {
39259		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
39260			return _pluck_order( settings.aoData, rows,
39261				type === 'search' ? '_aFilterData' : '_aSortData', column
39262			);
39263		}, 1 );
39264	} );
39265	
39266	_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {
39267		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
39268			return _pluck_order( settings.aoData, rows, 'anCells', column ) ;
39269		}, 1 );
39270	} );
39271	
39272	_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {
39273		return this.iterator( 'column', function ( settings, column ) {
39274			if ( vis === undefined ) {
39275				return settings.aoColumns[ column ].bVisible;
39276			} // else
39277			__setColumnVis( settings, column, vis, calc );
39278		} );
39279	} );
39280	
39281	_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {
39282		return this.iterator( 'column', function ( settings, column ) {
39283			return type === 'visible' ?
39284				_fnColumnIndexToVisible( settings, column ) :
39285				column;
39286		}, 1 );
39287	} );
39288	
39289	_api_register( 'columns.adjust()', function () {
39290		return this.iterator( 'table', function ( settings ) {
39291			_fnAdjustColumnSizing( settings );
39292		}, 1 );
39293	} );
39294	
39295	_api_register( 'column.index()', function ( type, idx ) {
39296		if ( this.context.length !== 0 ) {
39297			var ctx = this.context[0];
39298	
39299			if ( type === 'fromVisible' || type === 'toData' ) {
39300				return _fnVisibleToColumnIndex( ctx, idx );
39301			}
39302			else if ( type === 'fromData' || type === 'toVisible' ) {
39303				return _fnColumnIndexToVisible( ctx, idx );
39304			}
39305		}
39306	} );
39307	
39308	_api_register( 'column()', function ( selector, opts ) {
39309		return _selector_first( this.columns( selector, opts ) );
39310	} );
39311	
39312	
39313	
39314	
39315	var __cell_selector = function ( settings, selector, opts )
39316	{
39317		var data = settings.aoData;
39318		var rows = _selector_row_indexes( settings, opts );
39319		var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );
39320		var allCells = $( [].concat.apply([], cells) );
39321		var row;
39322		var columns = settings.aoColumns.length;
39323		var a, i, ien, j, o, host;
39324	
39325		var run = function ( s ) {
39326			var fnSelector = typeof s === 'function';
39327	
39328			if ( s === null || s === undefined || fnSelector ) {
39329				// All cells and function selectors
39330				a = [];
39331	
39332				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
39333					row = rows[i];
39334	
39335					for ( j=0 ; j<columns ; j++ ) {
39336						o = {
39337							row: row,
39338							column: j
39339						};
39340	
39341						if ( fnSelector ) {
39342							// Selector - function
39343							host = data[ row ];
39344	
39345							if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {
39346								a.push( o );
39347							}
39348						}
39349						else {
39350							// Selector - all
39351							a.push( o );
39352						}
39353					}
39354				}
39355	
39356				return a;
39357			}
39358			
39359			// Selector - index
39360			if ( $.isPlainObject( s ) ) {
39361				return [s];
39362			}
39363	
39364			// Selector - jQuery filtered cells
39365			return allCells
39366				.filter( s )
39367				.map( function (i, el) {
39368					if ( el.parentNode ) {
39369						row = el.parentNode._DT_RowIndex;
39370					}
39371					else {
39372						// If no parent node, then the cell is hidden and we'll need
39373						// to traverse the array to find it
39374						for ( i=0, ien=data.length ; i<ien ; i++ ) {
39375							if ( $.inArray( el, data[i].anCells ) !== -1 ) {
39376								row = i;
39377								break;
39378							}
39379						}
39380					}
39381	
39382					return {
39383						row: row,
39384						column: $.inArray( el, data[ row ].anCells )
39385					};
39386				} )
39387				.toArray();
39388		};
39389	
39390		return _selector_run( 'cell', selector, run, settings, opts );
39391	};
39392	
39393	
39394	
39395	
39396	_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {
39397		// Argument shifting
39398		if ( $.isPlainObject( rowSelector ) ) {
39399			// Indexes
39400			if ( rowSelector.row === undefined ) {
39401				// Selector options in first parameter
39402				opts = rowSelector;
39403				rowSelector = null;
39404			}
39405			else {
39406				// Cell index objects in first parameter
39407				opts = columnSelector;
39408				columnSelector = null;
39409			}
39410		}
39411		if ( $.isPlainObject( columnSelector ) ) {
39412			opts = columnSelector;
39413			columnSelector = null;
39414		}
39415	
39416		// Cell selector
39417		if ( columnSelector === null || columnSelector === undefined ) {
39418			return this.iterator( 'table', function ( settings ) {
39419				return __cell_selector( settings, rowSelector, _selector_opts( opts ) );
39420			} );
39421		}
39422	
39423		// Row + column selector
39424		var columns = this.columns( columnSelector, opts );
39425		var rows = this.rows( rowSelector, opts );
39426		var a, i, ien, j, jen;
39427	
39428		var cells = this.iterator( 'table', function ( settings, idx ) {
39429			a = [];
39430	
39431			for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
39432				for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {
39433					a.push( {
39434						row:    rows[idx][i],
39435						column: columns[idx][j]
39436					} );
39437				}
39438			}
39439	
39440			return a;
39441		}, 1 );
39442	
39443		$.extend( cells.selector, {
39444			cols: columnSelector,
39445			rows: rowSelector,
39446			opts: opts
39447		} );
39448	
39449		return cells;
39450	} );
39451	
39452	
39453	_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {
39454		return this.iterator( 'cell', function ( settings, row, column ) {
39455			var cells = settings.aoData[ row ].anCells;
39456			return cells ?
39457				cells[ column ] :
39458				undefined;
39459		}, 1 );
39460	} );
39461	
39462	
39463	_api_register( 'cells().data()', function () {
39464		return this.iterator( 'cell', function ( settings, row, column ) {
39465			return _fnGetCellData( settings, row, column );
39466		}, 1 );
39467	} );
39468	
39469	
39470	_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {
39471		type = type === 'search' ? '_aFilterData' : '_aSortData';
39472	
39473		return this.iterator( 'cell', function ( settings, row, column ) {
39474			return settings.aoData[ row ][ type ][ column ];
39475		}, 1 );
39476	} );
39477	
39478	
39479	_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {
39480		return this.iterator( 'cell', function ( settings, row, column ) {
39481			return _fnGetCellData( settings, row, column, type );
39482		}, 1 );
39483	} );
39484	
39485	
39486	_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {
39487		return this.iterator( 'cell', function ( settings, row, column ) {
39488			return {
39489				row: row,
39490				column: column,
39491				columnVisible: _fnColumnIndexToVisible( settings, column )
39492			};
39493		}, 1 );
39494	} );
39495	
39496	
39497	_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {
39498		return this.iterator( 'cell', function ( settings, row, column ) {
39499			_fnInvalidate( settings, row, src, column );
39500		} );
39501	} );
39502	
39503	
39504	
39505	_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {
39506		return _selector_first( this.cells( rowSelector, columnSelector, opts ) );
39507	} );
39508	
39509	
39510	_api_register( 'cell().data()', function ( data ) {
39511		var ctx = this.context;
39512		var cell = this[0];
39513	
39514		if ( data === undefined ) {
39515			// Get
39516			return ctx.length && cell.length ?
39517				_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :
39518				undefined;
39519		}
39520	
39521		// Set
39522		_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );
39523		_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );
39524	
39525		return this;
39526	} );
39527	
39528	
39529	
39530	/**
39531	 * Get current ordering (sorting) that has been applied to the table.
39532	 *
39533	 * @returns {array} 2D array containing the sorting information for the first
39534	 *   table in the current context. Each element in the parent array represents
39535	 *   a column being sorted upon (i.e. multi-sorting with two columns would have
39536	 *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is
39537	 *   the column index that the sorting condition applies to, the second is the
39538	 *   direction of the sort (`desc` or `asc`) and, optionally, the third is the
39539	 *   index of the sorting order from the `column.sorting` initialisation array.
39540	 *//**
39541	 * Set the ordering for the table.
39542	 *
39543	 * @param {integer} order Column index to sort upon.
39544	 * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)
39545	 * @returns {DataTables.Api} this
39546	 *//**
39547	 * Set the ordering for the table.
39548	 *
39549	 * @param {array} order 1D array of sorting information to be applied.
39550	 * @param {array} [...] Optional additional sorting conditions
39551	 * @returns {DataTables.Api} this
39552	 *//**
39553	 * Set the ordering for the table.
39554	 *
39555	 * @param {array} order 2D array of sorting information to be applied.
39556	 * @returns {DataTables.Api} this
39557	 */
39558	_api_register( 'order()', function ( order, dir ) {
39559		var ctx = this.context;
39560	
39561		if ( order === undefined ) {
39562			// get
39563			return ctx.length !== 0 ?
39564				ctx[0].aaSorting :
39565				undefined;
39566		}
39567	
39568		// set
39569		if ( typeof order === 'number' ) {
39570			// Simple column / direction passed in
39571			order = [ [ order, dir ] ];
39572		}
39573		else if ( ! $.isArray( order[0] ) ) {
39574			// Arguments passed in (list of 1D arrays)
39575			order = Array.prototype.slice.call( arguments );
39576		}
39577		// otherwise a 2D array was passed in
39578	
39579		return this.iterator( 'table', function ( settings ) {
39580			settings.aaSorting = order.slice();
39581		} );
39582	} );
39583	
39584	
39585	/**
39586	 * Attach a sort listener to an element for a given column
39587	 *
39588	 * @param {node|jQuery|string} node Identifier for the element(s) to attach the
39589	 *   listener to. This can take the form of a single DOM node, a jQuery
39590	 *   collection of nodes or a jQuery selector which will identify the node(s).
39591	 * @param {integer} column the column that a click on this node will sort on
39592	 * @param {function} [callback] callback function when sort is run
39593	 * @returns {DataTables.Api} this
39594	 */
39595	_api_register( 'order.listener()', function ( node, column, callback ) {
39596		return this.iterator( 'table', function ( settings ) {
39597			_fnSortAttachListener( settings, node, column, callback );
39598		} );
39599	} );
39600	
39601	
39602	// Order by the selected column(s)
39603	_api_register( [
39604		'columns().order()',
39605		'column().order()'
39606	], function ( dir ) {
39607		var that = this;
39608	
39609		return this.iterator( 'table', function ( settings, i ) {
39610			var sort = [];
39611	
39612			$.each( that[i], function (j, col) {
39613				sort.push( [ col, dir ] );
39614			} );
39615	
39616			settings.aaSorting = sort;
39617		} );
39618	} );
39619	
39620	
39621	
39622	_api_register( 'search()', function ( input, regex, smart, caseInsen ) {
39623		var ctx = this.context;
39624	
39625		if ( input === undefined ) {
39626			// get
39627			return ctx.length !== 0 ?
39628				ctx[0].oPreviousSearch.sSearch :
39629				undefined;
39630		}
39631	
39632		// set
39633		return this.iterator( 'table', function ( settings ) {
39634			if ( ! settings.oFeatures.bFilter ) {
39635				return;
39636			}
39637	
39638			_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {
39639				"sSearch": input+"",
39640				"bRegex":  regex === null ? false : regex,
39641				"bSmart":  smart === null ? true  : smart,
39642				"bCaseInsensitive": caseInsen === null ? true : caseInsen
39643			} ), 1 );
39644		} );
39645	} );
39646	
39647	
39648	_api_registerPlural(
39649		'columns().search()',
39650		'column().search()',
39651		function ( input, regex, smart, caseInsen ) {
39652			return this.iterator( 'column', function ( settings, column ) {
39653				var preSearch = settings.aoPreSearchCols;
39654	
39655				if ( input === undefined ) {
39656					// get
39657					return preSearch[ column ].sSearch;
39658				}
39659	
39660				// set
39661				if ( ! settings.oFeatures.bFilter ) {
39662					return;
39663				}
39664	
39665				$.extend( preSearch[ column ], {
39666					"sSearch": input+"",
39667					"bRegex":  regex === null ? false : regex,
39668					"bSmart":  smart === null ? true  : smart,
39669					"bCaseInsensitive": caseInsen === null ? true : caseInsen
39670				} );
39671	
39672				_fnFilterComplete( settings, settings.oPreviousSearch, 1 );
39673			} );
39674		}
39675	);
39676	
39677	/*
39678	 * State API methods
39679	 */
39680	
39681	_api_register( 'state()', function () {
39682		return this.context.length ?
39683			this.context[0].oSavedState :
39684			null;
39685	} );
39686	
39687	
39688	_api_register( 'state.clear()', function () {
39689		return this.iterator( 'table', function ( settings ) {
39690			// Save an empty object
39691			settings.fnStateSaveCallback.call( settings.oInstance, settings, {} );
39692		} );
39693	} );
39694	
39695	
39696	_api_register( 'state.loaded()', function () {
39697		return this.context.length ?
39698			this.context[0].oLoadedState :
39699			null;
39700	} );
39701	
39702	
39703	_api_register( 'state.save()', function () {
39704		return this.iterator( 'table', function ( settings ) {
39705			_fnSaveState( settings );
39706		} );
39707	} );
39708	
39709	
39710	
39711	/**
39712	 * Provide a common method for plug-ins to check the version of DataTables being
39713	 * used, in order to ensure compatibility.
39714	 *
39715	 *  @param {string} version Version string to check for, in the format "X.Y.Z".
39716	 *    Note that the formats "X" and "X.Y" are also acceptable.
39717	 *  @returns {boolean} true if this version of DataTables is greater or equal to
39718	 *    the required version, or false if this version of DataTales is not
39719	 *    suitable
39720	 *  @static
39721	 *  @dtopt API-Static
39722	 *
39723	 *  @example
39724	 *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );
39725	 */
39726	DataTable.versionCheck = DataTable.fnVersionCheck = function( version )
39727	{
39728		var aThis = DataTable.version.split('.');
39729		var aThat = version.split('.');
39730		var iThis, iThat;
39731	
39732		for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {
39733			iThis = parseInt( aThis[i], 10 ) || 0;
39734			iThat = parseInt( aThat[i], 10 ) || 0;
39735	
39736			// Parts are the same, keep comparing
39737			if (iThis === iThat) {
39738				continue;
39739			}
39740	
39741			// Parts are different, return immediately
39742			return iThis > iThat;
39743		}
39744	
39745		return true;
39746	};
39747	
39748	
39749	/**
39750	 * Check if a `<table>` node is a DataTable table already or not.
39751	 *
39752	 *  @param {node|jquery|string} table Table node, jQuery object or jQuery
39753	 *      selector for the table to test. Note that if more than more than one
39754	 *      table is passed on, only the first will be checked
39755	 *  @returns {boolean} true the table given is a DataTable, or false otherwise
39756	 *  @static
39757	 *  @dtopt API-Static
39758	 *
39759	 *  @example
39760	 *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
39761	 *      $('#example').dataTable();
39762	 *    }
39763	 */
39764	DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
39765	{
39766		var t = $(table).get(0);
39767		var is = false;
39768	
39769		$.each( DataTable.settings, function (i, o) {
39770			var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
39771			var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
39772	
39773			if ( o.nTable === t || head === t || foot === t ) {
39774				is = true;
39775			}
39776		} );
39777	
39778		return is;
39779	};
39780	
39781	
39782	/**
39783	 * Get all DataTable tables that have been initialised - optionally you can
39784	 * select to get only currently visible tables.
39785	 *
39786	 *  @param {boolean} [visible=false] Flag to indicate if you want all (default)
39787	 *    or visible tables only.
39788	 *  @returns {array} Array of `table` nodes (not DataTable instances) which are
39789	 *    DataTables
39790	 *  @static
39791	 *  @dtopt API-Static
39792	 *
39793	 *  @example
39794	 *    $.each( $.fn.dataTable.tables(true), function () {
39795	 *      $(table).DataTable().columns.adjust();
39796	 *    } );
39797	 */
39798	DataTable.tables = DataTable.fnTables = function ( visible )
39799	{
39800		var api = false;
39801	
39802		if ( $.isPlainObject( visible ) ) {
39803			api = visible.api;
39804			visible = visible.visible;
39805		}
39806	
39807		var a = $.map( DataTable.settings, function (o) {
39808			if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
39809				return o.nTable;
39810			}
39811		} );
39812	
39813		return api ?
39814			new _Api( a ) :
39815			a;
39816	};
39817	
39818	
39819	/**
39820	 * DataTables utility methods
39821	 * 
39822	 * This namespace provides helper methods that DataTables uses internally to
39823	 * create a DataTable, but which are not exclusively used only for DataTables.
39824	 * These methods can be used by extension authors to save the duplication of
39825	 * code.
39826	 *
39827	 *  @namespace
39828	 */
39829	DataTable.util = {
39830		/**
39831		 * Throttle the calls to a function. Arguments and context are maintained
39832		 * for the throttled function.
39833		 *
39834		 * @param {function} fn Function to be called
39835		 * @param {integer} freq Call frequency in mS
39836		 * @return {function} Wrapped function
39837		 */
39838		throttle: _fnThrottle,
39839	
39840	
39841		/**
39842		 * Escape a string such that it can be used in a regular expression
39843		 *
39844		 *  @param {string} sVal string to escape
39845		 *  @returns {string} escaped string
39846		 */
39847		escapeRegex: _fnEscapeRegex
39848	};
39849	
39850	
39851	/**
39852	 * Convert from camel case parameters to Hungarian notation. This is made public
39853	 * for the extensions to provide the same ability as DataTables core to accept
39854	 * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
39855	 * parameters.
39856	 *
39857	 *  @param {object} src The model object which holds all parameters that can be
39858	 *    mapped.
39859	 *  @param {object} user The object to convert from camel case to Hungarian.
39860	 *  @param {boolean} force When set to `true`, properties which already have a
39861	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
39862	 *    won't be.
39863	 */
39864	DataTable.camelToHungarian = _fnCamelToHungarian;
39865	
39866	
39867	
39868	/**
39869	 *
39870	 */
39871	_api_register( '$()', function ( selector, opts ) {
39872		var
39873			rows   = this.rows( opts ).nodes(), // Get all rows
39874			jqRows = $(rows);
39875	
39876		return $( [].concat(
39877			jqRows.filter( selector ).toArray(),
39878			jqRows.find( selector ).toArray()
39879		) );
39880	} );
39881	
39882	
39883	// jQuery functions to operate on the tables
39884	$.each( [ 'on', 'one', 'off' ], function (i, key) {
39885		_api_register( key+'()', function ( /* event, handler */ ) {
39886			var args = Array.prototype.slice.call(arguments);
39887	
39888			// Add the `dt` namespace automatically if it isn't already present
39889			if ( ! args[0].match(/\.dt\b/) ) {
39890				args[0] += '.dt';
39891			}
39892	
39893			var inst = $( this.tables().nodes() );
39894			inst[key].apply( inst, args );
39895			return this;
39896		} );
39897	} );
39898	
39899	
39900	_api_register( 'clear()', function () {
39901		return this.iterator( 'table', function ( settings ) {
39902			_fnClearTable( settings );
39903		} );
39904	} );
39905	
39906	
39907	_api_register( 'settings()', function () {
39908		return new _Api( this.context, this.context );
39909	} );
39910	
39911	
39912	_api_register( 'init()', function () {
39913		var ctx = this.context;
39914		return ctx.length ? ctx[0].oInit : null;
39915	} );
39916	
39917	
39918	_api_register( 'data()', function () {
39919		return this.iterator( 'table', function ( settings ) {
39920			return _pluck( settings.aoData, '_aData' );
39921		} ).flatten();
39922	} );
39923	
39924	
39925	_api_register( 'destroy()', function ( remove ) {
39926		remove = remove || false;
39927	
39928		return this.iterator( 'table', function ( settings ) {
39929			var orig      = settings.nTableWrapper.parentNode;
39930			var classes   = settings.oClasses;
39931			var table     = settings.nTable;
39932			var tbody     = settings.nTBody;
39933			var thead     = settings.nTHead;
39934			var tfoot     = settings.nTFoot;
39935			var jqTable   = $(table);
39936			var jqTbody   = $(tbody);
39937			var jqWrapper = $(settings.nTableWrapper);
39938			var rows      = $.map( settings.aoData, function (r) { return r.nTr; } );
39939			var i, ien;
39940	
39941			// Flag to note that the table is currently being destroyed - no action
39942			// should be taken
39943			settings.bDestroying = true;
39944	
39945			// Fire off the destroy callbacks for plug-ins etc
39946			_fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
39947	
39948			// If not being removed from the document, make all columns visible
39949			if ( ! remove ) {
39950				new _Api( settings ).columns().visible( true );
39951			}
39952	
39953			// Blitz all `DT` namespaced events (these are internal events, the
39954			// lowercase, `dt` events are user subscribed and they are responsible
39955			// for removing them
39956			jqWrapper.unbind('.DT').find(':not(tbody *)').unbind('.DT');
39957			$(window).unbind('.DT-'+settings.sInstance);
39958	
39959			// When scrolling we had to break the table up - restore it
39960			if ( table != thead.parentNode ) {
39961				jqTable.children('thead').detach();
39962				jqTable.append( thead );
39963			}
39964	
39965			if ( tfoot && table != tfoot.parentNode ) {
39966				jqTable.children('tfoot').detach();
39967				jqTable.append( tfoot );
39968			}
39969	
39970			settings.aaSorting = [];
39971			settings.aaSortingFixed = [];
39972			_fnSortingClasses( settings );
39973	
39974			$( rows ).removeClass( settings.asStripeClasses.join(' ') );
39975	
39976			$('th, td', thead).removeClass( classes.sSortable+' '+
39977				classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
39978			);
39979	
39980			if ( settings.bJUI ) {
39981				$('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach();
39982				$('th, td', thead).each( function () {
39983					var wrapper = $('div.'+classes.sSortJUIWrapper, this);
39984					$(this).append( wrapper.contents() );
39985					wrapper.detach();
39986				} );
39987			}
39988	
39989			// Add the TR elements back into the table in their original order
39990			jqTbody.children().detach();
39991			jqTbody.append( rows );
39992	
39993			// Remove the DataTables generated nodes, events and classes
39994			var removedMethod = remove ? 'remove' : 'detach';
39995			jqTable[ removedMethod ]();
39996			jqWrapper[ removedMethod ]();
39997	
39998			// If we need to reattach the table to the document
39999			if ( ! remove && orig ) {
40000				// insertBefore acts like appendChild if !arg[1]
40001				orig.insertBefore( table, settings.nTableReinsertBefore );
40002	
40003				// Restore the width of the original table - was read from the style property,
40004				// so we can restore directly to that
40005				jqTable
40006					.css( 'width', settings.sDestroyWidth )
40007					.removeClass( classes.sTable );
40008	
40009				// If the were originally stripe classes - then we add them back here.
40010				// Note this is not fool proof (for example if not all rows had stripe
40011				// classes - but it's a good effort without getting carried away
40012				ien = settings.asDestroyStripes.length;
40013	
40014				if ( ien ) {
40015					jqTbody.children().each( function (i) {
40016						$(this).addClass( settings.asDestroyStripes[i % ien] );
40017					} );
40018				}
40019			}
40020	
40021			/* Remove the settings object from the settings array */
40022			var idx = $.inArray( settings, DataTable.settings );
40023			if ( idx !== -1 ) {
40024				DataTable.settings.splice( idx, 1 );
40025			}
40026		} );
40027	} );
40028	
40029	
40030	// Add the `every()` method for rows, columns and cells in a compact form
40031	$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
40032		_api_register( type+'s().every()', function ( fn ) {
40033			return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {
40034				// Rows and columns:
40035				//  arg1 - index
40036				//  arg2 - table counter
40037				//  arg3 - loop counter
40038				//  arg4 - undefined
40039				// Cells:
40040				//  arg1 - row index
40041				//  arg2 - column index
40042				//  arg3 - table counter
40043				//  arg4 - loop counter
40044				fn.call(
40045					new _Api( settings )[ type ]( arg1, type==='cell' ? arg2 : undefined ),
40046					arg1, arg2, arg3, arg4
40047				);
40048			} );
40049		} );
40050	} );
40051	
40052	
40053	// i18n method for extensions to be able to use the language object from the
40054	// DataTable
40055	_api_register( 'i18n()', function ( token, def, plural ) {
40056		var ctx = this.context[0];
40057		var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
40058	
40059		if ( resolved === undefined ) {
40060			resolved = def;
40061		}
40062	
40063		if ( plural !== undefined && $.isPlainObject( resolved ) ) {
40064			resolved = resolved[ plural ] !== undefined ?
40065				resolved[ plural ] :
40066				resolved._;
40067		}
40068	
40069		return resolved.replace( '%d', plural ); // nb: plural might be undefined,
40070	} );
40071
40072	/**
40073	 * Version string for plug-ins to check compatibility. Allowed format is
40074	 * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
40075	 * only for non-release builds. See http://semver.org/ for more information.
40076	 *  @member
40077	 *  @type string
40078	 *  @default Version number
40079	 */
40080	DataTable.version = "1.10.9";
40081
40082	/**
40083	 * Private data store, containing all of the settings objects that are
40084	 * created for the tables on a given page.
40085	 *
40086	 * Note that the `DataTable.settings` object is aliased to
40087	 * `jQuery.fn.dataTableExt` through which it may be accessed and
40088	 * manipulated, or `jQuery.fn.dataTable.settings`.
40089	 *  @member
40090	 *  @type array
40091	 *  @default []
40092	 *  @private
40093	 */
40094	DataTable.settings = [];
40095
40096	/**
40097	 * Object models container, for the various models that DataTables has
40098	 * available to it. These models define the objects that are used to hold
40099	 * the active state and configuration of the table.
40100	 *  @namespace
40101	 */
40102	DataTable.models = {};
40103	
40104	
40105	
40106	/**
40107	 * Template object for the way in which DataTables holds information about
40108	 * search information for the global filter and individual column filters.
40109	 *  @namespace
40110	 */
40111	DataTable.models.oSearch = {
40112		/**
40113		 * Flag to indicate if the filtering should be case insensitive or not
40114		 *  @type boolean
40115		 *  @default true
40116		 */
40117		"bCaseInsensitive": true,
40118	
40119		/**
40120		 * Applied search term
40121		 *  @type string
40122		 *  @default <i>Empty string</i>
40123		 */
40124		"sSearch": "",
40125	
40126		/**
40127		 * Flag to indicate if the search term should be interpreted as a
40128		 * regular expression (true) or not (false) and therefore and special
40129		 * regex characters escaped.
40130		 *  @type boolean
40131		 *  @default false
40132		 */
40133		"bRegex": false,
40134	
40135		/**
40136		 * Flag to indicate if DataTables is to use its smart filtering or not.
40137		 *  @type boolean
40138		 *  @default true
40139		 */
40140		"bSmart": true
40141	};
40142	
40143	
40144	
40145	
40146	/**
40147	 * Template object for the way in which DataTables holds information about
40148	 * each individual row. This is the object format used for the settings
40149	 * aoData array.
40150	 *  @namespace
40151	 */
40152	DataTable.models.oRow = {
40153		/**
40154		 * TR element for the row
40155		 *  @type node
40156		 *  @default null
40157		 */
40158		"nTr": null,
40159	
40160		/**
40161		 * Array of TD elements for each row. This is null until the row has been
40162		 * created.
40163		 *  @type array nodes
40164		 *  @default []
40165		 */
40166		"anCells": null,
40167	
40168		/**
40169		 * Data object from the original data source for the row. This is either
40170		 * an array if using the traditional form of DataTables, or an object if
40171		 * using mData options. The exact type will depend on the passed in
40172		 * data from the data source, or will be an array if using DOM a data
40173		 * source.
40174		 *  @type array|object
40175		 *  @default []
40176		 */
40177		"_aData": [],
40178	
40179		/**
40180		 * Sorting data cache - this array is ostensibly the same length as the
40181		 * number of columns (although each index is generated only as it is
40182		 * needed), and holds the data that is used for sorting each column in the
40183		 * row. We do this cache generation at the start of the sort in order that
40184		 * the formatting of the sort data need be done only once for each cell
40185		 * per sort. This array should not be read from or written to by anything
40186		 * other than the master sorting methods.
40187		 *  @type array
40188		 *  @default null
40189		 *  @private
40190		 */
40191		"_aSortData": null,
40192	
40193		/**
40194		 * Per cell filtering data cache. As per the sort data cache, used to
40195		 * increase the performance of the filtering in DataTables
40196		 *  @type array
40197		 *  @default null
40198		 *  @private
40199		 */
40200		"_aFilterData": null,
40201	
40202		/**
40203		 * Filtering data cache. This is the same as the cell filtering cache, but
40204		 * in this case a string rather than an array. This is easily computed with
40205		 * a join on `_aFilterData`, but is provided as a cache so the join isn't
40206		 * needed on every search (memory traded for performance)
40207		 *  @type array
40208		 *  @default null
40209		 *  @private
40210		 */
40211		"_sFilterRow": null,
40212	
40213		/**
40214		 * Cache of the class name that DataTables has applied to the row, so we
40215		 * can quickly look at this variable rather than needing to do a DOM check
40216		 * on className for the nTr property.
40217		 *  @type string
40218		 *  @default <i>Empty string</i>
40219		 *  @private
40220		 */
40221		"_sRowStripe": "",
40222	
40223		/**
40224		 * Denote if the original data source was from the DOM, or the data source
40225		 * object. This is used for invalidating data, so DataTables can
40226		 * automatically read data from the original source, unless uninstructed
40227		 * otherwise.
40228		 *  @type string
40229		 *  @default null
40230		 *  @private
40231		 */
40232		"src": null,
40233	
40234		/**
40235		 * Index in the aoData array. This saves an indexOf lookup when we have the
40236		 * object, but want to know the index
40237		 *  @type integer
40238		 *  @default -1
40239		 *  @private
40240		 */
40241		"idx": -1
40242	};
40243	
40244	
40245	/**
40246	 * Template object for the column information object in DataTables. This object
40247	 * is held in the settings aoColumns array and contains all the information that
40248	 * DataTables needs about each individual column.
40249	 *
40250	 * Note that this object is related to {@link DataTable.defaults.column}
40251	 * but this one is the internal data store for DataTables's cache of columns.
40252	 * It should NOT be manipulated outside of DataTables. Any configuration should
40253	 * be done through the initialisation options.
40254	 *  @namespace
40255	 */
40256	DataTable.models.oColumn = {
40257		/**
40258		 * Column index. This could be worked out on-the-fly with $.inArray, but it
40259		 * is faster to just hold it as a variable
40260		 *  @type integer
40261		 *  @default null
40262		 */
40263		"idx": null,
40264	
40265		/**
40266		 * A list of the columns that sorting should occur on when this column
40267		 * is sorted. That this property is an array allows multi-column s
40267orting
40268		 * to be defined for a column (for example first name / last name columns
40269		 * would benefit from this). The values are integers pointing to the
40270		 * columns to be sorted on (typically it will be a single integer pointing
40271		 * at itself, but that doesn't need to be the case).
40272		 *  @type array
40273		 */
40274		"aDataSort": null,
40275	
40276		/**
40277		 * Define the sorting directions that are applied to the column, in sequence
40278		 * as the column is repeatedly sorted upon - i.e. the first value is used
40279		 * as the sorting direction when the column if first sorted (clicked on).
40280		 * Sort it again (click again) and it will move on to the next index.
40281		 * Repeat until loop.
40282		 *  @type array
40283		 */
40284		"asSorting": null,
40285	
40286		/**
40287		 * Flag to indicate if the column is searchable, and thus should be included
40288		 * in the filtering or not.
40289		 *  @type boolean
40290		 */
40291		"bSearchable": null,
40292	
40293		/**
40294		 * Flag to indicate if the column is sortable or not.
40295		 *  @type boolean
40296		 */
40297		"bSortable": null,
40298	
40299		/**
40300		 * Flag to indicate if the column is currently visible in the table or not
40301		 *  @type boolean
40302		 */
40303		"bVisible": null,
40304	
40305		/**
40306		 * Store for manual type assignment using the `column.type` option. This
40307		 * is held in store so we can manipulate the column's `sType` property.
40308		 *  @type string
40309		 *  @default null
40310		 *  @private
40311		 */
40312		"_sManualType": null,
40313	
40314		/**
40315		 * Flag to indicate if HTML5 data attributes should be used as the data
40316		 * source for filtering or sorting. True is either are.
40317		 *  @type boolean
40318		 *  @default false
40319		 *  @private
40320		 */
40321		"_bAttrSrc": false,
40322	
40323		/**
40324		 * Developer definable function that is called whenever a cell is created (Ajax source,
40325		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
40326		 * allowing you to modify the DOM element (add background colour for example) when the
40327		 * element is available.
40328		 *  @type function
40329		 *  @param {element} nTd The TD node that has been created
40330		 *  @param {*} sData The Data for the cell
40331		 *  @param {array|object} oData The data for the whole row
40332		 *  @param {int} iRow The row index for the aoData data store
40333		 *  @default null
40334		 */
40335		"fnCreatedCell": null,
40336	
40337		/**
40338		 * Function to get data from a cell in a column. You should <b>never</b>
40339		 * access data directly through _aData internally in DataTables - always use
40340		 * the method attached to this property. It allows mData to function as
40341		 * required. This function is automatically assigned by the column
40342		 * initialisation method
40343		 *  @type function
40344		 *  @param {array|object} oData The data array/object for the array
40345		 *    (i.e. aoData[]._aData)
40346		 *  @param {string} sSpecific The specific data type you want to get -
40347		 *    'display', 'type' 'filter' 'sort'
40348		 *  @returns {*} The data for the cell from the given row's data
40349		 *  @default null
40350		 */
40351		"fnGetData": null,
40352	
40353		/**
40354		 * Function to set data for a cell in the column. You should <b>never</b>
40355		 * set the data directly to _aData internally in DataTables - always use
40356		 * this method. It allows mData to function as required. This function
40357		 * is automatically assigned by the column initialisation method
40358		 *  @type function
40359		 *  @param {array|object} oData The data array/object for the array
40360		 *    (i.e. aoData[]._aData)
40361		 *  @param {*} sValue Value to set
40362		 *  @default null
40363		 */
40364		"fnSetData": null,
40365	
40366		/**
40367		 * Property to read the value for the cells in the column from the data
40368		 * source array / object. If null, then the default content is used, if a
40369		 * function is given then the return from the function is used.
40370		 *  @type function|int|string|null
40371		 *  @default null
40372		 */
40373		"mData": null,
40374	
40375		/**
40376		 * Partner property to mData which is used (only when defined) to get
40377		 * the data - i.e. it is basically the same as mData, but without the
40378		 * 'set' option, and also the data fed to it is the result from mData.
40379		 * This is the rendering method to match the data method of mData.
40380		 *  @type function|int|string|null
40381		 *  @default null
40382		 */
40383		"mRender": null,
40384	
40385		/**
40386		 * Unique header TH/TD element for this column - this is what the sorting
40387		 * listener is attached to (if sorting is enabled.)
40388		 *  @type node
40389		 *  @default null
40390		 */
40391		"nTh": null,
40392	
40393		/**
40394		 * Unique footer TH/TD element for this column (if there is one). Not used
40395		 * in DataTables as such, but can be used for plug-ins to reference the
40396		 * footer for each column.
40397		 *  @type node
40398		 *  @default null
40399		 */
40400		"nTf": null,
40401	
40402		/**
40403		 * The class to apply to all TD elements in the table's TBODY for the column
40404		 *  @type string
40405		 *  @default null
40406		 */
40407		"sClass": null,
40408	
40409		/**
40410		 * When DataTables calculates the column widths to assign to each column,
40411		 * it finds the longest string in each column and then constructs a
40412		 * temporary table and reads the widths from that. The problem with this
40413		 * is that "mmm" is much wider then "iiii", but the latter is a longer
40414		 * string - thus the calculation can go wrong (doing it properly and putting
40415		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
40416		 * a "work around" we provide this option. It will append its value to the
40417		 * text that is found to be the longest string for the column - i.e. padding.
40418		 *  @type string
40419		 */
40420		"sContentPadding": null,
40421	
40422		/**
40423		 * Allows a default value to be given for a column's data, and will be used
40424		 * whenever a null data source is encountered (this can be because mData
40425		 * is set to null, or because the data source itself is null).
40426		 *  @type string
40427		 *  @default null
40428		 */
40429		"sDefaultContent": null,
40430	
40431		/**
40432		 * Name for the column, allowing reference to the column by name as well as
40433		 * by index (needs a lookup to work by name).
40434		 *  @type string
40435		 */
40436		"sName": null,
40437	
40438		/**
40439		 * Custom sorting data type - defines which of the available plug-ins in
40440		 * afnSortData the custom sorting will use - if any is defined.
40441		 *  @type string
40442		 *  @default std
40443		 */
40444		"sSortDataType": 'std',
40445	
40446		/**
40447		 * Class to be applied to the header element when sorting on this column
40448		 *  @type string
40449		 *  @default null
40450		 */
40451		"sSortingClass": null,
40452	
40453		/**
40454		 * Class to be applied to the header element when sorting on this column -
40455		 * when jQuery UI theming is used.
40456		 *  @type string
40457		 *  @default null
40458		 */
40459		"sSortingClassJUI": null,
40460	
40461		/**
40462		 * Title of the column - what is seen in the TH element (nTh).
40463		 *  @type string
40464		 */
40465		"sTitle": null,
40466	
40467		/**
40468		 * Column sorting and filtering type
40469		 *  @type string
40470		 *  @default null
40471		 */
40472		"sType": null,
40473	
40474		/**
40475		 * Width of the column
40476		 *  @type string
40477		 *  @default null
40478		 */
40479		"sWidth": null,
40480	
40481		/**
40482		 * Width of the column when it was first "encountered"
40483		 *  @type string
40484		 *  @default null
40485		 */
40486		"sWidthOrig": null
40487	};
40488	
40489	
40490	/*
40491	 * Developer note: The properties of the object below are given in Hungarian
40492	 * notation, that was used as the interface for DataTables prior to v1.10, however
40493	 * from v1.10 onwards the primary interface is camel case. In order to avoid
40494	 * breaking backwards compatibility utterly with this change, the Hungarian
40495	 * version is still, internally the primary interface, but is is not documented
40496	 * - hence the @name tags in each doc comment. This allows a Javascript function
40497	 * to create a map from Hungarian notation to camel case (going the other direction
40498	 * would require each property to be listed, which would at around 3K to the size
40499	 * of DataTables, while this method is about a 0.5K hit.
40500	 *
40501	 * Ultimately this does pave the way for Hungarian notation to be dropped
40502	 * completely, but that is a massive amount of work and will break current
40503	 * installs (therefore is on-hold until v2).
40504	 */
40505	
40506	/**
40507	 * Initialisation options that can be given to DataTables at initialisation
40508	 * time.
40509	 *  @namespace
40510	 */
40511	DataTable.defaults = {
40512		/**
40513		 * An array of data to use for the table, passed in at initialisation which
40514		 * will be used in preference to any data which is already in the DOM. This is
40515		 * particularly useful for constructing tables purely in Javascript, for
40516		 * example with a custom Ajax call.
40517		 *  @type array
40518		 *  @default null
40519		 *
40520		 *  @dtopt Option
40521		 *  @name DataTable.defaults.data
40522		 *
40523		 *  @example
40524		 *    // Using a 2D array data source
40525		 *    $(document).ready( function () {
40526		 *      $('#example').dataTable( {
40527		 *        "data": [
40528		 *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
40529		 *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
40530		 *        ],
40531		 *        "columns": [
40532		 *          { "title": "Engine" },
40533		 *          { "title": "Browser" },
40534		 *          { "title": "Platform" },
40535		 *          { "title": "Version" },
40536		 *          { "title": "Grade" }
40537		 *        ]
40538		 *      } );
40539		 *    } );
40540		 *
40541		 *  @example
40542		 *    // Using an array of objects as a data source (`data`)
40543		 *    $(document).ready( function () {
40544		 *      $('#example').dataTable( {
40545		 *        "data": [
40546		 *          {
40547		 *            "engine":   "Trident",
40548		 *            "browser":  "Internet Explorer 4.0",
40549		 *            "platform": "Win 95+",
40550		 *            "version":  4,
40551		 *            "grade":    "X"
40552		 *          },
40553		 *          {
40554		 *            "engine":   "Trident",
40555		 *            "browser":  "Internet Explorer 5.0",
40556		 *            "platform": "Win 95+",
40557		 *            "version":  5,
40558		 *            "grade":    "C"
40559		 *          }
40560		 *        ],
40561		 *        "columns": [
40562		 *          { "title": "Engine",   "data": "engine" },
40563		 *          { "title": "Browser",  "data": "browser" },
40564		 *          { "title": "Platform", "data": "platform" },
40565		 *          { "title": "Version",  "data": "version" },
40566		 *          { "title": "Grade",    "data": "grade" }
40567		 *        ]
40568		 *      } );
40569		 *    } );
40570		 */
40571		"aaData": null,
40572	
40573	
40574		/**
40575		 * If ordering is enabled, then DataTables will perform a first pass sort on
40576		 * initialisation. You can define which column(s) the sort is performed
40577		 * upon, and the sorting direction, with this variable. The `sorting` array
40578		 * should contain an array for each column to be sorted initially containing
40579		 * the column's index and a direction string ('asc' or 'desc').
40580		 *  @type array
40581		 *  @default [[0,'asc']]
40582		 *
40583		 *  @dtopt Option
40584		 *  @name DataTable.defaults.order
40585		 *
40586		 *  @example
40587		 *    // Sort by 3rd column first, and then 4th column
40588		 *    $(document).ready( function() {
40589		 *      $('#example').dataTable( {
40590		 *        "order": [[2,'asc'], [3,'desc']]
40591		 *      } );
40592		 *    } );
40593		 *
40594		 *    // No initial sorting
40595		 *    $(document).ready( function() {
40596		 *      $('#example').dataTable( {
40597		 *        "order": []
40598		 *      } );
40599		 *    } );
40600		 */
40601		"aaSorting": [[0,'asc']],
40602	
40603	
40604		/**
40605		 * This parameter is basically identical to the `sorting` parameter, but
40606		 * cannot be overridden by user interaction with the table. What this means
40607		 * is that you could have a column (visible or hidden) which the sorting
40608		 * will always be forced on first - any sorting after that (from the user)
40609		 * will then be performed as required. This can be useful for grouping rows
40610		 * together.
40611		 *  @type array
40612		 *  @default null
40613		 *
40614		 *  @dtopt Option
40615		 *  @name DataTable.defaults.orderFixed
40616		 *
40617		 *  @example
40618		 *    $(document).ready( function() {
40619		 *      $('#example').dataTable( {
40620		 *        "orderFixed": [[0,'asc']]
40621		 *      } );
40622		 *    } )
40623		 */
40624		"aaSortingFixed": [],
40625	
40626	
40627		/**
40628		 * DataTables can be instructed to load data to display in the table from a
40629		 * Ajax source. This option defines how that Ajax call is made and where to.
40630		 *
40631		 * The `ajax` property has three different modes of operation, depending on
40632		 * how it is defined. These are:
40633		 *
40634		 * * `string` - Set the URL from where the data should be loaded from.
40635		 * * `object` - Define properties for `jQuery.ajax`.
40636		 * * `function` - Custom data get function
40637		 *
40638		 * `string`
40639		 * --------
40640		 *
40641		 * As a string, the `ajax` property simply defines the URL from which
40642		 * DataTables will load data.
40643		 *
40644		 * `object`
40645		 * --------
40646		 *
40647		 * As an object, the parameters in the object are passed to
40648		 * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
40649		 * of the Ajax request. DataTables has a number of default parameters which
40650		 * you can override using this option. Please refer to the jQuery
40651		 * documentation for a full description of the options available, although
40652		 * the following parameters provide additional options in DataTables or
40653		 * require special consideration:
40654		 *
40655		 * * `data` - As with jQuery, `data` can be provided as an object, but it
40656		 *   can also be used as a function to manipulate the data DataTables sends
40657		 *   to the server. The function takes a single parameter, an object of
40658		 *   parameters with the values that DataTables has readied for sending. An
40659		 *   object may be returned which will be merged into the DataTables
40660		 *   defaults, or you can add the items to the object that was passed in and
40661		 *   not return anything from the function. This supersedes `fnServerParams`
40662		 *   from DataTables 1.9-.
40663		 *
40664		 * * `dataSrc` - By default DataTables will look for the property `data` (or
40665		 *   `aaData` for compatibility with DataTables 1.9-) when obtaining data
40666		 *   from an Ajax source or for server-side processing - this parameter
40667		 *   allows that property to be changed. You can use Javascript dotted
40668		 *   object notation to get a data source for multiple levels of nesting, or
40669		 *   it my be used as a function. As a function it takes a single parameter,
40670		 *   the JSON returned from the server, which can be manipulated as
40671		 *   required, with the returned value being that used by DataTables as the
40672		 *   data source for the table. This supersedes `sAjaxDataProp` from
40673		 *   DataTables 1.9-.
40674		 *
40675		 * * `success` - Should not be overridden it is used internally in
40676		 *   DataTables. To manipulate / transform the data returned by the server
40677		 *   use `ajax.dataSrc`, or use `ajax` as a function (see below).
40678		 *
40679		 * `function`
40680		 * ----------
40681		 *
40682		 * As a function, making the Ajax call is left up to yourself allowing
40683		 * complete control of the Ajax request. Indeed, if desired, a method other
40684		 * than Ajax could be used to obtain the required data, such as Web storage
40685		 * or an AIR database.
40686		 *
40687		 * The function is given four parameters and no return is required. The
40688		 * parameters are:
40689		 *
40690		 * 1. _object_ - Data to send to the server
40691		 * 2. _function_ - Callback function that must be executed when the required
40692		 *    data has been obtained. That data should be passed into the callback
40693		 *    as the only parameter
40694		 * 3. _object_ - DataTables settings object for the table
40695		 *
40696		 * Note that this supersedes `fnServerData` from DataTables 1.9-.
40697		 *
40698		 *  @type string|object|function
40699		 *  @default null
40700		 *
40701		 *  @dtopt Option
40702		 *  @name DataTable.defaults.ajax
40703		 *  @since 1.10.0
40704		 *
40705		 * @example
40706		 *   // Get JSON data from a file via Ajax.
40707		 *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
40708		 *   $('#example').dataTable( {
40709		 *     "ajax": "data.json"
40710		 *   } );
40711		 *
40712		 * @example
40713		 *   // Get JSON data from a file via Ajax, using `dataSrc` to change
40714		 *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
40715		 *   $('#example').dataTable( {
40716		 *     "ajax": {
40717		 *       "url": "data.json",
40718		 *       "dataSrc": "tableData"
40719		 *     }
40720		 *   } );
40721		 *
40722		 * @example
40723		 *   // Get JSON data from a file via Ajax, using `dataSrc` to read data
40724		 *   // from a plain array rather than an array in an object
40725		 *   $('#example').dataTable( {
40726		 *     "ajax": {
40727		 *       "url": "data.json",
40728		 *       "dataSrc": ""
40729		 *     }
40730		 *   } );
40731		 *
40732		 * @example
40733		 *   // Manipulate the data returned from the server - add a link to data
40734		 *   // (note this can, should, be done using `render` for the column - this
40735		 *   // is just a simple example of how the data can be manipulated).
40736		 *   $('#example').dataTable( {
40737		 *     "ajax": {
40738		 *       "url": "data.json",
40739		 *       "dataSrc": function ( json ) {
40740		 *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {
40741		 *           json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>';
40742		 *         }
40743		 *         return json;
40744		 *       }
40745		 *     }
40746		 *   } );
40747		 *
40748		 * @example
40749		 *   // Add data to the request
40750		 *   $('#example').dataTable( {
40751		 *     "ajax": {
40752		 *       "url": "data.json",
40753		 *       "data": function ( d ) {
40754		 *         return {
40755		 *           "extra_search": $('#extra').val()
40756		 *         };
40757		 *       }
40758		 *     }
40759		 *   } );
40760		 *
40761		 * @example
40762		 *   // Send request as POST
40763		 *   $('#example').dataTable( {
40764		 *     "ajax": {
40765		 *       "url": "data.json",
40766		 *       "type": "POST"
40767		 *     }
40768		 *   } );
40769		 *
40770		 * @example
40771		 *   // Get the data from localStorage (could interface with a form for
40772		 *   // adding, editing and removing rows).
40773		 *   $('#example').dataTable( {
40774		 *     "ajax": function (data, callback, settings) {
40775		 *       callback(
40776		 *         JSON.parse( localStorage.getItem('dataTablesData') )
40777		 *       );
40778		 *     }
40779		 *   } );
40780		 */
40781		"ajax": null,
40782	
40783	
40784		/**
40785		 * This parameter allows you to readily specify the entries in the length drop
40786		 * down menu that DataTables shows when pagination is enabled. It can be
40787		 * either a 1D array of options which will be used for both the displayed
40788		 * option and the value, or a 2D array which will use the array in the first
40789		 * position as the value, and the array in the second position as the
40790		 * displayed options (useful for language strings such as 'All').
40791		 *
40792		 * Note that the `pageLength` property will be automatically set to the
40793		 * first value given in this array, unless `pageLength` is also provided.
40794		 *  @type array
40795		 *  @default [ 10, 25, 50, 100 ]
40796		 *
40797		 *  @dtopt Option
40798		 *  @name DataTable.defaults.lengthMenu
40799		 *
40800		 *  @example
40801		 *    $(document).ready( function() {
40802		 *      $('#example').dataTable( {
40803		 *        "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
40804		 *      } );
40805		 *    } );
40806		 */
40807		"aLengthMenu": [ 10, 25, 50, 100 ],
40808	
40809	
40810		/**
40811		 * The `columns` option in the initialisation parameter allows you to define
40812		 * details about the way individual columns behave. For a full list of
40813		 * column options that can be set, please see
40814		 * {@link DataTable.defaults.column}. Note that if you use `columns` to
40815		 * define your columns, you must have an entry in the array for every single
40816		 * column that you have in your table (these can be null if you don't which
40817		 * to specify any options).
40818		 *  @member
40819		 *
40820		 *  @name DataTable.defaults.column
40821		 */
40822		"aoColumns": null,
40823	
40824		/**
40825		 * Very similar to `columns`, `columnDefs` allows you to target a specific
40826		 * column, multiple columns, or all columns, using the `targets` property of
40827		 * each object in the array. This allows great flexibility when creating
40828		 * tables, as the `columnDefs` arrays can be of any length, targeting the
40829		 * columns you specifically want. `columnDefs` may use any of the column
40830		 * options available: {@link DataTable.defaults.column}, but it _must_
40831		 * have `targets` defined in each object in the array. Values in the `targets`
40832		 * array may be:
40833		 *   <ul>
40834		 *     <li>
40834a string - class name will be matched on the TH for the column</li>
40835		 *     <li>0 or a positive integer - column index counting from the left</li>
40836		 *     <li>a negative integer - column index counting from the right</li>
40837		 *     <li>the string "_all" - all columns (i.e. assign a default)</li>
40838		 *   </ul>
40839		 *  @member
40840		 *
40841		 *  @name DataTable.defaults.columnDefs
40842		 */
40843		"aoColumnDefs": null,
40844	
40845	
40846		/**
40847		 * Basically the same as `search`, this parameter defines the individual column
40848		 * filtering state at initialisation time. The array must be of the same size
40849		 * as the number of columns, and each element be an object with the parameters
40850		 * `search` and `escapeRegex` (the latter is optional). 'null' is also
40851		 * accepted and the default will be used.
40852		 *  @type array
40853		 *  @default []
40854		 *
40855		 *  @dtopt Option
40856		 *  @name DataTable.defaults.searchCols
40857		 *
40858		 *  @example
40859		 *    $(document).ready( function() {
40860		 *      $('#example').dataTable( {
40861		 *        "searchCols": [
40862		 *          null,
40863		 *          { "search": "My filter" },
40864		 *          null,
40865		 *          { "search": "^[0-9]", "escapeRegex": false }
40866		 *        ]
40867		 *      } );
40868		 *    } )
40869		 */
40870		"aoSearchCols": [],
40871	
40872	
40873		/**
40874		 * An array of CSS classes that should be applied to displayed rows. This
40875		 * array may be of any length, and DataTables will apply each class
40876		 * sequentially, looping when required.
40877		 *  @type array
40878		 *  @default null <i>
40878Will take the values determined by the `oClasses.stripe*`
40879		 *    options</i>
40880		 *
40881		 *  @dtopt Option
40882		 *  @name DataTable.defaults.stripeClasses
40883		 *
40884		 *  @example
40885		 *    $(document).ready( function() {
40886		 *      $('#example').dataTable( {
40887		 *        "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
40888		 *      } );
40889		 *    } )
40890		 */
40891		"asStripeClasses": null,
40892	
40893	
40894		/**
40895		 * Enable or disable automatic column width calculation. This can be disabled
40896		 * as an optimisation (it takes some time to calculate the widths) if the
40897		 * tables widths are passed in using `columns`.
40898		 *  @type boolean
40899		 *  @default true
40900		 *
40901		 *  @dtopt Features
40902		 *  @name DataTable.defaults.autoWidth
40903		 *
40904		 *  @example
40905		 *    $(document).ready( function () {
40906		 *      $('#example').dataTable( {
40907		 *        "autoWidth": false
40908		 *      } );
40909		 *    } );
40910		 */
40911		"bAutoWidth": true,
40912	
40913	
40914		/**
40915		 * Deferred rendering can provide DataTables with a huge speed boost when you
40916		 * are using an Ajax or JS data source for the table. This option, when set to
40917		 * true, will cause DataTables to defer the creation of the table elements for
40918		 * each row until they are needed for a draw - saving a significant amount of
40919		 * time.
40920		 *  @type boolean
40921		 *  @default false
40922		 *
40923		 *  @dtopt Features
40924		 *  @name DataTable.defaults.deferRender
40925		 *
40926		 *  @example
40927		 *    $(document).ready( function() {
40928		 *      $('#example').dataTable( {
40929		 *        "ajax": "sources/arrays.txt",
40930		 *        "deferRender": true
40931		 *      } );
40932		 *    } );
40933		 */
40934		"bDeferRender": false,
40935	
40936	
40937		/**
40938		 * Replace a DataTable which matches the given selector and replace it with
40939		 * one which has the properties of the new initialisation object passed. If no
40940		 * table matches the selector, then the new DataTable will be constructed as
40941		 * per normal.
40942		 *  @type boolean
40943		 *  @default false
40944		 *
40945		 *  @dtopt Options
40946		 *  @name DataTable.defaults.destroy
40947		 *
40948		 *  @example
40949		 *    $(document).ready( function() {
40950		 *      $('#example').dataTable( {
40951		 *        "srollY": "200px",
40952		 *        "paginate": false
40953		 *      } );
40954		 *
40955		 *      // Some time later....
40956		 *      $('#example').dataTable( {
40957		 *        "filter": false,
40958		 *        "destroy": true
40959		 *      } );
40960		 *    } );
40961		 */
40962		"bDestroy": false,
40963	
40964	
40965		/**
40966		 * Enable or disable filtering of data. Filtering in DataTables is "smart" in
40967		 * that it allows the end user to input multiple words (space separated) and
40968		 * will match a row containing those words, even if not in the order that was
40969		 * specified (this allow matching across multiple columns). Note that if you
40970		 * wish to use filtering in DataTables this must remain 'true' - to remove the
40971		 * default filtering input box and retain filtering abilities, please use
40972		 * {@link DataTable.defaults.dom}.
40973		 *  @type boolean
40974		 *  @default true
40975		 *
40976		 *  @dtopt Features
40977		 *  @name DataTable.defaults.searching
40978		 *
40979		 *  @example
40980		 *    $(document).ready( function () {
40981		 *      $('#example').dataTable( {
40982		 *        "searching": false
40983		 *      } );
40984		 *    } );
40985		 */
40986		"bFilter": true,
40987	
40988	
40989		/**
40990		 * Enable or disable the table information display. This shows information
40991		 * about the data that is currently visible on the page, including information
40992		 * about filtered data if that action is being performed.
40993		 *  @type boolean
40994		 *  @default true
40995		 *
40996		 *  @dtopt Features
40997		 *  @name DataTable.defaults.info
40998		 *
40999		 *  @example
41000		 *    $(document).ready( function () {
41001		 *      $('#example').dataTable( {
41002		 *        "info": false
41003		 *      } );
41004		 *    } );
41005		 */
41006		"bInfo": true,
41007	
41008	
41009		/**
41010		 * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
41011		 * slightly different and additional mark-up from what DataTables has
41012		 * traditionally used).
41013		 *  @type boolean
41014		 *  @default false
41015		 *
41016		 *  @dtopt Features
41017		 *  @name DataTable.defaults.jQueryUI
41018		 *
41019		 *  @example
41020		 *    $(document).ready( function() {
41021		 *      $('#example').dataTable( {
41022		 *        "jQueryUI": true
41023		 *      } );
41024		 *    } );
41025		 */
41026		"bJQueryUI": false,
41027	
41028	
41029		/**
41030		 * Allows the end user to select the size of a formatted page from a select
41031		 * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
41032		 *  @type boolean
41033		 *  @default true
41034		 *
41035		 *  @dtopt Features
41036		 *  @name DataTable.defaults.lengthChange
41037		 *
41038		 *  @example
41039		 *    $(document).ready( function () {
41040		 *      $('#example').dataTable( {
41041		 *        "lengthChange": false
41042		 *      } );
41043		 *    } );
41044		 */
41045		"bLengthChange": true,
41046	
41047	
41048		/**
41049		 * Enable or disable pagination.
41050		 *  @type boolean
41051		 *  @default true
41052		 *
41053		 *  @dtopt Features
41054		 *  @name DataTable.defaults.paging
41055		 *
41056		 *  @example
41057		 *    $(document).ready( function () {
41058		 *      $('#example').dataTable( {
41059		 *        "paging": false
41060		 *      } );
41061		 *    } );
41062		 */
41063		"bPaginate": true,
41064	
41065	
41066		/**
41067		 * Enable or disable the display of a 'processing' indicator when the table is
41068		 * being processed (e.g. a sort). This is particularly useful for tables with
41069		 * large amounts of data where it can take a noticeable amount of time to sort
41070		 * the entries.
41071		 *  @type boolean
41072		 *  @default false
41073		 *
41074		 *  @dtopt Features
41075		 *  @name DataTable.defaults.processing
41076		 *
41077		 *  @example
41078		 *    $(document).ready( function () {
41079		 *      $('#example').dataTable( {
41080		 *        "processing": true
41081		 *      } );
41082		 *    } );
41083		 */
41084		"bProcessing": false,
41085	
41086	
41087		/**
41088		 * Retrieve the DataTables object for the given selector. Note that if the
41089		 * table has already been initialised, this parameter will cause DataTables
41090		 * to simply return the object that has already been set up - it will not take
41091		 * account of any changes you might have made to the initialisation object
41092		 * passed to DataTables (setting this parameter to true is an acknowledgement
41093		 * that you understand this). `destroy` can be used to reinitialise a table if
41094		 * you need.
41095		 *  @type boolean
41096		 *  @default false
41097		 *
41098		 *  @dtopt Options
41099		 *  @name DataTable.defaults.retrieve
41100		 *
41101		 *  @example
41102		 *    $(document).ready( function() {
41103		 *      initTable();
41104		 *      tableActions();
41105		 *    } );
41106		 *
41107		 *    function initTable ()
41108		 *    {
41109		 *      return $('#example').dataTable( {
41110		 *        "scrollY": "200px",
41111		 *        "paginate": false,
41112		 *        "retrieve": true
41113		 *      } );
41114		 *    }
41115		 *
41116		 *    function tableActions ()
41117		 *    {
41118		 *      var table = initTable();
41119		 *      // perform API operations with oTable
41120		 *    }
41121		 */
41122		"bRetrieve": false,
41123	
41124	
41125		/**
41126		 * When vertical (y) scrolling is enabled, DataTables will force the height of
41127		 * the table's viewport to the given height at all times (useful for layout).
41128		 * However, this can look odd when filtering data down to a small data set,
41129		 * and the footer is left "floating" further down. This parameter (when
41130		 * enabled) will cause DataTables to collapse the table's viewport down when
41131		 * the result set will fit within the given Y height.
41132		 *  @type boolean
41133		 *  @default false
41134		 *
41135		 *  @dtopt Options
41136		 *  @name DataTable.defaults.scrollCollapse
41137		 *
41138		 *  @example
41139		 *    $(document).ready( function() {
41140		 *      $('#example').dataTable( {
41141		 *        "scrollY": "200",
41142		 *        "scrollCollapse": true
41143		 *      } );
41144		 *    } );
41145		 */
41146		"bScrollCollapse": false,
41147	
41148	
41149		/**
41150		 * Configure DataTables to use server-side processing. Note that the
41151		 * `ajax` parameter must also be given in order to give DataTables a
41152		 * source to obtain the required data for each draw.
41153		 *  @type boolean
41154		 *  @default false
41155		 *
41156		 *  @dtopt Features
41157		 *  @dtopt Server-side
41158		 *  @name DataTable.defaults.serverSide
41159		 *
41160		 *  @example
41161		 *    $(document).ready( function () {
41162		 *      $('#example').dataTable( {
41163		 *        "serverSide": true,
41164		 *        "ajax": "xhr.php"
41165		 *      } );
41166		 *    } );
41167		 */
41168		"bServerSide": false,
41169	
41170	
41171		/**
41172		 * Enable or disable sorting of columns. Sorting of individual columns can be
41173		 * disabled by the `sortable` option for each column.
41174		 *  @type boolean
41175		 *  @default true
41176		 *
41177		 *  @dtopt Features
41178		 *  @name DataTable.defaults.ordering
41179		 *
41180		 *  @example
41181		 *    $(document).ready( function () {
41182		 *      $('#example').dataTable( {
41183		 *        "ordering": false
41184		 *      } );
41185		 *    } );
41186		 */
41187		"bSort": true,
41188	
41189	
41190		/**
41191		 * Enable or display DataTables' ability to sort multiple columns at the
41192		 * same time (activated by shift-click by the user).
41193		 *  @type boolean
41194		 *  @default true
41195		 *
41196		 *  @dtopt Options
41197		 *  @name DataTable.defaults.orderMulti
41198		 *
41199		 *  @example
41200		 *    // Disable multiple column sorting ability
41201		 *    $(document).ready( function () {
41202		 *      $('#example').dataTable( {
41203		 *        "orderMulti": false
41204		 *      } );
41205		 *    } );
41206		 */
41207		"bSortMulti": true,
41208	
41209	
41210		/**
41211		 * Allows control over whether DataTables should use the top (true) unique
41212		 * cell that is found for a single column, or the bottom (false - default).
41213		 * This is useful when using complex headers.
41214		 *  @type boolean
41215		 *  @default false
41216		 *
41217		 *  @dtopt Options
41218		 *  @name DataTable.defaults.orderCellsTop
41219		 *
41220		 *  @example
41221		 *    $(document).ready( function() {
41222		 *      $('#example').dataTable( {
41223		 *        "orderCellsTop": true
41224		 *      } );
41225		 *    } );
41226		 */
41227		"bSortCellsTop": false,
41228	
41229	
41230		/**
41231		 * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
41232		 * `sorting\_3` to the columns which are currently being sorted on. This is
41233		 * presented as a feature switch as it can increase processing time (while
41234		 * classes are removed and added) so for large data sets you might want to
41235		 * turn this off.
41236		 *  @type boolean
41237		 *  @default true
41238		 *
41239		 *  @dtopt Features
41240		 *  @name DataTable.defaults.orderClasses
41241		 *
41242		 *  @example
41243		 *    $(document).ready( function () {
41244		 *      $('#example').dataTable( {
41245		 *        "orderClasses": false
41246		 *      } );
41247		 *    } );
41248		 */
41249		"bSortClasses": true,
41250	
41251	
41252		/**
41253		 * Enable or disable state saving. When enabled HTML5 `localStorage` will be
41254		 * used to save table display information such as pagination information,
41255		 * display length, filtering and sorting. As such when the end user reloads
41256		 * the page the display display will match what thy had previously set up.
41257		 *
41258		 * Due to the use of `localStorage` the default state saving is not supported
41259		 * in IE6 or 7. If state saving is required in those browsers, use
41260		 * `stateSaveCallback` to provide a storage solution such as cookies.
41261		 *  @type boolean
41262		 *  @default false
41263		 *
41264		 *  @dtopt Features
41265		 *  @name DataTable.defaults.stateSave
41266		 *
41267		 *  @example
41268		 *    $(document).ready( function () {
41269		 *      $('#example').dataTable( {
41270		 *        "stateSave": true
41271		 *      } );
41272		 *    } );
41273		 */
41274		"bStateSave": false,
41275	
41276	
41277		/**
41278		 * This function is called when a TR element is created (and all TD child
41279		 * elements have been inserted), or registered if using a DOM source, allowing
41280		 * manipulation of the TR element (adding classes etc).
41281		 *  @type function
41282		 *  @param {node} row "TR" element for the current row
41283		 *  @param {array} data Raw data array for this row
41284		 *  @param {int} dataIndex The index of this row in the internal aoData array
41285		 *
41286		 *  @dtopt Callbacks
41287		 *  @name DataTable.defaults.createdRow
41288		 *
41289		 *  @example
41290		 *    $(document).ready( function() {
41291		 *      $('#example').dataTable( {
41292		 *        "createdRow": function( row, data, dataIndex ) {
41293		 *          // Bold the grade for all 'A' grade browsers
41294		 *          if ( data[4] == "A" )
41295		 *          {
41296		 *            $('td:eq(4)', row).html( '<b>A</b>' );
41297		 *          }
41298		 *        }
41299		 *      } );
41300		 *    } );
41301		 */
41302		"fnCreatedRow": null,
41303	
41304	
41305		/**
41306		 * This function is called on every 'draw' event, and allows you to
41307		 * dynamically modify any aspect you want about the created DOM.
41308		 *  @type function
41309		 *  @param {object} settings DataTables settings object
41310		 *
41311		 *  @dtopt Callbacks
41312		 *  @name DataTable.defaults.drawCallback
41313		 *
41314		 *  @example
41315		 *    $(document).ready( function() {
41316		 *      $('#example').dataTable( {
41317		 *        "drawCallback": function( settings ) {
41318		 *          alert( 'DataTables has redrawn the table' );
41319		 *        }
41320		 *      } );
41321		 *    } );
41322		 */
41323		"fnDrawCallback": null,
41324	
41325	
41326		/**
41327		 * Identical to fnHeaderCallback() but for the table footer this function
41328		 * allows you to modify the table footer on every 'draw' event.
41329		 *  @type function
41330		 *  @param {node} foot "TR" element for the footer
41331		 *  @param {array} data Full table data (as derived from the original HTML)
41332		 *  @param {int} start Index for the current display starting point in the
41333		 *    display array
41334		 *  @param {int} end Index for the current display ending point in the
41335		 *    display array
41336		 *  @param {array int} display Index array to translate the visual position
41337		 *    to the full data array
41338		 *
41339		 *  @dtopt Callbacks
41340		 *  @name DataTable.defaults.footerCallback
41341		 *
41342		 *  @example
41343		 *    $(document).ready( function() {
41344		 *      $('#example').dataTable( {
41345		 *        "footerCallback": function( tfoot, data, start, end, display ) {
41346		 *          tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
41347		 *        }
41348		 *      } );
41349		 *    } )
41350		 */
41351		"fnFooterCallback": null,
41352	
41353	
41354		/**
41355		 * When rendering large numbers in the information element for the table
41356		 * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
41357		 * to have a comma separator for the 'thousands' units (e.g. 1 million is
41358		 * rendered as "1,000,000") to help readability for the end user. This
41359		 * function will override the default method DataTables uses.
41360		 *  @type function
41361		 *  @member
41362		 *  @param {int} toFormat number to be formatted
41363		 *  @returns {string} formatted string for DataTables to show the number
41364		 *
41365		 *  @dtopt Callbacks
41366		 *  @name DataTable.defaults.formatNumber
41367		 *
41368		 *  @example
41369		 *    // Format a number using a single quote for the separator (note that
41370		 *    // this can also be done with the language.thousands option)
41371		 *    $(document).ready( function() {
41372		 *      $('#example').dataTable( {
41373		 *        "formatNumber": function ( toFormat ) {
41374		 *          return toFormat.toString().replace(
41375		 *            /\B(?=(\d{3})+(?!\d))/g, "'"
41376		 *          );
41377		 *        };
41378		 *      } );
41379		 *    } );
41380		 */
41381		"fnFormatNumber": function ( toFormat ) {
41382			return toFormat.toString().replace(
41383				/\B(?=(\d{3})+(?!\d))/g,
41384				this.oLanguage.sThousands
41385			);
41386		},
41387	
41388	
41389		/**
41390		 * This function is called on every 'draw' event, and allows you to
41391		 * dynamically modify the header row. This can be used to calculate and
41392		 * display useful information about the table.
41393		 *  @type function
41394		 *  @param {node} head "TR" element for the header
41395		 *  @param {array} data Full table data (as derived from the original HTML)
41396		 *  @param {int} start Index for the current display starting point in the
41397		 *    display array
41398		 *  @param {int} end Index for the current display ending point in the
41399		 *    display array
41400		 *  @param {array int} display Index array to translate the visual position
41401		 *    to the full data array
41402		 *
41403		 *  @dtopt Callbacks
41404		 *  @name DataTable.defaults.headerCallback
41405		 *
41406		 *  @example
41407		 *    $(document).ready( function() {
41408		 *      $('#example').dataTable( {
41409		 *        "fheaderCallback": function( head, data, start, end, display ) {
41410		 *          head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
41411		 *        }
41412		 *      } );
41413		 *    } )
41414		 */
41415		"fnHeaderCallback": null,
41416	
41417	
41418		/**
41419		 * The information element can be used to convey information about the current
41420		 * state of the table. Although the internationalisation options presented by
41421		 * DataTables are quite capable of dealing with most customisations, there may
41422		 * be times where you wish to customise the string further. This callback
41423		 * allows you to do exactly that.
41424		 *  @type function
41425		 *  @param {object} oSettings DataTables settings object
41426		 *  @param {int} start Starting position in data for the draw
41427		 *  @param {int} end End position in data for the draw
41428		 *  @param {int} max Total number of rows in the table (regardless of
41429		 *    filtering)
41430		 *  @param {int} total Total number of rows in the data set, after filtering
41431		 *  @param {string} pre The string that DataTables has formatted using it's
41432		 *    own rules
41433		 *  @returns {string} The string to be displayed in the information element.
41434		 *
41435		 *  @dtopt Callbacks
41436		 *  @name DataTable.defaults.infoCallback
41437		 *
41438		 *  @example
41439		 *    $('#example').dataTable( {
41440		 *      "infoCallback": function( settings, start, end, max, total, pre ) {
41441		 *        return start +" to "+ end;
41442		 *      }
41443		 *    } );
41444		 */
41445		"fnInfoCallback": null,
41446	
41447	
41448		/**
41449		 * Called when the table has been initialised. Normally DataTables will
41450		 * initialise sequentially and there will be no need for this function,
41451		 * however, this does not hold true when using external language information
41452		 * since that is obtained using an async XHR call.
41453		 *  @type function
41454		 *  @param {object} settings DataTables settings object
41455		 *  @param {object} json The JSON object request from the server - only
41456		 *    present if client-side Ajax sourced data is used
41457		 *
41458		 *  @dtopt Callbacks
41459		 *  @name DataTable.defaults.initComplete
41460		 *
41461		 *  @example
41462		 *    $(document).ready( function() {
41463		 *      $('#example').dataTable( {
41464		 *        "initComplete": function(settings, json) {
41465		 *          alert( 'DataTables has finished its initialisation.' );
41466		 *        }
41467		 *      } );
41468		 *    } )
41469		 */
41470		"fnInitComplete": null,
41471	
41472	
41473		/**
41474		 * Called at the very start of each table draw and can be used to cancel the
41475		 * draw by returning false, any other return (including undefined) results in
41476		 * the full draw occurring).
41477		 *  @type function
41478		 *  @param {object} settings DataTables settings object
41479		 *  @returns {boolean} False will cancel the draw, anything else (including no
41480		 *    return) will allow it to complete.
41481		 *
41482		 *  @dtopt Callbacks
41483		 *  @name DataTable.defaults.preDrawCallback
41484		 *
41485		 *  @example
41486		 *    $(document).ready( function() {
41487		 *      $('#example').dataTable( {
41488		 *        "preDrawCallback": function( settings ) {
41489		 *          if ( $('#test').val() == 1 ) {
41490		 *            return false;
41491		 *          }
41492		 *        }
41493		 *      } );
41494		 *    } );
41495		 */
41496		"fnPreDrawCallback": null,
41497	
41498	
41499		/**
41500		 * This function allows you to 'post process' each row after it have been
41501		 * generated for each table draw, but before it is rendered on screen. This
41502		 * function might be used for setting the row class name etc.
41503		 *  @type function
41504		 *  @param {node} row "TR" element for the current row
41505		 *  @param {array} data Raw data array for this row
41506		 *  @param {int} displayIndex The display index for the current table draw
41507		 *  @param {int} displayIndexFull The index of the data in the full list of
41508		 *    rows (after filtering)
41509		 *
41510		 *  @dtopt Callbacks
41511		 *  @name DataTable.defaults.rowCallback
41512		 *
41513		 *  @example
41514		 *    $(document).ready( function() {
41515		 *      $('#example').dataTable( {
41516		 *        "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
41517		 *          // Bold the grade for all 'A' grade browsers
41518		 *          if ( data[4] == "A" ) {
41519		 *            $('td:eq(4)', row).html( '<b>A</b>' );
41520		 *          }
41521		 *        }
41522		 *      } );
41523		 *    } );
41524		 */
41525		"fnRowCallback": null,
41526	
41527	
41528		/**
41529		 * __Deprecated__ The functionality provided by this parameter has now been
41530		 * superseded by that provided through `ajax`, which should be used instead.
41531		 *
41532		 * This parameter allows you to override the default function which obtains
41533		 * the data from the server so something more suitable for your application.
41534		 * For example you could use POST data, or pull information from a Gears or
41535		 * AIR database.
41536		 *  @type function
41537		 *  @member
41538		 *  @param {string} source HTTP source to obtain the data from (`ajax`)
41539		 *  @param {array} data A key/value pair object containing the data to send
41540		 *    to the server
41541		 *  @param {function} callback to be called on completion of the data get
41542		 *    process that will draw the data on the page.
41543		 *  @param {object} settings DataTables settings object
41544		 *
41545		 *  @dtopt Callbacks
41546		 *  @dtopt Server-side
41547		 *  @name DataTable.defaults.serverData
41548		 *
41549		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
41550		 */
41551		"fnServerData": null,
41552	
41553	
41554		/**
41555		 * __Deprecated__ The functionality provided by this parameter has now been
41556		 * superseded by that provided through `ajax`, which should be used instead.
41557		 *
41558		 *  It is often useful to send extra data to the server when making an Ajax
41559		 * request - for example custom filtering information, and this callback
41560		 * function makes it trivial to send extra information to the server. The
41561		 * passed in parameter is the data set that has been constructed by
41562		 * DataTables, and you can add to this or modify it as you require.
41563		 *  @type function
41564		 *  @param {array} data Data array (array of objects which are name/value
41565		 *    pairs) that has been constructed by DataTables and will be sent to the
41566		 *    server. In the case of Ajax sourced data with server-side processing
41567		 *    this will be an empty array, for server-side processing there will be a
41568		 *    significant number of parameters!
41569		 *  @returns {undefined} Ensure that you modify the data array passed in,
41570		 *    as this is passed by reference.
41571		 *
41572		 *  @dtopt Callbacks
41573		 *  @dtopt Server-side
41574		 *  @name DataTable.defaults.serverParams
41575		 *
41576		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
41577		 */
41578		"fnServerParams": null,
41579	
41580	
41581		/**
41582		 * Load the table state. With this function you can define from where, and how, the
41583		 * state of a table is loaded. By default DataTables will load from `localStorage`
41584		 * but you might wish to use a server-side database or cookies.
41585		 *  @type function
41586		 *  @member
41587		 *  @param {object} settings DataTables settings object
41588		 *  @return {object} The DataTables state object to be loaded
41589		 *
41590		 *  @dtopt Callbacks
41591		 *  @name DataTable.defaults.stateLoadCallback
41592		 *
41593		 *  @example
41594		 *    $(document).ready( function() {
41595		 *      $('#example').dataTable( {
41596		 *        "stateSave": true,
41597		 *        "stateLoadCallback": function (settings) {
41598		 *          var o;
41599		 *
41600		 *          // Send an Ajax request to the server to get the data. Note that
41601		 *          // this is a synchronous request.
41602		 *          $.ajax( {
41603		 *            "url": "/state_load",
41604		 *            "async": false,
41605		 *            "dataType": "json",
41606		 *            "success": function (json) {
41607		 *              o = json;
41608		 *            }
41609		 *          } );
41610		 *
41611		 *          return o;
41612		 *        }
41613		 *      } );
41614		 *    } );
41615		 */
41616		"fnStateLoadCallback": function ( settings ) {
41617			try {
41618				return JSON.parse(
41619					(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
41620						'DataTables_'+settings.sInstance+'_'+location.pathname
41621					)
41622				);
41623			} catch (e) {}
41624		},
41625	
41626	
41627		/**
41628		 * Callback which allows modification of the saved state prior to loading that state.
41629		 * This callback is called when the table is loading state from the stored data, but
41630		 * prior to the settings object being modified by the saved state. Note that for
41631		 * plug-in authors, you should use the `stateLoadParams` event to load parameters for
41632		 * a plug-in.
41633		 *  @type function
41634		 *  @param {object} settings DataTables settings object
41635		 *  @param {object} data The state object that is to be loaded
41636		 *
41637		 *  @dtopt Callbacks
41638		 *  @name DataTable.defaults.stateLoadParams
41639		 *
41640		 *  @example
41641		 *    // Remove a saved filter, so filtering is never loaded
41642		 *    $(document).ready( function() {
41643		 *      $('#example').dataTable( {
41644		 *        "stateSave": true,
41645		 *        "stateLoadParams": function (settings, data) {
41646		 *          data.oSearch.sSearch = "";
41647		 *        }
41648		 *      } );
41649		 *    } );
41650		 *
41651		 *  @example
41652		 *    // Disallow state loading by returning false
41653		 *    $(document).ready( function() {
41654		 *      $('#example').dataTable( {
41655		 *        "stateSave": true,
41656		 *        "stateLoadParams": function (settings, data) {
41657		 *          return false;
41658		 *        }
41659		 *      } );
41660		 *    } );
41661		 */
41662		"fnStateLoadParams": null,
41663	
41664	
41665		/**
41666		 * Callback that is called when the state has been loaded from the state saving method
41667		 * and the DataTables settings object has been modified as a result of the loaded state.
41668		 *  @type function
41669		 *  @param {object} settings DataTables settings object
41670		 *  @param {object} data The state object that was loaded
41671		 *
41672		 *  @dtopt Callbacks
41673		 *  @name DataTable.defaults.stateLoaded
41674		 *
41675		 *  @example
41676		 *    // Show an alert with the filtering value that was saved
41677		 *    $(document).ready( function() {
41678		 *      $('#example').dataTable( {
41679		 *        "stateSave": true,
41680		 *        "stateLoaded": function (settings, data) {
41681		 *          alert( 'Saved filter was: '+data.oSearch.sSearch );
41682		 *        }
41683		 *      } );
41684		 *    } );
41685		 */
41686		"fnStateLoaded": null,
41687	
41688	
41689		/**
41690		 * Save the table state. This function allows you to define where and how the state
41691		 * information for the table is stored By default DataTables will use `localStorage`
41692		 * but you might wish to use a server-side database or cookies.
41693		 *  @type function
41694		 *  @member
41695		 *  @param {object} settings DataTables settings object
41696		 *  @param {object} data The state object to be saved
41697		 *
41698		 *  @dtopt Callbacks
41699		 *  @name DataTable.defaults.stateSaveCallback
41700		 *
41701		 *  @example
41702		 *    $(document).ready( function() {
41703		 *      $('#example').dataTable( {
41704		 *        "stateSave": true,
41705		 *        "stateSaveCallback": function (settings, data) {
41706		 *          // Send an Ajax request to the server with the state object
41707		 *          $.ajax( {
41708		 *            "url": "/state_save",
41709		 *            "data": data,
41710		 *            "dataType": "json",
41711		 *            "method": "POST"
41712		 *            "success": function () {}
41713		 *          } );
41714		 *        }
41715		 *      } );
41716		 *    } );
41717		 */
41718		"fnStateSaveCallback": function ( settings, data ) {
41719			try {
41720				(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
41721					'DataTables_'+settings.sInstance+'_'+location.pathname,
41722					JSON.stringify( data )
41723				);
41724			} catch (e) {}
41725		},
41726	
41727	
41728		/**
41729		 * Callback which allows modification of the state to be saved. Called when the table
41730		 * has changed state a new state save is required. This method allows modification of
41731		 * the state saving object prior to actually doing the save, including addition or
41732		 * other state properties or modification. Note that for plug-in authors, you should
41733		 * use the `stateSaveParams` event to save parameters for a plug-in.
41734		 *  @type function
41735		 *  @param {object} settings DataTables settings object
41736		 *  @param {object} data The state object to be saved
41737		 *
41738		 *  @dtopt Callbacks
41739		 *  @name DataTable.defaults.stateSaveParams
41740		 *
41741		 *  @example
41742		 *    // Remove a saved filter, so filtering is never saved
41743		 *    $(document).ready( function() {
41744		 *      $('#example').dataTable( {
41745		 *        "stateSave": true,
41746		 *        "stateSaveParams": function (settings, data) {
41747		 *          data.oSearch.sSearch = "";
41748		 *        }
41749		 *      } );
41750		 *    } );
41751		 */
41752		"fnStateSaveParams": null,
41753	
41754	
41755		/**
41756		 * Duration for which the saved state information is considered valid. After this period
41757		 * has elapsed the state will be returned to the default.
41758		 * Value is given in seconds.
41759		 *  @type int
41760		 *  @default 7200 <i>(2 hours)</i>
41761		 *
41762		 *  @dtopt Options
41763		 *  @name DataTable.defaults.stateDuration
41764		 *
41765		 *  @example
41766		 *    $(document).ready( function() {
41767		 *      $('#example').dataTable( {
41768		 *        "stateDuration": 60*60*24; // 1 day
41769		 *      } );
41770		 *    } )
41771		 */
41772		"iStateDuration": 7200,
41773	
41774	
41775		/**
41776		 * When enabled DataTables will not make a request to the server for the first
41777		 * page draw - rather it will use the data already on the page (no sorting etc
41778		 * will be applied to it), thus saving on an XHR at load time. `deferLoading`
41779		 * is used to indicate that deferred loading is required, but it is also used
41780		 * to tell DataTables how many records there are in the full table (allowing
41781		 * the information element and pagination to be displayed correctly). In the case
41782		 * where a filtering is applied to the table on initial load, this can be
41783		 * indicated by giving the parameter as an array, where the first element is
41784		 * the number of records available after filtering and the second element is the
41785		 * number of records without filtering (allowing the table information element
41786		 * to be shown correctly).
41787		 *  @type int | array
41788		 *  @default null
41789		 *
41790		 *  @dtopt Options
41791		 *  @name DataTable.defaults.deferLoading
41792		 *
41793		 *  @example
41794		 *    // 57 records available in the table, no filtering applied
41795		 *    $(document).ready( function() {
41796		 *      $('#example').dataTable( {
41797		 *        "serverSide": true,
41798		 *        "ajax": "scripts/server_processing.php",
41799		 *        "deferLoading": 57
41800		 *      } );
41801		 *    } );
41802		 *
41803		 *  @example
41804		 *    // 57 records after filtering, 100 without filtering (an initial filter applied)
41805		 *    $(document).ready( function() {
41806		 *      $('#example').dataTable( {
41807		 *        "serverSide": true,
41808		 *        "ajax": "scripts/server_processing.php",
41809		 *        "deferLoading": [ 57, 100 ],
41810		 *        "search": {
41811		 *          "search": "my_filter"
41812		 *        }
41813		 *      } );
41814		 *    } );
41815		 */
41816		"iDeferLoading": null,
41817	
41818	
41819		/**
41820		 * Number of rows to display on a single page when using pagination. If
41821		 * feature enabled (`lengthChange`) then the end user will be able to override
41822		 * this to a custom setting using a pop-up menu.
41823		 *  @type int
41824		 *  @default 10
41825		 *
41826		 *  @dtopt Options
41827		 *  @name DataTable.defaults.pageLength
41828		 *
41829		 *  @example
41830		 *    $(document).ready( function() {
41831		 *      $('#example').dataTable( {
41832		 *        "pageLength": 50
41833		 *      } );
41834		 *    } )
41835		 */
41836		"iDisplayLength": 10,
41837	
41838	
41839		/**
41840		 * Define the starting point for data display when using DataTables with
41841		 * pagination. Note that this parameter is the number of records, rather than
41842		 * the page number, so if you have 10 records per page and want to start on
41843		 * the third page, it should be "20".
41844		 *  @type int
41845		 *  @default 0
41846		 *
41847		 *  @dtopt Options
41848		 *  @name DataTable.defaults.displayStart
41849		 *
41850		 *  @example
41851		 *    $(document).ready( function() {
41852		 *      $('#example').dataTable( {
41853		 *        "displayStart": 20
41854		 *      } );
41855		 *    } )
41856		 */
41857		"iDisplayStart": 0,
41858	
41859	
41860		/**
41861		 * By default DataTables allows keyboard navigation of the table (sorting, paging,
41862		 * and filtering) by adding a `tabindex` attribute to the required elements. This
41863		 * allows you to tab through the controls and press the enter key to activate them.
41864		 * The tabindex is default 0, meaning that the tab follows the flow of the document.
41865		 * You can overrule this using this parameter if you wish. Use a value of -1 to
41866		 * disable built-in keyboard navigation.
41867		 *  @type int
41868		 *  @default 0
41869		 *
41870		 *  @dtopt Options
41871		 *  @name DataTable.defaults.tabIndex
41872		 *
41873		 *  @example
41874		 *    $(document).ready( function() {
41875		 *      $('#example').dataTable( {
41876		 *        "tabIndex": 1
41877		 *      } );
41878		 *    } );
41879		 */
41880		"iTabIndex": 0,
41881	
41882	
41883		/**
41884		 * Classes that DataTables assigns to the various components and features
41885		 * that it adds to the HTML table. This allows classes to be configured
41886		 * during initialisation in addition to through the static
41887		 * {@link DataTable.ext.oStdClasses} object).
41888		 *  @namespace
41889		 *  @name DataTable.defaults.classes
41890		 */
41891		"oClasses": {},
41892	
41893	
41894		/**
41895		 * All strings that DataTables uses in the user interface that it creates
41896		 * are defined in this object, allowing you to modified them individually or
41897		 * completely replace them all as required.
41898		 *  @namespace
41899		 *  @name DataTable.defaults.language
41900		 */
41901		"oLanguage": {
41902			/**
41903			 * Strings that are used for WAI-ARIA labels and controls only (these are not
41904			 * actually visible on the page, but will be read by screenreaders, and thus
41905			 * must be internationalised as well).
41906			 *  @namespace
41907			 *  @name DataTable.defaults.language.aria
41908			 */
41909			"oAria": {
41910				/**
41911				 * ARIA label that is added to the table headers when the column may be
41912				 * sorted ascending by activing the column (click or return when focu
41912sed).
41913				 * Note that the column header is prefixed to this string.
41914				 *  @type string
41915				 *  @default : activate to sort column ascending
41916				 *
41917				 *  @dtopt Language
41918				 *  @name DataTable.defaults.language.aria.sortAscending
41919				 *
41920				 *  @example
41921				 *    $(document).ready( function() {
41922				 *      $('#example').dataTable( {
41923				 *        "language": {
41924				 *          "aria": {
41925				 *            "sortAscending": " - click/return to sort ascending"
41926				 *          }
41927				 *        }
41928				 *      } );
41929				 *    } );
41930				 */
41931				"sSortAscending": ": activate to sort column ascending",
41932	
41933				/**
41934				 * ARIA label that is added to the table headers when the column may be
41935				 * sorted descending by activing the column (click or return when focused).
41936				 * Note that the column header is prefixed to this string.
41937				 *  @type string
41938				 *  @default : activate to sort column ascending
41939				 *
41940				 *  @dtopt Language
41941				 *  @name DataTable.defaults.language.aria.sortDescending
41942				 *
41943				 *  @example
41944				 *    $(document).ready( function() {
41945				 *      $('#example').dataTable( {
41946				 *        "language": {
41947				 *          "aria": {
41948				 *            "sortDescending": " - click/return to sort descending"
41949				 *          }
41950				 *        }
41951				 *      } );
41952				 *    } );
41953				 */
41954				"sSortDescending": ": activate to sort column descending"
41955			},
41956	
41957			/**
41958			 * Pagination string used by DataTables for the built-in pagination
41959			 * control types.
41960			 *  @namespace
41961			 *  @name DataTable.defaults.language.paginate
41962			 */
41963			"oPaginate": {
41964				/**
41965				 * Text to use when using the 'full_numbers' type of pagination for the
41966				 * button to take the user to the first page.
41967				 *  @type string
41968				 *  @default First
41969				 *
41970				 *  @dtopt Language
41971				 *  @name DataTable.defaults.language.paginate.first
41972				 *
41973				 *  @example
41974				 *    $(document).ready( function() {
41975				 *      $('#example').dataTable( {
41976				 *        "language": {
41977				 *          "paginate": {
41978				 *            "first": "First page"
41979				 *          }
41980				 *        }
41981				 *      } );
41982				 *    } );
41983				 */
41984				"sFirst": "First",
41985	
41986	
41987				/**
41988				 * Text to use when using the 'full_numbers' type of pagination for the
41989				 * button to take the user to the last page.
41990				 *  @type string
41991				 *  @default Last
41992				 *
41993				 *  @dtopt Language
41994				 *  @name DataTable.defaults.language.paginate.last
41995				 *
41996				 *  @example
41997				 *    $(document).ready( function() {
41998				 *      $('#example').dataTable( {
41999				 *        "language": {
42000				 *          "paginate": {
42001				 *            "last": "Last page"
42002				 *          }
42003				 *        }
42004				 *      } );
42005				 *    } );
42006				 */
42007				"sLast": "Last",
42008	
42009	
42010				/**
42011				 * Text to use for the 'next' pagination button (to take the user to the
42012				 * next page).
42013				 *  @type string
42014				 *  @default Next
42015				 *
42016				 *  @dtopt Language
42017				 *  @name DataTable.defaults.language.paginate.next
42018				 *
42019				 *  @example
42020				 *    $(document).ready( function() {
42021				 *      $('#example').dataTable( {
42022				 *        "language": {
42023				 *          "paginate": {
42024				 *            "next": "Next page"
42025				 *          }
42026				 *        }
42027				 *      } );
42028				 *    } );
42029				 */
42030				"sNext": "Next",
42031	
42032	
42033				/**
42034				 * Text to use for the 'previous' pagination button (to take the user to
42035				 * the previous page).
42036				 *  @type string
42037				 *  @default Previous
42038				 *
42039				 *  @dtopt Language
42040				 *  @name DataTable.defaults.language.paginate.previous
42041				 *
42042				 *  @example
42043				 *    $(document).ready( function() {
42044				 *      $('#example').dataTable( {
42045				 *        "language": {
42046				 *          "paginate": {
42047				 *            "previous": "Previous page"
42048				 *          }
42049				 *        }
42050				 *      } );
42051				 *    } );
42052				 */
42053				"sPrevious": "Previous"
42054			},
42055	
42056			/**
42057			 * This string is shown in preference to `zeroRecords` when the table is
42058			 * empty of data (regardless of filtering). Note that this is an optional
42059			 * parameter - if it is not given, the value of `zeroRecords` will be used
42060			 * instead (either the default or given value).
42061			 *  @type string
42062			 *  @default No data available in table
42063			 *
42064			 *  @dtopt Language
42065			 *  @name DataTable.defaults.language.emptyTable
42066			 *
42067			 *  @example
42068			 *    $(document).ready( function() {
42069			 *      $('#example').dataTable( {
42070			 *        "language": {
42071			 *          "emptyTable": "No data available in table"
42072			 *        }
42073			 *      } );
42074			 *    } );
42075			 */
42076			"sEmptyTable": "No data available in table",
42077	
42078	
42079			/**
42080			 * This string gives information to the end user about the information
42081			 * that is current on display on the page. The following tokens can be
42082			 * used in the string and will be dynamically replaced as the table
42083			 * display updates. This tokens can be placed anywhere in the string, or
42084			 * removed as needed by the language requires:
42085			 *
42086			 * * `\_START\_` - Display index of the first record on the current page
42087			 * * `\_END\_` - Display index of the last record on the current page
42088			 * * `\_TOTAL\_` - Number of records in the table after filtering
42089			 * * `\_MAX\_` - Number of records in the table without filtering
42090			 * * `\_PAGE\_` - Current page number
42091			 * * `\_PAGES\_` - Total number of pages of data in the table
42092			 *
42093			 *  @type string
42094			 *  @default Showing _START_ to _END_ of _TOTAL_ entries
42095			 *
42096			 *  @dtopt Language
42097			 *  @name DataTable.defaults.language.info
42098			 *
42099			 *  @example
42100			 *    $(document).ready( function() {
42101			 *      $('#example').dataTable( {
42102			 *        "language": {
42103			 *          "info": "Showing page _PAGE_ of _PAGES_"
42104			 *        }
42105			 *      } );
42106			 *    } );
42107			 */
42108			"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
42109	
42110	
42111			/**
42112			 * Display information string for when the table is empty. Typically the
42113			 * format of this string should match `info`.
42114			 *  @type string
42115			 *  @default Showing 0 to 0 of 0 entries
42116			 *
42117			 *  @dtopt Language
42118			 *  @name DataTable.defaults.language.infoEmpty
42119			 *
42120			 *  @example
42121			 *    $(document).ready( function() {
42122			 *      $('#example').dataTable( {
42123			 *        "language": {
42124			 *          "infoEmpty": "No entries to show"
42125			 *        }
42126			 *      } );
42127			 *    } );
42128			 */
42129			"sInfoEmpty": "Showing 0 to 0 of 0 entries",
42130	
42131	
42132			/**
42133			 * When a user filters the information in a table, this string is appended
42134			 * to the information (`info`) to give an idea of how strong the filtering
42135			 * is. The variable _MAX_ is dynamically updated.
42136			 *  @type string
42137			 *  @default (filtered from _MAX_ total entries)
42138			 *
42139			 *  @dtopt Language
42140			 *  @name DataTable.defaults.language.infoFiltered
42141			 *
42142			 *  @example
42143			 *    $(document).ready( function() {
42144			 *      $('#example').dataTable( {
42145			 *        "language": {
42146			 *          "infoFiltered": " - filtering from _MAX_ records"
42147			 *        }
42148			 *      } );
42149			 *    } );
42150			 */
42151			"sInfoFiltered": "(filtered from _MAX_ total entries)",
42152	
42153	
42154			/**
42155			 * If can be useful to append extra information to the info string at times,
42156			 * and this variable does exactly that. This information will be appended to
42157			 * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
42158			 * being used) at all times.
42159			 *  @type string
42160			 *  @default <i>Empty string</i>
42161			 *
42162			 *  @dtopt Language
42163			 *  @name DataTable.defaults.language.infoPostFix
42164			 *
42165			 *  @example
42166			 *    $(document).ready( function() {
42167			 *      $('#example').dataTable( {
42168			 *        "language": {
42169			 *          "infoPostFix": "All records shown are derived from real information."
42170			 *        }
42171			 *      } );
42172			 *    } );
42173			 */
42174			"sInfoPostFix": "",
42175	
42176	
42177			/**
42178			 * This decimal place operator is a little different from the other
42179			 * language options since DataTables doesn't output floating point
42180			 * numbers, so it won't ever use this for display of a number. Rather,
42181			 * what this parameter does is modify the sort methods of the table so
42182			 * that numbers which are in a format which has a character other than
42183			 * a period (`.`) as a decimal place will be sorted numerically.
42184			 *
42185			 * Note that numbers with different decimal places cannot be shown in
42186			 * the same table and still be sortable, the table must be consistent.
42187			 * However, multiple different tables on the page can use different
42188			 * decimal place characters.
42189			 *  @type string
42190			 *  @default 
42191			 *
42192			 *  @dtopt Language
42193			 *  @name DataTable.defaults.language.decimal
42194			 *
42195			 *  @example
42196			 *    $(document).ready( function() {
42197			 *      $('#example').dataTable( {
42198			 *        "language": {
42199			 *          "decimal": ","
42200			 *          "thousands": "."
42201			 *        }
42202			 *      } );
42203			 *    } );
42204			 */
42205			"sDecimal": "",
42206	
42207	
42208			/**
42209			 * DataTables has a build in number formatter (`formatNumber`) which is
42210			 * used to format large numbers that are used in the table information.
42211			 * By default a comma is used, but this can be trivially changed to any
42212			 * character you wish with this parameter.
42213			 *  @type string
42214			 *  @default ,
42215			 *
42216			 *  @dtopt Language
42217			 *  @name DataTable.defaults.language.thousands
42218			 *
42219			 *  @example
42220			 *    $(document).ready( function() {
42221			 *      $('#example').dataTable( {
42222			 *        "language": {
42223			 *          "thousands": "'"
42224			 *        }
42225			 *      } );
42226			 *    } );
42227			 */
42228			"sThousands": ",",
42229	
42230	
42231			/**
42232			 * Detail the action that will be taken when the drop down menu for the
42233			 * pagination length option is changed. The '_MENU_' variable is replaced
42234			 * with a default select list of 10, 25, 50 and 100, and can be replaced
42235			 * with a custom select box if required.
42236			 *  @type string
42237			 *  @default Show _MENU_ entries
42238			 *
42239			 *  @dtopt Language
42240			 *  @name DataTable.defaults.language.lengthMenu
42241			 *
42242			 *  @example
42243			 *    // Language change only
42244			 *    $(document).ready( function() {
42245			 *      $('#example').dataTable( {
42246			 *        "language": {
42247			 *          "lengthMenu": "Display _MENU_ records"
42248			 *        }
42249			 *      } );
42250			 *    } );
42251			 *
42252			 *  @example
42253			 *    // Language and options change
42254			 *    $(document).ready( function() {
42255			 *      $('#example').dataTable( {
42256			 *        "language": {
42257			 *          "lengthMenu": 'Display <select>'+
42258			 *            '<option value="10">10</option>'+
42259			 *            '<option value="20">20</option>'+
42260			 *            '<option value="30">30</option>'+
42261			 *            '<option value="40">40</option>'+
42262			 *            '<option value="50">50</option>'+
42263			 *            '<option value="-1">All</option>'+
42264			 *            '</select> records'
42265			 *        }
42266			 *      } );
42267			 *    } );
42268			 */
42269			"sLengthMenu": "Show _MENU_ entries",
42270	
42271	
42272			/**
42273			 * When using Ajax sourced data and during the first draw when DataTables is
42274			 * gathering the data, this message is shown in an empty row in the table to
42275			 * indicate to the end user the the data is being loaded. Note that this
42276			 * parameter is not used when loading data by server-side processing, just
42277			 * Ajax sourced data with client-side processing.
42278			 *  @type string
42279			 *  @default Loading...
42280			 *
42281			 *  @dtopt Language
42282			 *  @name DataTable.defaults.language.loadingRecords
42283			 *
42284			 *  @example
42285			 *    $(document).ready( function() {
42286			 *      $('#example').dataTable( {
42287			 *        "language": {
42288			 *          "loadingRecords": "Please wait - loading..."
42289			 *        }
42290			 *      } );
42291			 *    } );
42292			 */
42293			"sLoadingRecords": "Loading...",
42294	
42295	
42296			/**
42297			 * Text which is displayed when the table is processing a user action
42298			 * (usually a sort command or similar).
42299			 *  @type string
42300			 *  @default Processing...
42301			 *
42302			 *  @dtopt Language
42303			 *  @name DataTable.defaults.language.processing
42304			 *
42305			 *  @example
42306			 *    $(document).ready( function() {
42307			 *      $('#example').dataTable( {
42308			 *        "language": {
42309			 *          "processing": "DataTables is currently busy"
42310			 *        }
42311			 *      } );
42312			 *    } );
42313			 */
42314			"sProcessing": "Processing...",
42315	
42316	
42317			/**
42318			 * Details the actions that will be taken when the user types into the
42319			 * filtering input text box. The variable "_INPUT_", if used in the string,
42320			 * is replaced with the HTML text box for the filtering input allowing
42321			 * control over where it appears in the string. If "_INPUT_" is not given
42322			 * then the input box is appended to the string automatically.
42323			 *  @type string
42324			 *  @default Search:
42325			 *
42326			 *  @dtopt Language
42327			 *  @name DataTable.defaults.language.search
42328			 *
42329			 *  @example
42330			 *    // Input text box will be appended at the end automatically
42331			 *    $(document).ready( function() {
42332			 *      $('#example').dataTable( {
42333			 *        "language": {
42334			 *          "search": "Filter records:"
42335			 *        }
42336			 *      } );
42337			 *    } );
42338			 *
42339			 *  @example
42340			 *    // Specify where the filter should appear
42341			 *    $(document).ready( function() {
42342			 *      $('#example').dataTable( {
42343			 *        "language": {
42344			 *          "search": "Apply filter _INPUT_ to table"
42345			 *        }
42346			 *      } );
42347			 *    } );
42348			 */
42349			"sSearch": "Search:",
42350	
42351	
42352			/**
42353			 * Assign a `placeholder` attribute to the search `input` element
42354			 *  @type string
42355			 *  @default 
42356			 *
42357			 *  @dtopt Language
42358			 *  @name DataTable.defaults.language.searchPlaceholder
42359			 */
42360			"sSearchPlaceholder": "",
42361	
42362	
42363			/**
42364			 * All of the language information can be stored in a file on the
42365			 * server-side, which DataTables will look up if this parameter is passed.
42366			 * It must store the URL of the language file, which is in a JSON format,
42367			 * and the object has the same properties as the oLanguage object in the
42368			 * initialiser object (i.e. the above parameters). Please refer to one of
42369			 * the example language files to see how this works in action.
42370			 *  @type string
42371			 *  @default <i>Empty string - i.e. disabled</i>
42372			 *
42373			 *  @dtopt Language
42374			 *  @name DataTable.defaults.language.url
42375			 *
42376			 *  @example
42377			 *    $(document).ready( function() {
42378			 *      $('#example').dataTable( {
42379			 *        "language": {
42380			 *          "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
42381			 *        }
42382			 *      } );
42383			 *    } );
42384			 */
42385			"sUrl": "",
42386	
42387	
42388			/**
42389			 * Text shown inside the table records when the is no information to be
42390			 * displayed after filtering. `emptyTable` is shown when there is simply no
42391			 * information in the table at all (regardless of filtering).
42392			 *  @type string
42393			 *  @default No matching records found
42394			 *
42395			 *  @dtopt Language
42396			 *  @name DataTable.defaults.language.zeroRecords
42397			 *
42398			 *  @example
42399			 *    $(document).ready( function() {
42400			 *      $('#example').dataTable( {
42401			 *        "language": {
42402			 *          "zeroRecords": "No records to display"
42403			 *        }
42404			 *      } );
42405			 *    } );
42406			 */
42407			"sZeroRecords": "No matching records found"
42408		},
42409	
42410	
42411		/**
42412		 * This parameter allows you to have define the global filtering state at
42413		 * initialisation time. As an object the `search` parameter must be
42414		 * defined, but all other parameters are optional. When `regex` is true,
42415		 * the search string will be treated as a regular expression, when false
42416		 * (default) it will be treated as a straight string. When `smart`
42417		 * DataTables will use it's smart filtering methods (to word match at
42418		 * any point in the data), when false this will not be done.
42419		 *  @namespace
42420		 *  @extends DataTable.models.oSearch
42421		 *
42422		 *  @dtopt Options
42423		 *  @name DataTable.defaults.search
42424		 *
42425		 *  @example
42426		 *    $(document).ready( function() {
42427		 *      $('#example').dataTable( {
42428		 *        "search": {"search": "Initial search"}
42429		 *      } );
42430		 *    } )
42431		 */
42432		"oSearch": $.extend( {}, DataTable.models.oSearch ),
42433	
42434	
42435		/**
42436		 * __Deprecated__ The functionality provided by this parameter has now been
42437		 * superseded by that provided through `ajax`, which should be used instead.
42438		 *
42439		 * By default DataTables will look for the property `data` (or `aaData` for
42440		 * compatibility with DataTables 1.9-) when obtaining data from an Ajax
42441		 * source or for server-side processing - this parameter allows that
42442		 * property to be changed. You can use Javascript dotted object notation to
42443		 * get a data source for multiple levels of nesting.
42444		 *  @type string
42445		 *  @default data
42446		 *
42447		 *  @dtopt Options
42448		 *  @dtopt Server-side
42449		 *  @name DataTable.defaults.ajaxDataProp
42450		 *
42451		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
42452		 */
42453		"sAjaxDataProp": "data",
42454	
42455	
42456		/**
42457		 * __Deprecated__ The functionality provided by this parameter has now been
42458		 * superseded by that provided through `ajax`, which should be used instead.
42459		 *
42460		 * You can instruct DataTables to load data from an external
42461		 * source using this parameter (use aData if you want to pass data in you
42462		 * already have). Simply provide a url a JSON object can be obtained from.
42463		 *  @type string
42464		 *  @default null
42465		 *
42466		 *  @dtopt Options
42467		 *  @dtopt Server-side
42468		 *  @name DataTable.defaults.ajaxSource
42469		 *
42470		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
42471		 */
42472		"sAjaxSource": null,
42473	
42474	
42475		/**
42476		 * This initialisation variable allows you to specify exactly where in the
42477		 * DOM you want DataTables to inject the various controls it adds to the page
42478		 * (for example you might want the pagination controls at the top of the
42479		 * table). DIV elements (with or without a custom class) can also be added to
42480		 * aid styling. The follow syntax is used:
42481		 *   <ul>
42482		 *     <li>The following options are allowed:
42483		 *       <ul>
42484		 *         <li>'l' - Length changing</li>
42485		 *         <li>'f' - Filtering input</li>
42486		 *         <li>'t' - The table!</li>
42487		 *         <li>'i' - Information</li>
42488		 *         <li>'p' - Pagination</li>
42489		 *         <li>'r' - pRocessing</li>
42490		 *       </ul>
42491		 *     </li>
42492		 *     <li>The following constants are allowed:
42493		 *       <ul>
42494		 *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
42495		 *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
42496		 *       </ul>
42497		 *     </li>
42498		 *     <li>The following syntax is expected:
42499		 *       <ul>
42500		 *         <li>'&lt;' and '&gt;' - div elements</li>
42501		 *         <li>'&lt;"class" and '&gt;' - div with a class</li>
42502		 *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
42503		 *       </ul>
42504		 *     </li>
42505		 *     <li>Examples:
42506		 *       <ul>
42507		 *         <li>'&lt;"wrapper"flipt&gt;'</li>
42508		 *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
42509		 *       </ul>
42510		 *     </li>
42511		 *   </ul>
42512		 *  @type string
42513		 *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>
42514		 *    <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i>
42515		 *
42516		 *  @dtopt Options
42517		 *  @name DataTable.defaults.dom
42518		 *
42519		 *  @example
42520		 *    $(document).ready( function() {
42521		 *      $('#example').dataTable( {
42522		 *        "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
42523		 *      } );
42524		 *    } );
42525		 */
42526		"sDom": "lfrtip",
42527	
42528	
42529		/**
42530		 * Search delay option. This will throttle full table searches that use the
42531		 * DataTables provided search input element (it does not effect calls to
42532		 * `dt-api search()`, providing a delay before the search is made.
42533		 *  @type integer
42534		 *  @default 0
42535		 *
42536		 *  @dtopt Options
42537		 *  @name DataTable.defaults.searchDelay
42538		 *
42539		 *  @example
42540		 *    $(document).ready( function() {
42541		 *      $('#example').dataTable( {
42542		 *        "searchDelay": 200
42543		 *      } );
42544		 *    } )
42545		 */
42546		"searchDelay": null,
42547	
42548	
42549		/**
42550		 * DataTables features four different built-in options for the buttons to
42551		 * display for pagination control:
42552		 *
42553		 * * `simple` - 'Previous' and 'Next' buttons only
42554		 * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
42555		 * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
42556		 * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus
42557		 *   page numbers
42558		 *  
42559		 * Further methods can be added using {@link DataTable.ext.oPagination}.
42560		 *  @type string
42561		 *  @default simple_numbers
42562		 *
42563		 *  @dtopt Options
42564		 *  @name DataTable.defaults.pagingType
42565		 *
42566		 *  @example
42567		 *    $(document).ready( function() {
42568		 *      $('#example').dataTable( {
42569		 *        "pagingType": "full_numbers"
42570		 *      } );
42571		 *    } )
42572		 */
42573		"sPaginationType": "simple_numbers",
42574	
42575	
42576		/**
42577		 * Enable horizontal scrolling. When a table is too wide to fit into a
42578		 * certain layout, or you have a large number of columns in the table, you
42579		 * can enable x-scrolling to show the table in a viewport, which can be
42580		 * scrolled. This property can be `true` which will allow the table to
42581		 * scroll horizontally when needed, or any CSS unit, or a number (in which
42582		 * case it will be treated as a pixel measurement). Setting as simply `true`
42583		 * is recommended.
42584		 *  @type boolean|string
42585		 *  @default <i>blank string - i.e. disabled</i>
42586		 *
42587		 *  @dtopt Features
42588		 *  @name DataTable.defaults.scrollX
42589		 *
42590		 *  @example
42591		 *    $(document).ready( function() {
42592		 *      $('#example').dataTable( {
42593		 *        "scrollX": true,
42594		 *        "scrollCollapse": true
42595		 *      } );
42596		 *    } );
42597		 */
42598		"sScrollX": "",
42599	
42600	
42601		/**
42602		 * This property can be used to force a DataTable to use more width than it
42603		 * might otherwise do when x-scrolling is enabled. For example if you have a
42604		 * table which requires to be well spaced, this parameter is useful for
42605		 * "over-sizing" the table, and thus forcing scrolling. This property can by
42606		 * any CSS unit, or a number (in which case it will be treated as a pixel
42607		 * measurement).
42608		 *  @type string
42609		 *  @default <i>blank string - i.e. disabled</i>
42610		 *
42611		 *  @dtopt Options
42612		 *  @name DataTable.defaults.scrollXInner
42613		 *
42614		 *  @example
42615		 *    $(document).ready( function() {
42616		 *      $('#example').dataTable( {
42617		 *        "scrollX": "100%",
42618		 *        "scrollXInner": "110%"
42619		 *      } );
42620		 *    } );
42621		 */
42622		"sScrollXInner": "",
42623	
42624	
42625		/**
42626		 * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
42627		 * to the given height, and enable scrolling for any data which overflows the
42628		 * current viewport. This can be used as an alternative to paging to display
42629		 * a lot of data in a small area (although paging and scrolling can both be
42630		 * enabled at the same time). This property can be any CSS unit, or a number
42631		 * (in which case it will be treated as a pixel measurement).
42632		 *  @type string
42633		 *  @default <i>blank string - i.e. disabled</i>
42634		 *
42635		 *  @dtopt Features
42636		 *  @name DataTable.defaults.scrollY
42637		 *
42638		 *  @example
42639		 *    $(document).ready( function() {
42640		 *      $('#example').dataTable( {
42641		 *        "scrollY": "200px",
42642		 *        "paginate": false
42643		 *      } );
42644		 *    } );
42645		 */
42646		"sScrollY": "",
42647	
42648	
42649		/**
42650		 * __Deprecated__ The functionality provided by this parameter has now been
42651		 * superseded by that provided through `ajax`, which should be used instead.
42652		 *
42653		 * Set the HTTP method that is used to make the Ajax call for server-side
42654		 * processing or Ajax sourced data.
42655		 *  @type string
42656		 *  @default GET
42657		 *
42658		 *  @dtopt Options
42659		 *  @dtopt Server-side
42660		 *  @name DataTable.defaults.serverMethod
42661		 *
42662		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
42663		 */
42664		"sServerMethod": "GET",
42665	
42666	
42667		/**
42668		 * DataTables makes use of renderers when displaying HTML elements for
42669		 * a table. These renderers can be added or modified by plug-ins to
42670		 * generate suitable mark-up for a site. For example the Bootstrap
42671		 * integration plug-in for DataTables uses a paging button renderer to
42672		 * display pagination buttons in the mark-up required by Bootstrap.
42673		 *
42674		 * For further information about the renderers available see
42675		 * DataTable.ext.renderer
42676		 *  @type string|object
42677		 *  @default null
42678		 *
42679		 *  @name DataTable.defaults.renderer
42680		 *
42681		 */
42682		"renderer": null,
42683	
42684	
42685		/**
42686		 * Set the data property name that DataTables should use to get a row's id
42687		 * to set as the `id` property in the node.
42688		 *  @type string
42689		 *  @default DT_RowId
42690		 *
42691		 *  @name DataTable.defaults.rowId
42692		 */
42693		"rowId": "DT_RowId"
42694	};
42695	
42696	_fnHungarianMap( DataTable.defaults );
42697	
42698	
42699	
42700	/*
42701	 * Developer note - See note in model.defaults.js about the use of Hungarian
42702	 * notation and camel case.
42703	 */
42704	
42705	/**
42706	 * Column options that can be given to DataTables at initialisation time.
42707	 *  @namespace
42708	 */
42709	DataTable.defaults.column = {
42710		/**
42711		 * Define which column(s) an order will occur on for this column. This
42712		 * allows a column's ordering to take multiple columns into account when
42713		 * doing a sort or use the data from a different column. For example first
42714		 * name / last name columns make sense to do a multi-column sort over the
42715		 * two columns.
42716		 *  @type array|int
42717		 *  @default null <i>Takes the value of the column index automatically</i>
42718		 *
42719		 *  @name DataTable.defaults.column.orderData
42720		 *  @dtopt Columns
42721		 *
42722		 *  @example
42723		 *    // Using `columnDefs`
42724		 *    $(document).ready( function() {
42725		 *      $('#example').dataTable( {
42726		 *        "columnDefs": [
42727		 *          { "orderData": [ 0, 1 ], "targets": [ 0 ] },
42728		 *          { "orderData": [ 1, 0 ], "targets": [ 1 ] },
42729		 *          { "orderData": 2, "targets": [ 2 ] }
42730		 *        ]
42731		 *      } );
42732		 *    } );
42733		 *
42734		 *  @example
42735		 *    // Using `columns`
42736		 *    $(document).ready( function() {
42737		 *      $('#example').dataTable( {
42738		 *        "columns": [
42739		 *          { "orderData": [ 0, 1 ] },
42740		 *          { "orderData": [ 1, 0 ] },
42741		 *          { "orderData": 2 },
42742		 *          null,
42743		 *          null
42744		 *        ]
42745		 *      } );
42746		 *    } );
42747		 */
42748		"aDataSort": null,
42749		"iDataSort": -1,
42750	
42751	
42752		/**
42753		 * You can control the default ordering direction, and even alter the
42754		 * behaviour of the sort handler (i.e. only allow ascending ordering etc)
42755		 * using this parameter.
42756		 *  @type array
42757		 *  @default [ 'asc', 'desc' ]
42758		 *
42759		 *  @name DataTable.defaults.column.orderSequence
42760		 *  @dtopt Columns
42761		 *
42762		 *  @example
42763		 *    // Using `columnDefs`
42764		 *    $(document).ready( function() {
42765		 *      $('#example').dataTable( {
42766		 *        "columnDefs": [
42767		 *          { "orderSequence": [ "asc" ], "targets": [ 1 ] },
42768		 *          { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
42769		 *          { "orderSequence": [ "desc" ], "targets": [ 3 ] }
42770		 *        ]
42771		 *      } );
42772		 *    } );
42773		 *
42774		 *  @example
42775		 *    // Using `columns`
42776		 *    $(document).ready( function() {
42777		 *      $('#example').dataTable( {
42778		 *        "columns": [
42779		 *          null,
42780		 *          { "orderSequence": [ "asc" ] },
42781		 *          { "orderSequence": [ "desc", "asc", "asc" ] },
42782		 *          { "orderSequence": [ "desc" ] },
42783		 *          null
42784		 *        ]
42785		 *      } );
42786		 *    } );
42787		 */
42788		"asSorting": [ 'asc', 'desc' ],
42789	
42790	
42791		/**
42792		 * Enable or disable filtering on the data in this column.
42793		 *  @type boolean
42794		 *  @default true
42795		 *
42796		 *  @name DataTable.defaults.column.searchable
42797		 *  @dtopt Columns
42798		 *
42799		 *  @example
42800		 *    // Using `columnDefs`
42801		 *    $(document).ready( function() {
42802		 *      $('#example').dataTable( {
42803		 *        "columnDefs": [
42804		 *          { "searchable": false, "targets": [ 0 ] }
42805		 *        ] } );
42806		 *    } );
42807		 *
42808		 *  @example
42809		 *    // Using `columns`
42810		 *    $(document).ready( function() {
42811		 *      $('#example').dataTable( {
42812		 *        "columns": [
42813		 *          { "searchable": false },
42814		 *          null,
42815		 *          null,
42816		 *          null,
42817		 *          null
42818		 *        ] } );
42819		 *    } );
42820		 */
42821		"bSearchable": true,
42822	
42823	
42824		/**
42825		 * Enable or disable ordering on this column.
42826		 *  @type boolean
42827		 *  @default true
42828		 *
42829		 *  @name DataTable.defaults.column.orderable
42830		 *  @dtopt Columns
42831		 *
42832		 *  @example
42833		 *    // Using `columnDefs`
42834		 *    $(document).ready( function() {
42835		 *      $('#example').dataTable( {
42836		 *        "columnDefs": [
42837		 *          { "orderable": false, "targets": [ 0 ] }
42838		 *        ] } );
42839		 *    } );
42840		 *
42841		 *  @example
42842		 *    // Using `columns`
42843		 *    $(document).ready( function() {
42844		 *      $('#example').dataTable( {
42845		 *        "columns": [
42846		 *          { "orderable": false },
42847		 *          null,
42848		 *          null,
42849		 *          null,
42850		 *          null
42851		 *        ] } );
42852		 *    } );
42853		 */
42854		"bSortable": true,
42855	
42856	
42857		/**
42858		 * Enable or disable the display of this column.
42859		 *  @type boolean
42860		 *  @default true
42861		 *
42862		 *  @name DataTable.defaults.column.visible
42863		 *  @dtopt Columns
42864		 *
42865		 *  @example
42866		 *    // Using `columnDefs`
42867		 *    $(document).ready( function() {
42868		 *      $('#example').dataTable( {
42869		 *        "columnDefs": [
42870		 *          { "visible": false, "targets": [ 0 ] }
42871		 *        ] } );
42872		 *    } );
42873		 *
42874		 *  @example
42875		 *    // Using `columns`
42876		 *    $(document).ready( function() {
42877		 *      $('#example').dataTable( {
42878		 *        "columns": [
42879		 *          { "visible": false },
42880		 *          null,
42881		 *          null,
42882		 *          null,
42883		 *          null
42884		 *        ] } );
42885		 *    } );
42886		 */
42887		"bVisible": true,
42888	
42889	
42890		/**
42891		 * Developer definable function that is called whenever a cell is created (Ajax source,
42892		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
42893		 * allowing you to modify the DOM element (add background colour for example) when the
42894		 * element is available.
42895		 *  @type function
42896		 *  @param {element} td The TD node that has been created
42897		 *  @param {*} cellData The Data for the cell
42898		 *  @param {array|object} rowData The data for the whole row
42899		 *  @param {int} row The row index for the aoData data store
42900		 *  @param {int} col The column index for aoColumns
42901		 *
42902		 *  @name DataTable.defaults.column.createdCell
42903		 *  @dtopt Columns
42904		 *
42905		 *  @example
42906		 *    $(document).ready( function() {
42907		 *      $('#example').dataTable( {
42908		 *        "columnDefs": [ {
42909		 *          "targets": [3],
42910		 *          "createdCell": function (td, cellData, rowData, row, c
42910ol) {
42911		 *            if ( cellData == "1.7" ) {
42912		 *              $(td).css('color', 'blue')
42913		 *            }
42914		 *          }
42915		 *        } ]
42916		 *      });
42917		 *    } );
42918		 */
42919		"fnCreatedCell": null,
42920	
42921	
42922		/**
42923		 * This parameter has been replaced by `data` in DataTables to ensure naming
42924		 * consistency. `dataProp` can still be used, as there is backwards
42925		 * compatibility in DataTables for this option, but it is strongly
42926		 * recommended that you use `data` in preference to `dataProp`.
42927		 *  @name DataTable.defaults.column.dataProp
42928		 */
42929	
42930	
42931		/**
42932		 * This property can be used to read data from any data source property,
42933		 * including deeply nested objects / properties. `data` can be given in a
42934		 * number of different ways which effect its behaviour:
42935		 *
42936		 * * `integer` - treated as an array index for the data source. This is the
42937		 *   default that DataTables uses (incrementally increased for each column).
42938		 * * `string` - read an object property from the data source. There are
42939		 *   three 'special' options that can be used in the string to alter how
42940		 *   DataTables reads the data from the source object:
42941		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
42942		 *      Javascript to read from nested objects, so to can the options
42943		 *      specified in `data`. For example: `browser.version` or
42944		 *      `browser.name`. If your object parameter name contains a period, use
42945		 *      `\\` to escape it - i.e. `first\\.name`.
42946		 *    * `[]` - Array notation. DataTables can automatically combine data
42947		 *      from and array source, joining the data with the characters provided
42948		 *      between the two brackets. For example: `name[, ]` would provide a
42949		 *      comma-space separated list from the source array. If no characters
42950		 *      are provided between the brackets, the original array source is
42951		 *      returned.
42952		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
42953		 *      execute a function of the name given. For example: `browser()` for a
42954		 *      simple function on the data source, `browser.version()` for a
42955		 *      function in a nested property or even `browser().version` to get an
42956		 *      object property if the function called returns an object. Note that
42957		 *      function notation is recommended for use in `render` rather than
42958		 *      `data` as it is much simpler to use as a renderer.
42959		 * * `null` - use the original data source for the row rather than plucking
42960		 *   data directly from it. This action has effects on two other
42961		 *   initialisation options:
42962		 *    * `defaultContent` - When null is given as the `data` option and
42963		 *      `defaultContent` is specified for the column, the value defined by
42964		 *      `defaultContent` will be used for the cell.
42965		 *    * `render` - When null is used for the `data` option and the `render`
42966		 *      option is specified for the column, the whole data source for the
42967		 *      row is used for the renderer.
42968		 * * `function` - the function given will be executed whenever DataTables
42969		 *   needs to set or get the data for a cell in the column. The function
42970		 *   takes three parameters:
42971		 *    * Parameters:
42972		 *      * `{array|object}` The data source for the row
42973		 *      * `{string}` The type call data requested - this will be 'set' when
42974		 *        setting data or 'filter', 'display', 'type', 'sort' or undefined
42975		 *        when gathering data. Note that when `undefined` is given for the
42976		 *        type DataTables expects to get the raw data for the object back<
42977		 *      * `{*}` Data to set when the second parameter is 'set'.
42978		 *    * Return:
42979		 *      * The return value from the function is not required when 'set' is
42980		 *        the type of call, but otherwise the return is what will be used
42981		 *        for the data requested.
42982		 *
42983		 * Note that `data` is a getter and setter option. If you just require
42984		 * formatting of data for output, you will likely want to use `render` which
42985		 * is simply a getter and thus simpler to use.
42986		 *
42987		 * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
42988		 * name change reflects the flexibility of this property and is consistent
42989		 * with the naming of mRender. If 'mDataProp' is given, then it will still
42990		 * be used by DataTables, as it automatically maps the old name to the new
42991		 * if required.
42992		 *
42993		 *  @type string|int|function|null
42994		 *  @default null <i>Use automatically calculated column index</i>
42995		 *
42996		 *  @name DataTable.defaults.column.data
42997		 *  @dtopt Columns
42998		 *
42999		 *  @example
43000		 *    // Read table data from objects
43001		 *    // JSON structure for each row:
43002		 *    //   {
43003		 *    //      "engine": {value},
43004		 *    //      "browser": {value},
43005		 *    //      "platform": {value},
43006		 *    //      "version": {value},
43007		 *    //      "grade": {value}
43008		 *    //   }
43009		 *    $(document).ready( function() {
43010		 *      $('#example').dataTable( {
43011		 *        "ajaxSource": "sources/objects.txt",
43012		 *        "columns": [
43013		 *          { "data": "engine" },
43014		 *          { "data": "browser" },
43015		 *          { "data": "platform" },
43016		 *          { "data": "version" },
43017		 *          { "data": "grade" }
43018		 *        ]
43019		 *      } );
43020		 *    } );
43021		 *
43022		 *  @example
43023		 *    // Read information from deeply nested objects
43024		 *    // JSON structure for each row:
43025		 *    //   {
43026		 *    //      "engine": {value},
43027		 *    //      "browser": {value},
43028		 *    //      "platform": {
43029		 *    //         "inner": {value}
43030		 *    //      },
43031		 *    //      "details": [
43032		 *    //         {value}, {value}
43033		 *    //      ]
43034		 *    //   }
43035		 *    $(document).ready( function() {
43036		 *      $('#example').dataTable( {
43037		 *        "ajaxSource": "sources/deep.txt",
43038		 *        "columns": [
43039		 *          { "data": "engine" },
43040		 *          { "data": "browser" },
43041		 *          { "data": "platform.inner" },
43042		 *          { "data": "platform.details.0" },
43043		 *          { "data": "platform.details.1" }
43044		 *        ]
43045		 *      } );
43046		 *    } );
43047		 *
43048		 *  @example
43049		 *    // Using `data` as a function to provide different information for
43050		 *    // sorting, filtering and display. In this case, currency (price)
43051		 *    $(document).ready( function() {
43052		 *      $('#example').dataTable( {
43053		 *        "columnDefs": [ {
43054		 *          "targets": [ 0 ],
43055		 *          "data": function ( source, type, val ) {
43056		 *            if (type === 'set') {
43057		 *              source.price = val;
43058		 *              // Store the computed dislay and filter values for efficiency
43059		 *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
43060		 *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
43061		 *              return;
43062		 *            }
43063		 *            else if (type === 'display') {
43064		 *              return source.price_display;
43065		 *            }
43066		 *            else if (type === 'filter') {
43067		 *              return source.price_filter;
43068		 *            }
43069		 *            // 'sort', 'type' and undefined all just use the integer
43070		 *            return source.price;
43071		 *          }
43072		 *        } ]
43073		 *      } );
43074		 *    } );
43075		 *
43076		 *  @example
43077		 *    // Using default content
43078		 *    $(document).ready( function() {
43079		 *      $('#example').dataTable( {
43080		 *        "columnDefs": [ {
43081		 *          "targets": [ 0 ],
43082		 *          "data": null,
43083		 *          "defaultContent": "Click to edit"
43084		 *        } ]
43085		 *      } );
43086		 *    } );
43087		 *
43088		 *  @example
43089		 *    // Using array notation - outputting a list from an array
43090		 *    $(document).ready( function() {
43091		 *      $('#example').dataTable( {
43092		 *        "columnDefs": [ {
43093		 *          "targets": [ 0 ],
43094		 *          "data": "name[, ]"
43095		 *        } ]
43096		 *      } );
43097		 *    } );
43098		 *
43099		 */
43100		"mData": null,
43101	
43102	
43103		/**
43104		 * This property is the rendering partner to `data` and it is suggested that
43105		 * when you want to manipulate data for display (including filtering,
43106		 * sorting etc) without altering the underlying data for the table, use this
43107		 * property. `render` can be considered to be the the read only companion to
43108		 * `data` which is read / write (then as such more complex). Like `data`
43109		 * this option can be given in a number of different ways to effect its
43110		 * behaviour:
43111		 *
43112		 * * `integer` - treated as an array index for the data source. This is the
43113		 *   default that DataTables uses (incrementally increased for each column).
43114		 * * `string` - read an object property from the data source. There are
43115		 *   three 'special' options that can be used in the string to alter how
43116		 *   DataTables reads the data from the source object:
43117		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
43118		 *      Javascript to read from nested objects, so to can the options
43119		 *      specified in `data`. For example: `browser.version` or
43120		 *      `browser.name`. If your object parameter name contains a period, use
43121		 *      `\\` to escape it - i.e. `first\\.name`.
43122		 *    * `[]` - Array notation. DataTables can automatically combine data
43123		 *      from and array source, joining the data with the characters provided
43124		 *      between the two brackets. For example: `name[, ]` would provide a
43125		 *      comma-space separated list from the source array. If no characters
43126		 *      are provided between the brackets, the original array source is
43127		 *      returned.
43128		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
43129		 *      execute a function of the name given. For example: `browser()` for a
43130		 *      simple function on the data source, `browser.version()` for a
43131		 *      function in a nested property or even `browser().version` to get an
43132		 *      object property if the function called returns an object.
43133		 * * `object` - use different data for the different data types requested by
43134		 *   DataTables ('filter', 'display', 'type' or 'sort'). The property names
43135		 *   of the object is the data type the property refers to and the value can
43136		 *   defined using an integer, string or function using the same rules as
43137		 *   `render` normally does. Note that an `_` option _must_ be specified.
43138		 *   This is the default value to use if you haven't specified a value for
43139		 *   the data type requested by DataTables.
43140		 * * `function` - the function given will be executed whenever DataTables
43141		 *   needs to set or get the data for a cell in the column. The function
43142		 *   takes three parameters:
43143		 *    * Parameters:
43144		 *      * {array|object} The data source for the row (based on `data`)
43145		 *      * {string} The type call data requested - this will be 'filter',
43146		 *        'display', 'type' or 'sort'.
43147		 *      * {array|object} The full data source for the row (not based on
43148		 *        `data`)
43149		 *    * Return:
43150		 *      * The return value from the function is what will be used for the
43151		 *        data requested.
43152		 *
43153		 *  @type string|int|function|object|null
43154		 *  @default null Use the data source value.
43155		 *
43156		 *  @name DataTable.defaults.column.render
43157		 *  @dtopt Columns
43158		 *
43159		 *  @example
43160		 *    // Create a comma separated list from an array of objects
43161		 *    $(document).ready( function() {
43162		 *      $('#example').dataTable( {
43163		 *        "ajaxSource": "sources/deep.txt",
43164		 *        "columns": [
43165		 *          { "data": "engine" },
43166		 *          { "data": "browser" },
43167		 *          {
43168		 *            "data": "platform",
43169		 *            "render": "[, ].name"
43170		 *          }
43171		 *        ]
43172		 *      } );
43173		 *    } );
43174		 *
43175		 *  @example
43176		 *    // Execute a function to obtain data
43177		 *    $(document).ready( function() {
43178		 *      $('#example').dataTable( {
43179		 *        "columnDefs": [ {
43180		 *          "targets": [ 0 ],
43181		 *          "data": null, // Use the full data source object for the renderer's source
43182		 *          "render": "browserName()"
43183		 *        } ]
43184		 *      } );
43185		 *    } );
43186		 *
43187		 *  @example
43188		 *    // As an object, extracting different data for the different types
43189		 *    // This would be used with a data source such as:
43190		 *    //   { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
43191		 *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
43192		 *    // (which has both forms) is used for filtering for if a user inputs either format, while
43193		 *    // the formatted phone number is the one that is shown in the table.
43194		 *    $(document).ready( function() {
43195		 *      $('#example').dataTable( {
43196		 *        "columnDefs": [ {
43197		 *          "targets": [ 0 ],
43198		 *          "data": null, // Use the full data source object for the renderer's source
43199		 *          "render": {
43200		 *            "_": "phone",
43201		 *            "filter": "phone_filter",
43202		 *            "display": "phone_display"
43203		 *          }
43204		 *        } ]
43205		 *      } );
43206		 *    } );
43207		 *
43208		 *  @example
43209		 *    // Use as a function to create a link from the data source
43210		 *    $(document).ready( function() {
43211		 *      $('#example').dataTable( {
43212		 *        "columnDefs": [ {
43213		 *          "targets": [ 0 ],
43214		 *          "data": "download_link",
43215		 *          "render": function ( data, type, full ) {
43216		 *            return '<a href="'+data+'">Download</a>';
43217		 *          }
43218		 *        } ]
43219		 *      } );
43220		 *    } );
43221		 */
43222		"mRender": null,
43223	
43224	
43225		/**
43226		 * Change the cell type created for the column - either TD cells or TH cells. This
43227		 * can be useful as TH cells have semantic meaning in the table body, allowing them
43228		 * to act as a header for a row (you may wish to add scope='row' to the TH elements).
43229		 *  @type string
43230		 *  @default td
43231		 *
43232		 *  @name DataTable.defaults.column.cellType
43233		 *  @dtopt Columns
43234		 *
43235		 *  @example
43236		 *    // Make the first column use TH cells
43237		 *    $(document).ready( function() {
43238		 *      $('#example').dataTable( {
43239		 *        "columnDefs": [ {
43240		 *          "targets": [ 0 ],
43241		 *          "cellType": "th"
43242		 *        } ]
43243		 *      } );
43244		 *    } );
43245		 */
43246		"sCellType": "td",
43247	
43248	
43249		/**
43250		 * Class to give to each cell in this column.
43251		 *  @type string
43252		 *  @default <i>Empty string</i>
43253		 *
43254		 *  @name DataTable.defaults.column.class
43255		 *  @dtopt Columns
43256		 *
43257		 *  @example
43258		 *    // Using `columnDefs`
43259		 *    $(document).ready( function() {
43260		 *      $('#example').dataTable( {
43261		 *        "columnDefs": [
43262		 *          { "class": "my_class", "targets": [ 0 ] }
43263		 *        ]
43264		 *      } );
43265		 *    } );
43266		 *
43267		 *  @example
43268		 *    // Using `columns`
43269		 *    $(document).ready( function() {
43270		 *      $('#example').dataTable( {
43271		 *        "columns": [
43272		 *          { "class": "my_class" },
43273		 *          null,
43274		 *          null,
43275		 *          null,
43276		 *          null
43277		 *        ]
43278		 *      } );
43279		 *    } );
43280		 */
43281		"sClass": "",
43282	
43283		/**
43284		 * When DataTables calculates the column widths to assign to each column,
43285		 * it finds the longest string in each column and then constructs a
43286		 * temporary table and reads the widths from that. The problem with this
43287		 * is that "mmm" is much wider then "iiii", but the latter is a longer
43288		 * string - thus the calculation can go wrong (doing it properly and putting
43289		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
43290		 * a "work around" we provide this option. It will append its value to the
43291		 * text that is found to be the longest string for the column - i.e. padding.
43292		 * Generally you shouldn't need this!
43293		 *  @type string
43294		 *  @default <i>Empty string<i>
43295		 *
43296		 *  @name DataTable.defaults.column.contentPadding
43297		 *  @dtopt Columns
43298		 *
43299		 *  @example
43300		 *    // Using `columns`
43301		 *    $(document).ready( function() {
43302		 *      $('#example').dataTable( {
43303		 *        "columns": [
43304		 *          null,
43305		 *          null,
43306		 *          null,
43307		 *          {
43308		 *            "contentPadding": "mmm"
43309		 *          }
43310		 *        ]
43311		 *      } );
43312		 *    } );
43313		 */
43314		"sContentPadding": "",
43315	
43316	
43317		/**
43318		 * Allows a default value to be given for a column's data, and will be used
43319		 * whenever a null data source is encountered (this can be because `data`
43320		 * is set to null, or because the data source itself is null).
43321		 *  @type string
43322		 *  @default null
43323		 *
43324		 *  @name DataTable.defaults.column.defaultContent
43325		 *  @dtopt Columns
43326		 *
43327		 *  @example
43328		 *    // Using `columnDefs`
43329		 *    $(document).ready( function() {
43330		 *      $('#example').dataTable( {
43331		 *        "columnDefs": [
43332		 *          {
43333		 *            "data": null,
43334		 *            "defaultContent": "Edit",
43335		 *            "targets": [ -1 ]
43336		 *          }
43337		 *        ]
43338		 *      } );
43339		 *    } );
43340		 *
43341		 *  @example
43342		 *    // Using `columns`
43343		 *    $(document).ready( function() {
43344		 *      $('#example').dataTable( {
43345		 *        "columns": [
43346		 *          null,
43347		 *          null,
43348		 *          null,
43349		 *          {
43350		 *            "data": null,
43351		 *            "defaultContent": "Edit"
43352		 *          }
43353		 *        ]
43354		 *      } );
43355		 *    } );
43356		 */
43357		"sDefaultContent": null,
43358	
43359	
43360		/**
43361		 * This parameter is only used in DataTables' server-side processing. It can
43362		 * be exceptionally useful to know what columns are being displayed on the
43363		 * client side, and to map these to database fields. When defined, the names
43364		 * also allow DataTables to reorder information from the server if it comes
43365		 * back in an unexpected order (i.e. if you switch your columns around on the
43366		 * client-side, your server-side code does not also need updating).
43367		 *  @type string
43368		 *  @default <i>Empty string</i>
43369		 *
43370		 *  @name DataTable.defaults.column.name
43371		 *  @dtopt Columns
43372		 *
43373		 *  @example
43374		 *    // Using `columnDefs`
43375		 *    $(document).ready( function() {
43376		 *      $('#example').dataTable( {
43377		 *        "columnDefs": [
43378		 *          { "name": "engine", "targets": [ 0 ] },
43379		 *          { "name": "browser", "targets": [ 1 ] },
43380		 *          { "name": "platform", "targets": [ 2 ] },
43381		 *          { "name": "version", "targets": [ 3 ] },
43382		 *          { "name": "grade", "targets": [ 4 ] }
43383		 *        ]
43384		 *      } );
43385		 *    } );
43386		 *
43387		 *  @example
43388		 *    // Using `columns`
43389		 *    $(document).ready( function() {
43390		 *      $('#example').dataTable( {
43391		 *        "columns": [
43392		 *          { "name": "engine" },
43393		 *          { "name": "browser" },
43394		 *          { "name": "platform" },
43395		 *          { "name": "version" },
43396		 *          { "name": "grade" }
43397		 *        ]
43398		 *      } );
43399		 *    } );
43400		 */
43401		"sName": "",
43402	
43403	
43404		/**
43405		 * Defines a data source type for the ordering which can be used to read
43406		 * real-time information from the table (updating the internally cached
43407		 * version) prior to ordering. This allows ordering to occur on user
43408		 * editable elements such as form inputs.
43409		 *  @type string
43410		 *  @default std
43411		 *
43412		 *  @name DataTable.defaults.column.orderDataType
43413		 *  @dtopt Columns
43414		 *
43415		 *  @example
43416		 *    // Using `columnDefs`
43417		 *    $(document).ready( function() {
43418		 *      $('#example').dataTable( {
43419		 *        "columnDefs": [
43420		 *          { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
43421		 *          { "type": "numeric", "targets": [ 3 ] },
43422		 *          { "orderDataType": "dom-select", "targets": [ 4 ] },
43423		 *          { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
43424		 *        ]
43425		 *      } );
43426		 *    } );
43427		 *
43428		 *  @example
43429		 *    // Using `columns`
43430		 *    $(document).ready( function() {
43431		 *      $('#example').dataTable( {
43432		 *        "columns": [
43433		 *          null,
43434		 *          null,
43435		 *          { "orderDataType": "dom-text" },
43436		 *          { "orderDataType": "dom-text", "type": "numeric" },
43437		 *          { "orderDataType": "dom-select" },
43438		 *          { "orderDataType": "dom-checkbox" }
43439		 *        ]
43440		 *      } );
43441		 *    } );
43442		 */
43443		"sSortDataType": "std",
43444	
43445	
43446		/**
43447		 * The title of this column.
43448		 *  @type string
43449		 *  @default null <i>Derived from the 'TH' value for this column in the
43450		 *    original HTML table.</i>
43451		 *
43452		 *  @name DataTable.defaults.column.title
43453		 *  @dtopt Columns
43454		 *
43455		 *  @example
43456		 *    // Using `columnDefs`
43457		 *    $(document).ready( function() {
43458		 *      $('#example').dataTable( {
43459		 *        "columnDefs": [
43460		 *          { "title": "My column title", "targets": [ 0 ] }
43461		 *        ]
43462		 *      } );
43463		 *    } );
43464		 *
43465		 *  @example
43466		 *    // Using `columns`
43467		 *    $(document).ready( function() {
43468		 *      $('#example').dataTable( {
43469		 *        "columns": [
43470		 *          { "title": "My column title" },
43471		 *          null,
43472		 *          null,
43473		 *          null,
43474		 *          null
43475		 *        ]
43476		 *      } );
43477		 *    } );
43478		 */
43479		"sTitle": null,
43480	
43481	
43482		/**
43483		 * The type allows you to specify how the data for this column will be
43484		 * ordered. Four types (string, numeric, date and html (which will strip
43485		 * HTML tags before ordering)) are currently available. Note that only date
43486		 * formats understood by Javascript's Date() object will be accepted as type
43487		 * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
43488		 * 'numeric', 'date' or 'html' (by default). Further types can be adding
43489		 * through plug-ins.
43490		 *  @type string
43491		 *  @default null <i>Auto-detected from raw data</i>
43492		 *
43493		 *  @name DataTable.defaults.column.type
43494		 *  @dtopt Columns
43495		 *
43496		 *  @example
43497		 *    // Using `columnDefs`
43498		 *    $(document).ready( function() {
43499		 *      $('#example').dataTable( {
43500		 *        "columnDefs": [
43501		 *          { "type": "html", "targets": [ 0 ] }
43502		 *        ]
43503		 *      } );
43504		 *    } );
43505		 *
43506		 *  @example
43507		 *    // Using `columns`
43508		 *    $(document).ready( function() {
43509		 *      $('#example').dataTable( {
43510		 *        "columns": [
43511		 *          { "type": "html" },
43512		 *          null,
43513		 *          null,
43514		 *          null,
43515		 *          null
43516		 *        ]
43517		 *      } );
43518		 *    } );
43519		 */
43520		"sType": null,
43521	
43522	
43523		/**
43524		 * Defining the width of the column, this parameter may take any CSS value
43525		 * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
43526		 * been given a specific width through this interface ensuring that the table
43527		 * remains readable.
43528		 *  @type string
43529		 *  @default null <i>Automatic</i>
43530		 *
43531		 *  @name DataTable.defaults.column.width
43532		 *  @dtopt Columns
43533		 *
43534		 *  @example
43535		 *    // Using `columnDefs`
43536		 *    $(document).ready( function() {
43537		 *      $('#example').dataTable( {
43538		 *        "columnDefs": [
43539		 *          { "width": "20%", "targets": [ 0 ] }
43540		 *        ]
43541		 *      } );
43542		 *    } );
43543		 *
43544		 *  @example
43545		 *    // Using `columns`
43546		 *    $(document).ready( function() {
43547		 *      $('#example').dataTable( {
43548		 *        "columns": [
43549		 *          { "width": "20%" },
43550		 *          null,
43551		 *          null,
43552		 *          null,
43553		 *          null
43554		 *        ]
43555		 *      } );
43556		 *    } );
43557		 */
43558		"sWidth": null
43559	};
43560	
43561	_fnHungarianMap( DataTable.defaults.column );
43562	
43563	
43564	
43565	/**
43566	 * DataTables settings object - this holds all the information needed for a
43567	 * given table, including configuration, data and current application of the
43568	 * table options. DataTables does not have a single instance for each DataTable
43569	 * with the settings attached to that instance, but rather instances of the
43570	 * DataTable "class" are created on-the-fly as needed (typically by a
43571	 * $().dataTable() call) and the settings object is then applied to that
43572	 * instance.
43573	 *
43574	 * Note that this object is related to {@link DataTable.defaults} but this
43575	 * one is the internal data store for DataTables's cache of columns. It should
43576	 * NOT be manipulated outside of DataTables. Any configuration should be done
43577	 * through the initialisation options.
43578	 *  @namespace
43579	 *  @todo Really should attach the settings object to individual instances so we
43580	 *    don't need to create new instances on each $().dataTable() call (if the
43581	 *    table already exists). It would also save passing oSettings around and
43582	 *    into every single function. However, this is a very significant
43583	 *    architecture change for DataTables and will almost certainly break
43584	 *    backwards compatibility with older installations. This is something that
43585	 *    will be done in 2.0.
43586	 */
43587	DataTable.models.oSettings = {
43588		/**
43589		 * Primary features of DataTables and their enablement state.
43590		 *  @namespace
43591		 */
43592		"oFeatures": {
43593	
43594			/**
43595			 * Flag to say if DataTables should automatically try to calculate the
43596			 * optimum table and columns widths (true) or not (false).
43597			 * Note that this parameter will be set by the initialisation routine. To
43598			 * set a default use {@link DataTable.defaults}.
43599			 *  @type boolean
43600			 */
43601			"bAutoWidth": null,
43602	
43603			/**
43604			 * Delay the creation of TR and TD elements until they are actually
43605			 * needed by a driven page draw. This can give a significant speed
43606			 * increase for Ajax source and Javascript source data, but makes no
43607			 * difference at all fro DOM and server-side processing tables.
43608			 * Note that this parameter will be set by the initialisation routine. To
43609			 * set a default use {@link DataTable.defaults}.
43610			 *  @type boolean
43611			 */
43612			"bDeferRender": null,
43613	
43614			/**
43615			 * Enable filtering on the table or not. Note that if this is disabled
43616			 * then there is no filtering at all on the table, including fnFilter.
43617			 * To just remove the filtering input use sDom and remove the 'f' option.
43618			 * Note that this parameter will be set by the initialisation routine. To
43619			 * set a default use {@link DataTable.defaults}.
43620			 *  @type boolean
43621			 */
43622			"bFilter": null,
43623	
43624			/**
43625			 * Table information element (the 'Showing x of y records' div) enable
43626			 * flag.
43627			 * Note that this parameter will be set by the initialisation routine. To
43628			 * set a default use {@link DataTable.defaults}.
43629			 *  @type boolean
43630			 */
43631			"bInfo": null,
43632	
43633			/**
43634			 * Present a user control allowing the end user to change the page size
43635			 * when pagination is enabled.
43636			 * Note that this parameter will be set by the initialisation routine. To
43637			 * set a default use {@link DataTable.defaults}.
43638			 *  @type boolean
43639			 */
43640			"bLengthChange": null,
43641	
43642			/**
43643			 * Pagination enabled or not. Note that if this is disabled then length
43644			 * changing must also be disabled.
43645			 * Note that this parameter will be set by the initialisation routine. To
43646			 * set a default use {@link DataTable.defaults}.
43647			 *  @type boolean
43648			 */
43649			"bPaginate": null,
43650	
43651			/**
43652			 * Processing indicator enable flag whenever DataTables is enacting a
43653			 * user request - typically an Ajax request for server-side processing.
43654			 * Note that this parameter will be set by the initialisation routine. To
43655			 * set a default use {@link DataTable.defaults}.
43656			 *  @type boolean
43657			 */
43658			"bProcessing": null,
43659	
43660			/**
43661			 * Server-side processing enabled flag - when enabled DataTables will
43662			 * get all data from the server for every draw - there is no filtering,
43663			 * sorting or paging done on the client-side.
43664			 * Note that this parameter will be set by the initialisation routine. To
43665			 * set a default use {@link DataTable.defaults}.
43666			 *  @type boolean
43667			 */
43668			"bServerSide": null,
43669	
43670			/**
43671			 * Sorting enablement flag.
43672			 * Note that this parameter will be set by the initialisation routine. To
43673			 * set a default use {@link DataTable.defaults}.
43674			 *  @type boolean
43675			 */
43676			"bSort": null,
43677	
43678			/**
43679			 * Multi-column sorting
43680			 * Note that this parameter will be set by the initialisation routine. To
43681			 * set a default use {@link DataTable.defaults}.
43682			 *  @type boolean
43683			 */
43684			"bSortMulti": null,
43685	
43686			/**
43687			 * Apply a class to the columns which are being sorted to provide a
43688			 * visual highlight or not. This can slow things down when enabled since
43689			 * there is a lot of DOM interaction.
43690			 * Note that this parameter will be set by the initialisation routine. To
43691			 * set a default use {@link DataTable.defaults}.
43692			 *  @type boolean
43693			 */
43694			"bSortClasses": null,
43695	
43696			/**
43697			 * State saving enablement flag.
43698			 * Note that this parameter will be set by the initialisation routine. To
43699			 * set a default use {@link DataTable.defaults}.
43700			 *  @type boolean
43701			 */
43702			"bStateSave": null
43703		},
43704	
43705	
43706		/**
43707		 * Scrolling settings for a table.
43708		 *  @namespace
43709		 */
43710		"oScroll": {
43711			/**
43712			 * When the table is shorter in height than sScrollY, collapse the
43713			 * table container down to the height of the table (when true).
43714			 * Note that this parameter will be set by the initialisation routine. To
43715			 * set a default use {@link DataTable.defaults}.
43716			 *  @type boolean
43717			 */
43718			"bCollapse": null,
43719	
43720			/**
43721			 * Width of the scrollbar for the web-browser's platform. Calculated
43722			 * during table initialisation.
43723			 *  @type int
43724			 *  @default 0
43725			 */
43726			"iBarWidth": 0,
43727	
43728			/**
43729			 * Viewport width for horizontal scrolling. Horizontal scrolling is
43730			 * disabled if an empty string.
43731			 * Note that this parameter will be set by the initialisation routine. To
43732			 * set a default use {@link DataTable.defaults}.
43733			 *  @type string
43734			 */
43735			"sX": null,
43736	
43737			/**
43738			 * Width to expand the table to when using x-scrolling. Typically you
43739			 * should not need to use this.
43740			 * Note that this parameter will be set by the initialisation routine. To
43741			 * set a default use {@link DataTable.defaults}.
43742			 *  @type string
43743			 *  @deprecated
43744			 */
43745			"sXInner": null,
43746	
43747			/**
43748			 * Viewport height for vertical scrolling. Vertical scrolling is disabled
43749			 * if an empty string.
43750			 * Note that this parameter will be set by the initialisation routine. To
43751			 * set a default use {@link DataTable.defaults}.
43752			 *  @type string
43753			 */
43754			"sY": null
43755		},
43756	
43757		/**
43758		 * Language information for the table.
43759		 *  @namespace
43760		 *  @extends DataTable.defaults.oLanguage
43761		 */
43762		"oLanguage": {
43763			/**
43764			 * Information callback function. See
43765			 * {@link DataTable.defaults.fnInfoCallback}
43766			 *  @type function
43767			 *  @default null
43768			 */
43769			"fnInfoCallback": null
43770		},
43771	
43772		/**
43773		 * Browser support parameters
43774		 *  @namespace
43775		 */
43776		"oBrowser": {
43777			/**
43778			 * Indicate if the browser incorrectly calculates width:100% inside a
43779			 * scrolling element (IE6/7)
43780			 *  @type boolean
43781			 *  @default false
43782			 */
43783			"bScrollOversize": false,
43784	
43785			/**
43786			 * Determine if the vertical scrollbar is on the right or left of the
43787			 * scrolling container - needed for rtl language layout, although not
43788			 * all browsers move the scrollbar (Safari).
43789			 *  @type boolean
43790			 *  @default false
43791			 */
43792			"bScrollbarLeft": false,
43793	
43794			/**
43795			 * Flag for if `getBoundingClientRect` is fully supported or not
43796			 *  @type boolean
43797			 *  @default false
43798			 */
43799			"bBounding": false,
43800	
43801			/**
43802			 * Browser scrollbar width
43803			 *  @type integer
43804			 *  @default 0
43805			 */
43806			"barWidth": 0
43807		},
43808	
43809	
43810		"ajax": null,
43811	
43812	
43813		/**
43814		 * Array referencing the nodes which are used for the features. The
43815		 * parameters of this object match what is allowed by sDom - i.e.
43816		 *   <ul>
43817		 *     <li>'l' - Length changing</li>
43818		 *     <li>'f' - Filtering input</li>
43819		 *     <li>'t' - The table!</li>
43820		 *     <li>'i' - Information</li>
43821		 *     <li>'p' - Pagination</li>
43822		 *     <li>'r' - pRocessing</li>
43823		 *   </ul>
43824		 *  @type array
43825		 *  @default []
43826		 */
43827		"aanFeatures": [],
43828	
43829		/**
43830		 * Store data information - see {@link DataTable.models.oRow} for detailed
43831		 * information.
43832		 *  @type array
43833		 *  @default []
43834		 */
43835		"aoData": [],
43836	
43837		/**
43838		 * Array of indexes which are in the current display (after filtering etc)
43839		 *  @type array
43840		 *  @default []
43841		 */
43842		"aiDisplay": [],
43843	
43844		/**
43845		 * Array of indexes for display - no filtering
43846		 *  @type array
43847		 *  @default []
43848		 */
43849		"aiDisplayMaster": [],
43850	
43851		/**
43852		 * Map of row ids to data indexes
43853		 *  @type object
43854		 *  @default {}
43855		 */
43856		"aIds": {},
43857	
43858		/**
43859		 * Store information about each column that is in use
43860		 *  @type array
43861		 *  @default []
43862		 */
43863		"aoColumns": [],
43864	
43865		/**
43866		 * Store information about the table's header
43867		 *  @type array
43868		 *  @default []
43869		 */
43870		"aoHeader": [],
43871	
43872		/**
43873		 * Store information about the table's footer
43874		 *  @type array
43875		 *  @default []
43876		 */
43877		"aoFooter": [],
43878	
43879		/**
43880		 * Store the applied global search information in case we want to force a
43881		 * research or compare the old search to a new one.
43882		 * Note that this parameter will be set by the initialisation routine. To
43883		 * set a default use {@link DataTable.defaults}.
43884		 *  @namespace
43885		 *  @extends DataTable.models.oSearch
43886		 */
43887		"oPreviousSearch": {},
43888	
43889		/**
43890		 * Store the applied search for each column - see
43891		 * {@link DataTable.models.oSearch} for the format that is used for the
43892		 * filtering information for each column.
43893		 *  @type array
43894		 *  @default []
43895		 */
43896		"aoPreSearchCols": [],
43897	
43898		/**
43899		 * Sorting that is applied to the table. Note that the inner arrays are
43900		 * used in the following manner:
43901		 * <ul>
43902		 *   <li>Index 0 - column number</li>
43903		 *   <li>Index 1 - current sorting direction</li>
43904		 * </ul>
43905		 * Note that this parameter will be set by the initialisation routine. To
43906		 * set a default use {@link DataTable.defaults}.
43907		 *  @type array
43908		 *  @todo These inner arrays should really be objects
43909		 */
43910		"aaSorting": null,
43911	
43912		/**
43913		 * Sorting that is always applied to the table (i.e. prefixed in front of
43914		 * aaSorting).
43915		 * Note that this parameter will be set by the initialisation routine. To
43916		 * set a default use {@link DataTable.defaults}.
43917		 *  @type array
43918		 *  @default []
43919		 */
43920		"aaSortingFixed": [],
43921	
43922		/**
43923		 * Classes to use for the striping of a table.
43924		 * Note that this parameter will be set by the initialisation routine. To
43925		 * set a default use {@link DataTable.defaults}.
43926		 *  @type array
43927		 *  @default []
43928		 */
43929		"asStripeClasses": null,
43930	
43931		/**
43932		 * If restoring a table - we should restore its striping classes as well
43933		 *  @type array
43934		 *  @default []
43935		 */
43936		"asDestroyStripes": [],
43937	
43938		/**
43939		 * If restoring a table - we should restore its width
43940		 *  @type int
43941		 *  @default 0
43942		 */
43943		"sDestroyWidth": 0,
43944	
43945		/**
43946		 * Callback functions array for every time a row is inserted (i.e. on a draw).
43947		 *  @type array
43948		 *  @default []
43949		 */
43950		"aoRowCallback": [],
43951	
43952		/**
43953		 * Callback functions for the header on each draw.
43954		 *  @type array
43955		 *  @default []
43956		 */
43957		"aoHeaderCallback": [],
43958	
43959		/**
43960		 * Callback function for the footer on each draw.
43961		 *  @type array
43962		 *  @default []
43963		 */
43964		"aoFooterCallback": [],
43965	
43966		/**
43967		 * Array of callback functions for draw callback functions
43968		 *  @type array
43969		 *  @default []
43970		 */
43971		"aoDrawCallback": [],
43972	
43973		/**
43974		 * Array of callback functions for row created function
43975		 *  @type array
43976		 *  @default []
43977		 */
43978		"aoRowCreatedCallback": [],
43979	
43980		/**
43981		 * Callback functions for just before the table is redrawn. A return of
43982		 * false will be used to cancel the draw.
43983		 *  @type array
43984		 *  @default []
43985		 */
43986		"aoPreDrawCallback": [],
43987	
43988		/**
43989		 * Callback functions for when the table has been initialised.
43990		 *  @type array
43991		 *  @default []
43992		 */
43993		"aoInitComplete": [],
43994	
43995	
43996		/**
43997		 * Callbacks for modifying the settings to be stored for state saving, prior to
43998		 * saving state.
43999		 *  @type array
44000		 *  @default []
44001		 */
44002		"aoStateSaveParams": [],
44003	
44004		/**
44005		 * Callbacks for modifying the settings that have been stored for state saving
44006		 * prior to using the stored values to restore the state.
44007		 *  @type array
44008		 *  @default []
44009		 */
44010		"aoStateLoadParams": [],
44011	
44012		/**
44013		 * Callbacks for operating on the settings object once the saved state has been
44014		 * loaded
44015		 *  @type array
44016		 *  @default []
44017		 */
44018		"aoStateLoaded": [],
44019	
44020		/**
44021		 * Cache the table ID for quick access
44022		 *  @type string
44023		 *  @default <i>Empty string</i>
44024		 */
44025		"sTableId": "",
44026	
44027		/**
44028		 * The TABLE node for the main table
44029		 *  @type node
44030		 *  @default null
44031		 */
44032		"nTable": null,
44033	
44034		/**
44035		 * Permanent ref to the thead element
44036		 *  @type node
44037		 *  @default null
44038		 */
44039		"nTHead": null,
44040	
44041		/**
44042		 * Permanent ref to the tfoot element - if it exists
44043		 *  @type node
44044		 *  @default null
44045		 */
44046		"nTFoot": null,
44047	
44048		/**
44049		 * Permanent ref to the tbody element
44050		 *  @type node
44051		 *  @default null
44052		 */
44053		"nTBody": null,
44054	
44055		/**
44056		 * Cache the wrapper node (contains all DataTables controlled elements)
44057		 *  @type node
44058		 *  @default null
44059		 */
44060		"nTableWrapper": null,
44061	
44062		/**
44063		 * Indicate if when using server-side processing the loading of data
44064		 * should be deferred until the second draw.
44065		 * Note that this parameter will be set by the initialisation routine. To
44066		 * set a default use {@link DataTable.defaults}.
44067		 *  @type boolean
44068		 *  @default false
44069		 */
44070		"bDeferLoading": false,
44071	
44072		/**
44073		 * Indicate if all required information has been read in
44074		 *  @type boolean
44075		 *  @default false
44076		 */
44077		"bInitialised": false,
44078	
44079		/**
44080		 * Information about open rows. Each object in the array has the parameters
44081		 * 'nTr' and 'nParent'
44082		 *  @type array
44083		 *  @default []
44084		 */
44085		"aoOpenRows": [],
44086	
44087		/**
44088		 * Dictate the positioning of DataTables' control elements - see
44089		 * {@link DataTable.model.oInit.sDom}.
44090		 * Note that this parameter will be set by the initialisation routine. To
44091		 * set a default use {@link DataTable.defaults}.
44092		 *  @type string
44093		 *  @default null
44094		 */
44095		"sDom": null,
44096	
44097		/**
44098		 * Search delay (in mS)
44099		 *  @type integer
44100		 *  @default null
44101		 */
44102		"searchDelay": null,
44103	
44104		/**
44105		 * Which type of pagination should be used.
44106		 * Note that this parameter will be set by the initialisation routine. To
44107		 * set a default use {@link DataTable.defaults}.
44108		 *  @type string
44109		 *  @default two_button
44110		 */
44111		"sPaginationType": "two_button",
44112	
44113		/**
44114		 * The state duration (for `stateSave`) in seconds.
44115		 * Note that this parameter will be set by the initialisation routine. To
44116		 * set a default use {@link DataTable.defaults}.
44117		 *  @type int
44118		 *  @default 0
44119		 */
44120		"iStateDuration": 0,
44121	
44122		/**
44123		 * Array of callback functions for state saving. Each array element is an
44124		 * object with the following parameters:
44125		 *   <ul>
44126		 *     <li>function:fn - function to call. Takes two parameters, oSettings
44127		 *       and the JSON string to save that has been thus far created. Returns
44128		 *       a JSON string to be inserted into a json object
44129		 *       (i.e. '"param": [ 0, 1, 2]')</li>
44130		 *     <li>string:sName - name of callback</li>
44131		 *   </ul>
44132		 *  @type array
44133		 *  @default []
44134		 */
44135		"aoStateSave": [],
44136	
44137		/**
44138		 * Array of callback functions for state loading. Each array element is an
44139		 * object with the following parameters:
44140		 *   <ul>
44141		 *     <li>function:fn - function to call. Takes two parameters, oSettings
44142		 *       and the object stored. May return false to cancel state loading</li>
44143		 *     <li>string:sName - name of callback</li>
44144		 *   </ul>
44145		 *  @type array
44146		 *  @default []
44147		 */
44148		"aoStateLoad": [],
44149	
44150		/**
44151		 * State that was saved. Useful for back reference
44152		 *  @type object
44153		 *  @default null
44154		 */
44155		"oSavedState": null,
44156	
44157		/**
44158		 * State that was loaded. Useful for back reference
44159		 *  @type object
44160		 *  @default null
44161		 */
44162		"oLoadedState": null,
44163	
44164		/**
44165		 * Source url for AJAX data for the table.
44166		 * Note that this parameter will be set by the initialisation routine. To
44167		 * set a default use {@link DataTable.defaults}.
44168		 *  @type string
44169		 *  @default null
44170		 */
44171		"sAjaxSource": null,
44172	
44173		/**
44174		 * Property from a given object from which to read the table data from. This
44175		 * can be an empty string (when not server-side processing), in which case
44176		 * it is  assumed an an array is given directly.
44177		 * Note that this parameter will be set by the initialisation routine. To
44178		 * set a default use {@link DataTable.defaults}.
44179		 *  @type string
44180		 */
44181		"sAjaxDataProp": null,
44182	
44183		/**
44184		 * Note if draw should be blocked while getting data
44185		 *  @type boolean
44186		 *  @default true
44187		 */
44188		"bAjaxDataGet": true,
44189	
44190		/**
44191		 * The last jQuery XHR object that was used for server-side data gathering.
44192		 * This can be used for working with the XHR information in one of the
44193		 * callbacks
44194		 *  @type object
44195		 *  @default null
44196		 */
44197		"jqXHR": null,
44198	
44199		/**
44200		 * JSON returned from the server in the last Ajax request
44201		 *  @type object
44202		 *  @default undefined
44203		 */
44204		"json": undefined,
44205	
44206		/**
44207		 * Data submitted as part of the last Ajax request
44208		 *  @type object
44209		 *  @default undefined
44210		 */
44211		"oAjaxData": undefined,
44212	
44213		/**
44214		 * Function to get the server-side data.
44215		 * Note that this parameter will be set by the initialisation routine. To
44216		 * set a default use {@link DataTable.defaults}.
44217		 *  @type function
44218		 */
44219		"fnServerData": null,
44220	
44221		/**
44222		 * Functions which are called prior to sending an Ajax request so extra
44223		 * parameters can easily be sent to the server
44224		 *  @type array
44225		 *  @default []
44226		 */
44227		"aoServerParams": [],
44228	
44229		/**
44230		 * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
44231		 * required).
44232		 * Note that this parameter will be set by the initialisation routine. To
44233		 * set a default use {@link DataTable.defaults}.
44234		 *  @type string
44235		 */
44236		"sServerMethod": null,
44237	
44238		/**
44239		 * Format numbers for display.
44240		 * Note that this parameter will be set by the initialisation routine. To
44241		 * set a default use {@link DataTable.defaults}.
44242		 *  @type function
44243		 */
44244		"fnFormatNumber": null,
44245	
44246		/**
44247		 * List of options that can be used for the user selectable length menu.
44248		 * Note that this parameter will be set by the initialisation routine. To
44249		 * set a default use {@link DataTable.defaults}.
44250		 *  @type array
44251		 *  @default []
44252		 */
44253		"aLengthMenu": null,
44254	
44255		/**
44256		 * Counter for the draws that the table does. Also used as a tracker for
44257		 * server-side processing
44258		 *  @type int
44259		 *  @default 0
44260		 */
44261		"iDraw": 0,
44262	
44263		/**
44264		 * Indicate if a redraw is being done - useful for Ajax
44265		 *  @type boolean
44266		 *  @default false
44267		 */
44268		"bDrawing": false,
44269	
44270		/**
44271		 * Draw index (iDraw) of the last error when parsing the returned data
44272		 *  @type int
44273		 *  @default -1
44274		 */
44275		"iDrawError": -1,
44276	
44277		/**
44278		 * Paging display length
44279		 *  @type int
44280		 *  @default 10
44281		 */
44282		"_iDisplayLength": 10,
44283	
44284		/**
44285		 * Paging start point - aiDisplay index
44286		 *  @type int
44287		 *  @default 0
44288		 */
44289		"_iDisplayStart": 0,
44290	
44291		/**
44292		 * Server-side processing - number of records in the result set
44293		 * (i.e. before filtering), Use fnRecordsTotal rather than
44294		 * this property to get the value of the number of records, regardless of
44295		 * the server-side processing setting.
44296		 *  @type int
44297		 *  @default 0
44298		 *  @private
44299		 */
44300		"_iRecordsTotal": 0,
44301	
44302		/**
44303		 * Server-side processing - number of records in the current display set
44304		 * (i.e. after filtering). Use fnRecordsDisplay rather than
44305		 * this property to get the value of the number of records, regardless of
44306		 * the server-side processing setting.
44307		 *  @type boolean
44308		 *  @default 0
44309		 *  @private
44310		 */
44311		"_iRecordsDisplay": 0,
44312	
44313		/**
44314		 * Flag to indicate if jQuery UI marking and classes should be used.
44315		 * Note that this parameter will be set by the initialisation routine. To
44316		 * set a default use {@link DataTable.defaults}.
44317		 *  @type boolean
44318		 */
44319		"bJUI": null,
44320	
44321		/**
44322		 * The classes to use for the table
44323		 *  @type object
44324		 *  @default {}
44325		 */
44326		"oClasses": {},
44327	
44328		/**
44329		 * Flag attached to the settings object so you can check in the draw
44330		 * callback if filtering has been done in the draw. Deprecated in favour of
44331		 * events.
44332		 *  @type boolean
44333		 *  @default false
44334		 *  @deprecated
44335		 */
44336		"bFiltered": false,
44337	
44338		/**
44339		 * Flag attached to the settings object so you can check in the draw
44340		 * callback if sorting has been done in the draw. Deprecated in favour of
44341		 * events.
44342		 *  @type boolean
44343		 *  @default false
44344		 *  @deprecated
44345		 */
44346		"bSorted": false,
44347	
44348		/**
44349		 * Indicate that if multiple rows are in the header and there is more than
44350		 * one unique cell per column, if the top one (true) or bottom one (false)
44351		 * should be used for sorting / title by DataTables.
44352		 * Note that this parameter will be set by the initialisation routine. To
44353		 * set a default use {@link DataTable.defaults}.
44354		 *  @type boolean
44355		 */
44356		"bSortCellsTop": null,
44357	
44358		/**
44359		 * Initialisation object that is used for the table
44360		 *  @type object
44361		 *  @default null
44362		 */
44363		"oInit": null,
44364	
44365		/**
44366		 * Destroy callback functions - for plug-ins to attach themselves to the
44367		 * destroy so they can clean up markup and events.
44368		 *  @type array
44369		 *  @default []
44370		 */
44371		"aoDestroyCallback": [],
44372	
44373	
44374		/**
44375		 * Get the number of records in the current record set, before filtering
44376		 *  @type function
44377		 */
44378		"fnRecordsTotal": function ()
44379		{
44380			return _fnDataSource( this ) == 'ssp' ?
44381				this._iRecordsTotal * 1 :
44382				this.aiDisplayMaster.length;
44383		},
44384	
44385		/**
44386		 * Get the number of records in the current record set, after filtering
44387		 *  @type function
44388		 */
44389		"fnRecordsDisplay": function ()
44390		{
44391			return _fnDataSource( this ) == 'ssp' ?
44392				this._iRecordsDisplay * 1 :
44393				this.aiDisplay.length;
44394		},
44395	
44396		/**
44397		 * Get the display end point - aiDisplay index
44398		 *  @type function
44399		 */
44400		"fnDisplayEnd": function ()
44401		{
44402			var
44403				len      = this._iDisplayLength,
44404				start    = this._iDisplayStart,
44405				calc     = start + len,
44406				records  = this.aiDisplay.length,
44407				features = this.oFeatures,
44408				paginate = features.bPaginate;
44409	
44410			if ( features.bServerSide ) {
44411				return paginate === false || len === -1 ?
44412					start + records :
44413					Math.min( start+len, this._iRecordsDisplay );
44414			}
44415			else {
44416				return ! paginate || calc>records || len===-1 ?
44417					records :
44418					calc;
44419			}
44420		},
44421	
44422		/**
44423		 * The DataTables object for this table
44424		 *  @type object
44425		 *  @default null
44426		 */
44427		"oInstance": null,
44428	
44429		/**
44430		 * Unique identifier for each instance of the DataTables object. If there
44431		 * is an ID on the table node, then it takes that value, otherwise an
44432		 * incrementing internal counter is used.
44433		 *  @type string
44434		 *  @default null
44435		 */
44436		"sInstance": null,
44437	
44438		/**
44439		 * tabindex attribute value that is added to DataTables control elements, allowing
44440		 * keyboard navigation of the table and its controls.
44441		 */
44442		"iTabIndex": 0,
44443	
44444		/**
44445		 * DIV container for the footer scrolling table if scrolling
44446		 */
44447		"nScrollHead": null,
44448	
44449		/**
44450		 * DIV container for the footer scrolling table if scrolling
44451		 */
44452		"nScrollFoot": null,
44453	
44454		/**
44455		 * Last applied sort
44456		 *  @type array
44457		 *  @default []
44458		 */
44459		"aLastSort": [],
44460	
44461		/**
44462		 * Stored plug-in instances
44463		 *  @type object
44464		 *  @default {}
44465		 */
44466		"oPlugins": {},
44467	
44468		/**
44469		 * Function used to get a row's id from the row's data
44470		 *  @type function
44471		 *  @default null
44472		 */
44473		"rowIdFn": null,
44474	
44475		/**
44476		 * Data location where to store a row's id
44477		 *  @type string
44478		 *  @default null
44479		 */
44480		"rowId": null
44481	};
44482
44483	/**
44484	 * Extension object for DataTables that is used to provide all extension
44485	 * options.
44486	 *
44487	 * Note that the `DataTable.ext` object is available through
44488	 * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
44489	 * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
44490	 *  @namespace
44491	 *  @extends DataTable.models.ext
44492	 */
44493	
44494	
44495	/**
44496	 * DataTables extensions
44497	 * 
44498	 * This namespace acts as a collection area for plug-ins that can be used to
44499	 * extend DataTables capabilities. Indeed many of the build in methods
44500	 * use this method to provide their own capabilities (sorting methods for
44501	 * example).
44502	 *
44503	 * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
44504	 * reasons
44505	 *
44506	 *  @namespace
44507	 */
44508	DataTable.ext = _ext = {
44509		/**
44510		 * Buttons. For use with the Buttons extension for DataTables. This is
44511		 * defined here so other extensions can define buttons regardless of load
44512		 * order. It is _not_ used by DataTables core.
44513		 *
44514		 *  @type object
44515		 *  @default {}
44516		 */
44517		buttons: {},
44518	
44519	
44520		/**
44521		 * Element class names
44522		 *
44523		 *  @type object
44524		 *  @default {}
44525		 */
44526		classes: {},
44527	
44528	
44529		/**
44530		 * Error reporting.
44531		 * 
44532		 * How should DataTables report an error. Can take the value 'alert',
44533		 * 'throw', 'none' or a function.
44534		 *
44535		 *  @type string|function
44536		 *  @default alert
44537		 */
44538		errMode: "alert",
44539	
44540	
44541		/**
44542		 * Feature plug-ins.
44543		 * 
44544		 * This is an array of objects which describe the feature plug-ins that are
44545		 * available to DataTables. These feature plug-ins are then available for
44546		 * use through the `dom` initialisation option.
44547		 * 
44548		 * Each feature plug-in is described by an object which must have the
44549		 * following properties:
44550		 * 
44551		 * * `fnInit` - function that is used to initialise the plug-in,
44552		 * * `cFeature` - a character so the feature can be enabled by the `dom`
44553		 *   instillation option. This is case sensitive.
44554		 *
44555		 * The `fnInit` function has the following input parameters:
44556		 *
44557		 * 1. `{object}` DataTables settings object: see
44558		 *    {@link DataTable.models.oSettings}
44559		 *
44560		 * And the following return is expected:
44561		 * 
44562		 * * {node|null} The element which contains your feature. Note that the
44563		 *   return may also be void if your plug-in does not require to inject any
44564		 *   DOM elements into DataTables control (`dom`) - for example this might
44565		 *   be useful when developing a plug-in which allows table control via
44566		 *   keyboard entry
44567		 *
44568		 *  @type array
44569		 *
44570		 *  @example
44571		 *    $.fn.dataTable.ext.features.push( {
44572		 *      "fnInit": function( oSettings ) {
44573		 *        return new TableTools( { "oDTSettings": oSettings } );
44574		 *      },
44575		 *      "cFeature": "T"
44576		 *    } );
44577		 */
44578		feature: [],
44579	
44580	
44581		/**
44582		 * Row searching.
44583		 * 
44584		 * This method of searching is complimentary to the default type based
44585		 * searching, and a lot more comprehensive as it allows you complete control
44586		 * over the searching logic. Each element in this array is a function
44587		 * (parameters described below) that is called for every row in the table,
44588		 * and your logic decides if it should be included in the searching data set
44589		 * or not.
44590		 *
44591		 * Searching functions have the following input parameters:
44592		 *
44593		 * 1. `{object}` DataTables settings object: see
44594		 *    {@link DataTable.models.oSettings}
44595		 * 2. `{array|object}` Data for the row to be processed (same as the
44596		 *    original format that was passed in as the data source, or an array
44597		 *    from a DOM data source
44598		 * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
44599		 *    can be useful to retrieve the `TR` element if you need DOM interaction.
44600		 *
44601		 * And the following return is expected:
44602		 *
44603		 * * {boolean} Include the row in the searched result set (true) or not
44604		 *   (false)
44605		 *
44606		 * Note that as with the main search ability in DataTables, technically this
44607		 * is "filtering", since it is subtractive. However, for consistency in
44608		 * naming we call it searching here.
44609		 *
44610		 *  @type array
44611		 *  @default []
44612		 *
44613		 *  @example
44614		 *    // The following example shows custom search being applied to the
44615		 *    // fourth column (i.e. the data[3] index) based on two input values
44616		 *    // from the end-user, matching the data in a certain range.
44617		 *    $.fn.dataTable.ext.search.push(
44618		 *      function( settings, data, dataIndex ) {
44619		 *        var min = document.getElementById('min').value * 1;
44620		 *        var max = document.getElementById('max').value * 1;
44621		 *        var version = data[3] == "-" ? 0 : data[3]*1;
44622		 *
44623		 *        if ( min == "" && max == "" ) {
44624		 *          return true;
44625		 *        }
44626		 *        else if ( min == "" && version < max ) {
44627		 *          return true;
44628		 *        }
44629		 *        else if ( min < version && "" == max ) {
44630		 *          return true;
44631		 *        }
44632		 *        else if ( min < version && version < max ) {
44633		 *          return true;
44634		 *        }
44635		 *        return false;
44636		 *      }
44637		 *    );
44638		 */
44639		search: [],
44640	
44641	
44642		/**
44643		 * Selector extensions
44644		 *
44645		 * The `selector` option can be used to extend the options available for the
44646		 * selector modifier options (`selector-modifier` object data type) that
44647		 * each of the three built in selector types offer (row, column and cell +
44648		 * their plural counterparts). For example the Select extension uses this
44649		 * mechanism to provide an option to select only rows, columns and cells
44650		 * that have been marked as selected by the end user (`{selected: true}`),
44651		 * which can be used in conjunction with the existing built in selector
44652		 * options.
44653		 *
44654		 * Each property is an array to which functions can be pushed. The functions
44655		 * take three attributes:
44656		 *
44657		 * * Settings object for the host table
44658		 * * Options object (`selector-modifier` object type)
44659		 * * Array of selected item indexes
44660		 *
44661		 * The return is an array of the resulting item indexes after the custom
44662		 * selector has been applied.
44663		 *
44664		 *  @type object
44665		 */
44666		selector: {
44667			cell: [],
44668			column: [],
44669			row: []
44670		},
44671	
44672	
44673		/**
44674		 * Internal functions, exposed for used in plug-ins.
44675		 * 
44676		 * Please note that you should not need to use the internal methods for
44677		 * anything other than a plug-in (and even then, try to avoid if possible).
44678		 * The internal function may change between releases.
44679		 *
44680		 *  @type object
44681		 *  @default {}
44682		 */
44683		internal: {},
44684	
44685	
44686		/**
44687		 * Legacy configuration options. Enable and disable legacy options that
44688		 * are available in DataTables.
44689		 *
44690		 *  @type object
44691		 */
44692		legacy: {
44693			/**
44694			 * Enable / disable DataTables 1.9 compatible server-side processing
44695			 * requests
44696			 *
44697			 *  @type boolean
44698			 *  @default null
44699			 */
44700			ajax: null
44701		},
44702	
44703	
44704		/**
44705		 * Pagination plug-in methods.
44706		 * 
44707		 * Each entry in this object is a function and defines which buttons should
44708		 * be shown by the pagination rendering method that is used for the table:
44709		 * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
44710		 * buttons are displayed in the document, while the functions here tell it
44711		 * what buttons to display. This is done by returning an array of button
44712		 * descriptions (what each button will do).
44713		 *
44714		 * Pagination types (the four built in options and any additional plug-in
44715		 * options defined here) can be used through the `paginationType`
44716		 * initialisation parameter.
44717		 *
44718		 * The functions defined take two parameters:
44719		 *
44720		 * 1. `{int} page` The current page index
44721		 * 2. `{int} pages` The number of pages in the table
44722		 *
44723		 * Each function is expected to return an array where each element of the
44724		 * array can be one of:
44725		 *
44726		 * * `first` - Jump to first page when activated
44727		 * * `last` - Jump to last page when activated
44728		 * * `previous` - Show previous page when activated
44729		 * * `next` - Show next page when activated
44730		 * * `{int}` - Show page of the index given
44731		 * * `{array}` - A nested array containing the above elements to add a
44732		 *   containing 'DIV' element (might be useful for styling).
44733		 *
44734		 * Note that DataTables v1.9- used this object slightly differently whereby
44735		 * an object with two functions would be defined for each plug-in. That
44736		 * ability is still supported by DataTables 1.10+ to provide backwards
44737		 * compatibility, but this option of use is now decremented and no longer
44738		 * documented in DataTables 1.10+.
44739		 *
44740		 *  @type object
44741		 *  @default {}
44742		 *
44743		 *  @example
44744		 *    // Show previous, next and current page buttons only
44745		 *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
44746		 *      return [ 'previous', page, 'next' ];
44747		 *    };
44748		 */
44749		pager: {},
44750	
44751	
44752		renderer: {
44753			pageButton: {},
44754			header: {}
44755		},
44756	
44757	
44758		/**
44759		 * Ordering plug-ins - custom data source
44760		 * 
44761		 * The extension options for ordering of data available here is complimentary
44762		 * to the default type based ordering that DataTables typically uses. It
44763		 * allows much greater control over the the data that is being used to
44764		 * order a column, but is necessarily therefore more complex.
44765		 * 
44766		 * This type of ordering is useful if you want to do ordering based on data
44767		 * live from the DOM (for example the contents of an 'input' element) rather
44768		 * than just the static string that DataTables knows of.
44769		 * 
44770		 * The way these plug-ins work is that you create an array of the values you
44771		 * wish to be ordering for the column in question and then return that
44772		 * array. The data in the array much be in the index order of the rows in
44773		 * the table (not the currently ordering order!). Which order data gathering
44774		 * function is run here depends on the `dt-init columns.orderDataType`
44775		 * parameter that is used for the column (if any).
44776		 *
44777		 * The functions defined take two parameters:
44778		 *
44779		 * 1. `{object}` DataTables settings object: see
44780		 *    {@link DataTable.models.oSettings}
44781		 * 2. `{int}` Target column index
44782		 *
44783		 * Each function is expected to return an array:
44784		 *
44785		 * * `{array}` Data for the column to be ordering upon
44786		 *
44787		 *  @type array
44788		 *
44789		 *  @example
44790		 *    // Ordering using `input` node values
44791		 *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )
44792		 *    {
44793		 *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
44794		 *        return $('input', td).val();
44795		 *      } );
44796		 *    }
44797		 */
44798		order: {},
44799	
44800	
44801		/**
44802		 * Type based plug-ins.
44803		 *
44804		 * Each column in DataTables has a type assigned to it, either by automatic
44805		 * detection or by direct assignment using the `type` option for the column.
44806		 * The type of a column will effect how it is ordering and search (plug-ins
44807		 * can also make use of the column type if required).
44808		 *
44809		 * @namespace
44810		 */
44811		type: {
44812			/**
44813			 * Type detection functions.
44814			 *
44815			 * The functions defined in this object are used to automatically detect
44816			 * a column's type, making initialisation of DataTables super easy, even
44817			 * when complex data is in the table.
44818			 *
44819			 * The functions defined take two parameters:
44820			 *
44821		     *  1. `{*}` Data from the column cell to be analysed
44822		     *  2. `{settings}` DataTables settings object. This can be used to
44823		     *     perform context specific type detection - for example detection
44824		     *     based on language settings such as using a comma for a decimal
44825		     *     place. Generally speaking the options from the settings will not
44826		     *     be required
44827			 *
44828			 * Each function is expected to return:
44829			 *
44830			 * * `{string|null}` Data type detected, or null if unknown (and thus
44831			 *   pass it on to the other type detection functions.
44832			 *
44833			 *  @type array
44834			 *
44835			 *  @example
44836			 *    // Currency type detection plug-in:
44837			 *    $.fn.dataTable.ext.type.detect.push(
44838			 *      function ( data, settings ) {
44839			 *        // Check the numeric part
44840			 *        if ( ! $.isNumeric( data.substring(1) ) ) {
44841			 *          return null;
44842			 *        }
44843			 *
44844			 *        // Check prefixed by currency
44845			 *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {
44846			 *          return 'currency';
44847			 *        }
44848			 *        return null;
44849			 *      }
44850			 *    );
44851			 */
44852			detect: [],
44853	
44854	
44855			/**
44856			 * Type based search formatting.
44857			 *
44858			 * The type based searching functions can be used to pre-format the
44859			 * data to be search on. For example, it can be used to strip HTML
44860			 * tags or to de-format telephone numbers for numeric only searching.
44861			 *
44862			 * Note that is a search is not defined for a column of a given type,
44863			 * no search formatting will be performed.
44864			 * 
44865			 * Pre-processing of searching data plug-ins - When you assign the sType
44866			 * for a column (or have it automatically detected for you by DataTables
44867			 * or a type detection plug-in), you will typically be using this for
44868			 * custom sorting, but it can also be used to provide custom searching
44869			 * by allowing you to pre-processing the data and returning the data in
44870			 * the format that should be searched upon. This is done by adding
44871			 * functions this object with a parameter name which matches the sType
44872			 * for that target column. This is the corollary of <i>afnSortData</i>
44873			 * for searching data.
44874			 *
44875			 * The functions defined take a single parameter:
44876			 *
44877		     *  1. `{*}` Data from the column cell to be prepared for searching
44878			 *
44879			 * Each function is expected to return:
44880			 *
44881			 * * `{string|null}` Formatted string that will be used for the searching.
44882			 *
44883			 *  @type object
44884			 *  @default {}
44885			 *
44886			 *  @example
44887			 *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
44888			 *      return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
44889			 *    }
44890			 */
44891			search: {},
44892	
44893	
44894			/**
44895			 * Type based ordering.
44896			 *
44897			 * The column type tells DataTables what ordering to apply to the table
44898			 * when a column is sorted upon. The order for each type that is defined,
44899			 * is defined by the functions available in this object.
44900			 *
44901			 * Each ordering option can be described by three properties added to
44902			 * this object:
44903			 *
44904			 * * `{type}-pre` - Pre-formatting function
44905			 * * `{type}-asc` - Ascending order function
44906			 * * `{type}-desc` - Descending order function
44907			 *
44908			 * All three can be used together, only `{type}-pre` or only
44909			 * `{type}-asc` and `{type}-desc` together. It is generally recommended
44910			 * that only `{type}-pre` is used, as this provides the optimal
44911			 * implementation in terms of speed, although the others are provided
44912			 * for compatibility with existing Javascript sort functions.
44913			 *
44914			 * `{type}-pre`: Functions defined take a single parameter:
44915			 *
44916		     *  1. `{*}` Data from the column cell to be prepared for ordering
44917			 *
44918			 * And return:
44919			 *
44920			 * * `{*}` Data to be sorted upon
44921			 *
44922			 * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
44923			 * functions, taking two parameters:
44924			 *
44925		     *  1. `{*}` Data to compare to the second parameter
44926		     *  2. `{*}` Data to compare to the first parameter
44927			 *
44928			 * And returning:
44929			 *
44930			 * * `{*}` Ordering match: <0 if first parameter should be sorted lower
44931			 *   than the second parameter, ===0 if the two parameters are equal and
44932			 *   >0 if the first parameter should be sorted height than the second
44933			 *   parameter.
44934			 * 
44935			 *  @type object
44936			 *  @default {}
44937			 *
44938			 *  @example
44939			 *    // Numeric ordering of formatted numbers with a pre-formatter
44940			 *    $.extend( $.fn.dataTable.ext.type.order, {
44941			 *      "string-pre": function(x) {
44942			 *        a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
44943			 *        return parseFloat( a );
44944			 *      }
44945			 *    } );
44946			 *
44947			 *  @example
44948			 *    // Case-sensitive string ordering, with no pre-formatting method
44949			 *    $.extend( $.fn.dataTable.ext.order, {
44950			 *      "string-case-asc": function(x,y) {
44951			 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
44952			 *      },
44953			 *      "string-case-desc": function(x,y) {
44954			 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
44955			 *      }
44956			 *    } );
44957			 */
44958			order: {}
44959		},
44960	
44961		/**
44962		 * Unique DataTables instance counter
44963		 *
44964		 * @type int
44965		 * @private
44966		 */
44967		_unique: 0,
44968	
44969	
44970		//
44971		// Depreciated
44972		// The following properties are retained for backwards compatiblity only.
44973		// The should not be used in new projects and will be removed in a future
44974		// version
44975		//
44976	
44977		/**
44978		 * Version check function.
44979		 *  @type function
44980		 *  @depreciated Since 1.10
44981		 */
44982		fnVersionCheck: DataTable.fnVersionCheck,
44983	
44984	
44985		/**
44986		 * Index for what 'this' index API functions should use
44987		 *  @type int
44988		 *  @deprecated Since v1.10
44989		 */
44990		iApiIndex: 0,
44991	
44992	
44993		/**
44994		 * jQuery UI class container
44995		 *  @type object
44996		 *  @deprecated Since v1.10
44997		 */
44998		oJUIClasses: {},
44999	
45000	
45001		/**
45002		 * Software version
45003		 *  @type string
45004		 *  @deprecated Since v1.10
45005		 */
45006		sVersion: DataTable.version
45007	};
45008	
45009	
45010	//
45011	// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
45012	//
45013	$.extend( _ext, {
45014		afnFiltering: _ext.search,
45015		aTypes:       _ext.type.detect,
45016		ofnSearch:    _ext.type.search,
45017		oSort:        _ext.type.order,
45018		afnSortData:  _ext.order,
45019		aoFeatures:   _ext.feature,
45020		oApi:         _ext.internal,
45021		oStdClasses:  _ext.classes,
45022		oPagination:  _ext.pager
45023	} );
45024	
45025	
45026	$.extend( DataTable.ext.classes, {
45027		"sTable": "dataTable",
45028		"sNoFooter": "no-footer",
45029	
45030		/* Paging buttons */
45031		"sPageButton": "paginate_button",
45032		"sPageButtonActive": "current",
45033		"sPageButtonDisabled": "disabled",
45034	
45035		/* Striping classes */
45036		"sStripeOdd": "odd",
45037		"sStripeEven": "even",
45038	
45039		/* Empty row */
45040		"sRowEmpty": "dataTables_empty",
45041	
45042		/* Features */
45043		"sWrapper": "dataTables_wrapper",
45044		"sFilter": "dataTables_filter",
45045		"sInfo": "dataTables_info",
45046		"sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
45047		"sLength": "dataTables_length",
45048		"sProcessing": "dataTables_processing",
45049	
45050		/* Sorting */
45051		"sSortAsc": "sorting_asc",
45052		"sSortDesc": "sorting_desc",
45053		"sSortable": "sorting", /* Sortable in both directions */
45054		"sSortableAsc": "sorting_asc_disabled",
45055		"sSortableDesc": "sorting_desc_disabled",
45056		"sSortableNone": "sorting_disabled",
45057		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
45058	
45059		/* Filtering */
45060		"sFilterInput": "",
45061	
45062		/* Page length */
45063		"sLengthSelect": "",
45064	
45065		/* Scrolling */
45066		"sScrollWrapper": "dataTables_scroll",
45067		"sScrollHead": "dataTables_scrollHead",
45068		"sScrollHeadInner": "dataTables_scrollHeadInner",
45069		"sScrollBody": "dataTables_scrollBody",
45070		"sScrollFoot": "dataTables_scrollFoot",
45071		"sScrollFootInner": "dataTables_scrollFootInner",
45072	
45073		/* Misc */
45074		"sHeaderTH": "",
45075		"sFooterTH": "",
45076	
45077		// Deprecated
45078		"sSortJUIAsc": "",
45079		"sSortJUIDesc": "",
45080		"sSortJUI": "",
45081		"sSortJUIAscAllowed": "",
45082		"sSortJUIDescAllowed": "",
45083		"sSortJUIWrapper": "",
45084		"sSortIcon": "",
45085		"sJUIHeader": "",
45086		"sJUIFooter": ""
45087	} );
45088	
45089	
45090	(function() {
45091	
45092	// Reused strings for better compression. Closure compiler appears to have a
45093	// weird edge case where it is trying to expand strings rather than use the
45094	// variable version. This results in about 200 bytes being added, for very
45095	// little preference benefit since it this run on script load only.
45096	var _empty = '';
45097	_empty = '';
45098	
45099	var _stateDefault = _empty + 'ui-state-default';
45100	var _sortIcon     = _empty + 'css_right ui-icon ui-icon-';
45101	var _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix';
45102	
45103	$.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, {
45104		/* Full numbers paging buttons */
45105		"sPageButton":         "fg-button ui-button "+_stateDefault,
45106		"sPageButtonActive":   "ui-state-disabled",
45107		"sPageButtonDisabled": "ui-state-disabled",
45108	
45109		/* Features */
45110		"sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
45111			"ui-buttonset-multi paging_", /* Note that the type is postfixed */
45112	
45113		/* Sorting */
45114		"sSortAsc":            _stateDefault+" sorting_asc",
45115		"sSortDesc":           _stateDefault+" sorting_desc",
45116		"sSortable":           _stateDefault+" sorting",
45117		"sSortableAsc":        _stateDefault+" sorting_asc_disabled",
45118		"sSortableDesc":       _stateDefault+" sorting_desc_disabled",
45119		"sSortableNone":       _stateDefault+" sorting_disabled",
45120		"sSortJUIAsc":         _sortIcon+"triangle-1-n",
45121		"sSortJUIDesc":        _sortIcon+"triangle-1-s",
45122		"sSortJUI":            _sortIcon+"carat-2-n-s",
45123		"sSortJUIAscAllowed":  _sortIcon+"carat-1-n",
45124		"sSortJUIDescAllowed": _sortIcon+"carat-1-s",
45125		"sSortJUIWrapper":     "DataTables_sort_wrapper",
45126		"sSortIcon":           "DataTables_sort_icon",
45127	
45128		/* Scrolling */
45129		"sScrollHead": "dataTables_scrollHead "+_stateDefault,
45130		"sScrollFoot": "dataTables_scrollFoot "+_stateDefault,
45131	
45132		/* Misc */
45133		"sHeaderTH":  _stateDefault,
45134		"sFooterTH":  _stateDefault,
45135		"sJUIHeader": _headerFooter+" ui-corner-tl ui-corner-tr",
45136		"sJUIFooter": _headerFooter+" ui-corner-bl ui-corner-br"
45137	} );
45138	
45139	}());
45140	
45141	
45142	
45143	var extPagination = DataTable.ext.pager;
45144	
45145	function _numbers ( page, pages ) {
45146		var
45147			numbers = [],
45148			buttons = extPagination.numbers_length,
45149			half = Math.floor( buttons / 2 ),
45150			i = 1;
45151	
45152		if ( pages <= buttons ) {
45153			numbers = _range( 0, pages );
45154		}
45155		else if ( page <= half ) {
45156			numbers = _range( 0, buttons-2 );
45157			numbers.push( 'ellipsis' );
45158			numbers.push( pages-1 );
45159		}
45160		else if ( page >= pages - 1 - half ) {
45161			numbers = _range( pages-(buttons-2), pages );
45162			numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
45163			numbers.splice( 0, 0, 0 );
45164		}
45165		else {
45166			numbers = _range( page-half+2, page+half-1 );
45167			numbers.push( 'ellipsis' );
45168			numbers.push( pages-1 );
45169			numbers.splice( 0, 0, 'ellipsis' );
45170			numbers.splice( 0, 0, 0 );
45171		}
45172	
45173		numbers.DT_el = 'span';
45174		return numbers;
45175	}
45176	
45177	
45178	$.extend( extPagination, {
45179		simple: function ( page, pages ) {
45180			return [ 'previous', 'next' ];
45181		},
45182	
45183		full: function ( page, pages ) {
45184			return [  'first', 'previous', 'next', 'last' ];
45185		},
45186	
45187		numbers: function ( page, pages ) {
45188			return [ _numbers(page, pages) ];
45189		},
45190	
45191		simple_numbers: function ( page, pages ) {
45192			return [ 'previous', _numbers(page, pages), 'next' ];
45193		},
45194	
45195		full_numbers: function ( page, pages ) {
45196			return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
45197		},
45198	
45199		// For testing and plug-ins to use
45200		_numbers: _numbers,
45201	
45202		// Number of number buttons (including ellipsis) to show. _Must be odd!_
45203		numbers_length: 7
45204	} );
45205	
45206	
45207	$.extend( true, DataTable.ext.renderer, {
45208		pageButton: {
45209			_: function ( settings, host, idx, buttons, page, pages ) {
45210				var classes = settings.oClasses;
45211				var lang = settings.oLanguage.oPaginate;
45212				var btnDisplay, btnClass, counter=0;
45213	
45214				var attach = function( container, buttons ) {
45215					var i, ien, node, button;
45216					var clickHandler = function ( e ) {
45217						_fnPageChange( settings, e.data.action, true );
45218					};
45219	
45220					for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
45221						button = buttons[i];
45222	
45223						if ( $.isArray( button ) ) {
45224							var inner = $( '<'+(button.DT_el || 'div')+'/>' )
45225								.appendTo( container );
45226							attach( inner, button );
45227						}
45228						else {
45229							btnDisplay = null;
45230							btnClass = '';
45231	
45232							switch ( button ) {
45233								case 'ellipsis':
45234									container.append('<span class="ellipsis">&#x2026;
45234</span>');
45235									break;
45236	
45237								case 'first':
45238									btnDisplay = lang.sFirst;
45239									btnClass = button + (page > 0 ?
45240										'' : ' '+classes.sPageButtonDisabled);
45241									break;
45242	
45243								case 'previous':
45244									btnDisplay = lang.sPrevious;
45245									btnClass = button + (page > 0 ?
45246										'' : ' '+classes.sPageButtonDisabled);
45247									break;
45248	
45249								case 'next':
45250									btnDisplay = lang.sNext;
45251									btnClass = button + (page < pages-1 ?
45252										'' : ' '+classes.sPageButtonDisabled);
45253									break;
45254	
45255								case 'last':
45256									btnDisplay = lang.sLast;
45257									btnClass = button + (page < pages-1 ?
45258										'' : ' '+classes.sPageButtonDisabled);
45259									break;
45260	
45261								default:
45262									btnDisplay = button + 1;
45263									btnClass = page === button ?
45264										classes.sPageButtonActive : '';
45265									break;
45266							}
45267	
45268							if ( btnDisplay !== null ) {
45269								node = $('<a>', {
45270										'class': classes.sPageButton+' '+btnClass,
45271										'aria-controls': settings.sTableId,
45272										'data-dt-idx': counter,
45273										'tabindex': settings.iTabIndex,
45274										'id': idx === 0 && typeof button === 'string' ?
45275											settings.sTableId +'_'+ button :
45276											null
45277									} )
45278									.html( btnDisplay )
45279									.appendTo( container );
45280	
45281								_fnBindAction(
45282									node, {action: button}, clickHandler
45283								);
45284	
45285								counter++;
45286							}
45287						}
45288					}
45289				};
45290	
45291				// IE9 throws an 'unknown error' if document.activeElement is used
45292				// inside an iframe or frame. Try / catch the error. Not good for
45293				// accessibility, but neither are frames.
45294				var activeEl;
45295	
45296				try {
45297					// Because this approach is destroying and recreating the paging
45298					// elements, focus is lost on the select button which is bad for
45299					// accessibility. So we want to restore focus once the draw has
45300					// completed
45301					activeEl = $(host).find(document.activeElement).data('dt-idx');
45302				}
45303				catch (e) {}
45304	
45305				attach( $(host).empty(), buttons );
45306	
45307				if ( activeEl ) {
45308					$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
45309				}
45310			}
45311		}
45312	} );
45313	
45314	
45315	
45316	// Built in type detection. See model.ext.aTypes for information about
45317	// what is required from this methods.
45318	$.extend( DataTable.ext.type.detect, [
45319		// Plain numbers - first since V8 detects some plain numbers as dates
45320		// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
45321		function ( d, settings )
45322		{
45323			var decimal = settings.oLanguage.sDecimal;
45324			return _isNumber( d, decimal ) ? 'num'+decimal : null;
45325		},
45326	
45327		// Dates (only those recognised by the browser's Date.parse)
45328		function ( d, settings )
45329		{
45330			// V8 will remove any unknown characters at the start and end of the
45331			// expression, leading to false matches such as `$245.12` or `10%` being
45332			// a valid date. See forum thread 18941 for detail.
45333			if ( d && !(d instanceof Date) && ( ! _re_date_start.test(d) || ! _re_date_end.test(d) ) ) {
45334				return null;
45335			}
45336			var parsed = Date.parse(d);
45337			return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
45338		},
45339	
45340		// Formatted numbers
45341		function ( d, settings )
45342		{
45343			var decimal = settings.oLanguage.sDecimal;
45344			return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
45345		},
45346	
45347		// HTML numeric
45348		function ( d, settings )
45349		{
45350			var decimal = settings.oLanguage.sDecimal;
45351			return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
45352		},
45353	
45354		// HTML numeric, formatted
45355		function ( d, settings )
45356		{
45357			var decimal = settings.oLanguage.sDecimal;
45358			return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
45359		},
45360	
45361		// HTML (this is strict checking - there must be html)
45362		function ( d, settings )
45363		{
45364			return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
45365				'html' : null;
45366		}
45367	] );
45368	
45369	
45370	
45371	// Filter formatting functions. See model.ext.ofnSearch for information about
45372	// what is required from these methods.
45373	// 
45374	// Note that additional search methods are added for the html numbers and
45375	// html formatted numbers by `_addNumericSort()` when we know what the decimal
45376	// place is
45377	
45378	
45379	$.extend( DataTable.ext.type.search, {
45380		html: function ( data ) {
45381			return _empty(data) ?
45382				data :
45383				typeof data === 'string' ?
45384					data
45385						.replace( _re_new_lines, " " )
45386						.replace( _re_html, "" ) :
45387					'';
45388		},
45389	
45390		string: function ( data ) {
45391			return _empty(data) ?
45392				data :
45393				typeof data === 'string' ?
45394					data.replace( _re_new_lines, " " ) :
45395					data;
45396		}
45397	} );
45398	
45399	
45400	
45401	var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
45402		if ( d !== 0 && (!d || d === '-') ) {
45403			return -Infinity;
45404		}
45405	
45406		// If a decimal place other than `.` is used, it needs to be given to the
45407		// function so we can detect it and replace with a `.` which is the only
45408		// decimal place Javascript recognises - it is not locale aware.
45409		if ( decimalPlace ) {
45410			d = _numToDecimal( d, decimalPlace );
45411		}
45412	
45413		if ( d.replace ) {
45414			if ( re1 ) {
45415				d = d.replace( re1, '' );
45416			}
45417	
45418			if ( re2 ) {
45419				d = d.replace( re2, '' );
45420			}
45421		}
45422	
45423		return d * 1;
45424	};
45425	
45426	
45427	// Add the numeric 'deformatting' functions for sorting and search. This is done
45428	// in a function to provide an easy ability for the language options to add
45429	// additional methods if a non-period decimal place is used.
45430	function _addNumericSort ( decimalPlace ) {
45431		$.each(
45432			{
45433				// Plain numbers
45434				"num": function ( d ) {
45435					return __numericReplace( d, decimalPlace );
45436				},
45437	
45438				// Formatted numbers
45439				"num-fmt": function ( d ) {
45440					return __numericReplace( d, decimalPlace, _re_formatted_numeric );
45441				},
45442	
45443				// HTML numeric
45444				"html-num": function ( d ) {
45445					return __numericReplace( d, decimalPlace, _re_html );
45446				},
45447	
45448				// HTML numeric, formatted
45449				"html-num-fmt": function ( d ) {
45450					return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
45451				}
45452			},
45453			function ( key, fn ) {
45454				// Add the ordering method
45455				_ext.type.order[ key+decimalPlace+'-pre' ] = fn;
45456	
45457				// For HTML types add a search formatter that will strip the HTML
45458				if ( key.match(/^html\-/) ) {
45459					_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
45460				}
45461			}
45462		);
45463	}
45464	
45465	
45466	// Default sort methods
45467	$.extend( _ext.type.order, {
45468		// Dates
45469		"date-pre": function ( d ) {
45470			return Date.parse( d ) || 0;
45471		},
45472	
45473		// html
45474		"html-pre": function ( a ) {
45475			return _empty(a) ?
45476				'' :
45477				a.replace ?
45478					a.replace( /<.*?>/g, "" ).toLowerCase() :
45479					a+'';
45480		},
45481	
45482		// string
45483		"string-pre": function ( a ) {
45484			// This is a little complex, but faster than always calling toString,
45485			// http://jsperf.com/tostring-v-check
45486			return _empty(a) ?
45487				'' :
45488				typeof a === 'string' ?
45489					a.toLowerCase() :
45490					! a.toString ?
45491						'' :
45492						a.toString();
45493		},
45494	
45495		// string-asc and -desc are retained only for compatibility with the old
45496		// sort methods
45497		"string-asc": function ( x, y ) {
45498			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
45499		},
45500	
45501		"string-desc": function ( x, y ) {
45502			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
45503		}
45504	} );
45505	
45506	
45507	// Numeric sorting types - order doesn't matter here
45508	_addNumericSort( '' );
45509	
45510	
45511	$.extend( true, DataTable.ext.renderer, {
45512		header: {
45513			_: function ( settings, cell, column, classes ) {
45514				// No additional mark-up required
45515				// Attach a sort listener to update on sort - note that using the
45516				// `DT` namespace will allow the event to be removed automatically
45517				// on destroy, while the `dt` namespaced event is the one we are
45518				// listening for
45519				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
45520					if ( settings !== ctx ) { // need to check this this is the host
45521						return;               // table, not a nested one
45522					}
45523	
45524					var colIdx = column.idx;
45525	
45526					cell
45527						.removeClass(
45528							column.sSortingClass +' '+
45529							classes.sSortAsc +' '+
45530							classes.sSortDesc
45531						)
45532						.addClass( columns[ colIdx ] == 'asc' ?
45533							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
45534								classes.sSortDesc :
45535								column.sSortingClass
45536						);
45537				} );
45538			},
45539	
45540			jqueryui: function ( settings, cell, column, classes ) {
45541				$('<div/>')
45542					.addClass( classes.sSortJUIWrapper )
45543					.append( cell.contents() )
45544					.append( $('<span/>')
45545						.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
45546					)
45547					.appendTo( cell );
45548	
45549				// Attach a sort listener to update on sort
45550				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
45551					if ( settings !== ctx ) {
45552						return;
45553					}
45554	
45555					var colIdx = column.idx;
45556	
45557					cell
45558						.removeClass( classes.sSortAsc +" "+classes.sSortDesc )
45559						.addClass( columns[ colIdx ] == 'asc' ?
45560							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
45561								classes.sSortDesc :
45562								column.sSortingClass
45563						);
45564	
45565					cell
45566						.find( 'span.'+classes.sSortIcon )
45567						.removeClass(
45568							classes.sSortJUIAsc +" "+
45569							classes.sSortJUIDesc +" "+
45570							classes.sSortJUI +" "+
45571							classes.sSortJUIAscAllowed +" "+
45572							classes.sSortJUIDescAllowed
45573						)
45574						.addClass( columns[ colIdx ] == 'asc' ?
45575							classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
45576								classes.sSortJUIDesc :
45577								column.sSortingClassJUI
45578						);
45579				} );
45580			}
45581		}
45582	} );
45583	
45584	/*
45585	 * Public helper functions. These aren't used internally by DataTables, or
45586	 * called by any of the options passed into DataTables, but they can be used
45587	 * externally by developers working with DataTables. They are helper functions
45588	 * to make working with DataTables a little bit easier.
45589	 */
45590	
45591	/**
45592	 * Helpers for `columns.render`.
45593	 *
45594	 * The options defined here can be used with the `columns.render` initialisation
45595	 * option to provide a display renderer. The following functions are defined:
45596	 *
45597	 * * `number` - Will format numeric data (defined by `columns.data`) for
45598	 *   display, retaining the original unformatted data for sorting and filtering.
45599	 *   It takes 5 parameters:
45600	 *   * `string` - Thousands grouping separator
45601	 *   * `string` - Decimal point indicator
45602	 *   * `integer` - Number of decimal points to show
45603	 *   * `string` (optional) - Prefix.
45604	 *   * `string` (optional) - Postfix (/suffix).
45605	 *
45606	 * @example
45607	 *   // Column definition using the number renderer
45608	 *   {
45609	 *     data: "salary",
45610	 *     render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
45611	 *   }
45612	 *
45613	 * @namespace
45614	 */
45615	DataTable.render = {
45616		number: function ( thousands, decimal, precision, prefix, postfix ) {
45617			return {
45618				display: function ( d ) {
45619					if ( typeof d !== 'number' && typeof d !== 'string' ) {
45620						return d;
45621					}
45622	
45623					var negative = d < 0 ? '-' : '';
45624					d = Math.abs( parseFloat( d ) );
45625	
45626					var intPart = parseInt( d, 10 );
45627					var floatPart = precision ?
45628						decimal+(d - intPart).toFixed( precision ).substring( 2 ):
45629						'';
45630	
45631					return negative + (prefix||'') +
45632						intPart.toString().replace(
45633							/\B(?=(\d{3})+(?!\d))/g, thousands
45634						) +
45635						floatPart +
45636						(postfix||'');
45637				}
45638			};
45639		}
45640	};
45641	
45642	
45643	/*
45644	 * This is really a good bit rubbish this method of exposing the internal methods
45645	 * publicly... - To be fixed in 2.0 using methods on the prototype
45646	 */
45647	
45648	
45649	/**
45650	 * Create a wrapper function for exporting an internal functions to an external API.
45651	 *  @param {string} fn API function name
45652	 *  @returns {function} wrapped function
45653	 *  @memberof DataTable#internal
45654	 */
45655	function _fnExternApiFunc (fn)
45656	{
45657		return function() {
45658			var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
45659				Array.prototype.slice.call(arguments)
45660			);
45661			return DataTable.ext.internal[fn].apply( this, args );
45662		};
45663	}
45664	
45665	
45666	/**
45667	 * Reference to internal functions for use by plug-in developers. Note that
45668	 * these methods are references to internal functions and are considered to be
45669	 * private. If you use these methods, be aware that they are liable to change
45670	 * between versions.
45671	 *  @namespace
45672	 */
45673	$.extend( DataTable.ext.internal, {
45674		_fnExternApiFunc: _fnExternApiFunc,
45675		_fnBuildAjax: _fnBuildAjax,
45676		_fnAjaxUpdate: _fnAjaxUpdate,
45677		_fnAjaxParameters: _fnAjaxParameters,
45678		_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
45679		_fnAjaxDataSrc: _fnAjaxDataSrc,
45680		_fnAddColumn: _fnAddColumn,
45681		_fnColumnOptions: _fnColumnOptions,
45682		_fnAdjustColumnSizing: _fnAdjustColumnSizing,
45683		_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
45684		_fnColumnIndexToVisible: _fnColumnIndexToVisible,
45685		_fnVisbleColumns: _fnVisbleColumns,
45686		_fnGetColumns: _fnGetColumns,
45687		_fnColumnTypes: _fnColumnTypes,
45688		_fnApplyColumnDefs: _fnApplyColumnDefs,
45689		_fnHungarianMap: _fnHungarianMap,
45690		_fnCamelToHungarian: _fnCamelToHungarian,
45691		_fnLanguageCompat: _fnLanguageCompat,
45692		_fnBrowserDetect: _fnBrowserDetect,
45693		_fnAddData: _fnAddData,
45694		_fnAddTr: _fnAddTr,
45695		_fnNodeToDataIndex: _fnNodeToDataIndex,
45696		_fnNodeToColumnIndex: _fnNodeToColumnIndex,
45697		_fnGetCellData: _fnGetCellData,
45698		_fnSetCellData: _fnSetCellData,
45699		_fnSplitObjNotation: _fnSplitObjNotation,
45700		_fnGetObjectDataFn: _fnGetObjectDataFn,
45701		_fnSetObjectDataFn: _fnSetObjectDataFn,
45702		_fnGetDataMaster: _fnGetDataMaster,
45703		_fnClearTable: _fnClearTable,
45704		_fnDeleteIndex: _fnDeleteIndex,
45705		_fnInvalidate: _fnInvalidate,
45706		_fnGetRowElements: _fnGetRowElements,
45707		_fnCreateTr: _fnCreateTr,
45708		_fnBuildHead: _fnBuildHead,
45709		_fnDrawHead: _fnDrawHead,
45710		_fnDraw: _fnDraw,
45711		_fnReDraw: _fnReDraw,
45712		_fnAddOptionsHtml: _fnAddOptionsHtml,
45713		_fnDetectHeader: _fnDetectHeader,
45714		_fnGetUniqueThs: _fnGetUniqueThs,
45715		_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
45716		_fnFilterComplete: _fnFilterComplete,
45717		_fnFilterCustom: _fnFilterCustom,
45718		_fnFilterColumn: _fnFilterColumn,
45719		_fnFilter: _fnFilter,
45720		_fnFilterCreateSearch: _fnFilterCreateSearch,
45721		_fnEscapeRegex: _fnEscapeRegex,
45722		_fnFilterData: _fnFilterData,
45723		_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
45724		_fnUpdateInfo: _fnUpdateInfo,
45725		_fnInfoMacros: _fnInfoMacros,
45726		_fnInitialise: _fnInitialise,
45727		_fnInitComplete: _fnInitComplete,
45728		_fnLengthChange: _fnLengthChange,
45729		_fnFeatureHtmlLength: _fnFeatureHtmlLength,
45730		_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
45731		_fnPageChange: _fnPageChange,
45732		_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
45733		_fnProcessingDisplay: _fnProcessingDisplay,
45734		_fnFeatureHtmlTable: _fnFeatureHtmlTable,
45735		_fnScrollDraw: _fnScrollDraw,
45736		_fnApplyToChildren: _fnApplyToChildren,
45737		_fnCalculateColumnWidths: _fnCalculateColumnWidths,
45738		_fnThrottle: _fnThrottle,
45739		_fnConvertToWidth: _fnConvertToWidth,
45740		_fnGetWidestNode: _fnGetWidestNode,
45741		_fnGetMaxLenString: _fnGetMaxLenString,
45742		_fnStringToCss: _fnStringToCss,
45743		_fnSortFlatten: _fnSortFlatten,
45744		_fnSort: _fnSort,
45745		_fnSortAria: _fnSortAria,
45746		_fnSortListener: _fnSortListener,
45747		_fnSortAttachListener: _fnSortAttachListener,
45748		_fnSortingClasses: _fnSortingClasses,
45749		_fnSortData: _fnSortData,
45750		_fnSaveState: _fnSaveState,
45751		_fnLoadState: _fnLoadState,
45752		_fnSettingsFromNode: _fnSettingsFromNode,
45753		_fnLog: _fnLog,
45754		_fnMap: _fnMap,
45755		_fnBindAction: _fnBindAction,
45756		_fnCallbackReg: _fnCallbackReg,
45757		_fnCallbackFire: _fnCallbackFire,
45758		_fnLengthOverflow: _fnLengthOverflow,
45759		_fnRenderer: _fnRenderer,
45760		_fnDataSource: _fnDataSource,
45761		_fnRowAttributes: _fnRowAttributes,
45762		_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
45763		                                // in 1.10, so this dead-end function is
45764		                                // added to prevent errors
45765	} );
45766	
45767
45768	// jQuery access
45769	$.fn.dataTable = DataTable;
45770
45771	// Legacy aliases
45772	$.fn.dataTableSettings = DataTable.settings;
45773	$.fn.dataTableExt = DataTable.ext;
45774
45775	// With a capital `D` we return a DataTables API instance rather than a
45776	// jQuery object
45777	$.fn.DataTable = function ( opts ) {
45778		return $(this).dataTable( opts ).api();
45779	};
45780
45781	// All properties that are available to $.fn.dataTable should also be
45782	// available on $.fn.DataTable
45783	$.each( DataTable, function ( prop, val ) {
45784		$.fn.DataTable[ prop ] = val;
45785	} );
45786
45787
45788	// Information about events fired by DataTables - for documentation.
45789	/**
45790	 * Draw event, fired whenever the table is redrawn on the page, at the same
45791	 * point as fnDrawCallback. This may be useful for binding events or
45792	 * performing calculations when the table is altered at all.
45793	 *  @name DataTable#draw.dt
45794	 *  @event
45795	 *  @param {event} e jQuery event object
45796	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45797	 */
45798
45799	/**
45800	 * Search event, fired when the searching applied to the table (using the
45801	 * built-in global search, or column filters) is altered.
45802	 *  @name DataTable#search.dt
45803	 *  @event
45804	 *  @param {event} e jQuery event object
45805	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45806	 */
45807
45808	/**
45809	 * Page change event, fired when the paging of the table is altered.
45810	 *  @name DataTable#page.dt
45811	 *  @event
45812	 *  @param {event} e jQuery event object
45813	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45814	 */
45815
45816	/**
45817	 * Order event, fired when the ordering applied to the table is altered.
45818	 *  @name DataTable#order.dt
45819	 *  @event
45820	 *  @param {event} e jQuery event object
45821	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45822	 */
45823
45824	/**
45825	 * DataTables initialisation complete event, fired when the table is fully
45826	 * drawn, including Ajax data loaded, if Ajax data is required.
45827	 *  @name DataTable#init.dt
45828	 *  @event
45829	 *  @param {event} e jQuery event object
45830	 *  @param {object} oSettings DataTables settings object
45831	 *  @param {object} json The JSON object request from the server - only
45832	 *    present if client-side Ajax sourced data is used</li></ol>
45833	 */
45834
45835	/**
45836	 * State save event, fired when the table has changed state a new state save
45837	 * is required. This event allows modification of the state saving object
45838	 * prior to actually doing the save, including addition or other state
45839	 * properties (for plug-ins) or modification of a DataTables core property.
45840	 *  @name DataTable#stateSaveParams.dt
45841	 *  @event
45842	 *  @param {event} e jQuery event object
45843	 *  @param {object} oSettings DataTables settings object
45844	 *  @param {object} json The state information to be saved
45845	 */
45846
45847	/**
45848	 * State load event, fired when the table is loading state from the stored
45849	 * data, but prior to the settings object being modified by the saved state
45850	 * - allowing modification of the saved state is required or loading of
45851	 * state for a plug-in.
45852	 *  @name DataTable#stateLoadParams.dt
45853	 *  @event
45854	 *  @param {event} e jQuery event object
45855	 *  @param {object} oSettings DataTables settings object
45856	 *  @param {object} json The saved state information
45857	 */
45858
45859	/**
45860	 * State loaded event, fired when state has been loaded from stored data and
45861	 * the settings object has been modified by the loaded data.
45862	 *  @name DataTable#stateLoaded.dt
45863	 *  @event
45864	 *  @param {event} e jQuery event object
45865	 *  @param {object} oSettings DataTables settings object
45866	 *  @param {object} json The saved state information
45867	 */
45868
45869	/**
45870	 * Processing event, fired when DataTables is doing some kind of processing
45871	 * (be it, order, searcg or anything else). It can be used to indicate to
45872	 * the end user that there is something happening, or that something has
45873	 * finished.
45874	 *  @name DataTable#processing.dt
45875	 *  @event
45876	 *  @param {event} e jQuery event object
45877	 *  @param {object} oSettings DataTables settings object
45878	 *  @param {boolean} bShow Flag for if DataTables is doing processing or not
45879	 */
45880
45881	/**
45882	 * Ajax (XHR) event, fired whenever an Ajax request is completed from a
45883	 * request to made to the server for new data. This event is called before
45884	 * DataTables processed the returned data, so it can also be used to pre-
45885	 * process the data returned from the server, if needed.
45886	 *
45887	 * Note that this trigger is called in `fnServerData`, if you override
45888	 * `fnServerData` and which to use this event, you need to trigger it in you
45889	 * success function.
45890	 *  @name DataTable#xhr.dt
45891	 *  @event
45892	 *  @param {event} e jQuery event object
45893	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45894	 *  @param {object} json JSON returned from the server
45895	 *
45896	 *  @example
45897	 *     // Use a custom property returned from the server in another DOM element
45898	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
45899	 *       $('#status').html( json.status );
45900	 *     } );
45901	 *
45902	 *  @example
45903	 *     // Pre-process the data returned from the server
45904	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
45905	 *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
45906	 *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
45907	 *       }
45908	 *       // Note no return - manipulate the data directly in the JSON object.
45909	 *     } );
45910	 */
45911
45912	/**
45913	 * Destroy event, fired when the DataTable is destroyed by calling fnDestroy
45914	 * or passing the bDestroy:true parameter in the initialisation object. This
45915	 * can be used to remove bound events, added DOM nodes, etc.
45916	 *  @name DataTable#destroy.dt
45917	 *  @event
45918	 *  @param {event} e jQuery event object
45919	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45920	 */
45921
45922	/**
45923	 * Page length change event, fired when number of records to show on each
45924	 * page (the length) is changed.
45925	 *  @name DataTable#length.dt
45926	 *  @event
45927	 *  @param {event} e jQuery event object
45928	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45929	 *  @param {integer} len New length
45930	 */
45931
45932	/**
45933	 * Column sizing has changed.
45934	 *  @name DataTable#column-sizing.dt
45935	 *  @event
45936	 *  @param {event} e jQuery event object
45937	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45938	 */
45939
45940	/**
45941	 * Column visibility has changed.
45942	 *  @name DataTable#column-visibility.dt
45943	 *  @event
45944	 *  @param {event} e jQuery event object
45945	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
45946	 *  @param {int} column Column index
45947	 *  @param {bool} vis `false` if column now hidden, or `true` if visible
45948	 */
45949
45950	return $.fn.dataTable;
45951}));
45952
45953}(window, document));
45954
45955
45956/*
45957custom changes:
459581) used original $.fn.dataTable for FixedColumns function (91, 92) and then restored the behavior (320), since our customization in datatable.ext.js breaks this code
45959*/
45960
45961/*! FixedColumns 3.3.3
45962 * �2010-2021 SpryMedia Ltd - datatables.net/license
45963 */
45964
45965/**
45966 * @summary     FixedColumns
45967 * @description Freeze columns in place on a scrolling DataTable
45968 * @version     3.3.3
45969 * @file        dataTables.fixedColumns.js
45970 * @author      SpryMedia Ltd (www.sprymedia.co.uk)
45971 * @contact     www.sprymedia.co.uk/contact
45972 * @copyright   Copyright 2010-2021 SpryMedia Ltd.
45973 *
45974 * This source file is free software, available under the following license:
45975 *   MIT license - http://datatables.net/license/mit
45976 *
45977 * This source file is distributed in the hope that it will be useful, but
45978 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
45979 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
45980 *
45981 * For details please refer to: http://www.datatables.net
45982 */
45983(function( factory ){
45984	if ( typeof define === 'function' && define.amd ) {
45985		// AMD
45986		define( ['jquery', 'datatables.net'], function ( $ ) {
45987			return factory( $, window, document );
45988		} );
45989	}
45990	else if ( typeof exports === 'object' ) {
45991		// CommonJS
45992		module.exports = function (root, $) {
45993			if ( ! root ) {
45994				root = window;
45995			}
45996
45997			if ( ! $ || ! $.fn.dataTable ) {
45998				$ = require('datatables.net')(root, $).$;
45999			}
46000
46001			return factory( $, root, root.document );
46002		};
46003	}
46004	else {
46005		// Browser
46006		factory( jQuery, window, document );
46007	}
46008}(function( $, window, document, undefined ) {
46009'use strict';
46010var DataTable = $.fn.dataTable;
46011var _firefoxScroll;
46012
46013/**
46014 * When making use of DataTables' x-axis scrolling feature, you may wish to
46015 * fix the left most column in place. This plug-in for DataTables provides
46016 * exactly this option (note for non-scrolling tables, please use the
46017 * FixedHeader plug-in, which can fix headers and footers). Key
46018 * features include:
46019 *
46020 * * Freezes the left or right most columns to the side of the table
46021 * * Option to freeze two or more columns
46022 * * Full integration with DataTables' scrolling options
46023 * * Speed - FixedColumns is fast in its operation
46024 *
46025 *  @class
46026 *  @constructor
46027 *  @global
46028 *  @param {object} dt DataTables instance. With DataTables 1.10 this can also
46029 *    be a jQuery collection, a jQuery selector, DataTables API instance or
46030 *    settings object.
46031 *  @param {object} [init={}] Configuration object for FixedColumns. Options are
46032 *    defined by {@link FixedColumns.defaults}
46033 *
46034 *  @requires jQuery 1.7+
46035 *  @requires DataTables 1.8.0+
46036 *
46037 *  @example
46038 *      var table = $('#example').dataTable( {
46039 *        "scrollX": "100%"
46040 *      } );
46041 *      new $.fn.dataTable.fixedColumns( table );
46042 */
46043var FixedColumns = function ( dt, init ) {
46044	var that = this;
46045
46046    var dataTableExt = $.fn.dataTable;
46047    $.fn.dataTable = DataTable;
46048
46049	/* Sanity check - you just know it will happen */
46050	if ( ! ( this instanceof FixedColumns ) ) {
46051		alert( "FixedColumns warning: FixedColumns must be initialised with the 'new' keyword." );
46052		return;
46053	}
46054
46055	if ( init === undefined || init === true ) {
46056		init = {};
46057	}
46058
46059	// Use the DataTables Hungarian notation mapping method, if it exists to
46060	// provide forwards compatibility for camel case variables
46061	var camelToHungarian = $.fn.dataTable.camelToHungarian;
46062	if ( camelToHungarian ) {
46063		camelToHungarian( FixedColumns.defaults, FixedColumns.defaults, true );
46064		camelToHungarian( FixedColumns.defaults, init );
46065	}
46066
46067	// v1.10 allows the settings object to be got form a number of sources
46068	var dtSettings = new $.fn.dataTable.Api( dt ).settings()[0];
46069
46070	/**
46071	 * Settings object which contains customisable information for FixedColumns instance
46072	 * @namespace
46073	 * @extends FixedColumns.defaults
46074	 * @private
46075	 */
46076	this.s = {
46077		/**
46078		 * DataTables settings objects
46079		 *  @type     object
46080		 *  @default  Obtained from DataTables instance
46081		 */
46082		"dt": dtSettings,
46083
46084		/**
46085		 * Number of columns in the DataTable - stored for quick access
46086		 *  @type     int
46087		 *  @default  Obtained from DataTables instance
46088		 */
46089		"iTableColumns": dtSettings.aoColumns.length,
46090
46091		/**
46092		 * Original outer widths of the columns as rendered by DataTables - used to calculate
46093		 * the FixedColumns grid bounding box
46094		 *  @type     array.<int>
46095		 *  @default  []
46096		 */
46097		"aiOuterWidths": [],
46098
46099		/**
46100		 * Original inner widths of the columns as rendered by DataTables - used to apply widths
46101		 * to the columns
46102		 *  @type     array.<int>
46103		 *  @default  []
46104		 */
46105		"aiInnerWidths": [],
46106
46107
46108		/**
46109		 * Is the document layout right-to-left
46110		 * @type boolean
46111		 */
46112		rtl: $(dtSettings.nTable).css('direction') === 'rtl'
46113	};
46114
46115
46116	/**
46117	 * DOM elements used by the class instance
46118	 * @namespace
46119	 * @private
46120	 *
46121	 */
46122	this.dom = {
46123		/**
46124		 * DataTables scrolling element
46125		 *  @type     node
46126		 *  @default  null
46127		 */
46128		"scroller": null,
46129
46130		/**
46131		 * DataTables header table
46132		 *  @type     node
46133		 *  @default  null
46134		 */
46135		"header": null,
46136
46137		/**
46138		 * DataTables body table
46139		 *  @type     node
46140		 *  @default  null
46141		 */
46142		"body": null,
46143
46144		/**
46145		 * DataTables footer table
46146		 *  @type     node
46147		 *  @default  null
46148		 */
46149		"footer": null,
46150
46151		/**
46152		 * Display grid elements
46153		 * @namespace
46154		 */
46155		"grid": {
46156			/**
46157			 * Grid wrapper. This is the container element for the 3x3 grid
46158			 *  @type     node
46159			 *  @default  null
46160			 */
46161			"wrapper": null,
46162
46163			/**
46164			 * DataTables scrolling element. This element is the DataTables
46165			 * component in the display grid (making up the main table - i.e.
46166			 * not the fixed columns).
46167			 *  @type     node
46168			 *  @default  null
46169			 */
46170			"dt": null,
46171
46172			/**
46173			 * Left fixed column grid components
46174			 * @namespace
46175			 */
46176			"left": {
46177				"wrapper": null,
46178				"head": null,
46179				"body": null,
46180				"foot": null
46181			},
46182
46183			/**
46184			 * Right fixed column grid components
46185			 * @namespace
46186			 */
46187			"right": {
46188				"wrapper": null,
46189				"head": null,
46190				"body": null,
46191				"foot": null
46192			}
46193		},
46194
46195		/**
46196		 * Cloned table nodes
46197		 * @namespace
46198		 */
46199		"clone": {
46200			/**
46201			 * Left column cloned table nodes
46202			 * @namespace
46203			 */
46204			"left": {
46205				/**
46206				 * Cloned header table
46207				 *  @type     node
46208				 *  @default  null
46209				 */
46210				"header": null,
46211
46212				/**
46213				 * Cloned body table
46214				 *  @type     node
46215				 *  @default  null
46216				 */
46217				"body": null,
46218
46219				/**
46220				 * Cloned footer table
46221				 *  @type     node
46222				 *  @default  null
46223				 */
46224				"footer": null
46225			},
46226
46227			/**
46228			 * Right column cloned table nodes
46229			 * @namespace
46230			 */
46231			"right": {
46232				/**
46233				 * Cloned header table
46234				 *  @type     node
46235				 *  @default  null
46236				 */
46237				"header": null,
46238
46239				/**
46240				 * Cloned body table
46241				 *  @type     node
46242				 *  @default  null
46243				 */
46244				"body": null,
46245
46246				/**
46247				 * Cloned footer table
46248				 *  @type     node
46249				 *  @default  null
46250				 */
46251				"footer": null
46252			}
46253		}
46254	};
46255
46256	if ( dtSettings._oFixedColumns ) {
46257		throw 'FixedColumns already initialised on this table';
46258	}
46259
46260	/* Attach the instance to the DataTables instance so it can be accessed easily */
46261	dtSettings._oFixedColumns = this;
46262
46263	/* Let's do it */
46264	if ( ! dtSettings._bInitComplete )
46265	{
46266		dtSettings.oApi._fnCallbackReg( dtSettings, 'aoInitComplete', function () {
46267			that._fnConstruct( init );
46268		}, 'FixedColumns' );
46269	}
46270	else
46271	{
46272		this._fnConstruct( init );
46273	}
46274
46275    $.fn.dataTable = dataTableExt;
46276};
46277
46278
46279
46280$.extend( FixedColumns.prototype , {
46281	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
46282	 * Public methods
46283	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
46284
46285	/**
46286	 * Update the fixed columns - including headers and footers. Note that FixedColumns will
46287	 * automatically update the display whenever the host DataTable redraws.
46288	 *  @returns {void}
46289	 *  @example
46290	 *      var table = $('#example').dataTable( {
46291	 *          "scrollX": "100%"
46292	 *      } );
46293	 *      var fc = new $.fn.dataTable.fixedColumns( table );
46294	 *
46295	 *      // at some later point when the table has been manipulated....
46296	 *      fc.fnUpdate();
46297	 */
46298	"fnUpdate": function ()
46299	{
46300		this._fnDraw( true );
46301	},
46302
46303
46304	/**
46305	 * Recalculate the resizes of the 3x3 grid that FixedColumns uses for display of the table.
46306	 * This is useful if you update the width of the table container. Note that FixedColumns will
46307	 * perform this function automatically when the window.resize event is fired.
46308	 *  @returns {void}
46309	 *  @example
46310	 *      var table = $('#example').dataTable( {
46311	 *          "scrollX": "100%"
46312	 *      } );
46313	 *      var fc = new $.fn.dataTable.fixedColumns( table );
46314	 *
46315	 *      // Resize the table container and then have FixedColumns adjust its layout....
46316	 *      $('#content').width( 1200 );
46317	 *      fc.fnRedrawLayout();
46318	 */
46319	"fnRedrawLayout": function ()
46320	{
46321		this._fnColCalc();
46322		this._fnGridLayout();
46323		this.fnUpdate();
46324	},
46325
46326
46327	/**
46328	 * Mark a row such that it's height should be recalculated when using 'semiauto' row
46329	 * height matching. This function will have no effect when 'none' or 'auto' row height
46330	 * matching is used.
46331	 *  @param   {Node} nTr TR element that should have it's height recalculated
46332	 *  @returns {void}
46333	 *  @example
46334	 *      var table = $('#example').dataTable( {
46335	 *          "scrollX": "100%"
46336	 *      } );
46337	 *      var fc = new $.fn.dataTable.fixedColumns( table );
46338	 *
46339	 *      // manipulate the table - mark the row as needing an update then update the table
46340	 *      // this allows the redraw performed by DataTables fnUpdate to re
46340calculate the row
46341	 *      // height
46342	 *      fc.fnRecalculateHeight();
46343	 *      table.fnUpdate( $('#example tbody tr:eq(0)')[0], ["insert date", 1, 2, 3 ... ]);
46344	 */
46345	"fnRecalculateHeight": function ( nTr )
46346	{
46347		delete nTr._DTTC_iHeight;
46348		nTr.style.height = 'auto';
46349	},
46350
46351
46352	/**
46353	 * Set the height of a given row - provides cross browser compatibility
46354	 *  @param   {Node} nTarget TR element that should have it's height recalculated
46355	 *  @param   {int} iHeight Height in pixels to set
46356	 *  @returns {void}
46357	 *  @example
46358	 *      var table = $('#example').dataTable( {
46359	 *          "scrollX": "100%"
46360	 *      } );
46361	 *      var fc = new $.fn.dataTable.fixedColumns( table );
46362	 *
46363	 *      // You may want to do this after manipulating a row in the fixed column
46364	 *      fc.fnSetRowHeight( $('#example tbody tr:eq(0)')[0], 50 );
46365	 */
46366	"fnSetRowHeight": function ( nTarget, iHeight )
46367	{
46368		nTarget.style.height = iHeight+"px";
46369	},
46370
46371
46372	/**
46373	 * Get data index information about a row or cell in the table body.
46374	 * This function is functionally identical to fnGetPosition in DataTables,
46375	 * taking the same parameter (TH, TD or TR node) and returning exactly the
46376	 * the same information (data index information). THe difference between
46377	 * the two is that this method takes into account the fixed columns in the
46378	 * table, so you can pass in nodes from the master table, or the cloned
46379	 * tables and get the index position for the data in the main table.
46380	 *  @param {node} node TR, TH or TD element to get the information about
46381	 *  @returns {int} If nNode is given as a TR, then a single index is 
46382	 *    returned, or if given as a cell, an array of [row index, column index
46383	 *    (visible), column index (all)] is given.
46384	 */
46385	"fnGetPosition": function ( node )
46386	{
46387		var idx;
46388		var inst = this.s.dt.oInstance;
46389
46390		if ( ! $(node).parents('.DTFC_Cloned').length )
46391		{
46392			// Not in a cloned table
46393			return inst.fnGetPosition( node );
46394		}
46395		else
46396		{
46397			// Its in the cloned table, so need to look up position
46398			if ( node.nodeName.toLowerCase() === 'tr' ) {
46399				idx = $(node).index();
46400				return inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] );
46401			}
46402			else
46403			{
46404				var colIdx = $(node).index();
46405				idx = $(node.parentNode).index();
46406				var row = inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] );
46407
46408				return [
46409					row,
46410					colIdx,
46411					inst.oApi._fnVisibleToColumnIndex( this.s.dt, colIdx )
46412				];
46413			}
46414		}
46415	},
46416
46417	fnToFixedNode: function ( rowIdx, colIdx )
46418	{
46419		var found;
46420
46421		if ( colIdx < this.s.iLeftColumns ) {
46422			found = $(this.dom.clone.left.body).find('[data-dt-row='+rowIdx+'][data-dt-column='+colIdx+']');
46423		}
46424		else if ( colIdx >= this.s.iRightColumns ) {
46425			found = $(this.dom.clone.right.body).find('[data-dt-row='+rowIdx+'][data-dt-column='+colIdx+']');
46426		}
46427
46428		if ( found && found.length ) {
46429			return found[0];
46430		}
46431
46432		// Fallback - non-fixed node
46433		var table = new $.fn.dataTable.Api(this.s.dt);
46434		return table.cell(rowIdx, colIdx).node();
46435	},
46436
46437
46438	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
46439	 * Private methods (they are of course public in JS, but recommended as private)
46440	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
46441
46442	/**
46443	 * Initialisation for FixedColumns
46444	 *  @param   {Object} oInit User settings for initialisation
46445	 *  @returns {void}
46446	 *  @private
46447	 */
46448	"_fnConstruct": function ( oInit )
46449	{
46450		var i, iLen, iWidth,
46451			that = this;
46452
46453		/* Sanity checking */
46454		if ( typeof this.s.dt.oInstance.fnVersionCheck != 'function' ||
46455		     this.s.dt.oInstance.fnVersionCheck( '1.8.0' ) !== true )
46456		{
46457			alert( "FixedColumns "+FixedColumns.VERSION+" required DataTables 1.8.0 or later. "+
46458				"Please upgrade your DataTables installation" );
46459			return;
46460		}
46461
46462		if ( this.s.dt.oScroll.sX === "" )
46463		{
46464			this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "FixedColumns is not needed (no "+
46465				"x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for "+
46466				"column fixing when scrolling is not enabled" );
46467			return;
46468		}
46469
46470		/* Apply the settings from the user / defaults */
46471		this.s = $.extend( true, this.s, FixedColumns.defaults, oInit );
46472
46473		/* Set up the DOM as we need it and cache nodes */
46474		var classes = this.s.dt.oClasses;
46475		this.dom.grid.dt = $(this.s.dt.nTable).parents('div.'+classes.sScrollWrapper)[0];
46476		this.dom.scroller = $('div.'+classes.sScrollBody, this.dom.grid.dt )[0];
46477
46478		/* Set up the DOM that we want for the fixed column layout grid */
46479		this._fnColCalc();
46480		this._fnGridSetup();
46481
46482		/* Event handlers */
46483		var mouseController;
46484		var mouseDown = false;
46485
46486		// When the mouse is down (drag scroll) the mouse controller cannot
46487		// change, as the browser keeps the original element as the scrolling one
46488		$(this.s.dt.nTableWrapper).on( 'mousedown.DTFC', function (e) {
46489			if ( e.button === 0 ) {
46490				mouseDown = true;
46491
46492				$(document).one( 'mouseup', function () {
46493					mouseDown = false;
46494				} );
46495			}
46496		} );
46497
46498		// When the body is scrolled - scroll the left and right columns
46499		$(this.dom.scroller)
46500			.on( 'mouseover.DTFC touchstart.DTFC', function () {
46501				if ( ! mouseDown ) {
46502					mouseController = 'main';
46503				}
46504			} )
46505			.on( 'scroll.DTFC', function (e) {
46506				if ( ! mouseController && e.originalEvent ) {
46507					mouseController = 'main';
46508				}
46509
46510				if ( mouseController === 'main' || mouseController === 'key' ) {
46511					if ( that.s.iLeftColumns > 0 ) {
46512						that.dom.grid.left.liner.scrollTop = that.dom.scroller.scrollTop;
46513					}
46514					if ( that.s.iRightColumns > 0 ) {
46515						that.dom.grid.right.liner.scrollTop = that.dom.scroller.scrollTop;
46516					}
46517				}
46518			} );
46519
46520		var wheelType = 'onwheel' in document.createElement('div') ?
46521			'wheel.DTFC' :
46522			'mousewheel.DTFC';
46523
46524		if ( that.s.iLeftColumns > 0 ) {
46525			// When scrolling the left column, scroll the body and right column
46526			$(that.dom.grid.left.liner)
46527				.on( 'mouseover.DTFC touchstart.DTFC', function () {
46528					if ( ! mouseDown && mouseController !== 'key' ) {
46529						mouseController = 'left';
46530					}
46531				} )
46532				.on( 'scroll.DTFC', function ( e ) {
46533					if ( ! mouseController && e.originalEvent ) {
46534						mouseController = 'left';
46535					}
46536
46537					if ( mouseController === 'left' ) {
46538						that.dom.scroller.scrollTop = that.dom.grid.left.liner.scrollTop;
46539						if ( that.s.iRightColumns > 0 ) {
46540							that.dom.grid.right.liner.scrollTop = that.dom.grid.left.liner.scrollTop;
46541						}
46542					}
46543				} )
46544				.on( wheelType, function(e) {
46545					mouseController = 'left';
46546
46547					// Pass horizontal scrolling through
46548					var xDelta = e.type === 'wheel' ?
46549						-e.originalEvent.deltaX :
46550						e.originalEvent.wheelDeltaX;
46551					that.dom.scroller.scrollLeft -= xDelta;
46552				} );
46553
46554			// Header will not trigger scroll on left column, but might on `main` (sorting)
46555			$(that.dom.grid.left.head).on( 'mouseover.DTFC touchstart.DTFC', function () {
46556				mouseController = 'main';
46557			});
46558		}
46559
46560		if ( that.s.iRightColumns > 0 ) {
46561			// When scrolling the right column, scroll the body and the left column
46562			$(that.dom.grid.right.liner)
46563				.on( 'mouseover.DTFC touchstart.DTFC', function () {
46564					if ( ! mouseDown && mouseController !== 'key' ) {
46565						mouseController = 'right';
46566					}
46567				} )
46568				.on( 'scroll.DTFC', function ( e ) {
46569					if ( ! mouseController && e.originalEvent ) {
46570						mouseController = 'right';
46571					}
46572
46573					if ( mouseController === 'right' ) {
46574						that.dom.scroller.scrollTop = that.dom.grid.right.liner.scrollTop;
46575						if ( that.s.iLeftColumns > 0 ) {
46576							that.dom.grid.left.liner.scrollTop = that.dom.grid.right.liner.scrollTop;
46577						}
46578					}
46579				} )
46580				.on( wheelType, function(e) {
46581					mouseController = 'right';
46582
46583					// Pass horizontal scrolling through
46584					var xDelta = e.type === 'wheel' ?
46585						-e.originalEvent.deltaX :
46586						e.originalEvent.wheelDeltaX;
46587					that.dom.scroller.scrollLeft -= xDelta;
46588				} );
46589
46590			$(that.dom.grid.right.head).on( 'mouseover.DTFC touchstart.DTFC', function () {
46591				mouseController = 'main';
46592			});
46593		}
46594
46595		$(window).on( 'resize.DTFC', function () {
46596			that._fnGridLayout.call( that );
46597		} );
46598
46599		var bFirstDraw = true;
46600		var jqTable = $(this.s.dt.nTable);
46601
46602		jqTable
46603			.on( 'draw.dt.DTFC', function () {
46604				that._fnColCalc();
46605				that._fnDraw.call( that, bFirstDraw );
46606				bFirstDraw = false;
46607			} )
46608			.on('key-focus.dt.DTFC', function () {
46609				// KeyTable navigation needs to be main focused
46610				mouseController = 'key';
46611			})
46612			.on( 'column-sizing.dt.DTFC', function () {
46613				that._fnColCalc();
46614				that._fnGridLayout( that );
46615			} )
46616			.on( 'column-visibility.dt.DTFC', function ( e, settings, column, vis, recalc ) {
46617				if ( recalc === undefined || recalc ) {
46618					that._fnColCalc();
46619					that._fnGridLayout( that );
46620					that._fnDraw( true );
46621				}
46622			} )
46623			.on( 'select.dt.DTFC deselect.dt.DTFC', function ( e, dt, type, indexes ) {
46624				if ( e.namespace === 'dt' ) {
46625					that._fnDraw( false );
46626				}
46627			} )
46628			.on( 'position.dts.dt.DTFC', function (e, tableTop) {
46629				// Sync up with Scroller
46630				if (that.dom.grid.left.body) {
46631					$(that.dom.grid.left.body).find('table').eq(0).css('top', tableTop);
46632				}
46633
46634				if (that.dom.grid.right.body) {
46635					$(that.dom.grid.right.body).find('table').eq(0).css('top', tableTop);
46636				}
46637			} )
46638			.on( 'destroy.dt.DTFC', function () {
46639				jqTable.off( '.DTFC' );
46640
46641				$(that.dom.scroller).off( '.DTFC' );
46642				$(window).off( '.DTFC' );
46643				$(that.s.dt.nTableWrapper).off( '.DTFC' );
46644
46645				$(that.dom.grid.left.liner).off( '.DTFC '+wheelType );
46646				$(that.dom.grid.left.wrapper).remove();
46647
46648				$(that.dom.grid.right.liner).off( '.DTFC '+wheelType );
46649				$(that.dom.grid.right.wrapper).remove();
46650			} );
46651
46652		/* Get things right to start with - note that due to adjusting the columns, there must be
46653		 * another redraw of the main table. It doesn't need to be a full redraw however.
46654		 */
46655		this._fnGridLayout();
46656		this.s.dt.oInstance.fnDraw(false);
46657	},
46658
46659
46660	/**
46661	 * Calculate the column widths for the grid layout
46662	 *  @returns {void}
46663	 *  @private
46664	 */
46665	"_fnColCalc": function ()
46666	{
46667		var that = this;
46668		var iLeftWidth = 0;
46669		var iRightWidth = 0;
46670
46671		this.s.aiInnerWidths = [];
46672		this.s.aiOuterWidths = [];
46673
46674		$.each( this.s.dt.aoColumns, function (i, col) {
46675			var th = $(col.nTh);
46676			var border;
46677
46678			if ( ! th.filter(':visible').length ) {
46679				that.s.aiInnerWidths.push( 0 );
46680				that.s.aiOuterWidths.push( 0 );
46681			}
46682			else
46683			{
46684				// Inner width is used to assign widths to cells
46685				// Outer width is used to calculate the container
46686				var iWidth = th.outerWidth();
46687
46688				// When working with the left most-cell, need to add on the
46689				// table's border to the outerWidth, since we need to take
46690				// account of it, but it isn't in any cell
46691				if ( that.s.aiOuterWidths.length === 0 ) {
46692					border = $(that.s.dt.nTable).css('border-left-width');
46693					iWidth += typeof border === 'string' && border.indexOf('px') === -1 ?
46694						1 :
46695						parseInt( border, 10 );
46696				}
46697
46698				// Likewise with the final column on the right
46699				if ( that.s.aiOuterWidths.length === that.s.dt.aoColumns.length-1 ) {
46700					border = $(that.s.dt.nTable).css('border-right-width');
46701					iWidth += typeof border === 'string' && border.indexOf('px') === -1 ?
46702						1 :
46703						parseInt( border, 10 );
46704				}
46705
46706				that.s.aiOuterWidths.push( iWidth );
46707				that.s.aiInnerWidths.push( th.width() );
46708
46709				if ( i < that.s.iLeftColumns )
46710				{
46711					iLeftWidth += iWidth;
46712				}
46713
46714				if ( that.s.iTableColumns-that.s.iRightColumns <= i )
46715				{
46716					iRightWidth += iWidth;
46717				}
46718			}
46719		} );
46720
46721		this.s.iLeftWidth = iLeftWidth;
46722		this.s.iRightWidth = iRightWidth;
46723	},
46724
46725
46726	/**
46727	 * Set up the DOM for the fixed column. The way the layout works is to create a 1x3 grid
46728	 * for the left column, the DataTable (for which we just reuse the scrolling element DataTable
46729	 * puts into the DOM) and the right column. In each of he two fixed column elements there is a
46730	 * grouping wrapper element and then a head, body and footer wrapper. In each of these we then
46731	 * place the cloned header, body or footer tables. This effectively gives as 3x3 grid structure.
46732	 *  @returns {void}
46733	 *  @private
46734	 */
46735	"_fnGridSetup": function ()
46736	{
46737		var that = this;
46738		var oOverflow = this._fnDTOverflow();
46739		var block;
46740
46741		this.dom.body = this.s.dt.nTable;
46742		this.dom.header = this.s.dt.nTHead.parentNode;
46743		this.dom.header.parentNode.parentNode.style.position = "relative";
46744
46745		var nSWrapper =
46746			$('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;">'+
46747				'<div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;" aria-hidden="true">'+
46748					'<div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+
46749					'<div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; height:0; overflow:hidden;">'+
46750						'<div class="DTFC_LeftBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+
46751					'</div>'+
46752					'<div class="DTFC_LeftFootWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+
46753				'</div>'+
46754				'<div class="DTFC_RightWrapper" style="position:absolute; top:0; right:0;" aria-hidden="true">'+
46755					'<div class="DTFC_RightHeadWrapper" style="position:relative; top:0; left:0;">'+
46756						'<div class="DTFC_RightHeadBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+
46757					'</div>'+
46758					'<div class="DTFC_RightBodyWrapper" style="position:relative; top:0; left:0; height:0; overflow:hidden;">'+
46759						'<div class="DTFC_RightBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+
46760					'</div>'+
46761					'<div class="DTFC_RightFootWrapper" style="position:relative; top:0; left:0;">'+
46762						'<div class="DTFC_RightFootBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+
46763					'</div>'+
46764				'</div>'+
46765			'</div>')[0];
46766		var nLeft = nSWrapper.childNodes[0];
46767		var nRight = nSWrapper.childNodes[1];
46768
46769		this.dom.grid.dt.parentNode.insertBefore( nSWrapper, this.dom.grid.dt );
46770		nSWrapper.appendChild( this.dom.grid.dt );
46771
46772		this.dom.grid.wrapper = nSWrapper;
46773
46774		if ( this.s.iLeftColumns > 0 )
46775		{
46776			this.dom.grid.left.wrapper = nLeft;
46777			this.dom.grid.left.head = nLeft.childNodes[0];
46778			this.dom.grid.left.body = nLeft.childNodes[1];
46779			this.dom.grid.left.liner = $('div.DTFC_LeftBodyLiner', nSWrapper)[0];
46780
46781			nSWrapper.appendChild( nLeft );
46782		}
46783
46784		if ( this.s.iRightColumns > 0 )
46785		{
46786			this.dom.grid.right.wrapper = nRight;
46787			this.dom.grid.right.head = nRight.childNodes[0];
46788			this.dom.grid.right.body = nRight.childNodes[1];
46789			this.dom.grid.right.liner = $('div.DTFC_RightBodyLiner', nSWrapper)[0];
46790
46791			nRight.style.right = oOverflow.bar+"px";
46792
46793			block = $('div.DTFC_RightHeadBlocker', nSWrapper)[0];
46794			block.style.width = oOverflow.bar+"px";
46795			block.style.right = -oOverflow.bar+"px";
46796			this.dom.grid.right.headBlock = block;
46797
46798			block = $('div.DTFC_RightFootBlocker', nSWrapper)[0];
46799			block.style.width = oOverflow.bar+"px";
46800			block.style.right = -oOverflow.bar+"px";
46801			this.dom.grid.right.footBlock = block;
46802
46803			nSWrapper.appendChild( nRight );
46804		}
46805
46806		if ( this.s.dt.nTFoot )
46807		{
46808			this.dom.footer = this.s.dt.nTFoot.parentNode;
46809			if ( this.s.iLeftColumns > 0 )
46810			{
46811				this.dom.grid.left.foot = nLeft.childNodes[2];
46812			}
46813			if ( this.s.iRightColumns > 0 )
46814			{
46815				this.dom.grid.right.foot = nRight.childNodes[2];
46816			}
46817		}
46818
46819		// RTL support - swap the position of the left and right columns (#48)
46820		if ( this.s.rtl ) {
46821			$('div.DTFC_RightHeadBlocker', nSWrapper).css( {
46822				left: -oOverflow.bar+'px',
46823				right: ''
46824			} );
46825		}
46826	},
46827
46828
46829	/**
46830	 * Style and position the grid used for the FixedColumns layout
46831	 *  @returns {void}
46832	 *  @private
46833	 */
46834	"_fnGridLayout": function ()
46835	{
46836		var that = this;
46837		var oGrid = this.dom.grid;
46838		var iWidth = $(oGrid.wrapper).width();
46839		var iBodyHeight = this.s.dt.nTable.parentNode.offsetHeight;
46840		var iFullHeight = this.s.dt.nTable.parentNode.parentNode.offsetHeight;
46841		var oOverflow = this._fnDTOverflow();
46842		var iLeftWidth = this.s.iLeftWidth;
46843		var iRightWidth = this.s.iRightWidth;
46844		var rtl = $(this.dom.body).css('direction') === 'rtl';
46845		var wrapper;
46846		var scrollbarAdjust = function ( node, width ) {
46847			if ( ! oOverflow.bar ) {
46848				// If there is no scrollbar (Macs) we need to hide the auto scrollbar
46849				node.style.width = (width+20)+"px";
46850				node.style.paddingRight = "20px";
46851				node.style.boxSizing = "border-box";
46852			}
46853			else if ( that._firefoxScrollError() ) {
46854				// See the above function for why this is required
46855				if ( $(node).height() > 34 ) {
46856					node.style.width = (width+oOverflow.bar)+"px";
46857				}
46858			}
46859			else {
46860				// Otherwise just overflow by the scrollbar
46861				node.style.width = (width+oOverflow.bar)+"px";
46862			}
46863		};
46864
46865		// When x scrolling - don't paint the fixed columns over the x scrollbar
46866		if ( oOverflow.x )
46867		{
46868			iBodyHeight -= oOverflow.bar;
46869		}
46870
46871		oGrid.wrapper.style.height = iFullHeight+"px";
46872
46873		if ( this.s.iLeftColumns > 0 )
46874		{
46875			wrapper = oGrid.left.wrapper;
46876			wrapper.style.width = iLeftWidth+'px';
46877			wrapper.style.height = '1px';
46878
46879			// Swap the position of the left and right columns for rtl (#48)
46880			// This is always up against the edge, scrollbar on the far side
46881			if ( rtl ) {
46882				wrapper.style.left = '';
46883				wrapper.style.right = 0;
46884			}
46885			else {
46886				wrapper.style.left = 0;
46887				wrapper.style.right = '';
46888			}
46889
46890			oGrid.left.body.style.height = iBodyHeight+"px";
46891			if ( oGrid.left.foot ) {
46892				oGrid.left.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; // shift footer for scrollbar
46893			}
46894
46895			scrollbarAdjust( oGrid.left.liner, iLeftWidth );
46896			oGrid.left.liner.style.height = iBodyHeight+"px";
46897			oGrid.left.liner.style.maxHeight = iBodyHeight+"px";
46898		}
46899
46900		if ( this.s.iRightColumns > 0 )
46901		{
46902			wrapper = oGrid.right.wrapper;
46903			wrapper.style.width = iRightWidth+'px';
46904			wrapper.style.height = '1px';
46905
46906			// Need to take account of the vertical scrollbar
46907			if ( this.s.rtl ) {
46908				wrapper.style.left = oOverflow.y ? oOverflow.bar+'px' : 0;
46909				wrapper.style.right = '';
46910			}
46911			else {
46912				wrapper.style.left = '';
46913				wrapper.style.right = oOverflow.y ? oOverflow.bar+'px' : 0;
46914			}
46915
46916			oGrid.right.body.style.height = iBodyHeight+"px";
46917			if ( oGrid.right.foot ) {
46918				oGrid.right.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px";
46919			}
46920
46921			scrollbarAdjust( oGrid.right.liner, iRightWidth );
46922			oGrid.right.liner.style.height = iBodyHeight+"px";
46923			oGrid.right.liner.style.maxHeight = iBodyHeight+"px";
46924
46925			oGrid.right.headBlock.style.display = oOverflow.y ? 'block' : 'none';
46926			oGrid.right.footBlock.style.display = oOverflow.y ? 'block' : 'none';
46927		}
46928	},
46929
46930
46931	/**
46932	 * Get information about the DataTable's scrolling state - specifically if the table is scrolling
46933	 * on either the x or y axis, and also the scrollbar width.
46934	 *  @returns {object} Information about the DataTables scrolling state with the properties:
46935	 *    'x', 'y' and 'bar'
46936	 *  @private
46937	 */
46938	"_fnDTOverflow": function ()
46939	{
46940		var nTable = this.s.dt.nTable;
46941		var nTableScrollBody = nTable.parentNode;
46942		var out = {
46943			"x": false,
46944			"y": false,
46945			"bar": this.s.dt.oScroll.iBarWidth
46946		};
46947
46948		if ( nTable.offsetWidth > nTableScrollBody.clientWidth )
46949		{
46950			out.x = true;
46951		}
46952
46953		if ( nTable.offsetHeight > nTableScrollBody.clientHeight )
46954		{
46955			out.y = true;
46956		}
46957
46958		return out;
46959	},
46960
46961
46962	/**
46963	 * Clone and position the fixed columns
46964	 *  @returns {void}
46965	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
46966	 *  @private
46967	 */
46968	"_fnDraw": function ( bAll )
46969	{
46970		this._fnGridLayout();
46971		this._fnCloneLeft( bAll );
46972		this._fnCloneRight( bAll );
46973
46974		$(this.dom.scroller).trigger('scroll');
46975
46976		/* Draw callback function */
46977		if ( this.s.fnDrawCallback !== null )
46978		{
46979			this.s.fnDrawCallback.call( this, this.dom.clone.left, this.dom.clone.right );
46980		}
46981
46982		/* Event triggering */
46983		$(this).trigger( 'draw.dtfc', {
46984			"leftClone": this.dom.clone.left,
46985			"rightClone": this.dom.clone.right
46986		} );
46987	},
46988
46989
46990	/**
46991	 * Clone the right columns
46992	 *  @returns {void}
46993	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
46994	 *  @private
46995	 */
46996	"_fnCloneRight": function ( bAll )
46997	{
46998		if ( this.s.iRightColumns <= 0 ) {
46999			return;
47000		}
47001
47002		var that = this,
47003			i, jq,
47004			aiColumns = [];
47005
47006		for ( i=this.s.iTableColumns-this.s.iRightColumns ; i<this.s.iTableColumns ; i++ ) {
47007			if ( this.s.dt.aoColumns[i].bVisible ) {
47008				aiColumns.push( i );
47009			}
47010		}
47011
47012		this._fnClone( this.dom.clone.right, this.dom.grid.right, aiColumns, bAll );
47013	},
47014
47015
47016	/**
47017	 * Clone the left columns
47018	 *  @returns {void}
47019	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
47020	 *  @private
47021	 */
47022	"_fnCloneLeft": function ( bAll )
47023	{
47024		if ( this.s.iLeftColumns <= 0 ) {
47025			return;
47026		}
47027
47028		var that = this,
47029			i, jq,
47030			aiColumns = [];
47031
47032		for ( i=0 ; i<this.s.iLeftColumns ; i++ ) {
47033			if ( this.s.dt.aoColumns[i].bVisible ) {
47034				aiColumns.push( i );
47035			}
47036		}
47037
47038		this._fnClone( this.dom.clone.left, this.dom.grid.left, aiColumns, bAll );
47039	},
47040
47041
47042	/**
47043	 * Make a copy of the layout object for a header or footer element from DataTables. Note that
47044	 * this method will clone the nodes in the layout object.
47045	 *  @returns {Array} Copy of the layout array
47046	 *  @param   {Object} aoOriginal Layout array from DataTables (aoHeader or aoFooter)
47047	 *  @param   {Object} aiColumns Columns to copy
47048	 *  @param   {boolean} events Copy cell events or not
47049	 *  @private
47050	 */
47051	"_fnCopyLayout": function ( aoOriginal, aiColumns, events )
47052	{
47053		var aReturn = [];
47054		var aClones = [];
47055		var aCloned = [];
47056
47057		for ( var i=0, iLen=aoOriginal.length ; i<iLen ; i++ )
47058		{
47059			var aRow = [];
47060			aRow.nTr = $(aoOriginal[i].nTr).clone(events, false)[0];
47061
47062			for ( var j=0, jLen=this.s.iTableColumns ; j<jLen ; j++ )
47063			{
47064				if ( $.inArray( j, aiColumns ) === -1 )
47065				{
47066					continue;
47067				}
47068
47069				var iCloned = $.inArray( aoOriginal[i][j].cell, aCloned );
47070				if ( iCloned === -1 )
47071				{
47072					var nClone = $(aoOriginal[i][j].cell).clone(events, false)[0];
47073					aClones.push( nClone );
47074					aCloned.push( aoOriginal[i][j].cell );
47075
47076					aRow.push( {
47077						"cell": nClone,
47078						"unique": aoOriginal[i][j].unique
47079					} );
47080				}
47081				else
47082				{
47083					aRow.push( {
47084						"cell": aClones[ iCloned ],
47085						"unique": aoOriginal[i][j].unique
47086					} );
47087				}
47088			}
47089
47090			aReturn.push( aRow );
47091		}
47092
47093		return aReturn;
47094	},
47095
47096
47097	/**
47098	 * Clone the DataTable nodes and place them in the DOM (sized correctly)
47099	 *  @returns {void}
47100	 *  @param   {Object} oClone Object containing the header, footer and body cloned DOM elements
47101	 *  @param   {Object} oGrid Grid object containing the display grid elements for the cloned
47102	 *                    column (left or right)
47103	 *  @param   {Array} aiColumns Column indexes which should be operated on from the DataTable
47104	 *  @param   {Boolean} bAll Indicate if the header and footer should be updated as well (true)
47105	 *  @private
47106	 */
47107	"_fnClone": function ( oClone, oGrid, aiColumns, bAll )
47108	{
47109		var that = this,
47110			i, iLen, j, jLen, jq, nTarget, iColumn, nClone, iIndex, aoCloneLayout,
47111			jqCloneThead, aoFixedHeader,
47112			dt = this.s.dt;
47113
47114		/*
47115		 * Header
47116		 */
47117		if ( bAll )
47118		{
47119			$(oClone.header).remove();
47120
47121			oClone.header = $(this.dom.header).clone(true, false)[0];
47122			oClone.header.className += " DTFC_Cloned";
47123			oClone.header.style.width = "100%";
47124			oGrid.head.appendChild( oClone.header );
47125
47126			/* Copy the DataTables layout cache for the header for our floating column */
47127			aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns, true );
47128			jqCloneThead = $('>thead', oClone.header);
47129			jqCloneThead.empty();
47130
47131			/* Add the created cloned TR elements to the table */
47132			for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
47133			{
47134				jqCloneThead[0].appendChild( aoCloneLayout[i].nTr );
47135			}
47136
47137			/* Use the handy _fnDrawHead function in DataTables to do the rowspan/colspan
47138			 * calculations for us
47139			 */
47140			dt.oApi._fnDrawHead( dt, aoCloneLayout, true );
47141		}
47142		else
47143		{
47144			/* To ensure that we copy cell classes exactly, regardless of colspan, multiple rows
47145			 * etc, we make a copy of the header from the DataTable again, but don't insert the
47146			 * cloned cells, just copy the classes across. To get the matching layout for the
47147			 * fixed component, we use the DataTables _fnDetectHeader method, allowing 1:1 mapping
47148			 */
47149			aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns, false );
47150			aoFixedHeader=[];
47151
47152			dt.oApi._fnDetectHeader( aoFixedHeader, $('>thead', oClone.header)[0] );
47153
47154			for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
47155			{
47156				for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ )
47157				{
47158					aoFixedHeader[i][j].cell.className = aoCloneLayout[i][j].cell.className;
47159
47160					// If jQuery UI theming is used we need to copy those elements as well
47161					$('span.DataTables_sort_icon', aoFixedHeader[i][j].cell).each( function () {
47162						this.className = $('span.DataTables_sort_icon', aoCloneLayout[i][j].cell)[0].className;
47163					} );
47164				}
47165			}
47166		}
47167		this._fnEqualiseHeights( 'thead', this.dom.header, oClone.header );
47168
47169		/*
47170		 * Body
47171		 */
47172		if ( this.s.sHeightMatch == 'auto' )
47173		{
47174			/* Remove any heights which have been applied already and let the browser figure it out */
47175			$('>tbody>tr', that.dom.body).css('height', 'auto');
47176		}
47177
47178		if ( oClone.body !== null )
47179		{
47180			$(oClone.body).remove();
47181			oClone.body = null;
47182		}
47183
47184		oClone.body = $(this.dom.body).clone(true)[0];
47185		oClone.body.className += " DTFC_Cloned";
47186		oClone.body.style.paddingBottom = dt.oScroll.iBarWidth+"px";
47187		oClone.body.style.marginBottom = (dt.oScroll.iBarWidth*2)+"px"; /* For IE */
47188		if ( oClone.body.getAttribute('id') !== null )
47189		{
47190			oClone.body.removeAttribute('id');
47191		}
47192
47193		$('>thead>tr', oClone.body).empty();
47194		$('>tfoot', oClone.body).remove();
47195
47196		var nBody = $('tbody', oClone.body)[0];
47197		$(nBody).empty();
47198		if ( dt.aiDisplay.length > 0 )
47199		{
47200			/* Copy the DataTables' header elements to force the column width in exactly the
47201			 * same way that DataTables does it - have the header element, apply the width and
47202			 * colapse it down
47203			 */
47204			var nInnerThead = $('>thead>tr', oClone.body)[0];
47205			for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ )
47206			{
47207				iColumn = aiColumns[iIndex];
47208
47209				nClone = $(dt.aoColumns[iColumn].nTh).clone(true)[0];
47210				nClone.innerHTML = "";
47211
47212				var oStyle = nClone.style;
47213				oStyle.paddingTop = "0";
47214				oStyle.paddingBottom = "0";
47215				oStyle.borderTopWidth = "0";
47216				oStyle.borderBottomWidth = "0";
47217				oStyle.height = 0;
47218				oStyle.width = that.s.aiInnerWidths[iColumn]+"px";
47219
47220				nInnerThead.appendChild( nClone );
47221			}
47222
47223			/* Add in the tbody elements, cloning form the master table */
47224			$('>tbody>tr', that.dom.body).each( function (z) {
47225				var i = that.s.dt.oFeatures.bServerSide===false ?
47226					that.s.dt.aiDisplay[ that.s.dt._iDisplayStart+z ] : z;
47227				var aTds = that.s.dt.aoData[ i ].anCells || $(this).children('td, th');
47228
47229				var n = this.cloneNode(false);
47230				n.removeAttribute('id');
47231				n.setAttribute( 'data-dt-row', i );
47232
47233				for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ )
47234				{
47235					iColumn = aiColumns[iIndex];
47236
47237					if ( aTds.length > 0 )
47238					{
47239						nClone = $( aTds[iColumn] ).clone(true, true)[0];
47240						nClone.removeAttribute( 'id' );
47241						nClone.setAttribute( 'data-dt-row', i );
47242						nClone.setAttribute( 'data-dt-column', iColumn );
47243						n.appendChild( nClone );
47244					}
47245				}
47246				nBody.appendChild( n );
47247			} );
47248		}
47249		else
47250		{
47251			$('>tbody>tr', that.dom.body).each( function (z) {
47252				nClone = this.cloneNode(true);
47253				nClone.className += ' DTFC_NoData';
47254				$('td', nClone).html('');
47255				nBody.appendChild( nClone );
47256			} );
47257		}
47258
47259		oClone.body.style.width = "100%";
47260		oClone.body.style.margin = "0";
47261		oClone.body.style.padding = "0";
47262
47263		// Interop with Scroller - need to use a height forcing element in the
47264		// scrolling area in the same way that Scroller does in the body scroll.
47265		if ( dt.oScroller !== undefined )
47266		{
47267			var scrollerForcer = dt.oScroller.dom.force;
47268
47269			if ( ! oGrid.forcer ) {
47270				oGrid.forcer = scrollerForcer.cloneNode( true );
47271				oGrid.liner.appendChild( oGrid.forcer );
47272			}
47273			else {
47274				oGrid.forcer.style.height = scrollerForcer.style.height;
47275			}
47276		}
47277
47278		oGrid.liner.appendChild( oClone.body );
47279
47280		this._fnEqualiseHeights( 'tbody', that.dom.body, oClone.body );
47281
47282		/*
47283		 * Footer
47284		 */
47285		if ( dt.nTFoot !== null )
47286		{
47287			if ( bAll )
47288			{
47289				if ( oClone.footer !== null )
47290				{
47291					oClone.footer.parentNode.removeChild( oClone.footer );
47292				}
47293				oClone.footer = $(this.dom.footer).clone(true, true)[0];
47294				oClone.footer.className += " DTFC_Cloned";
47295				oClone.footer.style.width = "100%";
47296				oGrid.foot.appendChild( oClone.footer );
47297
47298				/* Copy the footer just like we do for the header */
47299				aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns, true );
47300				var jqCloneTfoot = $('>tfoot', oClone.footer);
47301				jqCloneTfoot.empty();
47302
47303				for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
47304				{
47305					jqCloneTfoot[0].appendChild( aoCloneLayout[i].nTr );
47306				}
47307				dt.oApi._fnDrawHead( dt, aoCloneLayout, true );
47308			}
47309			else
47310			{
47311				aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns, false );
47312				var aoCurrFooter=[];
47313
47314				dt.oApi._fnDetectHeader( aoCurrFooter, $('>tfoot', oClone.footer)[0] );
47315
47316				for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
47317				{
47318					for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ )
47319					{
47320						aoCurrFooter[i][j].cell.className = aoCloneLayout[i][j].cell.className;
47321					}
47322				}
47323			}
47324			this._fnEqualiseHeights( 'tfoot', this.dom.footer, oClone.footer );
47325		}
47326
47327		/* Equalise the column widths between the header footer and body - body get's priority */
47328		var anUnique = dt.oApi._fnGetUniqueThs( dt, $('>thead', oClone.header)[0] );
47329		$(anUnique).each( function (i) {
47330			iColumn = aiColumns[i];
47331			this.style.width = that.s.aiInnerWidths[iColumn]+"px";
47332		} );
47333
47334		if ( that.s.dt.nTFoot !== null )
47335		{
47336			anUnique = dt.oApi._fnGetUniqueThs( dt, $('>tfoot', oClone.footer)[0] );
47337			$(anUnique).each( function (i) {
47338				iColumn = aiColumns[i];
47339				this.style.width = that.s.aiInnerWidths[iColumn]+"px";
47340			} );
47341		}
47342	},
47343
47344
47345	/**
47346	 * From a given table node (THEAD etc), get a list of TR direct child elements
47347	 *  @param   {Node} nIn Table element to search for TR elements (THEAD, TBODY or TFOOT element)
47348	 *  @returns {Array} List of TR elements found
47349	 *  @private
47350	 */
47351	"_fnGetTrNodes": function ( nIn )
47352	{
47353		var aOut = [];
47354		for ( var i=0, iLen=nIn.childNodes.length ; i<iLen ; i++ )
47355		{
47356			if ( nIn.childNodes[i].nodeName.toUpperCase() == "TR" )
47357			{
47358				aOut.push( nIn.childNodes[i] );
47359			}
47360		}
47361		return aOut;
47362	},
47363
47364
47365	/**
47366	 * Equalise the heights of the rows in a given table node in a cross browser way
47367	 *  @returns {void}
47368	 *  @param   {String} nodeName Node type - thead, tbody or tfoot
47369	 *  @param   {Node} original Original node to take the heights from
47370	 *  @param   {Node} clone Copy the heights to
47371	 *  @private
47372	 */
47373	"_fnEqualiseHeights": function ( nodeName, original, clone )
47374	{
47375		if ( this.s.sHeightMatch == 'none' && nodeName !== 'thead' && nodeName !== 'tfoot' )
47376		{
47377			return;
47378		}
47379
47380		var that = this,
47381			i, iLen, iHeight, iHeight2, iHeightOriginal, iHeightClone,
47382			rootOriginal = original.getElementsByTagName(nodeName)[0],
47383			rootClone    = clone.getElementsByTagName(nodeName)[0],
47384			jqBoxHack    = $('>'+nodeName+'>tr:eq(0)', original).children(':first'),
47385			iBoxHack     = jqBoxHack.outerHeight() - jqBoxHack.height(),
47386			anOriginal   = this._fnGetTrNodes( rootOriginal ),
47387			anClone      = this._fnGetTrNodes( rootClone ),
47388			heights      = [];
47389
47390		for ( i=0, iLen=anClone.length ; i<iLen ; i++ )
47391		{
47392			iHeightOriginal = anOriginal[i].offsetHeight;
47393			iHeightClone = anClone[i].offsetHeight;
47394			iHeight = iHeightClone > iHeightOriginal ? iHeightClone : iHeightOriginal;
47395
47396			if ( this.s.sHeightMatch == 'semiauto' )
47397			{
47398				anOriginal[i]._DTTC_iHeight = iHeight;
47399			}
47400
47401			heights.push( iHeight );
47402		}
47403
47404		for ( i=0, iLen=anClone.length ; i<iLen ; i++ )
47405		{
47406			anClone[i].style.height = heights[i]+"px";
47407			anOriginal[i].style.height = heights[i]+"px";
47408		}
47409	},
47410
47411	/**
47412	 * Determine if the UA suffers from Firefox's overflow:scroll scrollbars
47413	 * not being shown bug.
47414	 *
47415	 * Firefox doesn't draw scrollbars, even if it is told to using
47416	 * overflow:scroll, if the div is less than 34px height. See bugs 292284 and
47417	 * 781885. Using UA detection here since this is particularly hard to detect
47418	 * using objects - its a straight up rendering error in Firefox.
47419	 *
47420	 * @return {boolean} True if Firefox error is present, false otherwise
47421	 */
47422	_firefoxScrollError: function () {
47423		if ( _firefoxScroll === undefined ) {
47424			var test = $('<div/>')
47425				.css( {
47426					position: 'absolute',
47427					top: 0,
47428					left: 0,
47429					height: 10,
47430					width: 50,
47431					overflow: 'scroll'
47432				} )
47433				.appendTo( 'body' );
47434
47435			// Make sure this doesn't apply on Macs with 0 width scrollbars
47436			_firefoxScroll = (
47437				test[0].clientWidth === test[0].offsetWidth && this._fnDTOverflow().bar !== 0
47438			);
47439
47440			test.remove();
47441		}
47442
47443		return _firefoxScroll;
47444	}
47445} );
47446
47447
47448
47449/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
47450 * Statics
47451 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
47452
47453/**
47454 * FixedColumns default settings for initialisation
47455 *  @name FixedColumns.defaults
47456 *  @namespace
47457 *  @static
47458 */
47459FixedColumns.defaults = /** @lends FixedColumns.defaults */{
47460	/**
47461	 * Number of left hand columns to fix in position
47462	 *  @type     int
47463	 *  @default  1
47464	 *  @static
47465	 *  @example
47466	 *      var  = $('#example').dataTable( {
47467	 *          "scrollX": "100%"
47468	 *      } );
47469	 *      new $.fn.dataTable.fixedColumns( table, {
47470	 *          "leftColumns": 2
47471	 *      } );
47472	 */
47473	"iLeftColumns": 1,
47474
47475	/**
47476	 * Number of right hand columns to fix in position
47477	 *  @type     int
47478	 *  @default  0
47479	 *  @static
47480	 *  @example
47481	 *      var table = $('#example').dataTable( {
47482	 *          "scrollX": "100%"
47483	 *      } );
47484	 *      new $.fn.dataTable.fixedColumns( table, {
47485	 *          "rightColumns": 1
47486	 *      } );
47487	 */
47488	"iRightColumns": 0,
47489
47490	/**
47491	 * Draw callback function which is called when FixedColumns has redrawn the fixed assets
47492	 *  @type     function(object, object):void
47493	 *  @default  null
47494	 *  @static
47495	 *  @example
47496	 *      var table = $('#example').dataTable( {
47497	 *          "scrollX": "100%"
47498	 *      } );
47499	 *      new $.fn.dataTable.fixedColumns( table, {
47500	 *          "drawCallback": function () {
47501	 *	            alert( "FixedColumns redraw" );
47502	 *	        }
47503	 *      } );
47504	 */
47505	"fnDrawCallback": null,
47506
47507	/**
47508	 * Height matching algorthim to use. This can be "none" which will result in no height
47509	 * matching being applied by FixedColumns (height matching could be forced by CSS in this
47510	 * case), "semiauto" whereby the height calculation will be performed once, and the result
47511	 * cached to be used again (fnRecalculateHeight can be used to force recalculation), or
47512	 * "auto" when height matching is performed on every draw (slowest but must accurate)
47513	 *  @type     string
47514	 *  @default  semiauto
47515	 *  @static
47516	 *  @example
47517	 *      var table = $('#example').dataTable( {
47518	 *          "scrollX": "100%"
47519	 *      } );
47520	 *      new $.fn.dataTable.fixedColumns( table, {
47521	 *          "heightMatch": "auto"
47522	 *      } );
47523	 */
47524	"sHeightMatch": "semiauto"
47525};
47526
47527
47528
47529
47530/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
47531 * Constants
47532 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
47533
47534/**
47535 * FixedColumns version
47536 *  @name      FixedColumns.version
47537 *  @type      String
47538 *  @default   See code
47539 *  @static
47540 */
47541FixedColumns.version = "3.3.3";
47542
47543
47544
47545/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
47546 * DataTables API integration
47547 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
47548
47549DataTable.Api.register( 'fixedColumns()', function () {
47550	return this;
47551} );
47552
47553DataTable.Api.register( 'fixedColumns().update()', function () {
47554	return this.iterator( 'table', function ( ctx ) {
47555		if ( ctx._oFixedColumns ) {
47556			ctx._oFixedColumns.fnUpdate();
47557		}
47558	} );
47559} );
47560
47561DataTable.Api.register( 'fixedColumns().relayout()', function () {
47562	return this.iterator( 'table', function ( ctx ) {
47563		if ( ctx._oFixedColumns ) {
47564			ctx._oFixedColumns.fnRedrawLayout();
47565		}
47566	} );
47567} );
47568
47569DataTable.Api.register( 'rows().recalcHeight()', function () {
47570	return this.iterator( 'row', function ( ctx, idx ) {
47571		if ( ctx._oFixedColumns ) {
47572			ctx._oFixedColumns.fnRecalculateHeight( this.row(idx).node() );
47573		}
47574	} );
47575} );
47576
47577DataTable.Api.register( 'fixedColumns().rowIndex()', function ( row ) {
47578	row = $(row);
47579
47580	return row.parents('.DTFC_Cloned').length ?
47581		this.rows( { page: 'current' } ).indexes()[ row.index() ] :
47582		this.row( row ).index();
47583} );
47584
47585DataTable.Api.register( 'fixedColumns().cellIndex()', function ( cell ) {
47586	cell = $(cell);
47587
47588	if ( cell.parents('.DTFC_Cloned').length ) {
47589		var rowClonedIdx = cell.parent().index();
47590		var rowIdx = this.rows( { page: 'current' } ).indexes()[ rowClonedIdx ];
47591		var columnIdx;
47592
47593		if ( cell.parents('.DTFC_LeftWrapper').length ) {
47594			columnIdx = cell.index();
47595		}
47596		else {
47597			var columns = this.columns().flatten().length;
47598			columnIdx = columns - this.context[0]._oFixedColumns.s.iRightColumns + cell.index();
47599		}
47600
47601		return {
47602			row: rowIdx,
47603			column: this.column.index( 'toData', columnIdx ),
47604			columnVisible: columnIdx
47605		};
47606	}
47607	else {
47608		return this.cell( cell ).index();
47609	}
47610} );
47611
47612DataTable.Api.registerPlural( 'cells().fixedNodes()', 'cell().fixedNode()', function () {
47613	return this.iterator( 'cell', function ( settings, row, column ) {
47614		return settings._oFixedColumns
47615			? settings._oFixedColumns.fnToFixedNode( row, column )
47616			: this.cell(row, column).node();
47617	}, 1 );
47618} );
47619
47620
47621
47622
47623/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
47624 * Initialisation
47625 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
47626
47627// Attach a listener to the document which listens for DataTables initialisation
47628// events so we can automatically initialise
47629$(document).on( 'init.dt.fixedColumns', function (e, settings) {
47630	if ( e.namespace !== 'dt' ) {
47631		return;
47632	}
47633
47634	var init = settings.oInit.fixedColumns;
47635	var defaults = DataTable.defaults.fixedColumns;
47636
47637	if ( init || defaults ) {
47638		var opts = $.extend( {}, init, defaults );
47639
47640		if ( init !== false ) {
47641			new FixedColumns( settings, opts );
47642		}
47643	}
47644} );
47645
47646
47647
47648// Make FixedColumns accessible from the DataTables instance
47649$.fn.dataTable.FixedColumns = FixedColumns;
47650$.fn.DataTable.FixedColumns = FixedColumns;
47651
47652return FixedColumns;
47653}));
47654/*
47655* File:        jquery.dataTables.columnFilter.js
47656* Version:     1.0.0
47657* Author:      Jovan Popovic 
47658* 
47659* Copyright 2011 Jovan Popovic, all rights reserved.
47660*
47661* This source file is free software, under either the GPL v2 license or a
47662* BSD style license, as supplied with this software.
47663* 
47664* This source file is distributed in the hope that it will be useful, but 
47665* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
47666* or FITNESS FOR A PARTICULAR PURPOSE. 
47667* 
47668* Parameters:"
47669* @sPlaceHolder                 String      Place where inline filtering function should be placed ("tfoot", "thead:before", "thead:after"). Default is "tfoot"
47670* @sRangeSeparator              String      Separator that will be used when range values are sent to the server-side. Default value is "~".
47671* @sRangeFormat                 string      Default format of the From ... to ... range inputs. Default is From {from} to {to}
47672* @aoColumns                    Array       Array of the filter settings that will be applied on the columns
47673*/
47674(function ($) {
47675
47676    var asInitVals, i, label, th;
47677
47678    var sTableId = "table";
47679    var sRangeFormat = "From {from} to {to}";
47680    //Array of the functions that will override sSearch_ parameters
47681    var afnSearch_ = new Array();
47682    var aiCustomSearch_Indexes = new Array();
47683
47684    var oFunctionTimeout = null;
47685
47686
47687    function fnCreateInput(regex, smart, bIsNumber) {
47688        var sCSSClass = "text_filter";
47689        if (bIsNumber)
47690            sCSSClass = "number_filter";
47691        var input = $('<input type="text" class="search_init ' + sCSSClass + '" value="' + label + '"/>');
47692        th.html(input);
47693        if (bIsNumber)
47694            th.wrapInner('<span class="filter_column filter_number" />');
47695        else
47696            th.wrapInner('<span class="filter_column filter_text" />');
47697        asInitVals[i] = label;
47698        var index = i;
47699
47700        if (bIsNumber && !oTable.fnSettings().oFeatures.bServerSide) {
47701            input.keyup(function () {
47702                /* Filter on the column all numbers that starts with the entered value */
47703                oTable.fnFilter('^' + this.value, index, true, false);
47704            });
47705        } else {
47706            input.keyup(function () {
47707                /* Filter on the column (the index) of this element */
47708                oTable.fnFilter(this.value, index, regex, smart);
47709            });
47710        }
47711
47712        input.focus(function () {
47713            if ($(this).hasClass("search_init")) {
47714                $(this).removeClass("search_init");
47715                this.value = "";
47716            }
47717        });
47718        input.blur(function () {
47719            if (this.value == "") {
47720                $(this).addClass("search_init");
47721                this.value = asInitVals[index];
47722            }
47723        });
47724    }
47725
47726    function fnCreateRangeInput() {
47727
47728        th.html(_fnRangeLabelPart(0));
47729        var sFromId = sTableId + 'range_from_' + i;
47730        var from = $('<input type="text" class="number_range_filter" id="' + sFromId + '" rel="' + i + '"/>');
47731        th.append(from);
47732        th.append(_fnRangeLabelPart(1));
47733        var sToId = sTableId + 'range_to_' + i;
47734        var to = $('<input type="text" class="number_range_filter" id="' + sToId + '" rel="' + i + '"/>');
47735        th.append(to);
47736        th.append(_fnRangeLabelPart(2));
47737        th.wrapInner('<span class="filterColumn filter_number_range" />');
47738        var index = i;
47739        aiCustomSearch_Indexes.push(i);
47740
47741
47742
47743        //------------start range filtering function
47744
47745
47746        /* 	Custom filtering function which will filter data in column four between two values
47747        *	Author: 	Allan Jardine, Modified by Jovan Popovic
47748        */
47749        $.fn.dataTableExt.afnFiltering.push(
47750	        function (oSettings, aData, iDataIndex) {
47751	            var iMin = document.getElementById(sFromId).value * 1;
47752	            var iMax = document.getElementById(sToId).value * 1;
47753	            var iValue = aData[index] == "-" ? 0 : aData[index] * 1;
47754	            if (iMin == "" && iMax == "") {
47755	                return true;
47756	            }
47757	            else if (iMin == "" && iValue < iMax) {
47758	                return true;
47759	            }
47760	            else if (iMin < iValue && "" == iMax) {
47761	                return true;
47762	            }
47763	            else if (iMin < iValue && iValue < iMax) {
47764	                return true;
47765	            }
47766	            return false;
47767	        }
47768        );
47769        //------------end range filtering function
47770
47771
47772
47773        $('#' + sFromId + ',#' + sToId, th).keyup(function () {
47774
47775            var iMin = document.getElementById(sFromId).value * 1;
47776            var iMax = document.getElementById(sToId).value * 1;
47777            if (iMin != 0 && iMax != 0 && iMin > iMax)
47778                return;
47779
47780            oTable.fnDraw();
47781
47782        });
47783
47784
47785    }
47786
47787
47788    function fnCreateDateRangeInput() {
47789
47790        th.html(_fnRangeLabelPart(0));
47791        var sFromId = sTableId + 'range_from_' + i;
47792        var from = $('<input type="text" class="date_range_filter" id="' + sFromId + '" rel="' + i + '"/>');
47793        from.datepicker();
47794        th.append(from);
47795        th.append(_fnRangeLabelPart(1));
47796        var sToId = sTableId + 'range_to_' + i;
47797        var to = $('<input type="text" class="date_range_filter" id="' + sToId + '" rel="' + i + '"/>');
47798        th.append(to);
47799        th.append(_fnRangeLabelPart(2));
47800        th.wrapInner('<span class="filterColumn filter_date_range" />');
47801        to.datepicker();
47802        var index = i;
47803        aiCustomSearch_Indexes.push(i);
47804
47805
47806        //------------start date range filtering function
47807
47808        $.fn.dataTableExt.afnFiltering.push(
47809	        function (oSettings, aData, iDataIndex) {
47810	            var dStartDate = from.datepicker("getDate");
47811
47812	            var dEndDate = to.datepicker("getDate");
47813
47814	            var dCellDate = $.datepicker.parseDate($.datepicker.regional[""].dateFormat, aData[index]);
47815
47816	            if (dCellDate == null)
47817	                return false;
47818
47819	            if (dStartDate == null && dEndDate == null) {
47820	                return true;
47821	            }
47822	            else if (dStartDate == null && dCellDate < dEndDate) {
47823	                return true;
47824	            }
47825	            else if (dStartDate < dCellDate && dEndDate == null) {
47826	                return true;
47827	            }
47828	            else if (dStartDate < dCellDate && dCellDate < dEndDate) {
47829	                return true;
47830	            }
47831	            return false;
47832	        }
47833        );
47834        //------------end date range filtering function
47835
47836        $('#' + sFromId + ',#' + sToId, th).change(function () {
47837            oTable.fnDraw();
47838        });
47839    }
47840
47841    function fnCreateSelect(aData, selectedValue, bSmart, valueDelimiterInSmartMode, dontUseDefaultValue) {
47842        var index = i;
47843        var select = $('<select class="search_init select_filter">' + 
47844                (dontUseDefaultValue ? '' : '<option value="" class="search_init">' + label + '</option>') + 
47845                '</select>'), j, iLen = aData.length;
47846
47847        for (j = 0; j < iLen; j++)
47848        {
47849            var item = aData[j];
47850            var isStringItem = typeof item === "string";
47851            var itemValue = isStringItem ? item : item.value;
47852
47853            var selectedHtml = itemValue == selectedValue ? 'selected' : '';
47854            var option = $('<option ' + selectedHtml + ' id="filterOption' + j + '">' + itemValue + '</option>').appendTo(select);
47855            var filterValue = htmlDecode(isStringItem ? item : item.key.toString());
47856
47857            if (bSmart)
47858            {
47859                if (!isStringItem)
47860                {
47861                    // Use item key value instead of spaces in column filter values when bSmart mode is turned on, 
47862                    // because there are issues with incorrect filtering of values which have similar words which are separated by spaces.
47863                    // E.g. we have values "column filter" and "pretty column filter". If we filter data by "column filter", "pretty column filter" won't be filtered out.
47864                    filterValue = filterValue.replace(/ /g, item.key);
47865                }
47866
47867                filterValue = filterValue.replace(/[\u00E9\u00C8\u00C4\(\)]/g, " ");
47868
47869                option.data("filterValue", filterValue);
47870            }
47871            else
47872                option.data("filterValue", '^' + filterValue.escapeRegExpSpecialCharacters() + '$');
47873        }
47874        th.html(select);
47875        th.wrapInner('<span class="filterColumn filter_select" />');
47876        select.change(function () 
47877        {
47878            if ($(this).val() != "") 
47879                $(this).removeClass("search_init");
47880            else 
47881                $(this).addClass("search_init");
47882            
47883            var data = $(this).find(":selected").data("filterValue") || "";
47884            data = _.unescape(data);
47885
47886            if (bSmart && data.length)
47887            {
47888                var escapedValue = data.escapeRegExpSpecialCharacters();
47889
47890                if (!!valueDelimiterInSmartMode)
47891                {
47892                    var escapedDelimiter = valueDelimiterInSmartMode.escapeRegExpSpecialCharacters();
47893                    data = escapedDelimiter + escapedValue + escapedDelimiter;
47894                }
47895                else
47896                    data = escapedValue;
47897            }
47898
47899            oTable.fnFilter(data, index, true, bSmart);
47900        });
47901
47902        select.change();
47903    }
47904
47905    function _fnRangeLabelPart(iPlace){
47906        switch(iPlace){
47907        case 0:
47908            return sRangeFormat.substring(0, sRangeFormat.indexOf("{from}"));
47909        case 1:
47910            return sRangeFormat.substring(sRangeFormat.indexOf("{from}") + 6, sRangeFormat.indexOf("{to}"));
47911        default:
47912            return sRangeFormat.substring(sRangeFormat.indexOf("{to}") + 4);
47913	}
47914    }
47915
47916
47917    $.fn.columnFilter = function (options) {
47918
47919        oTable = this;
47920
47921        var defaults = {
47922            sPlaceHolder: "foot",
47923            sRangeSeparator: "~",
47924            iFilteringDelay: 500,
47925            aoColumns: null,
47926            sRangeFormat: "From {from} to {to}"
47927
47928        };
47929
47930        properties = $.extend(defaults, options);
47931
47932        return this.each(function () {
47933
47934            asInitVals = new Array();
47935            var sFilterRow = "tfoot tr";
47936            if (properties.sPlaceHolder == "head:after") {
47937                sFilterRow = "thead tr:last";
47938            } else if (properties.sPlaceHolder == "head:before") {
47939                var tr = $("thead tr:last").detach();
47940                tr.prependTo("thead");
47941                sFilterRow = "thead tr:first";
47942            }
47943
47944            $(sFilterRow + " th", oTable).each(function (index) {
47945                i = index;
47946                var aoColumn = { type: "text",
47947                    bRegex: false,
47948                    bSmart: true
47949                };
47950                if (properties.aoColumns != null) {
47951                    if (properties.aoColumns.length < i || properties.aoColumns[i] == null)
47952                        return;
47953                    aoColumn = properties.aoColumns[i];
47954                }
47955                label = $(this).text(); //"Search by " + $(this).text();
47956                th = $($(this)[0]);
47957                if (aoColumn != null)
47958                {
47959                    if (aoColumn.sRangeFormat != null)
47960                        sRangeFormat = aoColumn.sRangeFormat;
47961                    else
47962                        sRangeFormat = properties.sRangeFormat;
47963                    switch (aoColumn.type) {
47964                        case "number":
47965                            fnCreateInput(true, false, true);
47966                            break;
47967                        case "text":
47968                            bRegex = (aoColumn.bRegex == null ? false : aoColumn.bRegex);
47969                            bSmart = (aoColumn.bSmart == null ? false : aoColumn.bSmart);
47970                            fnCreateInput(bRegex, bSmart, false);
47971                            break;
47972                        case "select":
47973                            bSmart = (aoColumn.bSmart == null ? false : aoColumn.bSmart);
47974                            fnCreateSelect(aoColumn.values, aoColumn.selected, bSmart, aoColumn.valueDelimiterInSmartMode, aoColumn.dontUseDefaultValue);
47975                            break;
47976                        case "number-range":
47977                            fnCreateRangeInput();
47978                            break;
47979                        case "date-range":
47980                            fnCreateDateRangeInput();
47981
47982                            break;
47983                        default:
47984                            break;
47985
47986                    }
47987                }
47988            });
47989
47990            for (j = 0; j < aiCustomSearch_Indexes.length; j++) {
47991                var index = aiCustomSearch_Indexes[j];
47992                var fnSearch_ = function () {
47993                    return $("#range_from_" + index).val() + properties.sRangeSeparator + $("#range_to_" + index).val()
47994                }
47995                afnSearch_.push(fnSearch_);
47996            }
47997        });
47998
47999    };
48000})(jQuery);
48001
48002
48003(function ($)
48004{
48005    /*
48006    * Function: fnGetColumnData
48007    * Purpose:  Return an array of table values from a particular column.
48008    * Returns:  array string: 1d data array
48009    * Inputs:   object:oSettings - dataTable settings object. This is always the last argument past to the function
48010    *           int:iColumn - the id of the column to extract the data from
48011    *           bool:bUnique - optional - if set to false duplicated values are not filtered out
48012    *           bool:bFiltered - optional - if set to false all the table data is used (not only the filtered)
48013    *           bool:bIgnoreEmpty - optional - if set to false empty values are not filtered from the result array
48014    * Author:   Benedikt Forchhammer <b.forchhammer /AT\ mind2.de>
48015    */
48016    $.fn.dataTableExt.oApi.fnGetColumnData = function (oSettings, iColumn, bUnique, bFiltered, bIgnoreEmpty)
48017    {
48018        // check that we have a column id
48019        if (typeof iColumn == "undefined") return new Array();
48020
48021        // by default we only wany unique data
48022        if (typeof bUnique == "undefined") bUnique = true;
48023
48024        // by default we do want to only look at filtered data
48025        if (typeof bFiltered == "undefined") bFiltered = true;
48026
48027        // by default we do not wany to include empty values
48028        if (typeof bIgnoreEmpty == "undefined") bIgnoreEmpty = true;
48029
48030        // list of rows which we're going to loop through
48031        var aiRows;
48032
48033        // use only filtered rows
48034        if (bFiltered == true) aiRows = oSettings.aiDisplay;
48035        // use all rows
48036        else aiRows = oSettings.aiDisplayMaster; // all row numbers
48037
48038        // set up data array   
48039        var asResultData = new Array();
48040
48041        for (var i = 0, c = aiRows.length; i < c; i++)
48042        {
48043            iRow = aiRows[i];
48044            var aData = this.fnGetData(iRow);
48045            var sValue = aData[iColumn];
48046
48047            // ignore empty values?
48048            if (bIgnoreEmpty == true && sValue.length == 0) continue;
48049
48050            // ignore unique values?
48051            else if (bUnique == true && jQuery.inArray(sValue, asResultData) > -1) continue;
48052
48053            // else push the value onto the result data array
48054            else asResultData.push(sValue);
48055        }
48056
48057        return asResultData;
48058    }
48059
48060} (jQuery));
48061
48062/*! ColReorder 1.3.0
48063 * ©2010-2015 SpryMedia Ltd - datatables.net/license
48064 */
48065
48066/**
48067 * @summary     ColReorder
48068 * @description Provide the ability to reorder columns in a DataTable
48069 * @version     1.3.0
48070 * @file        dataTables.colReorder.js
48071 * @author      SpryMedia Ltd (www.sprymedia.co.uk)
48072 * @contact     www.sprymedia.co.uk/contact
48073 * @copyright   Copyright 2010-2014 SpryMedia Ltd.
48074 *
48075 * This source file is free software, available under the following license:
48076 *   MIT license - http://datatables.net/license/mit
48077 *
48078 * This source file is distributed in the hope that it will be useful, but
48079 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
48080 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
48081 *
48082 * For details please refer to: http://www.datatables.net
48083 */
48084(function( factory ){
48085	if ( typeof define === 'function' && define.amd ) {
48086		// AMD
48087		define( ['jquery', 'datatables.net'], function ( $ ) {
48088			return factory( $, window, document );
48089		} );
48090	}
48091	else if ( typeof exports === 'object' ) {
48092		// CommonJS
48093		module.exports = function (root, $) {
48094			if ( ! root ) {
48095				root = window;
48096			}
48097
48098			if ( ! $ || ! $.fn.dataTable ) {
48099				$ = require('datatables.net')(root, $).$;
48100			}
48101
48102			return factory( $, root, root.document );
48103		};
48104	}
48105	else {
48106		// Browser
48107		factory( jQuery, window, document );
48108	}
48109}(function( $, window, document, undefined ) {
48110'use strict';
48111var DataTable = $.fn.dataTable;
48112
48113
48114/**
48115 * Switch the key value pairing of an index array to be value key (i.e. the old value is now the
48116 * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ].
48117 *  @method  fnInvertKeyValues
48118 *  @param   array aIn Array to switch around
48119 *  @returns array
48120 */
48121function fnInvertKeyValues( aIn )
48122{
48123	var aRet=[];
48124	for ( var i=0, iLen=aIn.length ; i<iLen ; i++ )
48125	{
48126		aRet[ aIn[i] ] = i;
48127	}
48128	return aRet;
48129}
48130
48131
48132/**
48133 * Modify an array by switching the position of two elements
48134 *  @method  fnArraySwitch
48135 *  @param   array aArray Array to consider, will be modified by reference (i.e. no return)
48136 *  @param   int iFrom From point
48137 *  @param   int iTo Insert point
48138 *  @returns void
48139 */
48140function fnArraySwitch( aArray, iFrom, iTo )
48141{
48142	var mStore = aArray.splice( iFrom, 1 )[0];
48143	aArray.splice( iTo, 0, mStore );
48144}
48145
48146
48147/**
48148 * Switch the positions of nodes in a parent node (note this is specifically designed for
48149 * table rows). Note this function considers all element nodes under the parent!
48150 *  @method  fnDomSwitch
48151 *  @param   string sTag Tag to consider
48152 *  @param   int iFrom Element to move
48153 *  @param   int Point to element the element to (before this point), can be null for append
48154 *  @returns void
48155 */
48156function fnDomSwitch( nParent, iFrom, iTo )
48157{
48158	var anTags = [];
48159	for ( var i=0, iLen=nParent.childNodes.length ; i<iLen ; i++ )
48160	{
48161		if ( nParent.childNodes[i].nodeType == 1 )
48162		{
48163			anTags.push( nParent.childNodes[i] );
48164		}
48165	}
48166	var nStore = anTags[ iFrom ];
48167
48168	if ( iTo !== null )
48169	{
48170		nParent.insertBefore( nStore, anTags[iTo] );
48171	}
48172	else
48173	{
48174		nParent.appendChild( nStore );
48175	}
48176}
48177
48178
48179/**
48180 * Plug-in for DataTables which will reorder the internal column structure by taking the column
48181 * from one position (iFrom) and insert it into a given point (iTo).
48182 *  @method  $.fn.dataTableExt.oApi.fnColReorder
48183 *  @param   object oSettings DataTables settings object - automatically added by DataTables!
48184 *  @param   int iFrom Take the column to be repositioned from this point
48185 *  @param   int iTo and insert it into this point
48186 *  @param   bool drop Indicate if the reorder is the final one (i.e. a drop)
48187 *    not a live reorder
48188 *  @returns void
48189 */
48190$.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo, drop )
48191{
48192	var i, iLen, j, jLen, iCols=oSettings.aoColumns.length, nTrs, oCol;
48193	var attrMap = function ( obj, prop, mapping ) {
48194		if ( ! obj[ prop ] || typeof obj[ prop ] === 'function' ) {
48195			return;
48196		}
48197
48198		var a = obj[ prop ].split('.');
48199		var num = a.shift();
48200
48201		if ( isNaN( num*1 ) ) {
48202			return;
48203		}
48204
48205		obj[ prop ] = mapping[ num*1 ]+'.'+a.join('.');
48206	};
48207
48208	/* Sanity check in the input */
48209	if ( iFrom == iTo )
48210	{
48211		/* Pointless reorder */
48212		return;
48213	}
48214
48215	if ( iFrom < 0 || iFrom >= iCols )
48216	{
48217		this.oApi._fnLog( oSettings, 1, "ColReorder 'from' index is out of bounds: "+iFrom );
48218		return;
48219	}
48220
48221	if ( iTo < 0 || iTo >= iCols )
48222	{
48223		this.oApi._fnLog( oSettings, 1, "ColReorder 'to' index is out of bounds: "+iTo );
48224		return;
48225	}
48226
48227	/*
48228	 * Calculate the new column array index, so we have a mapping between the old and new
48229	 */
48230	var aiMapping = [];
48231	for ( i=0, iLen=iCols ; i<iLen ; i++ )
48232	{
48233		aiMapping[i] = i;
48234	}
48235	fnArraySwitch( aiMapping, iFrom, iTo );
48236	var aiInvertMapping = fnInvertKeyValues( aiMapping );
48237
48238
48239	/*
48240	 * Convert all internal indexing to the new column order indexes
48241	 */
48242	/* Sorting */
48243	for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
48244	{
48245		oSettings.aaSorting[i][0] = aiInvertMapping[ oSettings.aaSorting[i][0] ];
48246	}
48247
48248	/* Fixed sorting */
48249	if ( oSettings.aaSortingFixed !== null )
48250	{
48251		for ( i=0, iLen=oSettings.aaSortingFixed.length ; i<iLen ; i++ )
48252		{
48253			oSettings.aaSortingFixed[i][0] = aiInvertMapping[ oSettings.aaSortingFixed[i][0] ];
48254		}
48255	}
48256
48257	/* Data column sorting (the column which the sort for a given column should take place on) */
48258	for ( i=0, iLen=iCols ; i<iLen ; i++ )
48259	{
48260		oCol = oSettings.aoColumns[i];
48261		for ( j=0, jLen=oCol.aDataSort.length ; j<jLen ; j++ )
48262		{
48263			oCol.aDataSort[j] = aiInvertMapping[ oCol.aDataSort[j] ];
48264		}
48265
48266		// Update the column indexes
48267		oCol.idx = aiInvertMapping[ oCol.idx ];
48268	}
48269
48270	// Update 1.10 optimised sort class removal variable
48271	$.each( oSettings.aLastSort, function (i, val) {
48272		oSettings.aLastSort[i].src = aiInvertMapping[ val.src ];
48273	} );
48274
48275	/* Update the Get and Set functions for each column */
48276	for ( i=0, iLen=iCols ; i<iLen ; i++ )
48277	{
48278		oCol = oSettings.aoColumns[i];
48279
48280		if ( typeof oCol.mData == 'number' ) {
48281			oCol.mData = aiInvertMapping[ oCol.mData ];
48282
48283			// regenerate the get / set functions
48284			oSettings.oApi._fnColumnOptions( oSettings, i, {} );
48285		}
48286		else if ( $.isPlainObject( oCol.mData ) ) {
48287			// HTML5 data sourced
48288			attrMap( oCol.mData, '_',      aiInvertMapping );
48289			attrMap( oCol.mData, 'filter', aiInvertMapping );
48290			attrMap( oCol.mData, 'sort',   aiInvertMapping );
48291			attrMap( oCol.mData, 'type',   aiInvertMapping );
48292
48293			// regenerate the get / set functions
48294			oSettings.oApi._fnColumnOptions( oSettings, i, {} );
48295		}
48296	}
48297
48298
48299	/*
48300	 * Move the DOM elements
48301	 */
48302	if ( oSettings.aoColumns[iFrom].bVisible )
48303	{
48304		/* Calculate the current visible index and the point to insert the node before. The insert
48305		 * before needs to take into account that there might not be an element to insert before,
48306		 * in which case it will be null, and an appendChild should be used
48307		 */
48308		var iVisibleIndex = this.oApi._fnColumnIndexToVisible( oSettings, iFrom );
48309		var iInsertBeforeIndex = null;
48310
48311		i = iTo < iFrom ? iTo : iTo + 1;
48312		while ( iInsertBeforeIndex === null && i < iCols )
48313		{
48314			iInsertBeforeIndex = this.oApi._fnColumnIndexToVisible( oSettings, i );
48315			i++;
48316		}
48317
48318		/* Header */
48319		nTrs = oSettings.nTHead.getElementsByTagName('tr');
48320		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
48321		{
48322			fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex );
48323		}
48324
48325		/* Footer */
48326		if ( oSettings.nTFoot !== null )
48327		{
48328			nTrs = oSettings.nTFoot.getElementsByTagName('tr');
48329			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
48330			{
48331				fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex );
48332			}
48333		}
48334
48335		/* Body */
48336		for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
48337		{
48338			if ( oSettings.aoData[i].nTr !== null )
48339			{
48340				fnDomSwitch( oSettings.aoData[i].nTr, iVisibleIndex, iInsertBeforeIndex );
48341			}
48342		}
48343	}
48344
48345	/*
48346	 * Move the internal array elements
48347	 */
48348	/* Columns */
48349	fnArraySwitch( oSettings.aoColumns, iFrom, iTo );
48350
48351	/* Search columns */
48352	fnArraySwitch( oSettings.aoPreSearchCols, iFrom, iTo );
48353
48354	/* Array array - internal data anodes cache */
48355	for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
48356	{
48357		var data = oSettings.aoData[i];
48358
48359		if ( data.anCells ) {
48360			fnArraySwitch( data.anCells, iFrom, iTo );
48361		}
48362
48363		// For DOM sourced data, the invalidate will reread the cell into
48364		// the data array, but for data sources as an array, they need to
48365		// be flipped
48366		if ( data.src !== 'dom' && $.isArray( data._aData ) ) {
48367			fnArraySwitch( data._aData, iFrom, iTo );
48368		}
48369	}
48370
48371	/* Reposition the header elements in the header layout array */
48372	for ( i=0, iLen=oSettings.aoHeader.length ; i<iLen ; i++ )
48373	{
48374		fnArraySwitch( oSettings.aoHeader[i], iFrom, iTo );
48375	}
48376
48377	if ( oSettings.aoFooter !== null )
48378	{
48379		for ( i=0, iLen=oSettings.aoFooter.length ; i<iLen ; i++ )
48380		{
48381			fnArraySwitch( oSettings.aoFooter[i], iFrom, iTo );
48382		}
48383	}
48384
48385	// Invalidate row cached data for sorting, filtering etc
48386	var api = new $.fn.DataTable.Api( oSettings );
48387	api.rows().invalidate();
48388
48389	/*
48390	 * Update DataTables' event handlers
48391	 */
48392
48393	/* Sort listener */
48394	for ( i=0, iLen=iCols ; i<iLen ; i++ )
48395	{
48396		$(oSettings.aoColumns[i].nTh).off('click.DT');
48397		this.oApi._fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
48398	}
48399
48400
48401	/* Fire an event so other plug-ins can update */
48402	$(oSettings.oInstance).trigger( 'column-reorder.dt', [ oSettings, {
48403		from: iFrom,
48404		to: iTo,
48405		mapping: aiInvertMapping,
48406		drop: drop,
48407
48408		// Old style parameters for compatibility
48409		iFrom: iFrom,
48410		iTo: iTo,
48411		aiInvertMapping: aiInvertMapping
48412	} ] );
48413};
48414
48415
48416/**
48417 * ColReorder provides column visibility control for DataTables
48418 * @class ColReorder
48419 * @constructor
48420 * @param {object} dt DataTables settings object
48421 * @param {object} opts ColReorder options
48422 */
48423var ColReorder = function( dt, opts )
48424{
48425	var settings = new $.fn.DataTable.Api( dt ).settings()[0];
48426
48427	// Ensure that we can't initialise on the same table twice
48428	if ( settings._colReorder ) {
48429		return settings._colReorder;
48430	}
48431
48432	// Allow the options to be a boolean for defaults
48433	if ( opts === true ) {
48434		opts = {};
48435	}
48436
48437	// Convert from camelCase to Hungarian, just as DataTables does
48438	var camelToHungarian = $.fn.DataTable.camelToHungarian;
48439	if ( camelToHungarian ) {
48440		camelToHungarian( ColReorder.defaults, ColReorder.defaults, true );
48441		camelToHungarian( ColReorder.defaults, opts || {} );
48442	}
48443
48444
48445	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
48446	 * Public class variables
48447	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
48448
48449	/**
48450	 * @namespace Settings object which contains customisable information for ColReorder instance
48451	 */
48452	this.s = {
48453		/**
48454		 * DataTables settings object
48455		 *  @property dt
48456		 *  @type     Object
48457		 *  @default  null
48458		 */
48459		"dt": null,
48460
48461		/**
48462		 * Initialisation object used for this instance
48463		 *  @property init
48464		 *  @type     object
48465		 *  @default  {}
48466		 */
48467		"init": $.extend( true, {}, ColReorder.defaults, opts ),
48468
48469		/**
48470		 * Number of columns to fix (not allow to be reordered)
48471		 *  @property fixed
48472		 *  @type     int
48473		 *  @default  0
48474		 */
48475		"fixed": 0,
48476
48477		/**
48478		 * Number of columns to fix counting from right (not allow to be reordered)
48479		 *  @property fixedRight
48480		 *  @type     int
48481		 *  @default  0
48482		 */
48483		"fixedRight": 0,
48484
48485		/**
48486		 * Callback function for once the reorder has been done
48487		 *  @property reorderCallback
48488		 *  @type     function
48489		 *  @default  null
48490		 */
48491		"reorderCallback": null,
48492
48493		/**
48494		 * @namespace Information used for the mouse drag
48495		 */
48496		"mouse": {
48497			"startX": -1,
48498			"startY": -1,
48499			"offsetX": -1,
48500			"offsetY": -1,
48501			"target": -1,
48502			"targetIndex": -1,
48503			"fromIndex": -1
48504		},
48505
48506		/**
48507		 * Information which is used for positioning the insert cusor and knowing where to do the
48508		 * insert. Array of objects with the properties:
48509		 *   x: x-axis position
48510		 *   to: insert point
48511		 *  @property aoTargets
48512		 *  @type     array
48513		 *  @default  []
48514		 */
48515		"aoTargets": []
48516	};
48517
48518
48519	/**
48520	 * @namespace Common and useful DOM elements for the class instance
48521	 */
48522	this.dom = {
48523		/**
48524		 * Dragging element (the one the mouse is moving)
48525		 *  @property drag
48526		 *  @type     element
48527		 *  @default  null
48528		 */
48529		"drag": null,
48530
48531		/**
48532		 * The insert cursor
48533		 *  @property pointer
48534		 *  @type     element
48535		 *  @default  null
48536		 */
48537		"pointer": null
48538	};
48539
48540
48541	/* Constructor logic */
48542	this.s.dt = settings;
48543	this.s.dt._colReorder = this;
48544	this._fnConstruct();
48545
48546	return this;
48547};
48548
48549
48550
48551$.extend( ColReorder.prototype, {
48552	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
48553	 * Public methods
48554	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
48555
48556	/**
48557	 * Reset the column ordering to the original ordering that was detected on
48558	 * start up.
48559	 *  @return {this} Returns `this` for chaining.
48560	 *
48561	 *  @example
48562	 *    // DataTables initialisation with ColReorder
48563	 *    var table = $('#example').dataTable( {
48564	 *        "sDom": 'Rlfrtip'
48565	 *    } );
48566	 *
48567	 *    // Add click event to a button to reset the ordering
48568	 *    $('#resetOrdering').click( function (e) {
48569	 *        e.preventDefault();
48570	 *        $.fn.dataTable.ColReorder( table ).fnReset();
48571	 *    } );
48572	 */
48573	"fnReset": function ()
48574	{
48575		this._fnOrderColumns( this.fnOrder() );
48576
48577		return this;
48578	},
48579
48580	/**
48581	 * `Deprecated` - Get the current order of the columns, as an array.
48582	 *  @return {array} Array of column identifiers
48583	 *  @deprecated `fnOrder` should be used in preference to this method.
48584	 *      `fnOrder` acts as a getter/setter.
48585	 */
48586	"fnGetCurrentOrder": function ()
48587	{
48588		return this.fnOrder();
48589	},
48590
48591	/**
48592	 * Get the current order of the columns, as an array. Note that the values
48593	 * given in the array are unique identifiers for each column. Currently
48594	 * these are the original ordering of the columns that was detected on
48595	 * start up, but this could potentially change in future.
48596	 *  @return {array} Array of column identifiers
48597	 *
48598	 *  @example
48599	 *    // Get column ordering for the table
48600	 *    var order = $.fn.dataTable.ColReorder( dataTable ).fnOrder();
48601	 *//**
48602	 * Set the order of the columns, from the positions identified in the
48603	 * ordering array given. Note that ColReorder takes a brute force approach
48604	 * to reordering, so it is possible multiple reordering events will occur
48605	 * before the final order is settled upon.
48606	 *  @param {array} [set] Array of column identifiers in the new order. Note
48607	 *    that every column must be included, uniquely, in this array.
48608	 *  @return {this} Returns `this` for chaining.
48609	 *
48610	 *  @example
48611	 *    // Swap the first and second columns
48612	 *    $.fn.dataTable.ColReorder( dataTable ).fnOrder( [1, 0, 2, 3, 4] );
48613	 *
48614	 *  @example
48615	 *    // Move the first column to the end for the table `#example`
48616	 *    var curr = $.fn.dataTable.ColReorder( '#example' ).fnOrder();
48617	 *    var first = curr.shift();
48618	 *    curr.push( first );
48619	 *    $.fn.dataTable.ColReorder( '#example' ).fnOrder( curr );
48620	 *
48621	 *  @example
48622	 *    // Reverse the table's order
48623	 *    $.fn.dataTable.ColReorder( '#example' ).fnOrder(
48624	 *      $.fn.dataTable.ColReorder( '#example' ).fnOrder().reverse()
48625	 *    );
48626	 */
48627	"fnOrder": function ( set, original )
48628	{
48629		var a = [], i, ien, j, jen;
48630		var columns = this.s.dt.aoColumns;
48631
48632		if ( set === undefined ){
48633			for ( i=0, ien=columns.length ; i<ien ; i++ ) {
48634				a.push( columns[i]._ColReorder_iOrigCol );
48635			}
48636
48637			return a;
48638		}
48639
48640		// The order given is based on the original indexes, rather than the
48641		// existing ones, so we need to translate from the original to current
48642		// before then doing the order
48643		if ( original ) {
48644			var order = this.fnOrder();
48645
48646			for ( i=0, ien=set.length ; i<ien ; i++ ) {
48647				a.push( $.inArray( set[i], order ) );
48648			}
48649
48650			set = a;
48651		}
48652
48653		this._fnOrderColumns( fnInvertKeyValues( set ) );
48654
48655		return this;
48656	},
48657
48658
48659	/**
48660	 * Convert from the original column index, to the original
48661	 *
48662	 * @param  {int|array} idx Index(es) to convert
48663	 * @param  {string} dir Transpose direction - `fromOriginal` / `toCurrent`
48664	 *   or `'toOriginal` / `fromCurrent`
48665	 * @return {int|array}     Converted values
48666	 */
48667	fnTranspose: function ( idx, dir )
48668	{
48669		if ( ! dir ) {
48670			dir = 'toCurrent';
48671		}
48672
48673		var order = this.fnOrder();
48674		var columns = this.s.dt.aoColumns;
48675
48676		if ( dir === 'toCurrent' ) {
48677			// Given an original index, want the current
48678			return ! $.isArray( idx ) ?
48679				$.inArray( idx, order ) :
48680				$.map( idx, function ( index ) {
48681					return $.inArray( index, order );
48682				} );
48683		}
48684		else {
48685			// Given a current index, want the original
48686			return ! $.isArray( idx ) ?
48687				columns[idx]._ColReorder_iOrigCol :
48688				$.map( idx, function ( index ) {
48689					return columns[index]._ColReorder_iOrigCol;
48690				} );
48691		}
48692	},
48693
48694
48695	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
48696	 * Private methods (they are of course public in JS, but recommended as private)
48697	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
48698
48699	/**
48700	 * Constructor logic
48701	 *  @method  _fnConstruct
48702	 *  @returns void
48703	 *  @private
48704	 */
48705	"_fnConstruct": function ()
48706	{
48707		var that = this;
48708		var iLen = this.s.dt.aoColumns.length;
48709		var table = this.s.dt.nTable;
48710		var i;
48711
48712		/* Columns discounted from reordering - counting left to right */
48713		if ( this.s.init.iFixedColumns )
48714		{
48715			this.s.fixed = this.s.init.iFixedColumns;
48716		}
48717
48718		if ( this.s.init.iFixedColumnsLeft )
48719		{
48720			this.s.fixed = this.s.init.iFixedColumnsLeft;
48721		}
48722
48723		/* Columns discounted from reordering - counting right to left */
48724		this.s.fixedRight = this.s.init.iFixedColumnsRight ?
48725			this.s.init.iFixedColumnsRight :
48726			0;
48727
48728		/* Drop callback initialisation option */
48729		if ( this.s.init.fnReorderCallback )
48730		{
48731			this.s.reorderCallback = this.s.init.fnReorderCallback;
48732		}
48733
48734		/* Add event handlers for the drag and drop, and also mark the original column order */
48735		for ( i = 0; i < iLen; i++ )
48736		{
48737			if ( i > this.s.fixed-1 && i < iLen - this.s.fixedRight )
48738			{
48739				this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh );
48740			}
48741
48742			/* Mark the original column order for later reference */
48743			this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i;
48744		}
48745
48746		/* State saving */
48747		this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) {
48748			that._fnStateSave.call( that, oData );
48749		}, "ColReorder_State" );
48750
48751		/* An initial column order has been specified */
48752		var aiOrder = null;
48753		if ( this.s.init.aiOrder )
48754		{
48755			aiOrder = this.s.init.aiOrder.slice();
48756		}
48757
48758		/* State loading, overrides the column order given */
48759		if ( this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' &&
48760		  this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length )
48761		{
48762			aiOrder = this.s.dt.oLoadedState.ColReorder;
48763		}
48764
48765		/* If we have an order to apply - do so */
48766		if ( aiOrder )
48767		{
48768			/* We might be called during or after the DataTables initialisation. If before, then we need
48769			 * to wait until the draw is done, if after, then do what we need to do right away
48770			 */
48771			if ( !that.s.dt._bInitComplete )
48772			{
48773				var bDone = false;
48774				$(table).on( 'draw.dt.colReorder', function () {
48775					if ( !that.s.dt._bInitComplete && !bDone )
48776					{
48777						bDone = true;
48778						var resort = fnInvertKeyValues( aiOrder );
48779						that._fnOrderColumns.call( that, resort );
48780					}
48781				} );
48782			}
48783			else
48784			{
48785				var resort = fnInvertKeyValues( aiOrder );
48786				that._fnOrderColumns.call( that, resort );
48787			}
48788		}
48789		else {
48790			this._fnSetColumnIndexes();
48791		}
48792
48793		// Destroy clean up
48794		$(table).on( 'destroy.dt.colReorder', function () {
48795			$(table).off( 'destroy.dt.colReorder draw.dt.colReorder' );
48796			$(that.s.dt.nTHead).find( '*' ).off( '.ColReorder' );
48797
48798			$.each( that.s.dt.aoColumns, function (i, column) {
48799				$(column.nTh).removeAttr('data-column-index');
48800			} );
48801
48802			that.s.dt._colReorder = null;
48803			that.s = null;
48804		} );
48805	},
48806
48807
48808	/**
48809	 * Set the column order from an array
48810	 *  @method  _fnOrderColumns
48811	 *  @param   array a An array of integers which dictate the column order that should be applied
48812	 *  @returns void
48813	 *  @private
48814	 */
48815	"_fnOrderColumns": function ( a )
48816	{
48817		var changed = false;
48818
48819		if ( a.length != this.s.dt.aoColumns.length )
48820		{
48821			this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+
48822				"match known number of columns. Skipping." );
48823			return;
48824		}
48825
48826		for ( var i=0, iLen=a.length ; i<iLen ; i++ )
48827		{
48828			var currIndex = $.inArray( i, a );
48829			if ( i != currIndex )
48830			{
48831				/* Reorder our switching array */
48832				fnArraySwitch( a, currIndex, i );
48833
48834				/* Do the column reorder in the table */
48835				this.s.dt.oInstance.fnColReorder( currIndex, i, true );
48836
48837				changed = true;
48838			}
48839		}
48840
48841		this._fnSetColumnIndexes();
48842
48843		// Has anything actually changed? If not, then nothing else to do
48844		if ( ! changed ) {
48845			return;
48846		}
48847
48848		/* When scrolling we need to recalculate the column sizes to allow for the shift */
48849		if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" )
48850		{
48851			this.s.dt.oInstance.fnAdjustColumnSizing( false );
48852		}
48853
48854		/* Save the state */
48855		this.s.dt.oInstance.oApi._fnSaveState( this.s.dt );
48856		
48857		if ( this.s.reorderCallback !== null )
48858		{
48859			this.s.reorderCallback.call( this );
48860		}
48861	},
48862
48863
48864	/**
48865	 * Because we change the indexes of columns in the table, relative to their starting point
48866	 * we need to reorder the state columns to what they are at the starting point so we can
48867	 * then rearrange them again on state load!
48868	 *  @method  _fnStateSave
48869	 *  @param   object oState DataTables state
48870	 *  @returns string JSON encoded cookie string for DataTables
48871	 *  @private
48872	 */
48873	"_fnStateSave": function ( oState )
48874	{
48875		var i, iLen, aCopy, iOrigColumn;
48876		var oSettings = this.s.dt;
48877		var columns = oSettings.aoColumns;
48878
48879		oState.ColReorder = [];
48880
48881		/* Sorting */
48882		if ( oState.aaSorting ) {
48883			// 1.10.0-
48884			for ( i=0 ; i<oState.aaSorting.length ; i++ ) {
48885				oState.aaSorting[i][0] = columns[ oState.aaSorting[i][0] ]._ColReorder_iOrigCol;
48886			}
48887
48888			var aSearchCopy = $.extend( true, [], oState.aoSearchCols );
48889
48890			for ( i=0, iLen=columns.length ; i<iLen ; i++ )
48891			{
48892				iOrigColumn = columns[i]._ColReorder_iOrigCol;
48893
48894				/* Column filter */
48895				oState.aoSearchCols[ iOrigColumn ] = aSearchCopy[i];
48896
48897				/* Visibility */
48898				oState.abVisCols[ iOrigColumn ] = columns[i].bVisible;
48899
48900				/* Column reordering */
48901				oState.ColReorder.push( iOrigColumn );
48902			}
48903		}
48904		else if ( oState.order ) {
48905			// 1.10.1+
48906			for ( i=0 ; i<oState.order.length ; i++ ) {
48907				oState.order[i][0] = columns[ oState.order[i][0] ]._ColReorder_iOrigCol;
48908			}
48909
48910			var stateColumnsCopy = $.extend( true, [], oState.columns );
48911
48912			for ( i=0, iLen=columns.length ; i<iLen ; i++ )
48913			{
48914				iOrigColumn = columns[i]._ColReorder_iOrigCol;
48915
48916				/* Columns */
48917				oState.columns[ iOrigColumn ] = stateColumnsCopy[i];
48918
48919				/* Column reordering */
48920				oState.ColReorder.push( iOrigColumn );
48921			}
48922		}
48923	},
48924
48925
48926	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
48927	 * Mouse drop and drag
48928	 */
48929
48930	/**
48931	 * Add a mouse down listener to a particluar TH element
48932	 *  @method  _fnMouseListener
48933	 *  @param   int i Column index
48934	 *  @param   element nTh TH element clicked on
48935	 *  @returns void
48936	 *  @private
48937	 */
48938	"_fnMouseListener": function ( i, nTh )
48939	{
48940		var that = this;
48941		$(nTh).on( 'mousedown.ColReorder', function (e) {
48942			e.preventDefault();
48943			that._fnMouseDown.call( that, e, nTh );
48944		} );
48945	},
48946
48947
48948	/**
48949	 * Mouse down on a TH element in the table header
48950	 *  @method  _fnMouseDown
48951	 *  @param   event e Mouse event
48952	 *  @param   element nTh TH element to be dragged
48953	 *  @returns void
48954	 *  @private
48955	 */
48956	"_fnMouseDown": function ( e, nTh )
48957	{
48958		var that = this;
48959
48960		/* Store information about the mouse position */
48961		var target = $(e.target).closest('th, td');
48962		var offset = target.offset();
48963		var idx = parseInt( $(nTh).attr('data-column-index'), 10 );
48964
48965		if ( idx === undefined ) {
48966			return;
48967		}
48968
48969		this.s.mouse.startX = e.pageX;
48970		this.s.mouse.startY = e.pageY;
48971		this.s.mouse.offsetX = e.pageX - offset.left;
48972		this.s.mouse.offsetY = e.pageY - offset.top;
48973		this.s.mouse.target = this.s.dt.aoColumns[ idx ].nTh;//target[0];
48974		this.s.mouse.targetIndex = idx;
48975		this.s.mouse.fromIndex = idx;
48976
48977		this._fnRegions();
48978
48979		/* Add event handlers to the document */
48980		$(document)
48981			.on( 'mousemove.ColReorder', function (e) {
48982				that._fnMouseMove.call( that, e );
48983			} )
48984			.on( 'mouseup.ColReorder', function (e) {
48985				that._fnMouseUp.call( that, e );
48986			} );
48987	},
48988
48989
48990	/**
48991	 * Deal with a mouse move event while dragging a node
48992	 *  @method  _fnMouseMove
48993	 *  @param   event e Mouse event
48994	 *  @returns void
48995	 *  @private
48996	 */
48997	"_fnMouseMove": function ( e )
48998	{
48999		var that = this;
49000
49001		if ( this.dom.drag === null )
49002		{
49003			/* Only create the drag element if the mouse has moved a specific distance from the start
49004			 * point - this allows the user to make small mouse movements when sorting and not have a
49005			 * possibly confusing drag element showing up
49006			 */
49007			if ( Math.pow(
49008				Math.pow(e.pageX - this.s.mouse.startX, 2) +
49009				Math.pow(e.pageY - this.s.mouse.startY, 2), 0.5 ) < 5 )
49010			{
49011				return;
49012			}
49013			this._fnCreateDragNode();
49014		}
49015
49016		/* Position the element - we respect where in the element the click occured */
49017		this.dom.drag.css( {
49018			left: e.pageX - this.s.mouse.offsetX,
49019			top: e.pageY - this.s.mouse.offsetY
49020		} );
49021
49022		/* Based on the current mouse position, calculate where the insert should go */
49023		var bSet = false;
49024		var lastToIndex = this.s.mouse.toIndex;
49025
49026		for ( var i=1, iLen=this.s.aoTargets.length ; i<iLen ; i++ )
49027		{
49028			if ( e.pageX < this.s.aoTargets[i-1].x + ((this.s.aoTargets[i].x-this.s.aoTargets[i-1].x)/2) )
49029			{
49030				this.dom.pointer.css( 'left', this.s.aoTargets[i-1].x );
49031				this.s.mouse.toIndex = this.s.aoTargets[i-1].to;
49032				bSet = true;
49033				break;
49034			}
49035		}
49036
49037		// The insert element wasn't positioned in the array (less than
49038		// operator), so we put it at the end
49039		if ( !bSet )
49040		{
49041			this.dom.pointer.css( 'left', this.s.aoTargets[this.s.aoTargets.length-1].x );
49042			this.s.mouse.toIndex = this.s.aoTargets[this.s.aoTargets.length-1].to;
49043		}
49044
49045		// Perform reordering if realtime updating is on and the column has moved
49046		if ( this.s.init.bRealtime && lastToIndex !== this.s.mouse.toIndex ) {
49047			this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex, false );
49048			this.s.mouse.fromIndex = this.s.mouse.toIndex;
49049			this._fnRegions();
49050		}
49051	},
49052
49053
49054	/**
49055	 * Finish off the mouse drag and insert the column where needed
49056	 *  @method  _fnMouseUp
49057	 *  @param   event e Mouse event
49058	 *  @returns void
49059	 *  @private
49060	 */
49061	"_fnMouseUp": function ( e )
49062	{
49063		var that = this;
49064
49065		$(document).off( 'mousemove.ColReorder mouseup.ColReorder' );
49066
49067		if ( this.dom.drag !== null )
49068		{
49069			/* Remove the guide elements */
49070			this.dom.drag.remove();
49071			this.dom.pointer.remove();
49072			this.dom.drag = null;
49073			this.dom.pointer = null;
49074
49075			/* Actually do the reorder */
49076			this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex, true );
49077			this._fnSetColumnIndexes();
49078
49079			/* When scrolling we need to recalculate the column sizes to allow for the shift */
49080			if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" )
49081			{
49082				this.s.dt.oInstance.fnAdjustColumnSizing( false );
49083			}
49084
49085			/* Save the state */
49086			this.s.dt.oInstance.oApi._fnSaveState( this.s.dt );
49087
49088			if ( this.s.reorderCallback !== null )
49089			{
49090				this.s.reorderCallback.call( this );
49091			}
49092		}
49093	},
49094
49095
49096	/**
49097	 * Calculate a cached array with the points of the column inserts, and the
49098	 * 'to' points
49099	 *  @method  _fnRegions
49100	 *  @returns void
49101	 *  @private
49102	 */
49103	"_fnRegions": function ()
49104	{
49105		var aoColumns = this.s.dt.aoColumns;
49106
49107		this.s.aoTargets.splice( 0, this.s.aoTargets.length );
49108
49109		this.s.aoTargets.push( {
49110			"x":  $(this.s.dt.nTable).offset().left,
49111			"to": 0
49112		} );
49113
49114		var iToPoint = 0;
49115		var total = $(aoColumns[0].nTh).offset().left; // Offset of the first column
49116
49117		for ( var i=0, iLen=aoColumns.length ; i<iLen ; i++ )
49118		{
49119			/* For the column / header in question, we want it's position to remain the same if the
49120			 * position is just to it's immediate left or right, so we only increment the counter for
49121			 * other columns
49122			 */
49123			if ( i != this.s.mouse.fromIndex )
49124			{
49125				iToPoint++;
49126			}
49127
49128			if ( aoColumns[i].bVisible )
49129			{
49130				total += $(aoColumns[i].nTh).outerWidth();
49131
49132				this.s.aoTargets.push( {
49133					"x":  total,
49134					"to": iToPoint
49135				} );
49136			}
49137		}
49138
49139		/* Disallow columns for being reordered by drag and drop, counting right to left */
49140		if ( this.s.fixedRight !== 0 )
49141		{
49142			this.s.aoTargets.splice( this.s.aoTargets.length - this.s.fixedRight );
49143		}
49144
49145		/* Disallow columns for being reordered by drag and drop, counting left to right */
49146		if ( this.s.fixed !== 0 )
49147		{
49148			this.s.aoTargets.splice( 0, this.s.fixed );
49149		}
49150	},
49151
49152
49153	/**
49154	 * Copy the TH element that is being drags so the user has the idea that they are actually
49155	 * moving it around the page.
49156	 *  @method  _fnCreateDragNode
49157	 *  @returns void
49158	 *  @private
49159	 */
49160	"_fnCreateDragNode": function ()
49161	{
49162		var scrolling = this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "";
49163
49164		var origCell = this.s.dt.aoColumns[ this.s.mouse.targetIndex ].nTh;
49165		var origTr = origCell.parentNode;
49166		var origThead = origTr.parentNode;
49167		var origTable = origThead.parentNode;
49168		var cloneCell = $(origCell).clone();
49169
49170		// This is a slightly odd combination of jQuery and DOM, but it is the
49171		// fastest and least resource intensive way I could think of cloning
49172		// the table with just a single header cell in it.
49173		this.dom.drag = $(origTable.cloneNode(false))
49174			.addClass( 'DTCR_clonedTable' )
49175			.append(
49176				$(origThead.cloneNode(false)).append(
49177					$(origTr.cloneNode(false)).append(
49178						cloneCell[0]
49179					)
49180				)
49181			)
49182			.css( {
49183				position: 'absolute',
49184				top: 0,
49185				left: 0,
49186				width: $(origCell).outerWidth(),
49187				height: $(origCell).outerHeight()
49188			} )
49189			.appendTo( 'body' );
49190
49191		this.dom.pointer = $('<div></div>')
49192			.addClass( 'DTCR_pointer' )
49193			.css( {
49194				position: 'absolute',
49195				top: scrolling ?
49196					$('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top :
49197					$(this.s.dt.nTable).offset().top,
49198				height : scrolling ?
49199					$('div.dataTables_scroll', this.s.dt.nTableWrapper).height() :
49200					$(this.s.dt.nTable).height()
49201			} )
49202			.appendTo( 'body' );
49203	},
49204
49205
49206	/**
49207	 * Add a data attribute to the column headers, so we know the index of
49208	 * the row to be reordered. This allows fast detection of the index, and
49209	 * for this plug-in to work with FixedHeader which clones the nodes.
49210	 *  @private
49211	 */
49212	"_fnSetColumnIndexes": function ()
49213	{
49214		$.each( this.s.dt.aoColumns, function (i, column) {
49215			$(column.nTh).attr('data-column-index', i);
49216		} );
49217	}
49218} );
49219
49220
49221
49222
49223
49224/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
49225 * Static parameters
49226 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
49227
49228
49229/**
49230 * ColReorder default settings for initialisation
49231 *  @namespace
49232 *  @static
49233 */
49234ColReorder.defaults = {
49235	/**
49236	 * Predefined ordering for the columns that will be applied automatically
49237	 * on initialisation. If not specified then the order that the columns are
49238	 * found to be in the HTML is the order used.
49239	 *  @type array
49240	 *  @default null
49241	 *  @static
49242	 */
49243	aiOrder: null,
49244
49245	/**
49246	 * Redraw the table's column ordering as the end user draws the column
49247	 * (`true`) or wait until the mouse is released (`false` - default). Note
49248	 * that this will perform a redraw on each reordering, which involves an
49249	 * Ajax request each time if you are using server-side processing in
49250	 * DataTables.
49251	 *  @type boolean
49252	 *  @default false
49253	 *  @static
49254	 */
49255	bRealtime: true,
49256
49257	/**
49258	 * Indicate how many columns should be fixed in position (counting from the
49259	 * left). This will typically be 1 if used, but can be as high as you like.
49260	 *  @type int
49261	 *  @default 0
49262	 *  @static
49263	 */
49264	iFixedColumnsLeft: 0,
49265
49266	/**
49267	 * As `iFixedColumnsRight` but counting from the right.
49268	 *  @type int
49269	 *  @default 0
49270	 *  @static
49271	 */
49272	iFixedColumnsRight: 0,
49273
49274	/**
49275	 * Callback function that is fired when columns are reordered. The `column-
49276	 * reorder` event is preferred over this callback
49277	 *  @type function():void
49278	 *  @default null
49279	 *  @static
49280	 */
49281	fnReorderCallback: null
49282};
49283
49284
49285
49286/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
49287 * Constants
49288 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
49289
49290/**
49291 * ColReorder version
49292 *  @constant  version
49293 *  @type      String
49294 *  @default   As code
49295 */
49296ColReorder.version = "1.3.0";
49297
49298
49299
49300/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
49301 * DataTables interfaces
49302 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
49303
49304// Expose
49305$.fn.dataTable.ColReorder = ColReorder;
49306$.fn.DataTable.ColReorder = ColReorder;
49307
49308
49309// Register a new feature with DataTables
49310if ( typeof $.fn.dataTable == "function" &&
49311     typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
49312     $.fn.dataTableExt.fnVersionCheck('1.10.8') )
49313{
49314	$.fn.dataTableExt.aoFeatures.push( {
49315		"fnInit": function( settings ) {
49316			var table = settings.oInstance;
49317
49318			if ( ! settings._colReorder ) {
49319				var dtInit = settings.oInit;
49320				var opts = dtInit.colReorder || dtInit.oColReorder || {};
49321
49322				new ColReorder( settings, opts );
49323			}
49324			else {
49325				table.oApi._fnLog( settings, 1, "ColReorder attempted to initialise twice. Ignoring second" );
49326			}
49327
49328			return null; /* No node for DataTables to insert */
49329		},
49330		"cFeature": "R",
49331		"sFeature": "ColReorder"
49332	} );
49333}
49334else {
49335	alert( "Warning: ColReorder requires DataTables 1.10.8 or greater - www.datatables.net/download");
49336}
49337
49338
49339// Attach a listener to the document which listens for DataTables initialisation
49340// events so we can automatically initialise
49341$(document).on( 'preInit.dt.colReorder', function (e, settings) {
49342	if ( e.namespace !== 'dt' ) {
49343		return;
49344	}
49345
49346	var init = settings.oInit.colReorder;
49347	var defaults = DataTable.defaults.colReorder;
49348
49349	if ( init || defaults ) {
49350		var opts = $.extend( {}, init, defaults );
49351
49352		if ( init !== false ) {
49353			new ColReorder( settings, opts  );
49354		}
49355	}
49356} );
49357
49358
49359// API augmentation
49360$.fn.DataTable.Api.register( 'colReorder.reset()', function () {
49361	return this.iterator( 'table', function ( ctx ) {
49362		ctx._colReorder.fnReset();
49363	} );
49364} );
49365
49366$.fn.DataTable.Api.register( 'colReorder.order()', function ( set, original ) {
49367	if ( set ) {
49368		return this.iterator( 'table', function ( ctx ) {
49369			ctx._colReorder.fnOrder( set, original );
49370		} );
49371	}
49372
49373	return this.context.length ?
49374		this.context[0]._colReorder.fnOrder() :
49375		null;
49376} );
49377
49378$.fn.DataTable.Api.register( 'colReorder.transpose()', function ( idx, dir ) {
49379	return this.context.length && this.context[0]._colReorder ?
49380		this.context[0]._colReorder.fnTranspose( idx, dir ) :
49381		idx;
49382} );
49383
49384
49385return ColReorder;
49386}));
49387/*! Buttons for DataTables 1.1.0
49388 * ©2015 SpryMedia Ltd - datatables.net/license
49389 */
49390
49391(function( factory ){
49392	if ( typeof define === 'function' && define.amd ) {
49393		// AMD
49394		define( ['jquery', 'datatables.net'], function ( $ ) {
49395			return factory( $, window, document );
49396		} );
49397	}
49398	else if ( typeof exports === 'object' ) {
49399		// CommonJS
49400		module.exports = function (root, $) {
49401			if ( ! root ) {
49402				root = window;
49403			}
49404
49405			if ( ! $ || ! $.fn.dataTable ) {
49406				$ = require('datatables.net')(root, $).$;
49407			}
49408
49409			return factory( $, root, root.document );
49410		};
49411	}
49412	else {
49413		// Browser
49414		factory( jQuery, window, document );
49415	}
49416}(function( $, window, document, undefined ) {
49417'use strict';
49418var DataTable = $.fn.dataTable;
49419
49420
49421// Used for namespacing events added to the document by each instance, so they
49422// can be removed on destroy
49423var _instCounter = 0;
49424
49425// Button namespacing counter for namespacing events on individual buttons
49426var _buttonCounter = 0;
49427
49428var _dtButtons = DataTable.ext.buttons;
49429
49430/**
49431 * [Buttons description]
49432 * @param {[type]}
49433 * @param {[type]}
49434 */
49435var Buttons = function( dt, config )
49436{
49437	// Allow a boolean true for defaults
49438	if ( config === true ) {
49439		config = {};
49440	}
49441
49442	// For easy configuration of buttons an array can be given
49443	if ( $.isArray( config ) ) {
49444		config = { buttons: config };
49445	}
49446
49447	this.c = $.extend( true, {}, Buttons.defaults, config );
49448
49449	// Don't want a deep copy for the buttons
49450	if ( config.buttons ) {
49451		this.c.buttons = config.buttons;
49452	}
49453
49454	this.s = {
49455		dt: new DataTable.Api( dt ),
49456		buttons: [],
49457		subButtons: [],
49458		listenKeys: '',
49459		namespace: 'dtb'+(_instCounter++)
49460	};
49461
49462	this.dom = {
49463		container: $('<'+this.c.dom.container.tag+'/>')
49464			.addClass( this.c.dom.container.className )
49465	};
49466
49467	this._constructor();
49468};
49469
49470
49471$.extend( Buttons.prototype, {
49472	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
49473	 * Public methods
49474	 */
49475
49476	/**
49477	 * Get the action of a button
49478	 * @param  {int|string} Button index
49479	 * @return {function}
49480	 *//**
49481	 * Set the action of a button
49482	 * @param  {int|string} Button index
49483	 * @param  {function} Function to set
49484	 * @return {Buttons} Self for chaining
49485	 */
49486	action: function ( idx, action )
49487	{
49488		var button = this._indexToButton( idx ).conf;
49489
49490		if ( action === undefined ) {
49491			return button.action;
49492		}
49493
49494		button.action = action;
49495
49496		return this;
49497	},
49498
49499	/**
49500	 * Add an active class to the button to make to look active
49501	 * @param  {int|string} Button index
49502	 * @param  {boolean} [flag=true] Enable / disable flag
49503	 * @return {Buttons} Self for chaining
49504	 */
49505	active: function ( idx, flag ) {
49506		var button = this._indexToButton( idx );
49507		button.node.toggleClass(
49508			this.c.dom.button.active,
49509			flag === undefined ? true : flag
49510		);
49511
49512		return this;
49513	},
49514
49515	/**
49516	 * Add a new button
49517	 * @param {int|string} Button index for where to insert the button
49518	 * @param {object} Button configuration object, base string name or function
49519	 * @return {Buttons} Self for chaining
49520	 */
49521	add: function ( idx, config )
49522	{
49523		if ( typeof idx === 'string' && idx.indexOf('-') !== -1 ) {
49524			var idxs = idx.split('-');
49525			this.c.buttons[idxs[0]*1].buttons.splice( idxs[1]*1, 0, config );
49526		}
49527		else {
49528			this.c.buttons.splice( idx*1, 0, config );
49529		}
49530
49531		this.dom.container.empty();
49532		this._buildButtons( this.c.buttons );
49533
49534		return this;
49535	},
49536
49537	/**
49538	 * Get the container node for the buttons
49539	 * @return {jQuery} Buttons node
49540	 */
49541	container: function ()
49542	{
49543		return this.dom.container;
49544	},
49545
49546	/**
49547	 * Disable a button
49548	 * @param  {int|string} Button index
49549	 * @return {Buttons} Self for chaining
49550	 */
49551	disable: function ( idx ) {
49552		var button = this._indexToButton( idx );
49553		button.node.addClass( this.c.dom.button.disabled );
49554
49555		return this;
49556	},
49557
49558	/**
49559	 * Destroy the instance, cleaning up event handlers and removing DOM
49560	 * elements
49561	 * @return {Buttons} Self for chaining
49562	 */
49563	destroy: function ()
49564	{
49565		// Key event listener
49566		$('body').off( 'keyup.'+this.s.namespace );
49567
49568		// Individual button destroy (so they can remove their own events if
49569		// needed
49570		var buttons = this.s.buttons;
49571		var subButtons = this.s.subButtons;
49572		var i, ien, j, jen;
49573		
49574		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
49575			this.removePrep( i );
49576
49577			for ( j=0, jen=subButtons[i].length ; j<jen ; j++ ) {
49578				this.removePrep( i+'-'+j );
49579			}
49580		}
49581
49582		this.removeCommit();
49583
49584		// Container
49585		this.dom.container.remove();
49586
49587		// Remove from the settings object collection
49588		var buttonInsts = this.s.dt.settings()[0];
49589
49590		for ( i=0, ien=buttonInsts.length ; i<ien ; i++ ) {
49591			if ( buttonInsts.inst === this ) {
49592				buttonInsts.splice( i, 1 );
49593				break;
49594			}
49595		}
49596
49597		return this;
49598	},
49599
49600	/**
49601	 * Enable / disable a button
49602	 * @param  {int|string} Button index
49603	 * @param  {boolean} [flag=true] Enable / disable flag
49604	 * @return {Buttons} Self for chaining
49605	 */
49606	enable: function ( idx, flag )
49607	{
49608		if ( flag === false ) {
49609			return this.disable( idx );
49610		}
49611
49612		var button = this._indexToButton( idx );
49613		button.node.removeClass( this.c.dom.button.disabled );
49614
49615		return this;
49616	},
49617
49618	/**
49619	 * Get the instance name for the button set selector
49620	 * @return {string} Instance name
49621	 */
49622	name: function ()
49623	{
49624		return this.c.name;
49625	},
49626
49627	/**
49628	 * Get a button's node
49629	 * @param  {int|string} Button index
49630	 * @return {jQuery} Button element
49631	 */
49632	node: function ( idx )
49633	{
49634		var button = this._indexToButton( idx );
49635		return button.node;
49636	},
49637
49638	/**
49639	 * Tidy up any buttons that have been scheduled for removal. This is
49640	 * required so multiple buttons can be removed without upsetting the button
49641	 * indexes while removing them.
49642	 * @param  {int|string} Button index
49643	 * @return {Buttons} Self for chaining
49644	 */
49645	removeCommit: function ()
49646	{
49647		var buttons = this.s.buttons;
49648		var subButtons = this.s.subButtons;
49649		var i, ien, j;
49650
49651		for ( i=buttons.length-1 ; i>=0 ; i-- ) {
49652			if ( buttons[i] === null ) {
49653				buttons.splice( i, 1 );
49654				subButtons.splice( i, 1 );
49655				this.c.buttons.splice( i, 1 );
49656			}
49657		}
49658
49659		for ( i=0, ien=subButtons.length ; i<ien ; i++ ) {
49660			for ( j=subButtons[i].length-1 ; j>=0 ; j-- ) {
49661				if ( subButtons[i][j] === null ) {
49662					subButtons[i].splice( j, 1 );
49663					this.c.buttons[i].buttons.splice( j, 1 );
49664				}
49665			}
49666		}
49667
49668		return this;
49669	},
49670
49671	/**
49672	 * Scheduled a button for removal. This is required so multiple buttons can
49673	 * be removed without upsetting the button indexes while removing them.
49674	 * @return {Buttons} Self for chaining
49675	 */
49676	removePrep: function ( idx )
49677	{
49678		var button;
49679		var dt = this.s.dt;
49680
49681		if ( typeof idx === 'number' || idx.indexOf('-') === -1 ) {
49682			// Top level button
49683			button = this.s.buttons[ idx*1 ];
49684
49685			if ( button.conf.destroy ) {
49686				button.conf.destroy.call( dt.button(idx), dt, button, button.conf );
49687			}
49688
49689			button.node.remove();
49690			this._removeKey( button.conf );
49691			this.s.buttons[ idx*1 ] = null;
49692		}
49693		else {
49694			// Collection button
49695			var idxs = idx.split('-');
49696			button = this.s.subButtons[ idxs[0]*1 ][ idxs[1]*1 ];
49697
49698			if ( button.conf.destroy ) {
49699				button.conf.destroy.call( dt.button(idx), dt, button, button.conf );
49700			}
49701
49702			button.node.remove();
49703			this._removeKey( button.conf );
49704			this.s.subButtons[ idxs[0]*1 ][ idxs[1]*1 ] = null;
49705		}
49706
49707		return this;
49708	},
49709
49710	/**
49711	 * Get the text for a button
49712	 * @param  {int|string} Button index
49713	 * @return {string} Button text
49714	 *//**
49715	 * Set the text for a button
49716	 * @param  {int|string|function} Button index
49717	 * @param  {string} Text
49718	 * @return {Buttons} Self for chaining
49719	 */
49720	text: function ( idx, label )
49721	{
49722		var button = this._indexToButton( idx );
49723		var buttonLiner = this.c.dom.collection.buttonLiner;
49724		var linerTag = typeof idx === 'string' && idx.indexOf( '-' ) !== -1 && buttonLiner && buttonLiner.tag ?
49725			buttonLiner.tag :
49726			this.c.dom.buttonLiner.tag;
49727		var dt = this.s.dt;
49728		var text = function ( opt ) {
49729			return typeof opt === 'function' ?
49730				opt( dt, button.node, button.conf ) :
49731				opt;
49732		};
49733
49734		if ( label === undefined ) {
49735			return text( button.conf.text );
49736		}
49737
49738		button.conf.text = label;
49739
49740		if ( linerTag ) {
49741			button.node.children( linerTag ).html( text(label) );
49742		}
49743		else {
49744			button.node.html( text(label) );
49745		}
49746
49747		return this;
49748	},
49749
49750	/**
49751	 * Calculate button index from a node
49752	 * @param  {node} Button node (_not_ a jQuery object)
49753	 * @return {string} Index. Undefined if not found
49754	 */
49755	toIndex: function ( node )
49756	{
49757		var i, ien, j, jen;
49758		var buttons = this.s.buttons;
49759		var subButtons = this.s.subButtons;
49760
49761		// Loop the main buttons first
49762		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
49763			if ( buttons[i].node[0] === node ) {
49764				return i+'';
49765			}
49766		}
49767
49768		// Then the sub-buttons
49769		for ( i=0, ien=subButtons.length ; i<ien ; i++ ) {
49770			for ( j=0, jen=subButtons[i].length ; j<jen ; j++ ) {
49771				if ( subButtons[i][j].node[0] === node ) {
49772					return i+'-'+j;
49773				}
49774			}
49775		}
49776	},
49777
49778
49779	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
49780	 * Constructor
49781	 */
49782
49783	/**
49784	 * Buttons constructor
49785	 * @private
49786	 */
49787	_constructor: function ()
49788	{
49789		var that = this;
49790		var dt = this.s.dt;
49791		var dtSettings = dt.settings()[0];
49792
49793		if ( ! dtSettings._buttons ) {
49794			dtSettings._buttons = [];
49795		}
49796
49797		dtSettings._buttons.push( {
49798			inst: this,
49799			name: this.c.name
49800		} );
49801
49802		this._buildButtons( this.c.buttons );
49803
49804		dt.on( 'destroy', function () {
49805			that.destroy();
49806		} );
49807
49808		// Global key event binding to listen for button keys
49809		$('body').on( 'keyup.'+this.s.namespace, function ( e ) {
49810			if ( ! document.activeElement || document.activeElement === document.body ) {
49811				// SUse a string of characters for fast lookup of if we need to
49812				// handle this
49813				var character = String.fromCharCode(e.keyCode).toLowerCase();
49814
49815				if ( that.s.listenKeys.toLowerCase().indexOf( character ) !== -1 ) {
49816					that._keypress( character, e );
49817				}
49818			}
49819		} );
49820	},
49821
49822
49823	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
49824	 * Private methods
49825	 */
49826
49827	/**
49828	 * Add a new button to the key press listener
49829	 * @param {object} Resolved button configuration object
49830	 * @private
49831	 */
49832	_addKey: function ( conf )
49833	{
49834		if ( conf.key ) {
49835			this.s.listenKeys += $.isPlainObject( conf.key ) ?
49836				conf.key.key :
49837				conf.key;
49838		}
49839	},
49840
49841	/**
49842	 * Create buttons from an array of buttons
49843	 * @param  {array} Buttons to create
49844	 * @param  {jQuery} Container node into which the created button should be
49845	 *   inserted.
49846	 * @param  {int} Counter for sub-buttons to be stored in a collection
49847	 * @private
49848	 */
49849	_buildButtons: function ( buttons, container, collectionCounter )
49850	{
49851		var dt = this.s.dt;
49852
49853		if ( ! container ) {
49854			container = this.dom.container;
49855			this.s.buttons = [];
49856			this.s.subButtons = [];
49857		}
49858
49859		for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
49860			var conf = this._resolveExtends( buttons[i] );
49861
49862			if ( ! conf ) {
49863				continue;
49864			}
49865
49866			// If the configuration is an array, then expand the buttons at this
49867			// point
49868			if ( $.isArray( conf ) ) {
49869				this._buildButtons( conf, container, collectionCounter );
49870				continue;
49871			}
49872
49873			var button = this._buildButton(
49874				conf,
49875				collectionCounter!==undefined ? true : false
49876			);
49877
49878			if ( ! button ) {
49879				continue;
49880			}
49881
49882			var buttonNode = button.node;
49883			container.append( button.inserter );
49884
49885			if ( collectionCounter === undefined ) {
49886				this.s.buttons.push( {
49887					node:     buttonNode,
49888					conf:     conf,
49889					inserter: button.inserter
49890				} );
49891				this.s.subButtons.push( [] );
49892			}
49893			else {
49894				this.s.subButtons[ collectionCounter ].push( {
49895					node:     buttonNode,
49896					conf:     conf,
49897					inserter: button.inserter
49898				} );
49899			}
49900
49901			if ( conf.buttons ) {
49902				var collectionDom = this.c.dom.collection;
49903				conf._collection = $('<'+collectionDom.tag+'/>')
49904					.addClass( collectionDom.className );
49905
49906				this._buildButtons( conf.buttons, conf._collection, i );
49907			}
49908
49909			// init call is made here, rather than buildButton as it needs to
49910			// have been added to the buttons / subButtons array first
49911			if ( conf.init ) {
49912				conf.init.call( dt.button( buttonNode ), dt, buttonNode, conf );
49913			}
49914		}
49915	},
49916
49917	/**
49918	 * Create an individual button
49919	 * @param  {object} config            Resolved button configuration
49920	 * @param  {boolean} collectionButton `true` if a collection button
49921	 * @return {jQuery} Created button node (jQuery)
49922	 * @private
49923	 */
49924	_buildButton: function ( config, collectionButton )
49925	{
49926		var that = this;
49927		var buttonDom = this.c.dom.button;
49928		var linerDom = this.c.dom.buttonLiner;
49929		var collectionDom = this.c.dom.collection;
49930		var dt = this.s.dt;
49931		var text = function ( opt ) {
49932			return typeof opt === 'function' ?
49933				opt( dt, button, config ) :
49934				opt;
49935		};
49936
49937		if ( collectionButton && collectionDom.button ) {
49938			buttonDom = collectionDom.button;
49939		}
49940
49941		if ( collectionButton && collectionDom.buttonLiner ) {
49942			linerDom = collectionDom.buttonLiner;
49943		}
49944
49945		// Make sure that the button is available based on whatever requirements
49946		// it has. For example, Flash buttons require Flash
49947		if ( config.available && ! config.available( dt, config ) ) {
49948			return false;
49949		}
49950
49951		var button = $('<'+buttonDom.tag+'/>')
49952			.addClass( buttonDom.className )
49953			.attr( 'tabindex', this.s.dt.settings()[0].iTabIndex )
49954			.attr( 'aria-controls', this.s.dt.table().node().id )
49955			.on( 'click.dtb', function (e) {
49956				e.preventDefault();
49957
49958				if ( ! button.hasClass( buttonDom.disabled ) && config.action ) {
49959					config.action.call( dt.button( button ), e, dt, button, config );
49960				}
49961
49962				button.blur();
49963			} )
49964			.on( 'keyup.dtb', function (e) {
49965				if ( e.keyCode === 13 ) {
49966					if ( ! button.hasClass( buttonDom.disabled ) && config.action ) {
49967						config.action.call( dt.button( button ), e, dt, button, config );
49968					}
49969				}
49970			} );
49971
49972		if ( linerDom.tag ) {
49973			button.append(
49974				$('<'+linerDom.tag+'/>')
49975					.html( text( config.text ) )
49976					.addClass( linerDom.className )
49977			);
49978		}
49979		else {
49980			button.html( text( config.text ) );
49981		}
49982
49983		if ( config.enabled === false ) {
49984			button.addClass( buttonDom.disabled );
49985		}
49986
49987		if ( config.className ) {
49988			button.addClass( config.className );
49989		}
49990
49991		if ( config.titleAttr ) {
49992			button.attr( 'title', config.titleAttr );
49993		}
49994
49995		if ( ! config.namespace ) {
49996			config.namespace = '.dt-button-'+(_buttonCounter++);
49997		}
49998
49999		var buttonContainer = this.c.dom.buttonContainer;
50000		var inserter;
50001		if ( buttonContainer ) {
50002			inserter = $('<'+buttonContainer.tag+'/>')
50003				.addClass( buttonContainer.className )
50004				.append( button );
50005		}
50006		else {
50007			inserter = button;
50008		}
50009
50010		this._addKey( config );
50011
50012		return {
50013			node: button,
50014			inserter: inserter
50015		};
50016	},
50017
50018	/**
50019	 * Get a button's host information from a button index
50020	 * @param  {int|string} Button index
50021	 * @return {object} Button information - object contains `node` and `conf`
50022	 *   properties
50023	 * @private
50024	 */
50025	_indexToButton: function ( idx )
50026	{
50027		if ( typeof idx === 'number' || idx.indexOf('-') === -1 ) {
50028			return this.s.buttons[ idx*1 ];
50029		}
50030
50031		var idxs = idx.split('-');
50032		return this.s.subButtons[ idxs[0]*1 ][ idxs[1]*1 ];
50033	},
50034
50035	/**
50036	 * Handle a key press - determine if any button's key configured matches
50037	 * what was typed and trigger the action if so.
50038	 * @param  {string} The character pressed
50039	 * @param  {object} Key event that triggered this call
50040	 * @private
50041	 */
50042	_keypress: function ( character, e )
50043	{
50044		var i, ien, j, jen;
50045		var buttons = this.s.buttons;
50046		var subButtons = this.s.subButtons;
50047		var run = function ( conf, node ) {
50048			if ( ! conf.key ) {
50049				return;
50050			}
50051
50052			if ( conf.key === character ) {
50053				node.click();
50054			}
50055			else if ( $.isPlainObject( conf.key ) ) {
50056				if ( conf.key.key !== character ) {
50057					return;
50058				}
50059
50060				if ( conf.key.shiftKey && ! e.shiftKey ) {
50061					return;
50062				}
50063
50064				if ( conf.key.altKey && ! e.altKey ) {
50065					return;
50066				}
50067
50068				if ( conf.key.ctrlKey && ! e.ctrlKey ) {
50069					return;
50070				}
50071
50072				if ( conf.key.metaKey && ! e.metaKey ) {
50073					return;
50074				}
50075
50076				// Made it this far - it is good
50077				node.click();
50078			}
50079		};
50080
50081		// Loop the main buttons first
50082		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
50083			run( buttons[i].conf, buttons[i].node );
50084		}
50085
50086		// Then the sub-buttons
50087		for ( i=0, ien=subButtons.length ; i<ien ; i++ ) {
50088			for ( j=0, jen=subButtons[i].length ; j<jen ; j++ ) {
50089				run( subButtons[i][j].conf, subButtons[i][j].node );
50090			}
50091		}
50092	},
50093
50094	/**
50095	 * Remove a key from the key listener for this instance (to be used when a
50096	 * button is removed)
50097	 * @param  {object} Button configuration
50098	 */
50099	_removeKey: function ( conf )
50100	{
50101		if ( conf.key ) {
50102			var character = $.isPlainObject( conf.key ) ?
50103				conf.key.key :
50104				conf.key;
50105
50106			// Remove only one character, as multiple buttons could have the
50107			// same listening key
50108			var a = this.s.listenKeys.split('');
50109			var idx = $.inArray( character, a );
50110			a.splice( idx, 1 );
50111			this.s.listenKeys = a.join('');
50112		}
50113	},
50114
50115	/**
50116	 * Resolve a button configuration
50117	 * @param  {string|function|object} Button config to resolve
50118	 * @return {object} Button configuration
50119	 */
50120	_resolveExtends: function ( conf )
50121	{
50122		var dt = this.s.dt;
50123		var i, ien;
50124		var toConfObject = function ( base ) {
50125			var loop = 0;
50126
50127			// Loop until we have resolved to a button configuration, or an
50128			// array of button configurations (which will be iterated
50129			// separately)
50130			while ( ! $.isPlainObject(base) && ! $.isArray(base) ) {
50131				if ( base === undefined ) {
50132					return;
50133				}
50134
50135				if ( typeof base === 'function' ) {
50136					base = base( dt, conf );
50137
50138					if ( ! base ) {
50139						return false;
50140					}
50141				}
50142				else if ( typeof base === 'string' ) {
50143					if ( ! _dtButtons[ base ] ) {
50144						throw 'Unknown button type: '+base;
50145					}
50146
50147					base = _dtButtons[ base ];
50148				}
50149
50150				loop++;
50151				if ( loop > 30 ) {
50152					// Protect against misconfiguration killing the browser
50153					throw 'Buttons: Too many iterations';
50154				}
50155			}
50156
50157			return $.isArray( base ) ?
50158				base :
50159				$.extend( {}, base );
50160		};
50161
50162		conf = toConfObject( conf );
50163
50164		while ( conf && conf.extend ) {
50165			// Use `toConfObject` in case the button definition being extended
50166			// is itself a string or a function
50167			if ( ! _dtButtons[ conf.extend ] ) {
50168				throw 'Cannot extend unknown button type: '+conf.extend;
50169			}
50170
50171			var objArray = toConfObject( _dtButtons[ conf.extend ] );
50172			if ( $.isArray( objArray ) ) {
50173				return objArray;
50174			}
50175			else if ( ! objArray ) {
50176				// This is a little brutal as it might be possible to have a
50177				// valid button without the extend, but if there is no extend
50178				// then the host button would be acting in an undefined state
50179				return false;
50180			}
50181
50182			// Stash the current class name
50183			var originalClassName = objArray.className;
50184
50185			conf = $.extend( {}, objArray, conf );
50186
50187			// The extend will have overwritten the original class name if the
50188			// `conf` object also assigned a class, but we want to concatenate
50189			// them so they are list that is combined from all extended buttons
50190			if ( originalClassName && conf.className !== originalClassName ) {
50191				conf.className = originalClassName+' '+conf.className;
50192			}
50193
50194			// Buttons to be added to a collection  -gives the ability to define
50195			// if buttons should be added to the start or end of a collection
50196			var postfixButtons = conf.postfixButtons;
50197			if ( postfixButtons ) {
50198				if ( ! conf.buttons ) {
50199					conf.buttons = [];
50200				}
50201
50202				for ( i=0, ien=postfixButtons.length ; i<ien ; i++ ) {
50203					conf.buttons.push( postfixButtons[i] );
50204				}
50205
50206				conf.postfixButtons = null;
50207			}
50208
50209			var prefixButtons = conf.prefixButtons;
50210			if ( prefixButtons ) {
50211				if ( ! conf.buttons ) {
50212					conf.buttons = [];
50213				}
50214
50215				for ( i=0, ien=prefixButtons.length ; i<ien ; i++ ) {
50216					conf.buttons.splice( i, 0, prefixButtons[i] );
50217				}
50218
50219				conf.prefixButtons = null;
50220			}
50221
50222			// Although we want the `conf` object to overwrite almost all of
50223			// the properties of the object being extended, the `extend`
50224			// property should come from the object being extended
50225			conf.extend = objArray.extend;
50226		}
50227
50228		return conf;
50229	}
50230} );
50231
50232
50233
50234/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
50235 * Statics
50236 */
50237
50238/**
50239 * Show / hide a background layer behind a collection
50240 * @param  {boolean} Flag to indicate if the background should be shown or
50241 *   hidden 
50242 * @param  {string} Class to assign to the background
50243 * @static
50244 */
50245Buttons.background = function ( show, className, fade ) {
50246	if ( fade === undefined ) {
50247		fade = 400;
50248	}
50249
50250	if ( show ) {
50251		$('<div/>')
50252			.addClass( className )
50253			.css( 'display', 'none' )
50254			.appendTo( 'body' )
50255			.fadeIn( fade );
50256	}
50257	else {
50258		$('body > div.'+className)
50259			.fadeOut( fade, function () {
50260				$(this).remove();
50261			} );
50262	}
50263};
50264
50265/**
50266 * Instance selector - select Buttons instances based on an instance selector
50267 * value from the buttons assigned to a DataTable. This is only useful if
50268 * multiple instances are attached to a DataTable.
50269 * @param  {string|int|array} Instance selector - see `instance-selector`
50270 *   documentation on the DataTables site
50271 * @param  {array} Button instance array that was attached to the DataTables
50272 *   settings object
50273 * @return {array} Buttons instances
50274 * @static
50275 */
50276Buttons.instanceSelector = function ( group, buttons )
50277{
50278	if ( ! group ) {
50279		return $.map( buttons, function ( v ) {
50280			return v.inst;
50281		} );
50282	}
50283
50284	var ret = [];
50285	var names = $.map( buttons, function ( v ) {
50286		return v.name;
50287	} );
50288
50289	// Flatten the group selector into an array of single options
50290	var process = function ( input ) {
50291		if ( $.isArray( input ) ) {
50292			for ( var i=0, ien=input.length ; i<ien ; i++ ) {
50293				process( input[i] );
50294			}
50295			return;
50296		}
50297
50298		if ( typeof input === 'string' ) {
50299			if ( input.indexOf( ',' ) !== -1 ) {
50300				// String selector, list of names
50301				process( input.split(',') );
50302			}
50303			else {
50304				// String selector individual name
50305				var idx = $.inArray( $.trim(input), names );
50306
50307				if ( idx !== -1 ) {
50308					ret.push( buttons[ idx ].inst );
50309				}
50310			}
50311		}
50312		else if ( typeof input === 'number' ) {
50313			// Index selector
50314			ret.push( buttons[ input ].inst );
50315		}
50316	};
50317	
50318	process( group );
50319
50320	return ret;
50321};
50322
50323/**
50324 * Button selector - select one or more buttons from a selector input so some
50325 * operation can be performed on them.
50326 * @param  {array} Button instances array that the selector should operate on
50327 * @param  {string|int|node|jQuery|array} Button selector - see
50328 *   `button-selector` documentation on the DataTables site
50329 * @return {array} Array of objects containing `inst` and `idx` properties of
50330 *   the selected buttons so you know which instance each button belongs to.
50331 * @static
50332 */
50333Buttons.buttonSelector = function ( insts, selector )
50334{
50335	var ret = [];
50336	var run = function ( selector, inst ) {
50337		var i, ien, j, jen;
50338		var buttons = [];
50339
50340		$.each( inst.s.buttons, function (i, v) {
50341			if ( v !== null ) {
50342				buttons.push( {
50343					node: v.node[0],
50344					name: v.name
50345				} );
50346			}
50347		} );
50348
50349		$.each( inst.s.subButtons, function (i, v) {
50350			$.each( v, function (j, w) {
50351				if ( w !== null ) {
50352					buttons.push( {
50353						node: w.node[0],
50354						name: w.name
50355					} );
50356				}
50357			} );
50358		} );
50359
50360		var nodes = $.map( buttons, function (v) {
50361			return v.node;
50362		} );
50363
50364		if ( $.isArray( selector ) || selector instanceof $ ) {
50365			for ( i=0, ien=selector.length ; i<ien ; i++ ) {
50366				run( selector[i], inst );
50367			}
50368			return;
50369		}
50370
50371		if ( selector === null || selector === undefined || selector === '*' ) {
50372			// Select all
50373			for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
50374				ret.push( {
50375					inst: inst,
50376					idx: inst.toIndex( buttons[i].node )
50377				} );
50378			}
50379		}
50380		else if ( typeof selector === 'number' ) {
50381			// Main button index selector
50382			ret.push( {
50383				inst: inst,
50384				idx: selector
50385			} );
50386		}
50387		else if ( typeof selector === 'string' ) {
50388			if ( selector.indexOf( ',' ) !== -1 ) {
50389				// Split
50390				var a = selector.split(',');
50391
50392				for ( i=0, ien=a.length ; i<ien ; i++ ) {
50393					run( $.trim(a[i]), inst );
50394				}
50395			}
50396			else if ( selector.match( /^\d+(\-\d+)?$/ ) ) {
50397				// Sub-button index selector
50398				ret.push( {
50399					inst: inst,
50400					idx: selector
50401				} );
50402			}
50403			else if ( selector.indexOf( ':name' ) !== -1 ) {
50404				// Button name selector
50405				var name = selector.replace( ':name', '' );
50406
50407				for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
50408					if ( buttons[i].name === name ) {
50409						ret.push( {
50410							inst: inst,
50411							idx: inst.toIndex( buttons[i].node )
50412						} );
50413					}
50414				}
50415			}
50416			else {
50417				// jQuery selector on the nodes
50418				$( nodes ).filter( selector ).each( function () {
50419					ret.push( {
50420						inst: inst,
50421						idx: inst.toIndex( this )
50422					} );
50423				} );
50424			}
50425		}
50426		else if ( typeof selector === 'object' && selector.nodeName ) {
50427			// Node selector
50428			var idx = $.inArray( selector, nodes );
50429
50430			if ( idx !== -1 ) {
50431				ret.push( {
50432					inst: inst,
50433					idx: inst.toIndex( nodes[ idx ] )
50434				} );
50435			}
50436		}
50437	};
50438
50439
50440	for ( var i=0, ien=insts.length ; i<ien ; i++ ) {
50441		var inst = insts[i];
50442
50443		run( selector, inst );
50444	}
50445
50446	return ret;
50447};
50448
50449
50450/**
50451 * Buttons defaults. For full documentation, please refer to the docs/option
50452 * directory or the DataTables site.
50453 * @type {Object}
50454 * @static
50455 */
50456Buttons.defaults = {
50457	buttons: [ 'copy', 'excel', 'csv', 'pdf', 'print' ],
50458	name: 'main',
50459	tabIndex: 0,
50460	dom: {
50461		container: {
50462			tag: 'div',
50463			className: 'dt-buttons'
50464		},
50465		collection: {
50466			tag: 'div',
50467			className: 'dt-button-collection'
50468		},
50469		button: {
50470			tag: 'a',
50471			className: 'dt-button',
50472			active: 'active',
50473			disabled: 'disabled'
50474		},
50475		buttonLiner: {
50476			tag: 'span',
50477			className: ''
50478		}
50479	}
50480};
50481
50482/**
50483 * Version information
50484 * @type {string}
50485 * @static
50486 */
50487Buttons.version = '1.1.0';
50488
50489
50490$.extend( _dtButtons, {
50491	collection: {
50492		text: function ( dt, button, config ) {
50493			return dt.i18n( 'buttons.collection', 'Collection' );
50494		},
50495		className: 'buttons-collection',
50496		action: function ( e, dt, button, config ) {
50497			var background;
50498			var host = button;
50499			var hostOffset = host.offset();
50500			var tableContainer = $( dt.table().container() );
50501			var multiLevel = false;
50502
50503			// Remove any old collection
50504			if ( $('div.dt-button-background').length ) {
50505				multiLevel = $('div.dt-button-collection').offset();
50506				$(document).trigger( 'click.dtb-collection' );
50507			}
50508
50509			config._collection
50510				.addClass( config.collectionLayout )
50511				.css( 'display', 'none' )
50512				.appendTo( 'body' )
50513				.fadeIn( config.fade );
50514
50515			var position = config._collection.css( 'position' );
50516
50517			if ( multiLevel && position === 'absolute' ) {
50518				config._collection.css( {
50519					top: multiLevel.top + 5, // magic numbers for a little offset
50520					left: multiLevel.left + 5
50521				} );
50522			}
50523			else if ( position === 'absolute' ) {
50524				config._collection.css( {
50525					top: hostOffset.top + host.outerHeight(),
50526					left: hostOffset.left
50527				} );
50528
50529				var listRight = hostOffset.left + config._collection.outerWidth();
50530				var tableRight = tableContainer.offset().left + tableContainer.width();
50531				if ( listRight > tableRight ) {
50532					config._collection.css( 'left', hostOffset.left - ( listRight - tableRight ) );
50533				}
50534			}
50535			else {
50536				// Fix position - centre on screen
50537				var top = config._collection.height() / 2;
50538				if ( top > $(window).height() / 2 ) {
50539					top = $(window).height() / 2;
50540				}
50541
50542				config._collection.css( 'marginTop', top*-1 );
50543			}
50544
50545			if ( config.background ) {
50546				Buttons.background( true, config.backgroundClassName, config.fade );
50547			}
50548
50549			// Need to break the 'thread' for the collection button being
50550			// activated by a click - it would also trigger this event
50551			setTimeout( function () {
50552				// This is bonkers, but if we don't have a click listener on the
50553				// background element, iOS Safari will ignore the body click
50554				// listener below. An empty function here is all that is
50555				// required to make it work...
50556				$('div.dt-button-background').on( 'click.dtb-collection', function () {} );
50557
50558				$('body').on( 'click.dtb-collection', function (e) {
50559					if ( ! $(e.target).parents().andSelf().filter( config._collection ).length ) {
50560						config._collection
50561							.fadeOut( config.fade, function () {
50562								config._collection.detach();
50563							} );
50564
50565						$('div.dt-button-background').off( 'click.dtb-collection' );
50566						Buttons.background( false, config.backgroundClassName, config.fade );
50567
50568						$('body').off( 'click.dtb-collection' );
50569					}
50570				} );
50571			}, 10 );
50572		},
50573		background: true,
50574		collectionLayout: '',
50575		backgroundClassName: 'dt-button-background',
50576		fade: 400
50577	},
50578	copy: function ( dt, conf ) {
50579		if ( _dtButtons.copyHtml5 ) {
50580			return 'copyHtml5';
50581		}
50582		if ( _dtButtons.copyFlash && _dtButtons.copyFlash.available( dt, conf ) ) {
50583			return 'copyFlash';
50584		}
50585	},
50586	csv: function ( dt, conf ) {
50587		// Common option that will use the HTML5 or Flash export buttons
50588		if ( _dtButtons.csvHtml5 && _dtButtons.csvHtml5.available( dt, conf ) ) {
50589			return 'csvHtml5';
50590		}
50591		if ( _dtButtons.csvFlash && _dtButtons.csvFlash.available( dt, conf ) ) {
50592			return 'csvFlash';
50593		}
50594	},
50595	excel: function ( dt, conf ) {
50596		// Common option that will use the HTML5 or Flash export buttons
50597		if ( _dtButtons.excelHtml5 && _dtButtons.excelHtml5.available( dt, conf ) ) {
50598			return 'excelHtml5';
50599		}
50600		if ( _dtButtons.excelFlash && _dtButtons.excelFlash.available( dt, conf ) ) {
50601			return 'excelFlash';
50602		}
50603	},
50604	pdf: function ( dt, conf ) {
50605		// Common option that will use the HTML5 or Flash export buttons
50606		if ( _dtButtons.pdfHtml5 && _dtButtons.pdfHtml5.available( dt, conf ) ) {
50607			return 'pdfHtml5';
50608		}
50609		if ( _dtButtons.pdfFlash && _dtButtons.pdfFlash.available( dt, conf ) ) {
50610			return 'pdfFlash';
50611		}
50612	},
50613	pageLength: function ( dt, conf ) {
50614		var lengthMenu = dt.settings()[0].aLengthMenu;
50615		var vals = $.isArray( lengthMenu[0] ) ? lengthMenu[0] : lengthMenu;
50616		var lang = $.isArray( lengthMenu[0] ) ? lengthMenu[1] : lengthMenu;
50617		var text = function ( dt ) {
50618			return dt.i18n( 'buttons.pageLength', {
50619				"-1": 'Show all rows',
50620				_:    'Show %d rows'
50621			}, dt.page.len() );
50622		};
50623
50624		return {
50625			extend: 'collection',
50626			text: text,
50627			className: 'buttons-page-length',
50628			buttons: $.map( vals, function ( val, i ) {
50629				return {
50630					text: lang[i],
50631					action: function ( e, dt, button, conf ) {
50632						dt.page.len( val ).draw();
50633					},
50634					init: function ( dt, node, conf ) {
50635						var that = this;
50636						var fn = function () {
50637							that.active( dt.page.len() === val );
50638						};
50639
50640						dt.on( 'length.dt'+conf.namespace, fn );
50641						fn();
50642					},
50643					destroy: function ( dt, node, conf ) {
50644						dt.off( 'length.dt'+conf.namespace );
50645					}
50646				};
50647			} ),
50648			init: function ( dt, node, conf ) {
50649				var that = this;
50650				dt.on( 'length.dt'+conf.namespace, function () {
50651					that.text( text( dt ) );
50652				} );
50653			},
50654			destroy: function ( dt, node, conf ) {
50655				dt.off( 'length.dt'+conf.namespace );
50656			}
50657		};
50658	}
50659} );
50660
50661
50662/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
50663 * DataTables API
50664 *
50665 * For complete documentation, please refer to the docs/api directory or the
50666 * DataTables site
50667 */
50668
50669// Buttons group and individual button selector
50670DataTable.Api.register( 'buttons()', function ( group, selector ) {
50671	// Argument shifting
50672	if ( selector === undefined ) {
50673		selector = group;
50674		group = undefined;
50675	}
50676
50677	return this.iterator( true, 'table', function ( ctx ) {
50678		if ( ctx._buttons ) {
50679			return Buttons.buttonSelector(
50680				Buttons.instanceSelector( group, ctx._buttons ),
50681				selector
50682			);
50683		}
50684	}, true );
50685} );
50686
50687// Individual button selector
50688DataTable.Api.register( 'button()', function ( group, selector ) {
50689	// just run buttons() and truncate
50690	var buttons = this.buttons( group, selector );
50691
50692	if ( buttons.length > 1 ) {
50693		buttons.splice( 1, buttons.length );
50694	}
50695
50696	return buttons;
50697} );
50698
50699// Active buttons
50700DataTable.Api.register( ['buttons().active()', 'button().active()'], function ( flag ) {
50701	return this.each( function ( set ) {
50702		set.inst.active( set.idx, flag );
50703	} );
50704} );
50705
50706// Get / set button action
50707DataTable.Api.registerPlural( 'buttons().action()', 'button().action()', function ( action ) {
50708	if ( action === undefined ) {
50709		return this.map( function ( set ) {
50710			 return set.inst.action( set.idx );
50711		} );
50712	}
50713
50714	return this.each( function ( set ) {
50715		set.inst.action( set.idx, action );
50716	} );
50717} );
50718
50719// Enable / disable buttons
50720DataTable.Api.register( ['buttons().enable()', 'button().enable()'], function ( flag ) {
50721	return this.each( function ( set ) {
50722		set.inst.enable( set.idx, flag );
50723	} );
50724} );
50725
50726// Disable buttons
50727DataTable.Api.register( ['buttons().disable()', 'button().disable()'], function () {
50728	return this.each( function ( set ) {
50729		set.inst.disable( set.idx );
50730	} );
50731} );
50732
50733// Get button nodes
50734DataTable.Api.registerPlural( 'buttons().nodes()', 'button().node()', function () {
50735	var jq = $();
50736
50737	// jQuery will automatically reduce duplicates to a single entry
50738	$( this.each( function ( set ) {
50739		jq = jq.add( set.inst.node( set.idx ) );
50740	} ) );
50741
50742	return jq;
50743} );
50744
50745// Get / set button text (i.e. the button labels)
50746DataTable.Api.registerPlural( 'buttons().text()', 'button().text()', function ( label ) {
50747	if ( label === undefined ) {
50748		return this.map( function ( set ) {
50749			 return set.inst.text( set.idx );
50750		} );
50751	}
50752
50753	return this.each( function ( set ) {
50754		set.inst.text( set.idx, label );
50755	} );
50756} );
50757
50758// Trigger a button's action
50759DataTable.Api.registerPlural( 'buttons().trigger()', 'button().trigger()', function () {
50760	return this.each( function ( set ) {
50761		set.inst.node( set.idx ).trigger( 'click' );
50762	} );
50763} );
50764
50765// Get the container elements for the button sets selected
50766DataTable.Api.registerPlural( 'buttons().containers()', 'buttons().container()', function () {
50767	var jq = $();
50768
50769	// jQuery will automatically reduce duplicates to a single entry
50770	$( this.each( function ( set ) {
50771		jq = jq.add( set.inst.container() );
50772	} ) );
50773
50774	return jq;
50775} );
50776
50777// Add a new button
50778DataTable.Api.register( 'button().add()', function ( idx, conf ) {
50779	if ( this.length === 1 ) {
50780		this[0].inst.add( idx, conf );
50781	}
50782
50783	return this.button( idx );
50784} );
50785
50786// Destroy the button sets selected
50787DataTable.Api.register( 'buttons().destroy()', function ( idx ) {
50788	this.pluck( 'inst' ).unique().each( function ( inst ) {
50789		inst.destroy();
50790	} );
50791
50792	return this;
50793} );
50794
50795// Remove a button
50796DataTable.Api.registerPlural( 'buttons().remove()', 'buttons().remove()', function () {
50797	// Need to split into prep and commit so the indexes remain constant during the remove
50798	this.each( function ( set ) {
50799		set.inst.removePrep( set.idx );
50800	} );
50801
50802	this.pluck( 'inst' ).unique().each( function ( inst ) {
50803		inst.removeCommit();
50804	} );
50805
50806	return this;
50807} );
50808
50809// Information box that can be used by buttons
50810var _infoTimer;
50811DataTable.Api.register( 'buttons.info()', function ( title, message, time ) {
50812	var that = this;
50813
50814	if ( title === false ) {
50815		$('#datatables_buttons_info').fadeOut( function () {
50816			$(this).remove();
50817		} );
50818		clearTimeout( _infoTimer );
50819		_infoTimer = null;
50820
50821		return this;
50822	}
50823
50824	if ( _infoTimer ) {
50825		clearTimeout( _infoTimer );
50826	}
50827
50828	if ( $('#datatables_buttons_info').length ) {
50829		$('#datatables_buttons_info').remove();
50830	}
50831
50832	title = title ? '<h2>'+title+'</h2>' : '';
50833
50834	$('<div id="datatables_buttons_info" class="dt-button-info"/>')
50835		.html( title )
50836		.append( $('<div/>')[ typeof message === 'string' ? 'html' : 'append' ]( message ) )
50837		.css( 'display', 'none' )
50838		.appendTo( 'body' )
50839		.fadeIn();
50840
50841	if ( time !== undefined && time !== 0 ) {
50842		_infoTimer = setTimeout( function () {
50843			that.buttons.info( false );
50844		}, time );
50845	}
50846
50847	return this;
50848} );
50849
50850// Get data from the table for export - this is common to a number of plug-in
50851// buttons so it is included in the Buttons core library
50852DataTable.Api.register( 'buttons.exportData()', function ( options ) {
50853	if ( this.context.length ) {
50854		return _exportData( new DataTable.Api( this.context[0] ), options );
50855	}
50856} );
50857
50858
50859var _exportTextarea = $('<textarea/>')[0];
50860var _exportData = function ( dt, inOpts )
50861{
50862	var config = $.extend( true, {}, {
50863		rows:           null,
50864		columns:        '',
50865		modifier:       {
50866			search: 'applied',
50867			order:  'applied'
50868		},
50869		orthogonal:     'display',
50870		stripHtml:      true,
50871		stripNewlines:  true,
50872		decodeEntities: true,
50873		trim:           true,
50874		format:         {
50875			header: function ( d ) {
50876				return strip( d );
50877			},
50878			footer: function ( d ) {
50879				return strip( d );
50880			},
50881			body: function ( d ) {
50882				return strip( d );
50883			}
50884		}
50885	}, inOpts );
50886
50887	var strip = function ( str ) {
50888		if ( typeof str !== 'string' ) {
50889			return str;
50890		}
50891
50892		if ( config.stripHtml ) {
50893			str = str.replace( /<.*?>/g, '' );
50894		}
50895
50896		if ( config.trim ) {
50897			str = str.replace( /^\s+|\s+$/g, '' );
50898		}
50899
50900		if ( config.stripNewlines ) {
50901			str = str.replace( /\n/g, ' ' );
50902		}
50903
50904		if ( config.decodeEntities ) {
50905			_exportTextarea.innerHTML = str;
50906			str = _exportTextarea.value;
50907		}
50908
50909		return str;
50910	};
50911
50912
50913	var header = dt.columns( config.columns ).indexes().map( function (idx, i) {
50914		return config.format.header( dt.column( idx ).header().innerHTML, idx );
50915	} ).toArray();
50916
50917	var footer = dt.table().footer() ?
50918		dt.columns( config.columns ).indexes().map( function (idx, i) {
50919			var el = dt.column( idx ).footer();
50920			return config.format.footer( el ? el.innerHTML : '', idx );
50921		} ).toArray() :
50922		null;
50923
50924	var rowIndexes = dt.rows( config.rows, config.modifier ).indexes().toArray();
50925	var cells = dt
50926		.cells( rowIndexes, config.columns )
50927		.render( config.orthogonal )
50928		.toArray();
50929	var columns = header.length;
50930	var rows = columns > 0 ? cells.length / columns : 0;
50931	var body = new Array( rows );
50932	var cellCounter = 0;
50933
50934	for ( var i=0, ien=rows ; i<ien ; i++ ) {
50935		var row = new Array( columns );
50936
50937		for ( var j=0 ; j<columns ; j++ ) {
50938			row[j] = config.format.body( cells[ cellCounter ], j, i );
50939			cellCounter++;
50940		}
50941
50942		body[i] = row;
50943	}
50944
50945	return {
50946		header: header,
50947		footer: footer,
50948		body:   body
50949	};
50950};
50951
50952
50953/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
50954 * DataTables interface
50955 */
50956
50957// Attach to DataTables objects for global access
50958$.fn.dataTable.Buttons = Buttons;
50959$.fn.DataTable.Buttons = Buttons;
50960
50961
50962
50963// DataTables creation - check if the buttons have been defined for this table,
50964// they will have been if the `B` option was used in `dom`, otherwise we should
50965// create the buttons instance here so they can be inserted into the document
50966// using the API. Listen for `init` for compatibility with pre 1.10.10, but to
50967// be removed in future.
50968$(document).on( 'init.dt plugin-init.dt', function (e, settings, json) {
50969	if ( e.namespace !== 'dt' ) {
50970		return;
50971	}
50972
50973	var opts = settings.oInit.buttons || DataTable.defaults.buttons;
50974
50975	if ( opts && ! settings._buttons ) {
50976		new Buttons( settings, opts ).container();
50977	}
50978} );
50979
50980// DataTables `dom` feature option
50981DataTable.ext.feature.push( {
50982	fnInit: function( settings ) {
50983		var api = new DataTable.Api( settings );
50984		var opts = api.init().buttons || DataTable.defaults.buttons;
50985
50986		return new Buttons( api, opts ).container();
50987	},
50988	cFeature: "B"
50989} );
50990
50991
50992return Buttons;
50993}));
50994
50995/*!
50996 RowReorder 1.2.3
50997 2015-2017 SpryMedia Ltd - datatables.net/license
50998*/
50999(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(f){return d(f,window,document)}):"object"===typeof exports?module.exports=function(f,g){f||(f=window);if(!g||!g.fn.dataTable)g=require("datatables.net")(f,g).$;return d(g,f,f.document)}:d(jQuery,window,document)})(function(d,f,g,m){var h=d.fn.dataTable,k=function(c,b){if(!h.versionCheck||!h.versionCheck("1.10.8"))throw"DataTables RowReorder requires DataTables 1.10.8 or newer";this.c=d.extend(!0,{},h.defaults.rowReorder,
51000k.defaults,b);this.s={bodyTop:null,dt:new h.Api(c),getDataFn:h.ext.oApi._fnGetObjectDataFn(this.c.dataSrc),middles:null,scroll:{},scrollInterval:null,setDataFn:h.ext.oApi._fnSetObjectDataFn(this.c.dataSrc),start:{top:0,left:0,offsetTop:0,offsetLeft:0,nodes:[]},windowHeight:0,documentOuterHeight:0,domCloneOuterHeight:0};this.dom={clone:null,dtScroll:d("div.dataTables_scrollBody",this.s.dt.table().container())};var a=this.s.dt.settings()[0],e=a.rowreorder;if(e)return e;a.rowreorder=this;this._constructor()};
51001d.extend(k.prototype,{_constructor:function(){var c=this,b=this.s.dt,a=d(b.table().node());"static"===a.css("position")&&a.css("position","relative");d(b.table().container()).on("mousedown.rowReorder touchstart.rowReorder",this.c.selector,function(a){if
51001(c.c.enable){var i=d(this).closest("tr"),j=b.row(i);if(j.any())return c._emitEvent("pre-row-reorder",{node:j.node(),index:j.index()}),c._mouseDown(a,i),!1}});b.on("destroy.rowReorder",function(){d(b.table().container()).off(".rowReorder");b.off(".rowReorder")})},
51002_cachePositions:function(){var c=this.s.dt,b=d(c.table().node()).find("thead").outerHeight(),a=d.unique(c.rows({page:"current"}).nodes().toArray()),e=d.map(a,function(a){return d(a).position().top-b}),a=d.map(e,function(a,b){return e.length<b-1?(a+e[b+1])/2:(a+a+d(c.row(":last-child").node()).outerHeight())/2});this.s.middles=a;this.s.bodyTop=d(c.table().body()).offset().top;this.s.windowHeight=d(f).height();this.s.documentOuterHeight=d(g).outerHeight()},_clone:function(c){var b=d(this.s.dt.table().node().cloneNode(!1)).addClass("dt-rowReorder-float").append("<tbody/>").append(c.clone(!1)),
51003a=c.outerWidth(),e=c.outerHeight(),i=c.children().map(function(){return d(this).width()});b.width(a).height(e).find("tr").children().each(function(a){this.style.width=i[a]+"px"});b.appendTo("body");this.dom.clone=b;this.s.domCloneOuterHeight=b.outerHeight()},_clonePosition:function(c){var b=this.s.start,a=this._eventToPage(c,"Y")-b.top,c=this._eventToPage(c,"X")-b.left,e=this.c.snapX,a=a+b.offsetTop,b=!0===e?b.offsetLeft:"number"===typeof e?b.offsetLeft+e:c+b.offsetLeft;0>a?a=0:a+this.s.domCloneOuterHeight>
51004this.s.documentOuterHeight&&(a=this.s.documentOuterHeight-this.s.domCloneOuterHeight);this.dom.clone.css({top:a,left:b})},_emitEvent:function(c,b){this.s.dt.iterator("table",function(a){d(a.nTable).triggerHandler(c+".dt",b)})},_eventToPage:function(c,b){return-1!==c.type.indexOf("touch")?c.originalEvent.touches[0]["page"+b]:c["page"+b]},_mouseDown:function(c,b){var a=this,e=this.s.dt,i=this.s.start,j=b.offset();i.top=this._eventToPage(c,"Y");i.left=this._eventToPage(c,"X");i.offsetTop=j.top;i.offsetLeft=
51005j.left;i.nodes=d.unique(e.rows({page:"current"}).nodes().toArray());this._cachePositions();this._clone(b);this._clonePosition(c);this.dom.target=b;b.addClass("dt-rowReorder-moving");d(g).on("mouseup.rowReorder touchend.rowReorder",function(b){a._mouseUp(b)}).on("mousemove.rowReorder touchmove.rowReorder",function(b){a._mouseMove(b)});d(f).width()===d(g).width()&&d(g.body).addClass("dt-rowReorder-noOverflow");e=this.dom.dtScroll;this.s.scroll={windowHeight:d(f).height(),windowWidth:d(f).width(),dtTop:e.length?
51006e.offset().top:null,dtLeft:e.length?e.offset().left:null,dtHeight:e.length?e.outerHeight():null,dtWidth:e.length?e.outerWidth():null}},_mouseMove:function(c){this._clonePosition(c);for(var b=this._eventToPage(c,"Y")-this.s.bodyTop,a=this.s.middles,e=null,i=this.s.dt,j=i.table().body(),g=0,f=a.length;g<f;g++)if(b<a[g]){e=g;break}null===e&&(e=a.length);if(null===this.s.lastInsert||this.s.lastInsert!==e)0===e?this.dom.target.prependTo(j):(b=d.unique(i.rows({page:"current"}).nodes().toArray()),e>this.s.lastInsert?
51007this.dom.target.insertAfter(b[e-1]):this.dom.target.insertBefore(b[e])),this._cachePositions(),this.s.lastInsert=e;this._shiftScroll(c)},_mouseUp:function(){var c=this,b=this.s.dt,a,e,i=this.c.dataSrc;this.dom.clone.remove();this.dom.clone=null;this.dom.target.removeClass("dt-rowReorder-moving");d(g).off(".rowReorder");d(g.body).removeClass("dt-rowReorder-noOverflow");clearInterval(this.s.scrollInterval);this.s.scrollInterval=null;var j=this.s.start.nodes,f=d.unique(b.rows({page:"current"}).nodes().toArray()),
51008k={},h=[],l=[],n=this.s.getDataFn,m=this.s.setDataFn;a=0;for(e=j.length;a<e;a++)if(j[a]!==f[a]){var o=b.row(f[a]).id(),s=b.row(f[a]).data(),p=b.row(j[a]).data();o&&(k[o]=n(p));h.push({node:f[a],oldData:n(s),newData:n(p),newPosition:a,oldPosition:d.inArray(f[a],j)});l.push(f[a])}var q=[h,{dataSrc:i,nodes:l,values:k,triggerRow:b.row(this.dom.target)}];this._emitEvent("row-reorder",q);var r=function(){if(c.c.update){a=0;for(e=h.length;a<e;a++){var d=b.row(h[a].node).data();m(d,h[a].newData);b.columns().every(function(){this.dataSrc()===
51009i&&b.cell(h[a].node,this.index()).invalidate("data")})}c._emitEvent("row-reordered",q);b.draw(!1)}};this.c.editor?(this.c.enable=!1,this.c.editor.edit(l,!1,d.extend({submit:"changed"},this.c.formOptions)).multiSet(i,k).one("submitUnsuccessful.rowReorder",function(){b.draw(!1)}).one("submitSuccess.rowReorder",function(){r()}).one("submitComplete",function(){c.c.enable=!0;c.c.editor.off(".rowReorder")}).submit()):r()},_shiftScroll:function(c){var b=this,a=this.s.scroll,e=!1,d=c.pageY-g.body.scrollTop,
51010f,h;65>d?f=-5:d>a.windowHeight-65&&(f=5);null!==a.dtTop&&c.pageY<a.dtTop+65?h=-5:null!==a.dtTop&&c.pageY>a.dtTop+a.dtHeight-65&&(h=5);f||h?(a.windowVert=f,a.dtVert=h,e=!0):this.s.scrollInterval&&(clearInterval(this.s.scrollInterval),this.s.scrollInterval=null);!this.s.scrollInterval&&e&&(this.s.scrollInterval=setInterval(function(){if(a.windowVert)g.body.scrollTop=g.body.scrollTop+a.windowVert;if(a.dtVert){var c=b.dom.dtScroll[0];if(a.dtVert)c.scrollTop=c.scrollTop+a.dtVert}},20))}});k.defaults={dataSrc:0,
51011editor:null,enable:!0,formOptions:{},selector:"td:first-child",snapX:!1,update:!0};var l=d.fn.dataTable.Api;l.register("rowReorder()",function(){return this});l.register("rowReorder.enable()",function(c){c===m&&(c=!0);return this.iterator("table",function(b){b.rowreorder&&(b.rowreorder.c.enable=c)})});l.register("rowReorder.disable()",function(){return this.iterator("table",function(c){c.rowreorder&&(c.rowreorder.c.enable=!1)})});k.version="1.2.3";d.fn.dataTable.RowReorder=k;d.fn.DataTable.RowReorder=
51012k;d(g).on("init.dt.dtr",function(c,b){if("dt"===c.namespace){var a=b.oInit.rowReorder,e=h.defaults.rowReorder;if(a||e)e=d.extend({},a,e),!1!==a&&new k(b,e)}});return k});
51013
51014/**
51015 * When searching a table with accented characters, it can be frustrating to have
51016 * an input such as _Zurich_ not match _Zürich_ in the table (`u !== ü`). This
51017 * type based search plug-in replaces the built-in string formatter in
51018 * DataTables with a function that will replace the accented characters
51019 * with their unaccented counterparts for fast and easy filtering.
51020 * 
51021 * Note that this plug-in uses the Javascript I18n API that was introduced in
51022 * ES6. For older browser's this plug-in will have no effect.
51023 *
51024 *  @summary Replace accented characters with unaccented counterparts
51025 *  @name Accent neutralise
51026 *  @author Allan Jardine
51027 *
51028 *  @example
51029 *    $(document).ready(function() {
51030 *        $('#example').dataTable();
51031 *    } );
51032 */
51033
51034(function(){
51035
51036function removeAccents ( data ) {
51037    if ( data.normalize ) {
51038        // Use I18n API if avaiable to split characters and accents, then remove
51039        // the accents wholesale. Note that we use the original data as well as
51040        // the new to allow for searching of either form.
51041        var normalizedData = data
51042            .normalize('NFD')
51043            .replace(/[\u0300-\u036f]/g, '');
51044
51045        data = data === normalizedData ? data : normalizedData + ' ' + data;
51046    }
51047
51048    return data;
51049}
51050
51051var searchType = jQuery.fn.DataTable.ext.type.search;
51052
51053searchType.string = function ( data ) {
51054    return ! data ?
51055        '' :
51056        typeof data === 'string' ?
51057            removeAccents( data ) :
51058            data;
51059};
51060
51061searchType.html = function ( data ) {
51062    return ! data ?
51063        '' :
51064        typeof data === 'string' ?
51065            removeAccents( data.replace( /<.*?>/g, '' ) ) :
51066            data;
51067};
51068
51069}());
51070// Textarea and select clone() bug workaround | Spencer Tipping
51071// Licensed under the terms of the MIT source code license
51072
51073// Motivation.
51074// jQuery's clone() method works in most cases, but it fails to copy the value of textareas and select elements. This patch replaces jQuery's clone() method with a wrapper that fills in the
51075// values after the fact.
51076
51077// An interesting error case submitted by Piotr Przybyl: If two <select> options had the same value, the clone() method would select the wrong one in the cloned box. The fix, suggested by Piotr
51078// and implemented here, is to use the selectedIndex property on the <select> box itself rather than relying on jQuery's value-based val().
51079
51080(function (original) {
51081  jQuery.fn.clone = function () {
51082    var result           = original.apply(this, arguments),
51083        my_textareas     = this.find('textarea').add(this.filter('textarea')),
51084        result_textareas = result.find('textarea').add(result.filter('textarea')),
51085        my_selects       = this.find('select').add(this.filter('select')),
51086        result_selects   = result.find('select').add(result.filter('select'));
51087
51088    for (var i = 0, l = my_textareas.length; i < l; ++i) $(result_textareas[i]).val($(my_textareas[i]).val());
51089    for (var i = 0, l = my_selects.length;   i < l; ++i) {
51090      for (var j = 0, m = my_selects[i].options.length; j < m; ++j) {
51091        if (my_selects[i].options[j].selected === true) {
51092          result_selects[i].options[j].selected = true;
51093        }
51094      }
51095    }
51096    return result;
51097  };
51098}) (jQuery.fn.clone);
51099
51100// Generated by SDoc 
51101
51102/*!
51103 * jQuery Cookie Plugin v1.3.1
51104 * https://github.com/carhartl/jquery-cookie
51105 *
51106 * Copyright 2013 Klaus Hartl
51107 * Released under the MIT license
51108 */
51109(function (factory)
51110{
51111    if (typeof define === 'function' && define.amd)
51112    {
51113        // AMD. Register as anonymous module.
51114        define(['jquery'], factory);
51115    } else
51116    {
51117        // Browser globals.
51118        factory(jQuery);
51119    }
51120}(function ($)
51121{
51122
51123    var pluses = /\+/g;
51124
51125    function raw(s)
51126    {
51127        return s;
51128    }
51129
51130    function decoded(s)
51131    {
51132        return decodeURIComponent(s.replace(pluses, ' '));
51133    }
51134
51135    function converted(s)
51136    {
51137        if (s.indexOf('"') === 0)
51138        {
51139            // This is a quoted cookie as according to RFC2068, unescape
51140            s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
51141        }
51142        try
51143        {
51144            return config.json ? JSON.parse(s) : s;
51145        } catch (er) { }
51146    }
51147
51148    var config = $.cookie = function (key, value, options)
51149    {
51150
51151        // write
51152        if (value !== undefined)
51153        {
51154            options = $.extend({}, config.defaults, options);
51155
51156            if (typeof options.expires === 'number')
51157            {
51158                var days = options.expires, t = options.expires = new Date();
51159                t.setDate(t.getDate() + days);
51160            }
51161
51162            value = config.json ? JSON.stringify(value) : String(value);
51163
51164            return (document.cookie = [
51165				config.raw ? key : encodeURIComponent(key),
51166				'=',
51167				config.raw ? value : encodeURIComponent(value),
51168				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
51169				options.path ? '; path=' + options.path : '',
51170				options.domain ? '; domain=' + options.domain : '',
51171				options.secure ? '; secure' : ''
51172            ].join(''));
51173        }
51174
51175        // read
51176        var decode = config.raw ? raw : decoded;
51177        var cookies = document.cookie.split('; ');
51178        var result = key ? undefined : {};
51179        for (var i = 0, l = cookies.length; i < l; i++)
51180        {
51181            var parts = cookies[i].split('=');
51182            var name = decode(parts.shift());
51183            var cookie = decode(parts.join('='));
51184
51185            if (key && key === name)
51186            {
51187                result = converted(cookie);
51188                break;
51189            }
51190
51191            if (!key)
51192            {
51193                result[name] = converted(cookie);
51194            }
51195        }
51196
51197        return result;
51198    };
51199
51200    config.defaults = {};
51201
51202    $.removeCookie = function (key, options)
51203    {
51204        if ($.cookie(key) !== undefined)
51205        {
51206            // Must not alter options, thus extending a fresh object...
51207            $.cookie(key, '', $.extend({}, options, { expires: -1 }));
51208            return true;
51209        }
51210        return false;
51211    };
51212
51213}));
51214/*!
51215 * jQuery Validation Plugin
51216 *
51217 * http://jqueryvalidation.org/
51218 *
51219 * Copyright (c) 2015 Jörn Zaefferer
51220 * Released under the MIT license
51221 */
51222(function( factory ) {
51223	if ( typeof define === "function" && define.amd ) {
51224		define( ["jquery"], factory );
51225	} else {
51226		factory( jQuery );
51227	}
51228}(function( $ ) {
51229
51230$.extend($.fn, {
51231	// http://jqueryvalidation.org/validate/
51232	validate: function( options ) {
51233
51234		// if nothing is selected, return nothing; can't chain anyway
51235		if ( !this.length ) {
51236			if ( options && options.debug && window.console ) {
51237				console.warn( "Nothing selected, can't validate, returning nothing." );
51238			}
51239			return;
51240		}
51241
51242		// check if a validator for this form was already created
51243		var validator = $.data( this[ 0 ], "validator" );
51244		if ( validator ) {
51245			return validator;
51246		}
51247
51248		// Add novalidate tag if HTML5.
51249		this.attr( "novalidate", "novalidate" );
51250
51251		validator = new $.validator( options, this[ 0 ] );
51252		$.data( this[ 0 ], "validator", validator );
51253
51254		if ( validator.settings.onsubmit ) {
51255
51256			this.on( "click.validate", ":submit", function( event ) {
51257				if ( validator.settings.submitHandler ) {
51258					validator.submitButton = event.target;
51259				}
51260
51261				// allow suppressing validation by adding a cancel class to the submit button
51262				if ( $( this ).hasClass( "cancel" ) ) {
51263					validator.cancelSubmit = true;
51264				}
51265
51266				// allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
51267				if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
51268					validator.cancelSubmit = true;
51269				}
51270			});
51271
51272			// validate the form on submit
51273			this.on( "submit.validate", function( event ) {
51274				if ( validator.settings.debug ) {
51275					// prevent form submit to be able to see console output
51276					event.preventDefault();
51277				}
51278				function handle() {
51279					var hidden, result;
51280					if ( validator.settings.submitHandler ) {
51281						if ( validator.submitButton ) {
51282							// insert a hidden input as a replacement for the missing submit button
51283							hidden = $( "<input type='hidden'/>" )
51284								.attr( "name", validator.submitButton.name )
51285								.val( $( validator.submitButton ).val() )
51286								.appendTo( validator.currentForm );
51287						}
51288						result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
51289						if ( validator.submitButton ) {
51290							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
51291							hidden.remove();
51292						}
51293						if ( result !== undefined ) {
51294							return result;
51295						}
51296						return false;
51297					}
51298					return true;
51299				}
51300
51301				// prevent submit for invalid forms or custom submit handlers
51302				if ( validator.cancelSubmit ) {
51303					validator.cancelSubmit = false;
51304					return handle();
51305				}
51306				if ( validator.form() ) {
51307					if ( validator.pendingRequest ) {
51308						validator.formSubmitted = true;
51309						return false;
51310					}
51311					return handle();
51312				} else {
51313					validator.focusInvalid();
51314					return false;
51315				}
51316			});
51317		}
51318
51319		return validator;
51320	},
51321	// http://jqueryvalidation.org/valid/
51322	valid: function() {
51323		var valid, validator, errorList;
51324
51325		if ( $( this[ 0 ] ).is( "form" ) ) {
51326			valid = this.validate().form();
51327		} else {
51328			errorList = [];
51329			valid = true;
51330			validator = $( this[ 0 ].form ).validate();
51331			this.each( function() {
51332				valid = validator.element( this ) && valid;
51333				errorList = errorList.concat( validator.errorList );
51334			});
51335			validator.errorList = errorList;
51336		}
51337		return valid;
51338	},
51339
51340	// http://jqueryvalidation.org/rules/
51341	rules: function( command, argument ) {
51342		var element = this[ 0 ],
51343			settings, staticRules, existingRules, data, param, filtered;
51344
51345		if ( command ) {
51346			settings = $.data( element.form, "validator" ).settings;
51347			staticRules = settings.rules;
51348			existingRules = $.validator.staticRules( element );
51349			switch ( command ) {
51350			case "add":
51351				$.extend( existingRules, $.validator.normalizeRule( argument ) );
51352				// remove messages from rules, but allow them to be set separately
51353				delete existingRules.messages;
51354				staticRules[ element.name ] = existingRules;
51355				if ( argument.messages ) {
51356					settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
51357				}
51358				break;
51359			case "remove":
51360				if ( !argument ) {
51361					delete staticRules[ element.name ];
51362					return existingRules;
51363				}
51364				filtered = {};
51365				$.each( argument.split( /\s/ ), function( index, method ) {
51366					filtered[ method ] = existingRules[ method ];
51367					delete existingRules[ method ];
51368					if ( method === "required" ) {
51369						$( element ).removeAttr( "aria-required" );
51370					}
51371				});
51372				return filtered;
51373			}
51374		}
51375
51376		data = $.validator.normalizeRules(
51377		$.extend(
51378			{},
51379			$.validator.classRules( element ),
51380			$.validator.attributeRules( element ),
51381			$.validator.dataRules( element ),
51382			$.validator.staticRules( element )
51383		), element );
51384
51385		// make sure required is at front
51386		if ( data.required ) {
51387			param = data.required;
51388			delete data.required;
51389			data = $.extend( { required: param }, data );
51390			$( element ).attr( "aria-required", "true" );
51391		}
51392
51393		// make sure remote is at back
51394		if ( data.remote ) {
51395			param = data.remote;
51396			delete data.remote;
51397			data = $.extend( data, { remote: param });
51398		}
51399
51400		return data;
51401	}
51402});
51403
51404// Custom selectors
51405$.extend( $.expr[ ":" ], {
51406	// http://jqueryvalidation.org/blank-selector/
51407	blank: function( a ) {
51408		return !$.trim( "" + $( a ).val() );
51409	},
51410	// http://jqueryvalidation.org/filled-selector/
51411	filled: function( a ) {
51412		return !!$.trim( "" + $( a ).val() );
51413	},
51414	// http://jqueryvalidation.org/unchecked-selector/
51415	unchecked: function( a ) {
51416		return !$( a ).prop( "checked" );
51417	}
51418});
51419
51420// constructor for validator
51421$.validator = function( options, form ) {
51422	this.settings = $.extend( true, {}, $.validator.defaults, options );
51423	this.currentForm = form;
51424	this.init();
51425};
51426
51427// http://jqueryvalidation.org/jQuery.validator.format/
51428$.validator.format = function( source, params ) {
51429	if ( arguments.length === 1 ) {
51430		return function() {
51431			var args = $.makeArray( arguments );
51432			args.unshift( source );
51433			return $.validator.format.apply( this, args );
51434		};
51435	}
51436	if ( arguments.length > 2 && params.constructor !== Array  ) {
51437		params = $.makeArray( arguments ).slice( 1 );
51438	}
51439	if ( params.constructor !== Array ) {
51440		params = [ params ];
51441	}
51442	$.each( params, function( i, n ) {
51443		source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
51444			return n;
51445		});
51446	});
51447	return source;
51448};
51449
51450$.extend( $.validator, {
51451
51452	defaults: {
51453		messages: {},
51454		groups: {},
51455		rules: {},
51456		errorClass: "error",
51457		validClass: "valid",
51458		errorElement: "label",
51459		focusCleanup: false,
51460		focusInvalid: true,
51461		errorContainer: $( [] ),
51462		errorLabelContainer: $( [] ),
51463		onsubmit: true,
51464		ignore: ":hidden",
51465		ignoreTitle: false,
51466		onfocusin: function( element ) {
51467			this.lastActive = element;
51468
51469			// Hide error label and remove error class on focus if enabled
51470			if ( this.settings.focusCleanup ) {
51471				if ( this.settings.unhighlight ) {
51472					this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.val
vendor: 4,643 bytes, lines 51472-51602
51472idClass );
51473				}
51474				this.hideThese( this.errorsFor( element ) );
51475			}
51476		},
51477		onfocusout: function( element ) {
51478			if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
51479				this.element( element );
51480			}
51481		},
51482		onkeyup: function( element, event ) {
51483			// Avoid revalidate the field when pressing one of the following keys
51484			// Shift       => 16
51485			// Ctrl        => 17
51486			// Alt         => 18
51487			// Caps lock   => 20
51488			// End         => 35
51489			// Home        => 36
51490			// Left arrow  => 37
51491			// Up arrow    => 38
51492			// Right arrow => 39
51493			// Down arrow  => 40
51494			// Insert      => 45
51495			// Num lock    => 144
51496			// AltGr key   => 225
51497			var excludedKeys = [
51498				16, 17, 18, 20, 35, 36, 37,
51499				38, 39, 40, 45, 144, 225
51500			];
51501
51502			if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
51503				return;
51504			} else if ( element.name in this.submitted || element === this.lastElement ) {
51505				this.element( element );
51506			}
51507		},
51508		onclick: function( element ) {
51509			// click on selects, radiobuttons and checkboxes
51510			if ( element.name in this.submitted ) {
51511				this.element( element );
51512
51513			// or option elements, check parent select in that case
51514			} else if ( element.parentNode.name in this.submitted ) {
51515				this.element( element.parentNode );
51516			}
51517		},
51518		highlight: function( element, errorClass, validClass ) {
51519			if ( element.type === "radio" ) {
51520				this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
51521			} else {
51522				$( element ).addClass( errorClass ).removeClass( validClass );
51523			}
51524		},
51525		unhighlight: function( element, errorClass, validClass ) {
51526			if ( element.type === "radio" ) {
51527				this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
51528			} else {
51529				$( element ).removeClass( errorClass ).addClass( validClass );
51530			}
51531		}
51532	},
51533
51534	// http://jqueryvalidation.org/jQuery.validator.setDefaults/
51535	setDefaults: function( settings ) {
51536		$.extend( $.validator.defaults, settings );
51537	},
51538
51539	messages: {
51540		required: "This field is required.",
51541		remote: "Please fix this field.",
51542		email: "Please enter a valid email address.",
51543		url: "Please enter a valid URL.",
51544		date: "Please enter a valid date.",
51545		dateISO: "Please enter a valid date ( ISO ).",
51546		number: "Please enter a valid number.",
51547		digits: "Please enter only digits.",
51548		creditcard: "Please enter a valid credit card number.",
51549		equalTo: "Please enter the same value again.",
51550		maxlength: $.validator.format( "Please enter no more than {0} characters." ),
51551		minlength: $.validator.format( "Please enter at least {0} characters." ),
51552		rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
51553		range: $.validator.format( "Please enter a value between {0} and {1}." ),
51554		max: $.validator.format( "Please enter a value less than or equal to {0}." ),
51555		min: $.validator.format( "Please enter a value greater than or equal to {0}." )
51556	},
51557
51558	autoCreateRanges: false,
51559
51560	prototype: {
51561
51562		init: function() {
51563			this.labelContainer = $( this.settings.errorLabelContainer );
51564			this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
51565			this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
51566			this.submitted = {};
51567			this.valueCache = {};
51568			this.pendingRequest = 0;
51569			this.pending = {};
51570			this.invalid = {};
51571			this.reset();
51572
51573			var groups = ( this.groups = {} ),
51574				rules;
51575			$.each( this.settings.groups, function( key, value ) {
51576				if ( typeof value === "string" ) {
51577					value = value.split( /\s/ );
51578				}
51579				$.each( value, function( index, name ) {
51580					groups[ name ] = key;
51581				});
51582			});
51583			rules = this.settings.rules;
51584			$.each( rules, function( key, value ) {
51585				rules[ key ] = $.validator.normalizeRule( value );
51586			});
51587
51588			function delegate( event ) {
51589				var validator = $.data( this.form, "validator" ),
51590					eventType = "on" + event.type.replace( /^validate/, "" ),
51591					settings = validator.settings;
51592				if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
51593					settings[ eventType ].call( validator, this, event );
51594				}
51595			}
51596
51597			$( this.currentForm )
51598				.on( "focusin.validate focusout.validate keyup.validate",
51599					":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
51600					"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
51601					"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
51602					"[type='radio'], [type='checkbox']", delegate)
51603				// Support: Chrome, oldIE
51604				// "select" is provided as event.target when clicking a option
51605				.on("click.validate", "select, option, [type='radio'], [type='checkbox']", delegate);
51606
51607			if ( this.settings.invalidHandler ) {
51608				$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
51609			}
51610
51611			// Add aria-required to any Static/Data/Class required fields before first validation
51612			// Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
51613			$( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
51614		},
51615
51616		// http://jqueryvalidation.org/Validator.form/
51617		form: function() {
51618			this.checkForm();
51619			$.extend( this.submitted, this.errorMap );
51620			this.invalid = $.extend({}, this.errorMap );
51621			if ( !this.valid() ) {
51622				$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
51623			}
51624			this.showErrors();
51625			return this.valid();
51626		},
51627
51628		checkForm: function() {
51629			this.prepareForm();
51630			for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
51631				this.check( elements[ i ] );
51632			}
51633			return this.valid();
51634		},
51635
51636		// http://jqueryvalidation.org/Validator.element/
51637		element: function( element ) {
51638			var cleanElement = this.clean( element ),
51639				checkElement = this.validationTargetFor( cleanElement ),
51640				result = true;
51641
51642			this.lastElement = checkElement;
51643
51644			if ( checkElement === undefined ) {
51645				delete this.invalid[ cleanElement.name ];
51646			} else {
51647				this.prepareElement( checkElement );
51648				this.currentElements = $( checkElement );
51649
51650				result = this.check( checkElement ) !== false;
51651				if ( result ) {
51652					delete this.invalid[ checkElement.name ];
51653				} else {
51654					this.invalid[ checkElement.name ] = true;
51655				}
51656			}
51657			// Add aria-invalid status for screen readers
51658			$( element ).attr( "aria-invalid", !result );
51659
51660			if ( !this.numberOfInvalids() ) {
51661				// Hide error containers on last error
51662				this.toHide = this.toHide.add( this.containers );
51663			}
51664			this.showErrors();
51665			return result;
51666		},
51667
51668		// http://jqueryvalidation.org/Validator.showErrors/
51669		showErrors: function( errors ) {
51670			if ( errors ) {
51671				// add items to error list and map
51672				$.extend( this.errorMap, errors );
51673				this.errorList = [];
51674				for ( var name in errors ) {
51675					this.errorList.push({
51676						message: errors[ name ],
51677						element: this.findByName( name )[ 0 ]
51678					});
51679				}
51680				// remove items from success list
51681				this.successList = $.grep( this.successList, function( element ) {
51682					return !( element.name in errors );
51683				});
51684			}
51685			if ( this.settings.showErrors ) {
51686				this.settings.showErrors.call( this, this.errorMap, this.errorList );
51687			} else {
51688				this.defaultShowErrors();
51689			}
51690		},
51691
51692		// http://jqueryvalidation.org/Validator.resetForm/
51693		resetForm: function() {
51694			if ( $.fn.resetForm ) {
51695				$( this.currentForm ).resetForm();
51696			}
51697			this.submitted = {};
51698			this.lastElement = null;
51699			this.prepareForm();
51700			this.hideErrors();
51701			var i, elements = this.elements()
51702				.removeData( "previousValue" )
51703				.removeAttr( "aria-invalid" );
51704
51705			if ( this.settings.unhighlight ) {
51706				for ( i = 0; elements[ i ]; i++ ) {
51707					this.settings.unhighlight.call( this, elements[ i ],
51708						this.settings.errorClass, "" );
51709				}
51710			} else {
51711				elements.removeClass( this.settings.errorClass );
51712			}
51713		},
51714
51715		numberOfInvalids: function() {
51716			return this.objectLength( this.invalid );
51717		},
51718
51719		objectLength: function( obj ) {
51720			/* jshint unused: false */
51721			var count = 0,
51722				i;
51723			for ( i in obj ) {
51724				count++;
51725			}
51726			return count;
51727		},
51728
51729		hideErrors: function() {
51730			this.hideThese( this.toHide );
51731		},
51732
51733		hideThese: function( errors ) {
51734			errors.not( this.containers ).text( "" );
51735			this.addWrapper( errors ).hide();
51736		},
51737
51738		valid: function() {
51739			return this.size() === 0;
51740		},
51741
51742		size: function() {
51743			return this.errorList.length;
51744		},
51745
51746		focusInvalid: function() {
51747			if ( this.settings.focusInvalid ) {
51748				try {
51749					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
51750					.filter( ":visible" )
51751					.focus()
51752					// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
51753					.trigger( "focusin" );
51754				} catch ( e ) {
51755					// ignore IE throwing errors when focusing hidden elements
51756				}
51757			}
51758		},
51759
51760		findLastActive: function() {
51761			var lastActive = this.lastActive;
51762			return lastActive && $.grep( this.errorList, function( n ) {
51763				return n.element.name === lastActive.name;
51764			}).length === 1 && lastActive;
51765		},
51766
51767		elements: function() {
51768			var validator = this,
51769				rulesCache = {};
51770
51771			// select all valid inputs inside the form (no submit or reset buttons)
51772			return $( this.currentForm )
51773			.find( "input, select, textarea" )
51774			.not( ":submit, :reset, :image, :disabled" )
51775			.not( this.settings.ignore )
51776			.filter( function() {
51777				if ( !this.name && validator.settings.debug && window.console ) {
51778					console.error( "%o has no name assigned", this );
51779				}
51780
51781				// select only the first element for each name, and only those with rules specified
51782				if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
51783					return false;
51784				}
51785
51786				rulesCache[ this.name ] = true;
51787				return true;
51788			});
51789		},
51790
51791		clean: function( selector ) {
51792			return $( selector )[ 0 ];
51793		},
51794
51795		errors: function() {
51796			var errorClass = this.settings.errorClass.split( " " ).join( "." );
51797			return $( this.settings.errorElement + "." + errorClass, this.errorContext );
51798		},
51799
51800		reset: function() {
51801			this.successList = [];
51802			this.errorList = [];
51803			this.errorMap = {};
51804			this.toShow = $( [] );
51805			this.toHide = $( [] );
51806			this.currentElements = $( [] );
51807		},
51808
51809		prepareForm: function() {
51810			this.reset();
51811			this.toHide = this.errors().add( this.containers );
51812		},
51813
51814		prepareElement: function( element ) {
51815			this.reset();
51816			this.toHide = this.errorsFor( element );
51817		},
51818
51819		elementValue: function( element ) {
51820			var val,
51821				$element = $( element ),
51822				type = element.type;
51823
51824			if ( type === "radio" || type === "checkbox" ) {
51825				return this.findByName( element.name ).filter(":checked").val();
51826			} else if ( type === "number" && typeof element.validity !== "undefined" ) {
51827				return element.validity.badInput ? false : $element.val();
51828			}
51829
51830			val = $element.val();
51831			if ( typeof val === "string" ) {
51832				return val.replace(/\r/g, "" );
51833			}
51834			return val;
51835		},
51836
51837		check: function( element ) {
51838			element = this.validationTargetFor( this.clean( element ) );
51839
51840			var rules = $( element ).rules(),
51841				rulesCount = $.map( rules, function( n, i ) {
51842					return i;
51843				}).length,
51844				dependencyMismatch = false,
51845				val = this.elementValue( element ),
51846				result, method, rule;
51847
51848			for ( method in rules ) {
51849				rule = { method: method, parameters: rules[ method ] };
51850				try {
51851
51852					result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
51853
51854					// if a method indicates that the field is optional and therefore valid,
51855					// don't mark it as valid when there are no other rules
51856					if ( result === "dependency-mismatch" && rulesCount === 1 ) {
51857						dependencyMismatch = true;
51858						continue;
51859					}
51860					dependencyMismatch = false;
51861
51862					if ( result === "pending" ) {
51863						this.toHide = this.toHide.not( this.errorsFor( element ) );
51864						return;
51865					}
51866
51867					if ( !result ) {
51868						this.formatAndAdd( element, rule );
51869						return false;
51870					}
51871				} catch ( e ) {
51872					if ( this.settings.debug && window.console ) {
51873						console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
51874					}
51875					if ( e instanceof TypeError ) {
51876						e.message += ".  Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
51877					}
51878
51879					throw e;
51880				}
51881			}
51882			if ( dependencyMismatch ) {
51883				return;
51884			}
51885			if ( this.objectLength( rules ) ) {
51886				this.successList.push( element );
51887			}
51888			return true;
51889		},
51890
51891		// return the custom message for the given element and validation method
51892		// specified in the element's HTML5 data attribute
51893		// return the generic message if present and no method specific message is present
51894		customDataMessage: function( element, method ) {
51895			return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
51896				method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
51897		},
51898
51899		// return the custom message for the given element name and validation method
51900		customMessage: function( name, method ) {
51901			var m = this.settings.messages[ name ];
51902			return m && ( m.constructor === String ? m : m[ method ]);
51903		},
51904
51905		// return the first defined argument, allowing empty strings
51906		findDefined: function() {
51907			for ( var i = 0; i < arguments.length; i++) {
51908				if ( arguments[ i ] !== undefined ) {
51909					return arguments[ i ];
51910				}
51911			}
51912			return undefined;
51913		},
51914
51915		defaultMessage: function( element, method ) {
51916			return this.findDefined(
51917				this.customMessage( element.name, method ),
51918				this.customDataMessage( element, method ),
51919				// title is never undefined, so handle empty string as undefined
51920				!this.settings.ignoreTitle && element.title || undefined,
51921				$.validator.messages[ method ],
51922				"<strong>Warning: No message defined for " + element.name + "</strong>"
51923			);
51924		},
51925
51926		formatAndAdd: function( element, rule ) {
51927			var message = this.defaultMessage( element, rule.method ),
51928				theregex = /\$?\{(\d+)\}/g;
51929			if ( typeof message === "function" ) {
51930				message = message.call( this, rule.parameters, element );
51931			} else if ( theregex.test( message ) ) {
51932				message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
51933			}
51934			this.errorList.push({
51935				message: message,
51936				element: element,
51937				method: rule.method
51938			});
51939
51940			this.errorMap[ element.name ] = message;
51941			this.submitted[ element.name ] = message;
51942		},
51943
51944		addWrapper: function( toToggle ) {
51945			if ( this.settings.wrapper ) {
51946				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
51947			}
51948			return toToggle;
51949		},
51950
51951		defaultShowErrors: function() {
51952			var i, elements, error;
51953			for ( i = 0; this.errorList[ i ]; i++ ) {
51954				error = this.errorList[ i ];
51955				if ( this.settings.highlight ) {
51956					this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.val
51956idClass );
51957				}
51958				this.showLabel( error.element, error.message );
51959			}
51960			if ( this.errorList.length ) {
51961				this.toShow = this.toShow.add( this.containers );
51962			}
51963			if ( this.settings.success ) {
51964				for ( i = 0; this.successList[ i ]; i++ ) {
51965					this.showLabel( this.successList[ i ] );
51966				}
51967			}
51968			if ( this.settings.unhighlight ) {
51969				for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
51970					this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
51971				}
51972			}
51973			this.toHide = this.toHide.not( this.toShow );
51974			this.hideErrors();
51975			this.addWrapper( this.toShow ).show();
51976		},
51977
51978		validElements: function() {
51979			return this.currentElements.not( this.invalidElements() );
51980		},
51981
51982		invalidElements: function() {
51983			return $( this.errorList ).map(function() {
51984				return this.element;
51985			});
51986		},
51987
51988		showLabel: function( element, message ) {
51989			var place, group, errorID,
51990				error = this.errorsFor( element ),
51991				elementID = this.idOrName( element ),
51992				describedBy = $( element ).attr( "aria-describedby" );
51993			if ( error.length ) {
51994				// refresh error/success class
51995				error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
51996				// replace message on existing label
51997				error.html( message );
51998			} else {
51999				// create error element
52000				error = $( "<" + this.settings.errorElement + ">" )
52001					.attr( "id", elementID + "-error" )
52002					.addClass( this.settings.errorClass )
52003					.html( message || "" );
52004
52005				// Maintain reference to the element to be placed into the DOM
52006				place = error;
52007				if ( this.settings.wrapper ) {
52008					// make sure the element is visible, even in IE
52009					// actually showing the wrapped element is handled elsewhere
52010					place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
52011				}
52012				if ( this.labelContainer.length ) {
52013					this.labelContainer.append( place );
52014				} else if ( this.settings.errorPlacement ) {
52015					this.settings.errorPlacement( place, $( element ) );
52016				} else {
52017					place.insertAfter( element );
52018				}
52019
52020				// Link error back to the element
52021				if ( error.is( "label" ) ) {
52022					// If the error is a label, then associate using 'for'
52023					error.attr( "for", elementID );
52024				} else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) {
52025					// If the element is not a child of an associated label, then it's necessary
52026					// to explicitly apply aria-describedby
52027
52028					errorID = error.attr( "id" ).replace( /(:|\.|\[|\]|\$)/g, "\\$1");
52029					// Respect existing non-error aria-describedby
52030					if ( !describedBy ) {
52031						describedBy = errorID;
52032					} else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) {
52033						// Add to end of list if not already present
52034						describedBy += " " + errorID;
52035					}
52036					$( element ).attr( "aria-describedby", describedBy );
52037
52038					// If this element is grouped, then assign to all elements in the same group
52039					group = this.groups[ element.name ];
52040					if ( group ) {
52041						$.each( this.groups, function( name, testgroup ) {
52042							if ( testgroup === group ) {
52043								$( "[name='" + name + "']", this.currentForm )
52044									.attr( "aria-describedby", error.attr( "id" ) );
52045							}
52046						});
52047					}
52048				}
52049			}
52050			if ( !message && this.settings.success ) {
52051				error.text( "" );
52052				if ( typeof this.settings.success === "string" ) {
52053					error.addClass( this.settings.success );
52054				} else {
52055					this.settings.success( error, element );
52056				}
52057			}
52058			this.toShow = this.toShow.add( error );
52059		},
52060
52061		errorsFor: function( element ) {
52062			var name = this.idOrName( element ),
52063				describer = $( element ).attr( "aria-describedby" ),
52064				selector = "label[for='" + name + "'], label[for='" + name + "'] *";
52065
52066			// aria-describedby should directly reference the error element
52067			if ( describer ) {
52068				selector = selector + ", #" + describer.replace( /\s+/g, ", #" );
52069			}
52070			return this
52071				.errors()
52072				.filter( selector );
52073		},
52074
52075		idOrName: function( element ) {
52076			return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.i
vendor: 9,590 bytes, lines 52076-52408
52076d || element.name );
52077		},
52078
52079		validationTargetFor: function( element ) {
52080
52081			// If radio/checkbox, validate first element in group instead
52082			if ( this.checkable( element ) ) {
52083				element = this.findByName( element.name );
52084			}
52085
52086			// Always apply ignore filter
52087			return $( element ).not( this.settings.ignore )[ 0 ];
52088		},
52089
52090		checkable: function( element ) {
52091			return ( /radio|checkbox/i ).test( element.type );
52092		},
52093
52094		findByName: function( name ) {
52095			return $( this.currentForm ).find( "[name='" + name + "']" );
52096		},
52097
52098		getLength: function( value, element ) {
52099			switch ( element.nodeName.toLowerCase() ) {
52100			case "select":
52101				return $( "option:selected", element ).length;
52102			case "input":
52103				if ( this.checkable( element ) ) {
52104					return this.findByName( element.name ).filter( ":checked" ).length;
52105				}
52106			}
52107			return value.length;
52108		},
52109
52110		depend: function( param, element ) {
52111			return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true;
52112		},
52113
52114		dependTypes: {
52115			"boolean": function( param ) {
52116				return param;
52117			},
52118			"string": function( param, element ) {
52119				return !!$( param, element.form ).length;
52120			},
52121			"function": function( param, element ) {
52122				return param( element );
52123			}
52124		},
52125
52126		optional: function( element ) {
52127			var val = this.elementValue( element );
52128			return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
52129		},
52130
52131		startRequest: function( element ) {
52132			if ( !this.pending[ element.name ] ) {
52133				this.pendingRequest++;
52134				this.pending[ element.name ] = true;
52135			}
52136		},
52137
52138		stopRequest: function( element, valid ) {
52139			this.pendingRequest--;
52140			// sometimes synchronization fails, make sure pendingRequest is never < 0
52141			if ( this.pendingRequest < 0 ) {
52142				this.pendingRequest = 0;
52143			}
52144			delete this.pending[ element.name ];
52145			if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
52146				$( this.currentForm ).submit();
52147				this.formSubmitted = false;
52148			} else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) {
52149				$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
52150				this.formSubmitted = false;
52151			}
52152		},
52153
52154		previousValue: function( element ) {
52155			return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
52156				old: null,
52157				valid: true,
52158				message: this.defaultMessage( element, "remote" )
52159			});
52160		},
52161
52162		// cleans up all forms and elements, removes validator-specific events
52163		destroy: function() {
52164			this.resetForm();
52165
52166			$( this.currentForm )
52167				.off( ".validate" )
52168				.removeData( "validator" );
52169		}
52170
52171	},
52172
52173	classRuleSettings: {
52174		required: { required: true },
52175		email: { email: true },
52176		url: { url: true },
52177		date: { date: true },
52178		dateISO: { dateISO: true },
52179		number: { number: true },
52180		digits: { digits: true },
52181		creditcard: { creditcard: true }
52182	},
52183
52184	addClassRules: function( className, rules ) {
52185		if ( className.constructor === String ) {
52186			this.classRuleSettings[ className ] = rules;
52187		} else {
52188			$.extend( this.classRuleSettings, className );
52189		}
52190	},
52191
52192	classRules: function( element ) {
52193		var rules = {},
52194			classes = $( element ).attr( "class" );
52195
52196		if ( classes ) {
52197			$.each( classes.split( " " ), function() {
52198				if ( this in $.validator.classRuleSettings ) {
52199					$.extend( rules, $.validator.classRuleSettings[ this ]);
52200				}
52201			});
52202		}
52203		return rules;
52204	},
52205
52206	normalizeAttributeRule: function( rules, type, method, value ) {
52207
52208		// convert the value to a number for number inputs, and for text for backwards compability
52209		// allows type="date" and others to be compared as strings
52210		if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
52211			value = Number( value );
52212
52213			// Support Opera Mini, which returns NaN for undefined minlength
52214			if ( isNaN( value ) ) {
52215				value = undefined;
52216			}
52217		}
52218
52219		if ( value || value === 0 ) {
52220			rules[ method ] = value;
52221		} else if ( type === method && type !== "range" ) {
52222
52223			// exception: the jquery validate 'range' method
52224			// does not test for the html5 'range' type
52225			rules[ method ] = true;
52226		}
52227	},
52228
52229	attributeRules: function( element ) {
52230		var rules = {},
52231			$element = $( element ),
52232			type = element.getAttribute( "type" ),
52233			method, value;
52234
52235		for ( method in $.validator.methods ) {
52236
52237			// support for <input required> in both html5 and older browsers
52238			if ( method === "required" ) {
52239				value = element.getAttribute( method );
52240
52241				// Some browsers return an empty string for the required attribute
52242				// and non-HTML5 browsers might have required="" markup
52243				if ( value === "" ) {
52244					value = true;
52245				}
52246
52247				// force non-HTML5 browsers to return bool
52248				value = !!value;
52249			} else {
52250				value = $element.attr( method );
52251			}
52252
52253			this.normalizeAttributeRule( rules, type, method, value );
52254		}
52255
52256		// maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
52257		if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
52258			delete rules.maxlength;
52259		}
52260
52261		return rules;
52262	},
52263
52264	dataRules: function( element ) {
52265		var rules = {},
52266			$element = $( element ),
52267			type = element.getAttribute( "type" ),
52268			method, value;
52269
52270		for ( method in $.validator.methods ) {
52271			value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
52272			this.normalizeAttributeRule( rules, type, method, value );
52273		}
52274		return rules;
52275	},
52276
52277	staticRules: function( element ) {
52278		var rules = {},
52279			validator = $.data( element.form, "validator" );
52280
52281		if ( validator.settings.rules ) {
52282			rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
52283		}
52284		return rules;
52285	},
52286
52287	normalizeRules: function( rules, element ) {
52288		// handle dependency check
52289		$.each( rules, function( prop, val ) {
52290			// ignore rule when param is explicitly false, eg. required:false
52291			if ( val === false ) {
52292				delete rules[ prop ];
52293				return;
52294			}
52295			if ( val.param || val.depends ) {
52296				var keepRule = true;
52297				switch ( typeof val.depends ) {
52298				case "string":
52299					keepRule = !!$( val.depends, element.form ).length;
52300					break;
52301				case "function":
52302					keepRule = val.depends.call( element, element );
52303					break;
52304				}
52305				if ( keepRule ) {
52306					rules[ prop ] = val.param !== undefined ? val.param : true;
52307				} else {
52308					delete rules[ prop ];
52309				}
52310			}
52311		});
52312
52313		// evaluate parameters
52314		$.each( rules, function( rule, parameter ) {
52315			rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter;
52316		});
52317
52318		// clean number parameters
52319		$.each([ "minlength", "maxlength" ], function() {
52320			if ( rules[ this ] ) {
52321				rules[ this ] = Number( rules[ this ] );
52322			}
52323		});
52324		$.each([ "rangelength", "range" ], function() {
52325			var parts;
52326			if ( rules[ this ] ) {
52327				if ( $.isArray( rules[ this ] ) ) {
52328					rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ];
52329				} else if ( typeof rules[ this ] === "string" ) {
52330					parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ );
52331					rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ];
52332				}
52333			}
52334		});
52335
52336		if ( $.validator.autoCreateRanges ) {
52337			// auto-create ranges
52338			if ( rules.min != null && rules.max != null ) {
52339				rules.range = [ rules.min, rules.max ];
52340				delete rules.min;
52341				delete rules.max;
52342			}
52343			if ( rules.minlength != null && rules.maxlength != null ) {
52344				rules.rangelength = [ rules.minlength, rules.maxlength ];
52345				delete rules.minlength;
52346				delete rules.maxlength;
52347			}
52348		}
52349
52350		return rules;
52351	},
52352
52353	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
52354	normalizeRule: function( data ) {
52355		if ( typeof data === "string" ) {
52356			var transformed = {};
52357			$.each( data.split( /\s/ ), function() {
52358				transformed[ this ] = true;
52359			});
52360			data = transformed;
52361		}
52362		return data;
52363	},
52364
52365	// http://jqueryvalidation.org/jQuery.validator.addMethod/
52366	addMethod: function( name, method, message ) {
52367		$.validator.methods[ name ] = method;
52368		$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
52369		if ( method.length < 3 ) {
52370			$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
52371		}
52372	},
52373
52374	methods: {
52375
52376		// http://jqueryvalidation.org/required-method/
52377		required: function( value, element, param ) {
52378			// check if dependency is met
52379			if ( !this.depend( param, element ) ) {
52380				return "dependency-mismatch";
52381			}
52382			if ( element.nodeName.toLowerCase() === "select" ) {
52383				// could be an array for select-multiple or a string, both are fine this way
52384				var val = $( element ).val();
52385				return val && val.length > 0;
52386			}
52387			if ( this.checkable( element ) ) {
52388				return this.getLength( value, element ) > 0;
52389			}
52390			return value.length > 0;
52391		},
52392
52393		// http://jqueryvalidation.org/email-method/
52394		email: function( value, element ) {
52395			// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
52396			// Retrieved 2014-01-14
52397			// If you have a problem with this implementation, report a bug against the above spec
52398			// Or use custom methods to implement your own email validation
52399			return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
52400		},
52401
52402		// http://jqueryvalidation.org/url-method/
52403		url: function( value, element ) {
52404
52405			// Copyright (c) 2010-2013 Diego Perini, MIT licensed
52406			// https://gist.github.com/dperini/729294
52407			// see also https://mathiasbynens.be/demo/url-regex
52408			// modified to allow protocol-relative URLs
52409			return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
52410		},
52411
52412		// http://jqueryvalidation.org/date-method/
52413		date: function( value, element ) {
52414			return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
52415		},
52416
52417		// http://jqueryvalidation.org/dateISO-method/
52418		dateISO: function( value, element ) {
52419			return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
52420		},
52421
52422		// http://jqueryvalidation.org/number-method/
52423		number: function( value, element ) {
52424			return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
52425		},
52426
52427		// http://jqueryvalidation.org/digits-method/
52428		digits: function( value, element ) {
52429			return this.optional( element ) || /^\d+$/.test( value );
52430		},
52431
52432		// http://jqueryvalidation.org/creditcard-method/
52433		// based on http://en.wikipedia.org/wiki/Luhn_algorithm
52434		creditcard: function( value, element ) {
52435			if ( this.optional( element ) ) {
52436				return "dependency-mismatch";
52437			}
52438			// accept only spaces, digits and dashes
52439			if ( /[^0-9 \-]+/.test( value ) ) {
52440				return false;
52441			}
52442			var nCheck = 0,
52443				nDigit = 0,
52444				bEven = false,
52445				n, cDigit;
52446
52447			value = value.replace( /\D/g, "" );
52448
52449			// Basing min and max length on
52450			// http://developer.ean.com/general_info/Valid_Credit_Card_Types
52451			if ( value.length < 13 || value.length > 19 ) {
52452				return false;
52453			}
52454
52455			for ( n = value.length - 1; n >= 0; n--) {
52456				cDigit = value.charAt( n );
52457				nDigit = parseInt( cDigit, 10 );
52458				if ( bEven ) {
52459					if ( ( nDigit *= 2 ) > 9 ) {
52460						nDigit -= 9;
52461					}
52462				}
52463				nCheck += nDigit;
52464				bEven = !bEven;
52465			}
52466
52467			return ( nCheck % 10 ) === 0;
52468		},
52469
52470		// http://jqueryvalidation.org/minlength-method/
52471		minlength: function( value, element, param ) {
52472			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
52473			return this.optional( element ) || length >= param;
52474		},
52475
52476		// http://jqueryvalidation.org/maxlength-method/
52477		maxlength: function( value, element, param ) {
52478			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
52479			return this.optional( element ) || length <= param;
52480		},
52481
52482		// http://jqueryvalidation.org/rangelength-method/
52483		rangelength: function( value, element, param ) {
52484			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
52485			return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
52486		},
52487
52488		// http://jqueryvalidation.org/min-method/
52489		min: function( value, element, param ) {
52490			return this.optional( element ) || value >= param;
52491		},
52492
52493		// http://jqueryvalidation.org/max-method/
52494		max: function( value, element, param ) {
52495			return this.optional( element ) || value <= param;
52496		},
52497
52498		// http://jqueryvalidation.org/range-method/
52499		range: function( value, element, param ) {
52500			return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
52501		},
52502
52503		// http://jqueryvalidation.org/equalTo-method/
52504		equalTo: function( value, element, param ) {
52505			// bind to the blur event of the target in order to revalidate whenever the target field is updated
52506			// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
52507			var target = $( param );
52508			if ( this.settings.onfocusout ) {
52509				target.off( ".validate-equalTo" ).on( "blur.validate-equalTo", function() {
52510					$( element ).valid();
52511				});
52512			}
52513			return value === target.val();
52514		},
52515
52516		// http://jqueryvalidation.org/remote-method/
52517		remote: function( value, element, param ) {
52518			if ( this.optional( element ) ) {
52519				return "dependency-mismatch";
52520			}
52521
52522			var previous = this.previousValue( element ),
52523				validator, data;
52524
52525			if (!this.settings.messages[ element.name ] ) {
52526				this.settings.messages[ element.name ] = {};
52527			}
52528			previous.originalMessage = this.settings.messages[ element.name ].remote;
52529			this.settings.messages[ element.name ].remote = previous.message;
52530
52531			param = typeof param === "string" && { url: param } || param;
52532
52533			if ( previous.old === value ) {
52534				return previous.valid;
52535			}
52536
52537			previous.old = value;
52538			validator = this;
52539			this.startRequest( element );
52540			data = {};
52541			data[ element.name ] = value;
52542			$.ajax( $.extend( true, {
52543				mode: "abort",
52544				port: "validate" + element.name,
52545				dataType: "json",
52546				data: data,
52547				context: validator.currentForm,
52548				success: function( response ) {
52549					var valid = response === true || response === "true",
52550						errors, message, submitted;
52551
52552					validator.settings.messages[ element.name ].remote = previous.originalMessage;
52553					if ( valid ) {
52554						submitted = validator.formSubmitted;
52555						validator.prepareElement( element );
52556						validator.formSubmitted = submitted;
52557						validator.successList.push( element );
52558						delete validator.invalid[ element.name ];
52559						validator.showErrors();
52560					} else {
52561						errors = {};
52562						message = response || validator.defaultMessage( element, "remote" );
52563						errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
52564						validator.invalid[ element.name ] = true;
52565						validator.showErrors( errors );
52566					}
52567					previous.valid = valid;
52568					validator.stopRequest( element, valid );
52569				}
52570			}, param ) );
52571			return "pending";
52572		}
52573	}
52574
52575});
52576
52577// ajax mode: abort
52578// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
52579// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
52580
52581var pendingRequests = {},
52582	ajax;
52583// Use a prefilter if available (1.5+)
52584if ( $.ajaxPrefilter ) {
52585	$.ajaxPrefilter(function( settings, _, xhr ) {
52586		var port = settings.port;
52587		if ( settings.mode === "abort" ) {
52588			if ( pendingRequests[port] ) {
52589				pendingRequests[port].abort();
52590			}
52591			pendingRequests[port] = xhr;
52592		}
52593	});
52594} else {
52595	// Proxy ajax
52596	ajax = $.ajax;
52597	$.ajax = function( settings ) {
52598		var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
52599			port = ( "port" in settings ? settings : $.ajaxSettings ).port;
52600		if ( mode === "abort" ) {
52601			if ( pendingRequests[port] ) {
52602				pendingRequests[port].abort();
52603			}
52604			pendingRequests[port] = ajax.apply(this, arguments);
52605			return pendingRequests[port];
52606		}
52607		return ajax.apply(this, arguments);
52608	};
52609}
52610
52611}));
52612/* NUGET: BEGIN LICENSE TEXT
52613 *
52614 * Microsoft grants you the right to use these script files for the sole
52615 * purpose of either: (i) interacting through your browser with the Microsoft
52616 * website or online service, subject to the applicable licensing or use
52617 * terms; or (ii) using the files as included with a Microsoft product subject
52618 * to that product's license terms. Microsoft reserves all other rights to the
52619 * files not expressly granted by Microsoft, whether by implication, estoppel
52620 * or otherwise. Insofar as a script file is dual licensed under GPL,
52621 * Microsoft neither took the code under GPL nor distributes it thereunder but
52622 * under the terms set out in this paragraph. All notices and licenses
52623 * below are for informational purposes only.
52624 *
52625 * NUGET: END LICENSE TEXT */
52626/*!
52627** Unobtrusive validation support library for jQuery and jQuery Validate
52628** Copyright (C) Microsoft Corporation. All rights reserved.
52629*/
52630
52631/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
52632/*global document: false, jQuery: false */
52633
52634(function ($) {
52635    var $jQval = $.validator,
52636        adapters,
52637        data_validation = "unobtrusiveValidation";
52638
52639    function setValidationValues(options, ruleName, value) {
52640        options.rules[ruleName] = value;
52641        if (options.message) {
52642            options.messages[ruleName] = options.message;
52643        }
52644    }
52645
52646    function splitAndTrim(value) {
52647        return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
52648    }
52649
52650    function escapeAttributeValue(value) {
52651        // As mentioned on http://api.jquery.com/category/selectors/
52652        return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
52653    }
52654
52655    function getModelPrefix(fieldName) {
52656        return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
52657    }
52658
52659    function appendModelPrefix(value, prefix) {
52660        if (value.indexOf("*.") === 0) {
52661            value = value.replace("*.", prefix);
52662        }
52663        return value;
52664    }
52665
52666    function onError(error, inputElement) {  // 'this' is the form element
52667        var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
52668            replaceAttrValue = container.attr("data-valmsg-replace"),
52669            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
52670
52671        container.removeClass("field-validation-valid").addClass("field-validation-error");
52672        error.data("unobtrusiveContainer", container);
52673
52674        if (replace) {
52675            container.empty();
52676            error.removeClass("input-validation-error").appendTo(container);
52677        }
52678        else {
52679            error.hide();
52680        }
52681    }
52682
52683    function onErrors(event, validator) {  // 'this' is the form element
52684        var container = $(this).find("[data-valmsg-summary=true]"),
52685            list = container.find("ul");
52686
52687        if (list && list.length && validator.errorList.length) {
52688            list.empty();
vendor: 16,384 bytes, lines 52689-53043
52689            container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
52690
52691            $.each(validator.errorList, function () {
52692                $("<li />").html(this.message).appendTo(list);
52693            });
52694        }
52695    }
52696
52697    function onSuccess(error) {  // 'this' is the form element
52698        var container = error.data("unobtrusiveContainer"),
52699            replaceAttrValue = container.attr("data-valmsg-replace"),
52700            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
52701
52702        if (container) {
52703            container.addClass("field-validation-valid").removeClass("field-validation-error");
52704            error.removeData("unobtrusiveContainer");
52705
52706            if (replace) {
52707                container.empty();
52708            }
52709        }
52710    }
52711
52712    function onReset(event) {  // 'this' is the form element
52713        var $form = $(this),
52714            key = '__jquery_unobtrusive_validation_form_reset';
52715        if ($form.data(key)) {
52716            return;
52717        }
52718        // Set a flag that indicates we're currently resetting the form.
52719        $form.data(key, true);
52720        try {
52721            $form.data("validator").resetForm();
52722        } finally {
52723            $form.removeData(key);
52724        }
52725
52726        $form.find(".validation-summary-errors")
52727            .addClass("validation-summary-valid")
52728            .removeClass("validation-summary-errors");
52729        $form.find(".field-validation-error")
52730            .addClass("field-validation-valid")
52731            .removeClass("field-validation-error")
52732            .removeData("unobtrusiveContainer")
52733            .find(">*")  // If we were using valmsg-replace, get the underlying error
52734                .removeData("unobtrusiveContainer");
52735    }
52736
52737    function validationInfo(form) {
52738        var $form = $(form),
52739            result = $form.data(data_validation),
52740            onResetProxy = $.proxy(onReset, form),
52741            defaultOptions = $jQval.unobtrusive.options || {},
52742            execInContext = function (name, args) {
52743                var func = defaultOptions[name];
52744                func && $.isFunction(func) && func.apply(form, args);
52745            }
52746
52747        if (!result) {
52748            result = {
52749                options: {  // options structure passed to jQuery Validate's validate() method
52750                    errorClass: defaultOptions.errorClass || "input-validation-error",
52751                    errorElement: defaultOptions.errorElement || "span",
52752                    errorPlacement: function () {
52753                        onError.apply(form, arguments);
52754                        execInContext("errorPlacement", arguments);
52755                    },
52756                    invalidHandler: function () {
52757                        onErrors.apply(form, arguments);
52758                        execInContext("invalidHandler", arguments);
52759                    },
52760                    messages: {},
52761                    rules: {},
52762                    success: function () {
52763                        onSuccess.apply(form, arguments);
52764                        execInContext("success", arguments);
52765                    }
52766                },
52767                attachValidation: function () {
52768                    $form
52769                        .off("reset." + data_validation, onResetProxy)
52770                        .on("reset." + data_validation, onResetProxy)
52771                        .validate(this.options);
52772                },
52773                validate: function () {  // a validation function that is called by unobtrusive Ajax
52774                    $form.validate();
52775                    return $form.valid();
52776                }
52777            };
52778            $form.data(data_validation, result);
52779        }
52780
52781        return result;
52782    }
52783
52784    $jQval.unobtrusive = {
52785        adapters: [],
52786
52787        parseElement: function (element, skipAttach) {
52788            /// <summary>
52789            /// Parses a single HTML element for unobtrusive validation attributes.
52790            /// </summary>
52791            /// <param name="element" domElement="true">The HTML element to be parsed.</param>
52792            /// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
52793            /// validation to the form. If parsing just this single element, you should specify true.
52794            /// If parsing several elements, you should specify false, and manually attach the validation
52795            /// to the form when you are finished. The default is false.</param>
52796            var $element = $(element),
52797                form = $element.parents("form")[0],
52798                valInfo, rules, messages;
52799
52800            if (!form) {  // Cannot do client-side validation without a form
52801                return;
52802            }
52803
52804            valInfo = validationInfo(form);
52805            valInfo.options.rules[element.name] = rules = {};
52806            valInfo.options.messages[element.name] = messages = {};
52807
52808            $.each(this.adapters, function () {
52809                var prefix = "data-val-" + this.name,
52810                    message = $element.attr(prefix),
52811                    paramValues = {};
52812
52813                if (message !== undefined) {  // Compare against undefined, because an empty message is legal (and falsy)
52814                    prefix += "-";
52815
52816                    $.each(this.params, function () {
52817                        paramValues[this] = $element.attr(prefix + this);
52818                    });
52819
52820                    this.adapt({
52821                        element: element,
52822                        form: form,
52823                        message: message,
52824                        params: paramValues,
52825                        rules: rules,
52826                        messages: messages
52827                    });
52828                }
52829            });
52830
52831            $.extend(rules, { "__dummy__": true });
52832
52833            if (!skipAttach) {
52834                valInfo.attachValidation();
52835            }
52836        },
52837
52838        parse: function (selector) {
52839            /// <summary>
52840            /// Parses all the HTML elements in the specified selector. It looks for input elements decorated
52841            /// with the [data-val=true] attribute value and enables validation according to the data-val-*
52842            /// attribute values.
52843            /// </summary>
52844            /// <param name="selector" type="String">Any valid jQuery selector.</param>
52845
52846            // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
52847            // element with data-val=true
52848            var $selector = $(selector),
52849                $forms = $selector.parents()
52850                                  .addBack()
52851                                  .filter("form")
52852                                  .add($selector.find("form"))
52853                                  .has("[data-val=true]");
52854
52855            $selector.find("[data-val=true]").each(function () {
52856                $jQval.unobtrusive.parseElement(this, true);
52857            });
52858
52859            $forms.each(function () {
52860                var info = validationInfo(this);
52861                if (info) {
52862                    info.attachValidation();
52863                }
52864            });
52865        }
52866    };
52867
52868    adapters = $jQval.unobtrusive.adapters;
52869
52870    adapters.add = function (adapterName, params, fn) {
52871        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
52872        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
52873        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
52874        /// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
52875        /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
52876        /// mmmm is the parameter name).</param>
52877        /// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
52878        /// attributes into jQuery Validate rules and/or messages.</param>
52879        /// <returns type="jQuery.validator.unobtrusive.adapters" />
52880        if (!fn) {  // Called with no params, just a function
52881            fn = params;
52882            params = [];
52883        }
52884        this.push({ name: adapterName, params: params, adapt: fn });
52885        return this;
52886    };
52887
52888    adapters.addBool = function (adapterName, ruleName) {
52889        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
52890        /// the jQuery Validate validation rule has no parameter values.</summary>
52891        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
52892        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
52893        /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
52894        /// of adapterName will be used instead.</param>
52895        /// <returns type="jQuery.validator.unobtrusive.adapters" />
52896        return this.add(adapterName, function (options) {
52897            setValidationValues(options, ruleName || adapterName, true);
52898        });
52899    };
52900
52901    adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
52902        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
52903        /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
52904        /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
52905        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
52906        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
52907        /// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
52908        /// have a minimum value.</param>
52909        /// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
52910        /// have a maximum value.</param>
52911        /// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
52912        /// have both a minimum and maximum value.</param>
52913        /// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
52914        /// contains the minimum value. The default is "min".</param>
52915        /// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
52916        /// contains the maximum value. The default is "max".</param>
52917        /// <returns type="jQuery.validator.unobtrusive.adapters" />
52918        return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
52919            var min = options.params.min,
52920                max = options.params.max;
52921
52922            if (min && max) {
52923                setValidationValues(options, minMaxRuleName, [min, max]);
52924            }
52925            else if (min) {
52926                setValidationValues(options, minRuleName, min);
52927            }
52928            else if (max) {
52929                setValidationValues(options, maxRuleName, max);
52930            }
52931        });
52932    };
52933
52934    adapters.addSingleVal = function (adapterName, attribute, ruleName) {
52935        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
52936        /// the jQuery Validate validation rule has a single value.</summary>
52937        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
52938        /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
52939        /// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
52940        /// The default is "val".</param>
52941        /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
52942        /// of adapterName will be used instead.</param>
52943        /// <returns type="jQuery.validator.unobtrusive.adapters" />
52944        return this.add(adapterName, [attribute || "val"], function (options) {
52945            setValidationValues(options, ruleName || adapterName, options.params[attribute]);
52946        });
52947    };
52948
52949    $jQval.addMethod("__dummy__", function (value, element, params) {
52950        return true;
52951    });
52952
52953    $jQval.addMethod("regex", function (value, element, params) {
52954        var match;
52955        if (this.optional(element)) {
52956            return true;
52957        }
52958
52959        match = new RegExp(params).exec(value);
52960        return (match && (match.index === 0) && (match[0].length === value.length));
52961    });
52962
52963    $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
52964        var match;
52965        if (nonalphamin) {
52966            match = value.match(/\W/g);
52967            match = match && match.length >= nonalphamin;
52968        }
52969        return match;
52970    });
52971
52972    if ($jQval.methods.extension) {
52973        adapters.addSingleVal("accept", "mimtype");
52974        adapters.addSingleVal("extension", "extension");
52975    } else {
52976        // for backward compatibility, when the 'extension' validation method does not exist, such as with versions
52977        // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
52978        // validating the extension, and ignore mime-type validations as they are not supported.
52979        adapters.addSingleVal("extension", "extension", "accept");
52980    }
52981
52982    adapters.addSingleVal("regex", "pattern");
52983    adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
52984    adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
52985    adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
52986    adapters.add("equalto", ["other"], function (options) {
52987        var prefix = getModelPrefix(options.element.name),
52988            other = options.params.other,
52989            fullOtherName = appendModelPrefix(other, prefix),
52990            element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
52991
52992        setValidationValues(options, "equalTo", element);
52993    });
52994    adapters.add("required", function (options) {
52995        // jQuery Validate equates "required" with "mandatory" for checkbox elements
52996        if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
52997            setValidationValues(options, "required", true);
52998        }
52999    });
53000    adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
53001        var value = {
53002            url: options.params.url,
53003            type: options.params.type || "GET",
53004            data: {}
53005        },
53006            prefix = getModelPrefix(options.element.name);
53007
53008        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
53009            var paramName = appendModelPrefix(fieldName, prefix);
53010            value.data[paramName] = function () {
53011                var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
53012                // For checkboxes and radio buttons, only pick up values from checked fields.
53013                if (field.is(":checkbox")) {
53014                    return field.filter(":checked").val() || field.filter(":hidden").val() || '';
53015                }
53016                else if (field.is(":radio")) {
53017                    return field.filter(":checked").val() || '';
53018                }
53019                return field.val();
53020            };
53021        });
53022
53023        setValidationValues(options, "remote", value);
53024    });
53025    adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
53026        if (options.params.min) {
53027            setValidationValues(options, "minlength", options.params.min);
53028        }
53029        if (options.params.nonalphamin) {
53030            setValidationValues(options, "nonalphamin", options.params.nonalphamin);
53031        }
53032        if (options.params.regex) {
53033            setValidationValues(options, "regex", options.params.regex);
53034        }
53035    });
53036
53037    $(function () {
53038        $jQval.unobtrusive.parse(document);
53039    });
53040}(jQuery));
53041/*
53042 *
53043 * Copyright (c) 2006-2011
53043 Sam Collett (http://www.texotela.co.uk)
53044 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
53045 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
53046 * 
53047 * Version 1.3
53048 * Demo: http://www.texotela.co.uk/code/jquery/numeric/
53049 *
53050 */
53051(function($) {
53052/*
53053 * Allows only valid characters to be entered into input boxes.
53054 * Note: fixes value when pasting via Ctrl+V, but not when using the mouse to paste
53055  *      side-effect: Ctrl+A does not work, though you can still use the mouse to select (or double-click to select all)
53056 *
53057 * @name     numeric
53058 * @param    config      { decimal : "." , negative : true }
53059 * @param    callback     A function that runs if the number is not valid (fires onblur)
53060 * @author   Sam Collett (http://www.texotela.co.uk)
53061 * @example  $(".numeric").numeric();
53062 * @example  $(".numeric").numeric(","); // use , as separater
53063 * @example  $(".numeric").numeric({ decimal : "," }); // use , as separator
53064 * @example  $(".numeric").numeric({ negative : false }); // do not allow negative values
53065 * @example  $(".numeric").numeric(null, callback); // use default values, pass on the 'callback' function
53066 *
53067 */
53068$.fn.numeric = function(config, callback)
53069{
53070	if(typeof config === 'boolean')
53071	{
53072		config = { decimal: config };
53073	}
53074	config = config || {};
53075	// if config.negative undefined, set to true (default is to allow negative numbers)
53076	if(typeof config.negative == "undefined") config.negative = true;
53077	// set decimal point
53078	var decimal = (config.decimal === false) ? "" : config.decimal || ".";
53079	// allow negatives
53080	var negative = (config.negative === true) ? true : false;
53081	// callback function
53082	var callback = typeof callback == "function" ? callback : function(){};
53083	// set data and methods
53084	return this.data("numeric.decimal", decimal).data("numeric.negative", negative).data("numeric.callback", callback).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur).on("paste", $.fn.numeric.onpaste);
53085}
53086
53087$.fn.numeric.keypress = function(e)
53088{
53089	// get decimal character and determine if negatives are allowed
53090	var decimal = $.data(this, "numeric.decimal");
53091	var negative = $.data(this, "numeric.negative");
53092	// get the key that was pressed
53093	var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
53094	// allow enter/return key (only when in an input box)
53095	if(key == 13 && this.nodeName.toLowerCase() == "input")
53096	{
53097		return true;
53098	}
53099	else if(key == 13)
53100	{
53101		return false;
53102	}
53103	var allow = false;
53104	// allow Ctrl+A
53105	if((e.ctrlKey && key == 97 /* firefox */) || (e.ctrlKey && key == 65) /* opera */) return true;
53106	// allow Ctrl+X (cut)
53107	if((e.ctrlKey && key == 120 /* firefox */) || (e.ctrlKey && key == 88) /* opera */) return true;
53108	// allow Ctrl+C (copy)
53109	if((e.ctrlKey && key == 99 /* firefox */) || (e.ctrlKey && key == 67) /* opera */) return true;
53110	// allow Ctrl+Z (undo)
53111	if((e.ctrlKey && key == 122 /* firefox */) || (e.ctrlKey && key == 90) /* opera */) return true;
53112	// allow or deny Ctrl+V (paste), Shift+Ins
53113	if((e.ctrlKey && key == 118 /* firefox */) || (e.ctrlKey && key == 86) /* opera */
53114	|| (e.shiftKey && key == 45)) return true;
53115	// if a number was not pressed
53116	if(key < 48 || key > 57)
53117	{
53118		/* '-' only allowed at start and if negative numbers allowed */
53119		if(this.value.indexOf("-") != 0 && negative && key == 45 && (this.value.length == 0 || ($.fn.getSelectionStart(this)) == 0)) return true;
53120		/* only one decimal separator allowed */
53121		if(decimal && key == decimal.charCodeAt(0) && this.value.indexOf(decimal) != -1)
53122		{
53123			allow = false;
53124		}
53125		// check for other keys that have special purposes
53126		if(
53127			key != 8 /* backspace */ &&
53128			key != 9 /* tab */ &&
53129			key != 13 /* enter */ &&
53130			key != 35 /* end */ &&
53131			key != 36 /* home */ &&
53132			key != 37 /* left */ &&
53133			key != 39 /* right */ &&
53134			key != 46 /* del */
53135		)
53136		{
53137			allow = false;
53138		}
53139		else
53140		{
53141			// for detecting special keys (listed above)
53142			// IE does not support 'charCode' and ignores them in keypress anyway
53143			if(typeof e.charCode != "undefined")
53144			{
53145				// special keys have 'keyCode' and 'which' the same (e.g. backspace)
53146				if(e.keyCode == e.which && e.which != 0)
53147				{
53148					allow = true;
53149					// . and delete share the same code, don't allow . (will be set to true later if it is the decimal point)
53150					if(e.which == 46) allow = false;
53151				}
53152				// or keyCode != 0 and 'charCode'/'which' = 0
53153				else if(e.keyCode != 0 && e.charCode == 0 && e.which == 0)
53154				{
53155					allow = true;
53156				}
53157			}
53158		}
53159		// if key pressed is the decimal and it is not already in the field
53160		if(decimal && key == decimal.charCodeAt(0))
53161		{
53162			if(this.value.indexOf(decimal) == -1)
53163			{
53164				allow = true;
53165			}
53166			else
53167			{
53168				allow = false;
53169			}
53170		}
53171	}
53172	else
53173	{
53174		allow = true;
53175	}
53176	return allow;
53177}
53178
53179$.fn.numeric.keyup = function(e)
53180{
53181	var val = this.value;
53182	if(val.length > 0)
53183	{
53184		// get carat (cursor) position
53185		var carat = $.fn.getSelectionStart(this);
53186		// get decimal character and determine if negatives are allowed
53187		var decimal = $.data(this, "numeric.decimal");
53188		var negative = $.data(this, "numeric.negative");
53189		
53190		// prepend a 0 if necessary
53191		if(decimal != "")
53192		{
53193			// find decimal point
53194			var dot = val.indexOf(decimal);
53195			// if dot at start, add 0 before
53196			if(dot == 0)
53197			{
53198				this.value = "0" + val;
53199			}
53200			// if dot at position 1, check if there is a - symbol before it
53201			if(dot == 1 && val.charAt(0) == "-")
53202			{
53203				this.value = "-0" + val.substring(1);
53204			}
53205			val = this.value;
53206		}
53207		
53208		// if pasted in, only allow the following characters
53209		var validChars = [0,1,2,3,4,5,6,7,8,9,'-',decimal];
53210		// get length of the value (to loop through)
53211		var length = val.length;
53212		// loop backwards (to prevent going out of bounds)
53213		for(var i = length - 1; i >= 0; i--)
53214		{
53215			var ch = val.charAt(i);
53216			// remove '-' if it is in the wrong place
53217			if(i != 0 && ch == "-")
53218			{
53219				val = val.substring(0, i) + val.substring(i + 1);
53220			}
53221			// remove character if it is at the start, a '-' and negatives aren't allowed
53222			else if(i == 0 && !negative && ch == "-")
53223			{
53224				val = val.substring(1);
53225			}
53226			var validChar = false;
53227			// loop through validChars
53228			for(var j = 0; j < validChars.length; j++)
53229			{
53230				// if it is valid, break out the loop
53231				if(ch == validChars[j])
53232				{
53233					validChar = true;
53234					break;
53235				}
53236			}
53237			// if not a valid character, or a space, remove
53238			if(!validChar || ch == " ")
53239			{
53240				val = val.substring(0, i) + val.substring(i + 1);
53241			}
53242		}
53243		// remove extra decimal characters
53244		var firstDecimal = val.indexOf(decimal);
53245		if(firstDecimal > 0)
53246		{
53247			for(var i = length - 1; i > firstDecimal; i--)
53248			{
53249				var ch = val.charAt(i);
53250				// remove decimal character
53251				if(ch == decimal)
53252				{
53253					val = val.substring(0, i) + val.substring(i + 1);
53254				}
53255			}
53256		}
53257		// set the value and prevent the cursor moving to the end
53258		this.value = val;
53259		$.fn.setSelection(this, carat);
53260	}
53261}
53262
53263$.fn.numeric.blur = function()
53264{
53265	var decimal = $.data(this, "numeric.decimal");
53266	var callback = $.data(this, "numeric.callback");
53267	var val = this.value;
53268	if(val != "")
53269	{
53270		var re = new RegExp("^\\d+$|\\d*" + decimal + "\\d+");
53271		if(!re.exec(val))
53272		{
53273			callback.apply(this);
53274		}
53275	}
53276}
53277
53278$.fn.numeric.onpaste = function(e)
53279{
53280    var pastedValue = (e.originalEvent.clipboardData || window.clipboardData).getData('Text');
53281    var existingValue = e.target.value;
53282
53283    var textLeft = existingValue.substring(0, e.target.selectionStart);
53284    var textRight = existingValue.substring(e.target.selectionEnd, existingValue.length);
53285
53286    var resultValue = textLeft + pastedValue + textRight;
53287
53288    return $.isNumeric(resultValue);
53289}
53290
53291$.fn.removeNumeric = function()
53292{
53293	return this.data("numeric.decimal", null).data("numeric.negative", null).data("numeric.callback", null).unbind("keypress", $.fn.numeric.keypress).unbind("blur", $.fn.numeric.blur);
53294}
53295
53296// Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini <[email protected]>)
53297$.fn.getSelectionStart = function(o)
53298{
53299	if (o.createTextRange)
53300	{
53301		var r = document.selection.createRange().duplicate();
53302		r.moveEnd('character', o.value.length);
53303		if (r.text == '') return o.value.length;
53304		return o.value.lastIndexOf(r.text);
53305	} else return o.selectionStart;
53306}
53307
53308// set the selection, o is the object (input), p is the position ([start, end] or just start)
53309$.fn.setSelection = function(o, p)
53310{
53311	// if p is number, start and end are the same
53312	if(typeof p == "number") p = [p, p];
53313	// only set if p is an array of length 2
53314	if(p && p.constructor == Array && p.length == 2)
53315	{
53316		if (o.createTextRange)
53317		{
53318			var r = o.createTextRange();
53319			r.collapse(true);
53320			r.moveStart('character', p[0]);
53321			r.moveEnd('character', p[1]);
53322			r.select();
53323		}
53324		else if(o.setSelectionRange)
53325		{
53326			o.focus();
53327			o.setSelectionRange(p[0], p[1]);
53328		}
53329	}
53330}
53331
53332})(jQuery);
vendor: 8,792 bytes, lines 53332-53578
53332
53333(function (global, factory) {
53334  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
53335  typeof define === 'function' && define.amd ? define('underscore', factory) :
53336  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
53337    var current = global._;
53338    var exports = global._ = factory();
53339    exports.noConflict = function () { global._ = current; return exports; };
53340  }()));
53341}(this, (function () {
53342  //     Underscore.js 1.13.1
53343  //     https://underscorejs.org
53344  //     (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
53345  //     Underscore may be freely distributed under the MIT license.
53346
53347  // Current version.
53348  var VERSION = '1.13.1';
53349
53350  // Establish the root object, `window` (`self`) in the browser, `global`
53351  // on the server, or `this` in some virtual machines. We use `self`
53352  // instead of `window` for `WebWorker` support.
53353  var root = typeof self == 'object' && self.self === self && self ||
53354            typeof global == 'object' && global.global === global && global ||
53355            Function('return this')() ||
53356            {};
53357
53358  // Save bytes in the minified (but not gzipped) version:
53359  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
53360  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
53361
53362  // Create quick reference variables for speed access to core prototypes.
53363  var push = ArrayProto.push,
53364      slice = ArrayProto.slice,
53365      toString = ObjProto.toString,
53366      hasOwnProperty = ObjProto.hasOwnProperty;
53367
53368  // Modern feature detection.
53369  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
53370      supportsDataView = typeof DataView !== 'undefined';
53371
53372  // All **ECMAScript 5+** native function implementations that we hope to use
53373  // are declared here.
53374  var nativeIsArray = Array.isArray,
53375      nativeKeys = Object.keys,
53376      nativeCreate = Object.create,
53377      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
53378
53379  // Create references to these builtin functions because we override them.
53380  var _isNaN = isNaN,
53381      _isFinite = isFinite;
53382
53383  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
53384  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
53385  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
53386    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
53387
53388  // The largest integer that can be represented exactly.
53389  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
53390
53391  // Some functions take a variable number of arguments, or a few expected
53392  // arguments at the beginning and then a variable number of values to operate
53393  // on. This helper accumulates all remaining arguments past the function’s
53394  // argument length (or an explicit `startIndex`), into an array that becomes
53395  // the last argument. Similar to ES6’s "rest parameter".
53396  function restArguments(func, startIndex) {
53397    startIndex = startIndex == null ? func.length - 1 : +startIndex;
53398    return function() {
53399      var length = Math.max(arguments.length - startIndex, 0),
53400          rest = Array(length),
53401          index = 0;
53402      for (; index < length; index++) {
53403        rest[index] = arguments[index + startIndex];
53404      }
53405      switch (startIndex) {
53406        case 0: return func.call(this, rest);
53407        case 1: return func.call(this, arguments[0], rest);
53408        case 2: return func.call(this, arguments[0], arguments[1], rest);
53409      }
53410      var args = Array(startIndex + 1);
53411      for (index = 0; index < startIndex; index++) {
53412        args[index] = arguments[index];
53413      }
53414      args[startIndex] = rest;
53415      return func.apply(this, args);
53416    };
53417  }
53418
53419  // Is a given variable an object?
53420  function isObject(obj) {
53421    var type = typeof obj;
53422    return type === 'function' || type === 'object' && !!obj;
53423  }
53424
53425  // Is a given value equal to null?
53426  function isNull(obj) {
53427    return obj === null;
53428  }
53429
53430  // Is a given variable undefined?
53431  function isUndefined(obj) {
53432    return obj === void 0;
53433  }
53434
53435  // Is a given value a boolean?
53436  function isBoolean(obj) {
53437    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
53438  }
53439
53440  // Is a given value a DOM element?
53441  function isElement(obj) {
53442    return !!(obj && obj.nodeType === 1);
53443  }
53444
53445  // Internal function for creating a `toString`-based type tester.
53446  function tagTester(name) {
53447    var tag = '[object ' + name + ']';
53448    return function(obj) {
53449      return toString.call(obj) === tag;
53450    };
53451  }
53452
53453  var isString = tagTester('String');
53454
53455  var isNumber = tagTester('Number');
53456
53457  var isDate = tagTester('Date');
53458
53459  var isRegExp = tagTester('RegExp');
53460
53461  var isError = tagTester('Error');
53462
53463  var isSymbol = tagTester('Symbol');
53464
53465  var isArrayBuffer = tagTester('ArrayBuffer');
53466
53467  var isFunction = tagTester('Function');
53468
53469  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
53470  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
53471  var nodelist = root.document && root.document.childNodes;
53472  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
53473    isFunction = function(obj) {
53474      return typeof obj == 'function' || false;
53475    };
53476  }
53477
53478  var isFunction$1 = isFunction;
53479
53480  var hasObjectTag = tagTester('Object');
53481
53482  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
53483  // In IE 11, the most common among them, this problem also applies to
53484  // `Map`, `WeakMap` and `Set`.
53485  var hasStringTagBug = (
53486        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
53487      ),
53488      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
53489
53490  var isDataView = tagTester('DataView');
53491
53492  // In IE 10 - Edge 13, we need a different heuristic
53493  // to determine whether an object is a `DataView`.
53494  function ie10IsDataView(obj) {
53495    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
53496  }
53497
53498  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
53499
53500  // Is a given value an array?
53501  // Delegates to ECMA5's native `Array.isArray`.
53502  var isArray = nativeIsArray || tagTester('Array');
53503
53504  // Internal function to check whether `key` is an own property name of `obj`.
53505  function has$1(obj, key) {
53506    return obj != null && hasOwnProperty.call(obj, key);
53507  }
53508
53509  var isArguments = tagTester('Arguments');
53510
53511  // Define a fallback version of the method in browsers (ahem, IE < 9), where
53512  // there isn't any inspectable "Arguments" type.
53513  (function() {
53514    if (!isArguments(arguments)) {
53515      isArguments = function(obj) {
53516        return has$1(obj, 'callee');
53517      };
53518    }
53519  }());
53520
53521  var isArguments$1 = isArguments;
53522
53523  // Is a given object a finite number?
53524  function isFinite$1(obj) {
53525    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
53526  }
53527
53528  // Is the given value `NaN`?
53529  function isNaN$1(obj) {
53530    return isNumber(obj) && _isNaN(obj);
53531  }
53532
53533  // Predicate-generating function. Often useful outside of Underscore.
53534  function constant(value) {
53535    return function() {
53536      return value;
53537    };
53538  }
53539
53540  // Common internal logic for `isArrayLike` and `isBufferLike`.
53541  function createSizePropertyCheck(getSizeProperty) {
53542    return function(collection) {
53543      var sizeProperty = getSizeProperty(collection);
53544      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
53545    }
53546  }
53547
53548  // Internal helper to generate a function to obtain property `key` from `obj`.
53549  function shallowProperty(key) {
53550    return function(obj) {
53551      return obj == null ? void 0 : obj[key];
53552    };
53553  }
53554
53555  // Internal helper to obtain the `byteLength` property of an object.
53556  var getByteLength = shallowProperty('byteLength');
53557
53558  // Internal helper to determine whether we should spend extensive checks against
53559  // `ArrayBuffer` et al.
53560  var isBufferLike = createSizePropertyCheck(getByteLength);
53561
53562  // Is a given value a typed array?
53563  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
53564  function isTypedArray(obj) {
53565    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
53566    // Otherwise, fall back on the above regular expression.
53567    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
53568                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
53569  }
53570
53571  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
53572
53573  // Internal helper to obtain the `length` property of an object.
53574  var getLength = shallowProperty('length');
53575
53576  // Internal helper to create a simple lookup structure.
53577  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
53578  // circular imports. `emulatedSet` is a one-off solution that only works for
vendor: 4,192 bytes, lines 53579-53698
53579  // arrays of strings.
53580  function emulatedSet(keys) {
53581    var hash = {};
53582    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
53583    return {
53584      contains: function(key) { return hash[key]; },
53585      push: function(key) {
53586        hash[key] = true;
53587        return keys.push(key);
53588      }
53589    };
53590  }
53591
53592  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
53593  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
53594  // needed.
53595  function collectNonEnumProps(obj, keys) {
53596    keys = emulatedSet(keys);
53597    var nonEnumIdx = nonEnumerableProps.length;
53598    var constructor = obj.constructor;
53599    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
53600
53601    // Constructor is a special case.
53602    var prop = 'constructor';
53603    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
53604
53605    while (nonEnumIdx--) {
53606      prop = nonEnumerableProps[nonEnumIdx];
53607      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
53608        keys.push(prop);
53609      }
53610    }
53611  }
53612
53613  // Retrieve the names of an object's own properties.
53614  // Delegates to **ECMAScript 5**'s native `Object.keys`.
53615  function keys(obj) {
53616    if (!isObject(obj)) return [];
53617    if (nativeKeys) return nativeKeys(obj);
53618    var keys = [];
53619    for (var key in obj) if (has$1(obj, key)) keys.push(key);
53620    // Ahem, IE < 9.
53621    if (hasEnumBug) collectNonEnumProps(obj, keys);
53622    return keys;
53623  }
53624
53625  // Is a given array, string, or object empty?
53626  // An "empty" object has no enumerable own-properties.
53627  function isEmpty(obj) {
53628    if (obj == null) return true;
53629    // Skip the more expensive `toString`-based type checks if `obj` has no
53630    // `.length`.
53631    var length = getLength(obj);
53632    if (typeof length == 'number' && (
53633      isArray(obj) || isString(obj) || isArguments$1(obj)
53634    )) return length === 0;
53635    return getLength(keys(obj)) === 0;
53636  }
53637
53638  // Returns whether an object has a given set of `key:value` pairs.
53639  function isMatch(object, attrs) {
53640    var _keys = keys(attrs), length = _keys.length;
53641    if (object == null) return !length;
53642    var obj = Object(object);
53643    for (var i = 0; i < length; i++) {
53644      var key = _keys[i];
53645      if (attrs[key] !== obj[key] || !(key in obj)) return false;
53646    }
53647    return true;
53648  }
53649
53650  // If Underscore is called as a function, it returns a wrapped object that can
53651  // be used OO-style. This wrapper holds altered versions of all functions added
53652  // through `_.mixin`. Wrapped objects may be chained.
53653  function _$1(obj) {
53654    if (obj instanceof _$1) return obj;
53655    if (!(this instanceof _$1)) return new _$1(obj);
53656    this._wrapped = obj;
53657  }
53658
53659  _$1.VERSION = VERSION;
53660
53661  // Extracts the result from a wrapped and chained object.
53662  _$1.prototype.value = function() {
53663    return this._wrapped;
53664  };
53665
53666  // Provide unwrapping proxies for some methods used in engine operations
53667  // such as arithmetic and JSON stringification.
53668  _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
53669
53670  _$1.prototype.toString = function() {
53671    return String(this._wrapped);
53672  };
53673
53674  // Internal function to wrap or shallow-copy an ArrayBuffer,
53675  // typed array or DataView to a new view, reusing the buffer.
53676  function toBufferView(bufferSource) {
53677    return new Uint8Array(
53678      bufferSource.buffer || bufferSource,
53679      bufferSource.byteOffset || 0,
53680      getByteLength(bufferSource)
53681    );
53682  }
53683
53684  // We use this string twice, so give it a name for minification.
53685  var tagDataView = '[object DataView]';
53686
53687  // Internal recursive comparison function for `_.isEqual`.
53688  function eq(a, b, aStack, bStack) {
53689    // Identical objects are equal. `0 === -0`, but they aren't identical.
53690    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
53691    if (a === b) return a !== 0 || 1 / a === 1 / b;
53692    // `null` or `undefined` only equal to itself (strict comparison).
53693    if (a == null || b == null) return false;
53694    // `NaN`s are equivalent, but non-reflexive.
53695    if (a !== a) return b !== b;
53696    // Exhaust primitive checks
53697    var type = typeof a;
53698    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
vendor: 4,262 bytes, lines 53699-53798
53699    return deepEq(a, b, aStack, bStack);
53700  }
53701
53702  // Internal recursive comparison function for `_.isEqual`.
53703  function deepEq(a, b, aStack, bStack) {
53704    // Unwrap any wrapped objects.
53705    if (a instanceof _$1) a = a._wrapped;
53706    if (b instanceof _$1) b = b._wrapped;
53707    // Compare `[[Class]]` names.
53708    var className = toString.call(a);
53709    if (className !== toString.call(b)) return false;
53710    // Work around a bug in IE 10 - Edge 13.
53711    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
53712      if (!isDataView$1(b)) return false;
53713      className = tagDataView;
53714    }
53715    switch (className) {
53716      // These types are compared by value.
53717      case '[object RegExp]':
53718        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
53719      case '[object String]':
53720        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
53721        // equivalent to `new String("5")`.
53722        return '' + a === '' + b;
53723      case '[object Number]':
53724        // `NaN`s are equivalent, but non-reflexive.
53725        // Object(NaN) is equivalent to NaN.
53726        if (+a !== +a) return +b !== +b;
53727        // An `egal` comparison is performed for other numeric values.
53728        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
53729      case '[object Date]':
53730      case '[object Boolean]':
53731        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
53732        // millisecond representations. Note that invalid dates with millisecond representations
53733        // of `NaN` are not equivalent.
53734        return +a === +b;
53735      case '[object Symbol]':
53736        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
53737      case '[object ArrayBuffer]':
53738      case tagDataView:
53739        // Coerce to typed array so we can fall through.
53740        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
53741    }
53742
53743    var areArrays = className === '[object Array]';
53744    if (!areArrays && isTypedArray$1(a)) {
53745        var byteLength = getByteLength(a);
53746        if (byteLength !== getByteLength(b)) return false;
53747        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
53748        areArrays = true;
53749    }
53750    if (!areArrays) {
53751      if (typeof a != 'object' || typeof b != 'object') return false;
53752
53753      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
53754      // from different frames are.
53755      var aCtor = a.constructor, bCtor = b.constructor;
53756      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
53757                               isFunction$1(bCtor) && bCtor instanceof bCtor)
53758                          && ('constructor' in a && 'constructor' in b)) {
53759        return false;
53760      }
53761    }
53762    // Assume equality for cyclic structures. The algorithm for detecting cyclic
53763    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
53764
53765    // Initializing stack of traversed objects.
53766    // It's done here since we only need them for objects and arrays comparison.
53767    aStack = aStack || [];
53768    bStack = bStack || [];
53769    var length = aStack.length;
53770    while (length--) {
53771      // Linear search. Performance is inversely proportional to the number of
53772      // unique nested structures.
53773      if (aStack[length] === a) return bStack[length] === b;
53774    }
53775
53776    // Add the first object to the stack of traversed objects.
53777    aStack.push(a);
53778    bStack.push(b);
53779
53780    // Recursively compare objects and arrays.
53781    if (areArrays) {
53782      // Compare array lengths to determine if a deep comparison is necessary.
53783      length = a.length;
53784      if (length !== b.length) return false;
53785      // Deep compare the contents, ignoring non-numeric properties.
53786      while (length--) {
53787        if (!eq(a[length], b[length], aStack, bStack)) return false;
53788      }
53789    } else {
53790      // Deep compare objects.
53791      var _keys = keys(a), key;
53792      length = _keys.length;
53793      // Ensure that both objects contain the same number of properties before comparing deep equality.
53794      if (keys(b).length !== length) return false;
53795      while (length--) {
53796        // Deep compare each member
53797        key = _keys[length];
53798        if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
vendor: 51,132 bytes, lines 53799-55373
53799      }
53800    }
53801    // Remove the first object from the stack of traversed objects.
53802    aStack.pop();
53803    bStack.pop();
53804    return true;
53805  }
53806
53807  // Perform a deep comparison to check if two objects are equal.
53808  function isEqual(a, b) {
53809    return eq(a, b);
53810  }
53811
53812  // Retrieve all the enumerable property names of an object.
53813  function allKeys(obj) {
53814    if (!isObject(obj)) return [];
53815    var keys = [];
53816    for (var key in obj) keys.push(key);
53817    // Ahem, IE < 9.
53818    if (hasEnumBug) collectNonEnumProps(obj, keys);
53819    return keys;
53820  }
53821
53822  // Since the regular `Object.prototype.toString` type tests don't work for
53823  // some types in IE 11, we use a fingerprinting heuristic instead, based
53824  // on the methods. It's not great, but it's the best we got.
53825  // The fingerprint method lists are defined below.
53826  function ie11fingerprint(methods) {
53827    var length = getLength(methods);
53828    return function(obj) {
53829      if (obj == null) return false;
53830      // `Map`, `WeakMap` and `Set` have no enumerable keys.
53831      var keys = allKeys(obj);
53832      if (getLength(keys)) return false;
53833      for (var i = 0; i < length; i++) {
53834        if (!isFunction$1(obj[methods[i]])) return false;
53835      }
53836      // If we are testing against `WeakMap`, we need to ensure that
53837      // `obj` doesn't have a `forEach` method in order to distinguish
53838      // it from a regular `Map`.
53839      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
53840    };
53841  }
53842
53843  // In the interest of compact minification, we write
53844  // each string in the fingerprints only once.
53845  var forEachName = 'forEach',
53846      hasName = 'has',
53847      commonInit = ['clear', 'delete'],
53848      mapTail = ['get', hasName, 'set'];
53849
53850  // `Map`, `WeakMap` and `Set` each have slightly different
53851  // combinations of the above sublists.
53852  var mapMethods = commonInit.concat(forEachName, mapTail),
53853      weakMapMethods = commonInit.concat(mapTail),
53854      setMethods = ['add'].concat(commonInit, forEachName, hasName);
53855
53856  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
53857
53858  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
53859
53860  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
53861
53862  var isWeakSet = tagTester('WeakSet');
53863
53864  // Retrieve the values of an object's properties.
53865  function values(obj) {
53866    var _keys = keys(obj);
53867    var length = _keys.length;
53868    var values = Array(length);
53869    for (var i = 0; i < length; i++) {
53870      values[i] = obj[_keys[i]];
53871    }
53872    return values;
53873  }
53874
53875  // Convert an object into a list of `[key, value]` pairs.
53876  // The opposite of `_.object` with one argument.
53877  function pairs(obj) {
53878    var _keys = keys(obj);
53879    var length = _keys.length;
53880    var pairs = Array(length);
53881    for (var i = 0; i < length; i++) {
53882      pairs[i] = [_keys[i], obj[_keys[i]]];
53883    }
53884    return pairs;
53885  }
53886
53887  // Invert the keys and values of an object. The values must be serializable.
53888  function invert(obj) {
53889    var result = {};
53890    var _keys = keys(obj);
53891    for (var i = 0, length = _keys.length; i < length; i++) {
53892      result[obj[_keys[i]]] = _keys[i];
53893    }
53894    return result;
53895  }
53896
53897  // Return a sorted list of the function names available on the object.
53898  function functions(obj) {
53899    var names = [];
53900    for (var key in obj) {
53901      if (isFunction$1(obj[key])) names.push(key);
53902    }
53903    return names.sort();
53904  }
53905
53906  // An internal function for creating assigner functions.
53907  function createAssigner(keysFunc, defaults) {
53908    return function(obj) {
53909      var length = arguments.length;
53910      if (defaults) obj = Object(obj);
53911      if (length < 2 || obj == null) return obj;
53912      for (var index = 1; index < length; index++) {
53913        var source = arguments[index],
53914            keys = keysFunc(source),
53915            l = keys.length;
53916        for (var i = 0; i < l; i++) {
53917          var key = keys[i];
53918          if (!defaults || obj[key] === void 0) obj[key] = source[key];
53919        }
53920      }
53921      return obj;
53922    };
53923  }
53924
53925  // Extend a given object with all the properties in passed-in object(s).
53926  var extend = createAssigner(allKeys);
53927
53928  // Assigns a given object with all the own properties in the passed-in
53929  // object(s).
53930  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
53931  var extendOwn = createAssigner(keys);
53932
53933  // Fill in a given object with default properties.
53934  var defaults = createAssigner(allKeys, true);
53935
53936  // Create a naked function reference for surrogate-prototype-swapping.
53937  function ctor() {
53938    return function(){};
53939  }
53940
53941  // An internal function for creating a new object that inherits from another.
53942  function baseCreate(prototype) {
53943    if (!isObject(prototype)) return {};
53944    if (nativeCreate) return nativeCreate(prototype);
53945    var Ctor = ctor();
53946    Ctor.prototype = prototype;
53947    var result = new Ctor;
53948    Ctor.prototype = null;
53949    return result;
53950  }
53951
53952  // Creates an object that inherits from the given prototype object.
53953  // If additional properties are provided then they will be added to the
53954  // created object.
53955  function create(prototype, props) {
53956    var result = baseCreate(prototype);
53957    if (props) extendOwn(result, props);
53958    return result;
53959  }
53960
53961  // Create a (shallow-cloned) duplicate of an object.
53962  function clone(obj) {
53963    if (!isObject(obj)) return obj;
53964    return isArray(obj) ? obj.slice() : extend({}, obj);
53965  }
53966
53967  // Invokes `interceptor` with the `obj` and then returns `obj`.
53968  // The primary purpose of this method is to "tap into" a method chain, in
53969  // order to perform operations on intermediate results within the chain.
53970  function tap(obj, interceptor) {
53971    interceptor(obj);
53972    return obj;
53973  }
53974
53975  // Normalize a (deep) property `path` to array.
53976  // Like `_.iteratee`, this function can be customized.
53977  function toPath$1(path) {
53978    return isArray(path) ? path : [path];
53979  }
53980  _$1.toPath = toPath$1;
53981
53982  // Internal wrapper for `_.toPath` to enable minification.
53983  // Similar to `cb` for `_.iteratee`.
53984  function toPath(path) {
53985    return _$1.toPath(path);
53986  }
53987
53988  // Internal function to obtain a nested property in `obj` along `path`.
53989  function deepGet(obj, path) {
53990    var length = path.length;
53991    for (var i = 0; i < length; i++) {
53992      if (obj == null) return void 0;
53993      obj = obj[path[i]];
53994    }
53995    return length ? obj : void 0;
53996  }
53997
53998  // Get the value of the (deep) property on `path` from `object`.
53999  // If any property in `path` does not exist or if the value is
54000  // `undefined`, return `defaultValue` instead.
54001  // The `path` is normalized through `_.toPath`.
54002  function get(object, path, defaultValue) {
54003    var value = deepGet(object, toPath(path));
54004    return isUndefined(value) ? defaultValue : value;
54005  }
54006
54007  // Shortcut function for checking if an object has a given property directly on
54008  // itself (in other words, not on a prototype). Unlike the internal `has`
54009  // function, this public version can also traverse nested properties.
54010  function has(obj, path) {
54011    path = toPath(path);
54012    var length = path.length;
54013    for (var i = 0; i < length; i++) {
54014      var key = path[i];
54015      if (!has$1(obj, key)) return false;
54016      obj = obj[key];
54017    }
54018    return !!length;
54019  }
54020
54021  // Keep the identity function around for default iteratees.
54022  function identity(value) {
54023    return value;
54024  }
54025
54026  // Returns a predicate for checking whether an object has a given set of
54027  // `key:value` pairs.
54028  function matcher(attrs) {
54029    attrs = extendOwn({}, attrs);
54030    return function(obj) {
54031      return isMatch(obj, attrs);
54032    };
54033  }
54034
54035  // Creates a function that, when passed an object, will traverse that object’s
54036  // properties down the given `path`, specified as an array of keys or indices.
54037  function property(path) {
54038    path = toPath(path);
54039    return function(obj) {
54040      return deepGet(obj, path);
54041    };
54042  }
54043
54044  // Internal function that returns an efficient (for current engines) version
54045  // of the passed-in callback, to be repeatedly applied in other Underscore
54046  // functions.
54047  function optimizeCb(func, context, argCount) {
54048    if (context === void 0) return func;
54049    switch (argCount == null ? 3 : argCount) {
54050      case 1: return function(value) {
54051        return func.call(context, value);
54052      };
54053      // The 2-argument case is omitted because we’re not using it.
54054      case 3: return function(value, index, collection) {
54055        return func.call(context, value, index, collection);
54056      };
54057      case 4: return function(accumulator, value, index, collection) {
54058        return func.call(context, accumulator, value, index, collection);
54059      };
54060    }
54061    return function() {
54062      return func.apply(context, arguments);
54063    };
54064  }
54065
54066  // An internal function to generate callbacks that can be applied to each
54067  // element in a collection, returning the desired result — either `_.identity`,
54068  // an arbitrary callback, a property matcher, or a property accessor.
54069  function baseIteratee(value, context, argCount) {
54070    if (value == null) return identity;
54071    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
54072    if (isObject(value) && !isArray(value)) return matcher(value);
54073    return property(value);
54074  }
54075
54076  // External wrapper for our callback generator. Users may customize
54077  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
54078  // This abstraction hides the internal-only `argCount` argument.
54079  function iteratee(value, context) {
54080    return baseIteratee(value, context, Infinity);
54081  }
54082  _$1.iteratee = iteratee;
54083
54084  // The function we call internally to generate a callback. It invokes
54085  // `_.iteratee` if overridden, otherwise `baseIteratee`.
54086  function cb(value, context, argCount) {
54087    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
54088    return baseIteratee(value, context, argCount);
54089  }
54090
54091  // Returns the results of applying the `iteratee` to each element of `obj`.
54092  // In contrast to `_.map` it returns an object.
54093  function mapObject(obj, iteratee, context) {
54094    iteratee = cb(iteratee, context);
54095    var _keys = keys(obj),
54096        length = _keys.length,
54097        results = {};
54098    for (var index = 0; index < length; index++) {
54099      var currentKey = _keys[index];
54100      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
54101    }
54102    return results;
54103  }
54104
54105  // Predicate-generating function. Often useful outside of Underscore.
54106  function noop(){}
54107
54108  // Generates a function for a given object that returns a given property.
54109  function propertyOf(obj) {
54110    if (obj == null) return noop;
54111    return function(path) {
54112      return get(obj, path);
54113    };
54114  }
54115
54116  // Run a function **n** times.
54117  function times(n, iteratee, context) {
54118    var accum = Array(Math.max(0, n));
54119    iteratee = optimizeCb(iteratee, context, 1);
54120    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
54121    return accum;
54122  }
54123
54124  // Return a random integer between `min` and `max` (inclusive).
54125  function random(min, max) {
54126    if (max == null) {
54127      max = min;
54128      min = 0;
54129    }
54130    return min + Math.floor(Math.random() * (max - min + 1));
54131  }
54132
54133  // A (possibly faster) way to get the current timestamp as an integer.
54134  var now = Date.now || function() {
54135    return new Date().getTime();
54136  };
54137
54138  // Internal helper to generate functions for escaping and unescaping strings
54139  // to/from HTML interpolation.
54140  function createEscaper(map) {
54141    var escaper = function(match) {
54142      return map[match];
54143    };
54144    // Regexes for identifying a key that needs to be escaped.
54145    var source = '(?:' + keys(map).join('|') + ')';
54146    var testRegexp = RegExp(source);
54147    var replaceRegexp = RegExp(source, 'g');
54148    return function(string) {
54149      string = string == null ? '' : '' + string;
54150      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
54151    };
54152  }
54153
54154  // Internal list of HTML entities for escaping.
54155  var escapeMap = {
54156    '&': '&amp;',
54157    '<': '&lt;',
54158    '>': '&gt;',
54159    '"': '&quot;',
54160    "'": '&#x27;',
54161    '`': '&#x60;'
54162  };
54163
54164  // Function for escaping strings to HTML interpolation.
54165  var _escape = createEscaper(escapeMap);
54166
54167  // Internal list of HTML entities for unescaping.
54168  var unescapeMap = invert(escapeMap);
54169
54170  // Function for unescaping strings from HTML interpolation.
54171  var _unescape = createEscaper(unescapeMap);
54172
54173  // By default, Underscore uses ERB-style template delimiters. Change the
54174  // following template settings to use alternative delimiters.
54175  var templateSettings = _$1.templateSettings = {
54176    evaluate: /<%([\s\S]+?)%>/g,
54177    interpolate: /<%=([\s\S]+?)%>/g,
54178    escape: /<%-([\s\S]+?)%>/g
54179  };
54180
54181  // When customizing `_.templateSettings`, if you don't want to define an
54182  // interpolation, evaluation or escaping regex, we need one that is
54183  // guaranteed not to match.
54184  var noMatch = /(.)^/;
54185
54186  // Certain characters need to be escaped so that they can be put into a
54187  // string literal.
54188  var escapes = {
54189    "'": "'",
54190    '\\': '\\',
54191    '\r': 'r',
54192    '\n': 'n',
54193    '\u2028': 'u2028',
54194    '\u2029': 'u2029'
54195  };
54196
54197  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
54198
54199  function escapeChar(match) {
54200    return '\\' + escapes[match];
54201  }
54202
54203  // In order to prevent third-party code injection through
54204  // `_.templateSettings.variable`, we test it against the following regular
54205  // expression. It is intentionally a bit more liberal than just matching valid
54206  // identifiers, but still prevents possible loopholes through defaults or
54207  // destructuring assignment.
54208  var bareIdentifier = /^\s*(\w|\$)+\s*$/;
54209
54210  // JavaScript micro-templating, similar to John Resig's implementation.
54211  // Underscore templating handles arbitrary delimiters, preserves whitespace,
54212  // and correctly escapes quotes within interpolated code.
54213  // NB: `oldSettings` only exists for backwards compatibility.
54214  function template(text, settings, oldSettings) {
54215    if (!settings && oldSettings) settings = oldSettings;
54216    settings = defaults({}, settings, _$1.templateSettings);
54217
54218    // Combine delimiters into one regular expression via alternation.
54219    var matcher = RegExp([
54220      (settings.escape || noMatch).source,
54221      (settings.interpolate || noMatch).source,
54222      (settings.evaluate || noMatch).source
54223    ].join('|') + '|$', 'g');
54224
54225    // Compile the template source, escaping string literals appropriately.
54226    var index = 0;
54227    var source = "__p+='";
54228    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
54229      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
54230      index = offset + match.length;
54231
54232      if (escape) {
54233        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
54234      } else if (interpolate) {
54235        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
54236      } else if (evaluate) {
54237        source += "';\n" + evaluate + "\n__p+='";
54238      }
54239
54240      // Adobe VMs need the match returned to produce the correct offset.
54241      return match;
54242    });
54243    source += "';\n";
54244
54245    var argument = settings.variable;
54246    if (argument) {
54247      // Insure against third-party code injection. (CVE-2021-23358)
54248      if (!bareIdentifier.test(argument)) throw new Error(
54249        'variable is not a bare identifier: ' + argument
54250      );
54251    } else {
54252      // If a variable is not specified, place data values in local scope.
54253      source = 'with(obj||{}){\n' + source + '}\n';
54254      argument = 'obj';
54255    }
54256
54257    source = "var __t,__p='',__j=Array.prototype.join," +
54258      "print=function(){__p+=__j.call(arguments,'');};\n" +
54259      source + 'return __p;\n';
54260
54261    var render;
54262    try {
54263      render = new Function(argument, '_', source);
54264    } catch (e) {
54265      e.source = source;
54266      throw e;
54267    }
54268
54269    var template = function(data) {
54270      return render.call(this, data, _$1);
54271    };
54272
54273    // Provide the compiled source as a convenience for precompilation.
54274    template.source = 'function(' + argument + '){\n' + source + '}';
54275
54276    return template;
54277  }
54278
54279  // Traverses the children of `obj` along `path`. If a child is a function, it
54280  // is invoked with its parent as context. Returns the value of the final
54281  // child, or `fallback` if any child is undefined.
54282  function result(obj, path, fallback) {
54283    path = toPath(path);
54284    var length = path.length;
54285    if (!length) {
54286      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
54287    }
54288    for (var i = 0; i < length; i++) {
54289      var prop = obj == null ? void 0 : obj[path[i]];
54290      if (prop === void 0) {
54291        prop = fallback;
54292        i = length; // Ensure we don't continue iterating.
54293      }
54294      obj = isFunction$1(prop) ? prop.call(obj) : prop;
54295    }
54296    return obj;
54297  }
54298
54299  // Generate a unique integer id (unique within the entire client session).
54300  // Useful for temporary DOM ids.
54301  var idCounter = 0;
54302  function uniqueId(prefix) {
54303    var id = ++idCounter + '';
54304    return prefix ? prefix + id : id;
54305  }
54306
54307  // Start chaining a wrapped Underscore object.
54308  function chain(obj) {
54309    var instance = _$1(obj);
54310    instance._chain = true;
54311    return instance;
54312  }
54313
54314  // Internal function to execute `sourceFunc` bound to `context` with optional
54315  // `args`. Determines whether to execute a function as a constructor or as a
54316  // normal function.
54317  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
54318    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
54319    var self = baseCreate(sourceFunc.prototype);
54320    var result = sourceFunc.apply(self, args);
54321    if (isObject(result)) return result;
54322    return self;
54323  }
54324
54325  // Partially apply a function by creating a version that has had some of its
54326  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
54327  // as a placeholder by default, allowing any combination of arguments to be
54328  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
54329  var partial = restArguments(function(func, boundArgs) {
54330    var placeholder = partial.placeholder;
54331    var bound = function() {
54332      var position = 0, length = boundArgs.length;
54333      var args = Array(length);
54334      for (var i = 0; i < length; i++) {
54335        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
54336      }
54337      while (position < arguments.length) args.push(arguments[position++]);
54338      return executeBound(func, bound, this, this, args);
54339    };
54340    return bound;
54341  });
54342
54343  partial.placeholder = _$1;
54344
54345  // Create a function bound to a given object (assigning `this`, and arguments,
54346  // optionally).
54347  var bind = restArguments(function(func, context, args) {
54348    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
54349    var bound = restArguments(function(callArgs) {
54350      return executeBound(func, bound, context, this, args.concat(callArgs));
54351    });
54352    return bound;
54353  });
54354
54355  // Internal helper for collection methods to determine whether a collection
54356  // should be iterated as an array or as an object.
54357  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
54358  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
54359  var isArrayLike = createSizePropertyCheck(getLength);
54360
54361  // Internal implementation of a recursive `flatten` function.
54362  function flatten$1(input, depth, strict, output) {
54363    output = output || [];
54364    if (!depth && depth !== 0) {
54365      depth = Infinity;
54366    } else if (depth <= 0) {
54367      return output.concat(input);
54368    }
54369    var idx = output.length;
54370    for (var i = 0, length = getLength(input); i < length; i++) {
54371      var value = input[i];
54372      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
54373        // Flatten current level of array or arguments object.
54374        if (depth > 1) {
54375          flatten$1(value, depth - 1, strict, output);
54376          idx = output.length;
54377        } else {
54378          var j = 0, len = value.length;
54379          while (j < len) output[idx++] = value[j++];
54380        }
54381      } else if (!strict) {
54382        output[idx++] = value;
54383      }
54384    }
54385    return output;
54386  }
54387
54388  // Bind a number of an object's methods to that object. Remaining arguments
54389  // are the method names to be bound. Useful for ensuring that all callbacks
54390  // defined on an object belong to it.
54391  var bindAll = restArguments(function(obj, keys) {
54392    keys = flatten$1(keys, false, false);
54393    var index = keys.length;
54394    if (index < 1) throw new Error('bindAll must be passed function names');
54395    while (index--) {
54396      var key = keys[index];
54397      obj[key] = bind(obj[key], obj);
54398    }
54399    return obj;
54400  });
54401
54402  // Memoize an expensive function by storing its results.
54403  function memoize(func, hasher) {
54404    var memoize = function(key) {
54405      var cache = memoize.cache;
54406      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
54407      if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
54408      return cache[address];
54409    };
54410    memoize.cache = {};
54411    return memoize;
54412  }
54413
54414  // Delays a function for the given number of milliseconds, and then calls
54415  // it with the arguments supplied.
54416  var delay = restArguments(function(func, wait, args) {
54417    return setTimeout(function() {
54418      return func.apply(null, args);
54419    }, wait);
54420  });
54421
54422  // Defers a function, scheduling it to run after the current call stack has
54423  // cleared.
54424  var defer = partial(delay, _$1, 1);
54425
54426  // Returns a function, that, when invoked, will only be triggered at most once
54427  // during a given window of time. Normally, the throttled function will run
54428  // as much as it can, without ever going more than once per `wait` duration;
54429  // but if you'd like to disable the execution on the leading edge, pass
54430  // `{leading: false}`. To disable execution on the trailing edge, ditto.
54431  function throttle(func, wait, options) {
54432    var timeout, context, args, result;
54433    var previous = 0;
54434    if (!options) options = {};
54435
54436    var later = function() {
54437      previous = options.leading === false ? 0 : now();
54438      timeout = null;
54439      result = func.apply(context, args);
54440      if (!timeout) context = args = null;
54441    };
54442
54443    var throttled = function() {
54444      var _now = now();
54445      if (!previous && options.leading === false) previous = _now;
54446      var remaining = wait - (_now - previous);
54447      context = this;
54448      args = arguments;
54449      if (remaining <= 0 || remaining > wait) {
54450        if (timeout) {
54451          clearTimeout(timeout);
54452          timeout = null;
54453        }
54454        previous = _now;
54455        result = func.apply(context, args);
54456        if (!timeout) context = args = null;
54457      } else if (!timeout && options.trailing !== false) {
54458        timeout = setTimeout(later, remaining);
54459      }
54460      return result;
54461    };
54462
54463    throttled.cancel = function() {
54464      clearTimeout(timeout);
54465      previous = 0;
54466      timeout = context = args = null;
54467    };
54468
54469    return throttled;
54470  }
54471
54472  // When a sequence of calls of the returned function ends, the argument
54473  // function is triggered. The end of a sequence is defined by the `wait`
54474  // parameter. If `immediate` is passed, the argument function will be
54475  // triggered at the beginning of the sequence instead of at the end.
54476  function debounce(func, wait, immediate) {
54477    var timeout, previous, args, result, context;
54478
54479    var later = function() {
54480      var passed = now() - previous;
54481      if (wait > passed) {
54482        timeout = setTimeout(later, wait - passed);
54483      } else {
54484        timeout = null;
54485        if (!immediate) result = func.apply(context, args);
54486        // This check is needed because `func` can recursively invoke `debounced`.
54487        if (!timeout) args = context = null;
54488      }
54489    };
54490
54491    var debounced = restArguments(function(_args) {
54492      context = this;
54493      args = _args;
54494      previous = now();
54495      if (!timeout) {
54496        timeout = setTimeout(later, wait);
54497        if (immediate) result = func.apply(context, args);
54498      }
54499      return result;
54500    });
54501
54502    debounced.cancel = function() {
54503      clearTimeout(timeout);
54504      timeout = args = context = null;
54505    };
54506
54507    return debounced;
54508  }
54509
54510  // Returns the first function passed as an argument to the second,
54511  // allowing you to adjust arguments, run code before and after, and
54512  // conditionally execute the original function.
54513  function wrap(func, wrapper) {
54514    return partial(wrapper, func);
54515  }
54516
54517  // Returns a negated version of the passed-in predicate.
54518  function negate(predicate) {
54519    return function() {
54520      return !predicate.apply(this, arguments);
54521    };
54522  }
54523
54524  // Returns a function that is the composition of a list of functions, each
54525  // consuming the return value of the function that follows.
54526  function compose() {
54527    var args = arguments;
54528    var start = args.length - 1;
54529    return function() {
54530      var i = start;
54531      var result = args[start].apply(this, arguments);
54532      while (i--) result = args[i].call(this, result);
54533      return result;
54534    };
54535  }
54536
54537  // Returns a function that will only be executed on and after the Nth call.
54538  function after(times, func) {
54539    return function() {
54540      if (--times < 1) {
54541        return func.apply(this, arguments);
54542      }
54543    };
54544  }
54545
54546  // Returns a function that will only be executed up to (but not including) the
54547  // Nth call.
54548  function before(times, func) {
54549    var memo;
54550    return function() {
54551      if (--times > 0) {
54552        memo = func.apply(this, arguments);
54553      }
54554      if (times <= 1) func = null;
54555      return memo;
54556    };
54557  }
54558
54559  // Returns a function that will be executed at most one time, no matter how
54560  // often you call it. Useful for lazy initialization.
54561  var once = partial(before, 2);
54562
54563  // Returns the first key on an object that passes a truth test.
54564  function findKey(obj, predicate, context) {
54565    predicate = cb(predicate, context);
54566    var _keys = keys(obj), key;
54567    for (var i = 0, length = _keys.length; i < length; i++) {
54568      key = _keys[i];
54569      if (predicate(obj[key], key, obj)) return key;
54570    }
54571  }
54572
54573  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
54574  function createPredicateIndexFinder(dir) {
54575    return function(array, predicate, context) {
54576      predicate = cb(predicate, context);
54577      var length = getLength(array);
54578      var index = dir > 0 ? 0 : length - 1;
54579      for (; index >= 0 && index < length; index += dir) {
54580        if (predicate(array[index], index, array)) return index;
54581      }
54582      return -1;
54583    };
54584  }
54585
54586  // Returns the first index on an array-like that passes a truth test.
54587  var findIndex = createPredicateIndexFinder(1);
54588
54589  // Returns the last index on an array-like that passes a truth test.
54590  var findLastIndex = createPredicateIndexFinder(-1);
54591
54592  // Use a comparator function to figure out the smallest index at which
54593  // an object should be inserted so as to maintain order. Uses binary search.
54594  function sortedIndex(array, obj, iteratee, context) {
54595    iteratee = cb(iteratee, context, 1);
54596    var value = iteratee(obj);
54597    var low = 0, high = getLength(array);
54598    while (low < high) {
54599      var mid = Math.floor((low + high) / 2);
54600      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
54601    }
54602    return low;
54603  }
54604
54605  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
54606  function createIndexFinder(dir, predicateFind, sortedIndex) {
54607    return function(array, item, idx) {
54608      var i = 0, length = getLength(array);
54609      if (typeof idx == 'number') {
54610        if (dir > 0) {
54611          i = idx >= 0 ? idx : Math.max(idx + length, i);
54612        } else {
54613          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
54614        }
54615      } else if (sortedIndex && idx && length) {
54616        idx = sortedIndex(array, item);
54617        return array[idx] === item ? idx : -1;
54618      }
54619      if (item !== item) {
54620        idx = predicateFind(slice.call(array, i, length), isNaN$1);
54621        return idx >= 0 ? idx + i : -1;
54622      }
54623      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
54624        if (array[idx] === item) return idx;
54625      }
54626      return -1;
54627    };
54628  }
54629
54630  // Return the position of the first occurrence of an item in an array,
54631  // or -1 if the item is not included in the array.
54632  // If the array is large and already in sort order, pass `true`
54633  // for **isSorted** to use binary search.
54634  var indexOf = createIndexFinder(1, findIndex, sortedIndex);
54635
54636  // Return the position of the last occurrence of an item in an array,
54637  // or -1 if the item is not included in the array.
54638  var lastIndexOf = createIndexFinder(-1, findLastIndex);
54639
54640  // Return the first value which passes a truth test.
54641  function find(obj, predicate, context) {
54642    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
54643    var key = keyFinder(obj, predicate, context);
54644    if (key !== void 0 && key !== -1) return obj[key];
54645  }
54646
54647  // Convenience version of a common use case of `_.find`: getting the first
54648  // object containing specific `key:value` pairs.
54649  function findWhere(obj, attrs) {
54650    return find(obj, matcher(attrs));
54651  }
54652
54653  // The cornerstone for collection functions, an `each`
54654  // implementation, aka `forEach`.
54655  // Handles raw objects in addition to array-likes. Treats all
54656  // sparse array-likes as if they were dense.
54657  function each(obj, iteratee, context) {
54658    iteratee = optimizeCb(iteratee, context);
54659    var i, length;
54660    if (isArrayLike(obj)) {
54661      for (i = 0, length = obj.length; i < length; i++) {
54662        iteratee(obj[i], i, obj);
54663      }
54664    } else {
54665      var _keys = keys(obj);
54666      for (i = 0, length = _keys.length; i < length; i++) {
54667        iteratee(obj[_keys[i]], _keys[i], obj);
54668      }
54669    }
54670    return obj;
54671  }
54672
54673  // Return the results of applying the iteratee to each element.
54674  function map(obj, iteratee, context) {
54675    iteratee = cb(iteratee, context);
54676    var _keys = !isArrayLike(obj) && keys(obj),
54677        length = (_keys || obj).length,
54678        results = Array(length);
54679    for (var index = 0; index < length; index++) {
54680      var currentKey = _keys ? _keys[index] : index;
54681      results[index] = iteratee(obj[currentKey], currentKey, obj);
54682    }
54683    return results;
54684  }
54685
54686  // Internal helper to create a reducing function, iterating left or right.
54687  function createReduce(dir) {
54688    // Wrap code that reassigns argument variables in a separate function than
54689    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
54690    var reducer = function(obj, iteratee, memo, initial) {
54691      var _keys = !isArrayLike(obj) && keys(obj),
54692          length = (_keys || obj).length,
54693          index = dir > 0 ? 0 : length - 1;
54694      if (!initial) {
54695        memo = obj[_keys ? _keys[index] : index];
54696        index += dir;
54697      }
54698      for (; index >= 0 && index < length; index += dir) {
54699        var currentKey = _keys ? _keys[index] : index;
54700        memo = iteratee(memo, obj[currentKey], currentKey, obj);
54701      }
54702      return memo;
54703    };
54704
54705    return function(obj, iteratee, memo, context) {
54706      var initial = arguments.length >= 3;
54707      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
54708    };
54709  }
54710
54711  // **Reduce** builds up a single result from a list of values, aka `inject`,
54712  // or `foldl`.
54713  var reduce = createReduce(1);
54714
54715  // The right-associative version of reduce, also known as `foldr`.
54716  var reduceRight = createReduce(-1);
54717
54718  // Return all the elements that pass a truth test.
54719  function filter(obj, predicate, context) {
54720    var results = [];
54721    predicate = cb(predicate, context);
54722    each(obj, function(value, index, list) {
54723      if (predicate(value, index, list)) results.push(value);
54724    });
54725    return results;
54726  }
54727
54728  // Return all the elements for which a truth test fails.
54729  function reject(obj, predicate, context) {
54730    return filter(obj, negate(cb(predicate)), context);
54731  }
54732
54733  // Determine whether all of the elements pass a truth test.
54734  function every(obj, predicate, context) {
54735    predicate = cb(predicate, context);
54736    var _keys = !isArrayLike(obj) && keys(obj),
54737        length = (_keys || obj).length;
54738    for (var index = 0; index < length; index++) {
54739      var currentKey = _keys ? _keys[index] : index;
54740      if (!predicate(obj[currentKey], currentKey, obj)) return false;
54741    }
54742    return true;
54743  }
54744
54745  // Determine if at least one element in the object passes a truth test.
54746  function some(obj, predicate, context) {
54747    predicate = cb(predicate, context);
54748    var _keys = !isArrayLike(obj) && keys(obj),
54749        length = (_keys || obj).length;
54750    for (var index = 0; index < length; index++) {
54751      var currentKey = _keys ? _keys[index] : index;
54752      if (predicate(obj[currentKey], currentKey, obj)) return true;
54753    }
54754    return false;
54755  }
54756
54757  // Determine if the array or object contains a given item (using `===`).
54758  function contains(obj, item, fromIndex, guard) {
54759    if (!isArrayLike(obj)) obj = values(obj);
54760    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
54761    return indexOf(obj, item, fromIndex) >= 0;
54762  }
54763
54764  // Invoke a method (with arguments) on every item in a collection.
54765  var invoke = restArguments(function(obj, path, args) {
54766    var contextPath, func;
54767    if (isFunction$1(path)) {
54768      func = path;
54769    } else {
54770      path = toPath(path);
54771      contextPath = path.slice(0, -1);
54772      path = path[path.length - 1];
54773    }
54774    return map(obj, function(context) {
54775      var method = func;
54776      if (!method) {
54777        if (contextPath && contextPath.length) {
54778          context = deepGet(context, contextPath);
54779        }
54780        if (context == null) return void 0;
54781        method = context[path];
54782      }
54783      return method == null ? method : method.apply(context, args);
54784    });
54785  });
54786
54787  // Convenience version of a common use case of `_.map`: fetching a property.
54788  function pluck(obj, key) {
54789    return map(obj, property(key));
54790  }
54791
54792  // Convenience version of a common use case of `_.filter`: selecting only
54793  // objects containing specific `key:value` pairs.
54794  function where(obj, attrs) {
54795    return filter(obj, matcher(attrs));
54796  }
54797
54798  // Return the maximum element (or element-based computation).
54799  function max(obj, iteratee, context) {
54800    var result = -Infinity, lastComputed = -Infinity,
54801        value, computed;
54802    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
54803      obj = isArrayLike(obj) ? obj : values(obj);
54804      for (var i = 0, length = obj.length; i < length; i++) {
54805        value = obj[i];
54806        if (value != null && value > result) {
54807          result = value;
54808        }
54809      }
54810    } else {
54811      iteratee = cb(iteratee, context);
54812      each(obj, function(v, index, list) {
54813        computed = iteratee(v, index, list);
54814        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
54815          result = v;
54816          lastComputed = computed;
54817        }
54818      });
54819    }
54820    return result;
54821  }
54822
54823  // Return the minimum element (or element-based computation).
54824  function min(obj, iteratee, context) {
54825    var result = Infinity, lastComputed = Infinity,
54826        value, computed;
54827    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
54828      obj = isArrayLike(obj) ? obj : values(obj);
54829      for (var i = 0, length = obj.length; i < length; i++) {
54830        value = obj[i];
54831        if (value != null && value < result) {
54832          result = value;
54833        }
54834      }
54835    } else {
54836      iteratee = cb(iteratee, context);
54837      each(obj, function(v, index, list) {
54838        computed = iteratee(v, index, list);
54839        if (computed < lastComputed || computed === Infinity && result === Infinity) {
54840          result = v;
54841          lastComputed = computed;
54842        }
54843      });
54844    }
54845    return result;
54846  }
54847
54848  // Sample **n** random values from a collection using the modern version of the
54849  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
54850  // If **n** is not specified, returns a single random element.
54851  // The internal `guard` argument allows it to work with `_.map`.
54852  function sample(obj, n, guard) {
54853    if (n == null || guard) {
54854      if (!isArrayLike(obj)) obj = values(obj);
54855      return obj[random(obj.length - 1)];
54856    }
54857    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
54858    var length = getLength(sample);
54859    n = Math.max(Math.min(n, length), 0);
54860    var last = length - 1;
54861    for (var index = 0; index < n; index++) {
54862      var rand = random(index, last);
54863      var temp = sample[index];
54864      sample[index] = sample[rand];
54865      sample[rand] = temp;
54866    }
54867    return sample.slice(0, n);
54868  }
54869
54870  // Shuffle a collection.
54871  function shuffle(obj) {
54872    return sample(obj, Infinity);
54873  }
54874
54875  // Sort the object's values by a criterion produced by an iteratee.
54876  function sortBy(obj, iteratee, context) {
54877    var index = 0;
54878    iteratee = cb(iteratee, context);
54879    return pluck(map(obj, function(value, key, list) {
54880      return {
54881        value: value,
54882        index: index++,
54883        criteria: iteratee(value, key, list)
54884      };
54885    }).sort(function(left, right) {
54886      var a = left.criteria;
54887      var b = right.criteria;
54888      if (a !== b) {
54889        if (a > b || a === void 0) return 1;
54890        if (a < b || b === void 0) return -1;
54891      }
54892      return left.index - right.index;
54893    }), 'value');
54894  }
54895
54896  // An internal function used for aggregate "group by" operations.
54897  function group(behavior, partition) {
54898    return function(obj, iteratee, context) {
54899      var result = partition ? [[], []] : {};
54900      iteratee = cb(iteratee, context);
54901      each(obj, function(value, index) {
54902        var key = iteratee(value, index, obj);
54903        behavior(result, value, key);
54904      });
54905      return result;
54906    };
54907  }
54908
54909  // Groups the object's values by a criterion. Pass either a string attribute
54910  // to group by, or a function that returns the criterion.
54911  var groupBy = group(function(result, value, key) {
54912    if (has$1(result, key)) result[key].push(value); else result[key] = [value];
54913  });
54914
54915  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
54916  // when you know that your index values will be unique.
54917  var indexBy = group(function(result, value, key) {
54918    result[key] = value;
54919  });
54920
54921  // Counts instances of an object that group by a certain criterion. Pass
54922  // either a string attribute to count by, or a function that returns the
54923  // criterion.
54924  var countBy = group(function(result, value, key) {
54925    if (has$1(result, key)) result[key]++; else result[key] = 1;
54926  });
54927
54928  // Split a collection into two arrays: one whose elements all pass the given
54929  // truth test, and one whose elements all do not pass the truth test.
54930  var partition = group(function(result, value, pass) {
54931    result[pass ? 0 : 1].push(value);
54932  }, true);
54933
54934  // Safely create a real, live array from anything iterable.
54935  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
54936  function toArray(obj) {
54937    if (!obj) return [];
54938    if (isArray(obj)) return slice.call(obj);
54939    if (isString(obj)) {
54940      // Keep surrogate pair characters together.
54941      return obj.match(reStrSymbol);
54942    }
54943    if (isArrayLike(obj)) return map(obj, identity);
54944    return values(obj);
54945  }
54946
54947  // Return the number of elements in a collection.
54948  function size(obj) {
54949    if (obj == null) return 0;
54950    return isArrayLike(obj) ? obj.length : keys(obj).length;
54951  }
54952
54953  // Internal `_.pick` helper function to determine whether `key` is an enumerable
54954  // property name of `obj`.
54955  function keyInObj(value, key, obj) {
54956    return key in obj;
54957  }
54958
54959  // Return a copy of the object only containing the allowed properties.
54960  var pick = restArguments(function(obj, keys) {
54961    var result = {}, iteratee = keys[0];
54962    if (obj == null) return result;
54963    if (isFunction$1(iteratee)) {
54964      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
54965      keys = allKeys(obj);
54966    } else {
54967      iteratee = keyInObj;
54968      keys = flatten$1(keys, false, false);
54969      obj = Object(obj);
54970    }
54971    for (var i = 0, length = keys.length; i < length; i++) {
54972      var key = keys[i];
54973      var value = obj[key];
54974      if (iteratee(value, key, obj)) result[key] = value;
54975    }
54976    return result;
54977  });
54978
54979  // Return a copy of the object without the disallowed properties.
54980  var omit = restArguments(function(obj, keys) {
54981    var iteratee = keys[0], context;
54982    if (isFunction$1(iteratee)) {
54983      iteratee = negate(iteratee);
54984      if (keys.length > 1) context = keys[1];
54985    } else {
54986      keys = map(flatten$1(keys, false, false), String);
54987      iteratee = function(value, key) {
54988        return !contains(keys, key);
54989      };
54990    }
54991    return pick(obj, iteratee, context);
54992  });
54993
54994  // Returns everything but the last entry of the array. Especially useful on
54995  // the arguments object. Passing **n** will return all the values in
54996  // the array, excluding the last N.
54997  function initial(array, n, guard) {
54998    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
54999  }
55000
55001  // Get the first element of an array. Passing **n** will return the first N
55002  // values in the array. The **guard** check allows it to work with `_.map`.
55003  function first(array, n, guard) {
55004    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
55005    if (n == null || guard) return array[0];
55006    return initial(array, array.length - n);
55007  }
55008
55009  // Returns everything but the first entry of the `array`. Especially useful on
55010  // the `arguments` object. Passing an **n** will return the rest N values in the
55011  // `array`.
55012  function rest(array, n, guard) {
55013    return slice.call(array, n == null || guard ? 1 : n);
55014  }
55015
55016  // Get the last element of an array. Passing **n** will return the last N
55017  // values in the array.
55018  function last(array, n, guard) {
55019    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
55020    if (n == null || guard) return array[array.length - 1];
55021    return rest(array, Math.max(0, array.length - n));
55022  }
55023
55024  // Trim out all falsy values from an array.
55025  function compact(array) {
55026    return filter(array, Boolean);
55027  }
55028
55029  // Flatten out an array, either recursively (by default), or up to `depth`.
55030  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
55031  function flatten(array, depth) {
55032    return flatten$1(array, depth, false);
55033  }
55034
55035  // Take the difference between one array and a number of other arrays.
55036  // Only the elements present in just the first array will remain.
55037  var difference = restArguments(function(array, rest) {
55038    rest = flatten$1(rest, true, true);
55039    return filter(array, function(value){
55040      return !contains(rest, value);
55041    });
55042  });
55043
55044  // Return a version of the array that does not contain the specified value(s).
55045  var without = restArguments(function(array, otherArrays) {
55046    return difference(array, otherArrays);
55047  });
55048
55049  // Produce a duplicate-free version of the array. If the array has already
55050  // been sorted, you have the option of using a faster algorithm.
55051  // The faster algorithm will not work with an iteratee if the iteratee
55052  // is not a one-to-one function, so providing an iteratee will disable
55053  // the faster algorithm.
55054  function uniq(array, isSorted, iteratee, context) {
55055    if (!isBoolean(isSorted)) {
55056      context = iteratee;
55057      iteratee = isSorted;
55058      isSorted = false;
55059    }
55060    if (iteratee != null) iteratee = cb(iteratee, context);
55061    var result = [];
55062    var seen = [];
55063    for (var i = 0, length = getLength(array); i < length; i++) {
55064      var value = array[i],
55065          computed = iteratee ? iteratee(value, i, array) : value;
55066      if (isSorted && !iteratee) {
55067        if (!i || seen !== computed) result.push(value);
55068        seen = computed;
55069      } else if (iteratee) {
55070        if (!contains(seen, computed)) {
55071          seen.push(computed);
55072          result.push(value);
55073        }
55074      } else if (!contains(result, value)) {
55075        result.push(value);
55076      }
55077    }
55078    return result;
55079  }
55080
55081  // Produce an array that contains the union: each distinct element from all of
55082  // the passed-in arrays.
55083  var union = restArguments(function(arrays) {
55084    return uniq(flatten$1(arrays, true, true));
55085  });
55086
55087  // Produce an array that contains every item shared between all the
55088  // passed-in arrays.
55089  function intersection(array) {
55090    var result = [];
55091    var argsLength = arguments.length;
55092    for (var i = 0, length = getLength(array); i < length; i++) {
55093      var item = array[i];
55094      if (contains(result, item)) continue;
55095      var j;
55096      for (j = 1; j < argsLength; j++) {
55097        if (!contains(arguments[j], item)) break;
55098      }
55099      if (j === argsLength) result.push(item);
55100    }
55101    return result;
55102  }
55103
55104  // Complement of zip. Unzip accepts an array of arrays and groups
55105  // each array's elements on shared indices.
55106  function unzip(array) {
55107    var length = array && max(array, getLength).length || 0;
55108    var result = Array(length);
55109
55110    for (var index = 0; index < length; index++) {
55111      result[index] = pluck(array, index);
55112    }
55113    return result;
55114  }
55115
55116  // Zip together multiple lists into a single array -- elements that share
55117  // an index go together.
55118  var zip = restArguments(unzip);
55119
55120  // Converts lists into objects. Pass either a single array of `[key, value]`
55121  // pairs, or two parallel arrays of the same length -- one of keys, and one of
55122  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
55123  function object(list, values) {
55124    var result = {};
55125    for (var i = 0, length = getLength(list); i < length; i++) {
55126      if (values) {
55127        result[list[i]] = values[i];
55128      } else {
55129        result[list[i][0]] = list[i][1];
55130      }
55131    }
55132    return result;
55133  }
55134
55135  // Generate an integer Array containing an arithmetic progression. A port of
55136  // the native Python `range()` function. See
55137  // [the Python documentation](https://docs.python.org/library/functions.html#range).
55138  function range(start, stop, step) {
55139    if (stop == null) {
55140      stop = start || 0;
55141      start = 0;
55142    }
55143    if (!step) {
55144      step = stop < start ? -1 : 1;
55145    }
55146
55147    var length = Math.max(Math.ceil((stop - start) / step), 0);
55148    var range = Array(length);
55149
55150    for (var idx = 0; idx < length; idx++, start += step) {
55151      range[idx] = start;
55152    }
55153
55154    return range;
55155  }
55156
55157  // Chunk a single array into multiple arrays, each containing `count` or fewer
55158  // items.
55159  function chunk(array, count) {
55160    if (count == null || count < 1) return [];
55161    var result = [];
55162    var i = 0, length = array.length;
55163    while (i < length) {
55164      result.push(slice.call(array, i, i += count));
55165    }
55166    return result;
55167  }
55168
55169  // Helper function to continue chaining intermediate results.
55170  function chainResult(instance, obj) {
55171    return instance._chain ? _$1(obj).chain() : obj;
55172  }
55173
55174  // Add your own custom functions to the Underscore object.
55175  function mixin(obj) {
55176    each(functions(obj), function(name) {
55177      var func = _$1[name] = obj[name];
55178      _$1.prototype[name] = function() {
55179        var args = [this._wrapped];
55180        push.apply(args, arguments);
55181        return chainResult(this, func.apply(_$1, args));
55182      };
55183    });
55184    return _$1;
55185  }
55186
55187  // Add all mutator `Array` functions to the wrapper.
55188  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
55189    var method = ArrayProto[name];
55190    _$1.prototype[name] = function() {
55191      var obj = this._wrapped;
55192      if (obj != null) {
55193        method.apply(obj, arguments);
55194        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
55195          delete obj[0];
55196        }
55197      }
55198      return chainResult(this, obj);
55199    };
55200  });
55201
55202  // Add all accessor `Array` functions to the wrapper.
55203  each(['concat', 'join', 'slice'], function(name) {
55204    var method = ArrayProto[name];
55205    _$1.prototype[name] = function() {
55206      var obj = this._wrapped;
55207      if (obj != null) obj = method.apply(obj, arguments);
55208      return chainResult(this, obj);
55209    };
55210  });
55211
55212  // Named Exports
55213
55214  var allExports = {
55215    __proto__: null,
55216    VERSION: VERSION,
55217    restArguments: restArguments,
55218    isObject: isObject,
55219    isNull: isNull,
55220    isUndefined: isUndefined,
55221    isBoolean: isBoolean,
55222    isElement: isElement,
55223    isString: isString,
55224    isNumber: isNumber,
55225    isDate: isDate,
55226    isRegExp: isRegExp,
55227    isError: isError,
55228    isSymbol: isSymbol,
55229    isArrayBuffer: isArrayBuffer,
55230    isDataView: isDataView$1,
55231    isArray: isArray,
55232    isFunction: isFunction$1,
55233    isArguments: isArguments$1,
55234    isFinite: isFinite$1,
55235    isNaN: isNaN$1,
55236    isTypedArray: isTypedArray$1,
55237    isEmpty: isEmpty,
55238    isMatch: isMatch,
55239    isEqual: isEqual,
55240    isMap: isMap,
55241    isWeakMap: isWeakMap,
55242    isSet: isSet,
55243    isWeakSet: isWeakSet,
55244    keys: keys,
55245    allKeys: allKeys,
55246    values: values,
55247    pairs: pairs,
55248    invert: invert,
55249    functions: functions,
55250    methods: functions,
55251    extend: extend,
55252    extendOwn: extendOwn,
55253    assign: extendOwn,
55254    defaults: defaults,
55255    create: create,
55256    clone: clone,
55257    tap: tap,
55258    get: get,
55259    has: has,
55260    mapObject: mapObject,
55261    identity: identity,
55262    constant: constant,
55263    noop: noop,
55264    toPath: toPath$1,
55265    property: property,
55266    propertyOf: propertyOf,
55267    matcher: matcher,
55268    matches: matcher,
55269    times: times,
55270    random: random,
55271    now: now,
55272    escape: _escape,
55273    unescape: _unescape,
55274    templateSettings: templateSettings,
55275    template: template,
55276    result: result,
55277    uniqueId: uniqueId,
55278    chain: chain,
55279    iteratee: iteratee,
55280    partial: partial,
55281    bind: bind,
55282    bindAll: bindAll,
55283    memoize: memoize,
55284    delay: delay,
55285    defer: defer,
55286    throttle: throttle,
55287    debounce: debounce,
55288    wrap: wrap,
55289    negate: negate,
55290    compose: compose,
55291    after: after,
55292    before: before,
55293    once: once,
55294    findKey: findKey,
55295    findIndex: findIndex,
55296    findLastIndex: findLastIndex,
55297    sortedIndex: sortedIndex,
55298    indexOf: indexOf,
55299    lastIndexOf: lastIndexOf,
55300    find: find,
55301    detect: find,
55302    findWhere: findWhere,
55303    each: each,
55304    forEach: each,
55305    map: map,
55306    collect: map,
55307    reduce: reduce,
55308    foldl: reduce,
55309    inject: reduce,
55310    reduceRight: reduceRight,
55311    foldr: reduceRight,
55312    filter: filter,
55313    select: filter,
55314    reject: reject,
55315    every: every,
55316    all: every,
55317    some: some,
55318    any: some,
55319    contains: contains,
55320    includes: contains,
55321    include: contains,
55322    invoke: invoke,
55323    pluck: pluck,
55324    where: where,
55325    max: max,
55326    min: min,
55327    shuffle: shuffle,
55328    sample: sample,
55329    sortBy: sortBy,
55330    groupBy: groupBy,
55331    indexBy: indexBy,
55332    countBy: countBy,
55333    partition: partition,
55334    toArray: toArray,
55335    size: size,
55336    pick: pick,
55337    omit: omit,
55338    first: first,
55339    head: first,
55340    take: first,
55341    initial: initial,
55342    last: last,
55343    rest: rest,
55344    tail: rest,
55345    drop: rest,
55346    compact: compact,
55347    flatten: flatten,
55348    without: without,
55349    uniq: uniq,
55350    unique: uniq,
55351    union: union,
55352    intersection: intersection,
55353    difference: difference,
55354    unzip: unzip,
55355    transpose: unzip,
55356    zip: zip,
55357    object: object,
55358    range: range,
55359    chunk: chunk,
55360    mixin: mixin,
55361    'default': _$1
55362  };
55363
55364  // Default Export
55365
55366  // Add all of the Underscore functions to the wrapper object.
55367  var _ = mixin(allExports);
55368  // Legacy Node.js API.
55369  _._ = _;
55370
55371  return _;
55372
55373})));
55374//# sourceMappingURL=underscore-umd.js.map
55375
55376//     Backbone.js 1.0.0
55377
55378//     (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc.
55379//     Backbone may be freely distributed under the MIT license.
55380//     For all details and documentation:
55381//     http://backbonejs.org
55382
55383(function(){
55384
55385  // Initial Setup
55386  // -------------
55387
55388  // Save a reference to the global object (`window` in the browser, `exports`
55389  // on the server).
55390  var root = this;
55391
55392  // Save the previous value of the `Backbone` variable, so that it can be
55393  // restored later on, if `noConflict` is used.
55394  var previousBackbone = root.Backbone;
55395
55396  // Create local references to array methods we'll want to use later.
55397  var array = [];
55398  var push = array.push;
55399  var slice = array.slice;
55400  var splice = array.splice;
55401
55402  // The top-level namespace. All public Backbone classes and modules will
55403  // be attached to this. Exported for both the browser and the server.
55404  var Backbone;
55405  if (typeof exports !== 'undefined') {
55406    Backbone = exports;
55407  } else {
55408    Backbone = root.Backbone = {};
55409  }
55410
55411  // Current version of the library. Keep in sync with `package.json`.
55412  Backbone.VERSION = '1.0.0';
55413
55414  // Require Underscore, if we're on the server, and it's not already present.
55415  var _ = root._;
55416  if (!_ && (typeof require !== 'undefined')) _ = require('underscore');
55417
55418  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns
55419  // the `$` variable.
55420  Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$;
55421
55422  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable
55423  // to its previous owner. Returns a reference to this Backbone object.
55424  Backbone.noConflict = function() {
55425    root.Backbone = previousBackbone;
55426    return this;
55427  };
55428
55429  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option
55430  // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and
55431  // set a `X-Http-Method-Override` header.
55432  Backbone.emulateHTTP = false;
55433
55434  // Turn on `emulateJSON` to support legacy servers that can't deal with direct
55435  // `application/json` requests ... will encode the body as
55436  // `application/x-www-form-urlencoded` instead and will send the model in a
55437  // form param named `model`.
55438  Backbone.emulateJSON = false;
55439
55440  // Backbone.Events
55441  // ---------------
55442
55443  // A module that can be mixed in to *any object* in order to provide it with
55444  // custom events. You may bind with `on` or remove with `off` callback
55445  // functions to an event; `trigger`-ing an event fires all callbacks in
55446  // succession.
55447  //
55448  //     var object = {};
55449  //     _.extend(object, Backbone.Events);
55450  //     object.on('expand', function(){ alert('expanded'); });
55451  //     object.trigger('expand');
55452  //
55453  var Events = Backbone.Events = {
55454
55455    // Bind an event to a `callback` function. Passing `"all"` will bind
55456    // the callback to all events fired.
55457    on: function(name, callback, context) {
55458      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
55459      this._events || (this._events = {});
55460      var events = this._events[name] || (this._events[name] = []);
55461      events.push({callback: callback, context: context, ctx: context || this});
55462      return this;
55463    },
55464
55465    // Bind an event to only be triggered a single time. After the first time
55466    // the callback is invoked, it will be removed.
55467    once: function(name, callback, context) {
55468      if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
55469      var self = this;
55470      var once = _.once(function() {
55471        self.off(name, once);
55472        callback.apply(this, arguments);
55473      });
55474      once._callback = callback;
55475      return this.on(name, once, context);
55476    },
55477
55478    // Remove one or many callbacks. If `context` is null, removes all
55479    // callbacks with that function. If `callback` is null, removes all
55480    // callbacks for the event. If `name` is null, removes all bound
55481    // callbacks for all events.
55482    off: function(name, callback, context) {
55483      var retain, ev, events, names, i, l, j, k;
55484      if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
55485      if (!name && !callback && !context) {
55486        this._events = {};
55487        return this;
55488      }
55489
55490      names = name ? [name] : _.keys(this._events);
55491      for (i = 0, l = names.length; i < l; i++) {
55492        name = names[i];
55493        if (events = this._events[name]) {
55494          this._events[name] = retain = [];
55495          if (callback || context) {
55496            for (j = 0, k = events.length; j < k; j++) {
55497              ev = events[j];
55498              if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
55499                  (context && context !== ev.context)) {
55500                retain.push(ev);
55501              }
55502            }
55503          }
55504          if (!retain.length) delete this._events[name];
55505        }
55506      }
55507
55508      return this;
55509    },
55510
55511    // Trigger one or many events, firing all bound callbacks. Callbacks are
55512    // passed the same arguments as `trigger` is, apart from the event name
55513    // (unless you're listening on `"all"`, which will cause your callback to
55514    // receive the true name of the event as the first argument).
55515    trigger: function(name) {
55516      if (!this._events) return this;
55517      var args = slice.call(arguments, 1);
55518      if (!eventsApi(this, 'trigger', name, args)) return this;
55519      var events = this._events[name];
55520      var allEvents = this._events.all;
55521      if (events) triggerEvents(events, args);
55522      if (allEvents) triggerEvents(allEvents, arguments);
55523      return this;
55524    },
55525
55526    // Tell this object to stop listening to either specific events ... or
55527    // to every object it's currently listening to.
55528    stopListening: function(obj, name, callback) {
55529      var listeners = this._listeners;
55530      if (!listeners) return this;
55531      var deleteListener = !name && !callback;
55532      if (typeof name === 'object') callback = this;
55533      if (obj) (listeners = {})[obj._listenerId] = obj;
55534      for (var id in listeners) {
55535        listeners[id].off(name, callback, this);
55536        if (deleteListener) delete this._listeners[id];
55537      }
55538      return this;
55539    }
55540
55541  };
55542
55543  // Regular expression used to split event strings.
55544  var eventSplitter = /\s+/;
55545
55546  // Implement fancy features of the Events API such as multiple event
55547  // names `"change blur"` and jQuery-style event maps `{change: action}`
55548  // in terms of the existing API.
55549  var eventsApi = function(obj, action, name, rest) {
55550    if (!name) return true;
55551
55552    // Handle event maps.
55553    if (typeof name === 'object') {
55554      for (var key in name) {
55555        obj[action].apply(obj, [key, name[key]].concat(rest));
55556      }
55557      return false;
55558    }
55559
55560    // Handle space separated event names.
55561    if (eventSplitter.test(name)) {
55562      var names = name.split(eventSplitter);
55563      for (var i = 0, l = names.length; i < l; i++) {
55564        obj[action].apply(obj, [names[i]].concat(rest));
55565      }
55566      return false;
55567    }
55568
55569    return true;
55570  };
55571
55572  // A difficult-to-believe, but optimized internal dispatch function for
55573  // triggering events. Tries to keep the usual cases speedy (most internal
55574  // Backbone events have 3 arguments).
55575  var triggerEvents = function(events, args) {
55576    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
55577    switch (args.length) {
55578      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
55579      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
55580      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
55581      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
55582      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
55583    }
55584  };
55585
55586  var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
55587
55588  // Inversion-of-control versions of `on` and `once`. Tell *this* object to
55589  // listen to an event in another object ... keeping track of what it's
55590  // listening to.
55591  _.each(listenMethods, function(implementation, method) {
55592    Events[method] = function(obj, name, callback) {
55593      var listeners = this._listeners || (this._listeners = {});
55594      var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));
55595      listeners[id] = obj;
55596      if (typeof name === 'object') callback = this;
55597      obj[implementation](name, callback, this);
55598      return this;
55599    };
55600  });
55601
55602  // Aliases for backwards compatibility.
55603  Events.bind   = Events.on;
55604  Events.unbind = Events.off;
55605
55606  // Allow the `Backbone` object to serve as a global event bus, for folks who
55607  // want global "pubsub" in a convenient place.
55608  _.extend(Backbone, Events);
55609
55610  // Backbone.Model
55611  // --------------
55612
55613  // Backbone **Models** are the basic data object in the framework --
55614  // frequently representing a row in a table in a database on your server.
55615  // A discrete chunk of data and a bunch of useful, related methods for
55616  // performing computations and transformations on that data.
55617
55618  // Create a new model with the specified attributes. A client id (`cid`)
55619  // is automatically generated and assigned for you.
55620  var Model = Backbone.Model = function(attributes, options) {
55621    var defaults;
55622    var attrs = attributes || {};
55623    options || (options = {});
55624    this.cid = _.uniqueId('c');
55625    this.attributes = {};
55626    _.extend(this, _.pick(options, modelOptions));
55627    if (options.parse) attrs = this.parse(attrs, options) || {};
55628    if (defaults = _.result(this, 'defaults')) {
55629      attrs = _.defaults({}, attrs, defaults);
55630    }
55631    this.set(attrs, options);
55632    this.changed = {};
55633    this.initialize.apply(this, arguments);
55634  };
55635
55636  // A list of options to be attached directly to the model, if provided.
55637  var modelOptions = ['url', 'urlRoot', 'collection'];
55638
55639  // Attach all inheritable methods to the Model prototype.
55640  _.extend(Model.prototype, Events, {
55641
55642    // A hash of attributes whose current and previous value differ.
55643    changed: null,
55644
55645    // The value returned during the last failed validation.
55646    validationError: null,
55647
55648    // The default name for the JSON `id` attribute is `"id"`. MongoDB and
55649    // CouchDB users may want to set this to `"_id"`.
55650    idAttribute: 'id',
55651
55652    // Initialize is an empty function by default. Override it with your own
55653    // initialization logic.
55654    initialize: function(){},
55655
55656    // Return a copy of the model's `attributes` object.
55657    toJSON: function(options) {
55658      return _.clone(this.attributes);
55659    },
55660
55661    // Proxy `Backbone.sync` by default -- but override this if you need
55662    // custom syncing semantics for *this* particular model.
55663    sync: function() {
55664      return Backbone.sync.apply(this, arguments);
55665    },
55666
55667    // Get the value of an attribute.
55668    get: function(attr) {
55669      return this.attributes[attr];
55670    },
55671
55672    // Get the HTML-escaped value of an attribute.
55673    escape: function(attr) {
55674      return _.escape(this.get(attr));
55675    },
55676
55677    // Returns `true` if the attribute contains a value that is not null
55678    // or undefined.
55679    has: function(attr) {
55680      return this.get(attr) != null;
55681    },
55682
55683    // Set a hash of model attributes on the object, firing `"change"`. This is
55684    // the core primitive operation of a model, updating the data and notifying
55685    // anyone who needs to know about the change in state. The heart of the beast.
55686    set: function(key, val, options) {
55687      var attr, attrs, unset, changes, silent, changing, prev, current;
55688      if (key == null) return this;
55689
55690      // Handle both `"key", value` and `{key: value}` -style arguments.
55691      if (typeof key === 'object') {
55692        attrs = key;
55693        options = val;
55694      } else {
55695        (attrs = {})[key] = val;
55696      }
55697
55698      options || (options = {});
55699
55700      // Run validation.
55701      if (!this._validate(attrs, options)) return false;
55702
55703      // Extract attributes and options.
55704      unset           = options.unset;
55705      silent          = options.silent;
55706      changes         = [];
55707      changing        = this._changing;
55708      this._changing  = true;
55709
55710      if (!changing) {
55711        this._previousAttributes = _.clone(this.attributes);
55712        this.changed = {};
55713      }
55714      current = this.attributes, prev = this._previousAttributes;
55715
55716      // Check for changes of `id`.
55717      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
55718
55719      // For each `set` attribute, update or delete the current value.
55720      for (attr in attrs) {
55721        val = attrs[attr];
55722        if (!_.isEqual(current[attr], val)) changes.push(attr);
55723        if (!_.isEqual(prev[attr], val)) {
55724          this.changed[attr] = val;
55725        } else {
55726          delete this.changed[attr];
55727        }
55728        unset ? delete current[attr] : current[attr] = val;
55729      }
55730
55731      // Trigger all relevant attribute changes.
55732      if (!silent) {
55733        if (changes.length) this._pending = true;
55734        for (var i = 0, l = changes.length; i < l; i++) {
55735          this.trigger('change:' + changes[i], this, current[changes[i]], options);
55736        }
55737      }
55738
55739      // You might be wondering why there's a `while` loop here. Changes can
55740      // be recursively nested within `"change"` events.
55741      if (changing) return this;
55742      if (!silent) {
55743        while (this._pending) {
55744          this._pending = false;
55745          this.trigger('change', this, options);
55746        }
55747      }
55748      this._pending = false;
55749      this._changing = false;
55750      return this;
55751    },
55752
55753    // Remove an attribute from the model, firing `"change"`. `unset` is a noop
55754    // if the attribute doesn't exist.
55755    unset: function(attr, options) {
55756      return this.set(attr, void 0, _.extend({}, options, {unset: true}));
55757    },
55758
55759    // Clear all attributes on the model, firing `"change"`.
55760    clear: function(options) {
55761      var attrs = {};
55762      for (var key in this.attributes) attrs[key] = void 0;
55763      return this.set(attrs, _.extend({}, options, {unset: true}));
55764    },
55765
55766    // Determine if the model has changed since the last `"change"` event.
55767    // If you specify an attribute name, determine if that attribute has changed.
55768    hasChanged: function(attr) {
55769      if (attr == null) return !_.isEmpty(this.changed);
55770      return _.has(this.changed, attr);
55771    },
55772
55773    // Return an object containing all the attributes that have changed, or
55774    // false if there are no changed attributes. Useful for determining what
55775    // parts of a view need to be updated and/or what attributes need to be
55776    // persisted to the server. Unset attributes will be set to undefined.
55777    // You can also pass an attributes object to diff against the model,
55778    // determining if there *would be* a change.
55779    changedAttributes: function(diff) {
55780      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
55781      var val, changed = false;
55782      var old = this._changing ? this._previousAttributes : this.attributes;
55783      for (var attr in diff) {
55784        if (_.isEqual(old[attr], (val = diff[attr]))) continue;
55785        (changed || (changed = {}))[attr] = val;
55786      }
55787      return changed;
55788    },
55789
55790    // Get the previous value of an attribute, recorded at the time the last
55791    // `"change"` event was fired.
55792    previous: function(attr) {
55793      if (attr == null || !this._previousAttributes) return null;
55794      return this._previousAttributes[attr];
55795    },
55796
55797    // Get all of the attributes of the model at the time of the previous
55798    // `"change"` event.
55799    previousAttributes: function() {
55800      return _.clone(this._previousAttributes);
55801    },
55802
55803    // Fetch the model from the server. If the server's representation of the
55804    // model differs from its current attributes, they will be overridden,
55805    // triggering a `"change"` event.
55806    fetch: function(options) {
55807      options = options ? _.clone(options) : {};
55808      if (options.parse === void 0) options.parse = true;
55809      var model = this;
55810      var success = options.success;
55811      options.success = function(resp) {
55812        if (!model.set(model.parse(resp, options), options)) return false;
55813        if (success) success(model, resp, options);
55814        model.trigger('sync', model, resp, options);
55815      };
55816      wrapError(this, options);
55817      return this.sync('read', this, options);
55818    },
55819
55820    // Set a hash of model attributes, and sync the model to the server.
55821    // If the server returns an attributes hash that differs, the model's
55822    // state will be `set` again.
55823    save: function(key, val, options) {
55824      var attrs, method, xhr, attributes = this.attributes;
55825
55826      // Handle both `"key", value` and `{key: value}` -style arguments.
55827      if (key == null || typeof key === 'object') {
55828        attrs = key;
55829        options = val;
55830      } else {
55831        (attrs = {})[key] = val;
55832      }
55833
55834      // If we're not waiting and attributes exist, save acts as `set(attr).save(null, opts)`.
55835      if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;
55836
55837      options = _.extend({validate: true}, options);
55838
55839      // Do not persist invalid models.
55840      if (!this._validate(attrs, options)) return false;
55841
55842      // Set temporary attributes if `{wait: true}`.
55843      if (attrs && options.wait) {
55844        this.attributes = _.extend({}, attributes, attrs);
55845      }
55846
55847      // After a successful server-side save, the client is (optionally)
55848      // updated with the server-side state.
55849      if (options.parse === void 0) options.parse = true;
55850      var model = this;
55851      var success = options.success;
55852      options.success = function(resp) {
55853        // Ensure attributes are restored during synchronous saves.
55854        model.attributes = attributes;
55855        var serverAttrs = model.parse(resp, options);
55856        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
55857        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
55858          return false;
55859        }
55860        if (success) success(model, resp, options);
55861        model.trigger('sync', model, resp, options);
55862      };
55863      wrapError(this, options);
55864
55865      method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
55866      if (method === 'patch') options.attrs = attrs;
55867      xhr = this.sync(method, this, options);
55868
55869      // Restore attributes.
55870      if (attrs && options.wait) this.attributes = attributes;
55871
55872      return xhr;
55873    },
55874
55875    // Destroy this model on the server if it was already persisted.
55876    // Optimistically removes the model from its collection, if it has one.
55877    // If `wait: true` is passed, waits for the server to respond before removal.
55878    destroy: function(options) {
55879      options = options ? _.clone(options) : {};
55880      var model = this;
55881      var success = options.success;
55882
55883      var destroy = function() {
55884        model.trigger('destroy', model, model.collection, options);
55885      };
55886
55887      options.success = function(resp) {
55888        if (options.wait || model.isNew()) destroy();
55889        if (success) success(model, resp, options);
55890        if (!model.isNew()) model.trigger('sync', model, resp, options);
55891      };
55892
55893      if (this.isNew()) {
55894        options.success();
55895        return false;
55896      }
55897      wrapError(this, options);
55898
55899      var xhr = this.sync('delete', this, options);
55900      if (!options.wait) destroy();
55901      return xhr;
55902    },
55903
55904    // Default URL for the model's representation on the server -- if you're
55905    // using Backbone's restful methods, override this to change the endpoint
55906    // that will be called.
55907    url: function() {
55908      var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
55909      if (this.isNew()) return base;
55910      return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
55911    },
55912
55913    // **parse** converts a response into the hash of attributes to be `set` on
55914    // the model. The default implementation is just to pass the response along.
55915    parse: function(resp, options) {
55916      return resp;
55917    },
55918
55919    // Create a new model with identical attributes to this one.
55920    clone: function() {
55921      return new this.constructor(this.attributes);
55922    },
55923
55924    // A model is new if it has never been saved to the server, and lacks an id.
55925    isNew: function() {
55926      return this.id == null;
55927    },
55928
55929    // Check if the model is currently in a valid state.
55930    isValid: function(options) {
55931      return this._validate({}, _.extend(options || {}, { validate: true }));
55932    },
55933
55934    // Run validation against the next complete set of model attributes,
55935    // returning `true` if all is well. Otherwise, fire an `"invalid"` event.
55936    _validate: function(attrs, options) {
55937      if (!options.validate || !this.validate) return true;
55938      attrs = _.extend({}, this.attributes, attrs);
55939      var error = this.validationError = this.validate(attrs, options) || null;
55940      if (!error) return true;
55941      this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error}));
55942      return false;
55943    }
55944
55945  });
55946
55947  // Underscore methods that we want to implement on the Model.
55948  var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];
55949
55950  // Mix in each Underscore method as a proxy to `Model#attributes`.
55951  _.each(modelMethods, function(method) {
55952    Model.prototype[method] = function() {
55953      var args = slice.call(arguments);
55954      args.unshift(this.attributes);
55955      return _[method].apply(_, args);
55956    };
55957  });
55958
55959  // Backbone.Collection
55960  // -------------------
55961
55962  // If models tend to represent a single row of data, a Backbone Collection is
55963  // more analagous to a table full of data ... or a small slice or page of that
55964  // table, or a collection of rows that belong together for a particular reason
55965  // -- all of the messages in this particular folder, all of the documents
55966  // belonging to this particular author, and so on. Collections maintain
55967  // indexes of their models, both in order, and for lookup by `id`.
55968
55969  // Create a new **Collection**, perhaps to contain a specific type of `model`.
55970  // If a `comparator` is specified, the Collection will maintain
55971  // its models in sort order, as they're added and removed.
55972  var Collection = Backbone.Collection = function(models, options) {
55973    options || (options = {});
55974    if (options.url) this.url = options.url;
55975    if (options.model) this.model = options.model;
55976    if (options.comparator !== void 0) this.comparator = options.comparator;
55977    this._reset();
55978    this.initialize.apply(this, arguments);
55979    if (models) this.reset(models, _.extend({silent: true}, options));
55980  };
55981
55982  // Default options for `Collection#set`.
55983  var setOptions = {add: true, remove: true, merge: true};
55984  var addOptions = {add: true, merge: false, remove: false};
55985
55986  // Define the Collection's inheritable methods.
55987  _.extend(Collection.prototype, Events, {
55988
55989    // The default model for a collection is just a **Backbone.Model**.
55990    // This should be overridden in most cases.
55991    model: Model,
55992
55993    // Initialize is an empty function by default. Override it with your own
55994    // initialization logic.
55995    initialize: function(){},
55996
55997    // The JSON representation of a Collection is an array of the
55998    // models' attributes.
55999    toJSON: function(options) {
56000      return this.map(function(model){ return model.toJSON(options); });
56001    },
56002
56003    // Proxy `Backbone.sync` by default.
56004    sync: function() {
56005      return Backbone.sync.apply(this, arguments);
56006    },
56007
56008    // Add a model, or list of models to the set.
56009    add: function(models, options) {
56010      return this.set(models, _.defaults(options || {}, addOptions));
56011    },
56012
56013    // Remove a model, or a list of models from the set.
56014    remove: function(models, options) {
56015      models = _.isArray(models) ? models.slice() : [models];
56016      options || (options = {});
56017      var i, l, index, model;
56018      for (i = 0, l = models.length; i < l; i++) {
56019        model = this.get(models[i]);
56020        if (!model) continue;
56021        delete this._byId[model.id];
56022        delete this._byId[model.cid];
56023        index = this.indexOf(model);
56024        this.models.splice(index, 1);
56025        this.length--;
56026        if (!options.silent) {
56027          options.index = index;
56028          model.trigger('remove', model, this, options);
56029        }
56030        this._removeReference(model);
56031      }
56032      return this;
56033    },
56034
56035    // Update a collection by `set`-ing a new list of models, adding new ones,
56036    // removing models that are no longer present, and merging models that
56037    // already exist in the collection, as necessary. Similar to **Model#set**,
56038    // the core operation for updating the data contained by the collection.
56039    set: function(models, options) {
56040      options = _.defaults(options || {}, setOptions);
56041      if (options.parse) models = this.parse(models, options);
56042      if (!_.isArray(models)) models = models ? [models] : [];
56043      var i, l, model, attrs, existing, sort;
56044      var at = options.at;
56045      var sortable = this.comparator && (at == null) && options.sort !== false;
56046      var sortAttr = _.isString(this.comparator) ? this.comparator : null;
56047      var toAdd = [], toRemove = [], modelMap = {};
56048
56049      // Turn bare objects into model references, and prevent invalid models
56050      // from being added.
56051      for (i = 0, l = models.length; i < l; i++) {
56052        if (!(model = this._prepareModel(models[i], options))) continue;
56053
56054        // If a duplicate is found, prevent it from being added and
56055        // optionally merge it into the existing model.
56056        if (existing = this.get(model)) {
56057          if (options.remove) modelMap[existing.cid] = true;
56058          if (options.merge) {
56059            existing.set(model.attributes, options);
56060            if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
56061          }
56062
56063        // This is a new model, push it to the `toAdd` list.
56064        } else if (options.add) {
56065          toAdd.push(model);
56066
56067          // Listen to added models' events, and index models for lookup by
56068          // `id` and by `cid`.
56069          model.on('all', this._onModelEvent, this);
56070          this._byId[model.cid] = model;
56071          if (model.id != null) this._byId[model.id] = model;
56072        }
56073      }
56074
56075      // Remove nonexistent models if appropriate.
56076      if (options.remove) {
56077        for (i = 0, l = this.length; i < l; ++i) {
56078          if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
56079        }
56080        if (toRemove.length) this.remove(toRemove, options);
56081      }
56082
56083      // See if sorting is needed, update `length` and splice in new models.
56084      if (toAdd.length) {
56085        if (sortable) sort = true;
56086        this.length += toAdd.length;
56087        if (at != null) {
56088          splice.apply(this.models, [at, 0].concat(toAdd));
56089        } else {
56090          push.apply(this.models, toAdd);
56091        }
56092      }
56093
56094      // Silently sort the collection if appropriate.
56095      if (sort) this.sort({silent: true});
56096
56097      if (options.silent) return this;
56098
56099      // Trigger `add` events.
56100      for (i = 0, l = toAdd.length; i < l; i++) {
56101        (model = toAdd[i]).trigger('add', model, this, options);
56102      }
56103
56104      // Trigger `sort` if the collection was sorted.
56105      if (sort) this.trigger('sort', this, options);
56106      return this;
56107    },
56108
56109    // When you have more items than you want to add or remove individually,
56110    // you can reset the entire set with a new list of models, without firing
56111    // any granular `add` or `remove` events. Fires `reset` when finished.
56112    // Useful for bulk operations and optimizations.
56113    reset: function(models, options) {
56114      options || (options = {});
56115      for (var i = 0, l = this.models.length; i < l; i++) {
56116        this._removeReference(this.models[i]);
56117      }
56118      options.previousModels = this.models;
56119      this._reset();
56120      this.add(models, _.extend({silent: true}, options));
56121      if (!options.silent) this.trigger('reset', this, options);
56122      return this;
56123    },
56124
56125    // Add a model to the end of the collection.
56126    push: function(model, options) {
56127      model = this._prepareModel(model, options);
56128      this.add(model, _.extend({at: this.length}, options));
56129      return model;
56130    },
56131
56132    // Remove a model from the end of the collection.
56133    pop: function(options) {
56134      var model = this.at(this.length - 1);
56135      this.remove(model, options);
56136      return model;
56137    },
56138
56139    // Add a model to the beginning of the collection.
56140    unshift: function(model, options) {
56141      model = this._prepareModel(model, options);
56142      this.add(model, _.extend({at: 0}, options));
56143      return model;
56144    },
56145
56146    // Remove a model from the beginning of the collection.
56147    shift: function(options) {
56148      var model = this.at(0);
56149      this.remove(model, options);
56150      return model;
56151    },
56152
56153    // Slice out a sub-array of models from the collection.
56154    slice: function(begin, end) {
56155      return this.models.slice(begin, end);
56156    },
56157
56158    // Get a model from the set by id.
56159    get: function(obj) {
56160      if (obj == null) return void 0;
56161      return this._byId[obj.id != null ? obj.id : obj.cid || obj];
56162    },
56163
56164    // Get the model at the given index.
56165    at: function(index) {
56166      return this.models[index];
56167    },
56168
56169    // Return models with matching attributes. Useful for simple cases of
56170    // `filter`.
56171    where: function(attrs, first) {
56172      if (_.isEmpty(attrs)) return first ? void 0 : [];
56173      return this[first ? 'find' : 'filter'](function(model) {
56174        for (var key in attrs) {
56175          if (attrs[key] !== model.get(key)) return false;
56176        }
56177        return true;
56178      });
56179    },
56180
56181    // Return the first model with matching attributes. Useful for simple cases
56182    // of `find`.
56183    findWhere: function(attrs) {
56184      return this.where(attrs, true);
56185    },
56186
56187    // Force the collection to re-sort itself. You don't need to call this under
56188    // normal circumstances, as the set will maintain sort order as each item
56189    // is added.
56190    sort: function(options) {
56191      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
56192      options || (options = {});
56193
56194      // Run sort based on type of `comparator`.
56195      if (_.isString(this.comparator) || this.comparator.length === 1) {
56196        this.models = this.sortBy(this.comparator, this);
56197      } else {
56198        this.models.sort(_.bind(this.comparator, this));
56199      }
56200
56201      if (!options.silent) this.trigger('sort', this, options);
56202      return this;
56203    },
56204
56205    // Figure out the smallest index at which a model should be inserted so as
56206    // to maintain order.
56207    sortedIndex: function(model, value, context) {
56208      value || (value = this.comparator);
56209      var iterator = _.isFunction(value) ? value : function(model) {
56210        return model.get(value);
56211      };
56212      return _.sortedIndex(this.models, model, iterator, context);
56213    },
56214
56215    // Pluck an attribute from each model in the collection.
56216    pluck: function(attr) {
56217      return _.invoke(this.models, 'get', attr);
56218    },
56219
56220    // Fetch the default set of models for this collection, resetting the
56221    // collection when they arrive. If `reset: true` is passed, the response
56222    // data will be passed through the `reset` method instead of `set`.
56223    fetch: function(options) {
56224      options = options ? _.clone(options) : {};
56225      if (options.parse === void 0) options.parse = true;
56226      var success = options.success;
56227      var collection = this;
56228      options.success = function(resp) {
56229        var method = options.reset ? 'reset' : 'set';
56230        collection[method](resp, options);
56231        if (success) success(collection, resp, options);
56232        collection.trigger('sync', collection, resp, options);
56233      };
56234      wrapError(this, options);
56235      return this.sync('read', this, options);
56236    },
56237
56238    // Create a new instance of a model in this collection. Add the model to the
56239    // collection immediately, unless `wait: true` is passed, in which case we
56240    // wait for the server to agree.
56241    create: function(model, options) {
56242      options = options ? _.clone(options) : {};
56243      if (!(model = this._prepareModel(model, options))) return false;
56244      if (!options.wait) this.add(model, options);
56245      var collection = this;
56246      var success = options.success;
56247      options.success = function(resp) {
56248        if (options.wait) collection.add(model, options);
56249        if (success) success(model, resp, options);
56250      };
56251      model.save(null, options);
56252      return model;
56253    },
56254
56255    // **parse** converts a response into a list of models to be added to the
56256    // collection. The default implementation is just to pass it through.
56257    parse: function(resp, options) {
56258      return resp;
56259    },
56260
56261    // Create a new collection with an identical list of models as this one.
56262    clone: function() {
56263      return new this.constructor(this.models);
56264    },
56265
56266    // Private method to reset all internal state. Called when the collection
56267    // is first initialized or reset.
56268    _reset: function() {
56269      this.length = 0;
56270      this.models = [];
56271      this._byId  = {};
56272    },
56273
56274    // Prepare a hash of attributes (or other model) to be added to this
56275    // collection.
56276    _prepareModel: function(attrs, options) {
56277      if (attrs instanceof Model) {
56278        if (!attrs.collection) attrs.collection = this;
56279        return attrs;
56280      }
56281      options || (options = {});
56282      options.collection = this;
56283      var model = new this.model(attrs, options);
56284      if (!model._validate(attrs, options)) {
56285        this.trigger('invalid', this, attrs, options);
56286        return false;
56287      }
56288      return model;
56289    },
56290
56291    // Internal method to sever a model's ties to a collection.
56292    _removeReference: function(model) {
56293      if (this === model.collection) delete model.collection;
56294      model.off('all', this._onModelEvent, this);
56295    },
56296
56297    // Internal method called every time a model in the set fires an event.
56298    // Sets need to update their indexes when models change ids. All other
56299    // events simply proxy through. "add" and "remove" events that originate
56300    // in other collections are ignored.
56301    _onModelEvent: function(event, model, collection, options) {
56302      if ((event === 'add' || event === 'remove') && collection !== this) return;
56303      if (event === 'destroy') this.remove(model, options);
56304      if (model && event === 'change:' + model.idAttribute) {
56305        delete this._byId[model.previous(model.idAttribute)];
56306        if (model.id != null) this._byId[model.id] = model;
56307      }
56308      this.trigger.apply(this, arguments);
56309    }
56310
56311  });
56312
56313  // Underscore methods that we want to implement on the Collection.
56314  // 90% of the core usefulness of Backbone Collections is actually implemented
56315  // right here:
56316  var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
56317    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
56318    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
56319    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
56320    'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf',
56321    'isEmpty', 'chain'];
56322
56323  // Mix in each Underscore method as a proxy to `Collection#models`.
56324  _.each(methods, function(method) {
56325    Collection.prototype[method] = function() {
56326      var args = slice.call(arguments);
56327      args.unshift(this.models);
56328      return _[method].apply(_, args);
56329    };
56330  });
56331
56332  // Underscore methods that take a property name as an argument.
56333  var attributeMethods = ['groupBy', 'countBy', 'sortBy'];
56334
56335  // Use attributes instead of properties.
56336  _.each(attributeMethods, function(method) {
56337    Collection.prototype[method] = function(value, context) {
56338      var iterator = _.isFunction(value) ? value : function(model) {
56339        return model.get(value);
56340      };
56341      return _[method](this.models, iterator, context);
56342    };
56343  });
56344
56345  // Backbone.View
56346  // -------------
56347
56348  // Backbone Views are almost more convention than they are actual code. A View
56349  // is simply a JavaScript object that represents a logical chunk of UI in the
56350  // DOM. This might be a single item, an entire list, a sidebar or panel, or
56351  // even the surrounding frame which wraps your whole app. Defining a chunk of
56352  // UI as a **View** allows you to define your DOM events declaratively, without
56353  // having to worry about render order ... and makes it easy for the view to
56354  // react to specific changes in the state of your models.
56355
56356  // Creating a Backbone.View creates its initial element outside of the DOM,
56357  // if an existing element is not provided...
56358  var View = Backbone.View = function(options) {
56359    this.cid = _.uniqueId('view');
56360    this._configure(options || {});
56361    this._ensureElement();
56362    this.initialize.apply(this, arguments);
56363    this.delegateEvents();
56364  };
56365
56366  // Cached regex to split keys for `delegate`.
56367  var delegateEventSplitter = /^(\S+)\s*(.*)$/;
56368
56369  // List of view options to be merged as properties.
56370  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
56371
56372  // Set up all inheritable **Backbone.View** properties and methods.
56373  _.extend(View.prototype, Events, {
56374
56375    // The default `tagName` of a View's element is `"div"`.
56376    tagName: 'div',
56377
56378    // jQuery delegate for element lookup, scoped to DOM elements within the
56379    // current view. This should be prefered to global lookups where possible.
56380    $: function(selector) {
56381      return this.$el.find(selector);
56382    },
56383
56384    // Initialize is an empty function by default. Override it with your own
56385    // initialization logic.
56386    initialize: function(){},
56387
56388    // **render** is the core function that your view should override, in order
56389    // to populate its element (`this.el`), with the appropriate HTML. The
56390    // convention is for **render** to always return `this`.
56391    render: function() {
56392      return this;
56393    },
56394
56395    // Remove this view by taking the element out of the DOM, and removing any
56396    // applicable Backbone.Events listeners.
56397    remove: function() {
56398      this.$el.remove();
56399      this.stopListening();
56400      return this;
56401    },
56402
56403    // Change the view's element (`this.el` property), including event
56404    // re-delegation.
56405    setElement: function(element, delegate) {
56406      if (this.$el) this.undelegateEvents();
56407      this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
56408      this.el = this.$el[0];
56409      if (delegate !== false) this.delegateEvents();
56410      return this;
56411    },
56412
56413    // Set callbacks, where `this.events` is a hash of
56414    //
56415    // *{"event selector": "callback"}*
56416    //
56417    //     {
56418    //       'mousedown .title':  'edit',
56419    //       'click .button':     'save'
56420    //       'click .open':       function(e) { ... }
56421    //     }
56422    //
56423    // pairs. Callbacks will be bound to the view, with `this` set properly.
56424    // Uses event delegation for efficiency.
56425    // Omitting the selector binds the event to `this.el`.
56426    // This only works for delegate-able events: not `focus`, `blur`, and
56427    // not `change`, `submit`, and `reset` in Internet Explorer.
56428    delegateEvents: function(events) {
56429      if (!(events || (events = _.result(this, 'events')))) return this;
56430      this.undelegateEvents();
56431      for (var key in events) {
56432        var method = events[key];
56433        if (!_.isFunction(method)) method = this[events[key]];
56434        if (!method) continue;
56435
56436        var match = key.match(delegateEventSplitter);
56437        var eventName = match[1], selector = match[2];
56438        method = _.bind(method, this);
56439        eventName += '.delegateEvents' + this.cid;
56440        if (selector === '') {
56441          this.$el.on(eventName, method);
56442        } else {
56443          this.$el.on(eventName, selector, method);
56444        }
56445      }
56446      return this;
56447    },
56448
56449    // Clears all callbacks previously bound to the view with `delegateEvents`.
56450    // You usually don't need to use this, but may wish to if you have multiple
56451    // Backbone views attached to the same DOM element.
56452    undelegateEvents: function() {
56453      this.$el.off('.delegateEvents' + this.cid);
56454      return this;
56455    },
56456
56457    // Performs the initial configuration of a View with a set of options.
56458    // Keys with special meaning *(e.g. model, collection, id, className)* are
56459    // attached directly to the view.  See `viewOptions` for an exhaustive
56460    // list.
56461    _configure: function(options) {
56462      if (this.options) options = _.extend({}, _.result(this, 'options'), options);
56463      _.extend(this, _.pick(options, viewOptions));
56464      this.options = options;
56465    },
56466
56467    // Ensure that the View has a DOM element to render into.
56468    // If `this.el` is a string, pass it through `$()`, take the first
56469    // matching element, and re-assign it to `el`. Otherwise, create
56470    // an element from the `id`, `className` and `tagName` properties.
56471    _ensureElement: function() {
56472      if (!this.el) {
56473        var attrs = _.extend({}, _.result(this, 'attributes'));
56474        if (this.id) attrs.id = _.result(this, 'id');
56475        if (this.className) attrs['class'] = _.result(this, 'className');
56476        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);
56477        this.setElement($el, false);
56478      } else {
56479        this.setElement(_.result(this, 'el'), false);
56480      }
56481    }
56482
56483  });
56484
56485  // Backbone.sync
56486  // -------------
56487
56488  // Override this function to change the manner in which Backbone persists
56489  // models to the server. You will be passed the type of request, and the
56490  // model in question. By default, makes a RESTful Ajax request
56491  // to the model's `url()`. Some possible customizations could be:
56492  //
56493  // * Use `setTimeout` to batch rapid-fire updates into a single request.
56494  // * Send up the models as XML instead of JSON.
56495  // * Persist models via WebSockets instead of Ajax.
56496  //
56497  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests
56498  // as `POST`, with a `_method` parameter containing the true HTTP method,
56499  // as well as all requests with the body as `application/x-www-form-urlencoded`
56500  // instead of `application/json` with the model in a param named `model`.
56501  // Useful when interfacing with server-side languages like **PHP** that make
56502  // it difficult to read the body of `PUT` requests.
56503  Backbone.sync = function(method, model, options) {
56504    var type = methodMap[method];
56505
56506    // Default options, unless specified.
56507    _.defaults(options || (options = {}), {
56508      emulateHTTP: Backbone.emulateHTTP,
56509      emulateJSON: Backbone.emulateJSON
56510    });
56511
56512    // Default JSON-request options.
56513    var params = {type: type, dataType: 'json'};
56514
56515    // Ensure that we have a URL.
56516    if (!options.url) {
56517      params.url = _.result(model, 'url') || urlError();
56518    }
56519
56520    // Ensure that we have the appropriate request data.
56521    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
56522      params.contentType = 'application/json';
56523      params.data = JSON.stringify(options.attrs || model.toJSON(options));
56524    }
56525
56526    // For older servers, emulate JSON by encoding the request into an HTML-form.
56527    if (options.emulateJSON) {
56528      params.contentType = 'application/x-www-form-urlencoded';
56529      params.data = params.data ? {model: params.data} : {};
56530    }
56531
56532    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
56533    // And an `X-HTTP-Method-Override` header.
56534    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {
56535      params.type = 'POST';
56536      if (options.emulateJSON) params.data._method = type;
56537      var beforeSend = options.beforeSend;
56538      options.beforeSend = function(xhr) {
56539        xhr.setRequestHeader('X-HTTP-Method-Override', type);
56540        if (beforeSend) return beforeSend.apply(this, arguments);
56541      };
56542    }
56543
56544    // Don't process data on a non-GET request.
56545    if (params.type !== 'GET' && !options.emulateJSON) {
56546      params.processData = false;
56547    }
56548
56549    // If we're sending a `PATCH` request, and we're in an old Internet Explorer
56550    // that still has ActiveX enabled by default, override jQuery to use that
56551    // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.
56552    if (params.type === 'PATCH' && window.ActiveXObject &&
56553          !(window.external && window.external.msActiveXFilteringEnabled)) {
56554      params.xhr = function() {
56555        return new ActiveXObject("Microsoft.XMLHTTP");
56556      };
56557    }
56558
56559    // Make the request, allowing the user to override any Ajax options.
56560    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));
56561    model.trigger('request', model, xhr, options);
56562    return xhr;
56563  };
56564
56565  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.
56566  var methodMap = {
56567    'create': 'POST',
56568    'update': 'PUT',
56569    'patch':  'PATCH',
56570    'delete': 'DELETE',
56571    'read':   'GET'
56572  };
56573
56574  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.
56575  // Override this if you'd like to use a different library.
56576  Backbone.ajax = function() {
56577    return Backbone.$.ajax.apply(Backbone.$, arguments);
56578  };
56579
56580  // Backbone.Router
56581  // ---------------
56582
56583  // Routers map faux-URLs to actions, and fire events when routes are
56584  // matched. Creating a new one sets its `routes` hash, if not set statically.
56585  var Router = Backbone.Router = function(options) {
vendor: 4,260 bytes, lines 56586-56704
56586    options || (options = {});
56587    if (options.routes) this.routes = options.routes;
56588    this._bindRoutes();
56589    this.initialize.apply(this, arguments);
56590  };
56591
56592  // Cached regular expressions for matching named param parts and splatted
56593  // parts of route strings.
56594  var optionalParam = /\((.*?)\)/g;
56595  var namedParam    = /(\(\?)?:\w+/g;
56596  var splatParam    = /\*\w+/g;
56597  var escapeRegExp  = /[\-{}\[\]+?.,\\\^$|#\s]/g;
56598
56599  // Set up all inheritable **Backbone.Router** properties and methods.
56600  _.extend(Router.prototype, Events, {
56601
56602    // Initialize is an empty function by default. Override it with your own
56603    // initialization logic.
56604    initialize: function(){},
56605
56606    // Manually bind a single named route to a callback. For example:
56607    //
56608    //     this.route('search/:query/p:num', 'search', function(query, num) {
56609    //       ...
56610    //     });
56611    //
56612    route: function(route, name, callback) {
56613      if (!_.isRegExp(route)) route = this._routeToRegExp(route);
56614      if (_.isFunction(name)) {
56615        callback = name;
56616        name = '';
56617      }
56618      if (!callback) callback = this[name];
56619      var router = this;
56620      Backbone.history.route(route, function(fragment) {
56621        var args = router._extractParameters(route, fragment);
56622        callback && callback.apply(router, args);
56623        router.trigger.apply(router, ['route:' + name].concat(args));
56624        router.trigger('route', name, args);
56625        Backbone.history.trigger('route', router, name, args);
56626      });
56627      return this;
56628    },
56629
56630    // Simple proxy to `Backbone.history` to save a fragment into the history.
56631    navigate: function(fragment, options) {
56632      Backbone.history.navigate(fragment, options);
56633      return this;
56634    },
56635
56636    // Bind all defined routes to `Backbone.history`. We have to reverse the
56637    // order of the routes here to support behavior where the most general
56638    // routes can be defined at the bottom of the route map.
56639    _bindRoutes: function() {
56640      if (!this.routes) return;
56641      this.routes = _.result(this, 'routes');
56642      var route, routes = _.keys(this.routes);
56643      while ((route = routes.pop()) != null) {
56644        this.route(route, this.routes[route]);
56645      }
56646    },
56647
56648    // Convert a route string into a regular expression, suitable for matching
56649    // against the current location hash.
56650    _routeToRegExp: function(route) {
56651      route = route.replace(escapeRegExp, '\\$&')
56652                   .replace(optionalParam, '(?:$1)?')
56653                   .replace(namedParam, function(match, optional){
56654                     return optional ? match : '([^\/]+)';
56655                   })
56656                   .replace(splatParam, '(.*?)');
56657      return new RegExp('^' + route + '$');
56658    },
56659
56660    // Given a route, and a URL fragment that it matches, return the array of
56661    // extracted decoded parameters. Empty or unmatched parameters will be
56662    // treated as `null` to normalize cross-browser behavior.
56663    _extractParameters: function(route, fragment) {
56664      var params = route.exec(fragment).slice(1);
56665      return _.map(params, function(param) {
56666        return param ? decodeURIComponent(param) : null;
56667      });
56668    }
56669
56670  });
56671
56672  // Backbone.History
56673  // ----------------
56674
56675  // Handles cross-browser history management, based on either
56676  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or
56677  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)
56678  // and URL fragments. If the browser supports neither (old IE, natch),
56679  // falls back to polling.
56680  var History = Backbone.History = function() {
56681    this.handlers = [];
56682    _.bindAll(this, 'checkUrl');
56683
56684    // Ensure that `History` can be used outside of the browser.
56685    if (typeof window !== 'undefined') {
56686      this.location = window.location;
56687      this.history = window.history;
56688    }
56689  };
56690
56691  // Cached regex for stripping a leading hash/slash and trailing space.
56692  var routeStripper = /^[#\/]|\s+$/g;
56693
56694  // Cached regex for stripping leading and trailing slashes.
56695  var rootStripper = /^\/+|\/+$/g;
56696
56697  // Cached regex for detecting MSIE.
56698  var isExplorer = /msie [\w.]+/;
56699
56700  // Cached regex for removing a trailing slash.
56701  var trailingSlash = /\/$/;
56702
56703  // Has the history handling already been started?
56704  History.started = false;
56705
56706  // Set up all inheritable **Backbone.History** properties and methods.
56707  _.extend(History.prototype, Events, {
56708
56709    // The default interval to poll for hash changes, if necessary, is
56710    // twenty times a second.
56711    interval: 50,
56712
56713    // Gets the true hash value. Cannot use location.hash directly due to bug
56714    // in Firefox where location.hash will always be decoded.
56715    getHash: function(window) {
56716      var match = (window || this).location.href.match(/#(.*)$/);
56717      return match ? match[1] : '';
56718    },
56719
56720    // Get the cross-browser normalized URL fragment, either from the URL,
56721    // the hash, or the override.
56722    getFragment: function(fragment, forcePushState) {
56723      if (fragment == null) {
56724        if (this._hasPushState || !this._wantsHashChange || forcePushState) {
56725          fragment = this.location.pathname;
56726          var root = this.root.replace(trailingSlash, '');
56727          if (!fragment.indexOf(root)) fragment = fragment.substr(root.length);
56728        } else {
56729          fragment = this.getHash();
56730        }
56731      }
56732      return fragment.replace(routeStripper, '');
56733    },
56734
56735    // Start the hash change handling, returning `true` if the current URL matches
56736    // an existing route, and `false` otherwise.
56737    start: function(options) {
56738      if (History.started) throw new Error("Backbone.history has already been started");
56739      History.started = true;
56740
56741      // Figure out the initial configuration. Do we need an iframe?
56742      // Is pushState desired ... is it available?
56743      this.options          = _.extend({}, {root: '/'}, this.options, options);
56744      this.root             = this.options.root;
56745      this._wantsHashChange = this.options.hashChange !== false;
56746      this._wantsPushState  = !!this.options.pushState;
56747      this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);
56748      var fragment          = this.getFragment();
56749      var docMode           = document.documentMode;
56750      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
56751
56752      // Normalize root to always include a leading and trailing slash.
56753      this.root = ('/' + this.root + '/').replace(rootStripper, '/');
56754
56755      if (oldIE && this._wantsHashChange) {
56756        this.iframe = Backbone.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow;
56757        this.navigate(fragment);
56758      }
56759
56760      // Depending on whether we're using pushState or hashes, and whether
56761      // 'onhashchange' is supported, determine how we check the URL state.
56762      if (this._hasPushState) {
56763        Backbone.$(window).on('popstate', this.checkUrl);
56764      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {
56765        Backbone.$(window).on('hashchange', this.checkUrl);
56766      } else if (this._wantsHashChange) {
56767        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
56768      }
56769
56770      // Determine if we need to change the base url, for a pushState link
56771      // opened by a non-pushState browser.
56772      this.fragment = fragment;
56773      var loc = this.location;
56774      var atRoot = loc.pathname.replace(/[^\/]$/, '$&/') === this.root;
56775
56776      // If we've started off with a route from a `pushState`-enabled browser,
56777      // but we're currently in a browser that doesn't support it...
56778      if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) {
56779        this.fragment = this.getFragment(null, true);
56780        this.location.replace(this.root + this.location.search + '#' + this.fragment);
56781        // Return immediately as browser will do redirect to new url
56782        return true;
56783
56784      // Or if we've started out with a hash-based route, but we're currently
56785      // in a browser where it could be `pushState`-based instead...
56786      } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {
56787        this.fragment = this.getHash().replace(routeStripper, '');
56788        this.history.replaceState({}, document.title, this.root + this.fragment + loc.search);
56789      }
56790
56791      if (!this.options.silent) return this.loadUrl();
56792    },
56793
56794    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,
56795    // but possibly useful for unit testing Routers.
56796    stop: function() {
56797      Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);
56798      clearInterval(this._checkUrlInterval);
56799      History.started = false;
56800    },
56801
56802    // Add a route to be tested when the fragment changes. Routes added later
56803    // may override previous routes.
56804    route: function(route, callback) {
56805      this.handlers.unshift({route: route, callback: callback});
56806    },
56807
56808    // Checks the current URL to see if it has changed, and if it has,
56809    // calls `loadUrl`, normalizing across the hidden iframe.
56810    checkUrl: function(e) {
56811      var current = this.getFragment();
56812      if (current === this.fragment && this.iframe) {
56813        current = this.getFragment(this.getHash(this.iframe));
56814      }
56815      if (current === this.fragment) return false;
56816      if (this.iframe) this.navigate(current);
56817      this.loadUrl() || this.loadUrl(this.getHash());
56818    },
56819
56820    // Attempt to load the current URL fragment. If a route succeeds with a
56821    // match, returns `true`. If no defined routes matches the fragment,
56822    // returns `false`.
56823    loadUrl: function(fragmentOverride) {
56824      var fragment = this.fragment = this.getFragment(fragmentOverride);
56825      var matched = _.any(this.handlers, function(handler) {
56826        if (handler.route.test(fragment)) {
56827          handler.callback(fragment);
56828          return true;
56829        }
56830      });
56831      return matched;
56832    },
56833
56834    // Save a fragment into the hash history, or replace the URL state if the
56835    // 'replace' option is passed. You are responsible for properly URL-encoding
56836    // the fragment in advance.
56837    //
56838    // The options object can contain `trigger: true` if you wish to have the
56839    // route callback be fired (not usually desirable), or `replace: true`, if
56840    // you wish to modify the current URL without adding an entry to the history.
56841    navigate: function(fragment, options) {
56842      if (!History.started) return false;
56843      if (!options || options === true) options = {trigger: options};
56844      fragment = this.getFragment(fragment || '');
56845      if (this.fragment === fragment) return;
56846      this.fragment = fragment;
56847      var url = this.root + fragment;
56848
56849      // If pushState is available, we use it to set the fragment as a real URL.
56850      if (this._hasPushState) {
56851        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);
56852
56853      // If hash changes haven't been explicitly disabled, update the hash
56854      // fragment to store history.
56855      } else if (this._wantsHashChange) {
56856        this._updateHash(this.location, fragment, options.replace);
56857        if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {
56858          // Opening and closing the iframe tricks IE7 and earlier to push a
56859          // history entry on hash-tag change.  When replace is true, we don't
56860          // want this.
56861          if(!options.replace) this.iframe.document.open().close();
56862          this._updateHash(this.iframe.location, fragment, options.replace);
56863        }
56864
56865      // If you've told us that you explicitly don't want fallback hashchange-
56866      // based history, then `navigate` becomes a page refresh.
56867      } else {
56868        return this.location.assign(url);
56869      }
56870      if (options.trigger) this.loadUrl(fragment);
56871    },
56872
56873    // Update the hash location, either replacing the current entry, or adding
56874    // a new one to the browser history.
56875    _updateHash: function(location, fragment, replace) {
56876      if (replace) {
56877        var href = location.href.replace(/(javascript:|#).*$/, '');
56878        location.replace(href + '#' + fragment);
56879      } else {
56880        // Some browsers require that `hash` contains a leading #.
56881        location.hash = '#' + fragment;
56882      }
56883    }
56884
56885  });
56886
56887  // Create the default Backbone.history.
56888  Backbone.history = new History;
56889
56890  // Helpers
56891  // -------
56892
56893  // Helper function to correctly set up the prototype chain, for subclasses.
56894  // Similar to `goog.inherits`, but uses a hash of prototype properties and
56895  // class properties to be extended.
56896  var extend = function(protoProps, staticProps) {
56897    var parent = this;
56898    var child;
56899
56900    // The constructor function for the new subclass is either defined by you
56901    // (the "constructor" property in your `extend` definition), or defaulted
56902    // by us to simply call the parent's constructor.
56903    if (protoProps && _.has(protoProps, 'constructor')) {
56904      child = protoProps.constructor;
56905    } else {
56906      child = function(){ return parent.apply(this, arguments); };
56907    }
56908
56909    // Add static properties to the constructor function, if supplied.
56910    _.extend(child, parent, staticProps);
56911
56912    // Set the prototype chain to inherit from `parent`, without calling
56913    // `parent`'s constructor function.
56914    var Surrogate = function(){ this.constructor = child; };
56915    Surrogate.prototype = parent.prototype;
56916    child.prototype = new Surrogate;
56917
56918    // Add prototype properties (instance properties) to the subclass,
56919    // if supplied.
56920    if (protoProps) _.extend(child.prototype, protoProps);
56921
56922    // Set a convenience property in case the parent's prototype is needed
56923    // later.
56924    child.__super__ = parent.prototype;
56925
56926    return child;
56927  };
56928
56929  // Set up inheritance for the model, collection, router, view and history.
56930  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;
56931
56932  // Throw an error when a URL is needed, and none is supplied.
56933  var urlError = function() {
56934    throw new Error('A "url" property or function must be specified');
56935  };
56936
56937  // Wrap an optional error callback with a fallback error event.
56938  var wrapError = function (model, options) {
56939    var error = options.error;
56940    options.error = function(resp) {
56941      if (error) error(model, resp, options);
56942      model.trigger('error', model, resp, options);
56943    };
56944  };
56945
56946}).call(this);
56947
56948/*! JsRender v1.0.11: http://jsviews.com/#jsrender */
56949/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */
56950/*
56951 * Best-of-breed templating in browser or on Node.js.
56952 * Does not require jQuery, or HTML DOM
56953 * Integrates with JsViews (http://jsviews.com/#jsviews)
56954 *
56955 * Copyright 2021, Boris Moore
56956 * Released under the MIT License.
56957 */
56958
56959//jshint -W018, -W041, -W120
56960
56961(function(factory, global) {
56962	// global var is the this object, which is window when running in the usual browser environment
56963	var $ = global.jQuery;
56964
56965	if (typeof exports === "object") { // CommonJS e.g. Browserify
56966		module.exports = $
56967			? factory(global, $)
56968			: function($) { // If no global jQuery, take optional jQuery passed as parameter: require('jsrender')(jQuery)
56969				if ($ && !$.fn) {
56970					throw "Provide jQuery or null";
56971				}
56972				return factory(global, $);
56973			};
56974	} else if (typeof define === "function" && define.amd) { // AMD script loader, e.g. RequireJS
56975		define(function() {
56976			return factory(global);
56977		});
56978	} else { // Browser using plain <script> tag
56979		factory(global, false);
56980	}
56981} (
56982
56983// factory (for jsrender.js)
56984function(global, $) {
56985"use strict";
56986
56987//========================== Top-level vars ==========================
56988
56989// global var is the this object, which is window when running in the usual browser environment
56990var setGlobals = $ === false; // Only set globals if script block in browser (not AMD and not CommonJS)
56991
56992$ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery.
56993
56994var versionNumber = "v1.0.11",
56995	jsvStoreName, rTag, rTmplString, topView, $views, $expando,
56996	_ocp = "_ocp",      // Observable contextual parameter
56997
56998	$isFunction, $isArray, $templates, $converters, $helpers, $tags, $sub, $subSettings, $subSettingsAdvanced, $viewsSettings,
56999	delimOpenChar0, delimOpenChar1, delimCloseChar0, delimCloseChar1, linkChar, setting, baseOnError,
57000
57001	isRenderCall,
57002	rNewLine = /[ \t]*(\r\n|\n|\r)/g,
57003	rUnescapeQuotes = /\\(['"\\])/g, // Unescape quotes and trim
57004	rEscapeQuotes = /['"\\]/g, // Escape quotes and \ character
57005	rBuildHash = /(?:\x08|^)(onerror:)?(?:(~?)(([\w$.]+):)?([^\x08]+))\x08(,)?([^\x08]+)/gi,
57006	rTestElseIf = /^if\s/,
57007	rFirstElem = /<(\w+)[>\s]/,
57008	rAttrEncode = /[\x00`><"'&=]/g, // Includes > encoding since rConvertMarkers in JsViews does not skip > characters in attribute strings
57009	rIsHtml = /[\x00`><\"'&=]/,
57010	rHasHandlers = /^on[A-Z]|^convert(Back)?$/,
57011	rWrappedInViewMarker = /^\#\d+_`[\s\S]*\/\d+_`$/,
57012	rHtmlEncode = rAttrEncode,
57013	rDataEncode = /[&<>]/g,
57014	rDataUnencode = /&(amp|gt|lt);/g,
57015	rBracketQuote = /\[['"]?|['"]?\]/g,
57016	viewId = 0,
57017	charEntities = {
57018		"&": "&amp;",
57019		"<": "&lt;",
57020		">": "&gt;",
57021		"\x00": "&#0;",
57022		"'": "&#39;",
57023		'"': "&#34;",
57024		"`": "&#96;",
57025		"=": "&#61;"
57026	},
57027	charsFromEntities = {
57028		amp: "&",
57029		gt: ">",
57030		lt: "<"
57031	},
57032	HTML = "html",
57033	OBJECT = "object",
57034	tmplAttr = "data-jsv-tmpl",
57035	jsvTmpl = "jsvTmpl",
57036	indexStr = "For #index in nested block use #getIndex().",
57037	cpFnStore = {}
vendor: 5,502 bytes, lines 57037-57204
57037,     // Compiled furnctions for computed values in template expressions (properties, methods, helpers)
57038	$render = {},
57039
57040	jsr = global.jsrender,
57041	jsrToJq = jsr && $ && !$.render, // JsRender already loaded, without jQuery. but we will re-load it now to attach to jQuery
57042
57043	jsvStores = {
57044		template: {
57045			compile: compileTmpl
57046		},
57047		tag: {
57048			compile: compileTag
57049		},
57050		viewModel: {
57051			compile: compileViewModel
57052		},
57053		helper: {},
57054		converter: {}
57055	};
57056
57057	// views object ($.views if jQuery is loaded, jsrender.views if no jQuery, e.g. in Node.js)
57058	$views = {
57059		jsviews: versionNumber,
57060		sub: {
57061			// subscription, e.g. JsViews integration
57062			rPath: /^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,
57063			//        not                               object     helper    view  viewProperty pathTokens      leafToken
57064
57065			rPrm: /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(~?[\w$.^]+)?\s*((\+\+|--)|\+|-|~(?![\w$])|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?(@)?[#~]?[\w$.^]+)([([])?)|(,\s*)|(?:(\()\s*)?\\?(?:(')|("))|(?:\s*(([)\]])(?=[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g,
57066			//   lftPrn0           lftPrn         bound     path               operator     err                                          eq      path2 late            prn      comma  lftPrn2          apos quot        rtPrn  rtPrnDot                  prn2     space
57067
57068			View: View,
57069			Err: JsViewsError,
57070			tmplFn: tmplFn,
57071			parse: parseParams,
57072			extend: $extend,
57073			extendCtx: extendCtx,
57074			syntaxErr: syntaxError,
57075			onStore: {
57076				template: function(name, item) {
57077					if (item === null) {
57078						delete $render[name];
57079					} else if (name) {
57080						$render[name] = item;
57081					}
57082				}
57083			},
57084			addSetting: addSetting,
57085			settings: {
57086				allowCode: false
57087			},
57088			advSet: noop, // Update advanced settings
57089			_thp: tagHandlersFromProps,
57090			_gm: getMethod,
57091			_tg: function() {}, // Constructor for tagDef
57092			_cnvt: convertVal,
57093			_tag: renderTag,
57094			_er: error,
57095			_err: onRenderError,
57096			_cp: retVal, // Get observable contextual parameters (or properties) ~foo=expr. In JsRender, simply returns val.
57097			_sq: function(token) {
57098				if (token === "constructor") {
57099					syntaxError("");
57100				}
57101				return token;
57102			}
57103		},
57104		settings: {
57105			delimiters: $viewsDelimiters,
57106			advanced: function(value) {
57107				return value
57108					? (
57109							$extend($subSettingsAdvanced, value),
57110							$sub.advSet(),
57111							$viewsSettings
57112						)
57113						: $subSettingsAdvanced;
57114				}
57115		},
57116		map: dataMap // If jsObservable loaded first, use that definition of dataMap
57117	};
57118
57119function getDerivedMethod(baseMethod, method) {
57120	return function() {
57121		var ret,
57122			tag = this,
57123			prevBase = tag.base;
57124
57125		tag.base = baseMethod; // Within method call, calling this.base will call the base method
57126		ret = method.apply(tag, arguments); // Call the method
57127		tag.base = prevBase; // Replace this.base to be the base method of the previous call, for chained calls
57128		return ret;
57129	};
57130}
57131
57132function getMethod(baseMethod, method) {
57133	// For derived methods (or handlers declared declaratively as in {{:foo onChange=~fooChanged}} replace by a derived method, to allow using this.base(...)
57134	// or this.baseApply(arguments) to call the base implementation. (Equivalent to this._super(...) and this._superApply(arguments) in jQuery UI)
57135	if ($isFunction(method)) {
57136		method = getDerivedMethod(
57137				!baseMethod
57138					? noop // no base method implementation, so use noop as base method
57139					: baseMethod._d
57140						? baseMethod // baseMethod is a derived method, so use it
57141						: getDerivedMethod(noop, baseMethod), // baseMethod is not derived so make its base method be the noop method
57142				method
57143			);
57144		method._d = (baseMethod && baseMethod._d || 0) + 1; // Add flag for derived method (incremented for derived of derived...)
57145	}
57146	return method;
57147}
57148
57149function tagHandlersFromProps(tag, tagCtx) {
57150	var prop,
57151		props = tagCtx.props;
57152	for (prop in props) {
57153		if (rHasHandlers.test(prop) && !(tag[prop] && tag[prop].fix)) { // Don't override handlers with fix expando (used in datepicker and spinner)
57154			tag[prop] = prop !== "convert" ? getMethod(tag.constructor.prototype[prop], props[prop]) : props[prop];
57155			// Copy over the onFoo props, convert and convertBack from tagCtx.props to tag (overrides values in tagDef).
57156			// Note: unsupported scenario: if handlers are dynamically added ^onFoo=expression this will work, but dynamically removing will not work.
57157		}
57158	}
57159}
57160
57161function retVal(val) {
57162	return val;
57163}
57164
57165function noop() {
57166	return "";
57167}
57168
57169function dbgBreak(val) {
57170	// Usage examples: {{dbg:...}}, {{:~dbg(...)}}, {{dbg .../}}, {^{for ... onAfterLink=~dbg}} etc.
57171	try {
57172		console.log("JsRender dbg breakpoint: " + val);
57173		throw "dbg breakpoint"; // To break here, stop on caught exceptions.
57174	}
57175	catch (e) {}
57176	return this.base ? this.baseApply(arguments) : val;
57177}
57178
57179function JsViewsError(message) {
57180	// Error exception type for JsViews/JsRender
57181	// Override of $.views.sub.Error is possible
57182	this.name = ($.link ? "JsViews" : "JsRender") + " Error";
57183	this.message = message || this.name;
57184}
57185
57186function $extend(target, source) {
57187	if (target) {
57188		for (var name in source) {
57189			target[name] = source[name];
57190		}
57191		return target;
57192	}
57193}
57194
57195(JsViewsError.prototype = new Error()).constructor = JsViewsError;
57196
57197//========================== Top-level functions ==========================
57198
57199//===================
57200// views.delimiters
57201//===================
57202
57203	/**
57204	* Set the tag opening and closing delimiters and 'link' character. Default is "{{", "}}" and "^"
vendor: 13,762 bytes, lines 57205-57603
57205	* openChars, closeChars: opening and closing strings, each with two characters
57206	* $.views.settings.delimiters(...)
57207	*
57208	* @param {string}   openChars
57209	* @param {string}   [closeChars]
57210	* @param {string}   [link]
57211	* @returns {Settings}
57212	*
57213	* Get delimiters
57214	* delimsArray = $.views.settings.delimiters()
57215	*
57216	* @returns {string[]}
57217	*/
57218function $viewsDelimiters(openChars, closeChars, link) {
57219	if (!openChars) {
57220		return $subSettings.delimiters;
57221	}
57222	if ($isArray(openChars)) {
57223		return $viewsDelimiters.apply($views, openChars);
57224	}
57225	linkChar = link ? link[0] : linkChar;
57226	if (!/^(\W|_){5}$/.test(openChars + closeChars + linkChar)) {
57227		error("Invalid delimiters"); // Must be non-word characters, and openChars and closeChars must each be length 2
57228	}
57229	delimOpenChar0 = openChars[0];
57230	delimOpenChar1 = openChars[1];
57231	delimCloseChar0 = closeChars[0];
57232	delimCloseChar1 = closeChars[1];
57233
57234	$subSettings.delimiters = [delimOpenChar0 + delimOpenChar1, delimCloseChar0 + delimCloseChar1, linkChar];
57235
57236	// Escape the characters - since they could be regex special characters
57237	openChars = "\\" + delimOpenChar0 + "(\\" + linkChar + ")?\\" + delimOpenChar1; // Default is "{^{"
57238	closeChars = "\\" + delimCloseChar0 + "\\" + delimCloseChar1;                   // Default is "}}"
57239	// Build regex with new delimiters
57240	//          [tag    (followed by / space or })  or cvtr+colon or html or code] followed by space+params then convertBack?
57241	rTag = "(?:(\\w+(?=[\\/\\s\\" + delimCloseChar0 + "]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"
57242		+ delimCloseChar0 + "]|\\" + delimCloseChar0 + "(?!\\" + delimCloseChar1 + "))*?)";
57243
57244	// Make rTag available to JsViews (or other components) for parsing binding expressions
57245	$sub.rTag = "(?:" + rTag + ")";
57246	//                        { ^? {   tag+params slash?  or closingTag                                                   or comment
57247	rTag = new RegExp("(?:" + openChars + rTag + "(\\/)?|\\" + delimOpenChar0 + "(\\" + linkChar + ")?\\" + delimOpenChar1 + "(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))" + closeChars, "g");
57248
57249	// Default:  bind     tagName         cvt   cln html code    params            slash   bind2         closeBlk  comment
57250	//      /(?:{(\^)?{(?:(\w+(?=[\/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(\/)?|{(\^)?{(?:(?:\/(\w+))\s*|!--[\s\S]*?--))}}
57251
57252	$sub.rTmpl = new RegExp("^\\s|\\s$|<.*>|([^\\\\]|^)[{}]|" + openChars + ".*" + closeChars);
57253	// $sub.rTmpl looks for initial or final white space, html tags or { or } char not preceded by \\, or JsRender tags {{xxx}}.
57254	// Each of these strings are considered NOT to be jQuery selectors
57255	return $viewsSettings;
57256}
57257
57258//=========
57259// View.get
57260//=========
57261
57262function getView(inner, type) { //view.get(inner, type)
57263	if (!type && inner !== true) {
57264		// view.get(type)
57265		type = inner;
57266		inner = undefined;
57267	}
57268
57269	var views, i, l, found,
57270		view = this,
57271		root = type === "root";
57272		// view.get("root") returns view.root, view.get() returns view.parent, view.get(true) returns view.views[0].
57273
57274	if (inner) {
57275		// Go through views - this one, and all nested ones, depth-first - and return first one with given type.
57276		// If type is undefined, i.e. view.get(true), return first child view.
57277		found = type && view.type === type && view;
57278		if (!found) {
57279			views = view.views;
57280			if (view._.useKey) {
57281				for (i in views) {
57282					if (found = type ? views[i].get(inner, type) : views[i]) {
57283						break;
57284					}
57285				}
57286			} else {
57287				for (i = 0, l = views.length; !found && i < l; i++) {
57288					found = type ? views[i].get(inner, type) : views[i];
57289				}
57290			}
57291		}
57292	} else if (root) {
57293		// Find root view. (view whose parent is top view)
57294		found = view.root;
57295	} else if (type) {
57296		while (view && !found) {
57297			// Go through views - this one, and all parent ones - and return first one with given type.
57298			found = view.type === type ? view : undefined;
57299			view = view.parent;
57300		}
57301	} else {
57302		found = view.parent;
57303	}
57304	return found || undefined;
57305}
57306
57307function getNestedIndex() {
57308	var view = this.get("item");
57309	return view ? view.index : undefined;
57310}
57311
57312getNestedIndex.depends = function() {
57313	return [this.get("item"), "index"];
57314};
57315
57316function getIndex() {
57317	return this.index;
57318}
57319
57320getIndex.depends = "index";
57321
57322//==================
57323// View.ctxPrm, etc.
57324//==================
57325
57326/* Internal private: view._getOb() */
57327function getPathObject(ob, path, ltOb, fn) {
57328	// Iterate through path to late paths: @a.b.c paths
57329	// Return "" (or noop if leaf is a function @a.b.c(...) ) if intermediate object not yet available
57330	var prevOb, tokens, l,
57331		i = 0;
57332	if (ltOb === 1) {
57333		fn = 1;
57334		ltOb = undefined;
57335	}
57336	// Paths like ^a^b^c or ~^a^b^c will not throw if an object in path is undefined.
57337	if (path) {
57338		tokens = path.split(".");
57339		l = tokens.length;
57340
57341		for (; ob && i < l; i++) {
57342			prevOb = ob;
57343			ob = tokens[i] ? ob[tokens[i]] : ob;
57344		}
57345	}
57346	if (ltOb) {
57347		ltOb.lt = ltOb.lt || i<l; // If i < l there was an object in the path not yet available
57348	}
57349	return ob === undefined
57350		? fn ? noop : ""
57351		: fn ? function() {
57352			return ob.apply(prevOb, arguments);
57353		} : ob;
57354}
57355
57356function contextParameter(key, value, get) {
57357	// Helper method called as view.ctxPrm(key) for helpers or template parameters ~foo - from compiled template or from context callback
57358	var wrapped, deps, res, obsCtxPrm, tagElse, callView, newRes,
57359		storeView = this,
57360		isUpdate = !isRenderCall && arguments.length > 1,
57361		store = storeView.ctx;
57362	if (key) {
57363		if (!storeView._) { // tagCtx.ctxPrm() call
57364			tagElse = storeView.index;
57365			storeView = storeView.tag;
57366		}
57367		callView = storeView;
57368		if (store && store.hasOwnProperty(key) || (store = $helpers).hasOwnProperty(key)) {
57369			res = store[key];
57370			if (key === "tag" || key === "tagCtx" || key === "root" || key === "parentTags") {
57371				return res;
57372			}
57373		} else {
57374			store = undefined;
57375		}
57376		if (!isRenderCall && storeView.tagCtx || storeView.linked) { // Data-linked view, or tag instance
57377			if (!res || !res._cxp) {
57378				// Not a contextual parameter
57379				// Set storeView to tag (if this is a tag.ctxPrm() call) or to root view ("data" view of linked template)
57380				storeView = storeView.tagCtx || $isFunction(res)
57381					? storeView // Is a tag, not a view, or is a computed contextual parameter, so scope to the callView, no the 'scope view'
57382					: (storeView = storeView.scope || storeView,
57383						!storeView.isTop && storeView.ctx.tag // If this view is in a tag, set storeView to the tag
57384							|| storeView);
57385				if (res !== undefined && storeView.tagCtx) {
57386					// If storeView is a tag, but the contextual parameter has been set at at higher level (e.g. helpers)...
57387					storeView = storeView.tagCtx.view.scope; // then move storeView to the outer level (scope of tag container view)
57388				}
57389				store = storeView._ocps;
57390				res = store && store.hasOwnProperty(key) && store[key] || res;
57391				if (!(res && res._cxp) && (get || isUpdate)) {
57392					// Create observable contextual parameter
57393					(store || (storeView._ocps = storeView._ocps || {}))[key]
57394						= res
57395						= [{
57396							_ocp: res, // The observable contextual parameter value
57397							_vw: callView,
57398							_key: key
57399						}];
57400					res._cxp = {
57401						path: _ocp,
57402						ind: 0,
57403						updateValue: function(val, path) {
57404							$.observable(res[0]).setProperty(_ocp, val); // Set the value (res[0]._ocp)
57405							return this;
57406						}
57407					};
57408				}
57409			}
57410			if (obsCtxPrm = res && res._cxp) {
57411				// If this helper resource is an observable contextual parameter
57412				if (arguments.length > 2) {
57413					deps = res[1] ? $sub._ceo(res[1].deps) : [_ocp]; // fn deps (with any exprObs cloned using $sub._ceo)
57414					deps.unshift(res[0]); // view
57415					deps._cxp = obsCtxPrm;
57416					// In a context callback for a contextual param, we set get = true, to get ctxPrm [view, dependencies...] array - needed for observe call
57417					return deps;
57418				}
57419				tagElse = obsCtxPrm.tagElse;
57420				newRes = res[1] // linkFn for compiled expression
57421					? obsCtxPrm.tag && obsCtxPrm.tag.cvtArgs
57422						? obsCtxPrm.tag.cvtArgs(tagElse, 1)[obsCtxPrm.ind] // = tag.bndArgs() - for tag contextual parameter
57423						: res[1](res[0].data, res[0], $sub) // = fn(data, view, $sub) for compiled binding expression
57424					: res[0]._ocp; // Observable contextual parameter (uninitialized, or initialized as static expression, so no path dependencies)
57425				if (isUpdate) {
57426					$sub._ucp(key, value, storeView, obsCtxPrm); // Update observable contextual parameter
57427					return storeView;
57428				}
57429				res = newRes;
57430			}
57431		}
57432		if (res && $isFunction(res)) {
57433			// If a helper is of type function we will wrap it, so if called with no this pointer it will be called with the
57434			// view as 'this' context. If the helper ~foo() was in a data-link expression, the view will have a 'temporary' linkCtx property too.
57435			// Note that helper functions on deeper paths will have specific this pointers, from the preceding path.
57436			// For example, ~util.foo() will have the ~util object as 'this' pointer
57437			wrapped = function() {
57438				return res.apply((!this || this === global) ? callView : this, arguments);
57439			};
57440			$extend(wrapped, res); // Attach same expandos (if any) to the wrapped function
57441		}
57442		return wrapped || res;
57443	}
57444}
57445
57446/* Internal private: view._getTmpl() */
57447function getTemplate(tmpl) {
57448	return tmpl && (tmpl.fn
57449		? tmpl
57450		: this.getRsc("templates", tmpl) || $templates(tmpl)); // not yet compiled
57451}
57452
57453//==============
57454// views._cnvt
57455//==============
57456
57457function convertVal(converter, view, tagCtx, onError) {
57458	// Called from compiled template code for {{:}}
57459	// self is template object or linkCtx object
57460	var tag, linkCtx, value, argsLen, bindTo,
57461		// If tagCtx is an integer, then it is the key for the compiled function to return the boundTag tagCtx
57462		boundTag = typeof tagCtx === "number" && view.tmpl.bnds[tagCtx-1];
57463
57464	if (onError === undefined && boundTag && boundTag._lr) { // lateRender
57465		onError = "";
57466	}
57467	if (onError !== undefined) {
57468		tagCtx = onError = {props: {}, args: [onError]};
57469	} else if (boundTag) {
57470		tagCtx = boundTag(view.data, view, $sub);
57471	}
57472	boundTag = boundTag._bd && boundTag;
57473	if (converter || boundTag) {
57474		linkCtx = view._lc; // For data-link="{cvt:...}"... See onDataLinkedTagChange
57475		tag = linkCtx && linkCtx.tag;
57476		tagCtx.view = view;
57477		if (!tag) {
57478			tag = $extend(new $sub._tg(), {
57479				_: {
57480					bnd: boundTag,
57481					unlinked: true,
57482					lt: tagCtx.lt // If a late path @some.path has not returned @some object, mark tag as late
57483				},
57484				inline: !linkCtx,
57485				tagName: ":",
57486				convert: converter,
57487				onArrayChange: true,
57488				flow: true,
57489				tagCtx: tagCtx,
57490				tagCtxs: [tagCtx],
57491				_is: "tag"
57492			});
57493			argsLen = tagCtx.args.length;
57494			if (argsLen>1) {
57495				bindTo = tag.bindTo = [];
57496				while (argsLen--) {
57497					bindTo.unshift(argsLen); // Bind to all the arguments - generate bindTo array: [0,1,2...]
57498				}
57499			}
57500			if (linkCtx) {
57501				linkCtx.tag = tag;
57502				tag.linkCtx = linkCtx;
57503			}
57504			tagCtx.ctx = extendCtx(tagCtx.ctx, (linkCtx ? linkCtx.view : view).ctx);
57505			tagHandlersFromProps(tag, tagCtx);
57506		}
57507		tag._er = onError && value;
57508		tag.ctx = tagCtx.ctx || tag.ctx || {};
57509		tagCtx.ctx = undefined;
57510		value = tag.cvtArgs()[0]; // If there is a convertBack but no convert, converter will be "true"
57511		tag._er = onError && value;
57512	} else {
57513		value = tagCtx.args[0];
57514	}
57515
57516	// Call onRender (used by JsViews if present, to add binding annotations around rendered content)
57517	value = boundTag && view._.onRender
57518		? view._.onRender(value, view, tag)
57519		: value;
57520	return value != undefined ? value : "";
57521}
57522
57523function convertArgs(tagElse, bound) { // tag.cvtArgs() or tag.cvtArgs(tagElse?, true?)
57524	var l, key, boundArgs, args, bindFrom, tag, converter,
57525		tagCtx = this;
57526
57527	if (tagCtx.tagName) {
57528		tag = tagCtx;
57529		tagCtx = (tag.tagCtxs || [tagCtx])[tagElse||0];
57530		if (!tagCtx) {
57531			return;
57532		}
57533	} else {
57534		tag = tagCtx.tag;
57535	}
57536
57537	bindFrom = tag.bindFrom;
57538	args = tagCtx.args;
57539
57540	if ((converter = tag.convert) && "" + converter === converter) {
57541		converter = converter === "true"
57542			? undefined
57543			: (tagCtx.view.getRsc("converters", converter) || error("Unknown converter: '" + converter + "'"));
57544	}
57545
57546	if (converter && !bound) { // If there is a converter, use a copy of the tagCtx.args array for rendering, and replace the args[0] in
57547		args = args.slice(); // the copied array with the converted value. But we do not modify the value of tag.tagCtx.args[0] (the original args array)
57548	}
57549	if (bindFrom) { // Get the values of the boundArgs
57550		boundArgs = [];
57551		l = bindFrom.length;
57552		while (l--) {
57553			key = bindFrom[l];
57554			boundArgs.unshift(argOrProp(tagCtx, key));
57555		}
57556		if (bound) {
57557			args = boundArgs; // Call to bndArgs() - returns the boundArgs
57558		}
57559	}
57560	if (converter) {
57561		converter = converter.apply(tag, boundArgs || args);
57562		if (converter === undefined) {
57563			return args; // Returning undefined from a converter is equivalent to not having a converter.
57564		}
57565		bindFrom = bindFrom || [0];
57566		l = bindFrom.length;
57567		if (!$isArray(converter) || (converter.arg0 !== false && (l === 1 || converter.length !== l || converter.arg0))) {
57568			converter = [converter]; // Returning converter as first arg, even if converter value is an array
57569			bindFrom = [0];
57570			l = 1;
57571		}
57572		if (bound) {        // Call to bndArgs() - so apply converter to all boundArgs
57573			args = converter; // The array of values returned from the converter
57574		} else {            // Call to cvtArgs()
57575			while (l--) {
57576				key = bindFrom[l];
57577				if (+key === key) {
57578					args[key] = converter[l];
57579				}
57580			}
57581		}
57582	}
57583	return args;
57584}
57585
57586function argOrProp(context, key) {
57587	context = context[+key === key ? "args" : "props"];
57588	return context && context[key];
57589}
57590
57591function convertBoundArgs(tagElse) { // tag.bndArgs()
57592	return this.cvtArgs(tagElse, 1);
57593}
57594
57595//=============
57596// views.tag
57597//=============
57598
57599/* view.getRsc() */
57600function getResource(resourceType, itemName) {
57601	var res, store,
57602		view = this;
57603	if ("" + itemName === itemName
vendor: 14,716 bytes, lines 57603-58002
57603) {
57604		while ((res === undefined) && view) {
57605			store = view.tmpl && view.tmpl[resourceType];
57606			res = store && store[itemName];
57607			view = view.parent;
57608		}
57609		return res || $views[resourceType][itemName];
57610	}
57611}
57612
57613function renderTag(tagName, parentView, tmpl, tagCtxs, isUpdate, onError) {
57614	function bindToOrBindFrom(type) {
57615		var bindArray = tag[type];
57616
57617		if (bindArray !== undefined) {
57618			bindArray = $isArray(bindArray) ? bindArray : [bindArray];
57619			m = bindArray.length;
57620			while (m--) {
57621				key = bindArray[m];
57622				if (!isNaN(parseInt(key))) {
57623					bindArray[m] = parseInt(key); // Convert "0" to 0, etc.
57624				}
57625			}
57626		}
57627
57628		return bindArray || [0];
57629	}
57630
57631	parentView = parentView || topView;
57632	var tag, tagDef, template, tags, attr, parentTag, l, m, n, itemRet, tagCtx, tagCtxCtx, ctxPrm, bindTo, bindFrom, initVal,
57633		content, callInit, mapDef, thisMap, args, bdArgs, props, tagDataMap, contentCtx, key, bindFromLength, bindToLength, linkedElement, defaultCtx,
57634		i = 0,
57635		ret = "",
57636		linkCtx = parentView._lc || false, // For data-link="{myTag...}"... See onDataLinkedTagChange
57637		ctx = parentView.ctx,
57638		parentTmpl = tmpl || parentView.tmpl,
57639		// If tagCtxs is an integer, then it is the key for the compiled function to return the boundTag tagCtxs
57640		boundTag = typeof tagCtxs === "number" && parentView.tmpl.bnds[tagCtxs-1];
57641
57642	if (tagName._is === "tag") {
57643		tag = tagName;
57644		tagName = tag.tagName;
57645		tagCtxs = tag.tagCtxs;
57646		template = tag.template;
57647	} else {
57648		tagDef = parentView.getRsc("tags", tagName) || error("Unknown tag: {{" + tagName + "}} ");
57649		template = tagDef.template;
57650	}
57651	if (onError === undefined && boundTag && (boundTag._lr = (tagDef.lateRender && boundTag._lr!== false || boundTag._lr))) {
57652		onError = ""; // If lateRender, set temporary onError, to skip initial rendering (and render just "")
57653	}
57654	if (onError !== undefined) {
57655		ret += onError;
57656		tagCtxs = onError = [{props: {}, args: [], params: {props:{}}}];
57657	} else if (boundTag) {
57658		tagCtxs = boundTag(parentView.data, parentView, $sub);
57659	}
57660
57661	l = tagCtxs.length;
57662	for (; i < l; i++) {
57663		tagCtx = tagCtxs[i];
57664		content = tagCtx.tmpl;
57665		if (!linkCtx || !linkCtx.tag || i && !linkCtx.tag.inline || tag._er || content && +content===content) {
57666			// Initialize tagCtx
57667			// For block tags, tagCtx.tmpl is an integer > 0
57668			if (content && parentTmpl.tmpls) {
57669				tagCtx.tmpl = tagCtx.content = parentTmpl.tmpls[content - 1]; // Set the tmpl property to the content of the block tag
57670			}
57671			tagCtx.index = i;
57672			tagCtx.ctxPrm = contextParameter;
57673			tagCtx.render = renderContent;
57674			tagCtx.cvtArgs = convertArgs;
57675			tagCtx.bndArgs = convertBoundArgs;
57676			tagCtx.view = parentView;
57677			tagCtx.ctx = extendCtx(extendCtx(tagCtx.ctx, tagDef && tagDef.ctx), ctx); // Clone and extend parentView.ctx
57678		}
57679		if (tmpl = tagCtx.props.tmpl) {
57680			// If the tmpl property is overridden, set the value (when initializing, or, in case of binding: ^tmpl=..., when updating)
57681			tagCtx.tmpl = parentView._getTmpl(tmpl);
57682			tagCtx.content = tagCtx.content || tagCtx.tmpl;
57683		}
57684
57685		if (!tag) {
57686			// This will only be hit for initial tagCtx (not for {{else}}) - if the tag instance does not exist yet
57687			// If the tag has not already been instantiated, we will create a new instance.
57688			// ~tag will access the tag, even within the rendering of the template content of this tag.
57689			// From child/descendant tags, can access using ~tag.parent, or ~parentTags.tagName
57690			tag = new tagDef._ctr();
57691			callInit = !!tag.init;
57692
57693			tag.parent = parentTag = ctx && ctx.tag;
57694			tag.tagCtxs = tagCtxs;
57695
57696			if (linkCtx) {
57697				tag.inline = false;
57698				linkCtx.tag = tag;
57699			}
57700			tag.linkCtx = linkCtx;
57701			if (tag._.bnd = boundTag || linkCtx.fn) {
57702				// Bound if {^{tag...}} or data-link="{tag...}"
57703				tag._.ths = tagCtx.params.props["this"]; // Tag has a this=expr binding, to get javascript reference to tag instance
57704				tag._.lt = tagCtxs.lt; // If a late path @some.path has not returned @some object, mark tag as late
57705				tag._.arrVws = {};
57706			} else if (tag.dataBoundOnly) {
57707				error(tagName + " must be data-bound:\n{^{" + tagName + "}}");
57708			}
57709			//TODO better perf for childTags() - keep child tag.tags array, (and remove child, when disposed)
57710			// tag.tags = [];
57711		} else if (linkCtx && linkCtx.fn._lr) {
57712			callInit = !!tag.init;
57713		}
57714		tagDataMap = tag.dataMap;
57715
57716		tagCtx.tag = tag;
57717		if (tagDataMap && tagCtxs) {
57718			tagCtx.map = tagCtxs[i].map; // Copy over the compiled map instance from the previous tagCtxs to the refreshed ones
57719		}
57720		if (!tag.flow) {
57721			tagCtxCtx = tagCtx.ctx = tagCtx.ctx || {};
57722
57723			// tags hash: tag.ctx.tags, merged with parentView.ctx.tags,
57724			tags = tag.parents = tagCtxCtx.parentTags = ctx && extendCtx(tagCtxCtx.parentTags, ctx.parentTags) || {};
57725			if (parentTag) {
57726				tags[parentTag.tagName] = parentTag;
57727				//TODO better perf for childTags: parentTag.tags.push(tag);
57728			}
57729			tags[tag.tagName] = tagCtxCtx.tag = tag;
57730			tagCtxCtx.tagCtx = tagCtx;
57731		}
57732	}
57733	if (!(tag._er = onError)) {
57734		tagHandlersFromProps(tag, tagCtxs[0]);
57735		tag.rendering = {rndr: tag.rendering}; // Provide object for state during render calls to tag and elses. (Used by {{if}} and {{for}}...)
57736		for (i = 0; i < l; i++) { // Iterate tagCtx for each {{else}} block
57737			tagCtx = tag.tagCtx = tagCtxs[i];
57738			props = tagCtx.props;
57739			tag.ctx = tagCtx.ctx;
57740
57741			if (!i) {
57742				if (callInit) {
57743					tag.init(tagCtx, linkCtx, tag.ctx);
57744					callInit = undefined;
57745				}
57746				if (!tagCtx.args.length && tagCtx.argDefault !== false && tag.argDefault !== false) {
57747					tagCtx.args = args = [tagCtx.view.data]; // Missing first arg defaults to the current data context
57748					tagCtx.params.args = ["#data"];
57749				}
57750
57751				bindTo = bindToOrBindFrom("bindTo");
57752
57753				if (tag.bindTo !== undefined) {
57754					tag.bindTo = bindTo;
57755				}
57756
57757				if (tag.bindFrom !== undefined) {
57758					tag.bindFrom = bindToOrBindFrom("bindFrom");
57759				} else if (tag.bindTo) {
57760					tag.bindFrom = tag.bindTo = bindTo;
57761				}
57762				bindFrom = tag.bindFrom || bindTo;
57763
57764				bindToLength = bindTo.length;
57765				bindFromLength = bindFrom.length;
57766
57767				if (tag._.bnd && (linkedElement = tag.linkedElement)) {
57768					tag.linkedElement = linkedElement = $isArray(linkedElement) ? linkedElement: [linkedElement];
57769
57770					if (bindToLength !== linkedElement.length) {
57771						error("linkedElement not same length as bindTo");
57772					}
57773				}
57774				if (linkedElement = tag.linkedCtxParam) {
57775					tag.linkedCtxParam = linkedElement = $isArray(linkedElement) ? linkedElement: [linkedElement];
57776
57777					if (bindFromLength !== linkedElement.length) {
57778						error("linkedCtxParam not same length as bindFrom/bindTo");
57779					}
57780				}
57781
57782				if (bindFrom) {
57783					tag._.fromIndex = {}; // Hash of bindFrom index which has same path value as bindTo index. fromIndex = tag._.fromIndex[toIndex]
57784					tag._.toIndex = {}; // Hash of bindFrom index which has same path value as bindTo index. fromIndex = tag._.fromIndex[toIndex]
57785					n = bindFromLength;
57786					while (n--) {
57787						key = bindFrom[n];
57788						m = bindToLength;
57789						while (m--) {
57790							if (key === bindTo[m]) {
57791								tag._.fromIndex[m] = n;
57792								tag._.toIndex[n] = m;
57793							}
57794						}
57795					}
57796				}
57797
57798				if (linkCtx) {
57799					// Set attr on linkCtx to ensure outputting to the correct target attribute.
57800					// Setting either linkCtx.attr or this.attr in the init() allows per-instance choice of target attrib.
57801					linkCtx.attr = tag.attr = linkCtx.attr || tag.attr || linkCtx._dfAt;
57802				}
57803				attr = tag.attr;
57804				tag._.noVws = attr && attr !== HTML;
57805			}
57806			args = tag.cvtArgs(i);
57807			if (tag.linkedCtxParam) {
57808				bdArgs = tag.cvtArgs(i, 1);
57809				m = bindFromLength;
57810				defaultCtx = tag.constructor.prototype.ctx;
57811				while (m--) {
57812					if (ctxPrm = tag.linkedCtxParam[m]) {
57813						key = bindFrom[m];
57814						initVal = bdArgs[m];
57815						// Create tag contextual parameter
57816						tagCtx.ctx[ctxPrm] = $sub._cp(
57817							defaultCtx && initVal === undefined ? defaultCtx[ctxPrm]: initVal,
57818							initVal !== undefined && argOrProp(tagCtx.params, key),
57819							tagCtx.view,
57820							tag._.bnd && {tag: tag, cvt: tag.convert, ind: m, tagElse: i}
57821						);
57822					}
57823				}
57824			}
57825			if ((mapDef = props.dataMap || tagDataMap) && (args.length || props.dataMap)) {
57826				thisMap = tagCtx.map;
57827				if (!thisMap || thisMap.src !== args[0] || isUpdate) {
57828					if (thisMap && thisMap.src) {
57829						thisMap.unmap(); // only called if observable map - not when only used in JsRender, e.g. by {{props}}
57830					}
57831					mapDef.map(args[0], tagCtx, thisMap, !tag._.bnd);
57832					thisMap = tagCtx.map;
57833				}
57834				args = [thisMap.tgt];
57835			}
57836
57837			itemRet = undefined;
57838			if (tag.render) {
57839				itemRet = tag.render.apply(tag, args);
57840				if (parentView.linked && itemRet && !rWrappedInViewMarker.test(itemRet)) {
57841					// When a tag renders content from the render method, with data linking then we need to wrap with view markers, if absent,
57842					// to provide a contentView for the tag, which will correctly dispose bindings if deleted. The 'tmpl' for this view will
57843					// be a dumbed-down template which will always return the itemRet string (no matter what the data is). The itemRet string
57844					// is not compiled as template markup, so can include "{{" or "}}" without triggering syntax errors
57845					tmpl = { // 'Dumbed-down' template which always renders 'static' itemRet string
57846						links: []
57847					};
57848					tmpl.render = tmpl.fn = function() {
57849						return itemRet;
57850					};
57851					itemRet = renderWithViews(tmpl, parentView.data, undefined, true, parentView, undefined, undefined, tag);
57852				}
57853			}
57854			if (!args.length) {
57855				args = [parentView]; // no arguments - (e.g. {{else}}) get data context from view.
57856			}
57857			if (itemRet === undefined) {
57858				contentCtx = args[0]; // Default data context for wrapped block content is the first argument
57859				if (tag.contentCtx) { // Set tag.contentCtx to true, to inherit parent context, or to a function to provide alternate context.
57860					contentCtx = tag.contentCtx === true ? parentView : tag.contentCtx(contentCtx);
57861				}
57862				itemRet = tagCtx.render(contentCtx, true) || (isUpdate ? undefined : "");
57863			}
57864			ret = ret
57865				? ret + (itemRet || "")
57866				: itemRet !== undefined
57867					? "" + itemRet
57868					: undefined; // If no return value from render, and no template/content tagCtx.render(...), return undefined
57869		}
57870		tag.rendering = tag.rendering.rndr; // Remove tag.rendering object (if this is outermost render call. (In case of nested calls)
57871	}
57872	tag.tagCtx = tagCtxs[0];
57873	tag.ctx = tag.tagCtx.ctx;
57874
57875	if (tag._.noVws && tag.inline) {
57876		// inline tag with attr set to "text" will insert HTML-encoded content - as if it was element-based innerText
57877		ret = attr === "text"
57878			? $converters.html(ret)
57879			: "";
57880	}
57881	return boundTag && parentView._.onRender
57882		// Call onRender (used by JsViews if present, to add binding annotations around rendered content)
57883		? parentView._.onRender(ret, parentView, tag)
57884		: ret;
57885}
57886
57887//=================
57888// View constructor
57889//=================
57890
57891function View(context, type, parentView, data, template, key, onRender, contentTmpl) {
57892	// Constructor for view object in view hierarchy. (Augmented by JsViews if JsViews is loaded)
57893	var views, parentView_, tag, self_,
57894		self = this,
57895		isArray = type === "array";
57896		// If the data is an array, this is an 'array view' with a views array for each child 'item view'
57897		// If the data is not an array, this is an 'item view' with a views 'hash' object for any child nested views
57898
57899	self.content = contentTmpl;
57900	self.views = isArray ? [] : {};
57901	self.data = data;
57902	self.tmpl = template;
57903	self_ = self._ = {
57904		key: 0,
57905		// ._.useKey is non zero if is not an 'array view' (owning a data array). Use this as next key for adding to child views hash
57906		useKey: isArray ? 0 : 1,
57907		id: "" + viewId++,
57908		onRender: onRender,
57909		bnds: {}
57910	};
57911	self.linked = !!onRender;
57912	self.type = type || "top";
57913	if (type) {
57914		self.cache = {_ct: $subSettings._cchCt}; // Used for caching results of computed properties and helpers (view.getCache)
57915	}
57916
57917	if (!parentView || parentView.type === "top") {
57918		(self.ctx = context || {}).root = self.data;
57919	}
57920
57921	if (self.parent = parentView) {
57922		self.root = parentView.root || self; // view whose parent is top view
57923		views = parentView.views;
57924		parentView_ = parentView._;
57925		self.isTop = parentView_.scp; // Is top content view of a link("#container", ...) call
57926		self.scope = (!context.tag || context.tag === parentView.ctx.tag) && !self.isTop && parentView.scope || self;
57927		// Scope for contextParams - closest non flow tag ancestor or root view
57928		if (parentView_.useKey) {
57929			// Parent is not an 'array view'. Add this view to its views object
57930			// self._key = is the key in the parent view hash
57931			views[self_.key = "_" + parentView_.useKey++] = self;
57932			self.index = indexStr;
57933			self.getIndex = getNestedIndex;
57934		} else if (views.length === (self_.key = self.index = key)) { // Parent is an 'array view'. Add this view to its views array
57935			views.push(self); // Adding to end of views array. (Using push when possible - better perf than splice)
57936		} else {
57937			views.splice(key, 0, self); // Inserting in views array
57938		}
57939		// If no context was passed in, use parent context
57940		// If context was passed in, it should have been merged already with parent context
57941		self.ctx = context || parentView.ctx;
57942	} else if (type) {
57943		self.root = self; // view whose parent is top view
57944	}
57945}
57946
57947View.prototype = {
57948	get: getView,
57949	getIndex: getIndex,
57950	ctxPrm: contextParameter,
57951	getRsc: getResource,
57952	_getTmpl: getTemplate,
57953	_getOb: getPathObject,
57954	getCache: function(key) { // Get cached value of computed value
57955		if ($subSettings._cchCt > this.cache._ct) {
57956			this.cache = {_ct: $subSettings._cchCt};
57957		}
57958		return this.cache[key] !== undefined ? this.cache[key] : (this.cache[key] = cpFnStore[key](this.data, this, $sub));
57959	},
57960	_is: "view"
57961};
57962
57963//====================================================
57964// Registration
57965//====================================================
57966
57967function compileChildResources(parentTmpl) {
57968	var storeName, storeNames, resources;
57969	for (storeName in jsvStores) {
57970		storeNames = storeName + "s";
57971		if (parentTmpl[storeNames]) {
57972			resources = parentTmpl[storeNames];        // Resources not yet compiled
57973			parentTmpl[storeNames] = {};               // Remove uncompiled resources
57974			$views[storeNames](resources, parentTmpl); // Add back in the compiled resources
57975		}
57976	}
57977}
57978
57979//===============
57980// compileTag
57981//===============
57982
57983function compileTag(name, tagDef, parentTmpl) {
57984	var tmpl, baseTag, prop,
57985		compiledDef = new $sub._tg();
57986
57987	function Tag() {
57988		var tag = this;
57989		tag._ = {
57990			unlinked: true
57991		};
57992		tag.inline = true;
57993		tag.tagName = name;
57994	}
57995
57996	if ($isFunction(tagDef)) {
57997		// Simple tag declared as function. No presenter instantation.
57998		tagDef = {
57999			depends: tagDef.depends,
58000			render: tagDef
58001		};
58002	} else if (
vendor: 7,601 bytes, lines 58002-58252
58002"" + tagDef === tagDef) {
58003		tagDef = {template: tagDef};
58004	}
58005
58006	if (baseTag = tagDef.baseTag) {
58007		tagDef.flow = !!tagDef.flow; // Set flow property, so defaults to false even if baseTag has flow=true
58008		baseTag = "" + baseTag === baseTag
58009			? (parentTmpl && parentTmpl.tags[baseTag] || $tags[baseTag])
58010			: baseTag;
58011		if (!baseTag) {
58012			error('baseTag: "' + tagDef.baseTag + '" not found');
58013		}
58014		compiledDef = $extend(compiledDef, baseTag);
58015
58016		for (prop in tagDef) {
58017			compiledDef[prop] = getMethod(baseTag[prop], tagDef[prop]);
58018		}
58019	} else {
58020		compiledDef = $extend(compiledDef, tagDef);
58021	}
58022
58023	// Tag declared as object, used as the prototype for tag instantiation (control/presenter)
58024	if ((tmpl = compiledDef.template) !== undefined) {
58025		compiledDef.template = "" + tmpl === tmpl ? ($templates[tmpl] || $templates(tmpl)) : tmpl;
58026	}
58027	(Tag.prototype = compiledDef).constructor = compiledDef._ctr = Tag;
58028
58029	if (parentTmpl) {
58030		compiledDef._parentTmpl = parentTmpl;
58031	}
58032	return compiledDef;
58033}
58034
58035function baseApply(args) {
58036	// In derived method (or handler declared declaratively as in {{:foo onChange=~fooChanged}} can call base method,
58037	// using this.baseApply(arguments) (Equivalent to this._superApply(arguments) in jQuery UI)
58038	return this.base.apply(this, args);
58039}
58040
58041//===============
58042// compileTmpl
58043//===============
58044
58045function compileTmpl(name, tmpl, parentTmpl, options) {
58046	// tmpl is either a template object, a selector for a template script block, or the name of a compiled template
58047
58048	//==== nested functions ====
58049	function lookupTemplate(value) {
58050		// If value is of type string - treat as selector, or name of compiled template
58051		// Return the template object, if already compiled, or the markup string
58052		var currentName, tmpl;
58053		if (("" + value === value) || value.nodeType > 0 && (elem = value)) {
58054			if (!elem) {
58055				if (/^\.?\/[^\\:*?"<>]*$/.test(value)) {
58056					// value="./some/file.html" (or "/some/file.html")
58057					// If the template is not named, use "./some/file.html" as name.
58058					if (tmpl = $templates[name = name || value]) {
58059						value = tmpl;
58060					} else {
58061						// BROWSER-SPECIFIC CODE (not on Node.js):
58062						// Look for server-generated script block with id "./some/file.html"
58063						elem = document.getElementById(value);
58064					}
58065				} else if (value.charAt(0) === "#") {
58066					elem = document.getElementById(value.slice(1));
58067				} else if ($.fn && !$sub.rTmpl.test(value)) {
58068					try {
58069						elem = $(value, document)[0]; // if jQuery is loaded, test for selector returning elements, and get first element
58070					} catch (e) {}
58071				}// END BROWSER-SPECIFIC CODE
58072			} //BROWSER-SPECIFIC CODE
58073			if (elem) {
58074				if (elem.tagName !== "SCRIPT") {
58075					error(value + ": Use script block, not " + elem.tagName);
58076				}
58077				if (options) {
58078					// We will compile a new template using the markup in the script element
58079					value = elem.innerHTML;
58080				} else {
58081					// We will cache a single copy of the compiled template, and associate it with the name
58082					// (renaming from a previous name if there was one).
58083					currentName = elem.getAttribute(tmplAttr);
58084					if (currentName) {
58085						if (currentName !== jsvTmpl) {
58086							value = $templates[currentName];
58087							delete $templates[currentName];
58088						} else if ($.fn) {
58089							value = $.data(elem)[jsvTmpl]; // Get cached compiled template
58090						}
58091					}
58092					if (!currentName || !value) { // Not yet compiled, or cached version lost
58093						name = name || ($.fn ? jsvTmpl : value);
58094						value = compileTmpl(name, elem.innerHTML, parentTmpl, options);
58095					}
58096					value.tmplName = name = name || currentName;
58097					if (name !== jsvTmpl) {
58098						$templates[name] = value;
58099					}
58100					elem.setAttribute(tmplAttr, name);
58101					if ($.fn) {
58102						$.data(elem, jsvTmpl, value);
58103					}
58104				}
58105			} // END BROWSER-SPECIFIC CODE
58106			elem = undefined;
58107		} else if (!value.fn) {
58108			value = undefined;
58109			// If value is not a string. HTML element, or compiled template, return undefined
58110		}
58111		return value;
58112	}
58113
58114	var elem, compiledTmpl,
58115		tmplOrMarkup = tmpl = tmpl || "";
58116	$sub._html = $converters.html;
58117
58118	//==== Compile the template ====
58119	if (options === 0) {
58120		options = undefined;
58121		tmplOrMarkup = lookupTemplate(tmplOrMarkup); // Top-level compile so do a template lookup
58122	}
58123
58124	// If options, then this was already compiled from a (script) element template declaration.
58125	// If not, then if tmpl is a template object, use it for options
58126	options = options || (tmpl.markup
58127		? tmpl.bnds
58128			? $extend({}, tmpl)
58129			: tmpl
58130		: {}
58131	);
58132
58133	options.tmplName = options.tmplName || name || "unnamed";
58134	if (parentTmpl) {
58135		options._parentTmpl = parentTmpl;
58136	}
58137	// If tmpl is not a markup string or a selector string, then it must be a template object
58138	// In that case, get it from the markup property of the object
58139	if (!tmplOrMarkup && tmpl.markup && (tmplOrMarkup = lookupTemplate(tmpl.markup)) && tmplOrMarkup.fn) {
58140		// If the string references a compiled template object, need to recompile to merge any modified options
58141		tmplOrMarkup = tmplOrMarkup.markup;
58142	}
58143	if (tmplOrMarkup !== undefined) {
58144		if (tmplOrMarkup.render || tmpl.render) {
58145			// tmpl is already compiled, so use it
58146			if (tmplOrMarkup.tmpls) {
58147				compiledTmpl = tmplOrMarkup;
58148			}
58149		} else {
58150			// tmplOrMarkup is a markup string, not a compiled template
58151			// Create template object
58152			tmpl = tmplObject(tmplOrMarkup, options);
58153			// Compile to AST and then to compiled function
58154			tmplFn(tmplOrMarkup.replace(rEscapeQuotes, "\\$&"), tmpl);
58155		}
58156		if (!compiledTmpl) {
58157			compiledTmpl = $extend(function() {
58158				return compiledTmpl.render.apply(compiledTmpl, arguments);
58159			}, tmpl);
58160
58161			compileChildResources(compiledTmpl);
58162		}
58163		return compiledTmpl;
58164	}
58165}
58166
58167//==== /end of function compileTmpl ====
58168
58169//=================
58170// compileViewModel
58171//=================
58172
58173function getDefaultVal(defaultVal, data) {
58174	return $isFunction(defaultVal)
58175		? defaultVal.call(data)
58176		: defaultVal;
58177}
58178
58179function addParentRef(ob, ref, parent) {
58180	Object.defineProperty(ob, ref, {
58181		value: parent,
58182		configurable: true
58183	});
58184}
58185
58186function compileViewModel(name, type) {
58187	var i, constructor, parent,
58188		viewModels = this,
58189		getters = type.getters,
58190		extend = type.extend,
58191		id = type.id,
58192		proto = $.extend({
58193			_is: name || "unnamed",
58194			unmap: unmap,
58195			merge: merge
58196		}, extend),
58197		args = "",
58198		cnstr = "",
58199		getterCount = getters ? getters.length : 0,
58200		$observable = $.observable,
58201		getterNames = {};
58202
58203	function JsvVm(args) {
58204		constructor.apply(this, args);
58205	}
58206
58207	function vm() {
58208		return new JsvVm(arguments);
58209	}
58210
58211	function iterate(data, action) {
58212		var getterType, defaultVal, prop, ob, parentRef,
58213			j = 0;
58214		for (; j < getterCount; j++) {
58215			prop = getters[j];
58216			getterType = undefined;
58217			if (prop + "" !== prop) {
58218				getterType = prop;
58219				prop = getterType.getter;
58220				parentRef = getterType.parentRef;
58221			}
58222			if ((ob = data[prop]) === undefined && getterType && (defaultVal = getterType.defaultVal) !== undefined) {
58223				ob = getDefaultVal(defaultVal, data);
58224			}
58225			action(ob, getterType && viewModels[getterType.type], prop, parentRef);
58226		}
58227	}
58228
58229	function map(data) {
58230		data = data + "" === data
58231			? JSON.parse(data) // Accept JSON string
58232			: data;            // or object/array
58233		var l, prop, childOb, parentRef,
58234			j = 0,
58235			ob = data,
58236			arr = [];
58237
58238		if ($isArray(data)) {
58239			data = data || [];
58240			l = data.length;
58241			for (; j<l; j++) {
58242				arr.push(this.map(data[j]));
58243			}
58244			arr._is = name;
58245			arr.unmap = unmap;
58246			arr.merge = merge;
58247			return arr;
58248		}
58249
58250		if (data) {
58251			iterate(data, function(ob, viewModel) {
58252				if (viewModel) { // Iterate to build getters arg array (value, or mapped value)
vendor: 6,942 bytes, lines 58253-58505
58253					ob = viewModel.map(ob);
58254				}
58255				arr.push(ob);
58256			});
58257			ob = this.apply(this, arr); // Instantiate this View Model, passing getters args array to constructor
58258			j = getterCount;
58259			while (j--) {
58260				childOb = arr[j];
58261				parentRef = getters[j].parentRef;
58262				if (parentRef && childOb && childOb.unmap) {
58263					if ($isArray(childOb)) {
58264						l = childOb.length;
58265						while (l--) {
58266							addParentRef(childOb[l], parentRef, ob);
58267						}
58268					} else {
58269						addParentRef(childOb, parentRef, ob);
58270					}
58271				}
58272			}
58273			for (prop in data) { // Copy over any other properties. that are not get/set properties
58274				if (prop !== $expando && !getterNames[prop]) {
58275					ob[prop] = data[prop];
58276				}
58277			}
58278		}
58279		return ob;
58280	}
58281
58282	function merge(data, parent, parentRef) {
58283		data = data + "" === data
58284			? JSON.parse(data) // Accept JSON string
58285			: data;            // or object/array
58286
58287		var j, l, m, prop, mod, found, assigned, ob, newModArr, childOb,
58288			k = 0,
58289			model = this;
58290
58291		if ($isArray(model)) {
58292			assigned = {};
58293			newModArr = [];
58294			l = data.length;
58295			m = model.length;
58296			for (; k<l; k++) {
58297				ob = data[k];
58298				found = false;
58299				for (j=0; j<m && !found; j++) {
58300					if (assigned[j]) {
58301						continue;
58302					}
58303					mod = model[j];
58304
58305					if (id) {
58306						assigned[j] = found = id + "" === id
58307						? (ob[id] && (getterNames[id] ? mod[id]() : mod[id]) === ob[id])
58308						: id(mod, ob);
58309					}
58310				}
58311				if (found) {
58312					mod.merge(ob);
58313					newModArr.push(mod);
58314				} else {
58315					newModArr.push(childOb = vm.map(ob));
58316					if (parentRef) {
58317						addParentRef(childOb, parentRef, parent);
58318					}
58319				}
58320			}
58321			if ($observable) {
58322				$observable(model).refresh(newModArr, true);
58323			} else {
58324				model.splice.apply(model, [0, model.length].concat(newModArr));
58325			}
58326			return;
58327		}
58328		iterate(data, function(ob, viewModel, getter, parentRef) {
58329			if (viewModel) {
58330				model[getter]().merge(ob, model, parentRef); // Update typed property
58331			} else if (model[getter]() !== ob) {
58332				model[getter](ob); // Update non-typed property
58333			}
58334		});
58335		for (prop in data) {
58336			if (prop !== $expando && !getterNames[prop]) {
58337				model[prop] = data[prop];
58338			}
58339		}
58340	}
58341
58342	function unmap() {
58343		var ob, prop, getterType, arr, value,
58344			k = 0,
58345			model = this;
58346
58347		function unmapArray(modelArr) {
58348			var arr = [],
58349				i = 0,
58350				l = modelArr.length;
58351			for (; i<l; i++) {
58352				arr.push(modelArr[i].unmap());
58353			}
58354			return arr;
58355		}
58356
58357		if ($isArray(model)) {
58358			return unmapArray(model);
58359		}
58360		ob = {};
58361		for (; k < getterCount; k++) {
58362			prop = getters[k];
58363			getterType = undefined;
58364			if (prop + "" !== prop) {
58365				getterType = prop;
58366				prop = getterType.getter;
58367			}
58368			value = model[prop]();
58369			ob[prop] = getterType && value && viewModels[getterType.type]
58370				? $isArray(value)
58371					? unmapArray(value)
58372					: value.unmap()
58373				: value;
58374		}
58375		for (prop in model) {
58376			if (model.hasOwnProperty(prop) && (prop.charAt(0) !== "_" || !getterNames[prop.slice(1)]) && prop !== $expando && !$isFunction(model[prop])) {
58377				ob[prop] = model[prop];
58378			}
58379		}
58380		return ob;
58381	}
58382
58383	JsvVm.prototype = proto;
58384
58385	for (i=0; i < getterCount; i++) {
58386		(function(getter) {
58387			getter = getter.getter || getter;
58388			getterNames[getter] = i+1;
58389			var privField = "_" + getter;
58390
58391			args += (args ? "," : "") + getter;
58392			cnstr += "this." + privField + " = " + getter + ";\n";
58393			proto[getter] = proto[getter] || function(val) {
58394				if (!arguments.length) {
58395					return this[privField]; // If there is no argument, use as a getter
58396				}
58397				if ($observable) {
58398					$observable(this).setProperty(getter, val);
58399				} else {
58400					this[privField] = val;
58401				}
58402			};
58403
58404			if ($observable) {
58405				proto[getter].set = proto[getter].set || function(val) {
58406					this[privField] = val; // Setter called by observable property change
58407				};
58408			}
58409		})(getters[i]);
58410	}
58411
58412	// Constructor for new viewModel instance.
58413	cnstr = new Function(args, cnstr);
58414
58415	constructor = function() {
58416		cnstr.apply(this, arguments);
58417		// Pass additional parentRef str and parent obj to have a parentRef pointer on instance
58418		if (parent = arguments[getterCount + 1]) {
58419			addParentRef(this, arguments[getterCount], parent);
58420		}
58421	};
58422
58423	constructor.prototype = proto;
58424	proto.constructor = constructor;
58425
58426	vm.map = map;
58427	vm.getters = getters;
58428	vm.extend = extend;
58429	vm.id = id;
58430	return vm;
58431}
58432
58433function tmplObject(markup, options) {
58434	// Template object constructor
58435	var htmlTag,
58436		wrapMap = $subSettingsAdvanced._wm || {}, // Only used in JsViews. Otherwise empty: {}
58437		tmpl = {
58438			tmpls: [],
58439			links: {}, // Compiled functions for link expressions
58440			bnds: [],
58441			_is: "template",
58442			render: renderContent
58443		};
58444
58445	if (options) {
58446		tmpl = $extend(tmpl, options);
58447	}
58448
58449	tmpl.markup = markup;
58450	if (!tmpl.htmlTag) {
58451		// Set tmpl.tag to the top-level HTML tag used in the template, if any...
58452		htmlTag = rFirstElem.exec(markup);
58453		tmpl.htmlTag = htmlTag ? htmlTag[1].toLowerCase() : "";
58454	}
58455	htmlTag = wrapMap[tmpl.htmlTag];
58456	if (htmlTag && htmlTag !== wrapMap.div) {
58457		// When using JsViews, we trim templates which are inserted into HTML contexts where text nodes are not rendered (i.e. not 'Phrasing Content').
58458		// Currently not trimmed for <li> tag. (Not worth adding perf cost)
58459		tmpl.markup = $.trim(tmpl.markup);
58460	}
58461
58462	return tmpl;
58463}
58464
58465//==============
58466// registerStore
58467//==============
58468
58469/**
58470* Internal. Register a store type (used for template, tags, helpers, converters)
58471*/
58472function registerStore(storeName, storeSettings) {
58473
58474/**
58475* Generic store() function to register item, named item, or hash of items
58476* Also used as hash to store the registered items
58477* Used as implementation of $.templates(), $.views.templates(), $.views.tags(), $.views.helpers() and $.views.converters()
58478*
58479* @param {string|hash} name         name - or selector, in case of $.templates(). Or hash of items
58480* @param {any}         [item]       (e.g. markup for named template)
58481* @param {template}    [parentTmpl] For item being registered as private resource of template
58482* @returns {any|$.views} item, e.g. compiled template - or $.views in case of registering hash of items
58483*/
58484	function theStore(name, item, parentTmpl) {
58485		// The store is also the function used to add items to the store. e.g. $.templates, or $.views.tags
58486
58487		// For store of name 'thing', Call as:
58488		//    $.views.things(items[, parentTmpl]),
58489		// or $.views.things(name[, item, parentTmpl])
58490
58491		var compile, itemName, thisStore, cnt,
58492			onStore = $sub.onStore[storeName];
58493
58494		if (name && typeof name === OBJECT && !name.nodeType && !name.markup && !name.getTgt && !(storeName === "viewModel" && name.getters || name.extend)) {
58495			// Call to $.views.things(items[, parentTmpl]),
58496
58497			// Adding items to the store
58498			// If name is a hash, then item is parentTmpl. Iterate over hash and call store for key.
58499			for (itemName in name) {
58500				theStore(itemName, name[itemName], item);
58501			}
58502			return item || $views;
58503		}
58504		// Adding a single unnamed item to the store
58505		if (name && "" + name !== name
vendor: 17,574 bytes, lines 58505-59025
58505) { // name must be a string
58506			parentTmpl = item;
58507			item = name;
58508			name = undefined;
58509		}
58510		thisStore = parentTmpl
58511			? storeName === "viewModel"
58512				? parentTmpl
58513				: (parentTmpl[storeNames] = parentTmpl[storeNames] || {})
58514			: theStore;
58515		compile = storeSettings.compile;
58516
58517		if (item === undefined) {
58518			item = compile ? name : thisStore[name];
58519			name = undefined;
58520		}
58521		if (item === null) {
58522			// If item is null, delete this entry
58523			if (name) {
58524				delete thisStore[name];
58525			}
58526		} else {
58527			if (compile) {
58528				item = compile.call(thisStore, name, item, parentTmpl, 0) || {};
58529				item._is = storeName; // Only do this for compiled objects (tags, templates...)
58530			}
58531			if (name) {
58532				thisStore[name] = item;
58533			}
58534		}
58535		if (onStore) {
58536			// e.g. JsViews integration
58537			onStore(name, item, parentTmpl, compile);
58538		}
58539		return item;
58540	}
58541
58542	var storeNames = storeName + "s";
58543	$views[storeNames] = theStore;
58544}
58545
58546/**
58547* Add settings such as:
58548* $.views.settings.allowCode(true)
58549* @param {boolean} value
58550* @returns {Settings}
58551*
58552* allowCode = $.views.settings.allowCode()
58553* @returns {boolean}
58554*/
58555function addSetting(st) {
58556	$viewsSettings[st] = $viewsSettings[st] || function(value) {
58557		return arguments.length
58558			? ($subSettings[st] = value, $viewsSettings)
58559			: $subSettings[st];
58560	};
58561}
58562
58563//========================
58564// dataMap for render only
58565//========================
58566
58567function dataMap(mapDef) {
58568	function Map(source, options) {
58569		this.tgt = mapDef.getTgt(source, options);
58570		options.map = this;
58571	}
58572
58573	if ($isFunction(mapDef)) {
58574		// Simple map declared as function
58575		mapDef = {
58576			getTgt: mapDef
58577		};
58578	}
58579
58580	if (mapDef.baseMap) {
58581		mapDef = $extend($extend({}, mapDef.baseMap), mapDef);
58582	}
58583
58584	mapDef.map = function(source, options) {
58585		return new Map(source, options);
58586	};
58587	return mapDef;
58588}
58589
58590//==============
58591// renderContent
58592//==============
58593
58594/** Render the template as a string, using the specified data and helpers/context
58595* $("#tmpl").render(), tmpl.render(), tagCtx.render(), $.render.namedTmpl()
58596*
58597* @param {any}        data
58598* @param {hash}       [context]           helpers or context
58599* @param {boolean}    [noIteration]
58600* @param {View}       [parentView]        internal
58601* @param {string}     [key]               internal
58602* @param {function}   [onRender]          internal
58603* @returns {string}   rendered template   internal
58604*/
58605function renderContent(data, context, noIteration, parentView, key, onRender) {
58606	var i, l, tag, tmpl, tagCtx, isTopRenderCall, prevData, prevIndex,
58607		view = parentView,
58608		result = "";
58609
58610	if (context === true) {
58611		noIteration = context; // passing boolean as second param - noIteration
58612		context = undefined;
58613	} else if (typeof context !== OBJECT) {
58614		context = undefined; // context must be a boolean (noIteration) or a plain object
58615	}
58616
58617	if (tag = this.tag) {
58618		// This is a call from renderTag or tagCtx.render(...)
58619		tagCtx = this;
58620		view = view || tagCtx.view;
58621		tmpl = view._getTmpl(tag.template || tagCtx.tmpl);
58622		if (!arguments.length) {
58623			data = tag.contentCtx && $isFunction(tag.contentCtx)
58624				? data = tag.contentCtx(data)
58625				: view; // Default data context for wrapped block content is the first argument
58626		}
58627	} else {
58628		// This is a template.render(...) call
58629		tmpl = this;
58630	}
58631
58632	if (tmpl) {
58633		if (!parentView && data && data._is === "view") {
58634			view = data; // When passing in a view to render or link (and not passing in a parent view) use the passed-in view as parentView
58635		}
58636
58637		if (view && data === view) {
58638			// Inherit the data from the parent view.
58639			data = view.data;
58640		}
58641
58642		isTopRenderCall = !view;
58643		isRenderCall = isRenderCall || isTopRenderCall;
58644		if (isTopRenderCall) {
58645			(context = context || {}).root = data; // Provide ~root as shortcut to top-level data.
58646		}
58647		if (!isRenderCall || $subSettingsAdvanced.useViews || tmpl.useViews || view && view !== topView) {
58648			result = renderWithViews(tmpl, data, context, noIteration, view, key, onRender, tag);
58649		} else {
58650			if (view) { // In a block
58651				prevData = view.data;
58652				prevIndex = view.index;
58653				view.index = indexStr;
58654			} else {
58655				view = topView;
58656				prevData = view.data;
58657				view.data = data;
58658				view.ctx = context;
58659			}
58660			if ($isArray(data) && !noIteration) {
58661				// Create a view for the array, whose child views correspond to each data item. (Note: if key and parentView are passed in
58662				// along with parent view, treat as insert -e.g. from view.addViews - so parentView is already the view item for array)
58663				for (i = 0, l = data.length; i < l; i++) {
58664					view.index = i;
58665					view.data = data[i];
58666					result += tmpl.fn(data[i], view, $sub);
58667				}
58668			} else {
58669				view.data = data;
58670				result += tmpl.fn(data, view, $sub);
58671			}
58672			view.data = prevData;
58673			view.index = prevIndex;
58674		}
58675		if (isTopRenderCall) {
58676			isRenderCall = undefined;
58677		}
58678	}
58679	return result;
58680}
58681
58682function renderWithViews(tmpl, data, context, noIteration, view, key, onRender, tag) {
58683	// Render template against data as a tree of subviews (nested rendered template instances), or as a string (top-level template).
58684	// If the data is the parent view, treat as noIteration, re-render with the same data context.
58685	// tmpl can be a string (e.g. rendered by a tag.render() method), or a compiled template.
58686	var i, l, newView, childView, itemResult, swapContent, contentTmpl, outerOnRender, tmplName, itemVar, newCtx, tagCtx, noLinking,
58687		result = "";
58688
58689	if (tag) {
58690		// This is a call from renderTag or tagCtx.render(...)
58691		tmplName = tag.tagName;
58692		tagCtx = tag.tagCtx;
58693		context = context ? extendCtx(context, tag.ctx) : tag.ctx;
58694
58695		if (tmpl === view.content) { // {{xxx tmpl=#content}}
58696			contentTmpl = tmpl !== view.ctx._wrp // We are rendering the #content
58697				? view.ctx._wrp // #content was the tagCtx.props.tmpl wrapper of the block content - so within this view, #content will now be the view.ctx._wrp block content
58698				: undefined; // #content was the view.ctx._wrp block content - so within this view, there is no longer any #content to wrap.
58699		} else if (tmpl !== tagCtx.content) {
58700			if (tmpl === tag.template) { // Rendering {{tag}} tag.template, replacing block content.
58701				contentTmpl = tagCtx.tmpl; // Set #content to block content (or wrapped block content if tagCtx.props.tmpl is set)
58702				context._wrp = tagCtx.content; // Pass wrapped block content to nested views
58703			} else { // Rendering tagCtx.props.tmpl wrapper
58704				contentTmpl = tagCtx.content || view.content; // Set #content to wrapped block content
58705			}
58706		} else {
58707			contentTmpl = view.content; // Nested views inherit same wrapped #content property
58708		}
58709
58710		if (tagCtx.props.link === false) {
58711			// link=false setting on block tag
58712			// We will override inherited value of link by the explicit setting link=false taken from props
58713			// The child views of an unlinked view are also unlinked. So setting child back to true will not have any effect.
58714			context = context || {};
58715			context.link = false;
58716		}
58717	}
58718
58719	if (view) {
58720		onRender = onRender || view._.onRender;
58721		noLinking = context && context.link === false;
58722
58723		if (noLinking && view._.nl) {
58724			onRender = undefined;
58725		}
58726
58727		context = extendCtx(context, view.ctx);
58728		tagCtx = !tag && view.tag
58729			? view.tag.tagCtxs[view.tagElse]
58730			: tagCtx;
58731	}
58732
58733	if (itemVar = tagCtx && tagCtx.props.itemVar) {
58734		if (itemVar[0] !== "~") {
58735			syntaxError("Use itemVar='~myItem'");
58736		}
58737		itemVar = itemVar.slice(1);
58738	}
58739
58740	if (key === true) {
58741		swapContent = true;
58742		key = 0;
58743	}
58744
58745	// If link===false, do not call onRender, so no data-linking marker nodes
58746	if (onRender && tag && tag._.noVws) {
58747		onRender = undefined;
58748	}
58749	outerOnRender = onRender;
58750	if (onRender === true) {
58751		// Used by view.refresh(). Don't create a new wrapper view.
58752		outerOnRender = undefined;
58753		onRender = view._.onRender;
58754	}
58755	// Set additional context on views created here, (as modified context inherited from the parent, and to be inherited by child views)
58756	context = tmpl.helpers
58757		? extendCtx(tmpl.helpers, context)
58758		: context;
58759
58760	newCtx = context;
58761	if ($isArray(data) && !noIteration) {
58762		// Create a view for the array, whose child views correspond to each data item. (Note: if key and view are passed in
58763		// along with parent view, treat as insert -e.g. from view.addViews - so view is already the view item for array)
58764		newView = swapContent
58765			? view
58766			: (key !== undefined && view)
58767				|| new View(context, "array", view, data, tmpl, key, onRender, contentTmpl);
58768		newView._.nl= noLinking;
58769		if (view && view._.useKey) {
58770			// Parent is not an 'array view'
58771			newView._.bnd = !tag || tag._.bnd && tag; // For array views that are data bound for collection change events, set the
58772			// view._.bnd property to true for top-level link() or data-link="{for}", or to the tag instance for a data-bound tag, e.g. {^{for ...}}
58773			newView.tag = tag;
58774		}
58775		for (i = 0, l = data.length; i < l; i++) {
58776			// Create a view for each data item.
58777			childView = new View(newCtx, "item", newView, data[i], tmpl, (key || 0) + i, onRender, newView.content);
58778			if (itemVar) {
58779				(childView.ctx = $extend({}, newCtx))[itemVar] = $sub._cp(data[i], "#data", childView);
58780			}
58781			itemResult = tmpl.fn(data[i], childView, $sub);
58782			result += newView._.onRender ? newView._.onRender(itemResult, childView) : itemResult;
58783		}
58784	} else {
58785		// Create a view for singleton data object. The type of the view will be the tag name, e.g. "if" or "mytag" except for
58786		// "item", "array" and "data" views. A "data" view is from programmatic render(object) against a 'singleton'.
58787		newView = swapContent ? view : new View(newCtx, tmplName || "data", view, data, tmpl, key, onRender, contentTmpl);
58788
58789		if (itemVar) {
58790			(newView.ctx = $extend({}, newCtx))[itemVar] = $sub._cp(data, "#data", newView);
58791		}
58792
58793		newView.tag = tag;
58794		newView._.nl = noLinking;
58795		result += tmpl.fn(data, newView, $sub);
58796	}
58797	if (tag) {
58798		newView.tagElse = tagCtx.index;
58799		tagCtx.contentView = newView;
58800	}
58801	return outerOnRender ? outerOnRender(result, newView) : result;
58802}
58803
58804//===========================
58805// Build and compile template
58806//===========================
58807
58808// Generate a reusable function that will serve to render a template against data
58809// (Compile AST then build template function)
58810
58811function onRenderError(e, view, fallback) {
58812	var message = fallback !== undefined
58813		? $isFunction(fallback)
58814			? fallback.call(view.data, e, view)
58815			: fallback || ""
58816		: "{Error: " + (e.message||e) + "}";
58817
58818	if ($subSettings.onError && (fallback = $subSettings.onError.call(view.data, e, fallback && message, view)) !== undefined) {
58819		message = fallback; // There is a settings.debugMode(handler) onError override. Call it, and use return value (if any) to replace message
58820	}
58821	return view && !view._lc ? $converters.html(message) : message; // For data-link=\"{... onError=...}"... See onDataLinkedTagChange
58822}
58823
58824function error(message) {
58825	throw new $sub.Err(message);
58826}
58827
58828function syntaxError(message) {
58829	error("Syntax error\n" + message);
58830}
58831
58832function tmplFn(markup, tmpl, isLinkExpr, convertBack, hasElse) {
58833	// Compile markup to AST (abtract syntax tree) then build the template function code from the AST nodes
58834	// Used for compiling templates, and also by JsViews to build functions for data link expressions
58835
58836	//==== nested functions ====
58837	function pushprecedingContent(shift) {
58838		shift -= loc;
58839		if (shift) {
58840			content.push(markup.substr(loc, shift).replace(rNewLine, "\\n"));
58841		}
58842	}
58843
58844	function blockTagCheck(tagName, block) {
58845		if (tagName) {
58846			tagName += '}}';
58847			//			'{{include}} block has {{/for}} with no open {{for}}'
58848			syntaxError((
58849				block
58850					? '{{' + block + '}} block has {{/' + tagName + ' without {{' + tagName
58851					: 'Unmatched or missing {{/' + tagName) + ', in template:\n' + markup);
58852		}
58853	}
58854
58855	function parseTag(all, bind, tagName, converter, colon, html, codeTag, params, slash, bind2, closeBlock, index) {
58856/*
58857
58858     bind     tagName         cvt   cln html code    params            slash   bind2         closeBlk  comment
58859/(?:{(\^)?{(?:(\w+(?=[\/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(\/)?|{(\^)?{(?:(?:\/(\w+))\s*|!--[\s\S]*?--))}}/g
58860
58861(?:
58862  {(\^)?{            bind
58863  (?:
58864    (\w+             tagName
58865      (?=[\/\s}])
58866    )
58867    |
58868    (\w+)?(:)        converter colon
58869    |
58870    (>)              html
58871    |
58872    (\*)             codeTag
58873  )
58874  \s*
58875  (                  params
58876    (?:[^}]|}(?!}))*?
58877  )
58878  (\/)?              slash
58879  |
58880  {(\^)?{            bind2
58881  (?:
58882    (?:\/(\w+))\s*   closeBlock
58883    |
58884    !--[\s\S]*?--    comment
58885  )
58886)
58887}}/g
58888
58889*/
58890		if (codeTag && bind || slash && !tagName || params && params.slice(-1) === ":" || bind2) {
58891			syntaxError(all);
58892		}
58893
58894		// Build abstract syntax tree (AST): [tagName, converter, params, content, hash, bindings, contentMarkup]
58895		if (html) {
58896			colon = ":";
58897			converter = HTML;
58898		}
58899		slash = slash || isLinkExpr && !hasElse;
58900
58901		var late, openTagName, isLateOb,
58902			pathBindings = (bind || isLinkExpr) && [[]], // pathBindings is an array of arrays for arg bindings and a hash of arrays for prop bindings
58903			props = "",
58904			args = "",
58905			ctxProps = "",
58906			paramsArgs = "",
58907			paramsProps = "",
58908			paramsCtxProps = "",
58909			onError = "",
58910			useTrigger = "",
58911			// Block tag if not self-closing and not {{:}} or {{>}} (special case) and not a data-link expression
58912			block = !slash && !colon;
58913
58914		//==== nested helper function ====
58915		tagName = tagName || (params = params || "#data", colon); // {{:}} is equivalent to {{:#data}}
58916		pushprecedingContent(index);
58917		loc = index + all.length; // location marker - parsed up to here
58918		if (codeTag) {
58919			if (allowCode) {
58920				content.push(["*", "\n" + params.replace(/^:/, "ret+= ").replace(rUnescapeQuotes, "$1") + ";\n"]);
58921			}
58922		} else if (tagName) {
58923			if (tagName === "else") {
58924				if (rTestElseIf.test(params)) {
58925					syntaxError('For "{{else if expr}}" use "{{else expr}}"');
58926				}
58927				pathBindings = current[9] && [[]];
58928				current[10] = markup.substring(current[10], index); // contentMarkup for block tag
58929				openTagName = current[11] || current[0] || syntaxError("Mismatched: " + all);
58930				// current[0] is tagName, but for {{else}} nodes, current[11] is tagName of preceding open tag
58931				current = stack.pop();
58932				content = current[2];
58933				block = true;
58934			}
58935			if (params) {
58936				// remove newlines from the params string, to avoid compiled code errors for unterminated strings
58937				parseParams(params.replace(rNewLine, " "), pathBindings, tmpl, isLinkExpr)
58938					.replace(rBuildHash, function(all, onerror, isCtxPrm, key, keyToken, keyValue, arg, param) {
58939						if (key === "this:") {
58940							keyValue = "undefined"; // this=some.path is always a to parameter (one-way), so don't need to compile/evaluate some.path initialization
58941						}
58942						if (param) {
58943							isLateOb = isLateOb || param[0] === "@";
58944						}
58945						key = "'" + keyToken + "':";
58946						if (arg) {
58947							args += isCtxPrm + keyValue + ",";
58948							paramsArgs += "'" + param + "',";
58949						} else if (isCtxPrm) { // Contextual parameter, ~foo=expr
58950							ctxProps += key + 'j._cp(' + keyValue + ',"' + param + '",view),';
58951							// Compiled code for evaluating tagCtx on a tag will have: ctx:{'foo':j._cp(compiledExpr, "expr", view)}
58952							paramsCtxProps += key + "'" + param + "',";
58953						} else if (onerror) {
58954							onError += keyValue;
58955						} else {
58956							if (keyToken === "trigger") {
58957								useTrigger += keyValue;
58958							}
58959							if (keyToken === "lateRender") {
58960								late = param !== "false"; // Render after first pass
58961							}
58962							props += key + keyValue + ",";
58963							paramsProps += key + "'" + param + "',";
58964							hasHandlers = hasHandlers || rHasHandlers.test(keyToken);
58965						}
58966						return "";
58967					}).slice(0, -1);
58968			}
58969
58970			if (pathBindings && pathBindings[0]) {
58971				pathBindings.pop(); // Remove the binding that was prepared for next arg. (There is always an extra one ready).
58972			}
58973
58974			newNode = [
58975					tagName,
58976					converter || !!convertBack || hasHandlers || "",
58977					block && [],
58978					parsedParam(paramsArgs || (tagName === ":" ? "'#data'," : ""), paramsProps, paramsCtxProps), // {{:}} equivalent to {{:#data}}
58979					parsedParam(args || (tagName === ":" ? "data," : ""), props, ctxProps),
58980					onError,
58981					useTrigger,
58982					late,
58983					isLateOb,
58984					pathBindings || 0
58985				];
58986			content.push(newNode);
58987			if (block) {
58988				stack.push(current);
58989				current = newNode;
58990				current[10] = loc; // Store current location of open tag, to be able to add contentMarkup when we reach closing tag
58991				current[11] = openTagName; // Used for checking syntax (matching close tag)
58992			}
58993		} else if (closeBlock) {
58994			blockTagCheck(closeBlock !== current[0] && closeBlock !== current[11] && closeBlock, current[0]); // Check matching close tag name
58995			current[10] = markup.substring(current[10], index); // contentMarkup for block tag
58996			current = stack.pop();
58997		}
58998		blockTagCheck(!current && closeBlock);
58999		content = current[2];
59000	}
59001	//==== /end of nested functions ====
59002
59003	var i, result, newNode, hasHandlers, bindings,
59004		allowCode = $subSettings.allowCode || tmpl && tmpl.allowCode
59005			|| $viewsSettings.allowCode === true, // include direct setting of settings.allowCode true for backward compat only
59006		astTop = [],
59007		loc = 0,
59008		stack = [],
59009		content = astTop,
59010		current = [,,astTop];
59011
59012	if (allowCode && tmpl._is) {
59013		tmpl.allowCode = allowCode;
59014	}
59015
59016//TODO	result = tmplFnsCache[markup]; // Only cache if template is not named and markup length < ...,
59017//and there are no bindings or subtemplates?? Consider standard optimization for data-link="a.b.c"
59018//		if (result) {
59019//			tmpl.fn = result;
59020//		} else {
59021
59022//		result = markup;
59023	if (isLinkExpr) {
59024		if (convertBack !== undefined) {
59025			markup = markup.slice(0, -convertBack.length - 2) + delimCloseChar0;
vendor: 6,465 bytes, lines 59025-59195
59025
59026		}
59027		markup = delimOpenChar0 + markup + delimCloseChar1;
59028	}
59029
59030	blockTagCheck(stack[0] && stack[0][2].pop()[0]);
59031	// Build the AST (abstract syntax tree) under astTop
59032	markup.replace(rTag, parseTag);
59033
59034	pushprecedingContent(markup.length);
59035
59036	if (loc = astTop[astTop.length - 1]) {
59037		blockTagCheck("" + loc !== loc && (+loc[10] === loc[10]) && loc[0]);
59038	}
59039//			result = tmplFnsCache[markup] = buildCode(astTop, tmpl);
59040//		}
59041
59042	if (isLinkExpr) {
59043		result = buildCode(astTop, markup, isLinkExpr);
59044		bindings = [];
59045		i = astTop.length;
59046		while (i--) {
59047			bindings.unshift(astTop[i][9]); // With data-link expressions, pathBindings array for tagCtx[i] is astTop[i][9]
59048		}
59049		setPaths(result, bindings);
59050	} else {
59051		result = buildCode(astTop, tmpl);
59052	}
59053	return result;
59054}
59055
59056function setPaths(fn, pathsArr) {
59057	var key, paths,
59058		i = 0,
59059		l = pathsArr.length;
59060	fn.deps = [];
59061	fn.paths = []; // The array of path binding (array/dictionary)s for each tag/else block's args and props
59062	for (; i < l; i++) {
59063		fn.paths.push(paths = pathsArr[i]);
59064		for (key in paths) {
59065			if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length && !paths[key].skp) {
59066				fn.deps = fn.deps.concat(paths[key]); // deps is the concatenation of the paths arrays for the different bindings
59067			}
59068		}
59069	}
59070}
59071
59072function parsedParam(args, props, ctx) {
59073	return [args.slice(0, -1), props.slice(0, -1), ctx.slice(0, -1)];
59074}
59075
59076function paramStructure(paramCode, paramVals) {
59077	return '\n\tparams:{args:[' + paramCode[0] + '],\n\tprops:{' + paramCode[1] + '}'
59078		+ (paramCode[2] ? ',\n\tctx:{' + paramCode[2] + '}' : "")
59079		+ '},\n\targs:[' + paramVals[0] + '],\n\tprops:{' + paramVals[1] + '}'
59080		+ (paramVals[2] ? ',\n\tctx:{' + paramVals[2] + '}' : "");
59081}
59082
59083function parseParams(params, pathBindings, tmpl, isLinkExpr) {
59084
59085	function parseTokens(all, lftPrn0, lftPrn, bound, path, operator, err, eq, path2, late, prn,
59086												comma, lftPrn2, apos, quot, rtPrn, rtPrnDot, prn2, space, index, full) {
59087	// /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(~?[\w$.^]+)?\s*((\+\+|--)|\+|-|~(?![\w$])|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?(@)?[#~]?[\w$.^]+)([([])?)|(,\s*)|(?:(\()\s*)?\\?(?:(')|("))|(?:\s*(([)\]])(?=[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g,
59088	//lftPrn0           lftPrn         bound     path               operator     err                                          eq      path2 late            prn      comma  lftPrn2          apos quot        rtPrn  rtPrnDot                  prn2     space
59089	// (left paren? followed by (path? followed by operator) or (path followed by paren?)) or comma or apos or quot or right paren or space
59090
59091		function parsePath(allPath, not, object, helper, view, viewProperty, pathTokens, leafToken) {
59092			// /^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,
59093			//    not                               object     helper    view  viewProperty pathTokens      leafToken
59094			subPath = object === ".";
59095			if (object) {
59096				path = path.slice(not.length);
59097				if (/^\.?constructor$/.test(leafToken||path)) {
59098					syntaxError(allPath);
59099				}
59100				if (!subPath) {
59101					allPath = (late // late path @a.b.c: not throw on 'property of undefined' if a undefined, and will use _getOb() after linking to resolve late.
59102							? (isLinkExpr ? '' : '(ltOb.lt=ltOb.lt||') + '(ob='
59103							: ""
59104						)
59105						+ (helper
59106							? 'view.ctxPrm("' + helper + '")'
59107							: view
59108								? "view"
59109								: "data")
59110						+ (late
59111							? ')===undefined' + (isLinkExpr ? '' : ')') + '?"":view._getOb(ob,"'
59112							: ""
59113						)
59114						+ (leafToken
59115							? (viewProperty
59116								? "." + viewProperty
59117								: helper
59118									? ""
59119									: (view ? "" : "." + object)
59120								) + (pathTokens || "")
59121							: (leafToken = helper ? "" : view ? viewProperty || "" : object, ""));
59122					allPath = allPath + (leafToken ? "." + leafToken : "");
59123
59124					allPath = not + (allPath.slice(0, 9) === "view.data"
59125						? allPath.slice(5) // convert #view.data... to data...
59126						: allPath)
59127					+ (late
59128							? (isLinkExpr ? '"': '",ltOb') + (prn ? ',1)':')')
59129							: ""
59130						);
59131				}
59132				if (bindings) {
59133					binds = named === "_linkTo" ? (bindto = pathBindings._jsvto = pathBindings._jsvto || []) : bndCtx.bd;
59134					if (theOb = subPath && binds[binds.length-1]) {
59135						if (theOb._cpfn) { // Computed property exprOb
59136							while (theOb.sb) {
59137								theOb = theOb.sb;
59138							}
59139							if (theOb.prm) {
59140								if (theOb.bnd) {
59141									path = "^" + path.slice(1);
59142								}
59143								theOb.sb = path;
59144								theOb.bnd = theOb.bnd || path[0] === "^";
59145							}
59146						}
59147					} else {
59148						binds.push(path);
59149					}
59150					if (prn && !subPath) {
59151						pathStart[fnDp] = ind;
59152						compiledPathStart[fnDp] = compiledPath[fnDp].length;
59153					}
59154				}
59155			}
59156			return allPath;
59157		}
59158
59159		//bound = bindings && bound;
59160		if (bound && !eq) {
59161			path = bound + path; // e.g. some.fn(...)^some.path - so here path is "^some.path"
59162		}
59163		operator = operator || "";
59164		lftPrn2 = lftPrn2 || "";
59165		lftPrn = lftPrn || lftPrn0 || lftPrn2;
59166		path = path || path2;
59167
59168		if (late && (late = !/\)|]/.test(full[index-1]))) {
59169			path = path.slice(1).split(".").join("^"); // Late path @z.b.c. Use "^" rather than "." to ensure that deep binding will be used
59170		}
59171		// Could do this - but not worth perf cost?? :-
59172		// if (!path.lastIndexOf("#data.", 0)) { path = path.slice(6); } // If path starts with "#data.", remove that.
59173		prn = prn || prn2 || "";
59174		var expr, binds, theOb, newOb, subPath, lftPrnFCall, ret,
59175			ind = index;
59176
59177		if (!aposed && !quoted) {
59178			if (err) {
59179				syntaxError(params);
59180			}
59181			if (rtPrnDot && bindings) {
59182				// This is a binding to a path in which an object is returned by a helper/data function/expression, e.g. foo()^x.y or (a?b:c)^x.y
59183				// We create a compiled function to get the object instance (which will be called when the dependent data of the subexpression changes,
59184				// to return the new object, and trigger re-binding of the subsequent path)
59185				expr = pathStart[fnDp-1];
59186				if (full.length - 1 > ind - (expr || 0)) { // We need to compile a subexpression
59187					expr = $.trim(full.slice(expr, ind + all.length));
59188					binds = bindto || bndStack[fnDp-1].bd;
59189					// Insert exprOb object, to be used during binding to return the computed object
59190					theOb = binds[binds.length-1];
59191					if (theOb && theOb.prm) {
59192						while (theOb.sb && theOb.sb.prm) {
59193							theOb = theOb.sb;
59194						}
59195						newOb = theOb.sb = {path: theOb.sb, bnd: theOb.bnd};
vendor: 6,672 bytes, lines 59195-59379
59195
59196					} else {
59197						binds.push(newOb = {path: binds.pop()}); // Insert exprOb object, to be used during binding to return the computed object
59198					}
59199					if (theOb && theOb.sb === newOb) {
59200						compiledPath[fnDp] = compiledPath[fnDp-1].slice(theOb._cpPthSt) + compiledPath[fnDp];
59201						compiledPath[fnDp-1] = compiledPath[fnDp-1].slice(0, theOb._cpPthSt);
59202					}
59203					newOb._cpPthSt = compiledPathStart[fnDp-1];
59204					newOb._cpKey = expr;
59205
59206					compiledPath[fnDp] += full.slice(prevIndex, index);
59207					prevIndex = index;
59208
59209					newOb._cpfn = cpFnStore[expr] = cpFnStore[expr] || // Compiled function for computed value: get from store, or compile and store
59210						new Function("data,view,j", // Compiled function for computed value in template
59211					"//" + expr + "\nvar v;\nreturn ((v=" + compiledPath[fnDp] + (rtPrn === "]" ? ")]" : rtPrn) + ")!=null?v:null);");
59212
59213					compiledPath[fnDp-1] += (fnCall[prnDp] && $subSettingsAdvanced.cache ? "view.getCache(\"" + expr.replace(rEscapeQuotes, "\\$&") + "\"" : compiledPath[fnDp]);
59214
59215					newOb.prm = bndCtx.bd;
59216					newOb.bnd = newOb.bnd || newOb.path && newOb.path.indexOf("^") >= 0;
59217				}
59218				compiledPath[fnDp] = "";
59219			}
59220			if (prn === "[") {
59221				prn = "[j._sq(";
59222			}
59223			if (lftPrn === "[") {
59224				lftPrn = "[j._sq(";
59225			}
59226		}
59227		ret = (aposed
59228			// within single-quoted string
59229			? (aposed = !apos, (aposed ? all : lftPrn2 + '"'))
59230			: quoted
59231			// within double-quoted string
59232				? (quoted = !quot, (quoted ? all : lftPrn2 + '"'))
59233				:
59234			(
59235				(lftPrn
59236					? (
59237						prnStack[++prnDp] = true,
59238						prnInd[prnDp] = 0,
59239						bindings && (
59240							pathStart[fnDp++] = ind++,
59241							bndCtx = bndStack[fnDp] = {bd: []},
59242							compiledPath[fnDp] = "",
59243							compiledPathStart[fnDp] = 1
59244						),
59245						lftPrn) // Left paren, (not a function call paren)
59246					: "")
59247				+ (space
59248					? (prnDp
59249						? "" // A space within parens or within function call parens, so not a separator for tag args
59250			// New arg or prop - so insert backspace \b (\x08) as separator for named params, used subsequently by rBuildHash, and prepare new bindings array
59251						: (paramIndex = full.slice(paramIndex, ind), named
59252							? (named = boundName = bindto = false, "\b")
59253							: "\b,") + paramIndex + (paramIndex = ind + all.length, bindings && pathBindings.push(bndCtx.bd = []), "\b")
59254					)
59255					: eq
59256			// named param. Remove bindings for arg and create instead bindings array for prop
59257						? (fnDp && syntaxError(params), bindings && pathBindings.pop(), named = "_" + path, boundName = bound, paramIndex = ind + all.length,
59258								bindings && ((bindings = bndCtx.bd = pathBindings[named] = []), bindings.skp = !bound), path + ':')
59259						: path
59260			// path
59261							? (path.split("^").join(".").replace($sub.rPath, parsePath)
59262								+ (prn || operator)
59263							)
59264							: operator
59265			// operator
59266								? operator
59267								: rtPrn
59268			// function
59269									? rtPrn === "]" ? ")]" : ")"
59270									: comma
59271										? (fnCall[prnDp] || syntaxError(params), ",") // We don't allow top-level literal arrays or objects
59272										: lftPrn0
59273											? ""
59274											: (aposed = apos, quoted = quot, '"')
59275			))
59276		);
59277
59278		if (!aposed && !quoted) {
59279			if (rtPrn) {
59280				fnCall[prnDp] = false;
59281				prnDp--;
59282			}
59283		}
59284
59285		if (bindings) {
59286			if (!aposed && !quoted) {
59287				if (rtPrn) {
59288					if (prnStack[prnDp+1]) {
59289						bndCtx = bndStack[--fnDp];
59290						prnStack[prnDp+1] = false;
59291					}
59292					prnStart = prnInd[prnDp+1];
59293				}
59294				if (prn) {
59295					prnInd[prnDp+1] = compiledPath[fnDp].length + (lftPrn ? 1 : 0);
59296					if (path || rtPrn) {
59297						bndCtx = bndStack[++fnDp] = {bd: []};
59298						prnStack[prnDp+1] = true;
59299					}
59300				}
59301			}
59302
59303			compiledPath[fnDp] = (compiledPath[fnDp]||"") + full.slice(prevIndex, index);
59304			prevIndex = index+all.length;
59305
59306			if (!aposed && !quoted) {
59307				if (lftPrnFCall = lftPrn && prnStack[prnDp+1]) {
59308					compiledPath[fnDp-1] += lftPrn;
59309					compiledPathStart[fnDp-1]++;
59310				}
59311				if (prn === "(" && subPath && !newOb) {
59312					compiledPath[fnDp] = compiledPath[fnDp-1].slice(prnStart) + compiledPath[fnDp];
59313					compiledPath[fnDp-1] = compiledPath[fnDp-1].slice(0, prnStart);
59314				}
59315			}
59316			compiledPath[fnDp] += lftPrnFCall ? ret.slice(1) : ret;
59317		}
59318
59319		if (!aposed && !quoted && prn) {
59320			prnDp++;
59321			if (path && prn === "(") {
59322				fnCall[prnDp] = true;
59323			}
59324		}
59325
59326		if (!aposed && !quoted && prn2) {
59327			if (bindings) {
59328				compiledPath[fnDp] += prn;
59329			}
59330			ret += prn;
59331		}
59332		return ret;
59333	}
59334
59335	var named, bindto, boundName, result,
59336		quoted, // boolean for string content in double quotes
59337		aposed, // or in single quotes
59338		bindings = pathBindings && pathBindings[0], // bindings array for the first arg
59339		bndCtx = {bd: bindings},
59340		bndStack = {0: bndCtx},
59341		paramIndex = 0, // list,
59342		// The following are used for tracking path parsing including nested paths, such as "a.b(c^d + (e))^f", and chained computed paths such as
59343		// "a.b().c^d().e.f().g" - which has four chained paths, "a.b()", "^c.d()", ".e.f()" and ".g"
59344		prnDp = 0,     // For tracking paren depth (not function call parens)
59345		fnDp = 0,      // For tracking depth of function call parens
59346		prnInd = {},   // We are in a function call
59347		prnStart = 0,  // tracks the start of the current path such as c^d() in the above example
59348		prnStack = {}, // tracks parens which are not function calls, and so are associated with new bndStack contexts
59349		fnCall = {},   // We are in a function call
59350		pathStart = {},// tracks the start of the current path such as c^d() in the above example
59351		compiledPathStart = {0: 0},
59352		compiledPath = {0:""},
59353		prevIndex = 0;
59354
59355	if (params[0] === "@") {
59356		params = params.replace(rBracketQuote, ".");
59357	}
59358	result = (params + (tmpl ? " " : "")).replace($sub.rPrm, parseTokens);
59359
59360	if (bindings) {
59361		result = compiledPath[0];
59362	}
59363
59364	return !prnDp && result || syntaxError(params); // Syntax error if unbalanced parens in params expression
59365}
59366
59367function buildCode(ast, tmpl, isLinkExpr) {
59368	// Build the template function code from the AST nodes, and set as property on the passed-in template object
59369	// Used for compiling templates, and also by JsViews to build functions for data link expressions
59370	var i, node, tagName, converter, tagCtx, hasTag, hasEncoder, getsVal, hasCnvt, useCnvt, tmplBindings, pathBindings, params, boundOnErrStart,
59371		boundOnErrEnd, tagRender, nestedTmpls, tmplName, nestedTmpl, tagAndElses, content, markup, nextIsElse, oldCode, isElse, isGetVal, tagCtxFn,
59372		onError, tagStart, trigger, lateRender, retStrOpen, retStrClose,
59373		tmplBindingKey = 0,
59374		useViews = $subSettingsAdvanced.useViews || tmpl.useViews || tmpl.tags || tmpl.templates || tmpl.helpers || tmpl.converters,
59375		code = "",
59376		tmplOptions = {},
59377		l = ast.length;
59378
59379	if (
vendor: 15,697 bytes, lines 59379-59806
59379"" + tmpl === tmpl) {
59380		tmplName = isLinkExpr ? 'data-link="' + tmpl.replace(rNewLine, " ").slice(1, -1) + '"' : tmpl;
59381		tmpl = 0;
59382	} else {
59383		tmplName = tmpl.tmplName || "unnamed";
59384		if (tmpl.allowCode) {
59385			tmplOptions.allowCode = true;
59386		}
59387		if (tmpl.debug) {
59388			tmplOptions.debug = true;
59389		}
59390		tmplBindings = tmpl.bnds;
59391		nestedTmpls = tmpl.tmpls;
59392	}
59393	for (i = 0; i < l; i++) {
59394		// AST nodes: [0: tagName, 1: converter, 2: content, 3: params, 4: code, 5: onError, 6: trigger, 7:pathBindings, 8: contentMarkup]
59395		node = ast[i];
59396
59397		// Add newline for each callout to t() c() etc. and each markup string
59398		if ("" + node === node) {
59399			// a markup string to be inserted
59400			code += '+"' + node + '"';
59401		} else {
59402			// a compiled tag expression to be inserted
59403			tagName = node[0];
59404			if (tagName === "*") {
59405				// Code tag: {{* }}
59406				code += ";\n" + node[1] + "\nret=ret";
59407			} else {
59408				converter = node[1];
59409				content = !isLinkExpr && node[2];
59410				tagCtx = paramStructure(node[3], params = node[4]);
59411				trigger = node[6];
59412				lateRender = node[7];
59413				if (node[8]) { // latePath @a.b.c or @~a.b.c
59414					retStrOpen = "\nvar ob,ltOb={},ctxs=";
59415					retStrClose = ";\nctxs.lt=ltOb.lt;\nreturn ctxs;";
59416				} else {
59417					retStrOpen = "\nreturn ";
59418					retStrClose = "";
59419				}
59420				markup = node[10] && node[10].replace(rUnescapeQuotes, "$1");
59421				if (isElse = tagName === "else") {
59422					if (pathBindings) {
59423						pathBindings.push(node[9]);
59424					}
59425				} else {
59426					onError = node[5] || $subSettings.debugMode !== false && "undefined"; // If debugMode not false, set default onError handler on tag to "undefined" (see onRenderError)
59427					if (tmplBindings && (pathBindings = node[9])) { // Array of paths, or false if not data-bound
59428						pathBindings = [pathBindings];
59429						tmplBindingKey = tmplBindings.push(1); // Add placeholder in tmplBindings for compiled function
59430					}
59431				}
59432				useViews = useViews || params[1] || params[2] || pathBindings || /view.(?!index)/.test(params[0]);
59433				// useViews is for perf optimization. For render() we only use views if necessary - for the more advanced scenarios.
59434				// We use views if there are props, contextual properties or args with #... (other than #index) - but you can force
59435				// using the full view infrastructure, (and pay a perf price) by opting in: Set useViews: true on the template, manually...
59436				if (isGetVal = tagName === ":") {
59437					if (converter) {
59438						tagName = converter === HTML ? ">" : converter + tagName;
59439					}
59440				} else {
59441					if (content) { // TODO optimize - if content.length === 0 or if there is a tmpl="..." specified - set content to null / don't run this compilation code - since content won't get used!!
59442						// Create template object for nested template
59443						nestedTmpl = tmplObject(markup, tmplOptions);
59444						nestedTmpl.tmplName = tmplName + "/" + tagName;
59445						// Compile to AST and then to compiled function
59446						nestedTmpl.useViews = nestedTmpl.useViews || useViews;
59447						buildCode(content, nestedTmpl);
59448						useViews = nestedTmpl.useViews;
59449						nestedTmpls.push(nestedTmpl);
59450					}
59451
59452					if (!isElse) {
59453						// This is not an else tag.
59454						tagAndElses = tagName;
59455						useViews = useViews || tagName && (!$tags[tagName] || !$tags[tagName].flow);
59456						// Switch to a new code string for this bound tag (and its elses, if it has any) - for returning the tagCtxs array
59457						oldCode = code;
59458						code = "";
59459					}
59460					nextIsElse = ast[i + 1];
59461					nextIsElse = nextIsElse && nextIsElse[0] === "else";
59462				}
59463				tagStart = onError ? ";\ntry{\nret+=" : "\n+";
59464				boundOnErrStart = "";
59465				boundOnErrEnd = "";
59466
59467				if (isGetVal && (pathBindings || trigger || converter && converter !== HTML || lateRender)) {
59468					// For convertVal we need a compiled function to return the new tagCtx(s)
59469					tagCtxFn = new Function("data,view,j", "// " + tmplName + " " + (++tmplBindingKey) + " " + tagName
59470						+ retStrOpen + "{" + tagCtx + "};" + retStrClose);
59471					tagCtxFn._er = onError;
59472					tagCtxFn._tag = tagName;
59473					tagCtxFn._bd = !!pathBindings; // data-linked tag {^{.../}}
59474					tagCtxFn._lr = lateRender;
59475
59476					if (isLinkExpr) {
59477						return tagCtxFn;
59478					}
59479
59480					setPaths(tagCtxFn, pathBindings);
59481					tagRender = 'c("' + converter + '",view,';
59482					useCnvt = true;
59483					boundOnErrStart = tagRender + tmplBindingKey + ",";
59484					boundOnErrEnd = ")";
59485				}
59486				code += (isGetVal
59487					? (isLinkExpr ? (onError ? "try{\n" : "") + "return " : tagStart) + (useCnvt // Call _cnvt if there is a converter: {{cnvt: ... }} or {^{cnvt: ... }}
59488						? (useCnvt = undefined, useViews = hasCnvt = true, tagRender + (tagCtxFn
59489							? ((tmplBindings[tmplBindingKey - 1] = tagCtxFn), tmplBindingKey) // Store the compiled tagCtxFn in tmpl.bnds, and pass the key to convertVal()
59490							: "{" + tagCtx + "}") + ")")
59491						: tagName === ">"
59492							? (hasEncoder = true, "h(" + params[0] + ")")
59493							: (getsVal = true, "((v=" + params[0] + ')!=null?v:' + (isLinkExpr ? 'null)' : '"")'))
59494							// Non strict equality so data-link="title{:expr}" with expr=null/undefined removes title attribute
59495					)
59496					: (hasTag = true, "\n{view:view,content:false,tmpl:" // Add this tagCtx to the compiled code for the tagCtxs to be passed to renderTag()
59497						+ (content ? nestedTmpls.length : "false") + "," // For block tags, pass in the key (nestedTmpls.length) to the nested content template
59498						+ tagCtx + "},"));
59499
59500				if (tagAndElses && !nextIsElse) {
59501					// This is a data-link expression or an inline tag without any elses, or the last {{else}} of an inline tag
59502					// We complete the code for returning the tagCtxs array
59503					code = "[" + code.slice(0, -1) + "]";
59504					tagRender = 't("' + tagAndElses + '",view,this,';
59505					if (isLinkExpr || pathBindings) {
59506						// This is a bound tag (data-link expression or inline bound tag {^{tag ...}}) so we store a compiled tagCtxs function in tmp.bnds
59507						code = new Function("data,view,j", " // " + tmplName + " " + tmplBindingKey + " " + tagAndElses + retStrOpen + code
59508							+ retStrClose);
59509						code._er = onError;
59510						code._tag = tagAndElses;
59511						if (pathBindings) {
59512							setPaths(tmplBindings[tmplBindingKey - 1] = code, pathBindings);
59513						}
59514						code._lr = lateRender;
59515						if (isLinkExpr) {
59516							return code; // For a data-link expression we return the compiled tagCtxs function
59517						}
59518						boundOnErrStart = tagRender + tmplBindingKey + ",undefined,";
59519						boundOnErrEnd = ")";
59520					}
59521
59522					// This is the last {{else}} for an inline tag.
59523					// For a bound tag, pass the tagCtxs fn lookup key to renderTag.
59524					// For an unbound tag, include the code directly for evaluating tagCtxs array
59525					code = oldCode + tagStart + tagRender + (pathBindings && tmplBindingKey || code) + ")";
59526					pathBindings = 0;
59527					tagAndElses = 0;
59528				}
59529				if (onError && !nextIsElse) {
59530					useViews = true;
59531					code += ';\n}catch(e){ret' + (isLinkExpr ? "urn " : "+=") + boundOnErrStart + 'j._err(e,view,' + onError + ')' + boundOnErrEnd + ';}' + (isLinkExpr ? "" : '\nret=ret');
59532				}
59533			}
59534		}
59535	}
59536	// Include only the var references that are needed in the code
59537	code = "// " + tmplName
59538		+ (tmplOptions.debug ? "\ndebugger;" : "")
59539		+ "\nvar v"
59540		+ (hasTag ? ",t=j._tag" : "")                // has tag
59541		+ (hasCnvt ? ",c=j._cnvt" : "")              // converter
59542		+ (hasEncoder ? ",h=j._html" : "")           // html converter
59543		+ (isLinkExpr
59544				? (node[8] // late @... path?
59545						? ", ob"
59546						: ""
59547					) + ";\n"
59548				: ',ret=""')
59549		+ code
59550		+ (isLinkExpr ? "\n" : ";\nreturn ret;");
59551
59552	try {
59553		code = new Function("data,view,j", code);
59554	} catch (e) {
59555		syntaxError("Compiled template code:\n\n" + code + '\n: "' + (e.message||e) + '"');
59556	}
59557	if (tmpl) {
59558		tmpl.fn = code;
59559		tmpl.useViews = !!useViews;
59560	}
59561	return code;
59562}
59563
59564//==========
59565// Utilities
59566//==========
59567
59568// Merge objects, in particular contexts which inherit from parent contexts
59569function extendCtx(context, parentContext) {
59570	// Return copy of parentContext, unless context is defined and is different, in which case return a new merged context
59571	// If neither context nor parentContext are defined, return undefined
59572	return context && context !== parentContext
59573		? (parentContext
59574			? $extend($extend({}, parentContext), context)
59575			: context)
59576		: parentContext && $extend({}, parentContext);
59577}
59578
59579function getTargetProps(source, tagCtx) {
59580	// this pointer is theMap - which has tagCtx.props too
59581	// arguments: tagCtx.args.
59582	var key, prop,
59583		map = tagCtx.map,
59584		propsArr = map && map.propsArr;
59585
59586	if (!propsArr) { // map.propsArr is the full array of {key:..., prop:...} objects
59587		propsArr = [];
59588		if (typeof source === OBJECT || $isFunction(source)) {
59589			for (key in source) {
59590				prop = source[key];
59591				if (key !== $expando && source.hasOwnProperty(key) && (!tagCtx.props.noFunctions || !$.isFunction(prop))) {
59592					propsArr.push({key: key, prop: prop});
59593				}
59594			}
59595		}
59596		if (map) {
59597			map.propsArr = map.options && propsArr; // If bound {^{props}} and not isRenderCall, store propsArr on map (map.options is defined only for bound, && !isRenderCall)
59598		}
59599	}
59600	return getTargetSorted(propsArr, tagCtx); // Obtains map.tgt, by filtering, sorting and splicing the full propsArr
59601}
59602
59603function getTargetSorted(value, tagCtx) {
59604	// getTgt
59605	var mapped, start, end,
59606		tag = tagCtx.tag,
59607		props = tagCtx.props,
59608		propParams = tagCtx.params.props,
59609		filter = props.filter,
59610		sort = props.sort,
59611		directSort = sort === true,
59612		step = parseInt(props.step),
59613		reverse = props.reverse ? -1 : 1;
59614
59615	if (!$isArray(value)) {
59616		return value;
59617	}
59618	if (directSort || sort && "" + sort === sort) {
59619		// Temporary mapped array holds objects with index and sort-value
59620		mapped = value.map(function(item, i) {
59621			item = directSort ? item : getPathObject(item, sort);
59622			return {i: i, v: "" + item === item ? item.toLowerCase() : item};
59623		});
59624		// Sort mapped array
59625		mapped.sort(function(a, b) {
59626			return a.v > b.v ? reverse : a.v < b.v ? -reverse : 0;
59627		});
59628		// Map to new array with resulting order
59629		value = mapped.map(function(item){
59630			return value[item.i];
59631		});
59632	} else if ((sort || reverse < 0) && !tag.dataMap) {
59633		value = value.slice(); // Clone array first if not already a new array
59634	}
59635	if ($isFunction(sort)) {
59636		value = value.sort(function() { // Wrap the sort function to provide tagCtx as 'this' pointer
59637			return sort.apply(tagCtx, arguments);
59638		});
59639	}
59640	if (reverse < 0 && (!sort || $isFunction(sort))) { // Reverse result if not already reversed in sort
59641		value = value.reverse();
59642	}
59643
59644	if (value.filter && filter) { // IE8 does not support filter
59645		value = value.filter(filter, tagCtx);
59646		if (tagCtx.tag.onFilter) {
59647			tagCtx.tag.onFilter(tagCtx);
59648		}
59649	}
59650
59651	if (propParams.sorted) {
59652		mapped = (sort || reverse < 0) ? value : value.slice();
59653		if (tag.sorted) {
59654			$.observable(tag.sorted).refresh(mapped); // Note that this might cause the start and end props to be modified - e.g. by pager tag control
59655		} else {
59656			tagCtx.map.sorted = mapped;
59657		}
59658	}
59659
59660	start = props.start; // Get current value - after possible changes triggered by tag.sorted refresh() above
59661	end = props.end;
59662	if (propParams.start && start === undefined || propParams.end && end === undefined) {
59663		start = end = 0;
59664	}
59665	if (!isNaN(start) || !isNaN(end)) { // start or end specified, but not the auto-create Number array scenario of {{for start=xxx end=yyy}}
59666		start = +start || 0;
59667		end = end === undefined || end > value.length ? value.length : +end;
59668		value = value.slice(start, end);
59669	}
59670	if (step > 1) {
59671		start = 0;
59672		end = value.length;
59673		mapped = [];
59674		for (; start<end; start+=step) {
59675			mapped.push(value[start]);
59676		}
59677		value = mapped;
59678	}
59679	if (propParams.paged && tag.paged) {
59680		$observable(tag.paged).refresh(value);
59681	}
59682
59683	return value;
59684}
59685
59686/** Render the template as a string, using the specified data and helpers/context
59687* $("#tmpl").render()
59688*
59689* @param {any}        data
59690* @param {hash}       [helpersOrContext]
59691* @param {boolean}    [noIteration]
59692* @returns {string}   rendered template
59693*/
59694function $fnRender(data, context, noIteration) {
59695	var tmplElem = this.jquery && (this[0] || error('Unknown template')), // Targeted element not found for jQuery template selector such as "#myTmpl"
59696		tmpl = tmplElem.getAttribute(tmplAttr);
59697
59698	return renderContent.call(tmpl && $.data(tmplElem)[jsvTmpl] || $templates(tmplElem),
59699		data, context, noIteration);
59700}
59701
59702//========================== Register converters ==========================
59703
59704function getCharEntity(ch) {
59705	// Get character entity for HTML, Attribute and optional data encoding
59706	return charEntities[ch] || (charEntities[ch] = "&#" + ch.charCodeAt(0) + ";");
59707}
59708
59709function getCharFromEntity(match, token) {
59710	// Get character from HTML entity, for optional data unencoding
59711	return charsFromEntities[token] || "";
59712}
59713
59714function htmlEncode(text) {
59715	// HTML encode: Replace < > & ' " ` etc. by corresponding entities.
59716	return text != undefined ? rIsHtml.test(text) && ("" + text).replace(rHtmlEncode, getCharEntity) || text : "";
59717}
59718
59719function dataEncode(text) {
59720	// Encode just < > and & - intended for 'safe data' along with {{:}} rather than {{>}}
59721  return "" + text === text ? text.replace(rDataEncode, getCharEntity) : text;
59722}
59723
59724function dataUnencode(text) {
59725  // Unencode just < > and & - intended for 'safe data' along with {{:}} rather than {{>}}
59726  return "" + text === text ? text.replace(rDataUnencode, getCharFromEntity) : text;
59727}
59728
59729//========================== Initialize ==========================
59730
59731$sub = $views.sub;
59732$viewsSettings = $views.settings;
59733
59734if (!(jsr || $ && $.render)) {
59735	// JsRender/JsViews not already loaded (or loaded without jQuery, and we are now moving from jsrender namespace to jQuery namepace)
59736	for (jsvStoreName in jsvStores) {
59737		registerStore(jsvStoreName, jsvStores[jsvStoreName]);
59738	}
59739
59740	$converters = $views.converters;
59741	$helpers = $views.helpers;
59742	$tags = $views.tags;
59743
59744	$sub._tg.prototype = {
59745		baseApply: baseApply,
59746		cvtArgs: convertArgs,
59747		bndArgs: convertBoundArgs,
59748		ctxPrm: contextParameter
59749	};
59750
59751	topView = $sub.topView = new View();
59752
59753	//BROWSER-SPECIFIC CODE
59754	if ($) {
59755
59756		////////////////////////////////////////////////////////////////////////////////////////////////
59757		// jQuery (= $) is loaded
59758
59759		$.fn.render = $fnRender;
59760		$expando = $.expando;
59761		if ($.observable) {
59762			if (versionNumber !== (versionNumber = $.views.jsviews)) {
59763				// Different version of jsRender was loaded
59764				throw "jquery.observable.js requires jsrender.js " + versionNumber;
59765			}
59766			$extend($sub, $.views.sub); // jquery.observable.js was loaded before jsrender.js
59767			$views.map = $.views.map;
59768		}
59769
59770	} else {
59771		////////////////////////////////////////////////////////////////////////////////////////////////
59772		// jQuery is not loaded.
59773
59774		$ = {};
59775
59776		if (setGlobals) {
59777			global.jsrender = $; // We are loading jsrender.js from a script element, not AMD or CommonJS, so set global
59778		}
59779
59780		// Error warning if jsrender.js is used as template engine on Node.js (e.g. Express or Hapi...)
59781		// Use jsrender-node.js instead...
59782		$.renderFile = $.__express = $.compile = function() { throw "Node.js: use npm jsrender, or jsrender-node.js"; };
59783
59784		//END BROWSER-SPECIFIC CODE
59785		$.isFunction = function(ob) {
59786			return typeof ob === "function";
59787		};
59788
59789		$.isArray = Array.isArray || function(obj) {
59790			return ({}.toString).call(obj) === "[object Array]";
59791		};
59792
59793		$sub._jq = function(jq) { // private method to move from JsRender APIs from jsrender namespace to jQuery namespace
59794			if (jq !== $) {
59795				$extend(jq, $); // map over from jsrender namespace to jQuery namespace
59796				$ = jq;
59797				$.fn.render = $fnRender;
59798				delete $.jsrender;
59799				$expando = $.expando;
59800			}
59801		};
59802
59803		$.jsrender = versionNumber;
59804	}
59805	$subSettings = $sub.settings;
59806	$subSettings.allowCode = false;
59807	$isFunction = $.isFunction;
59808	$.render = $render;
59809	$.views = $views;
59810	$.templates = $templates = $views.templates;
59811
59812	for (setting in $subSettings) {
59813		addSetting(setting);
59814	}
59815
59816	/**
59817	* $.views.settings.debugMode(true)
59818	* @param {boolean} debugMode
59819	* @returns {Settings}
59820	*
59821	* debugMode = $.views.settings.debugMode()
59822	* @returns {boolean}
59823	*/
59824	($viewsSettings.debugMode = function(debugMode) {
59825		return debugMode === undefined
59826			? $subSettings.debugMode
59827			: (
59828				$subSettings._clFns && $subSettings._clFns(), // Clear linkExprStore (cached compiled expressions), since debugMode setting affects compilation for expressions
59829				$subSettings.debugMode = debugMode,
59830				$subSettings.onError = debugMode + "" === debugMode
59831					? function() { return debugMode; }
59832					: $isFunction(debugMode)
59833						? debugMode
59834						: undefined,
59835				$viewsSettings);
59836	})(false); // jshint ignore:line
59837
59838	$subSettingsAdvanced = $subSettings.advanced = {
59839		cache: true, // By default use cached values of computed values (Otherwise, set advanced cache setting to false)
59840		useViews: false,
59841		_jsv: false // For global access to JsViews store
59842	};
59843
59844	//========================== Register tags ==========================
59845
59846	$tags({
59847		"if": {
59848			render: function(val) {
59849				// This function is called once for {{if}} and once for each {{else}}.
59850				// We will use the tag.rendering object for carrying rendering state across the calls.
59851				// If not done (a previous block has not been rendered), look at expression for this block and render the block if expression is truthy
59852				// Otherwise return ""
59853				var self = this,
59854					tagCtx = self.tagCtx,
59855					ret = (self.rendering.done || !val && (tagCtx.args.length || !tagCtx.index))
59856						? ""
59857						: (self.rendering.done = true,
59858							self.selected = tagCtx.index,
59859							undefined); // Test is satisfied, so render content on current context
59860				return ret;
59861			},
59862			contentCtx: true, // Inherit parent view data context
59863			flow: true
59864		},
59865		"for": {
59866			sortDataMap: dataMap(getTargetSorted),
59867			init: function(val, cloned) {
59868				this.setDataMap(this.tagCtxs);
59869			},
59870			render: function(val) {
59871				// This function is called once for {{for}} and once for each {{else}}.
59872				// We will use the tag.rendering object for carrying rendering state across the calls.
59873				var value, filter, srtField, isArray, i, sorted, end, step,
59874					self = this,
59875					tagCtx = self.tagCtx,
59876					range = tagCtx.argDefault === false,
59877					props = tagCtx.props,
59878					iterate = range || tagCtx.args.length, // Not final else and not auto-create range
59879					result = "",
59880					done = 0;
59881
59882				if (!self.rendering.done) {
59883					value = iterate ? val : tagCtx.view.data; // For the final else, defaults to current data without iteration.
59884
59885					if (range) {
59886						range = props.reverse ? "unshift" : "push";
59887						end = +props.end;
59888						step = +props.step || 1;
59889						value = []; // auto-create integer array scenario of {{for start=xxx end=yyy}}
59890						for (i = +props.start || 0; (end - i) * step > 0; i += step) {
59891							value[range](i);
59892						}
59893					}
59894					if (value !== undefined) {
59895						isArray = $isArray(value);
59896						result += tagCtx.render(value, !iterate || props.noIteration);
59897						// Iterates if data is an array, except on final else - or if noIteration property
59898						// set to true. (Use {{include}} to compose templates without array iteration)
59899						done += isArray ? value.length : 1;
59900					}
59901					if (self.rendering.done = done) {
59902						self.selected = tagCtx.index;
59903					}
59904					// If nothing was rendered we will look at the next {{else}}. Otherwise, we are done.
59905				}
59906				return result;
59907			},
59908			setDataMap: function(tagCtxs) {
59909				var tagCtx, props, paramsProps,
59910					self = this,
59911					l = tagCtxs.length;
59912				while (l--) {
59913					tagCtx = tagCtxs[l];
59914					props = tagCtx.props;
59915					paramsProps = tagCtx.params.props;
59916					tagCtx.argDefault = props.end === undefined || tagCtx.args.length > 0; // Default to #data except for auto-create range scenario {{for start=xxx end=yyy step=zzz}}
59917					props.dataMap = (tagCtx.argDefault !== false && $isArray(tagCtx.args[0]) &&
59918						(paramsProps.sort || paramsProps.start || paramsProps.end || paramsProps.step || paramsProps.filter || paramsProps.reverse
59919						|| props.sort || props.start || props.end || props.step || props.filter || props.reverse))
59920						&& self.sortDataMap;
59921				}
59922			},
59923			flow: true
59924		},
59925		props: {
59926			baseTag: "for",
59927			dataMap: dataMap(getTargetProps),
59928			init: noop, // Don't execute the base init() of the "for" tag
59929			flow: true
59930		},
59931		include: {
59932			flow: true
59933		},
59934		"*": {
59935			// {{* code... }} - Ignored if template.allowCode and $.views.settings.allowCode are false. Otherwise include code in compiled template
59936			render: retVal,
59937			flow: true
59938		},
59939		":*": {
59940			// {{:* returnedExpression }} - Ignored if template.allowCode and $.views.settings.allowCode are false. Otherwise include code in compiled template
59941			render: retVal,
59942			flow: true
59943		},
59944		dbg: $helpers.dbg = $converters.dbg = dbgBreak // Register {{dbg/}}, {{dbg:...}} and ~dbg() to throw and catch, as breakpoints for debugging.
59945	});
59946
59947	$converters({
59948		html: htmlEncode,
59949		attr: htmlEncode, // Includes > encoding since rConvertMarkers in JsViews does not skip > characters in attribute strings
59950		encode: dataEncode,
59951		unencode: dataUnencode, // Includes > encoding since rConvertMarkers in JsViews does not skip > characters in attribute strings
59952		url: function(text) {
59953			// URL encoding helper.
59954			return text != undefined ? encodeURI("" + text) : text === null ? text : ""; // null returns null, e.g. to remove attribute. undefined returns ""
59955		}
59956	});
59957}
59958//========================== Define default delimiters ==========================
59959$subSettings = $sub.settings;
59960$isArray = ($||jsr).isArray;
59961$viewsSettings.delimiters("{{", "}}", "^");
59962
59963if (jsrToJq) { // Moving from jsrender namespace to jQuery namepace - copy over the stored items (templates, converters, helpers...)
59964	jsr.views.sub._jq($);
59965}
59966return $ || jsr;
59967}, window));
59968
59969/*
59970 * JavaScript Load Image 1.1.4
59971 * https://github.com/blueimp/JavaScript-Load-Image
59972 *
59973 * Copyright 2011, Sebastian Tschan
59974 * https://blueimp.net
59975 *
59976 * Licensed under the MIT license:
59977 * http://www.opensource.org/licenses/MIT
59978 */
59979
59980/*jslint nomen: true */
59981/*global window, document, URL, webkitURL, Blob, File, FileReader, define */
59982
59983(function ($) {
59984    'use strict';
59985
59986    // Loads an image for a given File object.
59987    // Invokes the callback with an img or optional canvas
59988    // element (if supported by the browser) as parameter:
59989    var loadImage = function (file, callback, options) {
59990            var img = document.createElement('img'),
59991                url,
59992                oUrl;
59993            img.onerror = callback;
59994            img.onload = function () {
59995                if (oUrl) {
59996                    loadImage.revokeObjectURL(oUrl);
59997                }
59998                callback(loadImage.scale(img, options));
59999            };
60000            if ((window.Blob && file instanceof Blob) ||
60001                // Files are also Blob instances, but some browsers
60002                // (Firefox 3.6) support the File API but not Blobs:
60003                    (window.File && file instanceof File)) {
60004                url = oUrl = loadImage.createObjectURL(file);
60005            } else {
60006                url = file;
60007            }
60008            if (url) {
60009                img.src = url;
60010                return img;
60011            } else {
60012                return loadImage.readFile(file, function (url) {
60013                    img.src = url;
60014                });
60015            }
60016        },
60017        urlAPI = (window.createObjectURL && window) ||
60018            (window.URL && URL) || (window.webkitURL && webkitURL);
60019
60020    // Scales the given image (img HTML element)
60021    // using the given options.
60022    // Returns a canvas object if the canvas option is true
60023    // and the browser supports canvas, else the scaled image:
60024    loadImage.scale = function (img, options) {
60025        options = options || {};
60026        var canvas = document.createElement('canvas'),
60027            scale = Math.max(
60028                (options.minWidth || img.width) / img.width,
60029                (options.minHeight || img.height) / img.height
60030            );
60031        if (scale > 1) {
60032            img.width = parseInt(img.width * scale, 10);
60033            img.height = parseInt(img.height * scale, 10);
60034        }
60035        scale = Math.min(
60036            (options.maxWidth || img.width) / img.width,
60037            (options.maxHeight || img.height) / img.height
60038        );
60039        if (scale < 1) {
60040            img.width = parseInt(img.width * scale, 10);
60041            img.height = parseInt(img.height * scale, 10);
60042        }
60043        if (!options.canvas || !canvas.getContext) {
60044            return img;
60045        }
60046        canvas.width = img.width;
60047        canvas.height = img.height;
60048        canvas.getContext('2d')
60049            .drawImage(img, 0, 0, img.width, img.height);
60050        return canvas;
60051    };
60052
60053    loadImage.createObjectURL = function (file) {
60054        return urlAPI ? urlAPI.createObjectURL(file) : false;
60055    };
60056
60057    loadImage.revokeObjectURL = function (url) {
60058        return urlAPI ? urlAPI.revokeObjectURL(url) : false;
60059    };
60060
60061    // Loads a given File object via FileReader interface,
60062    // invokes the callback with a data url:
60063    loadImage.readFile = function (file, callback) {
60064        if (window.FileReader && FileReader.prototype.readAsDataURL) {
60065            var fileReader = new FileReader();
60066            fileReader.onload = function (e) {
60067                callback(e.target.result);
60068            };
60069            fileReader.readAsDataURL(file);
60070            return fileReader;
60071        }
60072        return false;
60073    };
60074
60075    if (typeof define !== 'undefined' && define.amd) {
60076        define(function () {
60077            return loadImage;
60078        });
60079    } else {
60080        $.loadImage = loadImage;
60081    }
60082}(this));
60083
60084/*
60085custom changes:
600861) updated getFieldName function to lowercase field names using lowerCaseNodeName function (309-322)
600872) added code for remove duplicate element in nameValues array (92-98)
600883) added "ignoreOnSubmit" class check to getSubFormValues function (269)
600894) added $jsType handling, 
60090used newObj() function to create empty objects, 
60091used get/set methods to access object (created using newObj func) properties (100 - 231)
600925) replaced get node value to jQuery "val" function (348)
600936) return empty array for unchecked checkbox (returned null initially) (292)
600947) allow to submit values disabledFromJsApi (326)
60095*/
60096
60097/**
60098* Copyright (c) 2010 Maxim Vasiliev
60099*
60100* Permission is hereby granted, free of charge, to any person obtaining a copy
60101* of this software and associated documentation files (the "Software"), to deal
60102* in the Software without restriction, including without limitation the rights
60103* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
60104* copies of the Software, and to permit persons to whom the Software is
60105* furnished to do so, subject to the following conditions:
60106*
60107* The above copyright notice and this permission notice shall be included in
60108* all copies or substantial portions of the Software.
60109*
60110* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
60111* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60112* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
60113* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
60114* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
60115* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
60116* THE SOFTWARE.
60117*
60118* @author Maxim Vasiliev
60119* Date: 09.09.2010
60120* Time: 19:02:33
60121*/
60122
60123var form2js = (function ()
60124{
60125    "use strict";
60126
60127    /**
60128    * Returns form values represented as Javascript object
60129    * "name" attribute defines structure of resulting object
60130    *
60131    * @param rootNode {Element|String} root form element (or it's id) or array of root elements
60132    * @param delimiter {String} structure parts delimiter defaults to '.'
60133    * @param skipEmpty {Boolean} should skip empty text values, defaults to true
60134    * @param emptyToNull {Boolean} should empty values be converted to null?
60135    * @param nodeCallback {Function} custom function to get node value
60136    * @param useIdIfEmptyName {Boolean} if true value of id attribute of field will be used if name of field is empty
60137    */
60138    function form2js(rootNode, delimiter, skipEmpty, emptyToNull, nodeCallback, useIdIfEmptyName)
60139    {
60140        if (typeof skipEmpty == 'undefined' || skipEmpty == null) skipEmpty = true;
60141        if (typeof emptyToNull == 'undefined' || emptyToNull == null) emptyToNull = true;
60142        if (typeof delimiter == 'undefined' || delimiter == null) delimiter = '.';
60143        if (arguments.length < 6) useIdIfEmptyName = false;
60144
60145        rootNode = typeof rootNode == 'string' ? document.getElementById(rootNode) : rootNode;
60146
60147        var formValues = [],
60148			currNode,
60149			i = 0;
60150
60151        /* If rootNode is array - combine values */
60152        if (rootNode.constructor == Array || (typeof NodeList != 'undefined' && rootNode.constructor == NodeList))
60153        {
60154            while (currNode = rootNode[i++])
60155            {
60156                formValues = formValues.concat(getFormValues(currNode, nodeCallback, useIdIfEmptyName));
60157            }
60158        }
60159        else
60160        {
60161            formValues = getFormValues(rootNode, nodeCallback, useIdIfEmptyName);
60162        }
60163
60164        return processNameValues(formValues, skipEmpty, emptyToNull, delimiter);
60165    }
60166
60167    /**
60168    * Processes collection of { name: 'name', value: 'value' } objects.
60169    * @param nameValues
60170    * @param skipEmpty if true skips elements with value == '' or value == null
60171    * @param delimiter
60172    */
60173    function processNameValues(nameValues, skipEmpty, emptyToNull, delimiter)
60174    {
60175        var duplicateFilter = {};
60176        _.each(nameValues, function (el)
60177        {
60178            if (!duplicateFilter.hasOwnProperty(el.name))
60179                duplicateFilter[el.name] = el;
60180        });
60181        nameValues = _.values(duplicateFilter);
60182
60183        var result = newObj(),
60184			arrays = newObj(),
60185			i, j, k, l,
60186			value,
60187			nameParts,
60188			currResult,
60189			arrNameFull,
60190			arrName,
60191			arrIdx,
60192			namePart,
60193			name,
60194			_nameParts;
60195
60196        for (i = 0; i < nameValues.length; i++)
60197        {
60198            value = nameValues[i].value;
60199
60200            if (emptyToNull && (value === '')) { value = null; }
60201            if (skipEmpty && (value === '' || value === null)) continue;
60202
60203            name = nameValues[i].name;
60204            if (typeof name === 'undefined') continue;
60205
60206            _nameParts = name.split(delimiter);
60207            nameParts = [];
60208            currResult = result;
60209            arrNameFull = '';
60210
60211            for (j = 0; j < _nameParts.length; j++)
60212            {
60213                namePart = _nameParts[j].split('][');
60214                if (namePart.length > 1)
60215                {
60216                    for (k = 0; k < namePart.length; k++)
60217                    {
60218                        if (k == 0)
60219                        {
60220                            namePart[k] = namePart[k] + ']';
60221                        }
60222                        else if (k == namePart.length - 1)
60223                        {
60224                            namePart[k] = '[' + namePart[k];
60225                        }
60226                        else
60227                        {
60228                            namePart[k] = '[' + namePart[k] + ']';
60229                        }
60230
60231                        arrIdx = namePart[k].match(/([a-z_]+)?\[([a-z_][a-z0-9_]+?)\]/i);
60232                        if (arrIdx)
60233                        {
60234                            for (l = 1; l < arrIdx.length; l++)
60235                            {
60236                                if (arrIdx[l]) nameParts.push(arrIdx[l]);
60237                            }
60238                        }
60239                        else
60240                        {
60241                            nameParts.push(namePart[k]);
60242                        }
60243                    }
60244                }
60245                else
60246                    nameParts = nameParts.concat(namePart);
60247            }
60248
60249            for (j = 0; j < nameParts.length; j++)
60250            {
60251                namePart = nameParts[j];
60252
60253                if (namePart.indexOf('[]') > -1 && j == nameParts.length - 1)
60254                {
60255                    arrName = namePart.substr(0, namePart.indexOf('['));
60256                    arrNameFull += arrName;
60257
60258                    if (!currResult.get(arrName))
60259                        currResult.set(arrName, []);
60260
60261                    currResult.get(arrName).push(value);
60262                }
60263                else if (namePart.indexOf('[') > -1)
60264                {
60265                    arrName = namePart.substr(0, namePart.indexOf('['));
60266                    arrIdx = namePart.replace(/(^([a-z_]+)?\[)|(\]$)/gi, '');
60267
60268                    /* Unique array name */
60269                    arrNameFull += '_' + arrName + '_' + arrIdx;
60270
60271                    /*
60272                    * Because arrIdx in field name can be not zero-based and step can be
60273                    * other than 1, we can't use them in target array directly.
60274                    * Instead we're making a hash where key is arrIdx and value is a reference to
60275                    * added array element
60276                    */
60277
60278                    if (!arrays[arrNameFull]) arrays[arrNameFull] = {};
60279                    if (arrName != '' && !currResult.get(arrName)) currResult.set(arrName, []);
60280
60281                    if (j == nameParts.length - 1)
60282                    {
60283                        if (arrName == '')
60284                        {
60285                            currResult.push(value);
60286                            arrays[arrNameFull][arrIdx] = currResult[currResult.length - 1];
60287                        }
60288                        else
60289                        {
60290                            currResult.get(arrName).push(value);
60291                            arrays[arrNameFull][arrIdx] = currResult.get(arrName)[currResult.get(arrName).length - 1];
60292                        }
60293                    }
60294                    else
60295                    {
60296                        if (!arrays[arrNameFull][arrIdx])
60297                        {
60298                            if ((/^[a-z_]+\[?/i).test(nameParts[j + 1])
60298) currResult.get(arrName).push(newObj());
60299                            else currResult.get(arrName).push([]);
60300
60301                            arrays[arrNameFull][arrIdx] = currResult.get(arrName)[currResult.get(arrName).length - 1];
60302                        }
60303                    }
60304
60305                    currResult = arrays[arrNameFull][arrIdx];
60306                }
60307                else
60308                {
60309                    arrNameFull += namePart;
60310
60311                    if (j < nameParts.length - 1) /* Not the last part of name - means object */
60312                    {
60313                        if (!currResult.get(namePart))
60314                            currResult.set(namePart, newObj());
60315
60316                        currResult = currResult.get(namePart);
60317                    }
60318                    else
60319                    {
60320                        if (namePart === "$jsType" && value)
60321                        {
60322                            var obj = new (getFunctionByName(value))();
60323                            for (var key in currResult)
60324                            {
60325                                obj.set(key, currResult.get(key));
60326                            }
60327                            currResult = _.extend(currResult, obj);
60328                        }
60329                        else
60330                            currResult.set(namePart, value);
60331                    }
60332                }
60333            }
60334        }
60335
60336        return result;
60337    }
60338
60339    function getFormValues(rootNode, nodeCallback, useIdIfEmptyName)
60340    {
60341        var result = extractNodeValues(rootNode, nodeCallback, useIdIfEmptyName);
60342        return result.length > 0 ? result : getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName);
60343    }
60344
60345    function getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName)
60346    {
60347        var result = [],
60348			currentNode = rootNode.firstChild;
60349
60350        while (currentNode)
60351        {
60352            if (!$(currentNode).hasClass("ignoreOnSubmit"))
60353                result = result.concat(extractNodeValues(currentNode, nodeCallback, useIdIfEmptyName));
60354
60355            currentNode = currentNode.nextSibling;
60356        }
60357
60358        return result;
60359    }
60360
60361    function extractNodeValues(node, nodeCallback, useIdIfEmptyName)
60362    {
60363        var callbackResult, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName);
60364
60365        callbackResult = nodeCallback && nodeCallback(node);
60366
60367        if (callbackResult && callbackResult.name)
60368        {
60369            result = [callbackResult];
60370        }
60371        else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i))
60372        {
60373            fieldValue = getFieldValue(node);
60374            if (fieldValue == null && (node.type == 'radio' || node.type == 'checkbox'))
60375                result = [];
60376            else
60377                result = [{ name: fieldName, value: fieldValue}];
60378        }
60379        else if (fieldName != '' && node.nodeName.match(/SELECT/i))
60380        {
60381            fieldValue = getFieldValue(node);
60382            result = [{ name: fieldName.replace(/\[\]$/, ''), value: fieldValue}];
60383        }
60384        else
60385        {
60386            result = getSubFormValues(node, nodeCallback, useIdIfEmptyName);
60387        }
60388
60389        return result;
60390    }
60391
60392    function getFieldName(node, useIdIfEmptyName)
60393    {
60394        if (node.name && node.name != '') return lowerCaseNodeName(node.name);
60395        else if (useIdIfEmptyName && node.id && node.id != '') return lowerCaseNodeName(node.id);
60396        else return '';
60397    }
60398
60399    function lowerCaseNodeName(name)
60400    {
60401        if (name.indexOf('.') == -1)
60402            return name.firstLetterToLowerCase();
60403
60404        return _.map(name.split('.'), function (el) { return el.firstLetterToLowerCase() }).join(".");
60405    }
60406
60407    function getFieldValue(fieldNode)
60408    {
60409        if (fieldNode.disabled && !$(fieldNode).hasClass("disabledFromJsApi"))
60410            return null;
60411
60412        switch (fieldNode.nodeName)
60413        {
60414            case 'INPUT':
60415            case 'TEXTAREA':
60416                switch (fieldNode.type.toLowerCase())
60417                {
60418                    case 'radio':
60419                    case 'checkbox':
60420                        if (fieldNode.checked) return fieldNode.value;
60421                        break;
60422
60423                    case 'button':
60424                    case 'reset':
60425                    case 'submit':
60426                    case 'image':
60427                        return '';
60428                        break;
60429
60430                    default:
60431                        return $(fieldNode).val();
60432                        break;
60433                }
60434                break;
60435
60436            case 'SELECT':
60437                return getSelectedOptionValue(fieldNode);
60438                break;
60439
60440            default:
60441                break;
60442        }
60443
60444        return null;
60445    }
60446
60447    function getSelectedOptionValue(selectNode)
60448    {
60449        var multiple = selectNode.multiple,
60450			result = [],
60451			options,
60452			i, l;
60453
60454        if (!multiple) return selectNode.value;
60455
60456        for (options = selectNode.getElementsByTagName('option'), i = 0, l = options.length; i < l; i++)
60457        {
60458            if (options[i].selected) result.push(options[i].value);
60459        }
60460
60461        return result;
60462    }
60463
60464    function newObj()
60465    {
60466        var obj =
60467        {
60468            get: function (key) { return this[key]; },
60469            set: function (key, value) { this[key] = value; }
60470        };
60471
60472        return obj;
60473    }
60474
60475    return form2js;
60476
60477})();
60478
60479/*
60480custom changes:
604811) changed default settings.skipEmpty to false (48)
604822) added default settings.emptyToNull to true (49)
604833) added parameter settings.emptyToNull to form2js function (88, 93, 98)
604844) added custom nodeCallback function for process ASP.NET MVC checkboxes (62-83)
60485*/
60486
60487/**
60488* Copyright (c) 2010 Maxim Vasiliev
60489*
60490* Permission is hereby granted, free of charge, to any person obtaining a copy
60491* of this software and associated documentation files (the "Software"), to deal
60492* in the Software without restriction, including without limitation the rights
60493* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
60494* copies of the Software, and to permit persons to whom the Software is
60495* furnished to do so, subject to the following conditions:
60496*
60497* The above copyright notice and this permission notice shall be included in
60498* all copies or substantial portions of the Software.
60499*
60500* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
60501* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60502* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
60503* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
60504* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
60505* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
60506* THE SOFTWARE.
60507*
60508* @author Maxim Vasiliev
60509* Date: 29.06.11
60510* Time: 20:09
60511*/
60512
60513(function ($)
60514{
60515
60516    /**
60517    * jQuery wrapper for form2object()
60518    * Extracts data from child inputs into javascript object
60519    */
60520    $.fn.toObject = function (options)
60521    {
60522        var result = [],
60523			settings = {
60524			    mode: 'first', // what to convert: 'all' or 'first' matched node
60525			    delimiter: ".",
60526			    skipEmpty: false,
60527			    emptyToNull: true,
60528			    nodeCallback: null,
60529			    useIdIfEmptyName: false
60530			};
60531
60532        if (options)
60533        {
60534            $.extend(settings, options);
60535        }
60536
60537        if (settings.nodeCallback)
60538            throw 'nodeCallback is not supported!';
60539
60540        settings.nodeCallback = function (node)
60541        {
60542            if (node.type !== 'checkbox')
60543                return false;
60544
60545            if ($(node).val().asBool()) // is ASP.NET MVC checkbox
60546            { 
60547                var nameSplits = $(node)
60548                    .attr('name')
60549                    .split('.');
60550
60551                var name = _.reduce(nameSplits, function (a, b)
60552                    {
60553                        return a.firstLetterToLowerCase() + "." + b.firstLetterToLowerCase();
60554                    })
60555                    .firstLetterToLowerCase();
60556
60557                return { name: name, value: node.checked };
60558            }
60559            else
60560                return false;
60561        }
60562
60563        switch (settings.mode)
60564        {
60565            case 'first':
60566                return form2js(this.get(0), settings.delimiter, settings.skipEmpty, settings.emptyToNull, settings.nodeCallback, settings.useIdIfEmptyName);
60567                break;
60568            case 'all':
60569                this.each(function ()
60570                {
60571                    result.push(form2js(this, settings.delimiter, settings.skipEmpty, settings.emptyToNull, settings.nodeCallback, settings.useIdIfEmptyName));
60572                });
60573                return result;
60574                break;
60575            case 'combine':
60576                return form2js(Array.prototype.slice.call(this), settings.delimiter, settings.skipEmpty, settings.emptyToNull, settings.nodeCallback, settings.useIdIfEmptyName);
60577                break;
60578        }
60579    }
60580
60581})(jQuery);
60582/*
60583custom changes:
605841) commented out the lines 49-54 (broke Firebug stacktrace in some cases)
60585*/
60586
60587//     node-uuid/uuid.js
60588//
60589//     Copyright (c) 2010 Robert Kieffer
60590//     Dual licensed under the MIT and GPL licenses.
60591//     Documentation and details at https://github.com/broofa/node-uuid
60592(function() {
60593  var _global = this;
60594
60595  // Unique ID creation requires a high quality random # generator, but
60596  // Math.random() does not guarantee "cryptographic quality".  So we feature
60597  // detect for more robust APIs, normalizing each method to return 128-bits
60598  // (16 bytes) of random data.
60599  var mathRNG, nodeRNG, whatwgRNG;
60600
60601  // Math.random()-based RNG.  All platforms, very fast, unknown quality
60602  var _rndBytes = new Array(16);
60603  mathRNG = function() {
60604    var r, b = _rndBytes, i = 0;
60605
60606    for (var i = 0, r; i < 16; i++) {
60607      if ((i & 0x03) == 0) r = Math.random() * 0x100000000;
60608      b[i] = r >>> ((i & 0x03) << 3) & 0xff;
60609    }
60610
60611    return b;
60612  }
60613
60614  // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
60615  // WebKit only (currently), moderately fast, high quality
60616  if (_global.crypto && crypto.getRandomValues) {
60617    var _rnds = new Uint32Array(4);
60618    whatwgRNG = function() {
60619      crypto.getRandomValues(_rnds);
60620
60621      for (var c = 0 ; c < 16; c++) {
60622        _rndBytes[c] = _rnds[c >> 2] >>> ((c & 0x03) * 8) & 0xff;
60623      }
60624      return _rndBytes;
60625    }
60626  }
60627
60628  // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html
60629  // Node.js only, moderately fast, high quality
60630  //try {
60631  //  var _rb = require('crypto').randomBytes;
60632  //  nodeRNG = _rb && function() {
60633  //    return _rb(16);
60634  //  };
60635  //} catch (e) {}
60636
60637  // Select RNG with best quality
60638  var _rng = nodeRNG || whatwgRNG || mathRNG;
60639
60640  // Buffer class to use
60641  var BufferClass = typeof(Buffer) == 'function' ? Buffer : Array;
60642
60643  // Maps for number <-> hex string conversion
60644  var _byteToHex = [];
60645  var _hexToByte = {};
60646  for (var i = 0; i < 256; i++) {
60647    _byteToHex[i] = (i + 0x100).toString(16).substr(1);
60648    _hexToByte[_byteToHex[i]] = i;
60649  }
60650
60651  // **`parse()` - Parse a UUID into it's component bytes**
60652  function parse(s, buf, offset) {
60653    var i = (buf && offset) || 0, ii = 0;
60654
60655    buf = buf || [];
60656    s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
60657      if (ii < 16) { // Don't overflow!
60658        buf[i + ii++] = _hexToByte[oct];
60659      }
60660    });
60661
60662    // Zero out remaining bytes if string was short
60663    while (ii < 16) {
60664      buf[i + ii++] = 0;
60665    }
60666
60667    return buf;
60668  }
60669
60670  // **`unparse()` - Convert UUID byte array (ala parse()) into a string**
60671  function unparse(buf, offset) {
60672    var i = offset || 0, bth = _byteToHex;
60673    return  bth[buf[i++]] + bth[buf[i++]] +
60674            bth[buf[i++]] + bth[buf[i++]] + '-' +
60675            bth[buf[i++]] + bth[buf[i++]] + '-' +
60676            bth[buf[i++]] + bth[buf[i++]] + '-' +
60677            bth[buf[i++]] + bth[buf[i++]] + '-' +
60678            bth[buf[i++]] + bth[buf[i++]] +
60679            bth[buf[i++]] + bth[buf[i++]] +
60680            bth[buf[i++]] + bth[buf[i++]];
60681  }
60682
60683  // **`v1()` - Generate time-based UUID**
60684  //
60685  // Inspired by https://github.com/LiosK/UUID.js
60686  // and http://docs.python.org/library/uuid.html
60687
60688  // random #'s we need to init node and clockseq
60689  var _seedBytes = _rng();
60690
60691  // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
60692  var _nodeId = [
60693    _seedBytes[0] | 0x01,
60694    _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]
60695  ];
60696
60697  // Per 4.2.2, randomize (14 bit) clockseq
60698  var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
60699
60700  // Previous uuid creation time
60701  var _lastMSecs = 0, _lastNSecs = 0;
60702
60703  // See https://github.com/broofa/node-uuid for API details
60704  function v1(options, buf, offset) {
60705    var i = buf && offset || 0;
60706    var b = buf || [];
60707
60708    options = options || {};
60709
60710    var clockseq = options.clockseq != null ? options.clockseq : _clockseq;
60711
60712    // UUID timestamps are 100 nano-second units since the Gregorian epoch,
60713    // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
60714    // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
60715    // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
60716    var msecs = options.msecs != null ? options.msecs : new Date().getTime();
60717
60718    // Per 4.2.1.2, use count of uuid's generated during the current clock
60719    // cycle to simulate higher resolution clock
60720    var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1;
60721
60722    // Time since last uuid creation (in msecs)
60723    var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;
60724
60725    // Per 4.2.1.2, Bump clockseq on clock regression
60726    if (dt < 0 && options.clockseq == null) {
60727      clockseq = clockseq + 1 & 0x3fff;
60728    }
60729
60730    // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
60731    // time interval
60732    if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
60733      nsecs = 0;
60734    }
60735
60736    // Per 4.2.1.2 Throw error if too many uuids are requested
60737    if (nsecs >= 10000) {
60738      throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
60739    }
60740
60741    _lastMSecs = msecs;
60742    _lastNSecs = nsecs;
60743    _clockseq = clockseq;
60744
60745    // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
60746    msecs += 12219292800000;
60747
60748    // `time_low`
60749    var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
60750    b[i++] = tl >>> 24 & 0xff;
60751    b[i++] = tl >>> 16 & 0xff;
60752    b[i++] = tl >>> 8 & 0xff;
60753    b[i++] = tl & 0xff;
60754
60755    // `time_mid`
60756    var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
60757    b[i++] = tmh >>> 8 & 0xff;
60758    b[i++] = tmh & 0xff;
60759
60760    // `time_high_and_version`
60761    b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
60762    b[i++] = tmh >>> 16 & 0xff;
60763
60764    // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
60765    b[i++] = clockseq >>> 8 | 0x80;
60766
60767    // `clock_seq_low`
60768    b[i++] = clockseq & 0xff;
60769
60770    // `node`
60771    var node = options.node || _nodeId;
60772    for (var n = 0; n < 6; n++) {
60773      b[i + n] = node[n];
60774    }
60775
60776    return buf ? buf : unparse(b);
60777  }
60778
60779  // **`v4()` - Generate random UUID**
60780
60781  // See https://github.com/broofa/node-uuid for API details
60782  function v4(options, buf, offset) {
60783    // Deprecated - 'format' argument, as supported in v1.2
60784    var i = buf && offset || 0;
60785
60786    if (typeof(options) == 'string') {
60787      buf = options == 'binary' ? new BufferClass(16) : null;
60788      options = null;
60789    }
60790    options = options || {};
60791
60792    var rnds = options.random || (options.rng || _rng)();
60793
60794    // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
60795    rnds[6] = (rnds[6] & 0x0f) | 0x40;
60796    rnds[8] = (rnds[8] & 0x3f) | 0x80;
60797
60798    // Copy bytes to buffer, if provided
60799    if (buf) {
60800      for (var ii = 0; ii < 16; ii++) {
60801        buf[i + ii] = rnds[ii];
60802      }
60803    }
60804
60805    return buf || unparse(rnds);
60806  }
60807
60808  // Export public API
60809  var uuid = v4;
60810  uuid.v1 = v1;
60811  uuid.v4 = v4;
60812  uuid.parse = parse;
60813  uuid.unparse = unparse;
60814  uuid.BufferClass = BufferClass;
60815
60816  // Export RNG options
60817  uuid.mathRNG = mathRNG;
60818  uuid.nodeRNG = nodeRNG;
60819  uuid.whatwgRNG = whatwgRNG;
60820
60821  if (typeof(module) != 'undefined') {
60822    // Play nice with node.js
60823    module.exports = uuid;
60824  } else {
60825    // Play nice with browsers
60826    var _previousRoot = _global.uuid;
60827
60828    // **`noConflict()` - (browser only) to reset global 'uuid' var**
60829    uuid.noConflict = function() {
60830      _global.uuid = _previousRoot;
60831      return uuid;
60832    }
60833    _global.uuid = uuid;
60834  }
60835}());
60836
60837$(document).ready(function () {
60838
60839
60840	/*----------------------------------------------------------------------*/
60841	/* Parse the data from an data-attribute of DOM Elements
60842	/*----------------------------------------------------------------------*/
60843
60844
60845	$.parseData = function (data, returnArray) {
60846		if (/^\[(.*)\]$/.test(data)) { //array
60847			data = data.substr(1, data.length - 2).split(',');
60848		}
60849		if (returnArray && !$.isArray(data) && data != null) {
60850			data = Array(data);
60851		}
60852		return data;
60853	};
60854	
60855	/*----------------------------------------------------------------------*/
60856	/* Image Preloader
60857	/* http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript
60858	/*----------------------------------------------------------------------*/
60859	
60860
60861
60862	// Arguments are image paths relative to the current page.
60863	$.preload = function() {
60864		var cache = [],
60865			args_len = arguments.length;
60866		for (var i = args_len; i--;) {
60867			var cacheImage = document.createElement('img');
60868			cacheImage.src = arguments[i];
60869			cache.push(cacheImage);
60870		}
60871	};
60872	
60873	
60874	/*----------------------------------------------------------------------*/
60875	/* fadeInSlide by revaxarts.com
60876	/* Fades out a box and slide it up before it will get removed
60877	/*----------------------------------------------------------------------*/
60878
60879
60880	$.fn.fadeInSlide = function (speed, callback) {
60881		if ($.isFunction(speed)) callback = speed;
60882		if (!speed) speed = 200;
60883		if (!callback) callback = function () {};
60884		this.each(function () {
60885
60886			var $this = $(this);
60887			$this.fadeTo(speed / 2, 1).slideDown(speed / 2, function () {
60888				callback();
60889			});
60890		});
60891		return this;
60892	};
60893	
60894	
60895	/*----------------------------------------------------------------------*/
60896	/* fadeOutSlide by revaxarts.com
60897	/* Fades out a box and slide it up before it will get removed
60898	/*----------------------------------------------------------------------*/
60899
60900
60901	$.fn.fadeOutSlide = function (speed, callback) {
60902		if ($.isFunction(speed)) callback = speed;
60903		if (!speed) speed = 200;
60904		if (!callback) callback = function () {};
60905		this.each(function () {
60906
60907			var $this = $(this);
60908			$this.fadeTo(speed / 2, 0).slideUp(speed / 2, function () {
60909				$this.remove();
60910				callback();
60911			});
60912		});
60913		return this;
60914	};
60915	
60916	/*----------------------------------------------------------------------*/
60917	/* textFadeOut by revaxarts.com
60918	/* Fades out a box and slide it up before it will get removed
60919	/*----------------------------------------------------------------------*/
60920
60921
60922	$.fn.textFadeOut = function (text, delay, callback) {
60923		if (!text) return false;
60924		if ($.isFunction(delay)) callback = delay;
60925		if (!delay) delay = 2000;
60926		if (!callback) callback = function () {};
60927		this.each(function () {
60928
60929			var $this = $(this);
60930			$this.stop().text(text).show().delay(delay).fadeOut(1000,function(){
60931				$this.text('').show();
60932				callback();
60933			})
60934		});
60935		return this;
60936	};
60937	
60938	/*----------------------------------------------------------------------*/
60939	/* leadingZero by revaxarts.com
60940	/* adds a leding zero if necessary
60941	/*----------------------------------------------------------------------*/
60942	
60943	
60944	$.leadingZero = function (value) {
60945		value = parseInt(value, 10);
60946		if(!isNaN(value)) {
60947			(value < 10) ? value = '0' + value : value;
60948		}
60949		return value;
60950	};
60951
60952
60953});
60954(function(window) {
60955    var re = {
60956        not_string: /[^s]/,
60957        number: /[dief]/,
60958        json: /[j]/,
60959        not_json: /[^j]/,
60960        text: /^[^\x25]+/,
60961        modulo: /^\x25{2}/,
60962        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fijosuxX])/,
60963        key: /^([a-z_][a-z_\d]*)/i,
60964        key_access: /^\.([a-z_][a-z_\d]*)/i,
60965        index_access: /^\[(\d+)\]/,
60966        sign: /^[\+\-]/
60967    }
60968
60969    function sprintf() {
60970        var key = arguments[0], cache = sprintf.cache
60971        if (!(cache[key] && cache.hasOwnProperty(key))) {
60972            cache[key] = sprintf.parse(key)
60973        }
60974        return sprintf.format.call(null, cache[key], arguments)
60975    }
60976
60977    sprintf.format = function(parse_tree, argv) {
60978        var cursor = 1, tree_length = parse_tree.length, node_type = "", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = ""
60979        for (i = 0; i < tree_length; i++) {
60980            node_type = get_type(parse_tree[i])
60981            if (node_type === "string") {
60982                output[output.length] = parse_tree[i]
60983            }
60984            else if (node_type === "array") {
60985                match = parse_tree[i] // convenience purposes only
60986                if (match[2]) { // keyword argument
60987                    arg = argv[cursor]
60988                    for (k = 0; k < match[2].length; k++) {
60989                        if (!arg.hasOwnProperty(match[2][k])) {
60990                            throw new Error(sprintf("[sprintf] property '%s' does not exist", match[2][k]))
60991                        }
60992                        arg = arg[match[2][k]]
60993                    }
60994                }
60995                else if (match[1]) { // positional argument (explicit)
60996                    arg = argv[match[1]]
60997                }
60998                else { // positional argument (implicit)
60999                    arg = argv[cursor++]
61000                }
61001
61002                if (get_type(arg) == "function") {
61003                    arg = arg()
61004                }
61005
61006                if (re.not_string.test(match[8]) && re.not_json.test(match[8]) && (get_type(arg) != "number" && isNaN(arg))) {
61007                    throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg)))
61008                }
61009
61010                if (re.number.test(match[8])) {
61011                    is_positive = arg >= 0
61012                }
61013
61014                switch (match[8]) {
61015                    case "b":
61016                        arg = arg.toString(2)
61017                    break
61018                    case "c":
61019                        arg = String.fromCharCode(arg)
61020                    break
61021                    case "d":
61022                    case "i":
61023                        arg = parseInt(arg, 10)
61024                    break
61025                    case "j":
61026                        arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0)
61027                    break
61028                    case "e":
61029                        arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()
61030                    break
61031                    case "f":
61032                        arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)
61033                    break
61034                    case "o":
61035                        arg = arg.toString(8)
61036                    break
61037                    case "s":
61038                        arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)
61039                    break
61040                    case "u":
61041                        arg = arg >>> 0
61042                    break
61043                    case "x":
61044                        arg = arg.toString(16)
61045                    break
61046                    case "X":
61047                        arg = arg.toString(16).toUpperCase()
61048                    break
61049                }
61050                if (re.json.test(match[8])) {
61051                    output[output.length] = arg
61052                }
61053                else {
61054                    if (re.number.test(match[8]) && (!is_positive || match[3])) {
61055                        sign = is_positive ? "+" : "-"
61056                        arg = arg.toString().replace(re.sign, "")
61057                    }
61058                    else {
61059                        sign = ""
61060                    }
61061                    pad_character = match[4] ? match[4] === "0" ? "0" : match[4].charAt(1) : " "
61062                    pad_length = match[6] - (sign + arg).length
61063                    pad = match[6] ? (pad_length >
61063 0 ? str_repeat(pad_character, pad_length) : "") : ""
61064                    output[output.length] = match[5] ? sign + arg + pad : (pad_character === "0" ? sign + pad + arg : pad + sign + arg)
61065                }
61066            }
61067        }
61068        return output.join("")
61069    }
61070
61071    sprintf.cache = {}
61072
61073    sprintf.parse = function(fmt) {
61074        var _fmt = fmt, match = [], parse_tree = [], arg_names = 0
61075        while (_fmt) {
61076            if ((match = re.text.exec(_fmt)) !== null) {
61077                parse_tree[parse_tree.length] = match[0]
61078            }
61079            else if ((match = re.modulo.exec(_fmt)) !== null) {
61080                parse_tree[parse_tree.length] = "%"
61081            }
61082            else if ((match = re.placeholder.exec(_fmt)) !== null) {
61083                if (match[2]) {
61084                    arg_names |= 1
61085                    var field_list = [], replacement_field = match[2], field_match = []
61086                    if ((field_match = re.key.exec(replacement_field)) !== null) {
61087                        field_list[field_list.length] = field_match[1]
61088                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") {
61089                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
61090                                field_list[field_list.length] = field_match[1]
61091                            }
61092                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
61093                                field_list[field_list.length] = field_match[1]
61094                            }
61095                            else {
61096                                throw new SyntaxError("[sprintf] failed to parse named argument key")
61097                            }
61098                        }
61099                    }
61100                    else {
61101                        throw new SyntaxError("[sprintf] failed to parse named argument key")
61102                    }
61103                    match[2] = field_list
61104                }
61105                else {
61106                    arg_names |= 2
61107                }
61108                if (arg_names === 3) {
61109                    throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported")
61110                }
61111                parse_tree[parse_tree.length] = match
61112            }
61113            else {
61114                throw new SyntaxError("[sprintf] unexpected placeholder")
61115            }
61116            _fmt = _fmt.substring(match[0].length)
61117        }
61118        return parse_tree
61119    }
61120
61121    var vsprintf = function(fmt, argv, _argv) {
61122        _argv = (argv || []).slice(0)
61123        _argv.splice(0, 0, fmt)
61124        return sprintf.apply(null, _argv)
61125    }
61126
61127    /**
61128     * helpers
61129     */
61130    function get_type(variable) {
61131        return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()
61132    }
61133
61134    function str_repeat(input, multiplier) {
61135        return Array(multiplier + 1).join(input)
61136    }
61137
61138    /**
61139     * export to either browser or node.js
61140     */
61141    if (typeof exports !== "undefined") {
61142        exports.sprintf = sprintf
61143        exports.vsprintf = vsprintf
61144    }
61145    else {
61146        window.sprintf = sprintf
61147        window.vsprintf = vsprintf
61148
61149        if (typeof define === "function" && define.amd) {
61150            define(function() {
61151                return {
61152                    sprintf: sprintf,
61153                    vsprintf: vsprintf
61154                }
61155            })
61156        }
61157    }
61158})(typeof window === "undefined" ? this : window);
61159
61160/*
61161 * [js-sha512]{@link https://github.com/emn178/js-sha512}
61162 *
61163 * @version 0.3.0
61164 * @author Chen, Yi-Cyuan [[email protected]]
61165 * @copyright Chen, Yi-Cyuan 2014-2017
61166 * @license MIT
61167 */
61168/*jslint bitwise: true */
61169(function () {
61170  'use strict';
61171
61172  var root = typeof window === 'object' ? window : {};
61173  var NODE_JS = !root.JS_SHA512_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
61174  if (NODE_JS) {
61175    root = global;
61176  }
61177  var COMMON_JS = !root.JS_SHA512_NO_COMMON_JS && typeof module === 'object' && module.exports;
61178  var AMD = typeof define === 'function' && define.amd;
61179  var HEX_CHARS = '0123456789abcdef'.split('');
61180  var EXTRA = [-2147483648, 8388608, 32768, 128];
61181  var SHIFT = [24, 16, 8, 0];
61182  var K =[
61183    0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD,
61184    0xB5C0FBCF, 0xEC4D3B2F, 0xE9B5DBA5, 0x8189DBBC,
61185    0x3956C25B, 0xF348B538, 0x59F111F1, 0xB605D019,
61186    0x923F82A4, 0xAF194F9B, 0xAB1C5ED5, 0xDA6D8118,
61187    0xD807AA98, 0xA3030242, 0x12835B01, 0x45706FBE,
61188    0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2,
61189    0x72BE5D74, 0xF27B896F, 0x80DEB1FE, 0x3B1696B1,
61190    0x9BDC06A7, 0x25C71235, 0xC19BF174, 0xCF692694,
61191    0xE49B69C1, 0x9EF14AD2, 0xEFBE4786, 0x384F25E3,
61192    0x0FC19DC6, 0x8B8CD5B5, 0x240CA1CC, 0x77AC9C65,
61193    0x2DE92C6F, 0x592B0275, 0x4A7484AA, 0x6EA6E483,
61194    0x5CB0A9DC, 0xBD41FBD4, 0x76F988DA, 0x831153B5,
61195    0x983E5152, 0xEE66DFAB, 0xA831C66D, 0x2DB43210,
61196    0xB00327C8, 0x98FB213F, 0xBF597FC7, 0xBEEF0EE4,
61197    0xC6E00BF3, 0x3DA88FC2, 0xD5A79147, 0x930AA725,
61198    0x06CA6351, 0xE003826F, 0x14292967, 0x0A0E6E70,
61199    0x27B70A85, 0x46D22FFC, 0x2E1B2138, 0x5C26C926,
61200    0x4D2C6DFC, 0x5AC42AED, 0x53380D13, 0x9D95B3DF,
61201    0x650A7354, 0x8BAF63DE, 0x766A0ABB, 0x3C77B2A8,
61202    0x81C2C92E, 0x47EDAEE6, 0x92722C85, 0x1482353B,
61203    0xA2BFE8A1, 0x4CF10364, 0xA81A664B, 0xBC423001,
61204    0xC24B8B70, 0xD0F89791, 0xC76C51A3, 0x0654BE30,
61205    0xD192E819, 0xD6EF5218, 0xD6990624, 0x5565A910,
61206    0xF40E3585, 0x5771202A, 0x106AA070, 0x32BBD1B8,
61207    0x19A4C116, 0xB8D2D0C8, 0x1E376C08, 0x5141AB53,
61208    0x2748774C, 0xDF8EEB99, 0x34B0BCB5, 0xE19B48A8,
61209    0x391C0CB3, 0xC5C95A63, 0x4ED8AA4A, 0xE3418ACB,
61210    0x5B9CCA4F, 0x7763E373, 0x682E6FF3, 0xD6B2B8A3,
61211    0x748F82EE, 0x5DEFB2FC, 0x78A5636F, 0x43172F60,
61212    0x84C87814, 0xA1F0AB72, 0x8CC70208, 0x1A6439EC,
61213    0x90BEFFFA, 0x23631E28, 0xA4506CEB, 0xDE82BDE9,
61214    0xBEF9A3F7, 0xB2C67915, 0xC67178F2, 0xE372532B,
61215    0xCA273ECE, 0xEA26619C, 0xD186B8C7, 0x21C0C207,
61216    0xEADA7DD6, 0xCDE0EB1E, 0xF57D4F7F, 0xEE6ED178,
61217    0x06F067AA, 0x72176FBA, 0x0A637DC5, 0xA2C898A6,
61218    0x113F9804, 0xBEF90DAE, 0x1B710B35, 0x131C471B,
61219    0x28DB77F5, 0x23047D84, 0x32CAAB7B, 0x40C72493,
61220    0x3C9EBE0A, 0x15C9BEBC, 0x431D67C4, 0x9C100D4C,
61221    0x4CC5D4BE, 0xCB3E42B6, 0x597F299C, 0xFC657E2A,
61222    0x5FCB6FAB, 0x3AD6FAEC, 0x6C44198C, 0x4A475817
61223  ];
61224
61225  var blocks = [];
61226
61227  var sha384 = function (message) {
61228    return sha512(message, 384);
61229  };
61230
61231  var sha512_256 = function (message) {
61232    return sha512(message, 256);
61233  };
61234
61235  var sha512_224 = function (message) {
61236    return sha512(message, 224);
61237  };
61238
61239  var sha512 = function (message, bits) {
61240    var h0h, h0l, h1h, h1l, h2h, h2l, h3h, h3l, 
61241      h4h, h4l, h5h, h5l, h6h, h6l, h7h, h7l, block, code, end = false,
61242      i, j, index = 0, start = 0, bytes = 0, length = message.length,
61243      s0h, s0l, s1h, s1l, c1, c2, c3, c4, 
61244      abh, abl, dah, dal, cdh, cdl, bch, bcl,
61245      majh, majl, t1h, t1l, t2h, t2l, chh, chl;
61246
61247    if (bits == 384) {
61248      h0h = 0xCBBB9D5D;
61249      h0l = 0xC1059ED8;
61250      h1h = 0x629A292A;
61251      h1l = 0x367CD507;
61252      h2h = 0x9159015A;
61253      h2l = 0x3070DD17;
61254      h3h = 0x152FECD8;
61255      h3l = 0xF70E5939;
61256      h4h = 0x67332667;
61257      h4l = 0xFFC00B31;
61258      h5h = 0x8EB44A87;
61259      h5l = 0x68581511;
61260      h6h = 0xDB0C2E0D;
61261      h6l = 0x64F98FA7;
61262      h7h = 0x47B5481D;
61263      h7l = 0xBEFA4FA4;
61264    } else if (bits == 256) {
61265      h0h = 0x22312194;
61266      h0l = 0xFC2BF72C;
61267      h1h = 0x9F555FA3;
61268      h1l = 0xC84C64C2;
61269      h2h = 0x2393B86B;
61270      h2l = 0x6F53B151;
61271      h3h = 0x96387719;
61272      h3l = 0x5940EABD;
61273      h4h = 0x96283EE2;
61274      h4l = 0xA88EFFE3;
61275      h5h = 0xBE5E1E25;
61276      h5l = 0x53863992;
61277      h6h = 0x2B0199FC;
61278      h6l = 0x2C85B8AA;
61279      h7h = 0x0EB72DDC;
61280      h7l = 0x81C52CA2;
61281    } else if (bits == 224) {
61282      h0h = 0x8C3D37C8;
61283      h0l = 0x19544DA2;
61284      h1h = 0x73E19966;
61285      h1l = 0x89DCD4D6;
61286      h2h = 0x1DFAB7AE;
61287      h2l = 0x32FF9C82;
61288      h3h = 0x679DD514;
61289      h3l = 0x582F9FCF;
61290      h4h = 0x0F6D2B69;
61291      h4l = 0x7BD44DA8;
61292      h5h = 0x77E36F73;
61293      h5l = 0x04C48942;
61294      h6h = 0x3F9D85A8;
61295      h6l = 0x6A1D36C8;
61296      h7h = 0x1112E6AD;
61297      h7l = 0x91D692A1;
61298    } else { // 512
61299      h0h = 0x6A09E667;
61300      h0l = 0xF3BCC908;
61301      h1h = 0xBB67AE85;
61302      h1l = 0x84CAA73B;
61303      h2h = 0x3C6EF372;
61304      h2l = 0xFE94F82B;
61305      h3h = 0xA54FF53A;
61306      h3l = 0x5F1D36F1;
61307      h4h = 0x510E527F;
61308      h4l = 0xADE682D1;
61309      h5h = 0x9B05688C;
61310      h5l = 0x2B3E6C1F;
61311      h6h = 0x1F83D9AB;
61312      h6l = 0xFB41BD6B;
61313      h7h = 0x5BE0CD19;
61314      h7l = 0x137E2179;
61315      bits = 512;
61316    }
61317    block = 0;
61318    do {
61319      blocks[0] = block;
61320      blocks[1] = blocks[2] = blocks[3] = blocks[4] = 
61321      blocks[5] = blocks[6] = blocks[7] = blocks[8] = 
61322      blocks[9] = blocks[10] = blocks[11] = blocks[12] = 
61323      blocks[13] = blocks[14] = blocks[15] = blocks[16] = 
61324      blocks[17] = blocks[18] = blocks[19] = blocks[20] =
61325      blocks[21] = blocks[22] = blocks[23] = blocks[24] =
61326      blocks[25] = blocks[26] = blocks[27] = blocks[28] =
61327      blocks[29] = blocks[30] = blocks[31] = blocks[32] = 0;
61328      for (i = start; index < length && i < 128; ++index) {
61329        code = message.charCodeAt(index);
61330        if (code < 0x80) {
61331          blocks[i >> 2] |= code << SHIFT[i++ & 3];
61332        } else if (code < 0x800) {
61333          blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
61334          blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
61335        } else if (code < 0xd800 || code >= 0xe000) {
61336          blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
61337          blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
61338          blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
61339        } else {
61340          code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
61341          blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
61342          blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
61343          blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
61344          blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
61345        }
61346      }
61347      bytes += i - start;
61348      start = i - 128;
61349      if (index == length) {
61350        blocks[i >> 2] |= EXTRA[i & 3];
61351        ++index;
61352      }
61353      block = blocks[32];
61354      if (index > length && i < 112) {
61355        blocks[31] = bytes << 3;
61356        end = true;
61357      }
61358
61359      for (j = 32; j < 160; j += 2) {
61360        t1h = blocks[j - 30];
61361        t1l = blocks[j - 29];
61362        s0h = ((t1h >>> 1) | (t1l << 31)) ^ ((t1h >>> 8) | (t1l << 24)) ^ (t1h >>> 7);
61363        s0l = ((t1l >>> 1) | (t1h << 31)) ^ ((t1l >>> 8) | (t1h << 24)) ^ ((t1l >>> 7) | t1h << 25);
61364
61365        t1h = blocks[j - 4];
61366        t1l = blocks[j - 3];
61367        s1h = ((t1h >>> 19) | (t1l << 13)) ^ ((t1l >>> 29) | (t1h << 3)) ^ (t1h >>> 6);
61368        s1l = ((t1l >>> 19) | (t1h << 13)) ^ ((t1h >>> 29) | (t1l << 3)) ^ ((t1l >>> 6) | t1h << 26);
61369
61370        t1h = blocks[j - 32];
61371        t1l = blocks[j - 31];
61372        t2h = blocks[j - 14];
61373        t2l = blocks[j - 13];
61374
61375        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (s0l & 0xFFFF) + (s1l & 0xFFFF);
61376        c2 = (t2l >>> 16) + (t1l >>> 16) + (s0l >>> 16) + (s1l >>> 16) + (c1 >>> 16);
61377        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (s0h & 0xFFFF) + (s1h & 0xFFFF) + (c2 >>> 16);
61378        c4 = (t2h >>> 16) + (t1h >>> 16) + (s0h >>> 16) + (s1h >>> 16) + (c3 >>> 16);
61379
61380        blocks[j] = (c4 << 16) | (c3 & 0xFFFF);
61381        blocks[j + 1] = (c2 << 16) | (c1 & 0xFFFF);
61382      }
61383
61384      var ah = h0h, al = h0l, bh = h1h, bl = h1l, ch = h2h, cl = h2l, dh = h3h, dl = h3l, eh = h4h, el = h4l, fh = h5h, fl = h5l, gh = h6h, gl = h6l, hh = h7h, hl = h7l;
61385      bch = bh & ch;
61386      bcl = bl & cl;
61387      for (j = 0; j < 160; j += 8) {
61388        s0h = ((ah >>> 28) | (al << 4)) ^ ((al >>> 2) | (ah << 30)) ^ ((al >>> 7) | (ah << 25));
61389        s0l = ((al >>> 28) | (ah << 4)) ^ ((ah >>> 2) | (al << 30)) ^ ((ah >>> 7) | (al << 25));
61390
61391        s1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((el >>> 9) | (eh << 23));
61392        s1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((eh >>> 9) | (el << 23));
61393
61394        abh = ah & bh;
61395        abl = al & bl;
61396        majh = abh ^ (ah & ch) ^ bch;
61397        majl = abl ^ (al & cl) ^ bcl;
61398
61399        chh = (eh & fh) ^ (~eh & gh);
61400        chl = (el & fl) ^ (~el & gl);
61401
61402        t1h = blocks[j];
61403        t1l = blocks[j + 1];
61404        t2h = K[j];
61405        t2l = K[j + 1];
61406
61407        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (hl & 0xFFFF);
61408        c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (hl >>> 16) + (c1 >>> 16);
61409        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (hh & 0xFFFF) + (c2 >>
61409> 16);
61410        c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (hh >>> 16) + (c3 >>> 16);
61411
61412        t1h = (c4 << 16) | (c3 & 0xFFFF);
61413        t1l = (c2 << 16) | (c1 & 0xFFFF);
61414
61415        c1 = (majl & 0xFFFF) + (s0l & 0xFFFF);
61416        c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16);
61417        c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16);
61418        c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16);
61419
61420        t2h = (c4 << 16) | (c3 & 0xFFFF);
61421        t2l = (c2 << 16) | (c1 & 0xFFFF);
61422
61423        c1 = (dl & 0xFFFF) + (t1l & 0xFFFF);
61424        c2 = (dl >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61425        c3 = (dh & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61426        c4 = (dh >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61427
61428        hh = (c4 << 16) | (c3 & 0xFFFF);
61429        hl = (c2 << 16) | (c1 & 0xFFFF);
61430
61431        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF);
61432        c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61433        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61434        c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61435
61436        dh = (c4 << 16) | (c3 & 0xFFFF);
61437        dl = (c2 << 16) | (c1 & 0xFFFF);
61438
61439        s0h = ((dh >>> 28) | (dl << 4)) ^ ((dl >>> 2) | (dh << 30)) ^ ((dl >>> 7) | (dh << 25));
61440        s0l = ((dl >>> 28) | (dh << 4)) ^ ((dh >>> 2) | (dl << 30)) ^ ((dh >>> 7) | (dl << 25));
61441
61442        s1h = ((hh >>> 14) | (hl << 18)) ^ ((hh >>> 18) | (hl << 14)) ^ ((hl >>> 9) | (hh << 23));
61443        s1l = ((hl >>> 14) | (hh << 18)) ^ ((hl >>> 18) | (hh << 14)) ^ ((hh >>> 9) | (hl << 23));
61444
61445        dah = dh & ah;
61446        dal = dl & al;
61447        majh = dah ^ (dh & bh) ^ abh;
61448        majl = dal ^ (dl & bl) ^ abl;
61449
61450        chh = (hh & eh) ^ (~hh & fh);
61451        chl = (hl & el) ^ (~hl & fl);
61452
61453        t1h = blocks[j + 2];
61454        t1l = blocks[j + 3];
61455        t2h = K[j + 2];
61456        t2l = K[j + 3];
61457
61458        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (gl & 0xFFFF);
61459        c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (gl >>> 16) + (c1 >>> 16);
61460        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (gh & 0xFFFF) + (c2 >>> 16);
61461        c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (gh >>> 16) + (c3 >>> 16);
61462
61463        t1h = (c4 << 16) | (c3 & 0xFFFF);
61464        t1l = (c2 << 16) | (c1 & 0xFFFF);
61465
61466        c1 = (majl & 0xFFFF) + (s0l & 0xFFFF);
61467        c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16);
61468        c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16);
61469        c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16);
61470
61471        t2h = (c4 << 16) | (c3 & 0xFFFF);
61472        t2l = (c2 << 16) | (c1 & 0xFFFF);
61473
61474        c1 = (cl & 0xFFFF) + (t1l & 0xFFFF);
61475        c2 = (cl >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61476        c3 = (ch & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61477        c4 = (ch >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61478
61479        gh = (c4 << 16) | (c3 & 0xFFFF);
61480        gl = (c2 << 16) | (c1 & 0xFFFF);
61481
61482        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF);
61483        c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61484        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61485        c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61486
61487        ch = (c4 << 16) | (c3 & 0xFFFF);
61488        cl = (c2 << 16) | (c1 & 0xFFFF);
61489
61490        s0h = ((ch >>> 28) | (cl << 4)) ^ ((cl >>> 2) | (ch << 30)) ^ ((cl >>> 7) | (ch << 25));
61491        s0l = ((cl >>> 28) | (ch << 4)) ^ ((ch >>> 2) | (cl << 30)) ^ ((ch >>> 7) | (cl << 25));
61492
61493        s1h = ((gh >>> 14) | (gl << 18)) ^ ((gh >>> 18) | (gl << 14)) ^ ((gl >>> 9) | (gh << 23));
61494        s1l = ((gl >>> 14) | (gh << 18)) ^ ((gl >>> 18) | (gh << 14)) ^ ((gh >>> 9) | (gl << 23));
61495
61496        cdh = ch & dh;
61497        cdl = cl & dl;
61498        majh = cdh ^ (ch & ah) ^ dah;
61499        majl = cdl ^ (cl & al) ^ dal;
61500
61501        chh = (gh & hh) ^ (~gh & eh);
61502        chl = (gl & hl) ^ (~gl & el);
61503
61504        t1h = blocks[j + 4];
61505        t1l = blocks[j + 5];
61506        t2h = K[j + 4];
61507        t2l = K[j + 5];
61508
61509        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (fl & 0xFFFF);
61510        c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (fl >>> 16) + (c1 >>> 16);
61511        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (fh & 0xFFFF) + (c2 >>
61511> 16);
61512        c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (fh >>> 16) + (c3 >>> 16);
61513
61514        t1h = (c4 << 16) | (c3 & 0xFFFF);
61515        t1l = (c2 << 16) | (c1 & 0xFFFF);
61516
61517        c1 = (majl & 0xFFFF) + (s0l & 0xFFFF);
61518        c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16);
61519        c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16);
61520        c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16);
61521
61522        t2h = (c4 << 16) | (c3 & 0xFFFF);
61523        t2l = (c2 << 16) | (c1 & 0xFFFF);
61524
61525        c1 = (bl & 0xFFFF) + (t1l & 0xFFFF);
61526        c2 = (bl >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61527        c3 = (bh & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61528        c4 = (bh >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61529
61530        fh = (c4 << 16) | (c3 & 0xFFFF);
61531        fl = (c2 << 16) | (c1 & 0xFFFF);
61532
61533        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF);
61534        c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61535        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61536        c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61537
61538        bh = (c4 << 16) | (c3 & 0xFFFF);
61539        bl = (c2 << 16) | (c1 & 0xFFFF);
61540
61541        s0h = ((bh >>> 28) | (bl << 4)) ^ ((bl >>> 2) | (bh << 30)) ^ ((bl >>> 7) | (bh << 25));
61542        s0l = ((bl >>> 28) | (bh << 4)) ^ ((bh >>> 2) | (bl << 30)) ^ ((bh >>> 7) | (bl << 25));
61543
61544        s1h = ((fh >>> 14) | (fl << 18)) ^ ((fh >>> 18) | (fl << 14)) ^ ((fl >>> 9) | (fh << 23));
61545        s1l = ((fl >>> 14) | (fh << 18)) ^ ((fl >>> 18) | (fh << 14)) ^ ((fh >>> 9) | (fl << 23));
61546
61547        bch = bh & ch;
61548        bcl = bl & cl;
61549        majh = bch ^ (bh & dh) ^ cdh;
61550        majl = bcl ^ (bl & dl) ^ cdl;
61551
61552        chh = (fh & gh) ^ (~fh & hh);
61553        chl = (fl & gl) ^ (~fl & hl);
61554
61555        t1h = blocks[j + 6];
61556        t1l = blocks[j + 7];
61557        t2h = K[j + 6];
61558        t2l = K[j + 7];
61559
61560        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (el & 0xFFFF);
61561        c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (el >>> 16) + (c1 >>> 16);
61562        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (eh & 0xFFFF) + (c2 >>> 16);
61563        c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (eh >>> 16) + (c3 >>> 16);
61564
61565        t1h = (c4 << 16) | (c3 & 0xFFFF);
61566        t1l = (c2 << 16) | (c1 & 0xFFFF);
61567
61568        c1 = (majl & 0xFFFF) + (s0l & 0xFFFF);
61569        c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16);
61570        c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16);
61571        c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16);
61572
61573        t2h = (c4 << 16) | (c3 & 0xFFFF);
61574        t2l = (c2 << 16) | (c1 & 0xFFFF);
61575
61576        c1 = (al & 0xFFFF) + (t1l & 0xFFFF);
61577        c2 = (al >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61578        c3 = (ah & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61579        c4 = (ah >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61580
61581        eh = (c4 << 16) | (c3 & 0xFFFF);
61582        el = (c2 << 16) | (c1 & 0xFFFF);
61583
61584        c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF);
61585        c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16);
61586        c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
61587        c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16);
61588
61589        ah = (c4 << 16) | (c3 & 0xFFFF);
61590        al = (c2 << 16) | (c1 & 0xFFFF);
61591      }
61592
61593      c1 = (h0l & 0xFFFF) + (al & 0xFFFF);
61594      c2 = (h0l >>> 16) + (al >>> 16) + (c1 >>> 16);
61595      c3 = (h0h & 0xFFFF) + (ah & 0xFFFF) + (c2 >>> 16);
61596      c4 = (h0h >>> 16) + (ah >>> 16) + (c3 >>> 16);
61597
61598      h0h = (c4 << 16) | (c3 & 0xFFFF);
61599      h0l = (c2 << 16) | (c1 & 0xFFFF);
61600
61601      c1 = (h1l & 0xFFFF) + (bl & 0xFFFF);
61602      c2 = (h1l >>> 16) + (bl >>> 16) + (c1 >>> 16);
61603      c3 = (h1h & 0xFFFF) + (bh & 0xFFFF) + (c2 >>> 16);
61604      c4 = (h1h >>> 16) + (bh >>> 16) + (c3 >>> 16);
61605
61606      h1h = (c4 << 16) | (c3 & 0xFFFF);
61607      h1l = (c2 << 16) | (c1 & 0xFFFF);
61608
61609      c1 = (h2l & 0xFFFF) + (cl & 0xFFFF);
61610      c2 = (h2l >>> 16) + (cl >>> 16) + (c1 >>> 16);
61611      c3 = (h2h & 0xFFFF) + (ch & 0xFFFF) + (c2 >>> 16);
61612      c4 = (h2h >>> 16) + (ch >>> 16) + (c3 >>> 16);
61613
61614      h2h = (c4 << 16) | (c3 & 0xFFFF);
61615      h2l = (c2 << 16) | (c1 & 0xFFFF);
61616
61617      c1 = (h3l & 0xFFFF) + (dl & 0xFFFF);
61618      c2 = (h3l >>> 16) + (dl >>> 16) + (c1 >>> 16);
61619      c3 = (h3h & 0xFFFF) + (dh & 0xFFFF) + (c2 >>
61619> 16);
61620      c4 = (h3h >>> 16) + (dh >>> 16) + (c3 >>> 16);
61621
61622      h3h = (c4 << 16) | (c3 & 0xFFFF);
61623      h3l = (c2 << 16) | (c1 & 0xFFFF);
61624
61625      c1 = (h4l & 0xFFFF) + (el & 0xFFFF);
61626      c2 = (h4l >>> 16) + (el >>> 16) + (c1 >>> 16);
61627      c3 = (h4h & 0xFFFF) + (eh & 0xFFFF) + (c2 >>> 16);
61628      c4 = (h4h >>> 16) + (eh >>> 16) + (c3 >>> 16);
61629
61630      h4h = (c4 << 16) | (c3 & 0xFFFF);
61631      h4l = (c2 << 16) | (c1 & 0xFFFF);
61632
61633      c1 = (h5l & 0xFFFF) + (fl & 0xFFFF);
61634      c2 = (h5l >>> 16) + (fl >>> 16) + (c1 >>> 16);
61635      c3 = (h5h & 0xFFFF) + (fh & 0xFFFF) + (c2 >>> 16);
61636      c4 = (h5h >>> 16) + (fh >>> 16) + (c3 >>> 16);
61637
61638      h5h = (c4 << 16) | (c3 & 0xFFFF);
61639      h5l = (c2 << 16) | (c1 & 0xFFFF);
61640
61641      c1 = (h6l & 0xFFFF) + (gl & 0xFFFF);
61642      c2 = (h6l >>> 16) + (gl >>> 16) + (c1 >>> 16);
61643      c3 = (h6h & 0xFFFF) + (gh & 0xFFFF) + (c2 >>> 16);
61644      c4 = (h6h >>> 16) + (gh >>> 16) + (c3 >>> 16);
61645
61646      h6h = (c4 << 16) | (c3 & 0xFFFF);
61647      h6l = (c2 << 16) | (c1 & 0xFFFF);
61648
61649      c1 = (h7l & 0xFFFF) + (hl & 0xFFFF);
61650      c2 = (h7l >>> 16) + (hl >>> 16) + (c1 >>> 16);
61651      c3 = (h7h & 0xFFFF) + (hh & 0xFFFF) + (c2 >>> 16);
61652      c4 = (h7h >>> 16) + (hh >>> 16) + (c3 >>> 16);
61653
61654      h7h = (c4 << 16) | (c3 & 0xFFFF);
61655      h7l = (c2 << 16) | (c1 & 0xFFFF);
61656    } while (!end);
61657
61658    var hex = HEX_CHARS[(h0h >> 28) & 0x0F] + HEX_CHARS[(h0h >> 24) & 0x0F] +
61659      HEX_CHARS[(h0h >> 20) & 0x0F] + HEX_CHARS[(h0h >> 16) & 0x0F] +
61660      HEX_CHARS[(h0h >> 12) & 0x0F] + HEX_CHARS[(h0h >> 8) & 0x0F] +
61661      HEX_CHARS[(h0h >> 4) & 0x0F] + HEX_CHARS[h0h & 0x0F] +
61662      HEX_CHARS[(h0l >> 28) & 0x0F] + HEX_CHARS[(h0l >> 24) & 0x0F] +
61663      HEX_CHARS[(h0l >> 20) & 0x0F] + HEX_CHARS[(h0l >> 16) & 0x0F] +
61664      HEX_CHARS[(h0l >> 12) & 0x0F] + HEX_CHARS[(h0l >> 8) & 0x0F] +
61665      HEX_CHARS[(h0l >> 4) & 0x0F] + HEX_CHARS[h0l & 0x0F] +
61666      HEX_CHARS[(h1h >> 28) & 0x0F] + HEX_CHARS[(h1h >> 24) & 0x0F] +
61667      HEX_CHARS[(h1h >> 20) & 0x0F] + HEX_CHARS[(h1h >> 16) & 0x0F] +
61668      HEX_CHARS[(h1h >> 12) & 0x0F] + HEX_CHARS[(h1h >> 8) & 0x0F] +
61669      HEX_CHARS[(h1h >> 4) & 0x0F] + HEX_CHARS[h1h & 0x0F] +
61670      HEX_CHARS[(h1l >> 28) & 0x0F] + HEX_CHARS[(h1l >> 24) & 0x0F] +
61671      HEX_CHARS[(h1l >> 20) & 0x0F] + HEX_CHARS[(h1l >> 16) & 0x0F] +
61672      HEX_CHARS[(h1l >> 12) & 0x0F] + HEX_CHARS[(h1l >> 8) & 0x0F] +
61673      HEX_CHARS[(h1l >> 4) & 0x0F] + HEX_CHARS[h1l & 0x0F] +
61674      HEX_CHARS[(h2h >> 28) & 0x0F] + HEX_CHARS[(h2h >> 24) & 0x0F] +
61675      HEX_CHARS[(h2h >> 20) & 0x0F] + HEX_CHARS[(h2h >> 16) & 0x0F] +
61676      HEX_CHARS[(h2h >> 12) & 0x0F] + HEX_CHARS[(h2h >> 8) & 0x0F] +
61677      HEX_CHARS[(h2h >> 4) & 0x0F] + HEX_CHARS[h2h & 0x0F] +
61678      HEX_CHARS[(h2l >> 28) & 0x0F] + HEX_CHARS[(h2l >> 24) & 0x0F] +
61679      HEX_CHARS[(h2l >> 20) & 0x0F] + HEX_CHARS[(h2l >> 16) & 0x0F] +
61680      HEX_CHARS[(h2l >> 12) & 0x0F] + HEX_CHARS[(h2l >> 8) & 0x0F] +
61681      HEX_CHARS[(h2l >> 4) & 0x0F] + HEX_CHARS[h2l & 0x0F] +
61682      HEX_CHARS[(h3h >> 28) & 0x0F] + HEX_CHARS[(h3h >> 24) & 0x0F] +
61683      HEX_CHARS[(h3h >> 20) & 0x0F] + HEX_CHARS[(h3h >> 16) & 0x0F] +
61684      HEX_CHARS[(h3h >> 12) & 0x0F] + HEX_CHARS[(h3h >> 8) & 0x0F] +
61685      HEX_CHARS[(h3h >> 4) & 0x0F] + HEX_CHARS[h3h & 0x0F];
61686    if (bits >= 256) {
61687      hex += HEX_CHARS[(h3l >> 28) & 0x0F] + HEX_CHARS[(h3l >> 24) & 0x0F] +
61688        HEX_CHARS[(h3l >> 20) & 0x0F] + HEX_CHARS[(h3l >> 16) & 0x0F] +
61689        HEX_CHARS[(h3l >> 12) & 0x0F] + HEX_CHARS[(h3l >> 8) & 0x0F] +
61690        HEX_CHARS[(h3l >> 4) & 0x0F] + HEX_CHARS[h3l & 0x0F];
61691    }
61692    if (bits >= 384) {
61693      hex += HEX_CHARS[(h4h >> 28) & 0x0F] + HEX_CHARS[(h4h >> 24) & 0x0F] +
61694        HEX_CHARS[(h4h >> 20) & 0x0F] + HEX_CHARS[(h4h >> 16) & 0x0F] +
61695        HEX_CHARS[(h4h >> 12) & 0x0F] + HEX_CHARS[(h4h >> 8) & 0x0F] +
61696        HEX_CHARS[(h4h >> 4) & 0x0F] + HEX_CHARS[h4h & 0x0F] +
61697        HEX_CHARS[(h4l >> 28) & 0x0F] + HEX_CHARS[(h4l >> 24) & 0x0F] +
61698        HEX_CHARS[(h4l >> 20) & 0x0F] + HEX_CHARS[(h4l >> 16) & 0x0F] +
61699        HEX_CHARS[(h4l >> 12) & 0x0F] + HEX_CHARS[(h4l >> 8) & 0x0F] +
61700        HEX_CHARS[(h4l >> 4) & 0x0F] + HEX_CHARS[h4l & 0x0F] +
61701        HEX_CHARS[(h5h >> 28) & 0x0F] + HEX_CHARS[(h5h >> 24) & 0x0F] +
61702        HEX_CHARS[(h5h >> 20) & 0x0F] + HEX_CHARS[(h5h >> 16) & 0x0F] +
61703        HEX_CHARS[(h5h >> 12) & 0x0F] + HEX_CHARS[(h5h >> 8) & 0x0F] +
61704        HEX_CHARS[(h5h >> 4) & 0x0F] + HEX_CHARS[h5h & 0x0F] +
61705        HEX_CHARS[(h5l >> 28) & 0x0F] + HEX_CHARS[(h5l >> 24) & 0x0F] +
61706        HEX_CHARS[(h5l >> 20) & 0x0F] + HEX_CHARS[(h5l >> 16) & 0x0F] +
61707        HEX_CHARS[(h5l >> 12) & 0x0F] + HEX_CHARS[(h5l >> 8) & 0x0F] +
61708        HEX_CHARS[(h5l >> 4) & 0x0F] + HEX_CHARS[h5l & 0x0F];
61709    }
61710    if (bits == 512) {
61711      hex += HEX_CHARS[(h6h >> 28) & 0x0F] + HEX_CHARS[(h6h >> 24) & 0x0F] +
61712        HEX_CHARS[(h6h >> 20) & 0x0F] + HEX_CHARS[(h6h >> 16) & 0x0F] +
61713        HEX_CHARS[(h6h >> 12) & 0x0F] + HEX_CHARS[(h6h >> 8) & 0x0F] +
61714        HEX_CHARS[(h6h >> 4) & 0x0F] + HEX_CHARS[h6h & 0x0F] +
61715        HEX_CHARS[(h6l >> 28) & 0x0F] + HEX_CHARS[(h6l >> 24) & 0x0F] +
61716        HEX_CHARS[(h6l >> 20) & 0x0F] + HEX_CHARS[(h6l >> 16) & 0x0F] +
61717        HEX_CHARS[(h6l >> 12) & 0x0F] + HEX_CHARS[(h6l >> 8) & 0x0F] +
61718        HEX_CHARS[(h6l >> 4) & 0x0F] + HEX_CHARS[h6l & 0x0F] +
61719        HEX_CHARS[(h7h >> 28) & 0x0F] + HEX_CHARS[(h7h >> 24) & 0x0F] +
61720        HEX_CHARS[(h7h >> 20) & 0x0F] + HEX_CHARS[(h7h >> 16) & 0x0F] +
61721        HEX_CHARS[(h7h >> 12) & 0x0F] + HEX_CHARS[(h7h >> 8) & 0x0F] +
61722        HEX_CHARS[(h7h >> 4) & 0x0F] + HEX_CHARS[h7h & 0x0F] +
61723        HEX_CHARS[(h7l >> 28) & 0x0F] + HEX_CHARS[(h7l >> 24) & 0x0F] +
61724        HEX_CHARS[(h7l >> 20) & 0x0F] + HEX_CHARS[(h7l >> 16) & 0x0F] +
61725        HEX_CHARS[(h7l >> 12) & 0x0F] + HEX_CHARS[(h7l >> 8) & 0x0F] +
61726        HEX_CHARS[(h7l >> 4) & 0x0F] + HEX_CHARS[h7l & 0x0F];
61727    }
61728    return hex;
61729  };
61730
61731  var exports = sha512;
61732  exports.sha512 = sha512;
61733  exports.sha384 = sha384;
61734  exports.sha512_256 = sha512_256;
61735  exports.sha512_224 = sha512_224;
61736
61737  if (COMMON_JS) {
61738    module.exports = exports;
61739  } else {
61740    root.sha512 = sha512;
61741    root.sha384 = sha384;
61742    root.sha512_256 = sha512_256;
61743    root.sha512_224 = sha512_224;
61744    if (AMD) {
61745      define(function () {
61746        return exports;
61747      });
61748    }
61749  }
61750})();
61751
61752/*!!! migrated to jQuery 1.9.1 !!!*/
61753
61754/*----------------------------------------------------------------------*/
61755/* wl_Breadcrumb v 1.0 by revaxarts.com
61756/* description: Makes and handles a Breadcrumb navigation
61757/* dependency: 
61758/*----------------------------------------------------------------------*/
61759
61760
61761$.fn.wl_Breadcrumb = function (method) {
61762
61763	var args = arguments;
61764	return this.each(function () {
61765
61766		var $this = $(this),
61767			$li = $this.find('li');
61768			$a = $this.find('a');
61769
61770
61771		if ($.fn.wl_Breadcrumb.methods[method]) {
61772			return $.fn.wl_Breadcrumb.methods[method].apply(this, Array.prototype.slice.call(args, 1));
61773		} else if (typeof method === 'object' || !method) {
61774			if ($this.data('wl_Breadcrumb')) {
61775				var opts = $.extend({}, $this.data('wl_Breadcrumb'), method);
61776			} else {
61777				var opts = $.extend({}, $.fn.wl_Breadcrumb.defaults, method, $this.data());
61778			}
61779		} else {
61780			$.error('Method "' + method + '" does not exist');
61781		}
61782		
61783		//get the current field or use the first if not set
61784		var $current = $this.find('a.active').eq(0);
61785		if (!$current.length) $current = $a.eq(opts.start);
61786
61787
61788		if (!$this.data('wl_Breadcrumb')) {
61789
61790			$this.data('wl_Breadcrumb', {});
61791
61792			//each anchor
61793			$a.each(function (i) {
61794				var _this = $(this);
61795				//save the id
61796				_this.data('id', i);
61797
61798				//prepend numbers if set
61799				if (opts.numbers) _this.text((i + 1) + '. ' + _this.text());
61800			});
61801
61802			//each listelement
61803			$li.each(function (i) {
61804				var _this = $(this);
61805				
61806				//if has a class (must be an icon)
61807				if (_this.attr('class')) {
61808					//innerwrap the anchor to attach the icon
61809					$a.eq(i).wrapInner('<span class="' + _this.attr('class') + '"/>');
61810					//remove the class from the list element
61811					_this.removeAttr('class');
61812				}
61813			});
61814			
61815			//add a 'last' class to the last element for IE :(
61816			if (navigator.appVersion.indexOf("MSIE") != -1) $li.filter(':last').addClass('last');
61817
61818			//Bind the click handler
61819			$this.delegate('a', 'click.wl_Breadcrumb', function () {
61820				var opts = $this.data('wl_Breadcrumb') || opts;
61821
61822				//if disabled stop
61823				if (opts.disabled) return false;
61824				var _this = $(this);
61825				
61826				//if not allownextonly or data is current+1 or current-x
61827				if (!opts.allownextonly || _this.data('id') - $this.find('a.active').data('id') <= 1) {
61828					
61829					//activate and trigger callback
61830					$.fn.wl_Breadcrumb.methods.activate.call($this[0], _this);
61831					opts.onChange.call($this[0], _this, _this.data('id'));
61832				}
61833				return false;
61834			});
61835
61836			//connected breadcrumb
61837			if (opts.connect) {
61838				var $connect = $('#' + opts.connect),
61839					$pages = $connect.children();
61840
61841				//bind event to all 'next' class elements
61842				$connect.find('.next').bind('click.wl_Breadcrumb', function () {
61843					$this.wl_Breadcrumb('next');
61844					return false;
61845				});
61846				//bind event to all 'prev' class elements
61847				$connect.find('.prev').bind('click.wl_Breadcrumb', function () {
61848					$this.wl_Breadcrumb('prev');
61849					return false;
61850				});
61851				
61852				//hide all and show the starting one
61853				$pages.hide().eq(opts.start).show();
61854
61855			}
61856			
61857			//disable if set
61858			if (opts.disabled) {
61859				$this.wl_Breadcrumb('disable');
61860			}
61861		} else {
61862
61863		}
61864
61865		if (opts) $.extend($this.data('wl_Breadcrumb'), opts);
61866
61867		//activate the current part
61868		$.fn.wl_Breadcrumb.methods.activate.call(this, $current);
61869	});
61870
61871};
61872
61873$.fn.wl_Breadcrumb.defaults = {
61874	start: 0,
61875	numbers: false,
61876	allownextonly: false,
61877	disabled: false,
61878	connect: null,
61879	onChange: function () {}
61880};
61881$.fn.wl_Breadcrumb.version = '1.0';
61882
61883
61884$.fn.wl_Breadcrumb.methods = {
61885	activate: function (element) {
61886		var $this = $(this);
61887		
61888		//element is a number so we mean the id
61889		if (typeof element === 'number') {
61890			element = $this.find('li').eq(element).find('a');
61891			element.trigger('click.wl_Breadcrumb');
61892			return false;
61893		}
61894		var _opts = $this.data('wl_Breadcrumb');
61895		//remove classes
61896		$this.find('a').removeClass('active previous');
61897		//find all previous tabs and add a class
61898		element.parent().prevAll().find('a').addClass('previous');
61899		//add and active class to the current tab
61900		element.addClass('active');
61901		//connected breadcrumb
61902		if (_opts.connect) {
61903			var $connect = $('#' + _opts.connect),
61904				$pages = $connect.children();
61905			//hide all and show selected
61906			$pages.hide().eq(element.data('id')).show();
61907		}
61908	},
61909	disable: function () {
61910		var $this = $(this);
61911		//disable and add class disable
61912		$this.wl_Breadcrumb('set', 'disabled', true);
61913		$this.addClass('disabled');
61914	},
61915	enable: function () {
61916		var $this = $(this);
61917		//enable and remove class disable
61918		$this.wl_Breadcrumb('set', 'disabled', false);
61919		$this.removeClass('disabled');
61920	},
61921	next: function () {
61922		var $this = $(this);
61923		//click next tab
61924		$this.find('a.active').parent().next().find('a').trigger('click.wl_Breadcrumb');
61925	},
61926	prev: function () {
61927		var $this = $(this);
61928		//click prev tab
61929		$this.find('a.active').parent().prev().find('a').trigger('click.wl_Breadcrumb');
61930	},
61931	set: function () {
61932		var $this = $(this),
61933			options = {};
61934		if (typeof arguments[0] === 'object') {
61935			options = arguments[0];
61936		} else if (arguments[0] && arguments[1] !== undefined) {
61937			options[arguments[0]] = arguments[1];
61938		}
61939		$.each(options, function (key, value) {
61940			if ($.fn.wl_Breadcrumb.defaults[key] !== undefined || $.fn.wl_Breadcrumb.defaults[key] == null) {
61941				$this.data('wl_Breadcrumb')[key] = value;
61942			} else {
61943				$.error('Key "' + key + '" is not defined');
61944			}
61945		});
61946
61947	}
61948};
61949/*----------------------------------------------------------------------*/
61950/* wl_Dialog v 1.1 by revaxarts.com
61951/* description: handles alert boxes, prompt boxes and confirm boxes and
61952/*				message boxes
61953/*				contains 4 plugins
61954/* dependency: jquery UI Dialog
61955/*----------------------------------------------------------------------*/
61956
61957
61958/*----------------------------------------------------------------------*/
61959/* Confirm Dialog
61960/* like the native confirm method
61961/*----------------------------------------------------------------------*/
61962$.confirm = function (text, callback, cancelcallback) {
61963
61964	var options = $.extend(true, {}, $.alert.defaults, $.confirm.defaults);
61965
61966	//nativ behaviour
61967	if (options.nativ) {
61968		if (result = confirm(unescape(text))) {
61969			if ($.isFunction(callback)) callback.call(this);
61970		} else {
61971			if ($.isFunction(cancelcallback)) cancelcallback.call(this);
61972		}
61973		return;
61974	}
61975
61976	//the callbackfunction
61977	var cb = function () {
61978			if ($.isFunction(callback)) callback.call(this);
61979			$(this).dialog('close');
61980			$('#wl_dialog').remove();
61981		},
61982
61983		//the callbackfunction on cancel
61984		ccb = function () {
61985			if ($.isFunction(cancelcallback)) cancelcallback.call(this);
61986			$(this).dialog('close');
61987			$('#wl_dialog').remove();
61988		};
61989
61990	//set some options
61991	options = $.extend({}, {
61992		buttons: [{
61993			text: options.text.ok,
61994			click: cb
61995		}, {
61996			text: options.text.cancel,
61997			click: ccb
61998		}]
61999	}, options);
62000
62001	//use the dialog
62002	return $.alert(unescape(text), options);
62003};
62004
62005$.confirm.defaults = {
62006	text: {
62007		header: 'Please confirm',
62008		ok: 'Yes',
62009		cancel: 'No'
62010	}
62011};
62012
62013/*----------------------------------------------------------------------*/
62014/* Prompt Dialog
62015/* like the native prompt method
62016/*----------------------------------------------------------------------*/
62017
62018$.prompt = function (text, value, callback, cancelcallback) {
62019
62020	var options = $.extend(true, {}, $.alert.defaults, $.prompt.defaults);
62021
62022	//nativ behaviour
62023	if (options.nativ) {
62024		var val = prompt(unescape($.trim(text)), unescape(value));
62025		if ($.isFunction(callback) && val !== null) {
62026			callback.call(this, val);
62027		} else {
62028			if ($.isFunction(cancelcallback)) cancelcallback.call(this);
62029		}
62030		return;
62031	}
62032
62033	//the callbackfunction
62034	var cb = function (value) {
62035			if ($.isFunction(callback)) callback.call(this, value);
62036			$(this).dialog('close');
62037			$('#wl_dialog').remove();
62038		},
62039
62040		//the callbackfunction on cancel
62041		ccb = function () {
62042			if ($.isFunction(cancelcallback)) cancelcallback.call(this);
62043			$(this).dialog('close');
62044			$('#wl_dialog').remove();
62045		};
62046
62047	//set some options
62048	options = $.extend({}, {
62049		buttons: [{
62050			text: options.text.ok,
62051			click: function () {
62052				cb.call(this, $('#wl_promptinputfield').val());
62053			}
62054		}, {
62055			text: options.text.cancel,
62056			click: ccb
62057		}],
62058		open: function () {
62059			$('#wl_promptinputfield').focus().select();
62060			$('#wl_promptinputfield').uniform();
62061			$('#wl_promptinputform').bind('submit', function (event) {
62062				event.preventDefault();
62063				cb.call(this, $('#wl_promptinputfield').val());
62064				$(this).parent().dialog('close');
62065				$('#wl_dialog').remove();
62066			});
62067
62068		}
62069	}, options);
62070
62071	//use the dialog
62072	return $.alert('<p>' + unescape(text) + '</p><form id="wl_promptinputform"><input id="wl_promptinputfield" name="wl_promptinputfield" value="' + unescape(value) + '"></form>', options);
62073};
62074
62075$.prompt.defaults = {
62076	text: {
62077		header: 'Please prompt',
62078		ok: 'OK',
62079		cancel: 'Cancel'
62080	}
62081};
62082
62083
62084/*----------------------------------------------------------------------*/
62085/* Alert Dialog
62086/* like the native alert method
62087/*----------------------------------------------------------------------*/
62088
62089$.alert = function (content, options) {
62090	//if no options it is a normal dialog
62091	if (!options) {
62092		var options = $.extend(true, {}, {
62093			buttons: [{
62094				text: $.alert.defaults.text.ok,
62095				click: function () {
62096					$(this).dialog('close');
62097					$('#wl_dialog').remove();
62098				}
62099			}]
62100		}, $.alert.defaults);
62101	}
62102
62103	//nativ behaviour
62104	if (options.nativ) {
62105		alert(content);
62106		return;
62107	}
62108
62109	//create a container
62110	var container = $('<div/>', {
62111		id: 'wl_dialog'
62112	}).appendTo('body');
62113
62114	//set a header
62115	if (options.text && options.text.header) 
62116		container.attr('title', options.text.header);
62117	else
62118	    container.attr('title', $.alert.defaults.text.header);
62119
62120	//fill the container
62121	container.html(content.replace(/\n/g, '<br>'));
62122	//display the dialog
62123	container.dialog(options);
62124	
62125	return{
62126		close:function(callback){
62127			container.dialog('close');
62128			container.remove();
62129			if($.isFunction(callback)) callback.call(this);
62130		},
62131		setHeader:function(text){
62132			this.set('title',text);
62133		},
62134		setBody:function(html){
62135			container.html(html);
62136		},
62137		set:function(option, value){
62138			container.dialog("option", option, value);
62139		},
62140        open: function () {
62141            container.dialog('open');
62142        },
62143	}
62144
62145
62146};
62147
62148
62149$.alert.defaults = {
62150	nativ: false,
62151	resizable: false,
62152	modal: true,
62153	text: {
62154		header: 'Notification',
62155		ok: 'OK'
62156	}
62157};
62158
62159
62160/*----------------------------------------------------------------------*/
62161/* Message Function
62162/*----------------------------------------------------------------------*/
62163
62164
62165$.msg = function (content, options) {
62166
62167
62168	//get the options
62169	var options = $.extend({}, $.msg.defaults, options);
62170
62171	var container = $('#wl_msg'),msgbox;
62172
62173	//the container doen't exists => create it
62174	if (!container.length) {
62175		container = $('<div/>', {
62176			id: 'wl_msg'
62177		}).appendTo('body').data('msgcount', 0);
62178		var topoffset = parseInt(container.css('top'), 10);
62179
62180		//bind some events to it
62181		container.bind('mouseenter', function () {
62182			container.data('pause', true);
62183		}).bind('mouseleave', function () {
62184			container.data('pause', false);
62185		});
62186		container.delegate('.msg-close', 'click', function () {
62187			container.data('pause', false);
62188			close($(this).parent());
62189		});
62190		container.delegate('.msg-box-close', 'click', function () {
62191			container.fadeOutSlide(options.fadeTime);
62192		});
62193
62194		//bind the scroll event
62195		$(window).unbind('scroll.wl_msg').bind('scroll.wl_msg', function () {
62196			var pos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
62197			if (pos > topoffset) {
62198				(window.navigator.standalone === undefined) ? container.css({
62199					position: 'fixed',
62200					top: 10
62201				}) : container.css({
62202					top: pos + 10
62203				});
62204			} else {
62205				(window.navigator.standalone === undefined) ? container.removeAttr('style') : container.css({
62206					top: topoffset
62207				});
62208			}
62209		}).trigger('scroll.wl_msg');
62210	}
62211	
62212	//stop if no content is set
62213	if(!content)return false;
62214
62215	//count of displayed messages
62216	var count = container.data('msgcount');
62217
62218	function getHTML(content, headline) {
62219		return '<div class="msg-box"><h3>' + (headline || '') + '</h3><a class="msg-close">close</a><div class="msg-content">' + content.replace('\n', '<br>') + '</div></div>';
62220	}
62221
62222	function create() {
62223		msgbox = $(getHTML(content, options.header)),
62224		closeall = $('.msg-box-close');
62225
62226		//we have some messages allready
62227		if (count) {
62228
62229			//No close all button
62230			if (!closeall.length) {
62231				msgbox.appendTo(container);
62232				$('<div class="msg-box-close">close all</div>').appendTo(container).fadeInSlide(options.fadeTime);
62233
62234				//Close all button
62235			} else {
62236				msgbox.insertBefore(closeall);
62237			}
62238
62239			//first message
62240		} else {
62241			msgbox.appendTo(container);
62242		}
62243
62244		//fade it in nicely
62245		msgbox.fadeInSlide(options.fadeTime);
62246
62247		//add the count of the messages to the container
62248		container.data('msgcount', ++count);
62249
62250		//outclose it only if it's not sticky
62251		if (!options.sticky) {
62252			close(msgbox, options.live);
62253		}
62254	}
62255
62256	function close(item, delay, callback) {
62257		if ($.isFunction(delay)){
62258			callback = delay;
62259			delay = 0;
62260		}else if(!delay){
62261			delay = 0;
62262		}
62263		setTimeout(function () {
62264
62265			//if the mouse isn't over the container
62266			if (!container.data('pause')) {
62267				item.fadeOutSlide(options.fadeTime, function () {
62268					var count = $('.msg-box').length;
62269					if (count < 2 && $('.msg-box-close').length) {
62270						$('.msg-box-close').fadeOutSlide(options.fadeTime);
62271					}
62272					container.data('msgcount', count);
62273					if($.isFunction(callback)) callback.call(item);
62274				})
62275				//try again...
62276			} else {
62277				close(item, delay);
62278			}
62279
62280		}, delay);
62281	}
62282
62283	//create the messsage
62284	create();
62285	
62286	return {
62287		close:function(callback){
62288			close(msgbox,callback);
62289		},
62290		setHeader:function(text){
62291			msgbox.find('h3').eq(0).text(text);
62292		},
62293		setBody:function(html){
62294			msgbox.find('.msg-content').eq(0).html(html);
62295		},
62296		closeAll:function(callback){
62297			container.fadeOutSlide(options.fadeTime, function(){
62298				if($.isFunction(callback)) callback.call(this);
62299			});
62300		}	
62301	}
62302
62303};
62304
62305$.msg.defaults = {
62306	header: null,
62307	live: 5000,
62308	topoffset: 90,
62309	fadeTime: 500,
62310	sticky: false
62311};
62312
62313//initial call to prevent IE to jump to the top
62314$(document).ready(function() {$.msg(false);});
62315
62316/*!!! migrated to jQuery 1.9.1 !!!*/
62317
62318/*----------------------------------------------------------------------*/
62319/* wl_Store v 1.0 by revaxarts.com
62320/* description: Uses LocalStorage to save information within the Browser
62321/*				enviroment
62322/* dependency:  >IE7 :)
62323/*----------------------------------------------------------------------*/
62324
62325
62326$.wl_Store = function (namespace) {
62327
62328		//IE7 isn't a cool client :(
62329	var coolClient = (typeof window.localStorage !== 'undefined' && typeof JSON !== 'undefined'),
62330		//namespace for the storage
62331		namespace = namespace || 'wl_store',
62332
62333
62334		loc = {
62335
62336			//method to save data
62337			save: function (key, value) {
62338				var _save;
62339				if (typeof key !== 'object') {
62340					var _current = get() || {};
62341					var _obj = {};
62342					_obj[key] = value;
62343					_save = $.extend({}, _current, _obj);
62344				} else {
62345					_save = key;
62346				}
62347				localStorage[namespace] = JSON.stringify(_save);
62348				return true;
62349			},
62350			
62351			//method to get data
62352			get: function (key) {
62353				if (!localStorage[namespace])
62354					return null;
62355
62356				var _obj = $.parseJSON(localStorage[namespace]);
62357
62358				if (typeof key !== 'undefined' && _obj) {
62359					return _obj[key];
62360				}
62361				return _obj;
62362			},
62363			
62364			//method to remove data
62365			remove: function (key) {
62366				var obj = get();
62367				if (typeof key !== 'undefined' && obj[key]) {
62368					delete obj[key];
62369					for (var i in obj) {
62370						var notempty = true;
62371						break;
62372					}
62373					if (notempty) {
62374						save(obj);
62375						return true;
62376					}
62377				}
62378				localStorage.removeItem(namespace);
62379				return true;
62380			},
62381			
62382			//delete all saved data
62383			flush: function () {
62384				localStorage.clear();
62385				return true;
62386			}
62387		},
62388
62389		//IE 7 can't handle localStorage but cookies are to bad for storing huge data
62390		cok = {
62391			save: function (key, value) {
62392				return false;
62393			},
62394			get: function (key) {
62395				return false;
62396			},
62397			remove: function (key) {
62398				return false;
62399			},
62400			flush: function () {
62401				return false;
62402			}
62403		},
62404		save = function (key, value) {
62405			return (coolClient) ? loc.save(key, value) : cok.save(key, value);
62406		},
62407
62408		remove = function (key) {
62409			return (coolClient) ? loc.remove(key) : cok.remove(key);
62410		},
62411
62412		flush = function () {
62413			return (coolClient) ? loc.flush() : cok.flush();
62414		},
62415
62416		get = function (key) {
62417			return (coolClient) ? loc.get(key) : cok.get(key);
62418		};
62419
62420	//public methods
62421	return {
62422		save: function (key, value) {
62423			return save(key, value);
62424		},
62425		get: function (key) {
62426			return get(key);
62427		},
62428		remove: function (key) {
62429			return remove(key);
62430		},
62431		flush: function () {
62432			return flush();
62433		}
62434
62435	}
62436
62437
62438};
62439/*----------------------------------------------------------------------*/
62440/* wl_Widget v 1.1 by revaxarts.com
62441/* description: handles all function for the widgets
62442/* dependency: wl_Store, jquery sortable a.d.
62443/*----------------------------------------------------------------------*/
62444
62445
62446$.fn.wl_Widget = function (method) {
62447
62448	var args = arguments;
62449	return this.each(function () {
62450
62451		var $this = $(this);
62452
62453		if ($.fn.wl_Widget.methods[method]) {
62454			return $.fn.wl_Widget.methods[method].apply(this, Array.prototype.slice.call(args, 1));
62455		} else if (typeof method === 'object' || !method) {
62456			if ($this.data('wl_Widget')) {
62457				var opts = $.extend({}, $this.data('wl_Widget'), method);
62458			} else {
62459				var opts = $.extend({}, $.fn.wl_Widget.defaults, method, $this.data());
62460			}
62461		} else {
62462			$.error('Method "' + method + '" does not exist');
62463		}
62464
62465
62466		if (!$this.data('wl_Widget')) {
62467
62468			$this.data('wl_Widget', {});
62469
62470			//find the widgets within the conatainer
62471			var $widgets = $this.find('div.widget');
62472
62473			//iterate thru the widgets
62474			$widgets.each(function () {
62475				var $widget = $(this),
62476					_opts = $.extend({}, opts, $widget.data()),
62477					$handle = $widget.find('h3.handle'),
62478					$content = $widget.find('div').eq(0),
62479					$container = $widget.parent();
62480
62481				$widget.data('wl_Widget', {});
62482
62483				//set an icon
62484				if (_opts.icon) {
62485					$handle.addClass('icon');
62486					$('<a>', {
62487						'class': 'icon i_' + _opts.icon
62488					}).appendTo($handle);
62489				}
62490				
62491				//if sortable add a class
62492				if (_opts.sortable) {
62493					$widget.addClass('sortable');
62494				}
62495				
62496				//if collapseable
62497				if(_opts.collapseable){
62498					//add the collapse button
62499					$('<a>', {
62500						'class': 'collapse',
62501						'title': _opts.text.collapse
62502					}).appendTo($handle);
62503				
62504					//collapse if set
62505					if (_opts.collapsed) {
62506						$content.hide();
62507						$widget.addClass('collapsed');
62508						$handle.find('a.collapse').attr('title',_opts.text.expand);
62509					}
62510					
62511					
62512					//handle the collapse button (touchstart is required for iOS devices)
62513					$handle.delegate('a.collapse', 'click.wl_Widget touchstart.wl_Widget', function (event) {
62514						var _opts = $widget.data('wl_Widget') || _opts,
62515							_content = $widget.find('div').eq(0);
62516						
62517						if (_content.is(':hidden')) {
62518							
62519							//expand hidden content
62520							_content.slideDown(100, function () {
62521								$widget.removeClass('collapsed').data('wl_Widget').collapsed = false;
62522								$handle.find('a.collapse').attr('title',_opts.text.collapse);
62523								//callback
62524								_opts.onExpand.call($widget[0]);
62525								//save
62526								$.fn.wl_Widget.methods.save();
62527								
62528								//trigger resize for some plugins
62529								$(window).resize();
62530							});
62531						} else {
62532							
62533							//hide content
62534							$content.slideUp(100, function () {
62535								$widget.addClass('collapsed').data('wl_Widget').collapsed = true;
62536								$handle.find('a.collapse').attr('title',_opts.text.expand);
62537								//callback
62538								_opts.onCollapse.call($widget[0]);
62539								//save
62540								$.fn.wl_Widget.methods.save();
62541							});
62542						}
62543						return false;
62544						
62545					//doublclick is equal to collapse button
62546					}).bind('dblclick', function () {
62547						$handle.find('a.collapse').trigger('click');
62548						return false;
62549					});
62550				
62551				}
62552				
62553				//handle the reload button (touchstart is required for iOS devices)
62554				$handle.delegate('a.reload', 'click.wl_Widget touchstart.wl_Widget', function (event) {
62555					var _opts = $widget.data('wl_Widget') || _opts,
62556						_content = $widget.find('div').eq(0);
62557						
62558					$widget.addClass('loading');
62559					//set height to prevent "jumping"
62560					_content.height($content.height());
62561					
62562					//removeContent and replace it with a loading information
62563					if (_opts.removeContent) {
62564						_content.html(_opts.text.loading);
62565					}
62566					_content.load(_opts.load, function (response, status, xhr) {
62567						$widget.removeClass('loading');
62568						_content.height('auto');
62569						
62570						//error occured
62571						if (status == "error") {
62572							_content.html(xhr.status + " " + xhr.statusText);
62573						}
62574						
62575						//autoreload is set
62576						if (_opts.reload) {
62577							clearTimeout($widget.data('wl_Widget').timeout);
62578							$widget.data('wl_Widget').timeout = setTimeout(function () {
62579								$handle.find('a.reload').trigger('click.wl_Widget');
62580							}, _opts.reload * 1000);
62581						}
62582					});
62583					return false;
62584					
62585				});
62586
62587				//prevent other anochrs to bubble up the DOM
62588				$handle.delegate('a', 'click.wl_Widget', function (event) {
62589					event.stopPropagation();
62590					return false;
62591				});
62592
62593				if (_opts) $.extend($widget.data('wl_Widget'), _opts);
62594
62595				//ajax widgets get a reload button
62596				if (_opts.load) {
62597					$('<a>', {
62598						'class': 'reload',
62599						'title': _opts.text.reload
62600					}).appendTo($handle).trigger('click.wl_Widget');
62601				}
62602			});
62603
62604			
62605			//Handling sortable and restoring positions
62606			
62607			
62608			var $maincontent = $('#content');
62609
62610			//save the total count of widgets
62611			if (!$maincontent.data('wl_Widget')) {
62612				$maincontent.data('wl_Widget', {
62613					containercount: $('div.widgets').length,
62614					currentid: 1
62615				});
62616			}
62617
62618			//if all widgets are initialized
62619			if ($maincontent.data('wl_Widget').currentid++ >= $maincontent.data('wl_Widget').containercount) {
62620
62621				var $container = $('div.widgets');
62622
62623				//get data from the storage
62624				var wl_Store = new $.wl_Store('wl_' + location.pathname.toString());
62625				
62626				//iterate thru the containers
62627				$container.each(function (i, cont) {
62628					var widgets = wl_Store.get('widgets_' + i),
62629						$cont = $(this);
62630					if (!widgets || !$.isArray(widgets)) return false;
62631					
62632					//iterate thru the widgets from the container id i
62633					$.each(widgets, function (widget, options) {
62634
62635						var _widget = $('#' + widget);
62636
62637						//widget should be collpased
62638						(options.collapsed && _widget.data('wl_Widget').collapseable) ? _widget.addClass('collapsed').find('div').eq(0).hide().data('wl_Widget', {
62639							collapsed: true
62640						}) : _widget.removeClass('collapsed').find('div').eq(0).show().data('wl_Widget', {
62641							collapsed: false
62642						});
62643
62644						//position handling
62645						if (_widget.length && (_widget.prevAll('div').length != options.position || _widget.parent()[0] !== $cont[0])) {
62646							children = $cont.children('div.widget');
62647							if (children.eq(options.position).length) {
62648								_widget.insertBefore(children.eq(options.position));
62649							} else if (children.length) {
62650								_widget.insertAfter(children.eq(options.position - 1));
62651							} else {
62652								_widget.appendTo($cont);
62653							}
62654						}
62655					});
62656				});
62657				
62658				
62659				//use jQuery UI sortable plugin for the widget sortable function
62660				$container.sortable({
62661					items: $container.find('div.widget.sortable'),
62662					containment: '#content',
62663					opacity: 0.8,
62664					distance: 5,
62665					handle: 'h3.handle',
62666					connectWith: $container,
62667					forceHelperSize: true,
62668					placeholder: 'sortable_placeholder',
62669					forcePlaceholderSize: true,
62670					zIndex: 10000,
62671					start: function (event, ui) {
62672						ui.item.data('wl_Widget').onDrag.call(ui.item[0]);
62673					},
62674					stop: function (event, ui) {
62675						ui.item.data('wl_Widget').onDrop.call(ui.item[0]);
62676						$.fn.wl_Widget.methods.save();
62677					}
62678				});
62679
62680
62681
62682			}
62683
62684
62685		} else {
62686
62687		}
62688		if (opts) $.extend($this.data('wl_Widget'), opts);
62689	});
62690
62691};
62692
62693$.fn.wl_Widget.defaults = {
62694	collapsed: false,
62695	load: null,
62696	reload: false,
62697	removeContent: true,
62698	collapseable: true,
62699	sortable: true,
62700	text: {
62701		loading: 'loading...',
62702		reload: 'reload',
62703		collapse: 'collapse widget',
62704		expand: 'expand widget'
62705	},
62706	onDrag: function () {},
62707	onDrop: function () {},
62708	onExpand: function () {},
62709	onCollapse: function () {}
62710};
62711$.fn.wl_Widget.version = '1.1';
62712
62713
62714$.fn.wl_Widget.methods = {
62715	save: function () {
62716
62717		var $containers = $('div.widgets'),
62718			wl_Store = new $.wl_Store('wl_' + location.pathname.toString());
62719			
62720		//iterate thru the containers
62721		$containers.each(function (containerid, e) {
62722			var _widgets = {};
62723			
62724			//get info from all widgets from that container
62725			$(this).find('div.widget').each(function (pos, e) {
62726				var _t = $(this);
62727				_widgets[this.id] = {
62728					position: pos,
62729					collapsed: _t.find('div').eq(0).is(':hidden')
62730				};
62731			});
62732			
62733			//store the info
62734			wl_Store.save('widgets_' + containerid, _widgets);
62735		});
62736
62737	},
62738	set: function () {
62739		var $this = $(this),
62740			options = {};
62741		if (typeof arguments[0] === 'object') {
62742			options = arguments[0];
62743		} else if (arguments[0] && arguments[1] !== undefined) {
62744			options[arguments[0]] = arguments[1];
62745		}
62746		$.each(options, function (key, value) {
62747			if ($.fn.wl_Widget.defaults[key] !== undefined || $.fn.wl_Widget.defaults[key] == null) {
62748				$this.data('wl_Widget')[key] = value;
62749			} else {
62750				$.error('Key "' + key + '" is not defined');
62751			}
62752		});
62753
62754	}
62755};
62756!function(t,n,r){"use strict";!function(t){function __webpack_require__(r){if(n[r])return n[r].exports;var e=n[r]={i:r,l:!1,exports:{}};return t[r].call(e.exports,e,e.exports,__webpack_require__),e.l=!0,e.exports}var n={};__webpack_require__.m=t,__webpack_require__.c=n,__webpack_require__.d=function(t,n,r){__webpack_require__.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},__webpack_require__.n=function(t){var n=t&&t.__esModule?function getDefault(){return t["default"]}:function getModuleExports(){return t};return __webpack_require__.d(n,"a",n),n},__webpack_require__.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=128)}([function(t,n,e){var i=e(2),o=e(18),u=e(13),c=e(14),f=e(19),a=function(t,n,e){var s,l,h,p,v=t&a.F,g=t&a.G,y=t&a.S,d=t&a.P,_=t&a.B,b=g?i:y?i[n]||(i[n]={}):(i[n]||{}).prototype,S=g?o:o[n]||(o[n]={}),m=S.prototype||(S.prototype={});g&&(e=n);for(s in e)h=((l=!v&&b&&b[s]!==r)?b:e)[s],p=_&&l?f(h,i):d&&"function"==typeof h?f(Function.call,h):h,b&&c(b,s,h,t&a.U),S[s]!=h&&u(S,s,p),d&&m[s]!=h&&(m[s]=h)};i.core=o,a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},function(t,n,r){var e=r(4);t.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},function(t,r){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof n&&(n=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(n){return!0}}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,r){var e=r(50)("wks"),i=r(35),o=r(2).Symbol,u="function"==typeof o;(t.exports=function(t){return e[t]||(e[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=e},function(t,n,r){var e=r(1),i=r(94),o=r(22),u=Object.defineProperty;n.f=r(7)?Object.defineProperty:function defineProperty(t,n,r){if(e(t),n=o(n,!0),e(r),i)try{return u(t,n,r)}catch(c){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[n]=r.value),t}},function(t,n,r){t.exports=!r(3)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,r){var e=r(24),i=Math.min;t.exports=function(t){return t>0?i(e(t),9007199254740991):0}},function(t,n,r){var e=r(23);t.exports=function(t){return Object(e(t))}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n,r){var e=r(47),i=r(23);t.exports=function(t){return e(i(t))}},function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},function(t,n,r){var e=r(6),i=r(31);t.exports=r(7)?function(t,n,r){return e.f(t,n,i(1,r))}:function(t,n,r){return t[n]=r,t}},function(t,n,r){var e=r(2),i=r(13),o=r(12),u=r(35)("src"),c=Function.toString,f=(""+c).split("toString");r(18).inspectSource=function(t){return c.call(t)},(t.exports=function(t,n,r,c){var a="function"==typeof r;a&&(o(r,"name")||i(r,"name",n)),t[n]!==r&&(a&&(o(r,u)||i(r,u,t[n]?""+t[n]:f.join(String(n)))),t===e?t[n]=r:c?t[n]?t[n]=r:i(t,n,r):(delete t[n],i(t,n,r)))})(Function.prototype,"toString",function toString(){return"function"==typeof this&&this[u]||c.call(this)})},function(t,n,r){var e=r(48),i=r(31),o=r(11),u=r(22),c=r(12),f=r(94),a=Object.getOwnPropertyDescriptor;n.f=r(7)?a:function getOwnPropertyDescriptor(t,n){if(t=o(t),n=u(n,!0),f)try{return a(t,n)}catch(r){}if(c(t,n))return i(!e.f.call(t,n),t[n])}},function(t,n,r){var e=r(12),i=r(9),o=r(68)("IE_PROTO"),u=Object.prototype;
vendor: 4,559 bytes, line 62756
62756t.exports=Object.getPrototypeOf||function(t){return t=i(t),e(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,r){var e=r(0),i=r(3),o=r(23),u=/"/g,c=function(t,n,r,e){var i=String(o(t)),c="<"+n;return""!==r&&(c+=" "+r+'="'+String(e).replace(u,"&quot;")+'"'),c+">"+i+"</"+n+">"};t.exports=function(t,n){var r={};r[t]=n(c),e(e.P+e.F*i(function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}),"String",r)}},function(n,r){var e=n.exports={version:"2.5.1"};"number"==typeof t&&(t=e)},function(t,n,e){var i=e(10);t.exports=function(t,n,e){if(i(t),n===r)return t;switch(e){case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,i){return t.call(n,r,e,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n,r){var e=r(3);t.exports=function(t,n){return!!t&&e(function(){n?t.call(null,function(){},1):t.call(null)})}},function(t,n,r){var e=r(4);t.exports=function(t,n){if(!e(t))return t;var r,i;if(n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;if("function"==typeof(r=t.valueOf)&&!e(i=r.call(t)))return i;if(!n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,n){t.exports=function(t){if(t==r)throw TypeError("Can't call method on  "+t);return t}},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n,r){var e=r(0),i=r(18),o=r(3);t.exports=function(t,n){var r=(i.Object||{})[t]||Object[t],u={};u[t]=n(r),e(e.S+e.F*o(function(){r(1)}),"Object",u)}},function(t,n,e){var i=e(19),o=e(47),u=e(9),c=e(8),f=e(84);t.exports=function(t,n){var e=1==t,a=2==t,s=3==t,l=4==t,h=6==t,p=5==t||h,v=n||f;return function(n,f,g){for(var y,d,_=u(n),b=o(_),S=i(f,g,3),m=c(b.length),x=0,w=e?v(n,m):a?v(n,0):r;m>x;x++)if((p||x in b)&&(y=b[x],d=S(y,x,_),t))if(e)w[x]=d;else if(d)switch(t){case 3:return!0;case 5:return y;case 6:return x;case 2:w.push(y)}else if(l)return!1;return h?-1:s||l?l:w}}},function(t,n,r){var e=r(96),i=r(69);t.exports=Object.keys||function keys(t){return e(t,i)}},function(t,n,e){var i=e(1),o=e(97),u=e(69),c=e(68)("IE_PROTO"),f=function(){},a=function(){var t,n=e(66)("iframe"),r=u.length;for(n.style.display="none",e(70).appendChild(n),n.src="javascript:",(t=n.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),a=t.F;r--;)delete a.prototype[u[r]];return a()};t.exports=Object.create||function create(t,n){var e;return null!==t?(f.prototype=i(t),e=new f,f.prototype=null,e[c]=t):e=a(),n===r?e:o(e,n)}},function(t,n,e){if(e(7)){var i=e(36),o=e(2),u=e(3),c=e(0),f=e(62),a=e(92),s=e(19),l=e(42),h=e(31),p=e(13),v=e(43),g=e(24),y=e(8),d=e(117),_=e(37),b=e(22),S=e(12),m=e(39),x=e(4),w=e(9),E=e(82),O=e(28),P=e(16),M=e(38).f,F=e(49),I=e(35),A=e(5),k=e(26),N=e(51),j=e(60),T=e(86),R=e(40),D=e(57),L=e(41),W=e(85),C=e(108),U=e(6),G=e(15),B=U.f,V=G.f,q=o.RangeError,z=o.TypeError,K=o.Uint8Array,J=Array.prototype,Y=a.ArrayBuffer,H=a.DataView,X=k(0),$=k(2),Z=k(3),Q=k(4),tt=k(5),nt=k(6),rt=N(!0),et=N(!1),it=T.values,ot=T.keys,ut=T.entries,ct=J.lastIndexOf,ft=J.reduce,at=J.reduceRight,st=J.join,lt=J.sort,ht=J.slice,pt=J.toString,vt=J.toLocaleString,gt=A("iterator"),yt=A("toStringTag"),dt=I("typed_constructor"),_t=I("def_constructor"),bt=f.CONSTR,St=f.TYPED,mt=f.VIEW,xt=k(1,function(t,n){return Mt(j(t,t[_t]),n)}),wt=u(function(){return 1===new K(new Uint16Array([1]).buffer)[0]}),Et=!!K&&!!K.prototype.set&&u(function(){new K(1).set({})}),Ot=function(t,n){var r=g(t);if(r<0||r%n)throw q("Wrong offset!");return r},Pt=function(t){if(x(t)&&St in t)return t;throw z(t+" is not a typed array!")},Mt=function(t,n){if(!(x(t)&&dt in t))throw z("It is not a typed array constructor!");return new t(n)},Ft=function(t,n){return It(j(t,t[_t]),n)},It=function(t,n){for(var r=0,e=n.length,i=Mt(t,e);e>r;)i[r]=n[r++];return i},At=function(t,n,r){B(t,n,{get:function(){return this._d[r]}})},kt=function from(t){var n,e,i,o,u,c,f=w(t),a=arguments.length,l=a>1?arguments[1]:r,h=l!==r,p=F(f);if(p!=r&&!E(p)){for(c=p.call(f),i=[],n=0;!(u=c.next()).done;n++)i.push(u.value);f=i}for(h&&a>2&&(l=s(l,arguments[2],2)),n=0,e=y(f.length),o=Mt(this,e);e>n;n++)o[n]=h?l(f[n],n):f[n];return o},Nt=function of(){for(var t=0,n=arguments.length,r=Mt(this,n);n>t;)r[t]=arguments[t++];return r},jt=!!K&&u(function(){vt.call(new K(1))}
vendor: 1,109 bytes, line 62756
62756),Tt=function toLocaleString(){return vt.apply(jt?ht.call(Pt(this)):Pt(this),arguments)},Rt={copyWithin:function copyWithin(t,n){return C.call(Pt(this),t,n,arguments.length>2?arguments[2]:r)},every:function every(t){return Q(Pt(this),t,arguments.length>1?arguments[1]:r)},fill:function fill(t){return W.apply(Pt(this),arguments)},filter:function filter(t){return Ft(this,$(Pt(this),t,arguments.length>1?arguments[1]:r))},find:function find(t){return tt(Pt(this),t,arguments.length>1?arguments[1]:r)},findIndex:function findIndex(t){return nt(Pt(this),t,arguments.length>1?arguments[1]:r)},forEach:function forEach(t){X(Pt(this),t,arguments.length>1?arguments[1]:r)},indexOf:function indexOf(t){return et(Pt(this),t,arguments.length>1?arguments[1]:r)},includes:function includes(t){return rt(Pt(this),t,arguments.length>1?arguments[1]:r)},join:function join(t){return st.apply(Pt(this),arguments)},lastIndexOf:function lastIndexOf(t){return ct.apply(Pt(this),arguments)},map:function map(t){return xt(Pt(this),t,arguments.length>1?arguments[1]:r)},reduce:function reduce(t){return ft.apply(Pt(this),arguments)}
vendor: 1,238 bytes, line 62756
62756,reduceRight:function reduceRight(t){return at.apply(Pt(this),arguments)},reverse:function reverse(){for(var t,n=this,r=Pt(n).length,e=Math.floor(r/2),i=0;i<e;)t=n[i],n[i++]=n[--r],n[r]=t;return n},some:function some(t){return Z(Pt(this),t,arguments.length>1?arguments[1]:r)},sort:function sort(t){return lt.call(Pt(this),t)},subarray:function subarray(t,n){var e=Pt(this),i=e.length,o=_(t,i);return new(j(e,e[_t]))(e.buffer,e.byteOffset+o*e.BYTES_PER_ELEMENT,y((n===r?i:_(n,i))-o))}},Dt=function slice(t,n){return Ft(this,ht.call(Pt(this),t,n))},Lt=function set(t){Pt(this);var n=Ot(arguments[1],1),r=this.length,e=w(t),i=y(e.length),o=0;if(i+n>r)throw q("Wrong length!");for(;o<i;)this[n+o]=e[o++]},Wt={entries:function entries(){return ut.call(Pt(this))},keys:function keys(){return ot.call(Pt(this))},values:function values(){return it.call(Pt(this))}},Ct=function(t,n){return x(t)&&t[St]&&"symbol"!=typeof n&&n in t&&String(+n)==String(n)},Ut=function getOwnPropertyDescriptor(t,n){return Ct(t,n=b(n,!0))?h(2,t[n]):V(t,n)},Gt=function defineProperty(t,n,r){return!(Ct(t,n=b(n,!0))&&x(r)&&S(r,"value"))||S(r,"get")||S(r,"set")||r.configurable||S(r,"writable")&&!r.writable||S(r,"enumerable")&&!r.enumerable?B(t,n,r):(t[n]=r.value,t)};
vendor: 14,327 bytes, line 62756
62756bt||(G.f=Ut,U.f=Gt),c(c.S+c.F*!bt,"Object",{getOwnPropertyDescriptor:Ut,defineProperty:Gt}),u(function(){pt.call({})})&&(pt=vt=function toString(){return st.call(this)});var Bt=v({},Rt);v(Bt,Wt),p(Bt,gt,Wt.values),v(Bt,{slice:Dt,set:Lt,constructor:function(){},toString:pt,toLocaleString:Tt}),At(Bt,"buffer","b"),At(Bt,"byteOffset","o"),At(Bt,"byteLength","l"),At(Bt,"length","e"),B(Bt,yt,{get:function(){return this[St]}}),t.exports=function(t,n,e,a){var s=t+((a=!!a)?"Clamped":"")+"Array",h="get"+t,v="set"+t,g=o[s],_=g||{},b=g&&P(g),S=!g||!f.ABV,w={},E=g&&g.prototype,F=function(t,r){var e=t._d;return e.v[h](r*n+e.o,wt)},I=function(t,r,e){var i=t._d;a&&(e=(e=Math.round(e))<0?0:e>255?255:255&e),i.v[v](r*n+i.o,e,wt)},A=function(t,n){B(t,n,{get:function(){return F(this,n)},set:function(t){return I(this,n,t)},enumerable:!0})};S?(g=e(function(t,e,i,o){l(t,g,s,"_d");var u,c,f,a,h=0,v=0;if(x(e)){if(!(e instanceof Y||"ArrayBuffer"==(a=m(e))||"SharedArrayBuffer"==a))return St in e?It(g,e):kt.call(g,e);u=e,v=Ot(i,n);var _=e.byteLength;if(o===r){if(_%n)throw q("Wrong length!");if((c=_-v)<0)throw q("Wrong length!")}else if((c=y(o)*n)+v>_)throw q("Wrong length!");f=c/n}else f=d(e),u=new Y(c=f*n);for(p(t,"_d",{b:u,o:v,l:c,e:f,v:new H(u)});h<f;)A(t,h++)}),E=g.prototype=O(Bt),p(E,"constructor",g)):u(function(){g(1)})&&u(function(){new g(-1)})&&D(function(t){new g,new g(null),new g(1.5),new g(t)},!0)||(g=e(function(t,e,i,o){l(t,g,s);var u;return x(e)?e instanceof Y||"ArrayBuffer"==(u=m(e))||"SharedArrayBuffer"==u?o!==r?new _(e,Ot(i,n),o):i!==r?new _(e,Ot(i,n)):new _(e):St in e?It(g,e):kt.call(g,e):new _(d(e))}),X(b!==Function.prototype?M(_).concat(M(b)):M(_),function(t){t in g||p(g,t,_[t])}),g.prototype=E,i||(E.constructor=g));var k=E[gt],N=!!k&&("values"==k.name||k.name==r),j=Wt.values;p(g,dt,!0),p(E,St,s),p(E,mt,!0),p(E,_t,g),(a?new g(1)[yt]==s:yt in E)||B(E,yt,{get:function(){return s}}),w[s]=g,c(c.G+c.W+c.F*(g!=_),w),c(c.S,s,{BYTES_PER_ELEMENT:n}),c(c.S+c.F*u(function(){_.of.call(g,1)}),s,{from:kt,of:Nt}),"BYTES_PER_ELEMENT"in E||p(E,"BYTES_PER_ELEMENT",n),c(c.P,s,Rt),L(s),c(c.P+c.F*Et,s,{set:Lt}),c(c.P+c.F*!N,s,Wt),i||E.toString==pt||(E.toString=pt),c(c.P+c.F*u(function(){new g(1).slice()}),s,{slice:Dt}),c(c.P+c.F*(u(function(){return[1,2].toLocaleString()!=new g([1,2]).toLocaleString()})||!u(function(){E.toLocaleString.call([1,2])})),s,{toLocaleString:Tt}),R[s]=N?k:j,i||N||p(E,gt,j)}}else t.exports=function(){}},function(t,n,e){var i=e(112),o=e(0),u=e(50)("metadata"),c=u.store||(u.store=new(e(115))),f=function(t,n,e){var o=c.get(t);if(!o){if(!e)return r;c.set(t,o=new i)}var u=o.get(n);if(!u){if(!e)return r;o.set(n,u=new i)}return u};t.exports={store:c,map:f,has:function(t,n,e){var i=f(n,e,!1);return i!==r&&i.has(t)},get:function(t,n,e){var i=f(n,e,!1);return i===r?r:i.get(t)},set:function(t,n,r,e){f(r,e,!0).set(t,n)},keys:function(t,n){var r=f(t,n,!1),e=[];return r&&r.forEach(function(t,n){e.push(n)}),e},key:function(t){return t===r||"symbol"==typeof t?t:String(t)},exp:function(t){o(o.S,"Reflect",t)}}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n,r){var e=r(35)("meta"),i=r(4),o=r(12),u=r(6).f,c=0,f=Object.isExtensible||function(){return!0},a=!r(3)(function(){return f(Object.preventExtensions({}))}),s=function(t){u(t,e,{value:{i:"O"+ ++c,w:{}}})},l=t.exports={KEY:e,NEED:!1,fastKey:function(t,n){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!o(t,e)){if(!f(t))return"F";if(!n)return"E";s(t)}return t[e].i},getWeak:function(t,n){if(!o(t,e)){if(!f(t))return!0;if(!n)return!1;s(t)}return t[e].w},onFreeze:function(t){return a&&l.NEED&&f(t)&&!o(t,e)&&s(t),t}}},function(t,n,e){var i=e(5)("unscopables"),o=Array.prototype;o[i]==r&&e(13)(o,i,{}),t.exports=function(t){o[i][t]=!0}},function(t,n,r){var e=r(19),i=r(106),o=r(82),u=r(1),c=r(8),f=r(49),a={},s={};(n=t.exports=function(t,n,r,l,h){var p,v,g,y,d=h?function(){return t}:f(t),_=e(r,l,n?2:1),b=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(o(d)){for(p=c(t.length);p>b;b++)if((y=n?_(u(v=t[b])[0],v[1]):_(t[b]))===a||y===s)return y}else for(g=d.call(t);!(v=g.next()).done;)if((y=i(g,_,v.value,n))===a||y===s)return y}).BREAK=a,n.RETURN=s},function(t,n){var e=0,i=Math.random();t.exports=function(t){return"Symbol(".concat(t===r?"":t,")_",(++e+i).toString(36))}},function(t,n){t.exports=!1},function(t,n,r){var e=r(24),i=Math.max,o=Math.min;t.exports=function(t,n){return(t=e(t))<0?i(t+n,0):o(t,n)}},function(t,n,r){var e=r(96),i=r(69).concat("length","prototype");n.f=Object.getOwnPropertyNames||function getOwnPropertyNames(t){return e(t,i)}},function(t,n,e){var i=e(20),o=e(5)("toStringTag"),u="Arguments"==i(function(){return arguments}()),c=function(t,n){try{return t[n]}catch(r){}};t.exports=function(t){var n,e,f;return t===r?"Undefined":null===t?"Null":"string"==typeof(e=c(n=Object(t),o))?e:u?i(n):"Object"==(f=i(n))&&"function"==typeof n.callee?"Arguments":f}},function(t,n){t.exports={}},function(t,n,r){var e=r(2),i=r(6),o=r(7),u=r(5)("species");t.exports=function(t){var n=e[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n){t.exports=function(t,n,e,i){if(!(t instanceof n)||i!==r&&i in t)throw TypeError(e+": incorrect invocation!");return t}},function(t,n,r){var e=r(14);t.exports=function(t,n,r){for(var i in n)e(t,i,n[i],r);return t}},function(t,n,r){var e=r(6).f,i=r(12),o=r(5)("toStringTag");t.exports=function(t,n,r){t&&!i(t=r?t:t.prototype,o)&&e(t,o,{configurable:!0,value:n})}},function(t,n,r){var e=r(0),i=r(23),o=r(3),u=r(75),c="["+u+"]",f=RegExp("^"+c+c+"*"),a=RegExp(c+c+"*$"),s=function(t,n,r){var i={},c=o(function(){return!!u[t]()||"​…"!="​…"[t]()}),f=i[t]=c?n(l):u[t];r&&(i[r]=f),e(e.P+e.F*c,"String",i)},l=s.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(f,"")),2&n&&(t=t.replace(a,"")),t};t.exports=s},function(t,n,r){var e=r(4);t.exports=function(t,n){if(!e(t)||t._t!==n)throw TypeError("Incompatible receiver, "+n+" required!");return t}},function(t,n,r){var e=r(20);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var i=e(39),o=e(5)("iterator"),u=e(40);t.exports=e(18).getIteratorMethod=function(t){if(t!=r)return t[o]||t["@@iterator"]||u[i(t)]}},function(t,n,r){var e=r(2),i=e["__core-js_shared__"]||(e["__core-js_shared__"]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,n,r){var e=r(11),i=r(8),o=r(37);t.exports=function(t){return function(n,r,u){var c,f=e(n),a=i(f.length),s=o(u,a);if(t&&r!=r){for(;a>s;)if((c=f[s++])!=c)return!0}else for(;a>s;s++)if((t||s in f)&&f[s]===r)return t||s||0;return!t&&-1}}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,r){var e=r(20);t.exports=Array.isArray||function isArray(t){return"Array"==e(t)}},function(t,n,e){var i=e(4),o=e(20),u=e(5)("match");t.exports=function(t){var n;return i(t)&&((n=t[u])!==r?!!n:"RegExp"==o(t))}},function(t,n,e){var i=e(36),o=e(0),u=e(14),c=e(13),f=e(12),a=e(40),s=e(56),l=e(44),h=e(16),p=e(5)("iterator"),v=!([].keys&&"next"in[].keys()),g=function(){return this};t.exports=function(t,n,e,y,d,_,b){s(e,n,y);var S,m,x,w=function(t){if(!v&&t in M)return M[t];switch(t){case"keys":return function keys(){return new e(this,t)};case"values":return function values(){return new e(this,t)}}return function entries(){return new e(this,t)}},E=n+" Iterator",O="values"==d,P=!1,M=t.prototype,F=M[p]||M["@@iterator"]||d&&M[d],I=F||w(d),A=d?O?w("entries"):I:r,k="Array"==n?M.entries||F:F;if(k&&(x=h(k.call(new t)))!==Object.prototype&&x.next&&(l(x,E,!0),i||f(x,p)||c(x,p,g)),O&&F&&"values"!==F.name&&(P=!0,I=function values(){return F.call(this)}),i&&!b||!v&&!P&&M[p]||c(M,p,I),a[n]=I,a[E]=g,d)if(S={values:O?I:w("values"),keys:_?I:w("keys"),entries:A},b)for(m in S)m in M||u(M,m,S[m]);else o(o.P+o.F*(v||P),n,S);return S}},function(t,n,r){var e=r(28),i=r(31),o=r(44),u={};r(13)(u,r(5)("iterator"),function(){return this}),t.exports=function(t,n,r){t.prototype=e(u,{next:i(1,r)}),o(t,n+" Iterator")}},function(t,n,r){var e=r(5)("iterator"),i=!1;try{var o=[7][e]();o["return"]=function(){i=!0},Array.from(o,function(){throw 2})}catch(u){}t.exports=function(t,n){if(!n&&!i)return!1;var r=!1;try{var o=[7],c=o[e]();c.next=function(){return{done:r=!0}},o[e]=function(){return c},t(o)}catch(u){}return r}},function(t,n,r){var e=r(1);t.exports=function(){var t=e(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n,r){var e=r(13),i=r(14),o=r(3),u=r(23),c=r(5);t.exports=function(t,n,r){var f=c(t),a=r(u,f,""[t]),s=a[0],l=a[1];o(function(){var n={};return n[f]=function(){return 7},7!=""[t](n)})&&(i(String.prototype,t,s),e(RegExp.prototype,f,2==n?function(t,n){return l.call(t,this,n)}:function(t){return l.call(t,this)}))}},function(t,n,e){var i=e(1),o=e(10),u=e(5)("species");t.exports=function(t,n){var e,c=i(t).constructor;return c===r||(e=i(c)[u])==r?n:o(e)}},function(t,n,e){var i=e(2),o=e(0),u=e(14),c=e(43),f=e(32),a=e(34),s=e(42),l=e(4),h=e(3),p=e(57),v=e(44),g=e(74);t.exports=function(t,n,e,y,d,_){var b=i[t],S=b,m=d?"set":"add",x=S&&S.prototype,w={},E=function(t){var n=x[t];u(x,t,"delete"==t?function(t){return!(_&&!l(t))&&n.call(this,0===t?0:t)}:"has"==t?function has(t){return!(_&&!l(t))&&n.call(this,0===t?0:t)}:"get"==t?function get(t){return _&&!l(t)?r:n.call(this,0===t?0:t)}:"add"==t?function add(t){return n.call(this,0===t?0:t),this}:function set(t,r){return n.call(this,0===t?0:t,r),this})};if("function"==typeof S&&(_||x.forEach&&!h(function(){(new S).entries().next()}))){var O=new S,P=O[m](_?{}:-0,1)!=O,M=h(function(){O.has(1)}),F=p(function(t){new S(t)}),I=!_&&h(function(){for(var t=new S,n=5;n--;)t[m](n,n);return!t.has(-0)});F||((S=n(function(n,e){s(n,S,t);var i=g(new b,n,S);return e!=r&&a(e,d,i[m],i),i})).prototype=x,x.constructor=S),(M||I)&&(E("delete"),E("has"),d&&E("get")),(I||P)&&E(m),_&&x.clear&&delete x.clear}else S=y.getConstructor(n,t,d,m),c(S.prototype,e),f.NEED=!0;return v(S,t),w[t]=S,o(o.G+o.W+o.F*(S!=b),w),_||y.setStrong(S,t,d),S}},function(t,n,r){for(var e,i=r(2),o=r(13),u=r(35),c=u("typed_array"),f=u("view"),a=!(!i.ArrayBuffer||!i.DataView),s=a,l=0,h="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");l<9;)(e=i[h[l++]])?(o(e.prototype,c,!0),o(e.prototype,f,!0)):s=!1;t.exports={ABV:a,CONSTR:s,TYPED:c,VIEW:f}},function(t,n,r){t.exports=r(36)||!r(3)(function(){var t=Math.random();__defineSetter__.call(null,t,function(){}),delete r(2)[t]})},function(t,n,r){var e=r(0);t.exports=function(t){e(e.S,t,{of:function of(){for(var t=arguments.length,n=Array(t);t--;)n[t]=arguments[t];return new this(n)}})}},function(t,n,e){var i=e(0),o=e(10),u=e(19),c=e(34);t.exports=function(t){i(i.S,t,{from:function from(t){var n,e,i,f,a=arguments[1];return o(this),(n=a!==r)&&o(a),t==r?new this:(e=[],n?(i=0,f=u(a,arguments[2],2),c(t,!1,function(t){e.push(f(t,i++))})):c(t,!1,e.push,e),new this(e))}})}},function(t,n,r){var e=r(4),i=r(2).document,o=e(i)&&e(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,r){var e=r(2),i=r(18),o=r(36),u=r(95),c=r(6).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:e.Symbol||{});"_"==t.charAt(0)||t in n||c(n,t,{value:u.f(t)})}},function(t,n,r){var e=r(50)("keys"),i=r(35);t.exports=function(t){return e[t]||(e[t]=i(t))}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n,r){var e=r(2).document;t.exports=e&&e.documentElement},function(t,n,r){var e=r(27),i=r(52),o=r(48),u=r(9),c=r(47),f=Object.assign;t.exports=!f||r(3)(function(){var t={},n={},r=Symbol(),e="abcdefghijklmnopqrst";return t[r]=7,e.split("").forEach(function(t){n[t]=t}),7!=f({},t)[r]||Object.keys(f({},n)).join("")!=e})?function assign(t,n){for(var r=u(t),f=arguments.length,a=1,s=i.f,l=o.f;f>a;)for(var h,p=c(arguments[a++]),v=s?e(p).concat(s(p)):e(p),g=v.length,y=0;g>y;)l.call(p,h=v[y++])&&(r[h]=p[h]);return r}:f},function(t,n,e){var i=e(4),o=e(1),u=function(t,n){if(o(t),!i(n)&&null!==n)throw TypeError(n+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,n,r){try{(r=e(19)(Function.call,e(15).f(Object.prototype,"__proto__").set,2))(t,[]),n=!(t instanceof Array)}catch(i){n=!0}return function setPrototypeOf(t,e){return u(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):r),check:u}},function(t,n){t.exports=function(t,n,e){var i=e===r;switch(n.length){case 0:return i?t():t.call(e);case 1:return i?t(n[0]):t.call(e,n[0]);case 2:return i?t(n[0],n[1]):t.call(e,n[0],n[1]);case 3:return i?t(n[0],n[1],n[2]):t.call(e,n[0],n[1],n[2]);case 4:return i?t(n[0],n[1],n[2],n[3]):t.call(e,n[0],n[1],n[2],n[3])}return t.apply(e,n)}},function(t,n,r){var e=r(4),i=r(72).set;t.exports=function(t,n,r){var o,u=n.constructor;return u!==r&&"function"==typeof u&&(o=u.prototype)!==r.prototype&&e(o)&&i&&i(t,o),t}},function(t,n){t.exports="\t\n\x0B\f\r   ᠎              \u2028\u2029\ufeff"},function(t,n,r){var e=r(24),i=r(23);t.exports=function repeat(t){var n=String(i(this)),r="",o=e(t);if(o<0||o==Infinity)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(r+=n);return r}},function(t,n){t.exports=Math.sign||function sign(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n){var r=Math.expm1;t.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function expm1(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:r},function(t,n,e){var i=e(24),o=e(23);t.exports=function(t){return function(n,e){var u,c,f=String(o(n)),a=i(e),s=f.length;return a<0||a>=s?t?"":r:(u=f.charCodeAt(a))<55296||u>56319||a+1===s||(c=f.charCodeAt(a+1))<56320||c>57343?t?f.charAt(a):u:t?f.slice(a,a+2):c-56320+(u-55296<<10)+65536}}},function(t,n,r){var e=r(54),i=r(23);t.exports=function(t,n,r){if(e(n))throw TypeError("String#"+r+" doesn't accept regex!");return String(i(t))}},function(t,n,r){var e=r(5)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(r){try{return n[e]=!1,!"/./"[t](n)}catch(i){}}return!0}},function(t,n,e){var i=e(40),o=e(5)("iterator"),u=Array.prototype;
vendor: 23,370 bytes, lines 62756-62757
62756t.exports=function(t){return t!==r&&(i.Array===t||u[o]===t)}},function(t,n,r){var e=r(6),i=r(31);t.exports=function(t,n,r){n in t?e.f(t,n,i(0,r)):t[n]=r}},function(t,n,r){var e=r(212);t.exports=function(t,n){return new(e(t))(n)}},function(t,n,e){var i=e(9),o=e(37),u=e(8);t.exports=function fill(t){for(var n=i(this),e=u(n.length),c=arguments.length,f=o(c>1?arguments[1]:r,e),a=c>2?arguments[2]:r,s=a===r?e:o(a,e);s>f;)n[f++]=t;return n}},function(t,n,e){var i=e(33),o=e(87),u=e(40),c=e(11);t.exports=e(55)(Array,"Array",function(t,n){this._t=c(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=r,o(1)):"keys"==n?o(0,e):"values"==n?o(0,t[e]):o(0,[e,t[e]])},"values"),u.Arguments=u.Array,i("keys"),i("values"),i("entries")},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,r){var e,i,o,u=r(19),c=r(73),f=r(70),a=r(66),s=r(2),l=s.process,h=s.setImmediate,p=s.clearImmediate,v=s.MessageChannel,g=s.Dispatch,y=0,d={},_=function(){var t=+this;if(d.hasOwnProperty(t)){var n=d[t];delete d[t],n()}},b=function(t){_.call(t.data)};h&&p||(h=function setImmediate(t){for(var n=[],r=1;arguments.length>r;)n.push(arguments[r++]);return d[++y]=function(){c("function"==typeof t?t:Function(t),n)},e(y),y},p=function clearImmediate(t){delete d[t]},"process"==r(20)(l)?e=function(t){l.nextTick(u(_,t,1))}:g&&g.now?e=function(t){g.now(u(_,t,1))}:v?(o=(i=new v).port2,i.port1.onmessage=b,e=u(o.postMessage,o,1)):s.addEventListener&&"function"==typeof postMessage&&!s.importScripts?(e=function(t){s.postMessage(t+"","*")},s.addEventListener("message",b,!1)):e="onreadystatechange"in a("script")?function(t){f.appendChild(a("script")).onreadystatechange=function(){f.removeChild(this),_.call(t)}}:function(t){setTimeout(u(_,t,1),0)}),t.exports={set:h,clear:p}},function(t,n,e){var i=e(2),o=e(88).set,u=i.MutationObserver||i.WebKitMutationObserver,c=i.process,f=i.Promise,a="process"==e(20)(c);t.exports=function(){var t,n,e,s=function(){var i,o;for(a&&(i=c.domain)&&i.exit();t;){o=t.fn,t=t.next;try{o()}catch(u){throw t?e():n=r,u}}n=r,i&&i.enter()};if(a)e=function(){c.nextTick(s)};else if(u){var l=!0,h=document.createTextNode("");new u(s).observe(h,{characterData:!0}),e=function(){h.data=l=!l}}else if(f&&f.resolve){var p=f.resolve();e=function(){p.then(s)}}else e=function(){o.call(i,s)};return function(i){var o={fn:i,next:r};n&&(n.next=o),t||(t=o,e()),n=o}}},function(t,n,e){function PromiseCapability(t){var n,e;this.promise=new t(function(t,i){if(n!==r||e!==r)throw TypeError("Bad Promise constructor");n=t,e=i}),this.resolve=i(n),this.reject=i(e)}var i=e(10);t.exports.f=function(t){return new PromiseCapability(t)}},function(t,n,r){var e=r(38),i=r(52),o=r(1),u=r(2).Reflect;t.exports=u&&u.ownKeys||function ownKeys(t){var n=e.f(o(t)),r=i.f;return r?n.concat(r(t)):n}},function(t,n,e){function packIEEE754(t,n,r){var e,i,o,u=Array(r),c=8*r-n-1,f=(1<<c)-1,a=f>>1,s=23===n?F(2,-24)-F(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for((t=M(t))!=t||t===O?(i=t!=t?1:0,e=f):(e=I(A(t)/k),t*(o=F(2,-e))<1&&(e--,o*=2),(t+=e+a>=1?s/o:s*F(2,1-a))*o>=2&&(e++,o/=2),e+a>=f?(i=0,e=f):e+a>=1?(i=(t*o-1)*F(2,n),e+=a):(i=t*F(2,a-1)*F(2,n),e=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(e=e<<n|i,c+=n;c>0;u[l++]=255&e,e/=256,c-=8);return u[--l]|=128*h,u}function unpackIEEE754(t,n,r){var e,i=8*r-n-1,o=(1<<i)-1,u=o>>1,c=i-7,f=r-1,a=t[f--],s=127&a;for(a>>=7;c>0;s=256*s+t[f],f--,c-=8);for(e=s&(1<<-c)-1,s>>=-c,c+=n;c>0;e=256*e+t[f],f--,c-=8);if(0===s)s=1-u;else{if(s===o)return e?NaN:a?-O:O;e+=F(2,n),s-=u}return(a?-1:1)*e*F(2,s-n)}function unpackI32(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function packI8(t){return[255&t]}function packI16(t){return[255&t,t>>8&255]}function packI32(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function packF64(t){return packIEEE754(t,52,8)}function packF32(t){return packIEEE754(t,23,4)}function addGetter(t,n,r){y(t[b],n,{get:function(){return this[r]}})}function get(t,n,r,e){var i=v(+r);if(i+n>t[j])throw E(S);var o=t[N]._b,u=i+t[T],c=o.slice(u,u+n);return e?c:c.reverse()}function set(t,n,r,e,i,o){var u=v(+r);if(u+n>t[j])throw E(S);for(var c=t[N]._b,f=u+t[T],a=e(+i),s=0;s<n;s++)c[f+s]=a[o?s:n-s-1]}var i=e(2),o=e(7),u=e(36),c=e(62),f=e(13),a=e(43),s=e(3),l=e(42),h=e(24),p=e(8),v=e(117),g=e(38).f,y=e(6).f,d=e(85),_=e(44),b="prototype",S="Wrong index!",m=i.ArrayBuffer,x=i.DataView,w=i.Math,E=i.RangeError,O=i.Infinity,P=m,M=w.abs,F=w.pow,I=w.floor,A=w.log,k=w.LN2,N=o?"_b":"buffer",j=o?"_l":"byteLength",T=o?"_o":"byteOffset";if(c.ABV){if(!s(function(){m(1)})||!s(function(){new m(-1)})||s(function(){return new m,new m(1.5),new m(NaN),"ArrayBuffer"!=m.name})){for(var R,D=(m=function ArrayBuffer(t){return l(this,m),new P(v(t))})[b]=P[b],L=g(P),W=0;L.length>W;)(R=L[W++])in m||f(m,R,P[R]);u||(D.constructor=m)}var C=new x(new m(2)),U=x[b].setInt8;C.setInt8(0,2147483648),C.setInt8(1,2147483649),!C.getInt8(0)&&C.getInt8(1)||a(x[b],{setInt8:function setInt8(t,n){U.call(this,t,n<<24>>24)},setUint8:function setUint8(t,n){U.call(this,t,n<<24>>24)}},!0)}else m=function ArrayBuffer(t){l(this,m,"ArrayBuffer");var n=v(t);this._b=d.call(Array(n),0),this[j]=n},x=function DataView(t,n,e){l(this,x,"DataView"),l(t,m,"DataView");var i=t[j],o=h(n);if(o<0||o>i)throw E("Wrong offset!");if(e=e===r?i-o:p(e),o+e>i)throw E("Wrong length!");this[N]=t,this[T]=o,this[j]=e},o&&(addGetter(m,"byteLength","_l"),addGetter(x,"buffer","_b"),addGetter(x,"byteLength","_l"),addGetter(x,"byteOffset","_o")),a(x[b],{getInt8:function getInt8(t){return get(this,1,t)[0]<<24>>24},getUint8:function getUint8(t){return get(this,1,t)[0]},getInt16:function getInt16(t){var n=get(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function getUint16(t){var n=get(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function getInt32(t){return unpackI32(get(this,4,t,arguments[1]))},getUint32:function getUint32(t){return unpackI32(get(this,4,t,arguments[1]))>>>0},getFloat32:function getFloat32(t){return unpackIEEE754(get(this,4,t,arguments[1]),23,4)},getFloat64:function getFloat64(t){return unpackIEEE754(get(this,8,t,arguments[1]),52,8)},setInt8:function setInt8(t,n){set(this,1,t,packI8,n)},setUint8:function setUint8(t,n){set(this,1,t,packI8,n)},setInt16:function setInt16(t,n){set(this,2,t,packI16,n,arguments[2])},setUint16:function setUint16(t,n){set(this,2,t,packI16,n,arguments[2])},setInt32:function setInt32(t,n){set(this,4,t,packI32,n,arguments[2])},setUint32:function setUint32(t,n){set(this,4,t,packI32,n,arguments[2])},setFloat32:function setFloat32(t,n){set(this,4,t,packF32,n,arguments[2])},setFloat64:function setFloat64(t,n){set(this,8,t,packF64,n,arguments[2])}});_(m,"ArrayBuffer"),_(x,"DataView"),f(x[b],c.VIEW,!0),n.ArrayBuffer=m,n.DataView=x},function(t,n){t.exports=function(t,n){var r=n===Object(n)?function(t){return n[t]}:n;return function(n){return String(n).replace(t,r)}}},function(t,n,r){t.exports=!r(7)&&!r(3)(function(){return 7!=Object.defineProperty(r(66)("div"),"a",{get:function(){return 7}}).a})},function(t,n,r){n.f=r(5)},function(t,n,r){var e=r(12),i=r(11),o=r(51)(!1),u=r(68)("IE_PROTO");t.exports=function(t,n){var r,c=i(t),f=0,a=[];for(r in c)r!=u&&e(c,r)&&a.push(r)
62757;for(;n.length>f;)e(c,r=n[f++])&&(~o(a,r)||a.push(r));return a}},function(t,n,r){var e=r(6),i=r(1),o=r(27);t.exports=r(7)?Object.defineProperties:function defineProperties(t,n){i(t);for(var r,u=o(n),c=u.length,f=0;c>f;)e.f(t,r=u[f++],n[r]);return t}},function(t,n,r){var e=r(11),i=r(38).f,o={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(t){try{return i(t)}catch(n){return u.slice()}};t.exports.f=function getOwnPropertyNames(t){return u&&"[object Window]"==o.call(t)?c(t):i(e(t))}},function(t,n,r){var e=r(10),i=r(4),o=r(73),u=[].slice,c={},f=function(t,n,r){if(!(n in c)){for(var e=[],i=0;i<n;i++)e[i]="a["+i+"]";c[n]=Function("F,a","return new F("+e.join(",")+")")}return c[n](t,r)};t.exports=Function.bind||function bind(t){var n=e(this),r=u.call(arguments,1),c=function(){var e=r.concat(u.call(arguments));return this instanceof c?f(n,e.length,e):o(n,e,t)};return i(n.prototype)&&(c.prototype=n.prototype),c}},function(t,n,r){var e=r(20);t.exports=function(t,n){if("number"!=typeof t&&"Number"!=e(t))throw TypeError(n);return+t}},function(t,n,r){var e=r(4),i=Math.floor;t.exports=function isInteger(t){return!e(t)&&isFinite(t)&&i(t)===t}},function(t,n,r){var e=r(2).parseFloat,i=r(45).trim;t.exports=1/e(r(75)+"-0")!=-Infinity?function parseFloat(t){var n=i(String(t),3),r=e(n);return 0===r&&"-"==n.charAt(0)?-0:r}:e},function(t,n,r){var e=r(2).parseInt,i=r(45).trim,o=r(75),u=/^[-+]?0[xX]/;t.exports=8!==e(o+"08")||22!==e(o+"0x16")?function parseInt(t,n){var r=i(String(t),3);return e(r,n>>>0||(u.test(r)?16:10))}:e},function(t,n){t.exports=Math.log1p||function log1p(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,r){var e=r(77),i=Math.pow,o=i(2,-52),u=i(2,-23),c=i(2,127)*(2-u),f=i(2,-126),a=function(t){return t+1/o-1/o};t.exports=Math.fround||function fround(t){var n,r,i=Math.abs(t),s=e(t);return i<f?s*a(i/f/u)*f*u:(n=(1+u/o)*i,(r=n-(n-i))>c||r!=r?s*Infinity:s*r)}},function(t,n,e){var i=e(1);t.exports=function(t,n,e,o){try{return o?n(i(e)[0],e[1]):n(e)}catch(c){var u=t["return"];throw u!==r&&i(u.call(t)),c}}},function(t,n,r){var e=r(10),i=r(9),o=r(47),u=r(8);t.exports=function(t,n,r,c,f){e(n);var a=i(t),s=o(a),l=u(a.length),h=f?l-1:0,p=f?-1:1;if(r<2)for(;;){if(h in s){c=s[h],h+=p;break}if(h+=p,f?h<0:l<=h)throw TypeError("Reduce of empty array with no initial value")}for(;f?h>=0:l>h;h+=p)h in s&&(c=n(c,s[h],h,a));return c}},function(t,n,e){var i=e(9),o=e(37),u=e(8);t.exports=[].copyWithin||function copyWithin(t,n){var e=i(this),c=u(e.length),f=o(t,c),a=o(n,c),s=arguments.length>2?arguments[2]:r,l=Math.min((s===r?c:o(s,c))-a,c-f),h=1;for(a<f&&f<a+l&&(h=-1,a+=l-1,f+=l-1);l-- >0;)a in e?e[f]=e[a]:delete e[f],f+=h,a+=h;return e}},function(t,n,r){r(7)&&"g"!=/./g.flags&&r(6).f(RegExp.prototype,"flags",{configurable:!0,get:r(58)})},function(t,n){t.exports=function(t){try{return{e:!1,v:t()}}catch(n){return{e:!0,v:n}}}},function(t,n,r){var e=r(1),i=r(4),o=r(90);t.exports=function(t,n){if(e(t),i(n)&&n.constructor===t)return n;var r=o.f(t);return(0,r.resolve)(n),r.promise}},function(t,n,e){var i=e(113),o=e(46);t.exports=e(61)("Map",function(t){return function Map(){return t(this,arguments.length>0?arguments[0]:r)}},{get:function get(t){var n=i.getEntry(o(this,"Map"),t);return n&&n.v},set:function set(t,n){return i.def(o(this,"Map"),0===t?0:t,n)}},i,!0)},function(t,n,e){var i=e(6).f,o=e(28),u=e(43),c=e(19),f=e(42),a=e(34),s=e(55),l=e(87),h=e(41),p=e(7),v=e(32).fastKey,g=e(46),y=p?"_s":"size",d=function(t,n){var r,e=v(n);if("F"!==e)return t._i[e];for(r=t._f;r;r=r.n)if(r.k==n)return r};t.exports={getConstructor:function(t,n,e,s){var l=t(function(t,i){f(t,l,n,"_i"),t._t=n,t._i=o(null),t._f=r,t._l=r,t[y]=0,i!=r&&a(i,e,t[s],t)});return u(l.prototype,{clear:function clear(){for(var t=g(this,n),e=t._i,i=t._f;i;i=i.n)i.r=!0,i.p&&(i.p=i.p.n=r),delete e[i.i];t._f=t._l=r,t[y]=0},"delete":function(t){var r=g(this,n),e=d(r,t);if(e){var i=e.n,o=e.p;delete r._i[e.i],e.r=!0,o&&(o.n=i),i&&(i.p=o),r._f==e&&(r._f=i),r._l==e&&(r._l=o),r[y]--}return!!e},forEach:function forEach(t){g(this,n);for(var e,i=c(t,arguments.length>1?arguments[1]:r,3);e=e?e.n:this._f;)for(i(e.v,e.k,this);e&&e.r;)e=e.p},has:function has(t){return!!d(g(this,n),t)}}),p&&i(l.prototype,"size",{get:function(){return g(this,n)[y]}}),l},def:function(t,n,e){var i,o,u=d(t,n);return u?u.v=e:(t._l=u={i:o=v(n,!0),k:n,v:e,p:i=t._l,n:r,r:!1},t._f||(t._f=u),i&&(i.n=u),t[y]++,"F"!==o&&(t._i[o]=u)),t},getEntry:d,setStrong:function(t,n,e){s(t,n,function(t,e){this._t=g(t,n),this._k=e,this._l=r},function(){for(var t=this,n=t._k,e=t._l;e&&e.r;)e=e.p;return t._t&&(t._l=e=e?e.n:t._t._f)?"keys"==n?l(0,e.k):"values"==n?l(0,e.v):l(0,[e.k,e.v]):(t._t=r,l(1))},e?"entries":"values",!e,!0),h(n)}}},function(t,n,e){var i=e(113),o=e(46);t.exports=e(61)("Set",function(t){return function Set(){return t(this,arguments.length>0?arguments[0]:r)}},{add:function add(t){return i.def(o(this,"Set"),t=0===t?0:t,t)}},i)},function(t,n,e){var i,o=e(26)(0),u=e(14),c=e(32),f=e(71),a=e(116),s=e(4),l=e(3),h=e(46),p=c.getWeak,v=Object.isExtensible,g=a.ufstore,y={},d=function(t){return function WeakMap(){return t(this,arguments.length>0?arguments[0]:r)}},_={get:function get(t){if(s(t)){var n=p(t);return!0===n?g(h(this,"WeakMap")).get(t):n?n[this._i]:r}},set:function set(t,n){return a.def(h(this,"WeakMap"),t,n)}},b=t.exports=e(61)("WeakMap",d,_,a,!0,!0);l(function(){return 7!=(new b).set((Object.freeze||Object)(y),7).get(y)})&&(f((i=a.getConstructor(d,"WeakMap")).prototype,_),c.NEED=!0,o(["delete","has","get","set"],function(t){var n=b.prototype,r=n[t];u(n,t,function(n,e){if(s(n)&&!v(n)){this._f||(this._f=new i);var o=this._f[t](n,e);return"set"==t?this:o}return r.call(this,n,e)})}))},function(t,n,e){var i=e(43),o=e(32).getWeak,u=e(1),c=e(4),f=e(42),a=e(34),s=e(26),l=e(12),h=e(46),p=s(5),v=s(6),g=0,y=function(t){return t._l||(t._l=new d)},d=function(){this.a=[]},_=function(t,n){return p(t.a,function(t){return t[0]===n})};d.prototype={get:function(t){var n=_(this,t);if(n)return n[1]},has:function(t){return!!_(this,t)},set:function(t,n){var r=_(this,t);r?r[1]=n:this.a.push([t,n])},"delete":function(t){var n=v(this.a,function(n){return n[0]===t});return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,u){var s=t(function(t,i){f(t,s,n,"_i"),t._t=n,t._i=g++,t._l=r,i!=r&&a(i,e,t[u],t)});return i(s.prototype,{"delete":function(t){if(!c(t))return!1;var r=o(t);return!0===r?y(h(this,n))["delete"](t):r&&l(r,this._i)&&delete r[this._i]},has:function has(t){if(!c(t))return!1;var r=o(t);return!0===r?y(h(this,n)).has(t):r&&l(r,this._i)}}),s},def:function(t,n,r){var e=o(u(n),!0);return!0===e?y(t).set(n,r):e[t._i]=r,t},ufstore:y}},function(t,n,e){var i=e(24),o=e(8);t.exports=function(t){if(t===r)return 0;var n=i(t),e=o(n);if(n!==e)throw RangeError("Wrong length!");return e}},function(t,n,e){function flattenIntoArray(t,n,e,a,s,l,h,p){for(var v,g,y=s,d=0,_=!!h&&c(h,p,3);d<a;){if(d in e){if(v=_?_(e[d],d,n):e[d],g=!1,o(v)&&(g=(g=v[f])!==r?!!g:i(v)),g&&l>0)y=flattenIntoArray(t,n,v,u(v.length),y,l-1)-1;else{if(y>=9007199254740991)throw TypeError();t[y]=v}y++}d++}return y}var i=e(53),o=e(4),u=e(8),c=e(19),f=e(5)("isConcatSpreadable");t.exports=flattenIntoArray},function(t,n,e){var i=e(8),o=e(76),u=e(23);t.exports=function(t,n,e,c){var f=String(u(t)),a=f.length,s=e===r?" ":String(e),l=i(n);if(l<=a||""==s)return f;var h=l-a,p=o.call(s,Math.ceil(h/s.length));return p.length>h&&(p=p.slice(0,h)),c?p+f:f+p}},function(t,n,r){var e=r(27),i=r(11),o=r(48).f;t.exports=function(t){return function(n){for(var r,u=i(n),c=e(u),f=c.length,a=0,s=[];f>a;)o.call(u,r=c[a++])&&s.push(t?[r,u[r]]:u[r]);return s}}},function(t,n,r){var e=r(39),i=r(122);t.exports=function(t){return function toJSON(){if(e(this)!=t)throw TypeError(t+"#toJSON isn't generic");return i(this)}}},function(t,n,r){var e=r(34);t.exports=function(t,n){var r=[];return e(t,!1,r.push,r,n),r}},function(t,n){t.exports=Math.scale||function scale(t,n,r,e,i){return 0===arguments.length||t!=t||n!=n||r!=r||e!=e||i!=i?NaN:t===Infinity||t===-Infinity?t:(t-n)*(i-e)/(r-n)+e}},function(t,n,e){var i=e(39),o=e(5)("iterator"),u=e(40);t.exports=e(18).isIterable=function(t){var n=Object(t);return n[o]!==r||"@@iterator"in n||u.hasOwnProperty(i(n))}},function(t,n,r){var e=r(126),i=r(73),o=r(10);t.exports=function(){for(var t=o(this),n=arguments.length,r=Array(n),u=0,c=e._,f=!1;n>u;)(r[u]=arguments[u++])===c&&(f=!0);return function(){var e,o=this,u=arguments.length,a=0,s=0;if(!f&&!u)return i(t,r,o);if(e=r.slice(),f)for(;n>a;a++)e[a]===c&&(e[a]=arguments[s++]);for(;u>s;)e.push(arguments[s++]);return i(t,e,o)}}},function(t,n,r){t.exports=r(2)},function(t,n,r){var e=r(6),i=r(15),o=r(91),u=r(11);t.exports=function define(t,n){for(var r,c=o(u(n)),f=c.length,a=0;f>a;)e.f(t,r=c[a++],i.f(n,r));return t}},function(t,n,r){r(129),r(131),r(132),r(133),r(134),r(135),r(136),r(137),r(138),r(139),r(140),r(141),r(142),r(143),r(144),r(145),r(147),r(148),r(149),r(150),r(151),r(152),r(153),r(154),r(155),r(156),r(157),r(158),r(159),r(160),r(161),r(162),r(163),r(164),r(165),r(166),r(167),r(168),r(169),r(170),r(171),r(172),r(173),r(174),r(175),r(176),r(177),r(178),r(179),r(180),r(181),r(182),r(183),r(184),r(185),r(186),r(187),r(188),r(189),r(190),r(191),r(192),r(193),r(194),r(195),r(196),r(197),r(198),r(199),r(200),r(201),r(202),r(203),r(204),r(205),r(206),r(207),r(208),r(209),r(210),r(211),r(213),r(214),r(215),r(216),r(217),r(218),r(219),r(220),r(221),r(222),r(223),r(224),r(86),r(225),r(226),r(227),r(109),r(228),r(229),r(230),r(231),r(232),r(112),r(114),r(115),r(233),r(234),r(235),r(236),r(237),r(238),r(239),r(240),r(241),r(242),r(243),r(244),r(245),r(246),r(247),r(248),r(249),r(250),r(252),r(253),r(255),r(256),r(257),r(258),r(259),r(260),r(261),r(262),r(263),r(264),r(265),r(266),r(267),r(268),r(269),r(270),r(271),r(272),r(273),r(274),r(275),r(276),r(277),r(278),r(279),r(280),r(281),r(282),r(283),r(284),r(285),r(286),r(287),r(288),r(289),r(290),r(291),r(292),r(293),r(294),r(295),r(296),r(297),r(298),r(299),r(300),r(301),r(302),r(303),r(304),r(305),r(306),r(307),r(308),r(309),r(310),r(311),r(312),r(313),r(314),r(315),r(316),r(317),r(318),r(319),r(320),r(321),r(322),r(323),r(324),r(325),r(49),r(327),r(124),r(328),r(329),r(330),r(331),r(332),r(333),r(334),r(335),r(336),t.exports=r(337)},function(t,n,e){var i=e(2),o=e(12),u=e(7),c=e(0),f=e(14),a=e(32).KEY,s=e(3),l=e(50),h=e(44),p=e(35),v=e(5),g=e(95),y=e(67),d=e(130),_=e(53),b=e(1),S=e(11),m=e(22),x=e(31),w=e(28),E=e(98),O=e(15),P=e(6),M=e(27),F=O.f,I=P.f,A=E.f,k=i.Symbol,N=i.JSON,j=N&&N.stringify,T=v("_hidden"),R=v("toPrimitive"),D={}.propertyIsEnumerable,L=l("symbol-registry"),W=l("symbols"),C=l("op-symbols"),U=Object.prototype,G="function"==typeof k,B=i.QObject,V=!B||!B.prototype||!B.prototype.findChild,q=u&&s(function(){return 7!=w(I({},"a",{get:function(){return I(this,"a",{value:7}).a}})).a})?function(t,n,r){var e=F(U,n);e&&delete U[n],I(t,n,r),e&&t!==U&&I(U,n,e)}:I,z=function(t){var n=W[t]=w(k.prototype);return n._k=t,n},K=G&&"symbol"==typeof k.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof k},J=function defineProperty(t,n,r){return t===U&&J(C,n,r),b(t),n=m(n,!0),b(r),o(W,n)?(r.enumerable?(o(t,T)&&t[T][n]&&(t[T][n]=!1),r=w(r,{enumerable:x(0,!1)})):(o(t,T)||I(t,T,x(1,{})),t[T][n]=!0),q(t,n,r)):I(t,n,r)},Y=function defineProperties(t,n){b(t);for(var r,e=d(n=S(n)),i=0,o=e.length;o>i;)J(t,r=e[i++],n[r]);return t},H=function propertyIsEnumerable(t){var n=D.call(this,t=m(t,!0));return!(this===U&&o(W,t)&&!o(C,t))&&(!(n||!o(this,t)||!o(W,t)||o(this,T)&&this[T][t])||n)},X=function getOwnPropertyDescriptor(t,n){if(t=S(t),n=m(n,!0),t!==U||!o(W,n)||o(C,n)){var r=F(t,n);return!r||!o(W,n)||o(t,T)&&t[T][n]||(r.enumerable=!0),r}},$=function getOwnPropertyNames(t){for(var n,r=A(S(t)),e=[],i=0;r.length>i;)o(W,n=r[i++])||n==T||n==a||e.push(n);return e},Z=function getOwnPropertySymbols(t){for(var n,r=t===U,e=A(r?C:S(t)),i=[],u=0;e.length>u;)!o(W,n=e[u++])||r&&!o(U,n)||i.push(W[n]);return i};G||(f((k=function Symbol(){if(this instanceof k)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:r),n=function(r){this===U&&n.call(C,r),o(this,T)&&o(this[T],t)&&(this[T][t]=!1),q(this,t,x(1,r))};return u&&V&&q(U,t,{configurable:!0,set:n}),z(t)}).prototype,"toString",function toString(){return this._k}),O.f=X,P.f=J,e(38).f=E.f=$,e(48).f=H,e(52).f=Z,u&&!e(36)&&f(U,"propertyIsEnumerable",H,!0),g.f=function(t){return z(v(t))}),c(c.G+c.W+c.F*!G,{Symbol:k});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Q.length>tt;)v(Q[tt++]);for(var nt=M(v.store),rt=0;nt.length>rt;)y(nt[rt++]);c(c.S+c.F*!G,"Symbol",{"for":function(t){return o(L,t+="")?L[t]:L[t]=k(t)},keyFor:function keyFor(t){if(!K(t))throw TypeError(t+" is not a symbol!");for(var n in L)if(L[n]===t)return n},useSetter:function(){V=!0},useSimple:function(){V=!1}}),c(c.S+c.F*!G,"Object",{create:function create(t,n){return n===r?w(t):Y(w(t),n)},defineProperty:J,defineProperties:Y,getOwnPropertyDescriptor:X,getOwnPropertyNames:$,getOwnPropertySymbols:Z}),N&&c(c.S+c.F*(!G||s(function(){var t=k();return"[null]"!=j([t])||"{}"!=j({a:t})||"{}"!=j(Object(t))})),"JSON",{stringify:function stringify(t){if(t!==r&&!K(t)){for(var n,e,i=[t],o=1;arguments.length>o;)i.push(arguments[o++]);return"function"==typeof(n=i[1])&&(e=n),!e&&_(n)||(n=function(t,n){if(e&&(n=e.call(this,t,n)),!K(n))return n}),i[1]=n,j.apply(N,i)}}}),k.prototype[R]||e(13)(k.prototype,R,k.prototype.valueOf),h(k,"Symbol"),h(Math,"Math",!0),h(i.JSON,"JSON",!0)},function(t,n,r){var e=r(27),i=r(52),o=r(48);t.exports=function(t){var n=e(t),r=i.f;if(r)for(var u,c=r(t),f=o.f,a=0;c.length>a;)f.call(t,u=c[a++])&&n.push(u);return n}},function(t,n,r){var e=r(0);e(e.S+e.F*!r(7),"Object",{defineProperty:r(6).f})},function(t,n,r){var e=r(0);e(e.S+e.F*!r(7),"Object",{defineProperties:r(97)})},function(t,n,r){var e=r(11),i=r(15).f;r(25)("getOwnPropertyDescriptor",function(){return function getOwnPropertyDescriptor(t,n){return i(e(t),n)}})},function(t,n,r){var e=r(0);e(e.S,"Object",{create:r(28)})},function(t,n,r){var e=r(9),i=r(16);r(25)("getPrototypeOf",function(){return function getPrototypeOf(t){return i(e(t))}})},function(t,n,r){var e=r(9),i=r(27);r(25)("keys",function(){return function keys(t){return i(e(t))}})},function(t,n,r){r(25)("getOwnPropertyNames",function(){return r(98).f})},function(t,n,r){var e=r(4),i=r(32).onFreeze;r(25)("freeze",function(t){return function freeze(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(4),i=r(32).onFreeze;r(25)("seal",function(t){return function seal(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(4),i=r(32).onFreeze;r(25)("preventExtensions",function(t){return function preventExtensions(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(4);r(25)("isFrozen",function(t){return function isFrozen(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(4);r(25)("isSealed",function(t){return function isSealed(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(4);r(25)("isExtensible",function(t){return function isExtensible(n){return!!e(n)&&(!t||t(n))}})},function(t,n,r){var e=r(0);e(e.S+e.F,"Object",{assign:r(71)})},function(t,n,r){var e=r(0);e(e.S,"Object",{is:r(146)})},function(t,n){t.exports=Object.is||function is(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,r){var e=r(0);e(e.S,"Object",{setPrototypeOf:r(72).set})},function(t,n,r){var e=r(39),i={};i[r(5)("toStringTag")]="z",i+""!="[object z]"&&r(14)(Object.prototype,"toString",function toString(){return"[object "+e(this)+"]"},!0)},function(t,n,r){var e=r(0);e(e.P,"Function",{bind:r(99)})},function(t,n,r){var e=r(6).f,i=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in i||r(7)&&e(i,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(t){return""}}})},function(t,n,r){var e=r(4),i=r(16),o=r(5)("hasInstance"),u=Function.prototype;o in u||r(6).f(u,o,{value:function(t){if("function"!=typeof this||!e(t))return!1;if(!e(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})}
vendor: 4,842 bytes, line 62757
62757,function(t,n,r){var e=r(2),i=r(12),o=r(20),u=r(74),c=r(22),f=r(3),a=r(38).f,s=r(15).f,l=r(6).f,h=r(45).trim,p=e.Number,v=p,g=p.prototype,y="Number"==o(r(28)(g)),d="trim"in String.prototype,_=function(t){var n=c(t,!1);if("string"==typeof n&&n.length>2){var r,e,i,o=(n=d?n.trim():h(n,3)).charCodeAt(0);if(43===o||45===o){if(88===(r=n.charCodeAt(2))||120===r)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:e=2,i=49;break;case 79:case 111:e=8,i=55;break;default:return+n}for(var u,f=n.slice(2),a=0,s=f.length;a<s;a++)if((u=f.charCodeAt(a))<48||u>i)return NaN;return parseInt(f,e)}}return+n};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function Number(t){var n=arguments.length<1?0:t,r=this;return r instanceof p&&(y?f(function(){g.valueOf.call(r)}):"Number"!=o(r))?u(new v(_(n)),r,p):_(n)};for(var b,S=r(7)?a(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),m=0;S.length>m;m++)i(v,b=S[m])&&!i(p,b)&&l(p,b,s(v,b));p.prototype=g,g.constructor=p,r(14)(e,"Number",p)}},function(t,n,r){var e=r(0),i=r(24),o=r(100),u=r(76),c=1..toFixed,f=Math.floor,a=[0,0,0,0,0,0],s="Number.toFixed: incorrect invocation!",l=function(t,n){for(var r=-1,e=n;++r<6;)e+=t*a[r],a[r]=e%1e7,e=f(e/1e7)},h=function(t){for(var n=6,r=0;--n>=0;)r+=a[n],a[n]=f(r/t),r=r%t*1e7},p=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==a[t]){var r=String(a[t]);n=""===n?r:n+u.call("0",7-r.length)+r}return n},v=function(t,n,r){return 0===n?r:n%2==1?v(t,n-1,r*t):v(t*t,n/2,r)},g=function(t){for(var n=0,r=t;r>=4096;)n+=12,r/=4096;for(;r>=2;)n+=1,r/=2;return n};e(e.P+e.F*(!!c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(3)(function(){c.call({})})),"Number",{toFixed:function toFixed(t){var n,r,e,c,f=o(this,s),a=i(t),y="",d="0";if(a<0||a>20)throw RangeError(s);if(f!=f)return"NaN";if(f<=-1e21||f>=1e21)return String(f);if(f<0&&(y="-",f=-f),f>1e-21)if(n=g(f*v(2,69,1))-69,r=n<0?f*v(2,-n,1):f/v(2,n,1),r*=4503599627370496,(n=52-n)>0){for(l(0,r),e=a;e>=7;)l(1e7,0),e-=7;for(l(v(10,e,1),0),e=n-1;e>=23;)h(1<<23),e-=23;h(1<<e),l(1,1),h(2),d=p()}else l(0,r),l(1<<-n,0),d=p()+u.call("0",a);return d=a>0?y+((c=d.length)<=a?"0."+u.call("0",a-c)+d:d.slice(0,c-a)+"."+d.slice(c-a)):y+d}})},function(t,n,e){var i=e(0),o=e(3),u=e(100),c=1..toPrecision;i(i.P+i.F*(o(function(){return"1"!==c.call(1,r)})||!o(function(){c.call({})})),"Number",{toPrecision:function toPrecision(t){var n=u(this,"Number#toPrecision: incorrect invocation!");return t===r?c.call(n):c.call(n,t)}})},function(t,n,r){var e=r(0);e(e.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,n,r){var e=r(0),i=r(2).isFinite;e(e.S,"Number",{isFinite:function isFinite(t){return"number"==typeof t&&i(t)}})},function(t,n,r){var e=r(0);e(e.S,"Number",{isInteger:r(101)})},function(t,n,r){var e=r(0);e(e.S,"Number",{isNaN:function isNaN(t){return t!=t}})},function(t,n,r){var e=r(0),i=r(101),o=Math.abs;e(e.S,"Number",{isSafeInteger:function isSafeInteger(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,r){var e=r(0);e(e.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,r){var e=r(0);e(e.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,r){var e=r(0),i=r(102);e(e.S+e.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,n,r){var e=r(0),i=r(103);e(e.S+e.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,n,r){var e=r(0),i=r(103);e(e.G+e.F*(parseInt!=i),{parseInt:i})},function(t,n,r){var e=r(0),i=r(102);e(e.G+e.F*(parseFloat!=i),{parseFloat:i})},function(t,n,r){var e=r(0),i=r(104),o=Math.sqrt,u=Math.acosh;e(e.S+e.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(Infinity)==Infinity),"Math",{acosh:function acosh(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,r){function asinh(t){return isFinite(t=+t)&&0!=t?t<0?-asinh(-t):Math.log(t+Math.sqrt(t*t+1)):t}var e=r(0),i=Math.asinh;e(e.S+e.F*!(i&&1/i(0)>0),"Math",{asinh:asinh})},function(t,n,r){var e=r(0),i=Math.atanh;e(e.S+e.F*!(i&&1/i(-0)<0),"Math",{atanh:function atanh(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,r){var e=r(0),i=r(77);e(e.S,"Math",{cbrt:function cbrt(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{clz32:function clz32(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,r){var e=r(0),i=Math.exp;e(e.S,"Math",{cosh:function cosh(t){return(i(t=+t)+i(-t))/2}})},function(t,n,r){var e=r(0),i=r(78);e(e.S+e.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,n,r){var e=r(0);e(e.S,"Math",{fround:r(105)})},function(t,n,r){var e=r(0),i=Math.abs;e(e.S,"Math",{hypot:function hypot(t,n){for(var r,e,o=0,u=0,c=arguments.length,f=0;u<c;
62757)f<(r=i(arguments[u++]))?(o=o*(e=f/r)*e+1,f=r):o+=r>0?(e=r/f)*e:r;return f===Infinity?Infinity:f*Math.sqrt(o)}})},function(t,n,r){var e=r(0),i=Math.imul;e(e.S+e.F*r(3)(function(){return-5!=i(4294967295,5)||2!=i.length}),"Math",{imul:function imul(t,n){var r=+t,e=+n,i=65535&r,o=65535&e;return 0|i*o+((65535&r>>>16)*o+i*(65535&e>>>16)<<16>>>0)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{log10:function log10(t){return Math.log(t)*Math.LOG10E}})},function(t,n,r){var e=r(0);e(e.S,"Math",{log1p:r(104)})},function(t,n,r){var e=r(0);e(e.S,"Math",{log2:function log2(t){return Math.log(t)/Math.LN2}})},function(t,n,r){var e=r(0);e(e.S,"Math",{sign:r(77)})},function(t,n,r){var e=r(0),i=r(78),o=Math.exp;e(e.S+e.F*r(3)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function sinh(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,r){var e=r(0),i=r(78),o=Math.exp;e(e.S,"Math",{tanh:function tanh(t){var n=i(t=+t),r=i(-t);return n==Infinity?1:r==Infinity?-1:(n-r)/(o(t)+o(-t))}})},function(t,n,r){var e=r(0);e(e.S,"Math",{trunc:function trunc(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,r){var e=r(0),i=r(37),o=String.fromCharCode,u=String.fromCodePoint;e(e.S+e.F*(!!u&&1!=u.length),"String",{fromCodePoint:function fromCodePoint(t){for(var n,r=[],e=arguments.length,u=0;e>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+" is not a valid code point");r.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return r.join("")}})},function(t,n,r){var e=r(0),i=r(11),o=r(8);e(e.S,"String",{raw:function raw(t){for(var n=i(t.raw),r=o(n.length),e=arguments.length,u=[],c=0;r>c;)u.push(String(n[c++])),c<e&&u.push(String(arguments[c]));return u.join("")}})},function(t,n,r){r(45)("trim",function(t){return function trim(){return t(this,3)}})},function(t,n,r){var e=r(0),i=r(79)(!1);e(e.P,"String",{codePointAt:function codePointAt(t){return i(this,t)}})},function(t,n,e){var i=e(0),o=e(8),u=e(80),c="".endsWith;i(i.P+i.F*e(81)("endsWith"),"String",{endsWith:function endsWith(t){var n=u(this,t,"endsWith"),e=arguments.length>1?arguments[1]:r,i=o(n.length),f=e===r?i:Math.min(o(e),i),a=String(t);return c?c.call(n,a,f):n.slice(f-a.length,f)===a}})},function(t,n,e){var i=e(0),o=e(80);i(i.P+i.F*e(81)("includes"),"String",{includes:function includes(t){return!!~o(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:r)}})},function(t,n,r){var e=r(0);e(e.P,"String",{repeat:r(76)})},function(t,n,e){var i=e(0),o=e(8),u=e(80),c="".startsWith;i(i.P+i.F*e(81)("startsWith"),"String",{startsWith:function startsWith(t){var n=u(this,t,"startsWith"),e=o(Math.min(arguments.length>1?arguments[1]:r,n.length)),i=String(t);return c?c.call(n,i,e):n.slice(e,e+i.length)===i}})},function(t,n,e){var i=e(79)(!0);e(55)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,e=this._i;return e>=n.length?{value:r,done:!0}:(t=i(n,e),this._i+=t.length,{value:t,done:!1})})},function(t,n,r){r(17)("anchor",function(t){return function anchor(n){return t(this,"a","name",n)}})},function(t,n,r){r(17)("big",function(t){return function big(){return t(this,"big","","")}})},function(t,n,r){r(17)("blink",function(t){return function blink(){return t(this,"blink","","")}})},function(t,n,r){r(17)("bold",function(t){return function bold(){return t(this,"b","","")}})},function(t,n,r){r(17)("fixed",function(t){return function fixed(){return t(this,"tt","","")}})},function(t,n,r){r(17)("fontcolor",function(t){return function fontcolor(n){return t(this,"font","color",n)}})},function(t,n,r){r(17)("fontsize",function(t){return function fontsize(n){return t(this,"font","size",n)}})},function(t,n,r){r(17)("italics",function(t){return function italics(){return t(this,"i","","")}})},function(t,n,r){r(17)("link",function(t){return function link(n){return t(this,"a","href",n)}})},function(t,n,r){r(17)("small",function(t){return function small(){return t(this,"small","","")}})},function(t,n,r){r(17)("strike",function(t){return function strike(){return t(this,"strike","","")}})},function(t,n,r){r(17)("sub",function(t){return function sub(){return t(this,"sub","","")}})},function(t,n,r){r(17)("sup",function(t){return function sup(){return t(this,"sup","","")}})},function(t,n,r){var e=r(0);e(e.S,"Array",{isArray:r(53)})},function(t,n,e){var i=e(19),o=e(0),u=e(9),c=e(106),f=e(82),a=e(8),s=e(83),l=e(49);o(o.S+o.F*!e(57)(function(t){Array.from(t)}),"Array",{from:function from(t){var n,e,o,h,p=u(t),v="function"==typeof this?this:Array,g=arguments.length,y=g>1?arguments[1]:r,d=y!==r,_=0,b=l(p);if(d&&(y=i(y,g>2?arguments[2]:r,2)),b==r||v==Array&&f(b))for(e=new v(n=a(p.length));n>_;_++)s(e,_,d?y(p[_],_):p[_]);else for(h=b.call(p),e=new v;!(o=h.next()).done;_++)s(e,_,d?c(h,y,[o.value,_],!0):o.value);return e.length=_,e}})},function(t,n,r){var e=r(0),i=r(83);e(e.S+e.F*r(3)(function(){function F(){}return!(Array.of.call(F)instanceof F)}),"Array",{of:function of(){for(var t=0,n=arguments.length,r=new("function"==typeof this?this:Array)(n);n>t;)i(r,t,arguments[t++]);return r.length=n,r}})},function(t,n,e){var i=e(0),o=e(11),u=[].join;i(i.P+i.F*(e(47)!=Object||!e(21)(u)),"Array",{join:function join(t){return u.call(o(this),t===r?",":t)}})},function(t,n,e){var i=e(0),o=e(70),u=e(20),c=e(37),f=e(8),a=[].slice;i(i.P+i.F*e(3)(function(){o&&a.call(o)}),"Array",{slice:function slice(t,n){var e=f(this.length),i=u(this);if(n=n===r?e:n,"Array"==i)return a.call(this,t,n);for(var o=c(t,e),s=c(n,e),l=f(s-o),h=Array(l),p=0;p<l;p++)h[p]="String"==i?this.charAt(o+p):this[o+p];return h}})},function(t,n,e){var i=e(0),o=e(10),u=e(9),c=e(3),f=[].sort,a=[1,2,3];i(i.P+i.F*(c(function(){a.sort(r)})||!c(function(){a.sort(null)})||!e(21)(f)),"Array",{sort:function sort(t){return t===r?f.call(u(this)):f.call(u(this),o(t))}})},function(t,n,r){var e=r(0),i=r(26)(0),o=r(21)([].forEach,!0);
vendor: 18,465 bytes, lines 62757-62758
62757e(e.P+e.F*!o,"Array",{forEach:function forEach(t){return i(this,t,arguments[1])}})},function(t,n,e){var i=e(4),o=e(53),u=e(5)("species");t.exports=function(t){var n;return o(t)&&("function"!=typeof(n=t.constructor)||n!==Array&&!o(n.prototype)||(n=r),i(n)&&null===(n=n[u])&&(n=r)),n===r?Array:n}},function(t,n,r){var e=r(0),i=r(26)(1);e(e.P+e.F*!r(21)([].map,!0),"Array",{map:function map(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(26)(2);e(e.P+e.F*!r(21)([].filter,!0),"Array",{filter:function filter(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(26)(3);e(e.P+e.F*!r(21)([].some,!0),"Array",{some:function some(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(26)(4);e(e.P+e.F*!r(21)([].every,!0),"Array",{every:function every(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(107);e(e.P+e.F*!r(21)([].reduce,!0),"Array",{reduce:function reduce(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,n,r){var e=r(0),i=r(107);e(e.P+e.F*!r(21)([].reduceRight,!0),"Array",{reduceRight:function reduceRight(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,n,r){var e=r(0),i=r(51)(!1),o=[].indexOf,u=!!o&&1/[1].indexOf(1,-0)<0;e(e.P+e.F*(u||!r(21)(o)),"Array",{indexOf:function indexOf(t){return u?o.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(11),o=r(24),u=r(8),c=[].lastIndexOf,f=!!c&&1/[1].lastIndexOf(1,-0)<0;e(e.P+e.F*(f||!r(21)(c)),"Array",{lastIndexOf:function lastIndexOf(t){if(f)return c.apply(this,arguments)||0;var n=i(this),r=u(n.length),e=r-1;for(arguments.length>1&&(e=Math.min(e,o(arguments[1]))),e<0&&(e=r+e);e>=0;e--)if(e in n&&n[e]===t)return e||0;return-1}})},function(t,n,r){var e=r(0);e(e.P,"Array",{copyWithin:r(108)}),r(33)("copyWithin")},function(t,n,r){var e=r(0);e(e.P,"Array",{fill:r(85)}),r(33)("fill")},function(t,n,e){var i=e(0),o=e(26)(5),u=!0;"find"in[]&&Array(1).find(function(){u=!1}),i(i.P+i.F*u,"Array",{find:function find(t){return o(this,t,arguments.length>1?arguments[1]:r)}}),e(33)("find")},function(t,n,e){var i=e(0),o=e(26)(6),u="findIndex",c=!0;u in[]&&Array(1)[u](function(){c=!1}),i(i.P+i.F*c,"Array",{findIndex:function findIndex(t){return o(this,t,arguments.length>1?arguments[1]:r)}}),e(33)(u)},function(t,n,r){r(41)("Array")},function(t,n,e){var i=e(2),o=e(74),u=e(6).f,c=e(38).f,f=e(54),a=e(58),s=i.RegExp,l=s,h=s.prototype,p=/a/g,v=/a/g,g=new s(p)!==p;if(e(7)&&(!g||e(3)(function(){return v[e(5)("match")]=!1,s(p)!=p||s(v)==v||"/a/i"!=s(p,"i")}))){s=function RegExp(t,n){var e=this instanceof s,i=f(t),u=n===r;return!e&&i&&t.constructor===s&&u?t:o(g?new l(i&&!u?t.source:t,n):l((i=t instanceof s)?t.source:t,i&&u?a.call(t):n),e?this:h,s)};for(var y=c(l),d=0;y.length>d;)!function(t){t in s||u(s,t,{configurable:!0,get:function(){return l[t]},set:function(n){l[t]=n}})}(y[d++]);h.constructor=s,s.prototype=h,e(14)(i,"RegExp",s)}e(41)("RegExp")},function(t,n,e){e(109);var i=e(1),o=e(58),u=e(7),c=/./.toString,f=function(t){e(14)(RegExp.prototype,"toString",t,!0)};e(3)(function(){return"/a/b"!=c.call({source:"a",flags:"b"})})?f(function toString(){var t=i(this);return"/".concat(t.source,"/","flags"in t?t.flags:!u&&t instanceof RegExp?o.call(t):r)}):"toString"!=c.name&&f(function toString(){return c.call(this)})},function(t,n,e){e(59)("match",1,function(t,n,e){return[function match(e){var i=t(this),o=e==r?r:e[n];return o!==r?o.call(e,i):new RegExp(e)[n](String(i))},e]})},function(t,n,e){e(59)("replace",2,function(t,n,e){return[function replace(i,o){var u=t(this),c=i==r?r:i[n];return c!==r?c.call(i,u,o):e.call(String(u),i,o)},e]})},function(t,n,e){e(59)("search",1,function(t,n,e){return[function search(e){var i=t(this),o=e==r?r:e[n];return o!==r?o.call(e,i):new RegExp(e)[n](String(i))},e]})},function(t,n,e){e(59)("split",2,function(t,n,i){var o=e(54),u=i,c=[].push,f="length";if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1)[f]||2!="ab".split(/(?:ab)*/)[f]||4!=".".split(/(.?)(.?)/)[f]||".".split(/()()/)[f]>1||"".split(/.?/)[f]){var a=/()??/.exec("")[1]===r;i=function(t,n){var e=String(this);if(t===r&&0===n)return[];if(!o(t))return u.call(e,t,n);var i,s,l,h,p,v=[],g=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),y=0,d=n===r?4294967295:n>>>0,_=new RegExp(t.source,g+"g");for(a||(i=new RegExp("^"+_.source+"$(?!\\s)",g));(s=_.exec(e))&&!((l=s.index+s[0][f])>y&&(v.push(e.slice(y,s.index)),!a&&s[f]>1&&s[0].replace(i,function(){for(p=1;p<arguments[f]-2;p++)arguments[p]===r&&(s[p]=r)}),s[f]>1&&s.index<e[f]&&c.apply(v,s.slice(1)),h=s[0][f],y=l,v[f]>=d));)_.lastIndex===s.index&&_.lastIndex++;return y===e[f]?!h&&_.test("")||v.push(""):v.push(e.slice(y)),v[f]>d?v.slice(0,d):v}}else"0".split(r,0)[f]&&(i=function(t,n){return t===r&&0===n?[]:u.call(this,t,n)});return[function split(e,o){var u=t(this),c=e==r?r:e[n];return c!==r?c.call(e,u,o):i.call(String(u),e,o)},i]})},function(t,n,e){
62758var i,o,u,c,f=e(36),a=e(2),s=e(19),l=e(39),h=e(0),p=e(4),v=e(10),g=e(42),y=e(34),d=e(60),_=e(88).set,b=e(89)(),S=e(90),m=e(110),x=e(111),w=a.TypeError,E=a.process,O=a.Promise,P="process"==l(E),M=function(){},F=o=S.f,I=!!function(){try{var t=O.resolve(1),n=(t.constructor={})[e(5)("species")]=function(t){t(M,M)};return(P||"function"==typeof PromiseRejectionEvent)&&t.then(M)instanceof n}catch(r){}}(),A=function(t){var n;return!(!p(t)||"function"!=typeof(n=t.then))&&n},k=function(t,n){if(!t._n){t._n=!0;var r=t._c;b(function(){for(var e=t._v,i=1==t._s,o=0;r.length>o;)!function(n){var r,o,u=i?n.ok:n.fail,c=n.resolve,f=n.reject,a=n.domain;try{u?(i||(2==t._h&&T(t),t._h=1),!0===u?r=e:(a&&a.enter(),r=u(e),a&&a.exit()),r===n.promise?f(w("Promise-chain cycle")):(o=A(r))?o.call(r,c,f):c(r)):f(e)}catch(s){f(s)}}(r[o++]);t._c=[],t._n=!1,n&&!t._h&&N(t)})}},N=function(t){_.call(a,function(){var n,e,i,o=t._v,u=j(t);if(u&&(n=m(function(){P?E.emit("unhandledRejection",o,t):(e=a.onunhandledrejection)?e({promise:t,reason:o}):(i=a.console)&&i.error&&i.error("Unhandled promise rejection",o)}),t._h=P||j(t)?2:1),t._a=r,u&&n.e)throw n.v})},j=function(t){if(1==t._h)return!1;for(var n,r=t._a||t._c,e=0;r.length>e;)if((n=r[e++]).fail||!j(n.promise))return!1;return!0},T=function(t){_.call(a,function(){var n;P?E.emit("rejectionHandled",t):(n=a.onrejectionhandled)&&n({promise:t,reason:t._v})})},R=function(t){var n=this;n._d||(n._d=!0,(n=n._w||n)._v=t,n._s=2,n._a||(n._a=n._c.slice()),k(n,!0))},D=function(t){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===t)throw w("Promise can't be resolved itself");(n=A(t))?b(function(){var e={_w:r,_d:!1};try{n.call(t,s(D,e,1),s(R,e,1))}catch(i){R.call(e,i)}}):(r._v=t,r._s=1,k(r,!1))}catch(e){R.call({_w:r,_d:!1},e)}}};I||(O=function Promise(t){g(this,O,"Promise","_h"),v(t),i.call(this);try{t(s(D,this,1),s(R,this,1))}catch(n){R.call(this,n)}},(i=function Promise(t){this._c=[],this._a=r,this._s=0,this._d=!1,this._v=r,this._h=0,this._n=!1}).prototype=e(43)(O.prototype,{then:function then(t,n){var e=F(d(this,O));return e.ok="function"!=typeof t||t,e.fail="function"==typeof n&&n,e.domain=P?E.domain:r,this._c.push(e),this._a&&this._a.push(e),this._s&&k(this,!1),e.promise},"catch":function(t){return this.then(r,t)}}),u=function(){var t=new i;this.promise=t,this.resolve=s(D,t,1),this.reject=s(R,t,1)},S.f=F=function(t){return t===O||t===c?new u(t):o(t)}),h(h.G+h.W+h.F*!I,{Promise:O}),e(44)(O,"Promise"),e(41)("Promise"),c=e(18).Promise,h(h.S+h.F*!I,"Promise",{reject:function reject(t){var n=F(this);return(0,n.reject)(t),n.promise}}),h(h.S+h.F*(f||!I),"Promise",{resolve:function resolve(t){return x(f&&this===c?O:this,t)}}),h(h.S+h.F*!(I&&e(57)(function(t){O.all(t)["catch"](M)})),"Promise",{all:function all(t){var n=this,e=F(n),i=e.resolve,o=e.reject,u=m(function(){var e=[],u=0,c=1;y(t,!1,function(t){var f=u++,a=!1;e.push(r),c++,n.resolve(t).then(function(t){a||(a=!0,e[f]=t,--c||i(e))},o)}),--c||i(e)});return u.e&&o(u.v),e.promise},race:function race(t){var n=this,r=F(n),e=r.reject,i=m(function(){y(t,!1,function(t){n.resolve(t).then(r.resolve,e)})});return i.e&&e(i.v),r.promise}})},function(t,n,e){var i=e(116),o=e(46);e(61)("WeakSet",function(t){return function WeakSet(){return t(this,arguments.length>0?arguments[0]:r)}},{add:function add(t){return i.def(o(this,"WeakSet"),t,!0)}},i,!1,!0)},function(t,n,r){var e=r(0),i=r(10),o=r(1),u=(r(2).Reflect||{}).apply,c=Function.apply;e(e.S+e.F*!r(3)(function(){u(function(){})}),"Reflect",{apply:function apply(t,n,r){var e=i(t),f=o(r);return u?u(e,n,f):c.call(e,n,f)}})},function(t,n,r){var e=r(0),i=r(28),o=r(10),u=r(1),c=r(4),f=r(3),a=r(99),s=(r(2).Reflect||{}).construct,l=f(function(){function F(){}return!(s(function(){},[],F)instanceof F)}),h=!f(function(){s(function(){})});e(e.S+e.F*(l||h),"Reflect",{construct:function construct(t,n){o(t),u(n);var r=arguments.length<3?t:o(arguments[2]);if(h&&!l)return s(t,n,r);if(t==r){switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3])}var e=[null];return e.push.apply(e,n),new(a.apply(t,e))}var f=r.prototype,p=i(c(f)?f:Object.prototype),v=Function.apply.call(t,p,n);return c(v)?v:p}})},function(t,n,r){var e=r(6),i=r(0),o=r(1),u=r(22);i(i.S+i.F*r(3)(function(){Reflect.defineProperty(e.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function defineProperty(t,n,r){o(t),n=u(n,!0),o(r);try{return e.f(t,n,r),!0}catch(i){return!1}}})},function(t,n,r){var e=r(0),i=r(15).f,o=r(1);e(e.S,"Reflect",{deleteProperty:function deleteProperty(t,n){var r=i(o(t),n);return!(r&&!r.configurable)&&delete t[n]}})},function(t,n,e){var i=e(0),o=e(1),u=function(t){this._t=o(t),this._i=0;var n,r=this._k=[];for(n in t)r.push(n)};e(56)(u,"Object",function(){var t,n=this,e=n._k;do{if(n._i>=e.length)return{value:r,done:!0}}while(!((t=e[n._i++])in n._t));return{value:t,done:!1}}),i(i.S,"Reflect",{enumerate:function enumerate(t){return new u(t)}})},function(t,n,e){function get(t,n){var e,c,s=arguments.length<3?t:arguments[2];return a(t)===s?t[n]:(e=i.f(t,n))?u(e,"value")?e.value:e.get!==r?e.get.call(s):r:f(c=o(t))?get(c,n,s):void 0}var i=e(15),o=e(16),u=e(12),c=e(0),f=e(4),a=e(1);c(c.S,"Reflect",{get:get})},function(t,n,r){var e=r(15),i=r(0),o=r(1);i(i.S,"Reflect",{getOwnPropertyDescriptor:function getOwnPropertyDescriptor(t,n){return e.f(o(t),n)}})},function(t,n,r){var e=r(0),i=r(16),o=r(1);e(e.S,"Reflect",{getPrototypeOf:function getPrototypeOf(t){return i(o(t))}})},function(t,n,r){var e=r(0);e(e.S,"Reflect",{has:function has(t,n){return n in t}})},function(t,n,r){var e=r(0),i=r(1),o=Object.isExtensible;e(e.S,"Reflect",{isExtensible:function isExtensible(t){return i(t),!o||o(t)}})},function(t,n,r){var e=r(0);e(e.S,"Reflect",{ownKeys:r(91)})},function(t,n,r){var e=r(0),i=r(1),o=Object.preventExtensions;e(e.S,"Reflect",{preventExtensions:function preventExtensions(t){i(t);try{return o&&o(t),!0}catch(n){return!1}}})},function(t,n,e){function set(t,n,e){var f,h,p=arguments.length<4?t:arguments[3],v=o.f(s(t),n);if(!v){if(l(h=u(t)))return set(h,n,e,p);v=a(0)}return c(v,"value")?!(!1===v.writable||!l(p))&&(f=o.f(p,n)||a(0),f.value=e,i.f(p,n,f),!0):v.set!==r&&(v.set.call(p,e),!0)}var i=e(6),o=e(15),u=e(16),c=e(12),f=e(0),a=e(31),s=e(1),l=e(4);f(f.S,"Reflect",{set:set})},function(t,n,r){var e=r(0),i=r(72);i&&e(e.S,"Reflect",{setPrototypeOf:function setPrototypeOf(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(r){return!1}}})},function(t,n,r){var e=r(0);e(e.S,"Date",{now:function(){return(new Date).getTime()}})},function(t,n,r){var e=r(0),i=r(9),o=r(22);e(e.P+e.F*r(3)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function toJSON(t){var n=i(this),r=o(n);return"number"!=typeof r||isFinite(r)?n.toISOString():null}})},function(t,n,r){var e=r(0),i=r(251);e(e.P+e.F*(Date.prototype.toISOString!==i),"Date",{toISOString:i})},function(t,n,r){var e=r(3),i=Date.prototype.getTime,o=Date.prototype.toISOString,u=function(t){return t>9?t:"0"+t};t.exports=e(function(){return"0385-07-25T07:06:39.999Z"!=o.call(new Date(-5e13-1))})||!e(function(){o.call(new Date(NaN))})?function toISOString(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var t=this,n=t.getUTCFullYear(),r=t.getUTCMilliseconds(),e=n<0?"-":n>9999?"+":"";return e+("00000"+Math.abs(n)).slice(e?-6:-4)+"-"+u(t.getUTCMonth()+1)+"-"+u(t.getUTCDate())+"T"+u(t.getUTCHours())+":"+u(t.getUTCMinutes())+":"+u(t.getUTCSeconds())+"."+(r>99?r:"0"+u(r))+"Z"}:o},function(t,n,r){var e=Date.prototype,i=e.toString,o=e.getTime;new Date(NaN)+""!="Invalid Date"&&r(14)(e,"toString",function toString(){var t=o.call(this);return t===t?i.call(this):"Invalid Date"})},function(t,n,r){var e=r(5)("toPrimitive"),i=Date.prototype;e in i||r(13)(i,e,r(254))},function(t,n,r){var e=r(1),i=r(22);t.exports=function(t){if("string"!==t&&"number"!==t&&"default"!==t)throw TypeError("Incorrect hint");return i(e(this),"number"!=t)}},function(t,n,e){var i=e(0),o=e(62),u=e(92),c=e(1),f=e(37),a=e(8),s=e(4),l=e(2).ArrayBuffer,h=e(60),p=u.ArrayBuffer,v=u.DataView,g=o.ABV&&l.isView,y=p.prototype.slice,d=o.VIEW;i(i.G+i.W+i.F*(l!==p),{ArrayBuffer:p}),i(i.S+i.F*!o.CONSTR,"ArrayBuffer",{isView:function isView(t){return g&&g(t)||s(t)&&d in t}}),i(i.P+i.U+i.F*e(3)(function(){return!new p(2).slice(1,r).byteLength}),"ArrayBuffer",{slice:function slice(t,n){if(y!==r&&n===r)return y.call(c(this),t);for(var e=c(this).byteLength,i=f(t,e),o=f(n===r?e:n,e),u=new(h(this,p))(a(o-i)),s=new v(this),l=new v(u),g=0;i<o;)l.setUint8(g++,s.getUint8(i++));return u}}),e(41)("ArrayBuffer")},function(t,n,r){var e=r(0);e(e.G+e.W+e.F*!r(62).ABV,{DataView:r(92).DataView})},function(t,n,r){r(29)("Int8",1,function(t){return function Int8Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint8",1,function(t){return function Uint8Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint8",1,function(t){return function Uint8ClampedArray(n,r,e){return t(this,n,r,e)}},!0)},function(t,n,r){r(29)("Int16",2,function(t){return function Int16Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint16",2,function(t){return function Uint16Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Int32",4,function(t){return function Int32Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint32",4,function(t){return function Uint32Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Float32",4,function(t){return function Float32Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Float64",8,function(t){return function Float64Array(n,r,e){return t(this,n,r,e)}})},function(t,n,e){var i=e(0),o=e(51)(!0);i(i.P,"Array",{includes:function includes(t){return o(this,t,arguments.length>1?arguments[1]:r)}}),e(33)("includes")},function(t,n,r){var e=r(0),i=r(118),o=r(9),u=r(8),c=r(10),f=r(84);e(e.P,"Array",{flatMap:function flatMap(t){var n,r,e=o(this);return c(t),n=u(e.length),r=f(e,0),i(r,e,e,n,0,1,t,arguments[1]),r}}),r(33)("flatMap")},function(t,n,e){var i=e(0),o=e(118),u=e(9),c=e(8),f=e(24),a=e(84);i(i.P,"Array",{flatten:function flatten(){var t=arguments[0],n=u(this),e=c(n.length),i=a(n,0);return o(i,n,n,e,0,t===r?1:f(t)),i}}),e(33)("flatten")},function(t,n,r){var e=r(0),i=r(79)(!0);e(e.P,"String",{at:function at(t){return i(this,t)}})},function(t,n,e){var i=e(0),o=e(119);i(i.P,"String",{padStart:function padStart(t){return o(this,t,arguments.length>1?arguments[1]:r,!0)}})},function(t,n,e){var i=e(0),o=e(119);i(i.P,"String",{padEnd:function padEnd(t){return o(this,t,arguments.length>1?arguments[1]:r,!1)}})},function(t,n,r){r(45)("trimLeft",function(t){return function trimLeft(){return t(this,1)}},"trimStart")},function(t,n,r){r(45)("trimRight",function(t){return function trimRight(){return t(this,2)}},"trimEnd")},function(t,n,r){var e=r(0),i=r(23),o=r(8),u=r(54),c=r(58),f=RegExp.prototype,a=function(t,n){this._r=t,this._s=n};r(56)(a,"RegExp String",function next(){var t=this._r.exec(this._s);return{value:t,done:null===t}}),e(e.P,"String",{matchAll:function matchAll(t){if(i(this),!u(t))throw TypeError(t+" is not a regexp!");var n=String(this),r="flags"in f?String(t.flags):c.call(t),e=new RegExp(t.source,~r.indexOf("g")?r:"g"+r);return e.lastIndex=o(t.lastIndex),new a(e,n)}})},function(t,n,r){r(67)("asyncIterator")},function(t,n,r){r(67)("observable")},function(t,n,e){var i=e(0),o=e(91),u=e(11),c=e(15),f=e(83);i(i.S,"Object",{getOwnPropertyDescriptors:function getOwnPropertyDescriptors(t){for(var n,e,i=u(t),a=c.f,s=o(i),l={},h=0;s.length>h;)(e=a(i,n=s[h++]))!==r&&f(l,n,e);return l}})},function(t,n,r){var e=r(0),i=r(120)(!1);e(e.S,"Object",{values:function values(t){return i(t)}})},function(t,n,r){var e=r(0),i=r(120)(!0);e(e.S,"Object",{entries:function entries(t){return i(t)}})},function(t,n,r){var e=r(0),i=r(9),o=r(10),u=r(6);r(7)&&e(e.P+r(63),"Object",{__defineGetter__:function __defineGetter__(t,n){u.f(i(this),t,{get:o(n),enumerable:!0,configurable:!0})}})},function(t,n,r){var e=r(0),i=r(9),o=r(10),u=r(6);r(7)&&e(e.P+r(63),"Object",{__defineSetter__:function __defineSetter__(t,n){u.f(i(this),t,{set:o(n),enumerable:!0,configurable:!0})}})},function(t,n,r){var e=r(0),i=r(9),o=r(22),u=r(16),c=r(15).f;r(7)&&e(e.P+r(63),"Object",{__lookupGetter__:function __lookupGetter__(t){var n,r=i(this),e=o(t,!0);do{if(n=c(r,e))return n.get}while(r=u(r))}})},function(t,n,r){var e=r(0),i=r(9),o=r(22),u=r(16),c=r(15).f;r(7)&&e(e.P+r(63),"Object",{__lookupSetter__:function __lookupSetter__(t){var n,r=i(this),e=o(t,!0);do{if(n=c(r,e))return n.set}while(r=u(r))}})},function(t,n,r){var e=r(0);e(e.P+e.R,"Map",{toJSON:r(121)("Map")})},function(t,n,r){var e=r(0);e(e.P+e.R,"Set",{toJSON:r(121)("Set")})},function(t,n,r){r(64)("Map")},function(t,n,r){r(64)("Set")},function(t,n,r){r(64)("WeakMap")},function(t,n,r){r(64)("WeakSet")},function(t,n,r){r(65)("Map")},function(t,n,r){r(65)("Set")},function(t,n,r){r(65)("WeakMap")},function(t,n,r){r(65)("WeakSet")},function(t,n,r){var e=r(0);e(e.G,{global:r(2)})},function(t,n,r){var e=r(0);e(e.S,"System",{global:r(2)})},function(t,n,r){var e=r(0),i=r(20);e(e.S,"Error",{isError:function isError(t){return"Error"===i(t)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{clamp:function clamp(t,n,r){return Math.min(r,Math.max(n,t))}})},function(t,n,r){var e=r(0);e(e.S,"Math",{DEG_PER_RAD:Math.PI/180})},function(t,n,r){var e=r(0),i=180/Math.PI;e(e.S,"Math",{degrees:function degrees(t){return t*i}})}
62758,function(t,n,r){var e=r(0),i=r(123),o=r(105);e(e.S,"Math",{fscale:function fscale(t,n,r,e,u){return o(i(t,n,r,e,u))}})},function(t,n,r){var e=r(0);e(e.S,"Math",{iaddh:function iaddh(t,n,r,e){var i=t>>>0,o=r>>>0;return(n>>>0)+(e>>>0)+((i&o|(i|o)&~(i+o>>>0))>>>31)|0}})},function(t,n,r){var e=r(0);e(e.S,"Math",{isubh:function isubh(t,n,r,e){var i=t>>>0,o=r>>>0;return(n>>>0)-(e>>>0)-((~i&o|~(i^o)&i-o>>>0)>>>31)|0}})},function(t,n,r){var e=r(0);e(e.S,"Math",{imulh:function imulh(t,n){var r=+t,e=+n,i=65535&r,o=65535&e,u=r>>16,c=e>>16,f=(u*o>>>0)+(i*o>>>16);return u*c+(f>>16)+((i*c>>>0)+(65535&f)>>16)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{RAD_PER_DEG:180/Math.PI})},function(t,n,r){var e=r(0),i=Math.PI/180;e(e.S,"Math",{radians:function radians(t){return t*i}})},function(t,n,r){var e=r(0);e(e.S,"Math",{scale:r(123)})},function(t,n,r){var e=r(0);e(e.S,"Math",{umulh:function umulh(t,n){var r=+t,e=+n,i=65535&r,o=65535&e,u=r>>>16,c=e>>>16,f=(u*o>>>0)+(i*o>>>16);return u*c+(f>>>16)+((i*c>>>0)+(65535&f)>>>16)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{signbit:function signbit(t){return(t=+t)!=t?t:0==t?1/t==Infinity:t>0}})},function(t,n,r){var e=r(0),i=r(18),o=r(2),u=r(60),c=r(111);e(e.P+e.R,"Promise",{"finally":function(t){var n=u(this,i.Promise||o.Promise),r="function"==typeof t;return this.then(r?function(r){return c(n,t()).then(function(){return r})}:t,r?function(r){return c(n,t()).then(function(){throw r})}:t)}})},function(t,n,r){var e=r(0),i=r(90),o=r(110);e(e.S,"Promise",{"try":function(t){var n=i.f(this),r=o(t);return(r.e?n.reject:n.resolve)(r.v),n.promise}})},function(t,n,r){var e=r(30),i=r(1),o=e.key,u=e.set;e.exp({defineMetadata:function defineMetadata(t,n,r,e){u(t,n,i(r),o(e))}})},function(t,n,e){var i=e(30),o=e(1),u=i.key,c=i.map,f=i.store;i.exp({deleteMetadata:function deleteMetadata(t,n){var e=arguments.length<3?r:u(arguments[2]),i=c(o(n),e,!1);if(i===r||!i["delete"](t))return!1;if(i.size)return!0;var a=f.get(n);return a["delete"](e),!!a.size||f["delete"](n)}})},function(t,n,e){var i=e(30),o=e(1),u=e(16),c=i.has,f=i.get,a=i.key,s=function(t,n,e){if(c(t,n,e))return f(t,n,e);var i=u(n);return null!==i?s(t,i,e):r};i.exp({getMetadata:function getMetadata(t,n){return s(t,o(n),arguments.length<3?r:a(arguments[2]))}})},function(t,n,e){var i=e(114),o=e(122),u=e(30),c=e(1),f=e(16),a=u.keys,s=u.key,l=function(t,n){var r=a(t,n),e=f(t);if(null===e)return r;var u=l(e,n);return u.length?r.length?o(new i(r.concat(u))):u:r};u.exp({getMetadataKeys:function getMetadataKeys(t){return l(c(t),arguments.length<2?r:s(arguments[1]))}})},function(t,n,e){var i=e(30),o=e(1),u=i.get,c=i.key;i.exp({getOwnMetadata:function getOwnMetadata(t,n){return u(t,o(n),arguments.length<3?r:c(arguments[2]))}})},function(t,n,e){var i=e(30),o=e(1),u=i.keys,c=i.key;i.exp({getOwnMetadataKeys:function getOwnMetadataKeys(t){return u(o(t),arguments.length<2?r:c(arguments[1]))}})},function(t,n,e){var i=e(30),o=e(1),u=e(16),c=i.has,f=i.key,a=function(t,n,r){if(c(t,n,r))return!0;var e=u(n);return null!==e&&a(t,e,r)};i.exp({hasMetadata:function hasMetadata(t,n){return a(t,o(n),arguments.length<3?r:f(arguments[2]))}})},function(t,n,e){var i=e(30),o=e(1),u=i.has,c=i.key;i.exp({hasOwnMetadata:function hasOwnMetadata(t,n){return u(t,o(n),arguments.length<3?r:c(arguments[2]))}})},function(t,n,e){var i=e(30),o=e(1),u=e(10),c=i.key,f=i.set;i.exp({metadata:function metadata(t,n){return function decorator(e,i){f(t,n,(i!==r?o:u)(e),c(i))}}})},function(t,n,r){var e=r(0),i=r(89)(),o=r(2).process,u="process"==r(20)(o);e(e.G,{asap:function asap(t){var n=u&&o.domain;i(n?n.bind(t):t)}})},function(t,n,e){var i=e(0),o=e(2),u=e(18),c=e(89)(),f=e(5)("observable"),a=e(10),s=e(1),l=e(42),h=e(43),p=e(13),v=e(34),g=v.RETURN,y=function(t){return null==t?r:a(t)},d=function(t){var n=t._c;n&&(t._c=r,n())},_=function(t){return t._o===r},b=function(t){_(t)||(t._o=r,d(t))},S=function(t,n){s(t),this._c=r,this._o=t,t=new m(this);try{var e=n(t),i=e;null!=e&&("function"==typeof e.unsubscribe?e=function(){i.unsubscribe()}:a(e),this._c=e)}catch(o){return void t.error(o)}_(this)&&d(this)};S.prototype=h({},{unsubscribe:function unsubscribe(){b(this)}});var m=function(t){this._s=t};m.prototype=h({},{next:function next(t){var n=this._s;if(!_(n)){var r=n._o;try{var e=y(r.next);if(e)return e.call(r,t)}catch(i){try{b(n)}finally{throw i}}}},error:function error(t){var n=this._s;if(_(n))throw t;var e=n._o;n._o=r;try{var i=y(e.error);if(!i)throw t;t=i.call(e,t)}catch(o){try{d(n)}finally{throw o}}return d(n),t},complete:function complete(t){var n=this._s;if(!_(n)){var e=n._o;n._o=r;try{var i=y(e.complete);t=i?i.call(e,t):r}catch(o){try{d(n)}finally{throw o}}return d(n),t}}});var x=function Observable(t){l(this,x,"Observable","_f")._f=a(t)};h(x.prototype,{subscribe:function subscribe(t){return new S(t,this._f)}
62758,forEach:function forEach(t){var n=this;return new(u.Promise||o.Promise)(function(r,e){a(t);var i=n.subscribe({next:function(n){try{return t(n)}catch(r){e(r),i.unsubscribe()}},error:e,complete:r})})}}),h(x,{from:function from(t){var n="function"==typeof this?this:x,r=y(s(t)[f]);if(r){var e=s(r.call(t));return e.constructor===n?e:new n(function(t){return e.subscribe(t)})}return new n(function(n){var r=!1;return c(function(){if(!r){try{if(v(t,!1,function(t){if(n.next(t),r)return g})===g)return}catch(e){if(r)throw e;return void n.error(e)}n.complete()}}),function(){r=!0}})},of:function of(){for(var t=0,n=arguments.length,r=Array(n);t<n;)r[t]=arguments[t++];return new("function"==typeof this?this:x)(function(t){var n=!1;return c(function(){if(!n){for(var e=0;e<r.length;++e)if(t.next(r[e]),n)return;t.complete()}}),function(){n=!0}})}}),p(x.prototype,f,function(){return this}),i(i.G,{Observable:x}),e(41)("Observable")},function(t,n,r){var e=r(0),i=r(88);e(e.G+e.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,r){for(var e=r(86),i=r(27),o=r(14),u=r(2),c=r(13),f=r(40),a=r(5),s=a("iterator"),l=a("toStringTag"),h=f.Array,p={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},v=i(p),g=0;g<v.length;g++){var y,d=v[g],_=p[d],b=u[d],S=b&&b.prototype;if(S&&(S[s]||c(S,s,h),S[l]||c(S,l,d),f[d]=h,_))for(y in e)S[y]||o(S,y,e[y],!0)}},function(t,n,r){var e=r(2),i=r(0),o=e.navigator,u=[].slice,c=!!o&&/MSIE .\./.test(o.userAgent),f=function(t){return function(n,r){var e=arguments.length>2,i=!!e&&u.call(arguments,2);return t(e?function(){("function"==typeof n?n:Function(n)).apply(this,i)}:n,r)}};i(i.G+i.B+i.F*c,{setTimeout:f(e.setTimeout),setInterval:f(e.setInterval)})},function(t,n,e){function Dict(t){var n=f(null);return t!=r&&(g(t)?v(t,!0,function(t,r){n[t]=r}):c(n,t)),n}var i=e(19),o=e(0),u=e(31),c=e(71),f=e(28),a=e(16),s=e(27),l=e(6),h=e(326),p=e(10),v=e(34),g=e(124),y=e(56),d=e(87),_=e(4),b=e(11),S=e(7),m=e(12),x=function(t){var n=1==t,e=4==t;return function(o,u,c){var f,a,s,l=i(u,c,3),h=b(o),p=n||7==t||2==t?new("function"==typeof this?this:Dict):r;for(f in h)if(m(h,f)&&(a=h[f],s=l(a,f,o),t))if(n)p[f]=s;else if(s)switch(t){case 2:p[f]=a;break;case 3:return!0;case 5:return a;case 6:return f;case 7:p[s[0]]=s[1]}else if(e)return!1;return 3==t||e?e:p}},w=x(6),E=function(t){return function(n){return new O(n,t)}},O=function(t,n){this._t=b(t),this._a=s(t),this._i=0,this._k=n};y(O,"Dict",function(){var t,n=this,e=n._t,i=n._a,o=n._k;do{if(n._i>=i.length)return n._t=r,d(1)}while(!m(e,t=i[n._i++]));return"keys"==o?d(0,t):"values"==o?d(0,e[t]):d(0,[t,e[t]])}),Dict.prototype=null,o(o.G+o.F,{Dict:Dict}),o(o.S,"Dict",{keys:E("keys"),values:E("values"),entries:E("entries"),forEach:x(0),map:x(1),filter:x(2),some:x(3),every:x(4),find:x(5),findKey:w,mapPairs:x(7),reduce:function reduce(t,n,r){p(n);var e,i,o=b(t),u=s(o),c=u.length,f=0;if(arguments.length<3){if(!c)throw TypeError("Reduce of empty object with no initial value");e=o[u[f++]]}else e=Object(r);for(;c>f;)m(o,i=u[f++])&&(e=n(e,o[i],i,t));return e},keyOf:h,includes:function includes(t,n){return(n==n?h(t,n):w(t,function(t){return t!=t}))!==r},has:m,get:function get(t,n){if(m(t,n))return t[n]},set:function set(t,n,r){return S&&n in Object?l.f(t,n,u(0,r)):t[n]=r,t},isDict:function isDict(t){return _(t)&&a(t)===Dict.prototype}})},function(t,n,r){var e=r(27),i=r(11);t.exports=function(t,n){for(var r,o=i(t),u=e(o),c=u.length,f=0;c>f;)if(o[r=u[f++]]===n)return r}},function(t,n,r){var e=r(1),i=r(49);t.exports=r(18).getIterator=function(t){var n=i(t);if("function"!=typeof n)throw TypeError(t+" is not iterable!");return e(n.call(t))}},function(t,n,r){var e=r(2),i=r(18),o=r(0),u=r(125);o(o.G+o.F,{delay:function delay(t){return new(i.Promise||e.Promise)(function(n){setTimeout(u.call(n,!0),t)})}})},function(t,n,r){var e=r(126),i=r(0);r(18)._=e._=e._||{},i(i.P+i.F,"Function",{part:r(125)})},function(t,n,r){var e=r(0);e(e.S+e.F,"Object",{isObject:r(4)})},function(t,n,r){var e=r(0);e(e.S+e.F,"Object",{classof:r(39)})},function(t,n,r){var e=r(0),i=r(127);e(e.S+e.F,"Object",{define:i})},function(t,n,r){var e=r(0),i=r(127),o=r(28);e(e.S+e.F,"Object",{make:function(t,n){return i(o(t),n)}})},function(t,n,e){e(55)(Number,"Number",function(t){this._l=+t,this._i=0},function(){var t=this._i++,n=!(t<this._l);return{done:n,value:n?r:t}})},function(t,n,r){var e=r(0),i=r(93)(/[\\^$*+?.()|[\]{}]/g,"\\$&");e(e.S,"RegExp",{escape:function escape(t){return i(t)}})},function(t,n,r){var e=r(0),i=r(93)(/[&<>"']/g,{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"});e(e.P+e.F,"String",{escapeHTML:function escapeHTML(){return i(this)}})},function(t,n,r){var e=r(0),i=r(93)(/&(?:amp|lt|gt|quot|apos);/g,{"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&apos;":"'"});e(e.P+e.F,"String",{unescapeHTML:function unescapeHTML(){return i(this)}})}]),"undefined"!=typeof module&&module.exports?module.exports=t:"function"==typeof define&&define.amd?define(function(){return t}):n.core=t}(1,1);
62759
vendor: 45,826 bytes, lines 62760-62764
62760/*!
62761* sweetalert2 v11.26.25
62762* Released under the MIT License.
62763*/
62764!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Sweetalert2=t()}(this,function(){"use strict";function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(t,n){return t.get(e(t,n))}function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const o={},i=e=>new Promise(t=>{if(!e)return t();const n=window.scrollX,i=window.scrollY;o.restoreFocusTimeout=setTimeout(()=>{o.previousActiveElement instanceof HTMLElement?(o.previousActiveElement.focus(),o.previousActiveElement=null):document.body&&document.body.focus(),t()},100),window.scrollTo(n,i)}),s="swal2-",r=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","draggable","dragging"].reduce((e,t)=>(e[t]=s+t,e),{}),a=["success","warning","info","question","error"].reduce((e,t)=>(e[t]=s+t,e),{}),l="SweetAlert2:",c=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${l} ${"object"==typeof e?e.join(" "):e}`)},d=e=>{console.error(`${l} ${e}`)},p=[],m=(e,t=null)=>{var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,p.includes(n)||(p.push(n),u(n))},h=e=>"function"==typeof e?e():e,g=e=>e&&"function"==typeof e.toPromise,f=e=>g(e)?e.toPromise():Promise.resolve(e),b=e=>e&&Promise.resolve(e)===e,y=()=>document.body.querySelector(`.${r.container}`),v=e=>{const t=y();return t?t.querySelector(e):null},w=e=>v(`.${e}`),C=()=>w(r.popup),A=()=>w(r.icon),E=()=>w(r.title),k=()=>w(r["html-container"]),B=()=>w(r.image),$=()=>w(r["progress-steps"]),L=()=>w(r["validation-message"]),P=()=>v(`.${r.actions} .${r.confirm}`),x=()=>v(`.${r.actions} .${r.cancel}`),T=()=>v(`.${r.actions} .${r.deny}`),S=()=>v(`.${r.loader}`),O=()=>w(r.actions),M=()=>w(r.footer),H=()=>w(r["timer-progress-bar"]),j=()=>w(r.close),I=()=>{const e=C();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),o=parseInt(t.getAttribute("tabindex")||"0");return n>o?1:n<o?-1:0}),o=e.querySelectorAll('\n  a[href],\n  area[href],\n  input:not([disabled]),\n  select:not([disabled]),\n  textarea:not([disabled]),\n  button:not([disabled]),\n  iframe,\n  object,\n  embed,\n  [tabindex="0"],\n  [contenteditable],\n  audio[controls],\n  video[controls],\n  summary\n'),i=Array.from(o).filter(e=>"-1"!==e.getAttribute("tabindex"));return[...new Set(n.concat(i))].filter(e=>ee(e))},D=()=>N(document.body,r.shown)&&!N(document.body,r["toast-shown"])&&!N(document.body,r["no-backdrop"]),V=()=>{const e=C();return!!e&&N(e,r.toast)},q=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),o=n.querySelector("head");o&&Array.from(o.childNodes).forEach(t=>{e.appendChild(t)});const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach(t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)})}},N=(e,t)=>!!t&&t.split(/\s+/).every(t=>e.classList.contains(t)),_=(e,t,n)=>{if(((e,t)=>{Array.from(e.classList).forEach(n=>{Object.values(r).includes(n)||Object.values(a).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)})})(e,t),!t.customClass)return;const o=t.customClass[n];o&&("string"==typeof o||o.forEach?z(e,o):u(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof o}"`))},F=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${r.popup} > .${r[t]}`);case"checkbox":return e.querySelector(`.${r.popup} > .${r.checkbox} input`);case"radio":return e.querySelector(`.${r.popup} > .${r.radio} input:checked`)||e.querySelector(`.${r.popup} > .${r.radio} input:first-child`);case"range":return e.querySelector(`.${r.popup} > .${r.range} input`);default:return e.querySelector(`.${r.popup} > .${r.input}`)}},R=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},U=(e,t,n)=>{if(!e||!t)return;const o="string"==typeof t?t.split(/\s+/).filter(Boolean):t;(Array.isArray(e)?e:[e]).forEach(e=>{o.forEach(t=>{n?e.classList.add(t):e.classList.remove(t)})})},z=(e,t)=>{U(e,t,!0)},W=(e,t)=>{U(e,t,!1)},K=(e,t)=>Array.from(e.children).find(e=>e instanceof HTMLElement&&N(e,t)),Y=(e,t,n)=>{n===`${parseInt(`${n}`)}`&&(n=parseInt(n)),n||0===n?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},X=(e,t="flex")=>{e&&(e.style.display=t)},Z=e=>{e&&(e.style.display="none")},J=(e,t="block")=>{e&&new MutationObserver(()=>{Q(e,e.innerHTML,t)}).observe(e,{childList:!0,subtree:!0})},G=(e,t,n,o)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,o)},Q=(e,t,n="flex")=>{t?X(e,n):Z(e)},ee=e=>Boolean(e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),te=e=>Boolean(e.scrollHeight>e.clientHeight),ne=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),o=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||o>0},oe=(e,t=!1)=>{const n=H();n&&ee(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout(()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"},10))},ie=`\n <div aria-labelledby="${r.title}" aria-describedby="${r["html-container"]}" class="${r.popup}" tabindex="-1">\n   <button type="button" class="${r.close}"></button>\n   <ul class="${r["progress-steps"]}"></ul>\n   <div class="${r.icon}"></div>\n   <img class="${r.image}" />\n   <h2 class="${r.title}" id="${r.title}"></h2>\n   <div class="${r["html-container"]}" id="${r["html-container"]}"></div>\n   <input class="${r.input}" id="${r.input}" />\n   <input type="file" class="${r.file}" />\n   <div class="${r.range}">\n     <input type="range" />\n     <output></output>\n   </div>\n   <select class="${r.select}" id="${r.select}"></select>\n   <div class="${r.radio}"></div>\n   <label class="${r.checkbox}">\n     <input type="checkbox" id="${r.checkbox}" />\n     <span class="${r.label}"></span>\n   </label>\n   <textarea class="${r.textarea}" id="${r.textarea}"></textarea>\n   <div class="${r["validation-message"]}" id="${r["validation-message"]}"></div>\n   <div class="${r.actions}">\n     <div class="${r.loader}"></div>\n     <button type="button" class="${r.confirm}"></button>\n     <button type="button" class="${r.deny}"></button>\n     <button type="button" class="${r.cancel}"></button>\n   </div>\n   <div class="${r.footer}"></div>\n   <div class="${r["timer-progress-bar-container"]}">\n     <div class="${r["timer-progress-bar"]}"></div>\n   </div>\n </div>\n`.replace(/(^|\n)\s*/g,""),se=()=>{o.currentInstance&&o.currentInstance.resetValidationMessage()},re=e=>{const t=(()=>{const e=y();return!!e&&(e.remove(),W([document.documentElement,document.body],[r["no-backdrop"],r["toast-shown"],r["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return void d("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=r.container,t&&z(n,r["no-transition"]),q(n,ie),n.dataset.swal2Theme=e.theme;const i=(e=>{if("string"==typeof e){const t=document.querySelector(e);if(!t)throw new Error(`Target element "${e}" not found`);return t}return e})(e.target||"body");i.appendChild(n),e.topLayer&&(n.setAttribute("popover",""),n.showPopover()),(e=>{const t=C();t&&(t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true"))})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&(z(y(),r.rtl),o.isRTL=!0)})(i),(()=>{const e=C();if(!e)return;const t=K(e,r.input),n=K(e,r.file),o=e.querySelector(`.${r.range} input`),i=e.querySelector(`.${r.range} output`),s=K(e,r.select),a=e.querySelector(`.${r.checkbox} input`),l=K(e,r.textarea);t&&(t.oninput=se),n&&(n.onchange=se),s&&(s.onchange=se),a&&(a.onchange=se),l&&(l.oninput=se),o&&i&&(o.oninput=()=>{se(),i.value=o.value},o.onchange=()=>{se(),i.value=o.value})})()},ae=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?le(e,t):e&&q(t,e)},le=(e,t)=>{"jquery"in e?ce(t,e):q(t,e.toString())},ce=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},ue=(e,t)=>{const n=O(),o=S();n&&o&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?X(n):Z(n),_(n,t,"actions"),function(e,t,n){const o=P(),i=T(),s=x();if(!o||!i||!s)return;de(o,"confirm",n),de(i,"deny",n),de(s,"cancel",n),function(e,t,n,o){if(!o.buttonsStyling)return void W([e,t,n],r.styled);z([e,t,n],r.styled);const i=[[e,"confirm",o.confirmButtonColor],[t,"deny",o.denyButtonColor],[n,"cancel",o.cancelButtonColor]];i.forEach(([e,t,n])=>{n&&e.style.setProperty(`--swal2-${t}-button-background-color`,n),function(e){const t=window.getComputedStyle(e);if(t.getPropertyValue("--swal2-action-button-focus-box-shadow"))return;const n=t.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/,"rgba($1, $2, $3, 0.5)");e.style.setProperty("--swal2-action-button-focus-box-shadow",t.getPropertyValue("--swal2-outline").replace(/ rgba\(.*/,` ${n}`))}(e)})}(o,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,o),e.insertBefore(i,o)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(o,t)))}(n,o,t),q(o,t.loaderHtml||""),_(o,t,"loader"))};function de(e,t,n){const o=c(t);Q(e,n[`show${o}Button`],"inline-block"),q(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=r[t],_(e,n,`${t}Button`)}const pe=(e,t)=>{const n=y();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||z([document.documentElement,document.body],r["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in r?z(e,r[t]):(u('The "position" parameter is not valid, defaulting to "center"'),z(e,r.center))}(n,t.position),function(e,t){if(!t)return;z(e,r[`grow-${t}`])}(n,t.grow),_(n,t,"container"))};var me={innerParams:new WeakMap,domCache:new WeakMap,focusedElement:new WeakMap};const he=["input","file","range","select","radio","checkbox","textarea"],ge=e=>{if(!e.input)return;if(!Ae[e.input])return void d(`Unexpected type of input! Expected ${Object.keys(Ae).join(" | ")}, got "${e.input}"`);const t=we(e.input);if(!t)return;const n=Ae[e.input](t,e);X(t),e.inputAutoFocus&&setTimeout(()=>{R(n)})},fe=(e,t)=>{const n=C();if(!n)return;const o=F(n,e);if(o){(e=>{for(const{name:t}of Array.from(e.attributes))["id","type","value","style"].includes(t)||e.removeAttribute(t)})(o);for(const e in t)o.setAttribute(e,t[e])}},be=e=>{if(!e.input)return;const t=we(e.input);t&&_(t,e,"input")},ye=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},ve=(e,t,n)=>{if(n.inputLabel){const o=document.createElement("label"),i=r["input-label"];o.setAttribute("for",e.id),o.className=i,"object"==typeof n.customClass&&z(o,n.customClass.inputLabel),o.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",o)}},we=e=>{const t=C();if(t)return K(t,r[e]||r.input)},Ce=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:b(t)||u(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ae={};Ae.text=Ae.email=Ae.password=Ae.number=Ae.tel=Ae.url=Ae.search=Ae.date=Ae["datetime-local"]=Ae.time=Ae.week=Ae.month=(e,t)=>{const n=e;return Ce(n,t.inputValue),ve(n,n,t),ye(n,t),n.type=t.input,n},Ae.file=(e,t)=>{const n=e;return ve(n,n,t),ye(n,t),n},Ae.range=(e,t)=>{const n=e,o=n.querySelector("input"),i=n.querySelector("output");return o&&(Ce(o,t.inputValue),o.type=t.input,ve(o,e,t)),i&&Ce(i,t.inputValue),e},Ae.select=(e,t)=>{const n=e;if(n.textContent="",t.inputPlaceholder){const e=document.createElement("option");q(e,t.inputPlaceholder),e.value="",e.disabled=!0,e.selected=!0,n.appendChild(e)}return ve(n,n,t),n},Ae.radio=e=>(e.textContent="",e),Ae.checkbox=(e,t)=>{const n=C();if(!n)throw new Error("Popup not found");const o=F(n,"checkbox");if(!o)throw new Error("Checkbox input not found");o.value="1",o.checked=Boolean(t.inputValue);const i=e.querySelector("span");if(i){const e=t.inputPlaceholder||t.inputLabel;e&&q(i,e)}return o},Ae.textarea=(e,t)=>{const n=e;Ce(n,t.inputValue),ye(n,t),ve(n,n,t);return setTimeout(()=>{if("MutationObserver"in window){const e=C();if(!e)return;const o=parseInt(window.getComputedStyle(e).width);new MutationObserver(()=>{if(!document.body.contains(n))return;const e=n.offsetWidth+(i=n,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;const s=C();s&&(e>o?s.style.width=`${e}px`:Y(s,"width",t.width))}).observe(n,{attributes:!0,attributeFilter:["style"]})}}),n};const Ee=(e,t)=>{const n=k();n&&(J(n),_(n,t,"htmlContainer"),t.html?(ae(t.html,n),X(n,"block")):t.text?(n.textContent=t.text,X(n,"block")):Z(n),((e,t)=>{const n=C();if(!n)return;const o=me.innerParams.get(e),i=!o||t.input!==o.input;he.forEach(e=>{const o=K(n,r[e]);o&&(fe(e,t.inputAttributes),o.className=r[e],i&&Z(o))}),t.input&&(i&&ge(t),be(t))})(e,t))},ke=(e,t)=>{for(const[n,o]of Object.entries(a))t.icon!==n&&W(e,o);z(e,t.icon&&a[t.icon]),Le(e,t),Be(),_(e,t,"icon")},Be=()=>{const e=C();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color");e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix").forEach(e=>{e.style.backgroundColor=t})},$e=(e,t)=>{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,o="";if(t.iconHtml)o=Pe(t.iconHtml);else if("success"===t.icon)o=(e=>`\n  ${e.animation?'<div class="swal2-success-circular-line-left"></div>':""}\n  <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n  <div class="swal2-success-ring"></div>\n  ${e.animation?'<div class="swal2-success-fix"></div>':""}\n  ${e.animation?'<div class="swal2-success-circular-line-right"></div>':""}\n`)(t),n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)o='\n  <span class="swal2-x-mark">\n    <span class="swal2-x-mark-line-left"></span>\n    <span class="swal2-x-mark-line-right"></span>\n  </span>\n';else if(t.icon){o=Pe({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==o.trim()&&q(e,o)},Le=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])G(e,n,"background-color",t.iconColor);G(e,".swal2-success-ring","border-color",t.iconColor)}},Pe=e=>`<div class="${r["icon-content"]}">${e}</div>`;let xe=!1,Te=0,Se=0,Oe=0,Me=0;const He=e=>{const t=C();if(!t)return;const n=A();if(e.target===t||n&&n.contains(e.target)){xe=!0;const n=De(e);Te=n.clientX,Se=n.clientY,Oe=parseInt(t.style.insetInlineStart)||0,Me=parseInt(t.style.insetBlockStart)||0,z(t,"swal2-dragging")}},je=e=>{const t=C();if(t&&xe){let{clientX:n,clientY:i}=De(e);const s=n-Te;t.style.insetInlineStart=`${Oe+(o.isRTL?-s:s)}px`,t.style.insetBlockStart=`${Me+(i-Se)}px`}},Ie=()=>{const e=C();xe=!1,W(e,"swal2-dragging")},De=e=>{const t=e.type.startsWith("touch")?e.touches[0]:e;return{clientX:t.clientX,clientY:t.clientY}},Ve=(e,t)=>{const n=y(),o=C();if(n&&o){if(t.toast){Y(n,"width",t.width),o.style.width="100%";const e=S();e&&o.insertBefore(e,A())}else Y(o,"width",t.width);Y(o,"padding",t.padding),t.color&&(o.style.color=t.color),t.background&&(o.style.background=t.background),Z(L()),qe(o,t),t.draggable&&!t.toast?(z(o,r.draggable),(e=>{e.addEventListener("mousedown",He),document.body.addEventListener("mousemove",je),e.addEventListener("mouseup",Ie),e.addEventListener("touchstart",He),document.body.addEventListener("touchmove",je),e.addEventListener("touchend",Ie)})(o)):(W(o,r.draggable),(e=>{e.removeEventListener("mousedown",He),document.body.removeEventListener("mousemove",je),e.removeEventListener("mouseup",Ie),e.removeEventListener("touchstart",He),document.body.removeEventListener("touchmove",je),e.removeEventListener("touchend",Ie)})(o))}},qe=(e,t)=>{const n=t.showClass||{};e.className=`${r.popup} ${ee(e)?n.popup:""}`,t.toast?(z([document.documentElement,document.body],r["toast-shown"]),z(e,r.toast)):z(e,r.modal),_(e,t,"popup"),"string"==typeof t.customClass&&z(e,t.customClass),t.icon&&z(e,r[`icon-${t.icon}`])},Ne=e=>{const t=document.createElement("li");return z(t,r["progress-step"]),q(t,e),t},_e=e=>{const t=document.createElement("li");return z(t,r["progress-step-line"]),e.progressStepsDistance&&Y(t,"width",e.progressStepsDistance),t},Fe=(e,t)=>{var n;Ve(0,t),pe(0,t),((e,t)=>{const n=$();if(!n)return;const{progressSteps:o,currentProgressStep:i}=t;o&&0!==o.length&&void 0!==i?(X(n),n.textContent="",i>=o.length&&u("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),o.forEach((e,s)=>{const a=Ne(e);if(n.appendChild(a),s===i&&z(a,r["active-progress-step"]),s!==o.length-1){const e=_e(t);n.appendChild(e)}})):Z(n)})(0,t),((e,t)=>{const n=me.innerParams.get(e),o=A();if(!o)return;if(n&&t.icon===n.icon)return $e(o,t),void ke(o,t);if(!t.icon&&!t.iconHtml)return void Z(o);if(t.icon&&-1===Object.keys(a).indexOf(t.icon))return d(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void Z(o);X(o),$e(o,t),ke(o,t),z(o,t.showClass&&t.showClass.icon),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",Be)})(e,t),((e,t)=>{const n=B();n&&(t.imageUrl?(X(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Y(n,"width",t.imageWidth),Y(n,"height",t.imageHeight),n.className=r.image,_(n,t,"image")):Z(n))})(0,t),((e,t)=>{const n=E();n&&(J(n),Q(n,Boolean(t.title||t.titleText),"block"),t.title&&ae(t.title,n),t.titleText&&(n.innerText=t.titleText),_(n,t,"title"))})(0,t),((e,t)=>{const n=j();n&&(q(n,t.closeButtonHtml||""),_(n,t,"closeButton"),Q(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),Ee(e,t),ue(0,t),((e,t)=>{const n=M();n&&(J(n),Q(n,Boolean(t.footer),"block"),t.footer&&ae(t.footer,n),_(n,t,"footer"))})(0,t);const i=C();"function"==typeof t.didRender&&i&&t.didRender(i),null===(n=o.eventEmitter)||void 0===n||n.emit("didRender",i)},Re=()=>{var e;return null===(e=P())||void 0===e?void 0:e.click()},Ue=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),ze=e=>{if(e.keydownTarget&&e.keydownHandlerAdded&&e.keydownHandler){const t=e.keydownHandler;e.keydownTarget.removeEventListener("keydown",t,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1}},We=(e,t)=>{var n;const o=I();return o.length?(-2===(e+=t)&&(e=o.length-1),e===o.length?e=0:-1===e&&(e=o.length-1),o[e].focus(),!(navigator.userAgent.includes("Firefox")&&o[e]instanceof HTMLIFrameElement)):(null===(n=C())||void 0===n||n.focus(),!0)},Ke=["ArrowRight","ArrowDown"],Ye=["ArrowLeft","ArrowUp"],Xe=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Ze(t,e):"Tab"===t.key?Je(t):[...Ke,...Ye].includes(t.key)?Ge(t.key):"Escape"===t.key&&Qe(t,e,n)))},Ze=(e,t)=>{if(!h(t.allowEnterKey))return;const n=C();if(!n||!t.input)return;const o=F(n,t.input);if(e.target&&o&&e.target instanceof HTMLElement&&e.target.outerHTML===o.outerHTML){if(["textarea","file"].includes(t.input))return;Re(),e.preventDefault()}},Je=e=>{const t=e.target,n=I().findIndex(e=>e===t);let o=!0;o=e.shiftKey?We(n,-1):We(n,1),e.stopPropagation(),o&&e.preventDefault()},Ge=e=>{const t=O(),n=P(),o=T(),i=x();if(!(t&&n&&o&&i))return;const s=[n,o,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=Ke.includes(e)?"nextElementSibling":"previousElementSibling";let a=document.activeElement;if(a){for(let e=0;e<t.children.length;e++){if(a=a[r],!a)return;if(a instanceof HTMLButtonElement&&ee(a))break}a instanceof HTMLButtonElement&&a.focus()}},Qe=(e,t,n)=>{e.preventDefault(),h(t.allowEscapeKey)&&n(Ue.esc)};var et={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const tt=()=>{Array.from(document.body.children).forEach(e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")})},nt="undefined"!=typeof window&&Boolean(window.GestureEvent),ot=nt&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,it=()=>{const e=y();if(!e)return;let t;e.ontouchstart=e=>{t=st(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},st=e=>{const t=e.target,n=y(),o=k();return!(!n||!o)&&(!rt(e)&&!at(e)&&(t===n||!(te(n)||!(t instanceof HTMLElement)||((e,t)=>{let n=e;for(;n&&n!==t;){if(te(n))return!0;n=n.parentElement}return!1})(t,o)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||te(o)&&o.contains(t))))},rt=e=>Boolean(e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType),at=e=>e.touches&&e.touches.length>1;let lt=null;const ct=e=>{null===lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${lt+(()=>{const e=document.createElement("div");e.className=r["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function ut(e,t,n,s){V()?yt(e,s):(i(n).then(()=>yt(e,s)),ze(o)),nt?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),D()&&(null!==lt&&(document.body.style.paddingRight=`${lt}px`,lt=null),(()=>{if(N(document.body,r.iosfix)){const e=parseInt(document.body.style.top,10);W(document.body,r.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),tt()),W([document.documentElement,document.body],[r.shown,r["height-auto"],r["no-backdrop"],r["toast-shown"]])}function dt(e){e=gt(e);const t=et.swalPromiseResolve.get(this),n=pt(this);this.isAwaitingPromise?e.isDismissed||(ht(this),t(e)):n&&t(e)}const pt=e=>{const t=C();if(!t)return!1;const n=me.innerParams.get(e);if(!n||N(t,n.hideClass.popup))return!1;W(t,n.showClass.popup),z(t,n.hideClass.popup);const o=y();return W(o,n.showClass.backdrop),z(o,n.hideClass.backdrop),ft(e,t,n),!0};function mt(e){const t=et.swalPromiseReject.get(this);ht(this),t&&t(e)}const ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,me.innerParams.get(e)||e._destroy())},gt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),ft=(e,t,n)=>{var i;const s=y(),r=ne(t);"function"==typeof n.willClose&&n.willClose(t),null===(i=o.eventEmitter)||void 0===i||i.emit("willClose",t),r&&s?bt(e,t,s,Boolean(n.returnFocus),n.didClose):s&&ut(e,s,Boolean(n.returnFocus),n.didClose)},bt=(e,t,n,i,s)=>{o.swalCloseEventFinishedCallback=ut.bind(null,e,n,i,s);const r=function(e){var n;e.target===t&&(null===(n=o.swalCloseEventFinishedCallback)||void 0===n||n.call(o),delete o.swalCloseEventFinishedCallback,t.removeEventListener("animationend",r),t.removeEventListener("transitionend",r))};t.addEventListener("animationend",r),t.addEventListener("transitionend",r)},yt=(e,t)=>{setTimeout(()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=o.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()})},vt=e=>{let t=C();if(t||new Gn,t=C(),!t)return;const n=S();V()?Z(A()):wt(t,e),X(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},wt=(e,t)=>{const n=O(),o=S();n&&o&&(!t&&ee(P())&&(t=P()),X(n),t&&(Z(t),o.setAttribute("data-button-to-replace",t.className),n.insertBefore(o,t)),z([e,n],r.loading))},Ct=e=>e.checked?1:0,At=e=>e.checked?e.value:null,Et=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,kt=(e,t)=>{const n=C();if(!n)return;const o=e=>{"select"===t.input?function(e,t,n){const o=K(e,r.select);if(!o)return;const i=(e,t,o)=>{const i=document.createElement("option");i.value=o,q(i,t),i.selected=Lt(o,n.inputValue),e.appendChild(i)};t.forEach(e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,o.appendChild(e),n.forEach(t=>i(e,t[1],t[0]))}else i(o,n,t)}),o.focus()}(n,$t(e),t):"radio"===t.input&&function(e,t,n){const o=K(e,r.radio);if(!o)return;t.forEach(e=>{const t=e[0],i=e[1],s=document.createElement("input"),a=document.createElement("label");s.type="radio",s.name=r.radio,s.value=t,Lt(t,n.inputValue)&&(s.checked=!0);const l=document.createElement("span");q(l,i),l.className=r.label,a.appendChild(s),a.appendChild(l),o.appendChild(a)});const i=o.querySelectorAll("input");i.length&&i[0].focus()}(n,$t(e),t)};g(t.inputOptions)||b(t.inputOptions)?(vt(P()),f(t.inputOptions).then(t=>{e.hideLoading(),o(t)})):"object"==typeof t.inputOptions?o(t.inputOptions):d("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},Bt=(e,t)=>{const n=e.getInput();n&&(Z(n),f(t.inputValue).then(o=>{n.value="number"===t.input?`${parseFloat(o)||0}`:`${o}`,X(n),n.focus(),e.hideLoading()}).catch(t=>{d(`Error in inputValue promise: ${t}`),n.value="",X(n),n.focus(),e.hideLoading()}))};const $t=e=>(e instanceof Map?Array.from(e):Object.entries(e)).map(([e,t])=>[e,"object"==typeof t?$t(t):t]),Lt=(e,t)=>Boolean(t)&&null!=t&&t.toString()===e.toString(),Pt=(e,t)=>{const n=me.innerParams.get(e);if(!n.input)return void d(`The "input" parameter is needed to be set when using returnInputValueOn${c(t)}`);const o=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return Ct(n);case"radio":return At(n);case"file":return Et(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?xt(e,i,t):o&&!o.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||o.validationMessage)):"deny"===t?Tt(e,i):Mt(e,i)},xt=(e,t,n)=>{const o=me.innerParams.get(e);e.disableInput();Promise.resolve().then(()=>f(o.inputValidator(t,o.validationMessage))).then(o=>{e.enableButtons(),e.enableInput(),o?e.showValidationMessage(o):"deny"===n?Tt(e,t):Mt(e,t)})},Tt=(e,t)=>{const n=me.innerParams.get(e);if(n.showLoaderOnDeny&&vt(T()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preDeny(t,n.validationMessage))).then(n=>{!1===n?(e.hideLoading(),ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})}).catch(t=>Ot(e,t))}else e.close({isDenied:!0,value:t})},St=(e,t)=>{e.close({isConfirmed:!0,value:t})},Ot=(e,t)=>{e.rejectPromise(t)},Mt=(e,t)=>{const n=me.innerParams.get(e);if(n.showLoaderOnConfirm&&vt(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preConfirm(t,n.validationMessage))).then(n=>{ee(L())||!1===n?(e.hideLoading(),ht(e)):St(e,void 0===n?t:n)}).catch(t=>Ot(e,t))}else St(e,t)};function Ht(){const e=me.innerParams.get(this);if(!e)return;const t=me.domCache.get(this);Z(t.loader),V()?e.icon&&X(A()):jt(t),W([t.popup,t.actions],r.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),this.enableButtons()}const jt=e=>{const t=e.loader.getAttribute("data-button-to-replace"),n=t?e.popup.getElementsByClassName(t):[];n.length?X(n[0],"inline-block"):ee(P())||ee(T())||ee(x())||Z(e.actions)};function It(){const e=me.innerParams.get(this),t=me.domCache.get(this);return t?F(t.popup,e.input):null}function Dt(e,t,n){const o=me.domCache.get(e);t.forEach(e=>{o[e].disabled=n})}function Vt(e,t){const n=C();if(n&&e)if("radio"===e.type){n.querySelectorAll(`[name="${r.radio}"]`).forEach(e=>{e.disabled=t})}else e.disabled=t}function qt(){Dt(this,["confirmButton","denyButton","cancelButton"],!1);const e=me.focusedElement.get(this);e instanceof HTMLElement&&document.activeElement===document.body&&e.focus(),me.focusedElement.delete(this)}function Nt(){me.focusedElement.set(this,document.activeElement),Dt(this,["confirmButton","denyButton","cancelButton"],!0)}function _t(){Vt(this.getInput(),!1)}function Ft(){Vt(this.getInput(),!0)}function Rt(e){const t=me.domCache.get(this),n=me.innerParams.get(this);q(t.validationMessage,e),t.validationMessage.className=r["validation-message"],n.customClass&&n.customClass.validationMessage&&z(t.validationMessage,n.customClass.validationMessage),X(t.validationMessage);const o=this.getInput();o&&(o.setAttribute("aria-invalid","true"),o.setAttribute("aria-describedby",r["validation-message"]),R(o),z(o,r.inputerror))}function Ut(){const e=me.domCache.get(this);e.validationMessage&&Z(e.validationMessage);const t=this.getInput();t&&(t.removeAttribute("aria-invalid"),t.removeAttribute("aria-describedby"),W(t,r.inputerror))}const zt={title:"",titleText:"",text:"",html:"",footer:"",icon:void 0,iconColor:void 0,iconHtml:void 0,template:void 0,toast:!1,draggable:!1,animation:!0,theme:"light",showClass:{popup:"swal2-show",backdrop:"swal2-backdrop-show",icon:"swal2-icon-show"},hideClass:{popup:"swal2-hide",backdrop:"swal2-backdrop-hide",icon:"swal2-icon-hide"},customClass:{},target:"body",color:void 0,backdrop:!0,heightAuto:!0,allowOutsideClick:!0,allowEscapeKey:!0,allowEnterKey:!0,stopKeydownPropagation:!0,keydownListenerCapture:!1,showConfirmButton:!0,showDenyButton:!1,showCancelButton:!1,preConfirm:void 0,preDeny:void 0,confirmButtonText:"OK",confirmButtonAriaLabel:"",confirmButtonColor:void 0,denyButtonText:"No",denyButtonAriaLabel:"",denyButtonColor:void 0,cancelButtonText:"Cancel",cancelButtonAriaLabel:"",cancelButtonColor:void 0,buttonsStyling:!0,reverseButtons:!1,focusConfirm:!0,focusDeny:!1,focusCancel:!1,returnFocus:!0,showCloseButton:!1,closeButtonHtml:"&times;",closeButtonAriaLabel:"Close this dialog",loaderHtml:"",showLoaderOnConfirm:!1,showLoaderOnDeny:!1,imageUrl:void 0,imageWidth:void 0,imageHeight:void 0,imageAlt:"",timer:void 0,timerProgressBar:!1,width:void 0,padding:void 0,background:void 0,input:void 0,inputPlaceholder:"",inputLabel:"",inputValue:"",inputOptions:{},inputAutoFocus:!0,inputAutoTrim:!0,inputAttributes:{},inputValidator:void 0,returnInputValueOnDeny:!1,validationMessage:void 0,grow:!1,position:"center",progressSteps:[],currentProgressStep:void 0,progressStepsDistance:void 0,willOpen:void 0,didOpen:void 0,didRender:void 0,willClose:void 0,didClose:void 0,didDestroy:void 0,scrollbarPadding:!0,topLayer:!1},Wt=["allowEscapeKey","allowOutsideClick","background","buttonsStyling","cancelButtonAriaLabel","cancelButtonColor","cancelButtonText","closeButtonAriaLabel","closeButtonHtml","color","confirmButtonAriaLabel","confirmButtonColor","confirmButtonText","currentProgressStep","customClass","denyButtonAriaLabel","denyButtonColor","denyButtonText","didClose","didDestroy","draggable","footer","hideClass","html","icon","iconColor","iconHtml","imageAlt","imageHeight","imageUrl","imageWidth","preConfirm","preDeny","progressSteps","returnFocus","reverseButtons","showCancelButton","showCloseButton","showConfirmButton","showDenyButton","text","title","titleText","theme","willClose"],Kt={allowEnterKey:void 0},Yt=["allowOutsideClick","allowEnterKey","backdrop","draggable","focusConfirm","focusDeny","focusCancel","returnFocus","heightAuto","keydownListenerCapture"],Xt=e=>Object.prototype.hasOwnProperty.call(zt,e),Zt=e=>-1!==Wt.indexOf(e),Jt=e=>Kt[e],Gt=e=>{Xt(e)||u(`Unknown parameter "${e}"`)},Qt=e=>{Yt.includes(e)&&u(`The parameter "${e}" is incompatible with toasts`)},en=e=>{const t=Jt(e);t&&m(e,t)},tn=e=>{!1===e.backdrop&&e.allowOutsideClick&&u('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),e.theme&&!["light","dark","auto","minimal","borderless","bootstrap-4","bootstrap-4-light","bootstrap-4-dark","bootstrap-5","bootstrap-5-light","bootstrap-5-dark","material-ui","material-ui-light","material-ui-dark","embed-iframe","bulma","bulma-light","bulma-dark"].includes(e.theme)&&u(`Invalid theme "${e.theme}"`);for(const t in e)Gt(t),e.toast&&Qt(t),en(t)};function nn(e){const t=y(),n=C(),o=me.innerParams.get(this);if(!n||N(n,o.hideClass.popup))return void u("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const i=on(e),s=Object.assign({},o,i);tn(s),t&&(t.dataset.swal2Theme=s.theme),Fe(this,s),me.innerParams.set(this,s),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const on=e=>{const t={};return Object.keys(e).forEach(n=>{if(Zt(n)){const o=e;t[n]=o[n]}else u(`Invalid parameter to update: ${n}`)}),t};function sn(){var e;const t=me.domCache.get(this),n=me.innerParams.get(this);n?(t.popup&&o.swalCloseEventFinishedCallback&&(o.swalCloseEventFinishedCallback(),delete o.swalCloseEventFinishedCallback),"function"==typeof n.didDestroy&&n.didDestroy(),null===(e=o.eventEmitter)||void 0===e||e.emit("didDestroy"),rn(this)):an(this)}const rn=e=>{an(e),delete e.params,delete o.keydownHandler,delete o.keydownTarget,delete o.currentInstance},an=e=>{e.isAwaitingPromise?(ln(me,e),e.isAwaitingPromise=!0):(ln(et,e),ln(me,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},ln=(e,t)=>{for(const n in e)e[n].delete(t)};var cn=Object.freeze({__proto__:null,_destroy:sn,close:dt,closeModal:dt,closePopup:dt,closeToast:dt,disableButtons:Nt,disableInput:Ft,disableLoading:Ht,enableButtons:qt,enableInput:_t,getInput:It,handleAwaitingPromise:ht,hideLoading:Ht,rejectPromise:mt,resetValidationMessage:Ut,showValidationMessage:Rt,update:nn});const un=(e,t,n)=>{t.popup.onclick=()=>{e&&(dn(e)||e.timer||e.input)||n(Ue.close)}},dn=e=>Boolean(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let pn=!1;const mn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(pn=!0)}}},hn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(pn=!0)}}},gn=(e,t,n)=>{t.container.onclick=o=>{pn?pn=!1:o.target===t.container&&h(e.allowOutsideClick)&&n(Ue.backdrop)}},fn=e=>e instanceof Element||(e=>"object"==typeof e&&null!==e&&"jquery"in e)(e);const bn=()=>{if(o.timeout)return(()=>{const e=H();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),o.timeout.stop()},yn=()=>{if(o.timeout){const e=o.timeout.start();return oe(e),e}};let vn=!1;const wn={};const Cn=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in wn){const n=t.getAttribute&&t.getAttribute(e);if(n)return void wn[e].fire({template:n})}};o.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){const n=(...o)=>{this.removeListener(e,n),t.apply(this,o)};this.on(e,n)}emit(e,...t){this._getHandlersByEventName(e).forEach(e=>{try{e.apply(this,t)}catch(e){console.error(e)}})}removeListener(e,t){const n=this._getHandlersByEventName(e),o=n.indexOf(t);o>-1&&n.splice(o,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var An=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||fn(e[0])?["title","html","icon"].forEach((n,o)=>{const i=e[o];"string"==typeof i||fn(i)?t[n]=i:void 0!==i&&d(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)}):Object.assign(t,e[0]),t},bindClickHandler:function(e="data-swal-template"){wn[e]=this,vn||(document.body.addEventListener("click",Cn),vn=!0)},clickCancel:()=>{var e;return null===(e=x())||void 0===e?void 0:e.click()},clickConfirm:Re,clickDeny:()=>{var e;return null===(e=T())||void 0===e?void 0:e.click()},enableLoading:vt,fire:function(...e){return new this(...e)},getActions:O,getCancelButton:x,getCloseButton:j,getConfirmButton:P,getContainer:y,getDenyButton:T,getFocusableElements:I,getFooter:M,getHtmlContainer:k,getIcon:A,getIconContent:()=>w(r["icon-content"]),getImage:B,getInputLabel:()=>w(r["input-label"]),getLoader:S,getPopup:C,getProgressSteps:$,getTimerLeft:()=>o.timeout&&o.timeout.getTimerLeft(),getTimerProgressBar:H,getTitle:E,getValidationMessage:L,increaseTimer:e=>{if(o.timeout){const t=o.timeout.increase(e);return oe(t,!0),t}},isDeprecatedParameter:Jt,isLoading:()=>{const e=C();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>Boolean(o.timeout&&o.timeout.isRunning()),isUpdatableParameter:Zt,isValidParameter:Xt,isVisible:()=>ee(C()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{o.eventEmitter&&(e?t?o.eventEmitter.removeListener(e,t):o.eventEmitter.removeAllListeners(e):o.eventEmitter.reset())},on:(e,t)=>{o.eventEmitter&&o.eventEmitter.on(e,t)},once:(e,t)=>{o.eventEmitter&&o.eventEmitter.once(e,t)},resumeTimer:yn,showLoading:vt,stopTimer:bn,toggleTimer:()=>{const e=o.timeout;return e&&(e.running?bn():yn())}});class En{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const kn=["swal-title","swal-html","swal-footer"],Bn=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach(e=>{Mn(e,["name","value"]);const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=n in zt&&"boolean"==typeof zt[n]?"false"!==o:n in zt&&"object"==typeof zt[n]?JSON.parse(o):o)}),t},$n=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach(e=>{const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=new Function(`return ${o}`)())}),t},Ln=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach(e=>{Mn(e,["type","color","aria-label"]);const n=e.getAttribute("type");if(!n||!["confirm","cancel","deny"].includes(n))return;t[`${n}ButtonText`]=e.innerHTML,t[`show${c(n)}Button`]=!0;const o=e.getAttribute("color");null!==o&&(t[`${n}ButtonColor`]=o);const i=e.getAttribute("aria-label");null!==i&&(t[`${n}ButtonAriaLabel`]=i)}),t},Pn=e=>{const t={},n=e.querySelector("swal-image");if(n){Mn(n,["src","width","height","alt"]);const e=n.getAttribute("src");null!==e&&(t.imageUrl=e||void 0);const o=n.getAttribute("width");null!==o&&(t.imageWidth=o||void 0);const i=n.getAttribute("height");null!==i&&(t.imageHeight=i||void 0);const s=n.getAttribute("alt");null!==s&&(t.imageAlt=s||void 0)}return t},xn=e=>{const t={},n=e.querySelector("swal-icon");return n&&(Mn(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Tn=e=>{const t={},n=e.querySelector("swal-input");n&&(Mn(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const o=Array.from(e.querySelectorAll("swal-input-option"));return o.length&&(t.inputOptions={},o.forEach(e=>{Mn(e,["value"]);const n=e.getAttribute("value");if(!n)return;const o=e.innerHTML;t.inputOptions[n]=o})),t},Sn=(e,t)=>{const n={};for(const o in t){const i=t[o],s=e.querySelector(i);s&&(Mn(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},On=e=>{const t=kn.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach(e=>{const n=e.tagName.toLowerCase();t.includes(n)||u(`Unrecognized element <${n}>`)})},Mn=(e,t)=>{Array.from(e.attributes).forEach(n=>{-1===t.indexOf(n.name)&&u([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])})},Hn=e=>{var t,n;const i=y(),s=C();if(!i||!s)return;"function"==typeof e.willOpen&&e.willOpen(s),null===(t=o.eventEmitter)||void 0===t||t.emit("willOpen",s);const r=window.getComputedStyle(document.body).overflowY;if(Vn(i,s,e),setTimeout(()=>{In(i,s)},10),D()&&(Dn(i,void 0!==e.scrollbarPadding&&e.scrollbarPadding,r),(()=>{const e=y();Array.from(document.body.children).forEach(t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))})})()),ot&&!1===e.backdrop&&s.scrollHeight>i.clientHeight&&(i.style.pointerEvents="auto"),V()||o.previousActiveElement||(o.previousActiveElement=document.activeElement),"function"==typeof e.didOpen){const t=e.didOpen;setTimeout(()=>t(s))}null===(n=o.eventEmitter)||void 0===n||n.emit("didOpen",s)},jn=e=>{const t=C();if(!t||e.target!==t)return;const n=y();n&&(t.removeEventListener("animationend",jn),t.removeEventListener("transitionend",jn),n.style.overflowY="auto",W(n,r["no-transition"]))},In=(e,t)=>{ne(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",jn),t.addEventListener("transitionend",jn)):e.style.overflowY="auto"},Dn=(e,t,n)=>{(()=>{if(nt&&!N(document.body,r.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",z(document.body,r.iosfix),it()}})(),t&&"hidden"!==n&&ct(n),setTimeout(()=>{e.scrollTop=0})},Vn=(e,t,n)=>{var o;null!==(o=n.showClass)&&void 0!==o&&o.backdrop&&z(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),X(t,"grid"),setTimeout(()=>{var e;null!==(e=n.showClass)&&void 0!==e&&e.popup&&z(t,n.showClass.popup),t.style.removeProperty("opacity")},10)):X(t,"grid"),z([document.documentElement,document.body],r.shown),n.heightAuto&&n.backdrop&&!n.toast&&z([document.documentElement,document.body],r["height-auto"])};var qn=(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),Nn=(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL");function _n(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=qn),"url"===e.input&&(e.inputValidator=Nn))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&u("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(u('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("<br />")),re(e)}let Fn;var Rn=new WeakMap;class Un{constructor(...t){if(n(this,Rn,Promise.resolve({isConfirmed:!1,isDenied:!1,isDismissed:!0})),"undefined"==typeof window)return;Fn=this;const o=Object.freeze(this.constructor.argsToParams(t));var i,s,r;this.params=o,this.isAwaitingPromise=!1,i=Rn,s=this,r=this._main(Fn.params),i.set(e(i,s),r)}_main(e,t={}){if(tn(Object.assign({},t,e)),o.currentInstance){const e=et.swalPromiseResolve.get(o.currentInstance),{isAwaitingPromise:t}=o.currentInstance;o.currentInstance._destroy(),t||e({isDismissed:!0}),D()&&tt()}o.currentInstance=Fn;const n=Wn(e,t);_n(n),Object.freeze(n),o.timeout&&(o.timeout.stop(),delete o.timeout),clearTimeout(o.restoreFocusTimeout);const i=Kn(Fn);return Fe(Fn,n),me.innerParams.set(Fn,n),zn(Fn,i,n)}then(e){return t(Rn,this).then(e)}finally(e){return t(Rn,this).finally(e)}}const zn=(e,t,n)=>new Promise((i,s)=>{const r=t=>{e.close({isDismissed:!0,dismiss:t,isConfirmed:!1,isDenied:!1})};et.swalPromiseResolve.set(e,i),et.swalPromiseReject.set(e,s),t.confirmButton.onclick=()=>{(e=>{const t=me.innerParams.get(e);e.disableButtons(),t.input?Pt(e,"confirm"):Mt(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=me.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?Pt(e,"deny"):Tt(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>
vendor: 4,624 bytes, lines 62764-62765
62764{e.disableButtons(),t(Ue.cancel)})(e,r)},t.closeButton.onclick=()=>{r(Ue.close)},((e,t,n)=>{e.toast?un(e,t,n):(mn(t),hn(t),gn(e,t,n))})(n,t,r),((e,t,n)=>{if(ze(e),!t.toast){const o=e=>Xe(t,e,n);e.keydownHandler=o;const i=t.keydownListenerCapture?window:C();if(i){e.keydownTarget=i,e.keydownListenerCapture=t.keydownListenerCapture;const n=o;e.keydownTarget.addEventListener("keydown",n,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0}}})(o,n,r),((e,t)=>{"select"===t.input||"radio"===t.input?kt(e,t):["text","email","number","tel","textarea"].some(e=>e===t.input)&&(g(t.inputValue)||b(t.inputValue))&&(vt(P()),Bt(e,t))})(e,n),Hn(n),Yn(o,n,r),Xn(t,n),setTimeout(()=>{t.container.scrollTop=0})}),Wn=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return On(n),Object.assign(Bn(n),$n(n),Ln(n),Pn(n),xn(n),Tn(n),Sn(n,kn))})(e),o=Object.assign({},zt,t,n,e);return o.showClass=Object.assign({},zt.showClass,o.showClass),o.hideClass=Object.assign({},zt.hideClass,o.hideClass),!1===o.animation&&(o.showClass={backdrop:"swal2-noanimation"},o.hideClass={}),o},Kn=e=>{const t={popup:C(),container:y(),actions:O(),confirmButton:P(),denyButton:T(),cancelButton:x(),loader:S(),closeButton:j(),validationMessage:L(),progressSteps:$()};return me.domCache.set(e,t),t},Yn=(e,t,n)=>{const o=H();Z(o),t.timer&&(e.timeout=new En(()=>{n("timer"),delete e.timeout},t.timer),t.timerProgressBar&&o&&(X(o),_(o,t,"timerProgressBar"),setTimeout(()=>{e.timeout&&e.timeout.running&&oe(t.timer)})))},Xn=(e,t)=>{if(!t.toast)return h(t.allowEnterKey)?void(Zn(e)||Jn(e,t)||We(-1,1)):(m("allowEnterKey","preConfirm: () => false"),void e.popup.focus())},Zn=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ee(e))return e.focus(),!0;return!1},Jn=(e,t)=>t.focusDeny&&ee(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ee(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ee(e.confirmButton))&&(e.confirmButton.focus(),!0);Un.prototype.disableButtons=Nt,Un.prototype.enableButtons=qt,Un.prototype.getInput=It,Un.prototype.disableInput=Ft,Un.prototype.enableInput=_t,Un.prototype.hideLoading=Ht,Un.prototype.disableLoading=Ht,Un.prototype.showValidationMessage=Rt,Un.prototype.resetValidationMessage=Ut,Un.prototype.close=dt,Un.prototype.closePopup=dt,Un.prototype.closeModal=dt,Un.prototype.closeToast=dt,Un.prototype.rejectPromise=mt,Un.prototype.update=nn,Un.prototype._destroy=sn,Object.assign(Un,An),Object.keys(cn).forEach(e=>{Un[e]=function(...t){if(Fn&&Fn[e])return Fn[e](...t)}}),Un.DismissReason=Ue,Un.version="11.26.25";const Gn=Un;return Gn.default=Gn,Gn}),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2);
62765"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,":root{--swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-backdrop-transition: background-color 0.15s;--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-icon-zoom: 1;--swal2-title-padding: 0.8em 1em 0;--swal2-html-container-padding: 1em 1.6em 0.3em;--swal2-input-border: 1px solid #d9d9d9;--swal2-input-border-radius: 0.1875em;--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-background: transparent;--swal2-input-transition: border-color 0.2s, box-shadow 0.2s;--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-focus-border: 1px solid #b4dbed;--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-footer-border-color: #eee;--swal2-footer-background: transparent;--swal2-footer-color: inherit;--swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3);--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc;--swal2-close-button-transition: color 0.2s, box-shadow 0.2s;--swal2-close-button-outline: initial;
vendor: 6,251 bytes, line 62765
62765--swal2-close-button-box-shadow: inset 0 0 0 3px transparent;--swal2-close-button-focus-box-shadow: inset var(--swal2-outline);--swal2-close-button-hover-transform: none;--swal2-actions-justify-content: center;--swal2-actions-width: auto;--swal2-actions-margin: 1.25em auto 0;--swal2-actions-padding: 0;--swal2-actions-border-radius: 0;--swal2-actions-background: transparent;--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;--swal2-action-button-hover: black 10%;--swal2-action-button-active: black 10%;--swal2-confirm-button-box-shadow: none;--swal2-confirm-button-border-radius: 0.25em;--swal2-confirm-button-background-color: #7066e0;--swal2-confirm-button-color: #fff;--swal2-deny-button-box-shadow: none;--swal2-deny-button-border-radius: 0.25em;--swal2-deny-button-background-color: #dc3741;--swal2-deny-button-color: #fff;--swal2-cancel-button-box-shadow: none;--swal2-cancel-button-border-radius: 0.25em;--swal2-cancel-button-background-color: #6e7881;--swal2-cancel-button-color: #fff;--swal2-toast-show-animation: swal2-toast-show 0.5s;--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;--swal2-toast-border: none;--swal2-toast-box-shadow: 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075)}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:auto}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:\"top-start     top            top-end\" \"center-start  center         center-end\" \"bottom-start  bottom-center  bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:var(--swal2-backdrop-transition);-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;
vendor: 22,449 bytes, line 62765
62765align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container)[popover]{width:auto;border:0}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:var(--swal2-title-padding);color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;overflow-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:var(--swal2-actions-justify-content);width:var(--swal2-actions-width);margin:var(--swal2-actions-margin);padding:var(--swal2-actions-padding);border-radius:var(--swal2-actions-border-radius);background:var(--swal2-actions-background)}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:var(--swal2-action-button-transition);border:none;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border-radius:var(--swal2-confirm-button-border-radius);background:initial;background-color:var(--swal2-confirm-button-background-color);box-shadow:var(--swal2-confirm-button-box-shadow);color:var(--swal2-confirm-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border-radius:var(--swal2-deny-button-border-radius);background:initial;background-color:var(--swal2-deny-button-background-color);box-shadow:var(--swal2-deny-button-box-shadow);color:var(--swal2-deny-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border-radius:var(--swal2-cancel-button-border-radius);background:initial;background-color:var(--swal2-cancel-button-background-color);box-shadow:var(--swal2-cancel-button-box-shadow);color:var(--swal2-cancel-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none;box-shadow:var(--swal2-action-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading){opacity:.4}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);background:var(--swal2-footer-background);color:var(--swal2-footer-color);font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:var(--swal2-timer-progress-bar-background)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:var(--swal2-close-button-transition);border:none;border-radius:var(--swal2-border-radius);outline:var(--swal2-close-button-outline);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:var(--swal2-close-button-hover-transform);background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:var(--swal2-close-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:var(--swal2-html-container-padding);overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;overflow-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:var(--swal2-input-transition);border:var(--swal2-input-border);border-radius:var(--swal2-input-border-radius);background:var(--swal2-input-background);box-shadow:var(--swal2-input-box-shadow);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):hover,div:where(.swal2-container) input:where(.swal2-file):hover,div:where(.swal2-container) textarea:where(.swal2-textarea):hover{box-shadow:var(--swal2-input-hover-box-shadow)}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:var(--swal2-input-focus-border);outline:none;box-shadow:var(--swal2-input-focus-box-shadow)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;zoom:var(--swal2-icon-zoom);border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;border:var(--swal2-toast-border);background:var(--swal2-background);box-shadow:var(--swal2-toast-box-shadow);pointer-events:auto}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-toast.swal2-show{animation:var(--swal2-toast-show-animation)}.swal2-toast.swal2-hide{animation:var(--swal2-toast-hide-animation)}@keyframes swal2-show{0%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}100%{transform:translate3d(0, 0, 0) scale(1);opacity:1}}@keyframes swal2-hide{0%{transform:translate3d(0, 0, 0) scale(1);opacity:1}100%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}");
62765
62766/*
62767 * jQuery.bind-first library v0.2.3
62768 * Copyright (c) 2013 Vladimir Zhuravlev
62769 *
62770 * Released under MIT License
62771 * @license
62772 *
62773 * Date: Thu Feb  6 10:13:59 ICT 2014
62774 **/
62775
62776(function($) {
62777	var splitVersion = $.fn.jquery.split(".");
62778	var major = parseInt(splitVersion[0]);
62779	var minor = parseInt(splitVersion[1]);
62780
62781	var JQ_LT_17 = (major < 1) || (major == 1 && minor < 7);
62782	
62783	function eventsData($el) {
62784		return JQ_LT_17 ? $el.data('events') : $._data($el[0]).events;
62785	}
62786	
62787	function moveHandlerToTop($el, eventName, isDelegated) {
62788		var data = eventsData($el);
62789		var events = data[eventName];
62790
62791		if (!JQ_LT_17) {
62792			var handler = isDelegated ? events.splice(events.delegateCount - 1, 1)[0] : events.pop();
62793			events.splice(isDelegated ? 0 : (events.delegateCount || 0), 0, handler);
62794
62795			return;
62796		}
62797
62798		if (isDelegated) {
62799			data.live.unshift(data.live.pop());
62800		} else {
62801			events.unshift(events.pop());
62802		}
62803	}
62804	
62805	function moveEventHandlers($elems, eventsString, isDelegate) {
62806		var events = eventsString.split(/\s+/);
62807		$elems.each(function() {
62808			for (var i = 0; i < events.length; ++i) {
62809				var pureEventName = $.trim(events[i]).match(/[^\.]+/i)[0];
62810				moveHandlerToTop($(this), pureEventName, isDelegate);
62811			}
62812		});
62813	}
62814	
62815	function makeMethod(methodName) {
62816		$.fn[methodName + 'First'] = function() {
62817			var args = $.makeArray(arguments);
62818			var eventsString = args.shift();
62819
62820			if (eventsString) {
62821				$.fn[methodName].apply(this, arguments);
62822				moveEventHandlers(this, eventsString);
62823			}
62824
62825			return this;
62826		}
62827	}
62828
62829	// bind
62830	makeMethod('bind');
62831
62832	// one
62833	makeMethod('one');
62834
62835	// delegate
62836	$.fn.delegateFirst = function() {
62837		var args = $.makeArray(arguments);
62838		var eventsString = args[1];
62839		
62840		if (eventsString) {
62841			args.splice(0, 2);
62842			$.fn.delegate.apply(this, arguments);
62843			moveEventHandlers(this, eventsString, true);
62844		}
62845
62846		return this;
62847	};
62848
62849	// live
62850	$.fn.liveFirst = function() {
62851		var args = $.makeArray(arguments);
62852
62853		// live = delegate to the document
62854		args.unshift(this.selector);
62855		$.fn.delegateFirst.apply($(document), args);
62856
62857		return this;
62858	};
62859	
62860	// on (jquery >= 1.7)
62861	if (!JQ_LT_17) {
62862		$.fn.onFirst = function(types, selector) {
62863			var $el = $(this);
62864			var isDelegated = typeof selector === 'string';
62865
62866			$.fn.on.apply($el, arguments);
62867
62868			// events map
62869			if (typeof types === 'object') {
62870				for (type in types)
62871					if (types.hasOwnProperty(type)) {
62872						moveEventHandlers($el, type, isDelegated);
62873					}
62874			} else if (typeof types === 'string') {
62875				moveEventHandlers($el, types, isDelegated);
62876			}
62877
62878			return $el;
62879		};
62880	}
62881
62882})(jQuery);
62883
62884//! moment.js
62885//! version : 2.29.4
62886//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
62887//! license : MIT
62888//! momentjs.com
62889
62890;(function (global, factory) {
62891    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
62892    typeof define === 'function' && define.amd ? define(factory) :
62893    global.moment = factory()
62894}(this, (function () { 'use strict';
62895
62896    var hookCallback;
62897
62898    function hooks() {
62899        return hookCallback.apply(null, arguments);
62900    }
62901
62902    // This is done to register the method called with moment()
62903    // without creating circular dependencies.
62904    function setHookCallback(callback) {
62905        hookCallback = callback;
62906    }
62907
62908    function isArray(input) {
62909        return (
62910            input instanceof Array ||
62911            Object.prototype.toString.call(input) === '[object Array]'
62912        );
62913    }
62914
62915    function isObject(input) {
62916        // IE8 will treat undefined and null as object if it wasn't for
62917        // input != null
62918        return (
62919            input != null &&
62920            Object.prototype.toString.call(input) === '[object Object]'
62921        );
62922    }
62923
62924    function hasOwnProp(a, b) {
62925        return Object.prototype.hasOwnProperty.call(a, b);
62926    }
62927
62928    function isObjectEmpty(obj) {
62929        if (Object.getOwnPropertyNames) {
62930            return Object.getOwnPropertyNames(obj).length === 0;
62931        } else {
62932            var k;
62933            for (k in obj) {
62934                if (hasOwnProp(obj, k)) {
62935                    return false;
vendor: 68,783 bytes, lines 62936-65173
62936                }
62937            }
62938            return true;
62939        }
62940    }
62941
62942    function isUndefined(input) {
62943        return input === void 0;
62944    }
62945
62946    function isNumber(input) {
62947        return (
62948            typeof input === 'number' ||
62949            Object.prototype.toString.call(input) === '[object Number]'
62950        );
62951    }
62952
62953    function isDate(input) {
62954        return (
62955            input instanceof Date ||
62956            Object.prototype.toString.call(input) === '[object Date]'
62957        );
62958    }
62959
62960    function map(arr, fn) {
62961        var res = [],
62962            i,
62963            arrLen = arr.length;
62964        for (i = 0; i < arrLen; ++i) {
62965            res.push(fn(arr[i], i));
62966        }
62967        return res;
62968    }
62969
62970    function extend(a, b) {
62971        for (var i in b) {
62972            if (hasOwnProp(b, i)) {
62973                a[i] = b[i];
62974            }
62975        }
62976
62977        if (hasOwnProp(b, 'toString')) {
62978            a.toString = b.toString;
62979        }
62980
62981        if (hasOwnProp(b, 'valueOf')) {
62982            a.valueOf = b.valueOf;
62983        }
62984
62985        return a;
62986    }
62987
62988    function createUTC(input, format, locale, strict) {
62989        return createLocalOrUTC(input, format, locale, strict, true).utc();
62990    }
62991
62992    function defaultParsingFlags() {
62993        // We need to deep clone this object.
62994        return {
62995            empty: false,
62996            unusedTokens: [],
62997            unusedInput: [],
62998            overflow: -2,
62999            charsLeftOver: 0,
63000            nullInput: false,
63001            invalidEra: null,
63002            invalidMonth: null,
63003            invalidFormat: false,
63004            userInvalidated: false,
63005            iso: false,
63006            parsedDateParts: [],
63007            era: null,
63008            meridiem: null,
63009            rfc2822: false,
63010            weekdayMismatch: false,
63011        };
63012    }
63013
63014    function getParsingFlags(m) {
63015        if (m._pf == null) {
63016            m._pf = defaultParsingFlags();
63017        }
63018        return m._pf;
63019    }
63020
63021    var some;
63022    if (Array.prototype.some) {
63023        some = Array.prototype.some;
63024    } else {
63025        some = function (fun) {
63026            var t = Object(this),
63027                len = t.length >>> 0,
63028                i;
63029
63030            for (i = 0; i < len; i++) {
63031                if (i in t && fun.call(this, t[i], i, t)) {
63032                    return true;
63033                }
63034            }
63035
63036            return false;
63037        };
63038    }
63039
63040    function isValid(m) {
63041        if (m._isValid == null) {
63042            var flags = getParsingFlags(m),
63043                parsedParts = some.call(flags.parsedDateParts, function (i) {
63044                    return i != null;
63045                }),
63046                isNowValid =
63047                    !isNaN(m._d.getTime()) &&
63048                    flags.overflow < 0 &&
63049                    !flags.empty &&
63050                    !flags.invalidEra &&
63051                    !flags.invalidMonth &&
63052                    !flags.invalidWeekday &&
63053                    !flags.weekdayMismatch &&
63054                    !flags.nullInput &&
63055                    !flags.invalidFormat &&
63056                    !flags.userInvalidated &&
63057                    (!flags.meridiem || (flags.meridiem && parsedParts));
63058
63059            if (m._strict) {
63060                isNowValid =
63061                    isNowValid &&
63062                    flags.charsLeftOver === 0 &&
63063                    flags.unusedTokens.length === 0 &&
63064                    flags.bigHour === undefined;
63065            }
63066
63067            if (Object.isFrozen == null || !Object.isFrozen(m)) {
63068                m._isValid = isNowValid;
63069            } else {
63070                return isNowValid;
63071            }
63072        }
63073        return m._isValid;
63074    }
63075
63076    function createInvalid(flags) {
63077        var m = createUTC(NaN);
63078        if (flags != null) {
63079            extend(getParsingFlags(m), flags);
63080        } else {
63081            getParsingFlags(m).userInvalidated = true;
63082        }
63083
63084        return m;
63085    }
63086
63087    // Plugins that add properties should also add the key here (null value),
63088    // so we can properly clone ourselves.
63089    var momentProperties = (hooks.momentProperties = []),
63090        updateInProgress = false;
63091
63092    function copyConfig(to, from) {
63093        var i,
63094            prop,
63095            val,
63096            momentPropertiesLen = momentProperties.length;
63097
63098        if (!isUndefined(from._isAMomentObject)) {
63099            to._isAMomentObject = from._isAMomentObject;
63100        }
63101        if (!isUndefined(from._i)) {
63102            to._i = from._i;
63103        }
63104        if (!isUndefined(from._f)) {
63105            to._f = from._f;
63106        }
63107        if (!isUndefined(from._l)) {
63108            to._l = from._l;
63109        }
63110        if (!isUndefined(from._strict)) {
63111            to._strict = from._strict;
63112        }
63113        if (!isUndefined(from._tzm)) {
63114            to._tzm = from._tzm;
63115        }
63116        if (!isUndefined(from._isUTC)) {
63117            to._isUTC = from._isUTC;
63118        }
63119        if (!isUndefined(from._offset)) {
63120            to._offset = from._offset;
63121        }
63122        if (!isUndefined(from._pf)) {
63123            to._pf = getParsingFlags(from);
63124        }
63125        if (!isUndefined(from._locale)) {
63126            to._locale = from._locale;
63127        }
63128
63129        if (momentPropertiesLen > 0) {
63130            for (i = 0; i < momentPropertiesLen; i++) {
63131                prop = momentProperties[i];
63132                val = from[prop];
63133                if (!isUndefined(val)) {
63134                    to[prop] = val;
63135                }
63136            }
63137        }
63138
63139        return to;
63140    }
63141
63142    // Moment prototype object
63143    function Moment(config) {
63144        copyConfig(this, config);
63145        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
63146        if (!this.isValid()) {
63147            this._d = new Date(NaN);
63148        }
63149        // Prevent infinite loop in case updateOffset creates new moment
63150        // objects.
63151        if (updateInProgress === false) {
63152            updateInProgress = true;
63153            hooks.updateOffset(this);
63154            updateInProgress = false;
63155        }
63156    }
63157
63158    function isMoment(obj) {
63159        return (
63160            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
63161        );
63162    }
63163
63164    function warn(msg) {
63165        if (
63166            hooks.suppressDeprecationWarnings === false &&
63167            typeof console !== 'undefined' &&
63168            console.warn
63169        ) {
63170            console.warn('Deprecation warning: ' + msg);
63171        }
63172    }
63173
63174    function deprecate(msg, fn) {
63175        var firstTime = true;
63176
63177        return extend(function () {
63178            if (hooks.deprecationHandler != null) {
63179                hooks.deprecationHandler(null, msg);
63180            }
63181            if (firstTime) {
63182                var args = [],
63183                    arg,
63184                    i,
63185                    key,
63186                    argLen = arguments.length;
63187                for (i = 0; i < argLen; i++) {
63188                    arg = '';
63189                    if (typeof arguments[i] === 'object') {
63190                        arg += '\n[' + i + '] ';
63191                        for (key in arguments[0]) {
63192                            if (hasOwnProp(arguments[0], key)) {
63193                                arg += key + ': ' + arguments[0][key] + ', ';
63194                            }
63195                        }
63196                        arg = arg.slice(0, -2); // Remove trailing comma and space
63197                    } else {
63198                        arg = arguments[i];
63199                    }
63200                    args.push(arg);
63201                }
63202                warn(
63203                    msg +
63204                        '\nArguments: ' +
63205                        Array.prototype.slice.call(args).join('') +
63206                        '\n' +
63207                        new Error().stack
63208                );
63209                firstTime = false;
63210            }
63211            return fn.apply(this, arguments);
63212        }, fn);
63213    }
63214
63215    var deprecations = {};
63216
63217    function deprecateSimple(name, msg) {
63218        if (hooks.deprecationHandler != null) {
63219            hooks.deprecationHandler(name, msg);
63220        }
63221        if (!deprecations[name]) {
63222            warn(msg);
63223            deprecations[name] = true;
63224        }
63225    }
63226
63227    hooks.suppressDeprecationWarnings = false;
63228    hooks.deprecationHandler = null;
63229
63230    function isFunction(input) {
63231        return (
63232            (typeof Function !== 'undefined' && input instanceof Function) ||
63233            Object.prototype.toString.call(input) === '[object Function]'
63234        );
63235    }
63236
63237    function set(config) {
63238        var prop, i;
63239        for (i in config) {
63240            if (hasOwnProp(config, i)) {
63241                prop = config[i];
63242                if (isFunction(prop)) {
63243                    this[i] = prop;
63244                } else {
63245                    this['_' + i] = prop;
63246                }
63247            }
63248        }
63249        this._config = config;
63250        // Lenient ordinal parsing accepts just a number in addition to
63251        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
63252        // TODO: Remove "ordinalParse" fallback in next major release.
63253        this._dayOfMonthOrdinalParseLenient = new RegExp(
63254            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
63255                '|' +
63256                /\d{1,2}/.source
63257        );
63258    }
63259
63260    function mergeConfigs(parentConfig, childConfig) {
63261        var res = extend({}, parentConfig),
63262            prop;
63263        for (prop in childConfig) {
63264            if (hasOwnProp(childConfig, prop)) {
63265                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
63266                    res[prop] = {};
63267                    extend(res[prop], parentConfig[prop]);
63268                    extend(res[prop], childConfig[prop]);
63269                } else if (childConfig[prop] != null) {
63270                    res[prop] = childConfig[prop];
63271                } else {
63272                    delete res[prop];
63273                }
63274            }
63275        }
63276        for (prop in parentConfig) {
63277            if (
63278                hasOwnProp(parentConfig, prop) &&
63279                !hasOwnProp(childConfig, prop) &&
63280                isObject(parentConfig[prop])
63281            ) {
63282                // make sure changes to properties don't modify parent config
63283                res[prop] = extend({}, res[prop]);
63284            }
63285        }
63286        return res;
63287    }
63288
63289    function Locale(config) {
63290        if (config != null) {
63291            this.set(config);
63292        }
63293    }
63294
63295    var keys;
63296
63297    if (Object.keys) {
63298        keys = Object.keys;
63299    } else {
63300        keys = function (obj) {
63301            var i,
63302                res = [];
63303            for (i in obj) {
63304                if (hasOwnProp(obj, i)) {
63305                    res.push(i);
63306                }
63307            }
63308            return res;
63309        };
63310    }
63311
63312    var defaultCalendar = {
63313        sameDay: '[Today at] LT',
63314        nextDay: '[Tomorrow at] LT',
63315        nextWeek: 'dddd [at] LT',
63316        lastDay: '[Yesterday at] LT',
63317        lastWeek: '[Last] dddd [at] LT',
63318        sameElse: 'L',
63319    };
63320
63321    function calendar(key, mom, now) {
63322        var output = this._calendar[key] || this._calendar['sameElse'];
63323        return isFunction(output) ? output.call(mom, now) : output;
63324    }
63325
63326    function zeroFill(number, targetLength, forceSign) {
63327        var absNumber = '' + Math.abs(number),
63328            zerosToFill = targetLength - absNumber.length,
63329            sign = number >= 0;
63330        return (
63331            (sign ? (forceSign ? '+' : '') : '-') +
63332            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
63333            absNumber
63334        );
63335    }
63336
63337    var formattingTokens =
63338            /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
63339        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
63340        formatFunctions = {},
63341        formatTokenFunctions = {};
63342
63343    // token:    'M'
63344    // padded:   ['MM', 2]
63345    // ordinal:  'Mo'
63346    // callback: function () { this.month() + 1 }
63347    function addFormatToken(token, padded, ordinal, callback) {
63348        var func = callback;
63349        if (typeof callback === 'string') {
63350            func = function () {
63351                return this[callback]();
63352            };
63353        }
63354        if (token) {
63355            formatTokenFunctions[token] = func;
63356        }
63357        if (padded) {
63358            formatTokenFunctions[padded[0]] = function () {
63359                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
63360            };
63361        }
63362        if (ordinal) {
63363            formatTokenFunctions[ordinal] = function () {
63364                return this.localeData().ordinal(
63365                    func.apply(this, arguments),
63366                    token
63367                );
63368            };
63369        }
63370    }
63371
63372    function removeFormattingTokens(input) {
63373        if (input.match(/\[[\s\S]/)) {
63374            return input.replace(/^\[|\]$/g, '');
63375        }
63376        return input.replace(/\\/g, '');
63377    }
63378
63379    function makeFormatFunction(format) {
63380        var array = format.match(formattingTokens),
63381            i,
63382            length;
63383
63384        for (i = 0, length = array.length; i < length; i++) {
63385            if (formatTokenFunctions[array[i]]) {
63386                array[i] = formatTokenFunctions[array[i]];
63387            } else {
63388                array[i] = removeFormattingTokens(array[i]);
63389            }
63390        }
63391
63392        return function (mom) {
63393            var output = '',
63394                i;
63395            for (i = 0; i < length; i++) {
63396                output += isFunction(array[i])
63397                    ? array[i].call(mom, format)
63398                    : array[i];
63399            }
63400            return output;
63401        };
63402    }
63403
63404    // format date using native date object
63405    function formatMoment(m, format) {
63406        if (!m.isValid()) {
63407            return m.localeData().invalidDate();
63408        }
63409
63410        format = expandFormat(format, m.localeData());
63411        formatFunctions[format] =
63412            formatFunctions[format] || makeFormatFunction(format);
63413
63414        return formatFunctions[format](m);
63415    }
63416
63417    function expandFormat(format, locale) {
63418        var i = 5;
63419
63420        function replaceLongDateFormatTokens(input) {
63421            return locale.longDateFormat(input) || input;
63422        }
63423
63424        localFormattingTokens.lastIndex = 0;
63425        while (i >= 0 && localFormattingTokens.test(format)) {
63426            format = format.replace(
63427                localFormattingTokens,
63428                replaceLongDateFormatTokens
63429            );
63430            localFormattingTokens.lastIndex = 0;
63431            i -= 1;
63432        }
63433
63434        return format;
63435    }
63436
63437    var defaultLongDateFormat = {
63438        LTS: 'h:mm:ss A',
63439        LT: 'h:mm A',
63440        L: 'MM/DD/YYYY',
63441        LL: 'MMMM D, YYYY',
63442        LLL: 'MMMM D, YYYY h:mm A',
63443        LLLL: 'dddd, MMMM D, YYYY h:mm A',
63444    };
63445
63446    function longDateFormat(key) {
63447        var format = this._longDateFormat[key],
63448            formatUpper = this._longDateFormat[key.toUpperCase()];
63449
63450        if (format || !formatUpper) {
63451            return format;
63452        }
63453
63454        this._longDateFormat[key] = formatUpper
63455            .match(formattingTokens)
63456            .map(function (tok) {
63457                if (
63458                    tok === 'MMMM' ||
63459                    tok === 'MM' ||
63460                    tok === 'DD' ||
63461                    tok === 'dddd'
63462                ) {
63463                    return tok.slice(1);
63464                }
63465                return tok;
63466            })
63467            .join('');
63468
63469        return this._longDateFormat[key];
63470    }
63471
63472    var defaultInvalidDate = 'Invalid date';
63473
63474    function invalidDate() {
63475        return this._invalidDate;
63476    }
63477
63478    var defaultOrdinal = '%d',
63479        defaultDayOfMonthOrdinalParse = /\d{1,2}/;
63480
63481    function ordinal(number) {
63482        return this._ordinal.replace('%d', number);
63483    }
63484
63485    var defaultRelativeTime = {
63486        future: 'in %s',
63487        past: '%s ago',
63488        s: 'a few seconds',
63489        ss: '%d seconds',
63490        m: 'a minute',
63491        mm: '%d minutes',
63492        h: 'an hour',
63493        hh: '%d hours',
63494        d: 'a day',
63495        dd: '%d days',
63496        w: 'a week',
63497        ww: '%d weeks',
63498        M: 'a month',
63499        MM: '%d months',
63500        y: 'a year',
63501        yy: '%d years',
63502    };
63503
63504    function relativeTime(number, withoutSuffix, string, isFuture) {
63505        var output = this._relativeTime[string];
63506        return isFunction(output)
63507            ? output(number, withoutSuffix, string, isFuture)
63508            : output.replace(/%d/i, number);
63509    }
63510
63511    function pastFuture(diff, output) {
63512        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
63513        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
63514    }
63515
63516    var aliases = {};
63517
63518    function addUnitAlias(unit, shorthand) {
63519        var lowerCase = unit.toLowerCase();
63520        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
63521    }
63522
63523    function normalizeUnits(units) {
63524        return typeof units === 'string'
63525            ? aliases[units] || aliases[units.toLowerCase()]
63526            : undefined;
63527    }
63528
63529    function normalizeObjectUnits(inputObject) {
63530        var normalizedInput = {},
63531            normalizedProp,
63532            prop;
63533
63534        for (prop in inputObject) {
63535            if (hasOwnProp(inputObject, prop)) {
63536                normalizedProp = normalizeUnits(prop);
63537                if (normalizedProp) {
63538                    normalizedInput[normalizedProp] = inputObject[prop];
63539                }
63540            }
63541        }
63542
63543        return normalizedInput;
63544    }
63545
63546    var priorities = {};
63547
63548    function addUnitPriority(unit, priority) {
63549        priorities[unit] = priority;
63550    }
63551
63552    function getPrioritizedUnits(unitsObj) {
63553        var units = [],
63554            u;
63555        for (u in unitsObj) {
63556            if (hasOwnProp(unitsObj, u)) {
63557                units.push({ unit: u, priority: priorities[u] });
63558            }
63559        }
63560        units.sort(function (a, b) {
63561            return a.priority - b.priority;
63562        });
63563        return units;
63564    }
63565
63566    function isLeapYear(year) {
63567        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
63568    }
63569
63570    function absFloor(number) {
63571        if (number < 0) {
63572            // -0 -> 0
63573            return Math.ceil(number) || 0;
63574        } else {
63575            return Math.floor(number);
63576        }
63577    }
63578
63579    function toInt(argumentForCoercion) {
63580        var coercedNumber = +argumentForCoercion,
63581            value = 0;
63582
63583        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
63584            value = absFloor(coercedNumber);
63585        }
63586
63587        return value;
63588    }
63589
63590    function makeGetSet(unit, keepTime) {
63591        return function (value) {
63592            if (value != null) {
63593                set$1(this, unit, value);
63594                hooks.updateOffset(this, keepTime);
63595                return this;
63596            } else {
63597                return get(this, unit);
63598            }
63599        };
63600    }
63601
63602    function get(mom, unit) {
63603        return mom.isValid()
63604            ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
63605            : NaN;
63606    }
63607
63608    function set$1(mom, unit, value) {
63609        if (mom.isValid() && !isNaN(value)) {
63610            if (
63611                unit === 'FullYear' &&
63612                isLeapYear(mom.year()) &&
63613                mom.month() === 1 &&
63614                mom.date() === 29
63615            ) {
63616                value = toInt(value);
63617                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
63618                    value,
63619                    mom.month(),
63620                    daysInMonth(value, mom.month())
63621                );
63622            } else {
63623                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
63624            }
63625        }
63626    }
63627
63628    // MOMENTS
63629
63630    function stringGet(units) {
63631        units = normalizeUnits(units);
63632        if (isFunction(this[units])) {
63633            return this[units]();
63634        }
63635        return this;
63636    }
63637
63638    function stringSet(units, value) {
63639        if (typeof units === 'object') {
63640            units = normalizeObjectUnits(units);
63641            var prioritized = getPrioritizedUnits(units),
63642                i,
63643                prioritizedLen = prioritized.length;
63644            for (i = 0; i < prioritizedLen; i++) {
63645                this[prioritized[i].unit](units[prioritized[i].unit]);
63646            }
63647        } else {
63648            units = normalizeUnits(units);
63649            if (isFunction(this[units])) {
63650                return this[units](value);
63651            }
63652        }
63653        return this;
63654    }
63655
63656    var match1 = /\d/, //       0 - 9
63657        match2 = /\d\d/, //      00 - 99
63658        match3 = /\d{3}/, //     000 - 999
63659        match4 = /\d{4}/, //    0000 - 9999
63660        match6 = /[+-]?\d{6}/, // -999999 - 999999
63661        match1to2 = /\d\d?/, //       0 - 99
63662        match3to4 = /\d\d\d\d?/, //     999 - 9999
63663        match5to6 = /\d\d\d\d\d\d?/, //   99999 - 999999
63664        match1to3 = /\d{1,3}/, //       0 - 999
63665        match1to4 = /\d{1,4}/, //       0 - 9999
63666        match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
63667        matchUnsigned = /\d+/, //       0 - inf
63668        matchSigned = /[+-]?\d+/, //    -inf - inf
63669        matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
63670        matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
63671        matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
63672        // any word (or two) characters or numbers including two/three word month in arabic.
63673        // includes scottish gaelic two word and hyphenated months
63674        matchWord =
63675            /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
63676        regexes;
63677
63678    regexes = {};
63679
63680    function addRegexToken(token, regex, strictRegex) {
63681        regexes[token] = isFunction(regex)
63682            ? regex
63683            : function (isStrict, localeData) {
63684                  return isStrict && strictRegex ? strictRegex : regex;
63685              };
63686    }
63687
63688    function getParseRegexForToken(token, config) {
63689        if (!hasOwnProp(regexes, token)) {
63690            return new RegExp(unescapeFormat(token));
63691        }
63692
63693        return regexes[token](config._strict, config._locale);
63694    }
63695
63696    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
63697    function unescapeFormat(s) {
63698        return regexEscape(
63699            s
63700                .replace('\\', '')
63701                .replace(
63702                    /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
63703                    function (matched, p1, p2, p3, p4) {
63704                        return p1 || p2 || p3 || p4;
63705                    }
63706                )
63707        );
63708    }
63709
63710    function regexEscape(s) {
63711        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
63712    }
63713
63714    var tokens = {};
63715
63716    function addParseToken(token, callback) {
63717        var i,
63718            func = callback,
63719            tokenLen;
63720        if (typeof token === 'string') {
63721            token = [token];
63722        }
63723        if (isNumber(callback)) {
63724            func = function (input, array) {
63725                array[callback] = toInt(input);
63726            };
63727        }
63728        tokenLen = token.length;
63729        for (i = 0; i < tokenLen; i++) {
63730            tokens[token[i]] = func;
63731        }
63732    }
63733
63734    function addWeekParseToken(token, callback) {
63735        addParseToken(token, function (input, array, config, token) {
63736            config._w = config._w || {};
63737            callback(input, config._w, config, token);
63738        });
63739    }
63740
63741    function addTimeToArrayFromToken(token, input, config) {
63742        if (input != null && hasOwnProp(tokens, token)) {
63743            tokens[token](input, config._a, config, token);
63744        }
63745    }
63746
63747    var YEAR = 0,
63748        MONTH = 1,
63749        DATE = 2,
63750        HOUR = 3,
63751        MINUTE = 4,
63752        SECOND = 5,
63753        MILLISECOND = 6,
63754        WEEK = 7,
63755        WEEKDAY = 8;
63756
63757    function mod(n, x) {
63758        return ((n % x) + x) % x;
63759    }
63760
63761    var indexOf;
63762
63763    if (Array.prototype.indexOf) {
63764        indexOf = Array.prototype.indexOf;
63765    } else {
63766        indexOf = function (o) {
63767            // I know
63768            var i;
63769            for (i = 0; i < this.length; ++i) {
63770                if (this[i] === o) {
63771                    return i;
63772                }
63773            }
63774            return -1;
63775        };
63776    }
63777
63778    function daysInMonth(year, month) {
63779        if (isNaN(year) || isNaN(month)) {
63780            return NaN;
63781        }
63782        var modMonth = mod(month, 12);
63783        year += (month - modMonth) / 12;
63784        return modMonth === 1
63785            ? isLeapYear(year)
63786                ? 29
63787                : 28
63788            : 31 - ((modMonth % 7) % 2);
63789    }
63790
63791    // FORMATTING
63792
63793    addFormatToken('M', ['MM', 2], 'Mo', function () {
63794        return this.month() + 1;
63795    });
63796
63797    addFormatToken('MMM', 0, 0, function (format) {
63798        return this.localeData().monthsShort(this, format);
63799    });
63800
63801    addFormatToken('MMMM', 0, 0, function (format) {
63802        return this.localeData().months(this, format);
63803    });
63804
63805    // ALIASES
63806
63807    addUnitAlias('month', 'M');
63808
63809    // PRIORITY
63810
63811    addUnitPriority('month', 8);
63812
63813    // PARSING
63814
63815    addRegexToken('M', match1to2);
63816    addRegexToken('MM', match1to2, match2);
63817    addRegexToken('MMM', function (isStrict, locale) {
63818        return locale.monthsShortRegex(isStrict);
63819    });
63820    addRegexToken('MMMM', function (isStrict, locale) {
63821        return locale.monthsRegex(isStrict);
63822    });
63823
63824    addParseToken(['M', 'MM'], function (input, array) {
63825        array[MONTH] = toInt(input) - 1;
63826    });
63827
63828    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
63829        var month = config._locale.monthsParse(input, token, config._strict);
63830        // if we didn't find a month name, mark the date as invalid.
63831        if (month != null) {
63832            array[MONTH] = month;
63833        } else {
63834            getParsingFlags(config).invalidMonth = input;
63835        }
63836    });
63837
63838    // LOCALES
63839
63840    var defaultLocaleMonths =
63841            'January_February_March_April_May_June_July_August_September_October_November_December'.split(
63842                '_'
63843            ),
63844        defaultLocaleMonthsShort =
63845            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
63846        MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
63847        defaultMonthsShortRegex = matchWord,
63848        defaultMonthsRegex = matchWord;
63849
63850    function localeMonths(m, format) {
63851        if (!m) {
63852            return isArray(this._months)
63853                ? this._months
63854                : this._months['standalone'];
63855        }
63856        return isArray(this._months)
63857            ? this._months[m.month()]
63858            : this._months[
63859                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)
63860                      ? 'format'
63861                      : 'standalone'
63862              ][m.month()];
63863    }
63864
63865    function localeMonthsShort(m, format) {
63866        if (!m) {
63867            return isArray(this._monthsShort)
63868                ? this._monthsShort
63869                : this._monthsShort['standalone'];
63870        }
63871        return isArray(this._monthsShort)
63872            ? this._monthsShort[m.month()]
63873            : this._monthsShort[
63874                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
63875              ][m.month()];
63876    }
63877
63878    function handleStrictParse(monthName, format, strict) {
63879        var i,
63880            ii,
63881            mom,
63882            llc = monthName.toLocaleLowerCase();
63883        if (!this._monthsParse) {
63884            // this is not used
63885            this._monthsParse = [];
63886            this._longMonthsParse = [];
63887            this._shortMonthsParse = [];
63888            for (i = 0; i < 12; ++i) {
63889                mom = createUTC([2000, i]);
63890                this._shortMonthsParse[i] = this.monthsShort(
63891                    mom,
63892                    ''
63893                ).toLocaleLowerCase();
63894                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
63895            }
63896        }
63897
63898        if (strict) {
63899            if (format === 'MMM') {
63900                ii = indexOf.call(this._shortMonthsParse, llc);
63901                return ii !== -1 ? ii : null;
63902            } else {
63903                ii = indexOf.call(this._longMonthsParse, llc);
63904                return ii !== -1 ? ii : null;
63905            }
63906        } else {
63907            if (format === 'MMM') {
63908                ii = indexOf.call(this._shortMonthsParse, llc);
63909                if (ii !== -1) {
63910                    return ii;
63911                }
63912                ii = indexOf.call(this._longMonthsParse, llc);
63913                return ii !== -1 ? ii : null;
63914            } else {
63915                ii = indexOf.call(this._longMonthsParse, llc);
63916                if (ii !== -1) {
63917                    return ii;
63918                }
63919                ii = indexOf.call(this._shortMonthsParse, llc);
63920                return ii !== -1 ? ii : null;
63921            }
63922        }
63923    }
63924
63925    function localeMonthsParse(monthName, format, strict) {
63926        var i, mom, regex;
63927
63928        if (this._monthsParseExact) {
63929            return handleStrictParse.call(this, monthName, format, strict);
63930        }
63931
63932        if (!this._monthsParse) {
63933            this._monthsParse = [];
63934            this._longMonthsParse = [];
63935            this._shortMonthsParse = [];
63936        }
63937
63938        // TODO: add sorting
63939        // Sorting makes sure if one month (or abbr) is a prefix of another
63940        // see sorting in computeMonthsParse
63941        for (i = 0; i < 12; i++) {
63942            // make the regex if we don't have it already
63943            mom = createUTC([2000, i]);
63944            if (strict && !this._longMonthsParse[i]) {
63945                this._longMonthsParse[i] = new RegExp(
63946                    '^' + this.months(mom, '').replace('.', '') + '$',
63947                    'i'
63948                );
63949                this._shortMonthsParse[i] = new RegExp(
63950                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',
63951                    'i'
63952                );
63953            }
63954            if (!strict && !this._monthsParse[i]) {
63955                regex =
63956                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
63957                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
63958            }
63959            // test the regex
63960            if (
63961                strict &&
63962                format === 'MMMM' &&
63963                this._longMonthsParse[i].test(monthName)
63964            ) {
63965                return i;
63966            } else if (
63967                strict &&
63968                format === 'MMM' &&
63969                this._shortMonthsParse[i].test(monthName)
63970            ) {
63971                return i;
63972            } else if (!strict && this._monthsParse[i].test(monthName)) {
63973                return i;
63974            }
63975        }
63976    }
63977
63978    // MOMENTS
63979
63980    function setMonth(mom, value) {
63981        var dayOfMonth;
63982
63983        if (!mom.isValid()) {
63984            // No op
63985            return mom;
63986        }
63987
63988        if (typeof value === 'string') {
63989            if (/^\d+$/.test(value)) {
63990                value = toInt(value);
63991            } else {
63992                value = mom.localeData().monthsParse(value);
63993                // TODO: Another silent failure?
63994                if (!isNumber(value)) {
63995                    return mom;
63996                }
63997            }
63998        }
63999
64000        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
64001        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
64002        return mom;
64003    }
64004
64005    function getSetMonth(value) {
64006        if (value != null) {
64007            setMonth(this, value);
64008            hooks.updateOffset(this, true);
64009            return this;
64010        } else {
64011            return get(this, 'Month');
64012        }
64013    }
64014
64015    function getDaysInMonth() {
64016        return daysInMonth(this.year(), this.month());
64017    }
64018
64019    function monthsShortRegex(isStrict) {
64020        if (this._monthsParseExact) {
64021            if (!hasOwnProp(this, '_monthsRegex')) {
64022                computeMonthsParse.call(this);
64023            }
64024            if (isStrict) {
64025                return this._monthsShortStrictRegex;
64026            } else {
64027                return this._monthsShortRegex;
64028            }
64029        } else {
64030            if (!hasOwnProp(this, '_monthsShortRegex')) {
64031                this._monthsShortRegex = defaultMonthsShortRegex;
64032            }
64033            return this._monthsShortStrictRegex && isStrict
64034                ? this._monthsShortStrictRegex
64035                : this._monthsShortRegex;
64036        }
64037    }
64038
64039    function monthsRegex(isStrict) {
64040        if (this._monthsParseExact) {
64041            if (!hasOwnProp(this, '_monthsRegex')) {
64042                computeMonthsParse.call(this);
64043            }
64044            if (isStrict) {
64045                return this._monthsStrictRegex;
64046            } else {
64047                return this._monthsRegex;
64048            }
64049        } else {
64050            if (!hasOwnProp(this, '_monthsRegex')) {
64051                this._monthsRegex = defaultMonthsRegex;
64052            }
64053            return this._monthsStrictRegex && isStrict
64054                ? this._monthsStrictRegex
64055                : this._monthsRegex;
64056        }
64057    }
64058
64059    function computeMonthsParse() {
64060        function cmpLenRev(a, b) {
64061            return b.length - a.length;
64062        }
64063
64064        var shortPieces = [],
64065            longPieces = [],
64066            mixedPieces = [],
64067            i,
64068            mom;
64069        for (i = 0; i < 12; i++) {
64070            // make the regex if we don't have it already
64071            mom = createUTC([2000, i]);
64072            shortPieces.push(this.monthsShort(mom, ''));
64073            longPieces.push(this.months(mom, ''));
64074            mixedPieces.push(this.months(mom, ''));
64075            mixedPieces.push(this.monthsShort(mom, ''));
64076        }
64077        // Sorting makes sure if one month (or abbr) is a prefix of another it
64078        // will match the longer piece.
64079        shortPieces.sort(cmpLenRev);
64080        longPieces.sort(cmpLenRev);
64081        mixedPieces.sort(cmpLenRev);
64082        for (i = 0; i < 12; i++) {
64083            shortPieces[i] = regexEscape(shortPieces[i]);
64084            longPieces[i] = regexEscape(longPieces[i]);
64085        }
64086        for (i = 0; i < 24; i++) {
64087            mixedPieces[i] = regexEscape(mixedPieces[i]);
64088        }
64089
64090        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
64091        this._monthsShortRegex = this._monthsRegex;
64092        this._monthsStrictRegex = new RegExp(
64093            '^(' + longPieces.join('|') + ')',
64094            'i'
64095        );
64096        this._monthsShortStrictRegex = new RegExp(
64097            '^(' + shortPieces.join('|') + ')',
64098            'i'
64099        );
64100    }
64101
64102    // FORMATTING
64103
64104    addFormatToken('Y', 0, 0, function () {
64105        var y = this.year();
64106        return y <= 9999 ? zeroFill(y, 4) : '+' + y;
64107    });
64108
64109    addFormatToken(0, ['YY', 2], 0, function () {
64110        return this.year() % 100;
64111    });
64112
64113    addFormatToken(0, ['YYYY', 4], 0, 'year');
64114    addFormatToken(0, ['YYYYY', 5], 0, 'year');
64115    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
64116
64117    // ALIASES
64118
64119    addUnitAlias('year', 'y');
64120
64121    // PRIORITIES
64122
64123    addUnitPriority('year', 1);
64124
64125    // PARSING
64126
64127    addRegexToken('Y', matchSigned);
64128    addRegexToken('YY', match1to2, match2);
64129    addRegexToken('YYYY', match1to4, match4);
64130    addRegexToken('YYYYY', match1to6, match6);
64131    addRegexToken('YYYYYY', match1to6, match6);
64132
64133    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
64134    addParseToken('YYYY', function (input, array) {
64135        array[YEAR] =
64136            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
64137    });
64138    addParseToken('YY', function (input, array) {
64139        array[YEAR] = hooks.parseTwoDigitYear(input);
64140    });
64141    addParseToken('Y', function (input, array) {
64142        array[YEAR] = parseInt(input, 10);
64143    });
64144
64145    // HELPERS
64146
64147    function daysInYear(year) {
64148        return isLeapYear(year) ? 366 : 365;
64149    }
64150
64151    // HOOKS
64152
64153    hooks.parseTwoDigitYear = function (input) {
64154        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
64155    };
64156
64157    // MOMENTS
64158
64159    var getSetYear = makeGetSet('FullYear', true);
64160
64161    function getIsLeapYear() {
64162        return isLeapYear(this.year());
64163    }
64164
64165    function createDate(y, m, d, h, M, s, ms) {
64166        // can't just apply() to create a date:
64167        // https://stackoverflow.com/q/181348
64168        var date;
64169        // the date constructor remaps years 0-99 to 1900-1999
64170        if (y < 100 && y >= 0) {
64171            // preserve leap years using a full 400 year cycle, then reset
64172            date = new Date(y + 400, m, d, h, M, s, ms);
64173            if (isFinite(date.getFullYear())) {
64174                date.setFullYear(y);
64175            }
64176        } else {
64177            date = new Date(y, m, d, h, M, s, ms);
64178        }
64179
64180        return date;
64181    }
64182
64183    function createUTCDate(y) {
64184        var date, args;
64185        // the Date.UTC function remaps years 0-99 to 1900-1999
64186        if (y < 100 && y >= 0) {
64187            args = Array.prototype.slice.call(arguments);
64188            // preserve leap years using a full 400 year cycle, then reset
64189            args[0] = y + 400;
64190            date = new Date(Date.UTC.apply(null, args));
64191            if (isFinite(date.getUTCFullYear())) {
64192                date.setUTCFullYear(y);
64193            }
64194        } else {
64195            date = new Date(Date.UTC.apply(null, arguments));
64196        }
64197
64198        return date;
64199    }
64200
64201    // start-of-first-week - start-of-year
64202    function firstWeekOffset(year, dow, doy) {
64203        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
64204            fwd = 7 + dow - doy,
64205            // first-week day local weekday -- which local weekday is fwd
64206            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
64207
64208        return -fwdlw + fwd - 1;
64209    }
64210
64211    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
64212    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
64213        var localWeekday = (7 + weekday - dow) % 7,
64214            weekOffset = firstWeekOffset(year, dow, doy),
64215            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
64216            resYear,
64217            resDayOfYear;
64218
64219        if (dayOfYear <= 0) {
64220            resYear = year - 1;
64221            resDayOfYear = daysInYear(resYear) + dayOfYear;
64222        } else if (dayOfYear > daysInYear(year)) {
64223            resYear = year + 1;
64224            resDayOfYear = dayOfYear - daysInYear(year);
64225        } else {
64226            resYear = year;
64227            resDayOfYear = dayOfYear;
64228        }
64229
64230        return {
64231            year: resYear,
64232            dayOfYear: resDayOfYear,
64233        };
64234    }
64235
64236    function weekOfYear(mom, dow, doy) {
64237        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
64238            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
64239            resWeek,
64240            resYear;
64241
64242        if (week < 1) {
64243            resYear = mom.year() - 1;
64244            resWeek = week + weeksInYear(resYear, dow, doy);
64245        } else if (week > weeksInYear(mom.year(), dow, doy)) {
64246            resWeek = week - weeksInYear(mom.year(), dow, doy);
64247            resYear = mom.year() + 1;
64248        } else {
64249            resYear = mom.year();
64250            resWeek = week;
64251        }
64252
64253        return {
64254            week: resWeek,
64255            year: resYear,
64256        };
64257    }
64258
64259    function weeksInYear(year, dow, doy) {
64260        var weekOffset = firstWeekOffset(year, dow, doy),
64261            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
64262        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
64263    }
64264
64265    // FORMATTING
64266
64267    addFormatToken('w', ['ww', 2], 'wo', 'week');
64268    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
64269
64270    // ALIASES
64271
64272    addUnitAlias('week', 'w');
64273    addUnitAlias('isoWeek', 'W');
64274
64275    // PRIORITIES
64276
64277    addUnitPriority('week', 5);
64278    addUnitPriority('isoWeek', 5);
64279
64280    // PARSING
64281
64282    addRegexToken('w', match1to2);
64283    addRegexToken('ww', match1to2, match2);
64284    addRegexToken('W', match1to2);
64285    addRegexToken('WW', match1to2, match2);
64286
64287    addWeekParseToken(
64288        ['w', 'ww', 'W', 'WW'],
64289        function (input, week, config, token) {
64290            week[token.substr(0, 1)] = toInt(input);
64291        }
64292    );
64293
64294    // HELPERS
64295
64296    // LOCALES
64297
64298    function localeWeek(mom) {
64299        return weekOfYear(mom, this._week.dow, this._week.doy).week;
64300    }
64301
64302    var defaultLocaleWeek = {
64303        dow: 0, // Sunday is the first day of the week.
64304        doy: 6, // The week that contains Jan 6th is the first week of the year.
64305    };
64306
64307    function localeFirstDayOfWeek() {
64308        return this._week.dow;
64309    }
64310
64311    function localeFirstDayOfYear() {
64312        return this._week.doy;
64313    }
64314
64315    // MOMENTS
64316
64317    function getSetWeek(input) {
64318        var week = this.localeData().week(this);
64319        return input == null ? week : this.add((input - week) * 7, 'd');
64320    }
64321
64322    function getSetISOWeek(input) {
64323        var week = weekOfYear(this, 1, 4).week;
64324        return input == null ? week : this.add((input - week) * 7, 'd');
64325    }
64326
64327    // FORMATTING
64328
64329    addFormatToken('d', 0, 'do', 'day');
64330
64331    addFormatToken('dd', 0, 0, function (format) {
64332        return this.localeData().weekdaysMin(this, format);
64333    });
64334
64335    addFormatToken('ddd', 0, 0, function (format) {
64336        return this.localeData().weekdaysShort(this, format);
64337    });
64338
64339    addFormatToken('dddd', 0, 0, function (format) {
64340        return this.localeData().weekdays(this, format);
64341    });
64342
64343    addFormatToken('e', 0, 0, 'weekday');
64344    addFormatToken('E', 0, 0, 'isoWeekday');
64345
64346    // ALIASES
64347
64348    addUnitAlias('day', 'd');
64349    addUnitAlias('weekday', 'e');
64350    addUnitAlias('isoWeekday', 'E');
64351
64352    // PRIORITY
64353    addUnitPriority('day', 11);
64354    addUnitPriority('weekday', 11);
64355    addUnitPriority('isoWeekday', 11);
64356
64357    // PARSING
64358
64359    addRegexToken('d', match1to2);
64360    addRegexToken('e', match1to2);
64361    addRegexToken('E', match1to2);
64362    addRegexToken('dd', function (isStrict, locale) {
64363        return locale.weekdaysMinRegex(isStrict);
64364    });
64365    addRegexToken('ddd', function (isStrict, locale) {
64366        return locale.weekdaysShortRegex(isStrict);
64367    });
64368    addRegexToken('dddd', function (isStrict, locale) {
64369        return locale.weekdaysRegex(isStrict);
64370    });
64371
64372    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
64373        var weekday = config._locale.weekdaysParse(input, token, config._strict);
64374        // if we didn't get a weekday name, mark the date as invalid
64375        if (weekday != null) {
64376            week.d = weekday;
64377        } else {
64378            getParsingFlags(config).invalidWeekday = input;
64379        }
64380    });
64381
64382    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
64383        week[token] = toInt(input);
64384    });
64385
64386    // HELPERS
64387
64388    function parseWeekday(input, locale) {
64389        if (typeof input !== 'string') {
64390            return input;
64391        }
64392
64393        if (!isNaN(input)) {
64394            return parseInt(input, 10);
64395        }
64396
64397        input = locale.weekdaysParse(input);
64398        if (typeof input === 'number') {
64399            return input;
64400        }
64401
64402        return null;
64403    }
64404
64405    function parseIsoWeekday(input, locale) {
64406        if (typeof input === 'string') {
64407            return locale.weekdaysParse(input) % 7 || 7;
64408        }
64409        return isNaN(input) ? null : input;
64410    }
64411
64412    // LOCALES
64413    function shiftWeekdays(ws, n) {
64414        return ws.slice(n, 7).concat(ws.slice(0, n));
64415    }
64416
64417    var defaultLocaleWeekdays =
64418            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
64419        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
64420        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
64421        defaultWeekdaysRegex = matchWord,
64422        defaultWeekdaysShortRegex = matchWord,
64423        defaultWeekdaysMinRegex = matchWord;
64424
64425    function localeWeekdays(m, format) {
64426        var weekdays = isArray(this._weekdays)
64427            ? this._weekdays
64428            : this._weekdays[
64429                  m && m !== true && this._weekdays.isFormat.test(format)
64430                      ? 'format'
64431                      : 'standalone'
64432              ];
64433        return m === true
64434            ? shiftWeekdays(weekdays, this._week.dow)
64435            : m
64436            ? weekdays[m.day()]
64437            : weekdays;
64438    }
64439
64440    function localeWeekdaysShort(m) {
64441        return m === true
64442            ? shiftWeekdays(this._weekdaysShort, this._week.dow)
64443            : m
64444            ? this._weekdaysShort[m.day()]
64445            : this._weekdaysShort;
64446    }
64447
64448    function localeWeekdaysMin(m) {
64449        return m === true
64450            ? shiftWeekdays(this._weekdaysMin, this._week.dow)
64451            : m
64452            ? this._weekdaysMin[m.day()]
64453            : this._weekdaysMin;
64454    }
64455
64456    function handleStrictParse$1(weekdayName, format, strict) {
64457        var i,
64458            ii,
64459            mom,
64460            llc = weekdayName.toLocaleLowerCase();
64461        if (!this._weekdaysParse) {
64462            this._weekdaysParse = [];
64463            this._shortWeekdaysParse = [];
64464            this._minWeekdaysParse = [];
64465
64466            for (i = 0; i < 7; ++i) {
64467                mom = createUTC([2000, 1]).day(i);
64468                this._minWeekdaysParse[i] = this.weekdaysMin(
64469                    mom,
64470                    ''
64471                ).toLocaleLowerCase();
64472                this._shortWeekdaysParse[i] = this.weekdaysShort(
64473                    mom,
64474                    ''
64475                ).toLocaleLowerCase();
64476                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
64477            }
64478        }
64479
64480        if (strict) {
64481            if (format === 'dddd') {
64482                ii = indexOf.call(this._weekdaysParse, llc);
64483                return ii !== -1 ? ii : null;
64484            } else if (format === 'ddd') {
64485                ii = indexOf.call(this._shortWeekdaysParse, llc);
64486                return ii !== -1 ? ii : null;
64487            } else {
64488                ii = indexOf.call(this._minWeekdaysParse, llc);
64489                return ii !== -1 ? ii : null;
64490            }
64491        } else {
64492            if (format === 'dddd') {
64493                ii = indexOf.call(this._weekdaysParse, llc);
64494                if (ii !== -1) {
64495                    return ii;
64496                }
64497                ii = indexOf.call(this._shortWeekdaysParse, llc);
64498                if (ii !== -1) {
64499                    return ii;
64500                }
64501                ii = indexOf.call(this._minWeekdaysParse, llc);
64502                return ii !== -1 ? ii : null;
64503            } else if (format === 'ddd') {
64504                ii = indexOf.call(this._shortWeekdaysParse, llc);
64505                if (ii !== -1) {
64506                    return ii;
64507                }
64508                ii = indexOf.call(this._weekdaysParse, llc);
64509                if (ii !== -1) {
64510                    return ii;
64511                }
64512                ii = indexOf.call(this._minWeekdaysParse, llc);
64513                return ii !== -1 ? ii : null;
64514            } else {
64515                ii = indexOf.call(this._minWeekdaysParse, llc);
64516                if (ii !== -1) {
64517                    return ii;
64518                }
64519                ii = indexOf.call(this._weekdaysParse, llc);
64520                if (ii !== -1) {
64521                    return ii;
64522                }
64523                ii = indexOf.call(this._shortWeekdaysParse, llc);
64524                return ii !== -1 ? ii : null;
64525            }
64526        }
64527    }
64528
64529    function localeWeekdaysParse(weekdayName, format, strict) {
64530        var i, mom, regex;
64531
64532        if (this._weekdaysParseExact) {
64533            return handleStrictParse$1.call(this, weekdayName, format, strict);
64534        }
64535
64536        if (!this._weekdaysParse) {
64537            this._weekdaysParse = [];
64538            this._minWeekdaysParse = [];
64539            this._shortWeekdaysParse = [];
64540            this._fullWeekdaysParse = [];
64541        }
64542
64543        for (i = 0; i < 7; i++) {
64544            // make the regex if we don't have it already
64545
64546            mom = createUTC([2000, 1]).day(i);
64547            if (strict && !this._fullWeekdaysParse[i]) {
64548                this._fullWeekdaysParse[i] = new RegExp(
64549                    '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
64550                    'i'
64551                );
64552                this._shortWeekdaysParse[i] = new RegExp(
64553                    '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
64554                    'i'
64555                );
64556                this._minWeekdaysParse[i] = new RegExp(
64557                    '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
64558                    'i'
64559                );
64560            }
64561            if (!this._weekdaysParse[i]) {
64562                regex =
64563                    '^' +
64564                    this.weekdays(mom, '') +
64565                    '|^' +
64566                    this.weekdaysShort(mom, '') +
64567                    '|^' +
64568                    this.weekdaysMin(mom, '');
64569                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
64570            }
64571            // test the regex
64572            if (
64573                strict &&
64574                format === 'dddd' &&
64575                this._fullWeekdaysParse[i].test(weekdayName)
64576            ) {
64577                return i;
64578            } else if (
64579                strict &&
64580                format === 'ddd' &&
64581                this._shortWeekdaysParse[i].test(weekdayName)
64582            ) {
64583                return i;
64584            } else if (
64585                strict &&
64586                format === 'dd' &&
64587                this._minWeekdaysParse[i].test(weekdayName)
64588            ) {
64589                return i;
64590            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
64591                return i;
64592            }
64593        }
64594    }
64595
64596    // MOMENTS
64597
64598    function getSetDayOfWeek(input) {
64599        if (!this.isValid()) {
64600            return input != null ? this : NaN;
64601        }
64602        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
64603        if (input != null) {
64604            input = parseWeekday(input, this.localeData());
64605            return this.add(input - day, 'd');
64606        } else {
64607            return day;
64608        }
64609    }
64610
64611    function getSetLocaleDayOfWeek(input) {
64612        if (!this.isValid()) {
64613            return input != null ? this : NaN;
64614        }
64615        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
64616        return input == null ? weekday : this.add(input - weekday, 'd');
64617    }
64618
64619    function getSetISODayOfWeek(input) {
64620        if (!this.isValid()) {
64621            return input != null ? this : NaN;
64622        }
64623
64624        // behaves the same as moment#day except
64625        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
64626        // as a setter, sunday should belong to the previous week.
64627
64628        if (input != null) {
64629            var weekday = parseIsoWeekday(input, this.localeData());
64630            return this.day(this.day() % 7 ? weekday : weekday - 7);
64631        } else {
64632            return this.day() || 7;
64633        }
64634    }
64635
64636    function weekdaysRegex(isStrict) {
64637        if (this._weekdaysParseExact) {
64638            if (!hasOwnProp(this, '_weekdaysRegex')) {
64639                computeWeekdaysParse.call(this);
64640            }
64641            if (isStrict) {
64642                return this._weekdaysStrictRegex;
64643            } else {
64644                return this._weekdaysRegex;
64645            }
64646        } else {
64647            if (!hasOwnProp(this, '_weekdaysRegex')) {
64648                this._weekdaysRegex = defaultWeekdaysRegex;
64649            }
64650            return this._weekdaysStrictRegex && isStrict
64651                ? this._weekdaysStrictRegex
64652                : this._weekdaysRegex;
64653        }
64654    }
64655
64656    function weekdaysShortRegex(isStrict) {
64657        if (this._weekdaysParseExact) {
64658            if (!hasOwnProp(this, '_weekdaysRegex')) {
64659                computeWeekdaysParse.call(this);
64660            }
64661            if (isStrict) {
64662                return this._weekdaysShortStrictRegex;
64663            } else {
64664                return this._weekdaysShortRegex;
64665            }
64666        } else {
64667            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
64668                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
64669            }
64670            return this._weekdaysShortStrictRegex && isStrict
64671                ? this._weekdaysShortStrictRegex
64672                : this._weekdaysShortRegex;
64673        }
64674    }
64675
64676    function weekdaysMinRegex(isStrict) {
64677        if (this._weekdaysParseExact) {
64678            if (!hasOwnProp(this, '_weekdaysRegex')) {
64679                computeWeekdaysParse.call(this);
64680            }
64681            if (isStrict) {
64682                return this._weekdaysMinStrictRegex;
64683            } else {
64684                return this._weekdaysMinRegex;
64685            }
64686        } else {
64687            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
64688                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
64689            }
64690            return this._weekdaysMinStrictRegex && isStrict
64691                ? this._weekdaysMinStrictRegex
64692                : this._weekdaysMinRegex;
64693        }
64694    }
64695
64696    function computeWeekdaysParse() {
64697        function cmpLenRev(a, b) {
64698            return b.length - a.length;
64699        }
64700
64701        var minPieces = [],
64702            shortPieces = [],
64703            longPieces = [],
64704            mixedPieces = [],
64705            i,
64706            mom,
64707            minp,
64708            shortp,
64709            longp;
64710        for (i = 0; i < 7; i++) {
64711            // make the regex if we don't have it already
64712            mom = createUTC([2000, 1]).day(i);
64713            minp = regexEscape(this.weekdaysMin(mom, ''));
64714            shortp = regexEscape(this.weekdaysShort(mom, ''));
64715            longp = regexEscape(this.weekdays(mom, ''));
64716            minPieces.push(minp);
64717            shortPieces.push(shortp);
64718            longPieces.push(longp);
64719            mixedPieces.push(minp);
64720            mixedPieces.push(shortp);
64721            mixedPieces.push(longp);
64722        }
64723        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
64724        // will match the longer piece.
64725        minPieces.sort(cmpLenRev);
64726        shortPieces.sort(cmpLenRev);
64727        longPieces.sort(cmpLenRev);
64728        mixedPieces.sort(cmpLenRev);
64729
64730        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
64731        this._weekdaysShortRegex = this._weekdaysRegex;
64732        this._weekdaysMinRegex = this._weekdaysRegex;
64733
64734        this._weekdaysStrictRegex = new RegExp(
64735            '^(' + longPieces.join('|') + ')',
64736            'i'
64737        );
64738        this._weekdaysShortStrictRegex = new RegExp(
64739            '^(' + shortPieces.join('|') + ')',
64740            'i'
64741        );
64742        this._weekdaysMinStrictRegex = new RegExp(
64743            '^(' + minPieces.join('|') + ')',
64744            'i'
64745        );
64746    }
64747
64748    // FORMATTING
64749
64750    function hFormat() {
64751        return this.hours() % 12 || 12;
64752    }
64753
64754    function kFormat() {
64755        return this.hours() || 24;
64756    }
64757
64758    addFormatToken('H', ['HH', 2], 0, 'hour');
64759    addFormatToken('h', ['hh', 2], 0, hFormat);
64760    addFormatToken('k', ['kk', 2], 0, kFormat);
64761
64762    addFormatToken('hmm', 0, 0, function () {
64763        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
64764    });
64765
64766    addFormatToken('hmmss', 0, 0, function () {
64767        return (
64768            '' +
64769            hFormat.apply(this) +
64770            zeroFill(this.minutes(), 2) +
64771            zeroFill(this.seconds(), 2)
64772        );
64773    });
64774
64775    addFormatToken('Hmm', 0, 0, function () {
64776        return '' + this.hours() + zeroFill(this.minutes(), 2);
64777    });
64778
64779    addFormatToken('Hmmss', 0, 0, function () {
64780        return (
64781            '' +
64782            this.hours() +
64783            zeroFill(this.minutes(), 2) +
64784            zeroFill(this.seconds(), 2)
64785        );
64786    });
64787
64788    function meridiem(token, lowercase) {
64789        addFormatToken(token, 0, 0, function () {
64790            return this.localeData().meridiem(
64791                this.hours(),
64792                this.minutes(),
64793                lowercase
64794            );
64795        });
64796    }
64797
64798    meridiem('a', true);
64799    meridiem('A', false);
64800
64801    // ALIASES
64802
64803    addUnitAlias('hour', 'h');
64804
64805    // PRIORITY
64806    addUnitPriority('hour', 13);
64807
64808    // PARSING
64809
64810    function matchMeridiem(isStrict, locale) {
64811        return locale._meridiemParse;
64812    }
64813
64814    addRegexToken('a', matchMeridiem);
64815    addRegexToken('A', matchMeridiem);
64816    addRegexToken('H', match1to2);
64817    addRegexToken('h', match1to2);
64818    addRegexToken('k', match1to2);
64819    addRegexToken('HH', match1to2, match2);
64820    addRegexToken('hh', match1to2, match2);
64821    addRegexToken('kk', match1to2, match2);
64822
64823    addRegexToken('hmm', match3to4);
64824    addRegexToken('hmmss', match5to6);
64825    addRegexToken('Hmm', match3to4);
64826    addRegexToken('Hmmss', match5to6);
64827
64828    addParseToken(['H', 'HH'], HOUR);
64829    addParseToken(['k', 'kk'], function (input, array, config) {
64830        var kInput = toInt(input);
64831        array[HOUR] = kInput === 24 ? 0 : kInput;
64832    });
64833    addParseToken(['a', 'A'], function (input, array, config) {
64834        config._isPm = config._locale.isPM(input);
64835        config._meridiem = input;
64836    });
64837    addParseToken(['h', 'hh'], function (input, array, config) {
64838        array[HOUR] = toInt(input);
64839        getParsingFlags(config).bigHour = true;
64840    });
64841    addParseToken('hmm', function (input, array, config) {
64842        var pos = input.length - 2;
64843        array[HOUR] = toInt(input.substr(0, pos));
64844        array[MINUTE] = toInt(input.substr(pos));
64845        getParsingFlags(config).bigHour = true;
64846    });
64847    addParseToken('hmmss', function (input, array, config) {
64848        var pos1 = input.length - 4,
64849            pos2 = input.length - 2;
64850        array[HOUR] = toInt(input.substr(0, pos1));
64851        array[MINUTE] = toInt(input.substr(pos1, 2));
64852        array[SECOND] = toInt(input.substr(pos2));
64853        getParsingFlags(config).bigHour = true;
64854    });
64855    addParseToken('Hmm', function (input, array, config) {
64856        var pos = input.length - 2;
64857        array[HOUR] = toInt(input.substr(0, pos));
64858        array[MINUTE] = toInt(input.substr(pos));
64859    });
64860    addParseToken('Hmmss', function (input, array, config) {
64861        var pos1 = input.length - 4,
64862            pos2 = input.length - 2;
64863        array[HOUR] = toInt(input.substr(0, pos1));
64864        array[MINUTE] = toInt(input.substr(pos1, 2));
64865        array[SECOND] = toInt(input.substr(pos2));
64866    });
64867
64868    // LOCALES
64869
64870    function localeIsPM(input) {
64871        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
64872        // Using charAt should be more compatible.
64873        return (input + '').toLowerCase().charAt(0) === 'p';
64874    }
64875
64876    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
64877        // Setting the hour should keep the time, because the user explicitly
64878        // specified which hour they want. So trying to maintain the same hour (in
64879        // a new timezone) makes sense. Adding/subtracting hours does not follow
64880        // this rule.
64881        getSetHour = makeGetSet('Hours', true);
64882
64883    function localeMeridiem(hours, minutes, isLower) {
64884        if (hours > 11) {
64885            return isLower ? 'pm' : 'PM';
64886        } else {
64887            return isLower ? 'am' : 'AM';
64888        }
64889    }
64890
64891    var baseConfig = {
64892        calendar: defaultCalendar,
64893        longDateFormat: defaultLongDateFormat,
64894        invalidDate: defaultInvalidDate,
64895        ordinal: defaultOrdinal,
64896        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
64897        relativeTime: defaultRelativeTime,
64898
64899        months: defaultLocaleMonths,
64900        monthsShort: defaultLocaleMonthsShort,
64901
64902        week: defaultLocaleWeek,
64903
64904        weekdays: defaultLocaleWeekdays,
64905        weekdaysMin: defaultLocaleWeekdaysMin,
64906        weekdaysShort: defaultLocaleWeekdaysShort,
64907
64908        meridiemParse: defaultLocaleMeridiemParse,
64909    };
64910
64911    // internal storage for locale config files
64912    var locales = {},
64913        localeFamilies = {},
64914        globalLocale;
64915
64916    function commonPrefix(arr1, arr2) {
64917        var i,
64918            minl = Math.min(arr1.length, arr2.length);
64919        for (i = 0; i < minl; i += 1) {
64920            if (arr1[i] !== arr2[i]) {
64921                return i;
64922            }
64923        }
64924        return minl;
64925    }
64926
64927    function normalizeLocale(key) {
64928        return key ? key.toLowerCase().replace('_', '-') : key;
64929    }
64930
64931    // pick the locale from the array
64932    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
64933    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
64934    function chooseLocale(names) {
64935        var i = 0,
64936            j,
64937            next,
64938            locale,
64939            split;
64940
64941        while (i < names.length) {
64942            split = normalizeLocale(names[i]).split('-');
64943            j = split.length;
64944            next = normalizeLocale(names[i + 1]);
64945            next = next ? next.split('-') : null;
64946            while (j > 0) {
64947                locale = loadLocale(split.slice(0, j).join('-'));
64948                if (locale) {
64949                    return locale;
64950                }
64951                if (
64952                    next &&
64953                    next.length >= j &&
64954                    commonPrefix(split, next) >= j - 1
64955                ) {
64956                    //the next array item is better than a shallower substring of this one
64957                    break;
64958                }
64959                j--;
64960            }
64961            i++;
64962        }
64963        return globalLocale;
64964    }
64965
64966    function isLocaleNameSane(name) {
64967        // Prevent names that look like filesystem paths, i.e contain '/' or '\'
64968        return name.match('^[^/\\\\]*$') != null;
64969    }
64970
64971    function loadLocale(name) {
64972        var oldLocale = null,
64973            aliasedRequire;
64974        // TODO: Find a better way to register and load all the locales in Node
64975        if (
64976            locales[name] === undefined &&
64977            typeof module !== 'undefined' &&
64978            module &&
64979            module.exports &&
64980            isLocaleNameSane(name)
64981        ) {
64982            try {
64983                oldLocale = globalLocale._abbr;
64984                aliasedRequire = require;
64985                aliasedRequire('./locale/' + name);
64986                getSetGlobalLocale(oldLocale);
64987            } catch (e) {
64988                // mark as not found to avoid repeating expensive file require call causing high CPU
64989                // when trying to find en-US, en_US, en-us for every format call
64990                locales[name] = null; // null means not found
64991            }
64992        }
64993        return locales[name];
64994    }
64995
64996    // This function will load locale and then set the global locale.  If
64997    // no arguments are passed in, it will simply return the current global
64998    // locale key.
64999    function getSetGlobalLocale(key, values) {
65000        var data;
65001        if (key) {
65002            if (isUndefined(values)) {
65003                data = getLocale(key);
65004            } else {
65005                data = defineLocale(key, values);
65006            }
65007
65008            if (data) {
65009                // moment.duration._locale = moment._locale = data;
65010                globalLocale = data;
65011            } else {
65012                if (typeof console !== 'undefined' && console.warn) {
65013                    //warn user if arguments are passed but the locale could not be set
65014                    console.warn(
65015                        'Locale ' + key + ' not found. Did you forget to load it?'
65016                    );
65017                }
65018            }
65019        }
65020
65021        return globalLocale._abbr;
65022    }
65023
65024    function defineLocale(name, config) {
65025        if (config !== null) {
65026            var locale,
65027                parentConfig = baseConfig;
65028            config.abbr = name;
65029            if (locales[name] != null) {
65030                deprecateSimple(
65031                    'defineLocaleOverride',
65032                    'use moment.updateLocale(localeName, config) to change ' +
65033                        'an existing locale. moment.defineLocale(localeName, ' +
65034                        'config) should only be used for creating a new locale ' +
65035                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
65036                );
65037                parentConfig = locales[name]._config;
65038            } else if (config.parentLocale != null) {
65039                if (locales[config.parentLocale] != null) {
65040                    parentConfig = locales[config.parentLocale]._config;
65041                } else {
65042                    locale = loadLocale(config.parentLocale);
65043                    if (locale != null) {
65044                        parentConfig = locale._config;
65045                    } else {
65046                        if (!localeFamilies[config.parentLocale]) {
65047                            localeFamilies[config.parentLocale] = [];
65048                        }
65049                        localeFamilies[config.parentLocale].push({
65050                            name: name,
65051                            config: config,
65052                        });
65053                        return null;
65054                    }
65055                }
65056            }
65057            locales[name] = new Locale(mergeConfigs(parentConfig, config));
65058
65059            if (localeFamilies[name]) {
65060                localeFamilies[name].forEach(function (x) {
65061                    defineLocale(x.name, x.config);
65062                });
65063            }
65064
65065            // backwards compat for now: also set the locale
65066            // make sure we set the locale AFTER all child locales have been
65067            // created, so we won't end up with the child locale set.
65068            getSetGlobalLocale(name);
65069
65070            return locales[name];
65071        } else {
65072            // useful for testing
65073            delete locales[name];
65074            return null;
65075        }
65076    }
65077
65078    function updateLocale(name, config) {
65079        if (config != null) {
65080            var locale,
65081                tmpLocale,
65082                parentConfig = baseConfig;
65083
65084            if (locales[name] != null && locales[name].parentLocale != null) {
65085                // Update existing child locale in-place to avoid memory-leaks
65086                locales[name].set(mergeConfigs(locales[name]._config, config));
65087            } else {
65088                // MERGE
65089                tmpLocale = loadLocale(name);
65090                if (tmpLocale != null) {
65091                    parentConfig = tmpLocale._config;
65092                }
65093                config = mergeConfigs(parentConfig, config);
65094                if (tmpLocale == null) {
65095                    // updateLocale is called for creating a new locale
65096                    // Set abbr so it will have a name (getters return
65097                    // undefined otherwise).
65098                    config.abbr = name;
65099                }
65100                locale = new Locale(config);
65101                locale.parentLocale = locales[name];
65102                locales[name] = locale;
65103            }
65104
65105            // backwards compat for now: also set the locale
65106            getSetGlobalLocale(name);
65107        } else {
65108            // pass null for config to unupdate, useful for tests
65109            if (locales[name] != null) {
65110                if (locales[name].parentLocale != null) {
65111                    locales[name] = locales[name].parentLocale;
65112                    if (name === getSetGlobalLocale()) {
65113                        getSetGlobalLocale(name);
65114                    }
65115                } else if (locales[name] != null) {
65116                    delete locales[name];
65117                }
65118            }
65119        }
65120        return locales[name];
65121    }
65122
65123    // returns locale data
65124    function getLocale(key) {
65125        var locale;
65126
65127        if (key && key._locale && key._locale._abbr) {
65128            key = key._locale._abbr;
65129        }
65130
65131        if (!key) {
65132            return globalLocale;
65133        }
65134
65135        if (!isArray(key)) {
65136            //short-circuit everything else
65137            locale = loadLocale(key);
65138            if (locale) {
65139                return locale;
65140            }
65141            key = [key];
65142        }
65143
65144        return chooseLocale(key);
65145    }
65146
65147    function listLocales() {
65148        return keys(locales);
65149    }
65150
65151    function checkOverflow(m) {
65152        var overflow,
65153            a = m._a;
65154
65155        if (a && getParsingFlags(m).overflow === -2) {
65156            overflow =
65157                a[MONTH] < 0 || a[MONTH] > 11
65158                    ? MONTH
65159                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
65160                    ? DATE
65161                    : a[HOUR] < 0 ||
65162                      a[HOUR] > 24 ||
65163                      (a[HOUR] === 24 &&
65164                          (a[MINUTE] !== 0 ||
65165                              a[SECOND] !== 0 ||
65166                              a[MILLISECOND] !== 0))
65167                    ? HOUR
65168                    : a[MINUTE] < 0 || a[MINUTE] > 59
65169                    ? MINUTE
65170                    : a[SECOND] < 0 || a[SECOND] > 59
65171                    ? SECOND
65172                    : a[MILLISECOND] < 0 || a[MILLISECOND] > 999
65173                    ? MILLISECOND
vendor: 9,346 bytes, lines 65174-65457
65174                    : -1;
65175
65176            if (
65177                getParsingFlags(m)._overflowDayOfYear &&
65178                (overflow < YEAR || overflow > DATE)
65179            ) {
65180                overflow = DATE;
65181            }
65182            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
65183                overflow = WEEK;
65184            }
65185            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
65186                overflow = WEEKDAY;
65187            }
65188
65189            getParsingFlags(m).overflow = overflow;
65190        }
65191
65192        return m;
65193    }
65194
65195    // iso 8601 regex
65196    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
65197    var extendedIsoRegex =
65198            /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
65199        basicIsoRegex =
65200            /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
65201        tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
65202        isoDates = [
65203            ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
65204            ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
65205            ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
65206            ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
65207            ['YYYY-DDD', /\d{4}-\d{3}/],
65208            ['YYYY-MM', /\d{4}-\d\d/, false],
65209            ['YYYYYYMMDD', /[+-]\d{10}/],
65210            ['YYYYMMDD', /\d{8}/],
65211            ['GGGG[W]WWE', /\d{4}W\d{3}/],
65212            ['GGGG[W]WW', /\d{4}W\d{2}/, false],
65213            ['YYYYDDD', /\d{7}/],
65214            ['YYYYMM', /\d{6}/, false],
65215            ['YYYY', /\d{4}/, false],
65216        ],
65217        // iso time formats and regexes
65218        isoTimes = [
65219            ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
65220            ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
65221            ['HH:mm:ss', /\d\d:\d\d:\d\d/],
65222            ['HH:mm', /\d\d:\d\d/],
65223            ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
65224            ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
65225            ['HHmmss', /\d\d\d\d\d\d/],
65226            ['HHmm', /\d\d\d\d/],
65227            ['HH', /\d\d/],
65228        ],
65229        aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
65230        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
65231        rfc2822 =
65232            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
65233        obsOffsets = {
65234            UT: 0,
65235            GMT: 0,
65236            EDT: -4 * 60,
65237            EST: -5 * 60,
65238            CDT: -5 * 60,
65239            CST: -6 * 60,
65240            MDT: -6 * 60,
65241            MST: -7 * 60,
65242            PDT: -7 * 60,
65243            PST: -8 * 60,
65244        };
65245
65246    // date from iso format
65247    function configFromISO(config) {
65248        var i,
65249            l,
65250            string = config._i,
65251            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
65252            allowTime,
65253            dateFormat,
65254            timeFormat,
65255            tzFormat,
65256            isoDatesLen = isoDates.length,
65257            isoTimesLen = isoTimes.length;
65258
65259        if (match) {
65260            getParsingFlags(config).iso = true;
65261            for (i = 0, l = isoDatesLen; i < l; i++) {
65262                if (isoDates[i][1].exec(match[1])) {
65263                    dateFormat = isoDates[i][0];
65264                    allowTime = isoDates[i][2] !== false;
65265                    break;
65266                }
65267            }
65268            if (dateFormat == null) {
65269                config._isValid = false;
65270                return;
65271            }
65272            if (match[3]) {
65273                for (i = 0, l = isoTimesLen; i < l; i++) {
65274                    if (isoTimes[i][1].exec(match[3])) {
65275                        // match[2] should be 'T' or space
65276                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
65277                        break;
65278                    }
65279                }
65280                if (timeFormat == null) {
65281                    config._isValid = false;
65282                    return;
65283                }
65284            }
65285            if (!allowTime && timeFormat != null) {
65286                config._isValid = false;
65287                return;
65288            }
65289            if (match[4]) {
65290                if (tzRegex.exec(match[4])) {
65291                    tzFormat = 'Z';
65292                } else {
65293                    config._isValid = false;
65294                    return;
65295                }
65296            }
65297            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
65298            configFromStringAndFormat(config);
65299        } else {
65300            config._isValid = false;
65301        }
65302    }
65303
65304    function extractFromRFC2822Strings(
65305        yearStr,
65306        monthStr,
65307        dayStr,
65308        hourStr,
65309        minuteStr,
65310        secondStr
65311    ) {
65312        var result = [
65313            untruncateYear(yearStr),
65314            defaultLocaleMonthsShort.indexOf(monthStr),
65315            parseInt(dayStr, 10),
65316            parseInt(hourStr, 10),
65317            parseInt(minuteStr, 10),
65318        ];
65319
65320        if (secondStr) {
65321            result.push(parseInt(secondStr, 10));
65322        }
65323
65324        return result;
65325    }
65326
65327    function untruncateYear(yearStr) {
65328        var year = parseInt(yearStr, 10);
65329        if (year <= 49) {
65330            return 2000 + year;
65331        } else if (year <= 999) {
65332            return 1900 + year;
65333        }
65334        return year;
65335    }
65336
65337    function preprocessRFC2822(s) {
65338        // Remove comments and folding whitespace and replace multiple-spaces with a single space
65339        return s
65340            .replace(/\([^()]*\)|[\n\t]/g, ' ')
65341            .replace(/(\s\s+)/g, ' ')
65342            .replace(/^\s\s*/, '')
65343            .replace(/\s\s*$/, '');
65344    }
65345
65346    function checkWeekday(weekdayStr, parsedInput, config) {
65347        if (weekdayStr) {
65348            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
65349            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
65350                weekdayActual = new Date(
65351                    parsedInput[0],
65352                    parsedInput[1],
65353                    parsedInput[2]
65354                ).getDay();
65355            if (weekdayProvided !== weekdayActual) {
65356                getParsingFlags(config).weekdayMismatch = true;
65357                config._isValid = false;
65358                return false;
65359            }
65360        }
65361        return true;
65362    }
65363
65364    function calculateOffset(obsOffset, militaryOffset, numOffset) {
65365        if (obsOffset) {
65366            return obsOffsets[obsOffset];
65367        } else if (militaryOffset) {
65368            // the only allowed military tz is Z
65369            return 0;
65370        } else {
65371            var hm = parseInt(numOffset, 10),
65372                m = hm % 100,
65373                h = (hm - m) / 100;
65374            return h * 60 + m;
65375        }
65376    }
65377
65378    // date and time from ref 2822 format
65379    function configFromRFC2822(config) {
65380        var match = rfc2822.exec(preprocessRFC2822(config._i)),
65381            parsedArray;
65382        if (match) {
65383            parsedArray = extractFromRFC2822Strings(
65384                match[4],
65385                match[3],
65386                match[2],
65387                match[5],
65388                match[6],
65389                match[7]
65390            );
65391            if (!checkWeekday(match[1], parsedArray, config)) {
65392                return;
65393            }
65394
65395            config._a = parsedArray;
65396            config._tzm = calculateOffset(match[8], match[9], match[10]);
65397
65398            config._d = createUTCDate.apply(null, config._a);
65399            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
65400
65401            getParsingFlags(config).rfc2822 = true;
65402        } else {
65403            config._isValid = false;
65404        }
65405    }
65406
65407    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
65408    function configFromString(config) {
65409        var matched = aspNetJsonRegex.exec(config._i);
65410        if (matched !== null) {
65411            config._d = new Date(+matched[1]);
65412            return;
65413        }
65414
65415        configFromISO(config);
65416        if (config._isValid === false) {
65417            delete config._isValid;
65418        } else {
65419            return;
65420        }
65421
65422        configFromRFC2822(config);
65423        if (config._isValid === false) {
65424            delete config._isValid;
65425        } else {
65426            return;
65427        }
65428
65429        if (config._strict) {
65430            config._isValid = false;
65431        } else {
65432            // Final attempt, use Input Fallback
65433            hooks.createFromInputFallback(config);
65434        }
65435    }
65436
65437    hooks.createFromInputFallback = deprecate(
65438        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
65439            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
65440            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
65441        function (config) {
65442            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
65443        }
65444    );
65445
65446    // Pick the first defined of two or three arguments.
65447    function defaults(a, b, c) {
65448        if (a != null) {
65449            return a;
65450        }
65451        if (b != null) {
65452            return b;
65453        }
65454        return c;
65455    }
65456
65457    function currentDateArray(config
vendor: 87,494 bytes, lines 65457-68333
65457) {
65458        // hooks is actually the exported moment object
65459        var nowValue = new Date(hooks.now());
65460        if (config._useUTC) {
65461            return [
65462                nowValue.getUTCFullYear(),
65463                nowValue.getUTCMonth(),
65464                nowValue.getUTCDate(),
65465            ];
65466        }
65467        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
65468    }
65469
65470    // convert an array to a date.
65471    // the array should mirror the parameters below
65472    // note: all values past the year are optional and will default to the lowest possible value.
65473    // [year, month, day , hour, minute, second, millisecond]
65474    function configFromArray(config) {
65475        var i,
65476            date,
65477            input = [],
65478            currentDate,
65479            expectedWeekday,
65480            yearToUse;
65481
65482        if (config._d) {
65483            return;
65484        }
65485
65486        currentDate = currentDateArray(config);
65487
65488        //compute day of the year from weeks and weekdays
65489        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
65490            dayOfYearFromWeekInfo(config);
65491        }
65492
65493        //if the day of the year is set, figure out what it is
65494        if (config._dayOfYear != null) {
65495            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
65496
65497            if (
65498                config._dayOfYear > daysInYear(yearToUse) ||
65499                config._dayOfYear === 0
65500            ) {
65501                getParsingFlags(config)._overflowDayOfYear = true;
65502            }
65503
65504            date = createUTCDate(yearToUse, 0, config._dayOfYear);
65505            config._a[MONTH] = date.getUTCMonth();
65506            config._a[DATE] = date.getUTCDate();
65507        }
65508
65509        // Default to current date.
65510        // * if no year, month, day of month are given, default to today
65511        // * if day of month is given, default month and year
65512        // * if month is given, default only year
65513        // * if year is given, don't default anything
65514        for (i = 0; i < 3 && config._a[i] == null; ++i) {
65515            config._a[i] = input[i] = currentDate[i];
65516        }
65517
65518        // Zero out whatever was not defaulted, including time
65519        for (; i < 7; i++) {
65520            config._a[i] = input[i] =
65521                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
65522        }
65523
65524        // Check for 24:00:00.000
65525        if (
65526            config._a[HOUR] === 24 &&
65527            config._a[MINUTE] === 0 &&
65528            config._a[SECOND] === 0 &&
65529            config._a[MILLISECOND] === 0
65530        ) {
65531            config._nextDay = true;
65532            config._a[HOUR] = 0;
65533        }
65534
65535        config._d = (config._useUTC ? createUTCDate : createDate).apply(
65536            null,
65537            input
65538        );
65539        expectedWeekday = config._useUTC
65540            ? config._d.getUTCDay()
65541            : config._d.getDay();
65542
65543        // Apply timezone offset from input. The actual utcOffset can be changed
65544        // with parseZone.
65545        if (config._tzm != null) {
65546            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
65547        }
65548
65549        if (config._nextDay) {
65550            config._a[HOUR] = 24;
65551        }
65552
65553        // check for mismatching day of week
65554        if (
65555            config._w &&
65556            typeof config._w.d !== 'undefined' &&
65557            config._w.d !== expectedWeekday
65558        ) {
65559            getParsingFlags(config).weekdayMismatch = true;
65560        }
65561    }
65562
65563    function dayOfYearFromWeekInfo(config) {
65564        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;
65565
65566        w = config._w;
65567        if (w.GG != null || w.W != null || w.E != null) {
65568            dow = 1;
65569            doy = 4;
65570
65571            // TODO: We need to take the current isoWeekYear, but that depends on
65572            // how we interpret now (local, utc, fixed offset). So create
65573            // a now version of current config (take local/utc/offset flags, and
65574            // create now).
65575            weekYear = defaults(
65576                w.GG,
65577                config._a[YEAR],
65578                weekOfYear(createLocal(), 1, 4).year
65579            );
65580            week = defaults(w.W, 1);
65581            weekday = defaults(w.E, 1);
65582            if (weekday < 1 || weekday > 7) {
65583                weekdayOverflow = true;
65584            }
65585        } else {
65586            dow = config._locale._week.dow;
65587            doy = config._locale._week.doy;
65588
65589            curWeek = weekOfYear(createLocal(), dow, doy);
65590
65591            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
65592
65593            // Default to current week.
65594            week = defaults(w.w, curWeek.week);
65595
65596            if (w.d != null) {
65597                // weekday -- low day numbers are considered next week
65598                weekday = w.d;
65599                if (weekday < 0 || weekday > 6) {
65600                    weekdayOverflow = true;
65601                }
65602            } else if (w.e != null) {
65603                // local weekday -- counting starts from beginning of week
65604                weekday = w.e + dow;
65605                if (w.e < 0 || w.e > 6) {
65606                    weekdayOverflow = true;
65607                }
65608            } else {
65609                // default to beginning of week
65610                weekday = dow;
65611            }
65612        }
65613        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
65614            getParsingFlags(config)._overflowWeeks = true;
65615        } else if (weekdayOverflow != null) {
65616            getParsingFlags(config)._overflowWeekday = true;
65617        } else {
65618            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
65619            config._a[YEAR] = temp.year;
65620            config._dayOfYear = temp.dayOfYear;
65621        }
65622    }
65623
65624    // constant that refers to the ISO standard
65625    hooks.ISO_8601 = function () {};
65626
65627    // constant that refers to the RFC 2822 form
65628    hooks.RFC_2822 = function () {};
65629
65630    // date from string and format string
65631    function configFromStringAndFormat(config) {
65632        // TODO: Move this to another part of the creation flow to prevent circular deps
65633        if (config._f === hooks.ISO_8601) {
65634            configFromISO(config);
65635            return;
65636        }
65637        if (config._f === hooks.RFC_2822) {
65638            configFromRFC2822(config);
65639            return;
65640        }
65641        config._a = [];
65642        getParsingFlags(config).empty = true;
65643
65644        // This array is used to make a Date, either with `new Date` or `Date.UTC`
65645        var string = '' + config._i,
65646            i,
65647            parsedInput,
65648            tokens,
65649            token,
65650            skipped,
65651            stringLength = string.length,
65652            totalParsedInputLength = 0,
65653            era,
65654            tokenLen;
65655
65656        tokens =
65657            expandFormat(config._f, config._locale).match(formattingTokens) || [];
65658        tokenLen = tokens.length;
65659        for (i = 0; i < tokenLen; i++) {
65660            token = tokens[i];
65661            parsedInput = (string.match(getParseRegexForToken(token, config)) ||
65662                [])[0];
65663            if (parsedInput) {
65664                skipped = string.substr(0, string.indexOf(parsedInput));
65665                if (skipped.length > 0) {
65666                    getParsingFlags(config).unusedInput.push(skipped);
65667                }
65668                string = string.slice(
65669                    string.indexOf(parsedInput) + parsedInput.length
65670                );
65671                totalParsedInputLength += parsedInput.length;
65672            }
65673            // don't parse if it's not a known token
65674            if (formatTokenFunctions[token]) {
65675                if (parsedInput) {
65676                    getParsingFlags(config).empty = false;
65677                } else {
65678                    getParsingFlags(config).unusedTokens.push(token);
65679                }
65680                addTimeToArrayFromToken(token, parsedInput, config);
65681            } else if (config._strict && !parsedInput) {
65682                getParsingFlags(config).unusedTokens.push(token);
65683            }
65684        }
65685
65686        // add remaining unparsed input length to the string
65687        getParsingFlags(config).charsLeftOver =
65688            stringLength - totalParsedInputLength;
65689        if (string.length > 0) {
65690            getParsingFlags(config).unusedInput.push(string);
65691        }
65692
65693        // clear _12h flag if hour is <= 12
65694        if (
65695            config._a[HOUR] <= 12 &&
65696            getParsingFlags(config).bigHour === true &&
65697            config._a[HOUR] > 0
65698        ) {
65699            getParsingFlags(config).bigHour = undefined;
65700        }
65701
65702        getParsingFlags(config).parsedDateParts = config._a.slice(0);
65703        getParsingFlags(config).meridiem = config._meridiem;
65704        // handle meridiem
65705        config._a[HOUR] = meridiemFixWrap(
65706            config._locale,
65707            config._a[HOUR],
65708            config._meridiem
65709        );
65710
65711        // handle era
65712        era = getParsingFlags(config).era;
65713        if (era !== null) {
65714            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
65715        }
65716
65717        configFromArray(config);
65718        checkOverflow(config);
65719    }
65720
65721    function meridiemFixWrap(locale, hour, meridiem) {
65722        var isPm;
65723
65724        if (meridiem == null) {
65725            // nothing to do
65726            return hour;
65727        }
65728        if (locale.meridiemHour != null) {
65729            return locale.meridiemHour(hour, meridiem);
65730        } else if (locale.isPM != null) {
65731            // Fallback
65732            isPm = locale.isPM(meridiem);
65733            if (isPm && hour < 12) {
65734                hour += 12;
65735            }
65736            if (!isPm && hour === 12) {
65737                hour = 0;
65738            }
65739            return hour;
65740        } else {
65741            // this is not supposed to happen
65742            return hour;
65743        }
65744    }
65745
65746    // date from string and array of format strings
65747    function configFromStringAndArray(config) {
65748        var tempConfig,
65749            bestMoment,
65750            scoreToBeat,
65751            i,
65752            currentScore,
65753            validFormatFound,
65754            bestFormatIsValid = false,
65755            configfLen = config._f.length;
65756
65757        if (configfLen === 0) {
65758            getParsingFlags(config).invalidFormat = true;
65759            config._d = new Date(NaN);
65760            return;
65761        }
65762
65763        for (i = 0; i < configfLen; i++) {
65764            currentScore = 0;
65765            validFormatFound = false;
65766            tempConfig = copyConfig({}, config);
65767            if (config._useUTC != null) {
65768                tempConfig._useUTC = config._useUTC;
65769            }
65770            tempConfig._f = config._f[i];
65771            configFromStringAndFormat(tempConfig);
65772
65773            if (isValid(tempConfig)) {
65774                validFormatFound = true;
65775            }
65776
65777            // if there is any input that was not parsed add a penalty for that format
65778            currentScore += getParsingFlags(tempConfig).charsLeftOver;
65779
65780            //or tokens
65781            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
65782
65783            getParsingFlags(tempConfig).score = currentScore;
65784
65785            if (!bestFormatIsValid) {
65786                if (
65787                    scoreToBeat == null ||
65788                    currentScore < scoreToBeat ||
65789                    validFormatFound
65790                ) {
65791                    scoreToBeat = currentScore;
65792                    bestMoment = tempConfig;
65793                    if (validFormatFound) {
65794                        bestFormatIsValid = true;
65795                    }
65796                }
65797            } else {
65798                if (currentScore < scoreToBeat) {
65799                    scoreToBeat = currentScore;
65800                    bestMoment = tempConfig;
65801                }
65802            }
65803        }
65804
65805        extend(config, bestMoment || tempConfig);
65806    }
65807
65808    function configFromObject(config) {
65809        if (config._d) {
65810            return;
65811        }
65812
65813        var i = normalizeObjectUnits(config._i),
65814            dayOrDate = i.day === undefined ? i.date : i.day;
65815        config._a = map(
65816            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
65817            function (obj) {
65818                return obj && parseInt(obj, 10);
65819            }
65820        );
65821
65822        configFromArray(config);
65823    }
65824
65825    function createFromConfig(config) {
65826        var res = new Moment(checkOverflow(prepareConfig(config)));
65827        if (res._nextDay) {
65828            // Adding is smart enough around DST
65829            res.add(1, 'd');
65830            res._nextDay = undefined;
65831        }
65832
65833        return res;
65834    }
65835
65836    function prepareConfig(config) {
65837        var input = config._i,
65838            format = config._f;
65839
65840        config._locale = config._locale || getLocale(config._l);
65841
65842        if (input === null || (format === undefined && input === '')) {
65843            return createInvalid({ nullInput: true });
65844        }
65845
65846        if (typeof input === 'string') {
65847            config._i = input = config._locale.preparse(input);
65848        }
65849
65850        if (isMoment(input)) {
65851            return new Moment(checkOverflow(input));
65852        } else if (isDate(input)) {
65853            config._d = input;
65854        } else if (isArray(format)) {
65855            configFromStringAndArray(config);
65856        } else if (format) {
65857            configFromStringAndFormat(config);
65858        } else {
65859            configFromInput(config);
65860        }
65861
65862        if (!isValid(config)) {
65863            config._d = null;
65864        }
65865
65866        return config;
65867    }
65868
65869    function configFromInput(config) {
65870        var input = config._i;
65871        if (isUndefined(input)) {
65872            config._d = new Date(hooks.now());
65873        } else if (isDate(input)) {
65874            config._d = new Date(input.valueOf());
65875        } else if (typeof input === 'string') {
65876            configFromString(config);
65877        } else if (isArray(input)) {
65878            config._a = map(input.slice(0), function (obj) {
65879                return parseInt(obj, 10);
65880            });
65881            configFromArray(config);
65882        } else if (isObject(input)) {
65883            configFromObject(config);
65884        } else if (isNumber(input)) {
65885            // from milliseconds
65886            config._d = new Date(input);
65887        } else {
65888            hooks.createFromInputFallback(config);
65889        }
65890    }
65891
65892    function createLocalOrUTC(input, format, locale, strict, isUTC) {
65893        var c = {};
65894
65895        if (format === true || format === false) {
65896            strict = format;
65897            format = undefined;
65898        }
65899
65900        if (locale === true || locale === false) {
65901            strict = locale;
65902            locale = undefined;
65903        }
65904
65905        if (
65906            (isObject(input) && isObjectEmpty(input)) ||
65907            (isArray(input) && input.length === 0)
65908        ) {
65909            input = undefined;
65910        }
65911        // object construction must be done this way.
65912        // https://github.com/moment/moment/issues/1423
65913        c._isAMomentObject = true;
65914        c._useUTC = c._isUTC = isUTC;
65915        c._l = locale;
65916        c._i = input;
65917        c._f = format;
65918        c._strict = strict;
65919
65920        return createFromConfig(c);
65921    }
65922
65923    function createLocal(input, format, locale, strict) {
65924        return createLocalOrUTC(input, format, locale, strict, false);
65925    }
65926
65927    var prototypeMin = deprecate(
65928            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
65929            function () {
65930                var other = createLocal.apply(null, arguments);
65931                if (this.isValid() && other.isValid()) {
65932                    return other < this ? this : other;
65933                } else {
65934                    return createInvalid();
65935                }
65936            }
65937        ),
65938        prototypeMax = deprecate(
65939            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
65940            function () {
65941                var other = createLocal.apply(null, arguments);
65942                if (this.isValid() && other.isValid()) {
65943                    return other > this ? this : other;
65944                } else {
65945                    return createInvalid();
65946                }
65947            }
65948        );
65949
65950    // Pick a moment m from moments so that m[fn](other) is true for all
65951    // other. This relies on the function fn to be transitive.
65952    //
65953    // moments should either be an array of moment objects or an array, whose
65954    // first element is an array of moment objects.
65955    function pickBy(fn, moments) {
65956        var res, i;
65957        if (moments.length === 1 && isArray(moments[0])) {
65958            moments = moments[0];
65959        }
65960        if (!moments.length) {
65961            return createLocal();
65962        }
65963        res = moments[0];
65964        for (i = 1; i < moments.length; ++i) {
65965            if (!moments[i].isValid() || moments[i][fn](res)) {
65966                res = moments[i];
65967            }
65968        }
65969        return res;
65970    }
65971
65972    // TODO: Use [].sort instead?
65973    function min() {
65974        var args = [].slice.call(arguments, 0);
65975
65976        return pickBy('isBefore', args);
65977    }
65978
65979    function max() {
65980        var args = [].slice.call(arguments, 0);
65981
65982        return pickBy('isAfter', args);
65983    }
65984
65985    var now = function () {
65986        return Date.now ? Date.now() : +new Date();
65987    };
65988
65989    var ordering = [
65990        'year',
65991        'quarter',
65992        'month',
65993        'week',
65994        'day',
65995        'hour',
65996        'minute',
65997        'second',
65998        'millisecond',
65999    ];
66000
66001    function isDurationValid(m) {
66002        var key,
66003            unitHasDecimal = false,
66004            i,
66005            orderLen = ordering.length;
66006        for (key in m) {
66007            if (
66008                hasOwnProp(m, key) &&
66009                !(
66010                    indexOf.call(ordering, key) !== -1 &&
66011                    (m[key] == null || !isNaN(m[key]))
66012                )
66013            ) {
66014                return false;
66015            }
66016        }
66017
66018        for (i = 0; i < orderLen; ++i) {
66019            if (m[ordering[i]]) {
66020                if (unitHasDecimal) {
66021                    return false; // only allow non-integers for smallest unit
66022                }
66023                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
66024                    unitHasDecimal = true;
66025                }
66026            }
66027        }
66028
66029        return true;
66030    }
66031
66032    function isValid$1() {
66033        return this._isValid;
66034    }
66035
66036    function createInvalid$1() {
66037        return createDuration(NaN);
66038    }
66039
66040    function Duration(duration) {
66041        var normalizedInput = normalizeObjectUnits(duration),
66042            years = normalizedInput.year || 0,
66043            quarters = normalizedInput.quarter || 0,
66044            months = normalizedInput.month || 0,
66045            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
66046            days = normalizedInput.day || 0,
66047            hours = normalizedInput.hour || 0,
66048            minutes = normalizedInput.minute || 0,
66049            seconds = normalizedInput.second || 0,
66050            milliseconds = normalizedInput.millisecond || 0;
66051
66052        this._isValid = isDurationValid(normalizedInput);
66053
66054        // representation for dateAddRemove
66055        this._milliseconds =
66056            +milliseconds +
66057            seconds * 1e3 + // 1000
66058            minutes * 6e4 + // 1000 * 60
66059            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
66060        // Because of dateAddRemove treats 24 hours as different from a
66061        // day when working around DST, we need to store them separately
66062        this._days = +days + weeks * 7;
66063        // It is impossible to translate months into days without knowing
66064        // which months you are are talking about, so we have to store
66065        // it separately.
66066        this._months = +months + quarters * 3 + years * 12;
66067
66068        this._data = {};
66069
66070        this._locale = getLocale();
66071
66072        this._bubble();
66073    }
66074
66075    function isDuration(obj) {
66076        return obj instanceof Duration;
66077    }
66078
66079    function absRound(number) {
66080        if (number < 0) {
66081            return Math.round(-1 * number) * -1;
66082        } else {
66083            return Math.round(number);
66084        }
66085    }
66086
66087    // compare two arrays, return the number of differences
66088    function compareArrays(array1, array2, dontConvert) {
66089        var len = Math.min(array1.length, array2.length),
66090            lengthDiff = Math.abs(array1.length - array2.length),
66091            diffs = 0,
66092            i;
66093        for (i = 0; i < len; i++) {
66094            if (
66095                (dontConvert && array1[i] !== array2[i]) ||
66096                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
66097            ) {
66098                diffs++;
66099            }
66100        }
66101        return diffs + lengthDiff;
66102    }
66103
66104    // FORMATTING
66105
66106    function offset(token, separator) {
66107        addFormatToken(token, 0, 0, function () {
66108            var offset = this.utcOffset(),
66109                sign = '+';
66110            if (offset < 0) {
66111                offset = -offset;
66112                sign = '-';
66113            }
66114            return (
66115                sign +
66116                zeroFill(~~(offset / 60), 2) +
66117                separator +
66118                zeroFill(~~offset % 60, 2)
66119            );
66120        });
66121    }
66122
66123    offset('Z', ':');
66124    offset('ZZ', '');
66125
66126    // PARSING
66127
66128    addRegexToken('Z', matchShortOffset);
66129    addRegexToken('ZZ', matchShortOffset);
66130    addParseToken(['Z', 'ZZ'], function (input, array, config) {
66131        config._useUTC = true;
66132        config._tzm = offsetFromString(matchShortOffset, input);
66133    });
66134
66135    // HELPERS
66136
66137    // timezone chunker
66138    // '+10:00' > ['10',  '00']
66139    // '-1530'  > ['-15', '30']
66140    var chunkOffset = /([\+\-]|\d\d)/gi;
66141
66142    function offsetFromString(matcher, string) {
66143        var matches = (string || '').match(matcher),
66144            chunk,
66145            parts,
66146            minutes;
66147
66148        if (matches === null) {
66149            return null;
66150        }
66151
66152        chunk = matches[matches.length - 1] || [];
66153        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
66154        minutes = +(parts[1] * 60) + toInt(parts[2]);
66155
66156        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
66157    }
66158
66159    // Return a moment from input, that is local/utc/zone equivalent to model.
66160    function cloneWithOffset(input, model) {
66161        var res, diff;
66162        if (model._isUTC) {
66163            res = model.clone();
66164            diff =
66165                (isMoment(input) || isDate(input)
66166                    ? input.valueOf()
66167                    : createLocal(input).valueOf()) - res.valueOf();
66168            // Use low-level api, because this fn is low-level api.
66169            res._d.setTime(res._d.valueOf() + diff);
66170            hooks.updateOffset(res, false);
66171            return res;
66172        } else {
66173            return createLocal(input).local();
66174        }
66175    }
66176
66177    function getDateOffset(m) {
66178        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
66179        // https://github.com/moment/moment/pull/1871
66180        return -Math.round(m._d.getTimezoneOffset());
66181    }
66182
66183    // HOOKS
66184
66185    // This function will be called whenever a moment is mutated.
66186    // It is intended to keep the offset in sync with the timezone.
66187    hooks.updateOffset = function () {};
66188
66189    // MOMENTS
66190
66191    // keepLocalTime = true means only change the timezone, without
66192    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
66193    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
66194    // +0200, so we adjust the time as needed, to be valid.
66195    //
66196    // Keeping the time actually adds/subtracts (one hour)
66197    // from the actual represented time. That is why we call updateOffset
66198    // a second time. In case it wants us to change the offset again
66199    // _changeInProgress == true case, then we have to adjust, because
66200    // there is no such time in the given timezone.
66201    function getSetOffset(input, keepLocalTime, keepMinutes) {
66202        var offset = this._offset || 0,
66203            localAdjust;
66204        if (!this.isValid()) {
66205            return input != null ? this : NaN;
66206        }
66207        if (input != null) {
66208            if (typeof input === 'string') {
66209                input = offsetFromString(matchShortOffset, input);
66210                if (input === null) {
66211                    return this;
66212                }
66213            } else if (Math.abs(input) < 16 && !keepMinutes) {
66214                input = input * 60;
66215            }
66216            if (!this._isUTC && keepLocalTime) {
66217                localAdjust = getDateOffset(this);
66218            }
66219            this._offset = input;
66220            this._isUTC = true;
66221            if (localAdjust != null) {
66222                this.add(localAdjust, 'm');
66223            }
66224            if (offset !== input) {
66225                if (!keepLocalTime || this._changeInProgress) {
66226                    addSubtract(
66227                        this,
66228                        createDuration(input - offset, 'm'),
66229                        1,
66230                        false
66231                    );
66232                } else if (!this._changeInProgress) {
66233                    this._changeInProgress = true;
66234                    hooks.updateOffset(this, true);
66235                    this._changeInProgress = null;
66236                }
66237            }
66238            return this;
66239        } else {
66240            return this._isUTC ? offset : getDateOffset(this);
66241        }
66242    }
66243
66244    function getSetZone(input, keepLocalTime) {
66245        if (input != null) {
66246            if (typeof input !== 'string') {
66247                input = -input;
66248            }
66249
66250            this.utcOffset(input, keepLocalTime);
66251
66252            return this;
66253        } else {
66254            return -this.utcOffset();
66255        }
66256    }
66257
66258    function setOffsetToUTC(keepLocalTime) {
66259        return this.utcOffset(0, keepLocalTime);
66260    }
66261
66262    function setOffsetToLocal(keepLocalTime) {
66263        if (this._isUTC) {
66264            this.utcOffset(0, keepLocalTime);
66265            this._isUTC = false;
66266
66267            if (keepLocalTime) {
66268                this.subtract(getDateOffset(this), 'm');
66269            }
66270        }
66271        return this;
66272    }
66273
66274    function setOffsetToParsedOffset() {
66275        if (this._tzm != null) {
66276            this.utcOffset(this._tzm, false, true);
66277        } else if (typeof this._i === 'string') {
66278            var tZone = offsetFromString(matchOffset, this._i);
66279            if (tZone != null) {
66280                this.utcOffset(tZone);
66281            } else {
66282                this.utcOffset(0, true);
66283            }
66284        }
66285        return this;
66286    }
66287
66288    function hasAlignedHourOffset(input) {
66289        if (!this.isValid()) {
66290            return false;
66291        }
66292        input = input ? createLocal(input).utcOffset() : 0;
66293
66294        return (this.utcOffset() - input) % 60 === 0;
66295    }
66296
66297    function isDaylightSavingTime() {
66298        return (
66299            this.utcOffset() > this.clone().month(0).utcOffset() ||
66300            this.utcOffset() > this.clone().month(5).utcOffset()
66301        );
66302    }
66303
66304    function isDaylightSavingTimeShifted() {
66305        if (!isUndefined(this._isDSTShifted)) {
66306            return this._isDSTShifted;
66307        }
66308
66309        var c = {},
66310            other;
66311
66312        copyConfig(c, this);
66313        c = prepareConfig(c);
66314
66315        if (c._a) {
66316            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
66317            this._isDSTShifted =
66318                this.isValid() && compareArrays(c._a, other.toArray()) > 0;
66319        } else {
66320            this._isDSTShifted = false;
66321        }
66322
66323        return this._isDSTShifted;
66324    }
66325
66326    function isLocal() {
66327        return this.isValid() ? !this._isUTC : false;
66328    }
66329
66330    function isUtcOffset() {
66331        return this.isValid() ? this._isUTC : false;
66332    }
66333
66334    function isUtc() {
66335        return this.isValid() ? this._isUTC && this._offset === 0 : false;
66336    }
66337
66338    // ASP.NET json date format regex
66339    var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
66340        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
66341        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
66342        // and further modified to allow for strings containing both week and day
66343        isoRegex =
66344            /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
66345
66346    function createDuration(input, key) {
66347        var duration = input,
66348            // matching against regexp is expensive, do it on demand
66349            match = null,
66350            sign,
66351            ret,
66352            diffRes;
66353
66354        if (isDuration(input)) {
66355            duration = {
66356                ms: input._milliseconds,
66357                d: input._days,
66358                M: input._months,
66359            };
66360        } else if (isNumber(input) || !isNaN(+input)) {
66361            duration = {};
66362            if (key) {
66363                duration[key] = +input;
66364            } else {
66365                duration.milliseconds = +input;
66366            }
66367        } else if ((match = aspNetRegex.exec(input))) {
66368            sign = match[1] === '-' ? -1 : 1;
66369            duration = {
66370                y: 0,
66371                d: toInt(match[DATE]) * sign,
66372                h: toInt(match[HOUR]) * sign,
66373                m: toInt(match[MINUTE]) * sign,
66374                s: toInt(match[SECOND]) * sign,
66375                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
66376            };
66377        } else if ((match = isoRegex.exec(input))) {
66378            sign = match[1] === '-' ? -1 : 1;
66379            duration = {
66380                y: parseIso(match[2], sign),
66381                M: parseIso(match[3], sign),
66382                w: parseIso(match[4], sign),
66383                d: parseIso(match[5], sign),
66384                h: parseIso(match[6], sign),
66385                m: parseIso(match[7], sign),
66386                s: parseIso(match[8], sign),
66387            };
66388        } else if (duration == null) {
66389            // checks for null or undefined
66390            duration = {};
66391        } else if (
66392            typeof duration === 'object' &&
66393            ('from' in duration || 'to' in duration)
66394        ) {
66395            diffRes = momentsDifference(
66396                createLocal(duration.from),
66397                createLocal(duration.to)
66398            );
66399
66400            duration = {};
66401            duration.ms = diffRes.milliseconds;
66402            duration.M = diffRes.months;
66403        }
66404
66405        ret = new Duration(duration);
66406
66407        if (isDuration(input) && hasOwnProp(input, '_locale')) {
66408            ret._locale = input._locale;
66409        }
66410
66411        if (isDuration(input) && hasOwnProp(input, '_isValid')) {
66412            ret._isValid = input._isValid;
66413        }
66414
66415        return ret;
66416    }
66417
66418    createDuration.fn = Duration.prototype;
66419    createDuration.invalid = createInvalid$1;
66420
66421    function parseIso(inp, sign) {
66422        // We'd normally use ~~inp for this, but unfortunately it also
66423        // converts floats to ints.
66424        // inp may be undefined, so careful calling replace on it.
66425        var res = inp && parseFloat(inp.replace(',', '.'));
66426        // apply sign while we're at it
66427        return (isNaN(res) ? 0 : res) * sign;
66428    }
66429
66430    function positiveMomentsDifference(base, other) {
66431        var res = {};
66432
66433        res.months =
66434            other.month() - base.month() + (other.year() - base.year()) * 12;
66435        if (base.clone().add(res.months, 'M').isAfter(other)) {
66436            --res.months;
66437        }
66438
66439        res.milliseconds = +other - +base.clone().add(res.months, 'M');
66440
66441        return res;
66442    }
66443
66444    function momentsDifference(base, other) {
66445        var res;
66446        if (!(base.isValid() && other.isValid())) {
66447            return { milliseconds: 0, months: 0 };
66448        }
66449
66450        other = cloneWithOffset(other, base);
66451        if (base.isBefore(other)) {
66452            res = positiveMomentsDifference(base, other);
66453        } else {
66454            res = positiveMomentsDifference(other, base);
66455            res.milliseconds = -res.milliseconds;
66456            res.months = -res.months;
66457        }
66458
66459        return res;
66460    }
66461
66462    // TODO: remove 'name' arg after deprecation is removed
66463    function createAdder(direction, name) {
66464        return function (val, period) {
66465            var dur, tmp;
66466            //invert the arguments, but complain about it
66467            if (period !== null && !isNaN(+period)) {
66468                deprecateSimple(
66469                    name,
66470                    'moment().' +
66471                        name +
66472                        '(period, number) is deprecated. Please use moment().' +
66473                        name +
66474                        '(number, period). ' +
66475                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
66476                );
66477                tmp = val;
66478                val = period;
66479                period = tmp;
66480            }
66481
66482            dur = createDuration(val, period);
66483            addSubtract(this, dur, direction);
66484            return this;
66485        };
66486    }
66487
66488    function addSubtract(mom, duration, isAdding, updateOffset) {
66489        var milliseconds = duration._milliseconds,
66490            days = absRound(duration._days),
66491            months = absRound(duration._months);
66492
66493        if (!mom.isValid()) {
66494            // No op
66495            return;
66496        }
66497
66498        updateOffset = updateOffset == null ? true : updateOffset;
66499
66500        if (months) {
66501            setMonth(mom, get(mom, 'Month') + months * isAdding);
66502        }
66503        if (days) {
66504            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
66505        }
66506        if (milliseconds) {
66507            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
66508        }
66509        if (updateOffset) {
66510            hooks.updateOffset(mom, days || months);
66511        }
66512    }
66513
66514    var add = createAdder(1, 'add'),
66515        subtract = createAdder(-1, 'subtract');
66516
66517    function isString(input) {
66518        return typeof input === 'string' || input instanceof String;
66519    }
66520
66521    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
66522    function isMomentInput(input) {
66523        return (
66524            isMoment(input) ||
66525            isDate(input) ||
66526            isString(input) ||
66527            isNumber(input) ||
66528            isNumberOrStringArray(input) ||
66529            isMomentInputObject(input) ||
66530            input === null ||
66531            input === undefined
66532        );
66533    }
66534
66535    function isMomentInputObject(input) {
66536        var objectTest = isObject(input) && !isObjectEmpty(input),
66537            propertyTest = false,
66538            properties = [
66539                'years',
66540                'year',
66541                'y',
66542                'months',
66543                'month',
66544                'M',
66545                'days',
66546                'day',
66547                'd',
66548                'dates',
66549                'date',
66550                'D',
66551                'hours',
66552                'hour',
66553                'h',
66554                'minutes',
66555                'minute',
66556                'm',
66557                'seconds',
66558                'second',
66559                's',
66560                'milliseconds',
66561                'millisecond',
66562                'ms',
66563            ],
66564            i,
66565            property,
66566            propertyLen = properties.length;
66567
66568        for (i = 0; i < propertyLen; i += 1) {
66569            property = properties[i];
66570            propertyTest = propertyTest || hasOwnProp(input, property);
66571        }
66572
66573        return objectTest && propertyTest;
66574    }
66575
66576    function isNumberOrStringArray(input) {
66577        var arrayTest = isArray(input),
66578            dataTypeTest = false;
66579        if (arrayTest) {
66580            dataTypeTest =
66581                input.filter(function (item) {
66582                    return !isNumber(item) && isString(input);
66583                }).length === 0;
66584        }
66585        return arrayTest && dataTypeTest;
66586    }
66587
66588    function isCalendarSpec(input) {
66589        var objectTest = isObject(input) && !isObjectEmpty(input),
66590            propertyTest = false,
66591            properties = [
66592                'sameDay',
66593                'nextDay',
66594                'lastDay',
66595                'nextWeek',
66596                'lastWeek',
66597                'sameElse',
66598            ],
66599            i,
66600            property;
66601
66602        for (i = 0; i < properties.length; i += 1) {
66603            property = properties[i];
66604            propertyTest = propertyTest || hasOwnProp(input, property);
66605        }
66606
66607        return objectTest && propertyTest;
66608    }
66609
66610    function getCalendarFormat(myMoment, now) {
66611        var diff = myMoment.diff(now, 'days', true);
66612        return diff < -6
66613            ? 'sameElse'
66614            : diff < -1
66615            ? 'lastWeek'
66616            : diff < 0
66617            ? 'lastDay'
66618            : diff < 1
66619            ? 'sameDay'
66620            : diff < 2
66621            ? 'nextDay'
66622            : diff < 7
66623            ? 'nextWeek'
66624            : 'sameElse';
66625    }
66626
66627    function calendar$1(time, formats) {
66628        // Support for single parameter, formats only overload to the calendar function
66629        if (arguments.length === 1) {
66630            if (!arguments[0]) {
66631                time = undefined;
66632                formats = undefined;
66633            } else if (isMomentInput(arguments[0])) {
66634                time = arguments[0];
66635                formats = undefined;
66636            } else if (isCalendarSpec(arguments[0])) {
66637                formats = arguments[0];
66638                time = undefined;
66639            }
66640        }
66641        // We want to compare the start of today, vs this.
66642        // Getting start-of-today depends on whether we're local/utc/offset or not.
66643        var now = time || createLocal(),
66644            sod = cloneWithOffset(now, this).startOf('day'),
66645            format = hooks.calendarFormat(this, sod) || 'sameElse',
66646            output =
66647                formats &&
66648                (isFunction(formats[format])
66649                    ? formats[format].call(this, now)
66650                    : formats[format]);
66651
66652        return this.format(
66653            output || this.localeData().calendar(format, this, createLocal(now))
66654        );
66655    }
66656
66657    function clone() {
66658        return new Moment(this);
66659    }
66660
66661    function isAfter(input, units) {
66662        var localInput = isMoment(input) ? input : createLocal(input);
66663        if (!(this.isValid() && localInput.isValid())) {
66664            return false;
66665        }
66666        units = normalizeUnits(units) || 'millisecond';
66667        if (units === 'millisecond') {
66668            return this.valueOf() > localInput.valueOf();
66669        } else {
66670            return localInput.valueOf() < this.clone().startOf(units).valueOf();
66671        }
66672    }
66673
66674    function isBefore(input, units) {
66675        var localInput = isMoment(input) ? input : createLocal(input);
66676        if (!(this.isValid() && localInput.isValid())) {
66677            return false;
66678        }
66679        units = normalizeUnits(units) || 'millisecond';
66680        if (units === 'millisecond') {
66681            return this.valueOf() < localInput.valueOf();
66682        } else {
66683            return this.clone().endOf(units).valueOf() < localInput.valueOf();
66684        }
66685    }
66686
66687    function isBetween(from, to, units, inclusivity) {
66688        var localFrom = isMoment(from) ? from : createLocal(from),
66689            localTo = isMoment(to) ? to : createLocal(to);
66690        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
66691            return false;
66692        }
66693        inclusivity = inclusivity || '()';
66694        return (
66695            (inclusivity[0] === '('
66696                ? this.isAfter(localFrom, units)
66697                : !this.isBefore(localFrom, units)) &&
66698            (inclusivity[1] === ')'
66699                ? this.isBefore(localTo, units)
66700                : !this.isAfter(localTo, units))
66701        );
66702    }
66703
66704    function isSame(input, units) {
66705        var localInput = isMoment(input) ? input : createLocal(input),
66706            inputMs;
66707        if (!(this.isValid() && localInput.isValid())) {
66708            return false;
66709        }
66710        units = normalizeUnits(units) || 'millisecond';
66711        if (units === 'millisecond') {
66712            return this.valueOf() === localInput.valueOf();
66713        } else {
66714            inputMs = localInput.valueOf();
66715            return (
66716                this.clone().startOf(units).valueOf() <= inputMs &&
66717                inputMs <= this.clone().endOf(units).valueOf()
66718            );
66719        }
66720    }
66721
66722    function isSameOrAfter(input, units) {
66723        return this.isSame(input, units) || this.isAfter(input, units);
66724    }
66725
66726    function isSameOrBefore(input, units) {
66727        return this.isSame(input, units) || this.isBefore(input, units);
66728    }
66729
66730    function diff(input, units, asFloat) {
66731        var that, zoneDelta, output;
66732
66733        if (!this.isValid()) {
66734            return NaN;
66735        }
66736
66737        that = cloneWithOffset(input, this);
66738
66739        if (!that.isValid()) {
66740            return NaN;
66741        }
66742
66743        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
66744
66745        units = normalizeUnits(units);
66746
66747        switch (units) {
66748            case 'year':
66749                output = monthDiff(this, that) / 12;
66750                break;
66751            case 'month':
66752                output = monthDiff(this, that);
66753                break;
66754            case 'quarter':
66755                output = monthDiff(this, that) / 3;
66756                break;
66757            case 'second':
66758                output = (this - that) / 1e3;
66759                break; // 1000
66760            case 'minute':
66761                output = (this - that) / 6e4;
66762                break; // 1000 * 60
66763            case 'hour':
66764                output = (this - that) / 36e5;
66765                break; // 1000 * 60 * 60
66766            case 'day':
66767                output = (this - that - zoneDelta) / 864e5;
66768                break; // 1000 * 60 * 60 * 24, negate dst
66769            case 'week':
66770                output = (this - that - zoneDelta) / 6048e5;
66771                break; // 1000 * 60 * 60 * 24 * 7, negate dst
66772            default:
66773                output = this - that;
66774        }
66775
66776        return asFloat ? output : absFloor(output);
66777    }
66778
66779    function monthDiff(a, b) {
66780        if (a.date() < b.date()) {
66781            // end-of-month calculations work correct when the start month has more
66782            // days than the end month.
66783            return -monthDiff(b, a);
66784        }
66785        // difference in months
66786        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
66787            // b is in (anchor - 1 month, anchor + 1 month)
66788            anchor = a.clone().add(wholeMonthDiff, 'months'),
66789            anchor2,
66790            adjust;
66791
66792        if (b - anchor < 0) {
66793            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
66794            // linear across the month
66795            adjust = (b - anchor) / (anchor - anchor2);
66796        } else {
66797            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
66798            // linear across the month
66799            adjust = (b - anchor) / (anchor2 - anchor);
66800        }
66801
66802        //check for negative zero, return zero if negative zero
66803        return -(wholeMonthDiff + adjust) || 0;
66804    }
66805
66806    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
66807    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
66808
66809    function toString() {
66810        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
66811    }
66812
66813    function toISOString(keepOffset) {
66814        if (!this.isValid()) {
66815            return null;
66816        }
66817        var utc = keepOffset !== true,
66818            m = utc ? this.clone().utc() : this;
66819        if (m.year() < 0 || m.year() > 9999) {
66820            return formatMoment(
66821                m,
66822                utc
66823                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
66824                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
66825            );
66826        }
66827        if (isFunction(Date.prototype.toISOString)) {
66828            // native implementation is ~50x faster, use it when we can
66829            if (utc) {
66830                return this.toDate().toISOString();
66831            } else {
66832                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
66833                    .toISOString()
66834                    .replace('Z', formatMoment(m, 'Z'));
66835            }
66836        }
66837        return formatMoment(
66838            m,
66839            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
66840        );
66841    }
66842
66843    /**
66844     * Return a human readable representation of a moment that can
66845     * also be evaluated to get a new moment which is the same
66846     *
66847     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
66848     */
66849    function inspect() {
66850        if (!this.isValid()) {
66851            return 'moment.invalid(/* ' + this._i + ' */)';
66852        }
66853        var func = 'moment',
66854            zone = '',
66855            prefix,
66856            year,
66857            datetime,
66858            suffix;
66859        if (!this.isLocal()) {
66860            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
66861            zone = 'Z';
66862        }
66863        prefix = '[' + func + '("]';
66864        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
66865        datetime = '-MM-DD[T]HH:mm:ss.SSS';
66866        suffix = zone + '[")]';
66867
66868        return this.format(prefix + year + datetime + suffix);
66869    }
66870
66871    function format(inputString) {
66872        if (!inputString) {
66873            inputString = this.isUtc()
66874                ? hooks.defaultFormatUtc
66875                : hooks.defaultFormat;
66876        }
66877        var output = formatMoment(this, inputString);
66878        return this.localeData().postformat(output);
66879    }
66880
66881    function from(time, withoutSuffix) {
66882        if (
66883            this.isValid() &&
66884            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
66885        ) {
66886            return createDuration({ to: this, from: time })
66887                .locale(this.locale())
66888                .humanize(!withoutSuffix);
66889        } else {
66890            return this.localeData().invalidDate();
66891        }
66892    }
66893
66894    function fromNow(withoutSuffix) {
66895        return this.from(createLocal(), withoutSuffix);
66896    }
66897
66898    function to(time, withoutSuffix) {
66899        if (
66900            this.isValid() &&
66901            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
66902        ) {
66903            return createDuration({ from: this, to: time })
66904                .locale(this.locale())
66905                .humanize(!withoutSuffix);
66906        } else {
66907            return this.localeData().invalidDate();
66908        }
66909    }
66910
66911    function toNow(withoutSuffix) {
66912        return this.to(createLocal(), withoutSuffix);
66913    }
66914
66915    // If passed a locale key, it will set the locale for this
66916    // instance.  Otherwise, it will return the locale configuration
66917    // variables for this instance.
66918    function locale(key) {
66919        var newLocaleData;
66920
66921        if (key === undefined) {
66922            return this._locale._abbr;
66923        } else {
66924            newLocaleData = getLocale(key);
66925            if (newLocaleData != null) {
66926                this._locale = newLocaleData;
66927            }
66928            return this;
66929        }
66930    }
66931
66932    var lang = deprecate(
66933        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
66934        function (key) {
66935            if (key === undefined) {
66936                return this.localeData();
66937            } else {
66938                return this.locale(key);
66939            }
66940        }
66941    );
66942
66943    function localeData() {
66944        return this._locale;
66945    }
66946
66947    var MS_PER_SECOND = 1000,
66948        MS_PER_MINUTE = 60 * MS_PER_SECOND,
66949        MS_PER_HOUR = 60 * MS_PER_MINUTE,
66950        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
66951
66952    // actual modulo - handles negative numbers (for dates before 1970):
66953    function mod$1(dividend, divisor) {
66954        return ((dividend % divisor) + divisor) % divisor;
66955    }
66956
66957    function localStartOfDate(y, m, d) {
66958        // the date constructor remaps years 0-99 to 1900-1999
66959        if (y < 100 && y >= 0) {
66960            // preserve leap years using a full 400 year cycle, then reset
66961            return new Date(y + 400, m, d) - MS_PER_400_YEARS;
66962        } else {
66963            return new Date(y, m, d).valueOf();
66964        }
66965    }
66966
66967    function utcStartOfDate(y, m, d) {
66968        // Date.UTC remaps years 0-99 to 1900-1999
66969        if (y < 100 && y >= 0) {
66970            // preserve leap years using a full 400 year cycle, then reset
66971            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
66972        } else {
66973            return Date.UTC(y, m, d);
66974        }
66975    }
66976
66977    function startOf(units) {
66978        var time, startOfDate;
66979        units = normalizeUnits(units);
66980        if (units === undefined || units === 'millisecond' || !this.isValid()) {
66981            return this;
66982        }
66983
66984        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
66985
66986        switch (units) {
66987            case 'year':
66988                time = startOfDate(this.year(), 0, 1);
66989                break;
66990            case 'quarter':
66991                time = startOfDate(
66992                    this.year(),
66993                    this.month() - (this.month() % 3),
66994                    1
66995                );
66996                break;
66997            case 'month':
66998                time = startOfDate(this.year(), this.month(), 1);
66999                break;
67000            case 'week':
67001                time = startOfDate(
67002                    this.year(),
67003                    this.month(),
67004                    this.date() - this.weekday()
67005                );
67006                break;
67007            case 'isoWeek':
67008                time = startOfDate(
67009                    this.year(),
67010                    this.month(),
67011                    this.date() - (this.isoWeekday() - 1)
67012                );
67013                break;
67014            case 'day':
67015            case 'date':
67016                time = startOfDate(this.year(), this.month(), this.date());
67017                break;
67018            case 'hour':
67019                time = this._d.valueOf();
67020                time -= mod$1(
67021                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
67022                    MS_PER_HOUR
67023                );
67024                break;
67025            case 'minute':
67026                time = this._d.valueOf();
67027                time -= mod$1(time, MS_PER_MINUTE);
67028                break;
67029            case 'second':
67030                time = this._d.valueOf();
67031                time -= mod$1(time, MS_PER_SECOND);
67032                break;
67033        }
67034
67035        this._d.setTime(time);
67036        hooks.updateOffset(this, true);
67037        return this;
67038    }
67039
67040    function endOf(units) {
67041        var time, startOfDate;
67042        units = normalizeUnits(units);
67043        if (units === undefined || units === 'millisecond' || !this.isValid()) {
67044            return this;
67045        }
67046
67047        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
67048
67049        switch (units) {
67050            case 'year':
67051                time = startOfDate(this.year() + 1, 0, 1) - 1;
67052                break;
67053            case 'quarter':
67054                time =
67055                    startOfDate(
67056                        this.year(),
67057                        this.month() - (this.month() % 3) + 3,
67058                        1
67059                    ) - 1;
67060                break;
67061            case 'month':
67062                time = startOfDate(this.year(), this.month() + 1, 1) - 1;
67063                break;
67064            case 'week':
67065                time =
67066                    startOfDate(
67067                        this.year(),
67068                        this.month(),
67069                        this.date() - this.weekday() + 7
67070                    ) - 1;
67071                break;
67072            case 'isoWeek':
67073                time =
67074                    startOfDate(
67075                        this.year(),
67076                        this.month(),
67077                        this.date() - (this.isoWeekday() - 1) + 7
67078                    ) - 1;
67079                break;
67080            case 'day':
67081            case 'date':
67082                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
67083                break;
67084            case 'hour':
67085                time = this._d.valueOf();
67086                time +=
67087                    MS_PER_HOUR -
67088                    mod$1(
67089                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
67090                        MS_PER_HOUR
67091                    ) -
67092                    1;
67093                break;
67094            case 'minute':
67095                time = this._d.valueOf();
67096                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
67097                break;
67098            case 'second':
67099                time = this._d.valueOf();
67100                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
67101                break;
67102        }
67103
67104        this._d.setTime(time);
67105        hooks.updateOffset(this, true);
67106        return this;
67107    }
67108
67109    function valueOf() {
67110        return this._d.valueOf() - (this._offset || 0) * 60000;
67111    }
67112
67113    function unix() {
67114        return Math.floor(this.valueOf() / 1000);
67115    }
67116
67117    function toDate() {
67118        return new Date(this.valueOf());
67119    }
67120
67121    function toArray() {
67122        var m = this;
67123        return [
67124            m.year(),
67125            m.month(),
67126            m.date(),
67127            m.hour(),
67128            m.minute(),
67129            m.second(),
67130            m.millisecond(),
67131        ];
67132    }
67133
67134    function toObject() {
67135        var m = this;
67136        return {
67137            years: m.year(),
67138            months: m.month(),
67139            date: m.date(),
67140            hours: m.hours(),
67141            minutes: m.minutes(),
67142            seconds: m.seconds(),
67143            milliseconds: m.milliseconds(),
67144        };
67145    }
67146
67147    function toJSON() {
67148        // new Date(NaN).toJSON() === null
67149        return this.isValid() ? this.toISOString() : null;
67150    }
67151
67152    function isValid$2() {
67153        return isValid(this);
67154    }
67155
67156    function parsingFlags() {
67157        return extend({}, getParsingFlags(this));
67158    }
67159
67160    function invalidAt() {
67161        return getParsingFlags(this).overflow;
67162    }
67163
67164    function creationData() {
67165        return {
67166            input: this._i,
67167            format: this._f,
67168            locale: this._locale,
67169            isUTC: this._isUTC,
67170            strict: this._strict,
67171        };
67172    }
67173
67174    addFormatToken('N', 0, 0, 'eraAbbr');
67175    addFormatToken('NN', 0, 0, 'eraAbbr');
67176    addFormatToken('NNN', 0, 0, 'eraAbbr');
67177    addFormatToken('NNNN', 0, 0, 'eraName');
67178    addFormatToken('NNNNN', 0, 0, 'eraNarrow');
67179
67180    addFormatToken('y', ['y', 1], 'yo', 'eraYear');
67181    addFormatToken('y', ['yy', 2], 0, 'eraYear');
67182    addFormatToken('y', ['yyy', 3], 0, 'eraYear');
67183    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');
67184
67185    addRegexToken('N', matchEraAbbr);
67186    addRegexToken('NN', matchEraAbbr);
67187    addRegexToken('NNN', matchEraAbbr);
67188    addRegexToken('NNNN', matchEraName);
67189    addRegexToken('NNNNN', matchEraNarrow);
67190
67191    addParseToken(
67192        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
67193        function (input, array, config, token) {
67194            var era = config._locale.erasParse(input, token, config._strict);
67195            if (era) {
67196                getParsingFlags(config).era = era;
67197            } else {
67198                getParsingFlags(config).invalidEra = input;
67199            }
67200        }
67201    );
67202
67203    addRegexToken('y', matchUnsigned);
67204    addRegexToken('yy', matchUnsigned);
67205    addRegexToken('yyy', matchUnsigned);
67206    addRegexToken('yyyy', matchUnsigned);
67207    addRegexToken('yo', matchEraYearOrdinal);
67208
67209    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
67210    addParseToken(['yo'], function (input, array, config, token) {
67211        var match;
67212        if (config._locale._eraYearOrdinalRegex) {
67213            match = input.match(config._locale._eraYearOrdinalRegex);
67214        }
67215
67216        if (config._locale.eraYearOrdinalParse) {
67217            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
67218        } else {
67219            array[YEAR] = parseInt(input, 10);
67220        }
67221    });
67222
67223    function localeEras(m, format) {
67224        var i,
67225            l,
67226            date,
67227            eras = this._eras || getLocale('en')._eras;
67228        for (i = 0, l = eras.length; i < l; ++i) {
67229            switch (typeof eras[i].since) {
67230                case 'string':
67231                    // truncate time
67232                    date = hooks(eras[i].since).startOf('day');
67233                    eras[i].since = date.valueOf();
67234                    break;
67235            }
67236
67237            switch (typeof eras[i].until) {
67238                case 'undefined':
67239                    eras[i].until = +Infinity;
67240                    break;
67241                case 'string':
67242                    // truncate time
67243                    date = hooks(eras[i].until).startOf('day').valueOf();
67244                    eras[i].until = date.valueOf();
67245                    break;
67246            }
67247        }
67248        return eras;
67249    }
67250
67251    function localeErasParse(eraName, format, strict) {
67252        var i,
67253            l,
67254            eras = this.eras(),
67255            name,
67256            abbr,
67257            narrow;
67258        eraName = eraName.toUpperCase();
67259
67260        for (i = 0, l = eras.length; i < l; ++i) {
67261            name = eras[i].name.toUpperCase();
67262            abbr = eras[i].abbr.toUpperCase();
67263            narrow = eras[i].narrow.toUpperCase();
67264
67265            if (strict) {
67266                switch (format) {
67267                    case 'N':
67268                    case 'NN':
67269                    case 'NNN':
67270                        if (abbr === eraName) {
67271                            return eras[i];
67272                        }
67273                        break;
67274
67275                    case 'NNNN':
67276                        if (name === eraName) {
67277                            return eras[i];
67278                        }
67279                        break;
67280
67281                    case 'NNNNN':
67282                        if (narrow === eraName) {
67283                            return eras[i];
67284                        }
67285                        break;
67286                }
67287            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
67288                return eras[i];
67289            }
67290        }
67291    }
67292
67293    function localeErasConvertYear(era, year) {
67294        var dir = era.since <= era.until ? +1 : -1;
67295        if (year === undefined) {
67296            return hooks(era.since).year();
67297        } else {
67298            return hooks(era.since).year() + (year - era.offset) * dir;
67299        }
67300    }
67301
67302    function getEraName() {
67303        var i,
67304            l,
67305            val,
67306            eras = this.localeData().eras();
67307        for (i = 0, l = eras.length; i < l; ++i) {
67308            // truncate time
67309            val = this.clone().startOf('day').valueOf();
67310
67311            if (eras[i].since <= val && val <= eras[i].until) {
67312                return eras[i].name;
67313            }
67314            if (eras[i].until <= val && val <= eras[i].since) {
67315                return eras[i].name;
67316            }
67317        }
67318
67319        return '';
67320    }
67321
67322    function getEraNarrow() {
67323        var i,
67324            l,
67325            val,
67326            eras = this.localeData().eras();
67327        for (i = 0, l = eras.length; i < l; ++i) {
67328            // truncate time
67329            val = this.clone().startOf('day').valueOf();
67330
67331            if (eras[i].since <= val && val <= eras[i].until) {
67332                return eras[i].narrow;
67333            }
67334            if (eras[i].until <= val && val <= eras[i].since) {
67335                return eras[i].narrow;
67336            }
67337        }
67338
67339        return '';
67340    }
67341
67342    function getEraAbbr() {
67343        var i,
67344            l,
67345            val,
67346            eras = this.localeData().eras();
67347        for (i = 0, l = eras.length; i < l; ++i) {
67348            // truncate time
67349            val = this.clone().startOf('day').valueOf();
67350
67351            if (eras[i].since <= val && val <= eras[i].until) {
67352                return eras[i].abbr;
67353            }
67354            if (eras[i].until <= val && val <= eras[i].since) {
67355                return eras[i].abbr;
67356            }
67357        }
67358
67359        return '';
67360    }
67361
67362    function getEraYear() {
67363        var i,
67364            l,
67365            dir,
67366            val,
67367            eras = this.localeData().eras();
67368        for (i = 0, l = eras.length; i < l; ++i) {
67369            dir = eras[i].since <= eras[i].until ? +1 : -1;
67370
67371            // truncate time
67372            val = this.clone().startOf('day').valueOf();
67373
67374            if (
67375                (eras[i].since <= val && val <= eras[i].until) ||
67376                (eras[i].until <= val && val <= eras[i].since)
67377            ) {
67378                return (
67379                    (this.year() - hooks(eras[i].since).year()) * dir +
67380                    eras[i].offset
67381                );
67382            }
67383        }
67384
67385        return this.year();
67386    }
67387
67388    function erasNameRegex(isStrict) {
67389        if (!hasOwnProp(this, '_erasNameRegex')) {
67390            computeErasParse.call(this);
67391        }
67392        return isStrict ? this._erasNameRegex : this._erasRegex;
67393    }
67394
67395    function erasAbbrRegex(isStrict) {
67396        if (!hasOwnProp(this, '_erasAbbrRegex')) {
67397            computeErasParse.call(this);
67398        }
67399        return isStrict ? this._erasAbbrRegex : this._erasRegex;
67400    }
67401
67402    function erasNarrowRegex(isStrict) {
67403        if (!hasOwnProp(this, '_erasNarrowRegex')) {
67404            computeErasParse.call(this);
67405        }
67406        return isStrict ? this._erasNarrowRegex : this._erasRegex;
67407    }
67408
67409    function matchEraAbbr(isStrict, locale) {
67410        return locale.erasAbbrRegex(isStrict);
67411    }
67412
67413    function matchEraName(isStrict, locale) {
67414        return locale.erasNameRegex(isStrict);
67415    }
67416
67417    function matchEraNarrow(isStrict, locale) {
67418        return locale.erasNarrowRegex(isStrict);
67419    }
67420
67421    function matchEraYearOrdinal(isStrict, locale) {
67422        return locale._eraYearOrdinalRegex || matchUnsigned;
67423    }
67424
67425    function computeErasParse() {
67426        var abbrPieces = [],
67427            namePieces = [],
67428            narrowPieces = [],
67429            mixedPieces = [],
67430            i,
67431            l,
67432            eras = this.eras();
67433
67434        for (i = 0, l = eras.length; i < l; ++i) {
67435            namePieces.push(regexEscape(eras[i].name));
67436            abbrPieces.push(regexEscape(eras[i].abbr));
67437            narrowPieces.push(regexEscape(eras[i].narrow));
67438
67439            mixedPieces.push(regexEscape(eras[i].name));
67440            mixedPieces.push(regexEscape(eras[i].abbr));
67441            mixedPieces.push(regexEscape(eras[i].narrow));
67442        }
67443
67444        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
67445        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
67446        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
67447        this._erasNarrowRegex = new RegExp(
67448            '^(' + narrowPieces.join('|') + ')',
67449            'i'
67450        );
67451    }
67452
67453    // FORMATTING
67454
67455    addFormatToken(0, ['gg', 2], 0, function () {
67456        return this.weekYear() % 100;
67457    });
67458
67459    addFormatToken(0, ['GG', 2], 0, function () {
67460        return this.isoWeekYear() % 100;
67461    });
67462
67463    function addWeekYearFormatToken(token, getter) {
67464        addFormatToken(0, [token, token.length], 0, getter);
67465    }
67466
67467    addWeekYearFormatToken('gggg', 'weekYear');
67468    addWeekYearFormatToken('ggggg', 'weekYear');
67469    addWeekYearFormatToken('GGGG', 'isoWeekYear');
67470    addWeekYearFormatToken('GGGGG', 'isoWeekYear');
67471
67472    // ALIASES
67473
67474    addUnitAlias('weekYear', 'gg');
67475    addUnitAlias('isoWeekYear', 'GG');
67476
67477    // PRIORITY
67478
67479    addUnitPriority('weekYear', 1);
67480    addUnitPriority('isoWeekYear', 1);
67481
67482    // PARSING
67483
67484    addRegexToken('G', matchSigned);
67485    addRegexToken('g', matchSigned);
67486    addRegexToken('GG', match1to2, match2);
67487    addRegexToken('gg', match1to2, match2);
67488    addRegexToken('GGGG', match1to4, match4);
67489    addRegexToken('gggg', match1to4, match4);
67490    addRegexToken('GGGGG', match1to6, match6);
67491    addRegexToken('ggggg', match1to6, match6);
67492
67493    addWeekParseToken(
67494        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
67495        function (input, week, config, token) {
67496            week[token.substr(0, 2)] = toInt(input);
67497        }
67498    );
67499
67500    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
67501        week[token] = hooks.parseTwoDigitYear(input);
67502    });
67503
67504    // MOMENTS
67505
67506    function getSetWeekYear(input) {
67507        return getSetWeekYearHelper.call(
67508            this,
67509            input,
67510            this.week(),
67511            this.weekday(),
67512            this.localeData()._week.dow,
67513            this.localeData()._week.doy
67514        );
67515    }
67516
67517    function getSetISOWeekYear(input) {
67518        return getSetWeekYearHelper.call(
67519            this,
67520            input,
67521            this.isoWeek(),
67522            this.isoWeekday(),
67523            1,
67524            4
67525        );
67526    }
67527
67528    function getISOWeeksInYear() {
67529        return weeksInYear(this.year(), 1, 4);
67530    }
67531
67532    function getISOWeeksInISOWeekYear() {
67533        return weeksInYear(this.isoWeekYear(), 1, 4);
67534    }
67535
67536    function getWeeksInYear() {
67537        var weekInfo = this.localeData()._week;
67538        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
67539    }
67540
67541    function getWeeksInWeekYear() {
67542        var weekInfo = this.localeData()._week;
67543        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
67544    }
67545
67546    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
67547        var weeksTarget;
67548        if (input == null) {
67549            return weekOfYear(this, dow, doy).year;
67550        } else {
67551            weeksTarget = weeksInYear(input, dow, doy);
67552            if (week > weeksTarget) {
67553                week = weeksTarget;
67554            }
67555            return setWeekAll.call(this, input, week, weekday, dow, doy);
67556        }
67557    }
67558
67559    function setWeekAll(weekYear, week, weekday, dow, doy) {
67560        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
67561            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
67562
67563        this.year(date.getUTCFullYear());
67564        this.month(date.getUTCMonth());
67565        this.date(date.getUTCDate());
67566        return this;
67567    }
67568
67569    // FORMATTING
67570
67571    addFormatToken('Q', 0, 'Qo', 'quarter');
67572
67573    // ALIASES
67574
67575    addUnitAlias('quarter', 'Q');
67576
67577    // PRIORITY
67578
67579    addUnitPriority('quarter', 7);
67580
67581    // PARSING
67582
67583    addRegexToken('Q', match1);
67584    addParseToken('Q', function (input, array) {
67585        array[MONTH] = (toInt(input) - 1) * 3;
67586    });
67587
67588    // MOMENTS
67589
67590    function getSetQuarter(input) {
67591        return input == null
67592            ? Math.ceil((this.month() + 1) / 3)
67593            : this.month((input - 1) * 3 + (this.month() % 3));
67594    }
67595
67596    // FORMATTING
67597
67598    addFormatToken('D', ['DD', 2], 'Do', 'date');
67599
67600    // ALIASES
67601
67602    addUnitAlias('date', 'D');
67603
67604    // PRIORITY
67605    addUnitPriority('date', 9);
67606
67607    // PARSING
67608
67609    addRegexToken('D', match1to2);
67610    addRegexToken('DD', match1to2, match2);
67611    addRegexToken('Do', function (isStrict, locale) {
67612        // TODO: Remove "ordinalParse" fallback in next major release.
67613        return isStrict
67614            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
67615            : locale._dayOfMonthOrdinalParseLenient;
67616    });
67617
67618    addParseToken(['D', 'DD'], DATE);
67619    addParseToken('Do', function (input, array) {
67620        array[DATE] = toInt(input.match(match1to2)[0]);
67621    });
67622
67623    // MOMENTS
67624
67625    var getSetDayOfMonth = makeGetSet('Date', true);
67626
67627    // FORMATTING
67628
67629    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
67630
67631    // ALIASES
67632
67633    addUnitAlias('dayOfYear', 'DDD');
67634
67635    // PRIORITY
67636    addUnitPriority('dayOfYear', 4);
67637
67638    // PARSING
67639
67640    addRegexToken('DDD', match1to3);
67641    addRegexToken('DDDD', match3);
67642    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
67643        config._dayOfYear = toInt(input);
67644    });
67645
67646    // HELPERS
67647
67648    // MOMENTS
67649
67650    function getSetDayOfYear(input) {
67651        var dayOfYear =
67652            Math.round(
67653                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
67654            ) + 1;
67655        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
67656    }
67657
67658    // FORMATTING
67659
67660    addFormatToken('m', ['mm', 2], 0, 'minute');
67661
67662    // ALIASES
67663
67664    addUnitAlias('minute', 'm');
67665
67666    // PRIORITY
67667
67668    addUnitPriority('minute', 14);
67669
67670    // PARSING
67671
67672    addRegexToken('m', match1to2);
67673    addRegexToken('mm', match1to2, match2);
67674    addParseToken(['m', 'mm'], MINUTE);
67675
67676    // MOMENTS
67677
67678    var getSetMinute = makeGetSet('Minutes', false);
67679
67680    // FORMATTING
67681
67682    addFormatToken('s', ['ss', 2], 0, 'second');
67683
67684    // ALIASES
67685
67686    addUnitAlias('second', 's');
67687
67688    // PRIORITY
67689
67690    addUnitPriority('second', 15);
67691
67692    // PARSING
67693
67694    addRegexToken('s', match1to2);
67695    addRegexToken('ss', match1to2, match2);
67696    addParseToken(['s', 'ss'], SECOND);
67697
67698    // MOMENTS
67699
67700    var getSetSecond = makeGetSet('Seconds', false);
67701
67702    // FORMATTING
67703
67704    addFormatToken('S', 0, 0, function () {
67705        return ~~(this.millisecond() / 100);
67706    });
67707
67708    addFormatToken(0, ['SS', 2], 0, function () {
67709        return ~~(this.millisecond() / 10);
67710    });
67711
67712    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
67713    addFormatToken(0, ['SSSS', 4], 0, function () {
67714        return this.millisecond() * 10;
67715    });
67716    addFormatToken(0, ['SSSSS', 5], 0, function () {
67717        return this.millisecond() * 100;
67718    });
67719    addFormatToken(0, ['SSSSSS', 6], 0, function () {
67720        return this.millisecond() * 1000;
67721    });
67722    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
67723        return this.millisecond() * 10000;
67724    });
67725    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
67726        return this.millisecond() * 100000;
67727    });
67728    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
67729        return this.millisecond() * 1000000;
67730    });
67731
67732    // ALIASES
67733
67734    addUnitAlias('millisecond', 'ms');
67735
67736    // PRIORITY
67737
67738    addUnitPriority('millisecond', 16);
67739
67740    // PARSING
67741
67742    addRegexToken('S', match1to3, match1);
67743    addRegexToken('SS', match1to3, match2);
67744    addRegexToken('SSS', match1to3, match3);
67745
67746    var token, getSetMillisecond;
67747    for (token = 'SSSS'; token.length <= 9; token += 'S') {
67748        addRegexToken(token, matchUnsigned);
67749    }
67750
67751    function parseMs(input, array) {
67752        array[MILLISECOND] = toInt(('0.' + input) * 1000);
67753    }
67754
67755    for (token = 'S'; token.length <= 9; token += 'S') {
67756        addParseToken(token, parseMs);
67757    }
67758
67759    getSetMillisecond = makeGetSet('Milliseconds', false);
67760
67761    // FORMATTING
67762
67763    addFormatToken('z', 0, 0, 'zoneAbbr');
67764    addFormatToken('zz', 0, 0, 'zoneName');
67765
67766    // MOMENTS
67767
67768    function getZoneAbbr() {
67769        return this._isUTC ? 'UTC' : '';
67770    }
67771
67772    function getZoneName() {
67773        return this._isUTC ? 'Coordinated Universal Time' : '';
67774    }
67775
67776    var proto = Moment.prototype;
67777
67778    proto.add = add;
67779    proto.calendar = calendar$1;
67780    proto.clone = clone;
67781    proto.diff = diff;
67782    proto.endOf = endOf;
67783    proto.format = format;
67784    proto.from = from;
67785    proto.fromNow = fromNow;
67786    proto.to = to;
67787    proto.toNow = toNow;
67788    proto.get = stringGet;
67789    proto.invalidAt = invalidAt;
67790    proto.isAfter = isAfter;
67791    proto.isBefore = isBefore;
67792    proto.isBetween = isBetween;
67793    proto.isSame = isSame;
67794    proto.isSameOrAfter = isSameOrAfter;
67795    proto.isSameOrBefore = isSameOrBefore;
67796    proto.isValid = isValid$2;
67797    proto.lang = lang;
67798    proto.locale = locale;
67799    proto.localeData = localeData;
67800    proto.max = prototypeMax;
67801    proto.min = prototypeMin;
67802    proto.parsingFlags = parsingFlags;
67803    proto.set = stringSet;
67804    proto.startOf = startOf;
67805    proto.subtract = subtract;
67806    proto.toArray = toArray;
67807    proto.toObject = toObject;
67808    proto.toDate = toDate;
67809    proto.toISOString = toISOString;
67810    proto.inspect = inspect;
67811    if (typeof Symbol !== 'undefined' && Symbol.for != null) {
67812        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
67813            return 'Moment<' + this.format() + '>';
67814        };
67815    }
67816    proto.toJSON = toJSON;
67817    proto.toString = toString;
67818    proto.unix = unix;
67819    proto.valueOf = valueOf;
67820    proto.creationData = creationData;
67821    proto.eraName = getEraName;
67822    proto.eraNarrow = getEraNarrow;
67823    proto.eraAbbr = getEraAbbr;
67824    proto.eraYear = getEraYear;
67825    proto.year = getSetYear;
67826    proto.isLeapYear = getIsLeapYear;
67827    proto.weekYear = getSetWeekYear;
67828    proto.isoWeekYear = getSetISOWeekYear;
67829    proto.quarter = proto.quarters = getSetQuarter;
67830    proto.month = getSetMonth;
67831    proto.daysInMonth = getDaysInMonth;
67832    proto.week = proto.weeks = getSetWeek;
67833    proto.isoWeek = proto.isoWeeks = getSetISOWeek;
67834    proto.weeksInYear = getWeeksInYear;
67835    proto.weeksInWeekYear = getWeeksInWeekYear;
67836    proto.isoWeeksInYear = getISOWeeksInYear;
67837    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
67838    proto.date = getSetDayOfMonth;
67839    proto.day = proto.days = getSetDayOfWeek;
67840    proto.weekday = getSetLocaleDayOfWeek;
67841    proto.isoWeekday = getSetISODayOfWeek;
67842    proto.dayOfYear = getSetDayOfYear;
67843    proto.hour = proto.hours = getSetHour;
67844    proto.minute = proto.minutes = getSetMinute;
67845    proto.second = proto.seconds = getSetSecond;
67846    proto.millisecond = proto.milliseconds = getSetMillisecond;
67847    proto.utcOffset = getSetOffset;
67848    proto.utc = setOffsetToUTC;
67849    proto.local = setOffsetToLocal;
67850    proto.parseZone = setOffsetToParsedOffset;
67851    proto.hasAlignedHourOffset = hasAlignedHourOffset;
67852    proto.isDST = isDaylightSavingTime;
67853    proto.isLocal = isLocal;
67854    proto.isUtcOffset = isUtcOffset;
67855    proto.isUtc = isUtc;
67856    proto.isUTC = isUtc;
67857    proto.zoneAbbr = getZoneAbbr;
67858    proto.zoneName = getZoneName;
67859    proto.dates = deprecate(
67860        'dates accessor is deprecated. Use date instead.',
67861        getSetDayOfMonth
67862    );
67863    proto.months = deprecate(
67864        'months accessor is deprecated. Use month instead',
67865        getSetMonth
67866    );
67867    proto.years = deprecate(
67868        'years accessor is deprecated. Use year instead',
67869        getSetYear
67870    );
67871    proto.zone = deprecate(
67872        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
67873        getSetZone
67874    );
67875    proto.isDSTShifted = deprecate(
67876        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
67877        isDaylightSavingTimeShifted
67878    );
67879
67880    function createUnix(input) {
67881        return createLocal(input * 1000);
67882    }
67883
67884    function createInZone() {
67885        return createLocal.apply(null, arguments).parseZone();
67886    }
67887
67888    function preParsePostFormat(string) {
67889        return string;
67890    }
67891
67892    var proto$1 = Locale.prototype;
67893
67894    proto$1.calendar = calendar;
67895    proto$1.longDateFormat = longDateFormat;
67896    proto$1.invalidDate = invalidDate;
67897    proto$1.ordinal = ordinal;
67898    proto$1.preparse = preParsePostFormat;
67899    proto$1.postformat = preParsePostFormat;
67900    proto$1.relativeTime = relativeTime;
67901    proto$1.pastFuture = pastFuture;
67902    proto$1.set = set;
67903    proto$1.eras = localeEras;
67904    proto$1.erasParse = localeErasParse;
67905    proto$1.erasConvertYear = localeErasConvertYear;
67906    proto$1.erasAbbrRegex = erasAbbrRegex;
67907    proto$1.erasNameRegex = erasNameRegex;
67908    proto$1.erasNarrowRegex = erasNarrowRegex;
67909
67910    proto$1.months = localeMonths;
67911    proto$1.monthsShort = localeMonthsShort;
67912    proto$1.monthsParse = localeMonthsParse;
67913    proto$1.monthsRegex = monthsRegex;
67914    proto$1.monthsShortRegex = monthsShortRegex;
67915    proto$1.week = localeWeek;
67916    proto$1.firstDayOfYear = localeFirstDayOfYear;
67917    proto$1.firstDayOfWeek = localeFirstDayOfWeek;
67918
67919    proto$1.weekdays = localeWeekdays;
67920    proto$1.weekdaysMin = localeWeekdaysMin;
67921    proto$1.weekdaysShort = localeWeekdaysShort;
67922    proto$1.weekdaysParse = localeWeekdaysParse;
67923
67924    proto$1.weekdaysRegex = weekdaysRegex;
67925    proto$1.weekdaysShortRegex = weekdaysShortRegex;
67926    proto$1.weekdaysMinRegex = weekdaysMinRegex;
67927
67928    proto$1.isPM = localeIsPM;
67929    proto$1.meridiem = localeMeridiem;
67930
67931    function get$1(format, index, field, setter) {
67932        var locale = getLocale(),
67933            utc = createUTC().set(setter, index);
67934        return locale[field](utc, format);
67935    }
67936
67937    function listMonthsImpl(format, index, field) {
67938        if (isNumber(format)) {
67939            index = format;
67940            format = undefined;
67941        }
67942
67943        format = format || '';
67944
67945        if (index != null) {
67946            return get$1(format, index, field, 'month');
67947        }
67948
67949        var i,
67950            out = [];
67951        for (i = 0; i < 12; i++) {
67952            out[i] = get$1(format, i, field, 'month');
67953        }
67954        return out;
67955    }
67956
67957    // ()
67958    // (5)
67959    // (fmt, 5)
67960    // (fmt)
67961    // (true)
67962    // (true, 5)
67963    // (true, fmt, 5)
67964    // (true, fmt)
67965    function listWeekdaysImpl(localeSorted, format, index, field) {
67966        if (typeof localeSorted === 'boolean') {
67967            if (isNumber(format)) {
67968                index = format;
67969                format = undefined;
67970            }
67971
67972            format = format || '';
67973        } else {
67974            format = localeSorted;
67975            index = format;
67976            localeSorted = false;
67977
67978            if (isNumber(format)) {
67979                index = format;
67980                format = undefined;
67981            }
67982
67983            format = format || '';
67984        }
67985
67986        var locale = getLocale(),
67987            shift = localeSorted ? locale._week.dow : 0,
67988            i,
67989            out = [];
67990
67991        if (index != null) {
67992            return get$1(format, (index + shift) % 7, field, 'day');
67993        }
67994
67995        for (i = 0; i < 7; i++) {
67996            out[i] = get$1(format, (i + shift) % 7, field, 'day');
67997        }
67998        return out;
67999    }
68000
68001    function listMonths(format, index) {
68002        return listMonthsImpl(format, index, 'months');
68003    }
68004
68005    function listMonthsShort(format, index) {
68006        return listMonthsImpl(format, index, 'monthsShort');
68007    }
68008
68009    function listWeekdays(localeSorted, format, index) {
68010        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
68011    }
68012
68013    function listWeekdaysShort(localeSorted, format, index) {
68014        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
68015    }
68016
68017    function listWeekdaysMin(localeSorted, format, index) {
68018        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
68019    }
68020
68021    getSetGlobalLocale('en', {
68022        eras: [
68023            {
68024                since: '0001-01-01',
68025                until: +Infinity,
68026                offset: 1,
68027                name: 'Anno Domini',
68028                narrow: 'AD',
68029                abbr: 'AD',
68030            },
68031            {
68032                since: '0000-12-31',
68033                until: -Infinity,
68034                offset: 1,
68035                name: 'Before Christ',
68036                narrow: 'BC',
68037                abbr: 'BC',
68038            },
68039        ],
68040        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
68041        ordinal: function (number) {
68042            var b = number % 10,
68043                output =
68044                    toInt((number % 100) / 10) === 1
68045                        ? 'th'
68046                        : b === 1
68047                        ? 'st'
68048                        : b === 2
68049                        ? 'nd'
68050                        : b === 3
68051                        ? 'rd'
68052                        : 'th';
68053            return number + output;
68054        },
68055    });
68056
68057    // Side effect imports
68058
68059    hooks.lang = deprecate(
68060        'moment.lang is deprecated. Use moment.locale instead.',
68061        getSetGlobalLocale
68062    );
68063    hooks.langData = deprecate(
68064        'moment.langData is deprecated. Use moment.localeData instead.',
68065        getLocale
68066    );
68067
68068    var mathAbs = Math.abs;
68069
68070    function abs() {
68071        var data = this._data;
68072
68073        this._milliseconds = mathAbs(this._milliseconds);
68074        this._days = mathAbs(this._days);
68075        this._months = mathAbs(this._months);
68076
68077        data.milliseconds = mathAbs(data.milliseconds);
68078        data.seconds = mathAbs(data.seconds);
68079        data.minutes = mathAbs(data.minutes);
68080        data.hours = mathAbs(data.hours);
68081        data.months = mathAbs(data.months);
68082        data.years = mathAbs(data.years);
68083
68084        return this;
68085    }
68086
68087    function addSubtract$1(duration, input, value, direction) {
68088        var other = createDuration(input, value);
68089
68090        duration._milliseconds += direction * other._milliseconds;
68091        duration._days += direction * other._days;
68092        duration._months += direction * other._months;
68093
68094        return duration._bubble();
68095    }
68096
68097    // supports only 2.0-style add(1, 's') or add(duration)
68098    function add$1(input, value) {
68099        return addSubtract$1(this, input, value, 1);
68100    }
68101
68102    // supports only 2.0-style subtract(1, 's') or subtract(duration)
68103    function subtract$1(input, value) {
68104        return addSubtract$1(this, input, value, -1);
68105    }
68106
68107    function absCeil(number) {
68108        if (number < 0) {
68109            return Math.floor(number);
68110        } else {
68111            return Math.ceil(number);
68112        }
68113    }
68114
68115    function bubble() {
68116        var milliseconds = this._milliseconds,
68117            days = this._days,
68118            months = this._months,
68119            data = this._data,
68120            seconds,
68121            minutes,
68122            hours,
68123            years,
68124            monthsFromDays;
68125
68126        // if we have a mix of positive and negative values, bubble down first
68127        // check: https://github.com/moment/moment/issues/2166
68128        if (
68129            !(
68130                (milliseconds >= 0 && days >= 0 && months >= 0) ||
68131                (milliseconds <= 0 && days <= 0 && months <= 0)
68132            )
68133        ) {
68134            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
68135            days = 0;
68136            months = 0;
68137        }
68138
68139        // The following code bubbles up values, see the tests for
68140        // examples of what that means.
68141        data.milliseconds = milliseconds % 1000;
68142
68143        seconds = absFloor(milliseconds / 1000);
68144        data.seconds = seconds % 60;
68145
68146        minutes = absFloor(seconds / 60);
68147        data.minutes = minutes % 60;
68148
68149        hours = absFloor(minutes / 60);
68150        data.hours = hours % 24;
68151
68152        days += absFloor(hours / 24);
68153
68154        // convert days to months
68155        monthsFromDays = absFloor(daysToMonths(days));
68156        months += monthsFromDays;
68157        days -= absCeil(monthsToDays(monthsFromDays));
68158
68159        // 12 months -> 1 year
68160        years = absFloor(months / 12);
68161        months %= 12;
68162
68163        data.days = days;
68164        data.months = months;
68165        data.years = years;
68166
68167        return this;
68168    }
68169
68170    function daysToMonths(days) {
68171        // 400 years have 146097 days (taking into account leap year rules)
68172        // 400 years have 12 months === 4800
68173        return (days * 4800) / 146097;
68174    }
68175
68176    function monthsToDays(months) {
68177        // the reverse of daysToMonths
68178        return (months * 146097) / 4800;
68179    }
68180
68181    function as(units) {
68182        if (!this.isValid()) {
68183            return NaN;
68184        }
68185        var days,
68186            months,
68187            milliseconds = this._milliseconds;
68188
68189        units = normalizeUnits(units);
68190
68191        if (units === 'month' || units === 'quarter' || units === 'year') {
68192            days = this._days + milliseconds / 864e5;
68193            months = this._months + daysToMonths(days);
68194            switch (units) {
68195                case 'month':
68196                    return months;
68197                case 'quarter':
68198                    return months / 3;
68199                case 'year':
68200                    return months / 12;
68201            }
68202        } else {
68203            // handle milliseconds separately because of floating point math errors (issue #1867)
68204            days = this._days + Math.round(monthsToDays(this._months));
68205            switch (units) {
68206                case 'week':
68207                    return days / 7 + milliseconds / 6048e5;
68208                case 'day':
68209                    return days + milliseconds / 864e5;
68210                case 'hour':
68211                    return days * 24 + milliseconds / 36e5;
68212                case 'minute':
68213                    return days * 1440 + milliseconds / 6e4;
68214                case 'second':
68215                    return days * 86400 + milliseconds / 1000;
68216                // Math.floor prevents floating point math errors here
68217                case 'millisecond':
68218                    return Math.floor(days * 864e5) + milliseconds;
68219                default:
68220                    throw new Error('Unknown unit ' + units);
68221            }
68222        }
68223    }
68224
68225    // TODO: Use this.as('ms')?
68226    function valueOf$1() {
68227        if (!this.isValid()) {
68228            return NaN;
68229        }
68230        return (
68231            this._milliseconds +
68232            this._days * 864e5 +
68233            (this._months % 12) * 2592e6 +
68234            toInt(this._months / 12) * 31536e6
68235        );
68236    }
68237
68238    function makeAs(alias) {
68239        return function () {
68240            return this.as(alias);
68241        };
68242    }
68243
68244    var asMilliseconds = makeAs('ms'),
68245        asSeconds = makeAs('s'),
68246        asMinutes = makeAs('m'),
68247        asHours = makeAs('h'),
68248        asDays = makeAs('d'),
68249        asWeeks = makeAs('w'),
68250        asMonths = makeAs('M'),
68251        asQuarters = makeAs('Q'),
68252        asYears = makeAs('y');
68253
68254    function clone$1() {
68255        return createDuration(this);
68256    }
68257
68258    function get$2(units) {
68259        units = normalizeUnits(units);
68260        return this.isValid() ? this[units + 's']() : NaN;
68261    }
68262
68263    function makeGetter(name) {
68264        return function () {
68265            return this.isValid() ? this._data[name] : NaN;
68266        };
68267    }
68268
68269    var milliseconds = makeGetter('milliseconds'),
68270        seconds = makeGetter('seconds'),
68271        minutes = makeGetter('minutes'),
68272        hours = makeGetter('hours'),
68273        days = makeGetter('days'),
68274        months = makeGetter('months'),
68275        years = makeGetter('years');
68276
68277    function weeks() {
68278        return absFloor(this.days() / 7);
68279    }
68280
68281    var round = Math.round,
68282        thresholds = {
68283            ss: 44, // a few seconds to seconds
68284            s: 45, // seconds to minute
68285            m: 45, // minutes to hour
68286            h: 22, // hours to day
68287            d: 26, // days to month/week
68288            w: null, // weeks to month
68289            M: 11, // months to year
68290        };
68291
68292    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
68293    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
68294        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
68295    }
68296
68297    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
68298        var duration = createDuration(posNegDuration).abs(),
68299            seconds = round(duration.as('s')),
68300            minutes = round(duration.as('m')),
68301            hours = round(duration.as('h')),
68302            days = round(duration.as('d')),
68303            months = round(duration.as('M')),
68304            weeks = round(duration.as('w')),
68305            years = round(duration.as('y')),
68306            a =
68307                (seconds <= thresholds.ss && ['s', seconds]) ||
68308                (seconds < thresholds.s && ['ss', seconds]) ||
68309                (minutes <= 1 && ['m']) ||
68310                (minutes < thresholds.m && ['mm', minutes]) ||
68311                (hours <= 1 && ['h']) ||
68312                (hours < thresholds.h && ['hh', hours]) ||
68313                (days <= 1 && ['d']) ||
68314                (days < thresholds.d && ['dd', days]);
68315
68316        if (thresholds.w != null) {
68317            a =
68318                a ||
68319                (weeks <= 1 && ['w']) ||
68320                (weeks < thresholds.w && ['ww', weeks]);
68321        }
68322        a = a ||
68323            (months <= 1 && ['M']) ||
68324            (months < thresholds.M && ['MM', months]) ||
68325            (years <= 1 && ['y']) || ['yy', years];
68326
68327        a[2] = withoutSuffix;
68328        a[3] = +posNegDuration > 0;
68329        a[4] = locale;
68330        return substituteTimeAgo.apply(null, a);
68331    }
68332
68333    // This function allows you to set the rounding function for relative time strings
68334    function getSetRelativeTimeRounding(roundingFunction) {
68335        if (roundingFunction === undefined) {
68336            return round;
68337        }
68338        if (typeof roundingFunction === 'function') {
68339            round = roundingFunction;
68340            return true;
68341        }
68342        return false;
68343    }
68344
68345    // This function allows you to set a threshold for relative time strings
68346    function getSetRelativeTimeThreshold(threshold, limit) {
68347        if (thresholds[threshold] === undefined) {
68348            return false;
68349        }
68350        if (limit === undefined) {
68351            return thresholds[threshold];
68352        }
68353        thresholds[threshold] = limit;
68354        if (threshold === 's') {
68355            thresholds.ss = limit - 1;
68356        }
68357        return true;
68358    }
68359
68360    function humanize(argWithSuffix, argThresholds) {
68361        if (!this.isValid()) {
68362            return this.localeData().invalidDate();
68363        }
68364
68365        var withSuffix = false,
68366            th = thresholds,
68367            locale,
68368            output;
68369
68370        if (typeof argWithSuffix === 'object') {
68371            argThresholds = argWithSuffix;
68372            argWithSuffix = false;
68373        }
68374        if (typeof argWithSuffix === 'boolean') {
68375            withSuffix = argWithSuffix;
68376        }
68377        if (typeof argThresholds === 'object') {
68378            th = Object.assign({}, thresholds, argThresholds);
68379            if (argThresholds.s != null && argThresholds.ss == null) {
68380                th.ss = argThresholds.s - 1;
68381            }
68382        }
68383
68384        locale = this.localeData();
68385        output = relativeTime$1(this, !withSuffix, th, locale);
68386
68387        if (withSuffix) {
68388            output = locale.pastFuture(+this, output);
68389        }
68390
68391        return locale.postformat(output);
68392    }
68393
68394    var abs$1 = Math.abs;
68395
68396    function sign(x) {
68397        return (x > 0) - (x < 0) || +x;
68398    }
68399
68400    function toISOString$1() {
68401        // for ISO strings we do not use the normal bubbling rules:
68402        //  * milliseconds bubble up until they become hours
68403        //  * days do not bubble at all
68404        //  * months bubble up until they become years
68405        // This is because there is no context-free conversion between hours and days
68406        // (think of clock changes)
68407        // and also not between days and months (28-31 days per month)
68408        if (!this.isValid()) {
68409            return this.localeData().invalidDate();
68410        }
68411
68412        var seconds = abs$1(this._milliseconds) / 1000,
68413            days = abs$1(this._days),
68414            months = abs$1(this._months),
68415            minutes,
68416            hours,
68417            years,
68418            s,
68419            total = this.asSeconds(),
68420            totalSign,
68421            ymSign,
68422            daysSign,
68423            hmsSign;
68424
68425        if (!total) {
68426            // this is the same as C#'s (Noda) and python (isodate)...
68427            // but not other JS (goog.date)
68428            return 'P0D';
68429        }
68430
68431        // 3600 seconds -> 60 minutes -> 1 hour
68432        minutes = absFloor(seconds / 60);
68433        hours = absFloor(minutes / 60);
68434        seconds %= 60;
68435        minutes %= 60;
68436
68437        // 12 months -> 1 year
68438        years = absFloor(months / 12);
68439        months %= 12;
68440
68441        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
68442        s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
68443
68444        totalSign = total < 0 ? '-' : '';
68445        ymSign = sign(this._months) !== sign(total) ? '-' : '';
68446        daysSign = sign(this._days) !== sign(total) ? '-' : '';
68447        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
68448
68449        return (
68450            totalSign +
68451            'P' +
68452            (years ? ymSign + years + 'Y' : '') +
68453            (months ? ymSign + months + 'M' : '') +
68454            (days ? daysSign + days + 'D' : '') +
68455            (hours || minutes || seconds ? 'T' : '') +
68456            (hours ? hmsSign + hours + 'H' : '') +
68457            (minutes ? hmsSign + minutes + 'M' : '') +
68458            (seconds ? hmsSign + s + 'S' : '')
68459        );
68460    }
68461
68462    var proto$2 = Duration.prototype;
68463
68464    proto$2.isValid = isValid$1;
68465    proto$2.abs = abs;
68466    proto$2.add = add$1;
68467    proto$2.subtract = subtract$1;
68468    proto$2.as = as;
68469    proto$2.asMilliseconds = asMilliseconds;
68470    proto$2.asSeconds = asSeconds;
68471    proto$2.asMinutes = asMinutes;
68472    proto$2.asHours = asHours;
68473    proto$2.asDays = asDays;
68474    proto$2.asWeeks = asWeeks;
68475    proto$2.asMonths = asMonths;
68476    proto$2.asQuarters = asQuarters;
68477    proto$2.asYears = asYears;
68478    proto$2.valueOf = valueOf$1;
68479    proto$2._bubble = bubble;
68480    proto$2.clone = clone$1;
68481    proto$2.get = get$2;
68482    proto$2.milliseconds = milliseconds;
68483    proto$2.seconds = seconds;
68484    proto$2.minutes = minutes;
68485    proto$2.hours = hours;
68486    proto$2.days = days;
68487    proto$2.weeks = weeks;
68488    proto$2.months = months;
68489    proto$2.years = years;
68490    proto$2.humanize = humanize;
68491    proto$2.toISOString = toISOString$1;
68492    proto$2.toString = toISOString$1;
68493    proto$2.toJSON = toISOString$1;
68494    proto$2.locale = locale;
68495    proto$2.localeData = localeData;
68496
68497    proto$2.toIsoString = deprecate(
68498        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
68499        toISOString$1
68500    );
68501    proto$2.lang = lang;
68502
68503    // FORMATTING
68504
68505    addFormatToken('X', 0, 0, 'unix');
68506    addFormatToken('x', 0, 0, 'valueOf');
68507
68508    // PARSING
68509
68510    addRegexToken('x', matchSigned);
68511    addRegexToken('X', matchTimestamp);
68512    addParseToken('X', function (input, array, config) {
68513        config._d = new Date(parseFloat(input) * 1000);
68514    });
68515    addParseToken('x', function (input, array, config) {
68516        config._d = new Date(toInt(input));
68517    });
68518
68519    //! moment.js
68520
68521    hooks.version = '2.29.4';
68522
68523    setHookCallback(createLocal);
68524
68525    hooks.fn = proto;
68526    hooks.min = min;
68527    hooks.max = max;
68528    hooks.now = now;
68529    hooks.utc = createUTC;
68530    hooks.unix = createUnix;
68531    hooks.months = listMonths;
68532    hooks.isDate = isDate;
68533    hooks.locale = getSetGlobalLocale;
68534    hooks.invalid = createInvalid;
68535    hooks.duration = createDuration;
68536    hooks.isMoment = isMoment;
68537    hooks.weekdays = listWeekdays;
68538    hooks.parseZone = createInZone;
68539    hooks.localeData = getLocale;
68540    hooks.isDuration = isDuration;
68541    hooks.monthsShort = listMonthsShort;
68542    hooks.weekdaysMin = listWeekdaysMin;
68543    hooks.defineLocale = defineLocale;
68544    hooks.updateLocale = updateLocale;
68545    hooks.locales = listLocales;
68546    hooks.weekdaysShort = listWeekdaysShort;
68547    hooks.normalizeUnits = normalizeUnits;
68548    hooks.relativeTimeRounding = getSetRelativeTimeRounding;
68549    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
68550    hooks.calendarFormat = getCalendarFormat;
68551    hooks.prototype = proto;
68552
68553    // currently HTML5 input type only supports 24-hour formats
68554    hooks.HTML5_FMT = {
68555        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
68556        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
68557        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
68558        DATE: 'YYYY-MM-DD', // <input type="date" />
68559        TIME: 'HH:mm', // <input type="time" />
68560        TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
68561        TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
68562        WEEK: 'GGGG-[W]WW', // <input type="week" />
68563        MONTH: 'YYYY-MM', // <input type="month" />
68564    };
68565
68566    return hooks;
68567
68568})));
68569
68570//! moment-timezone.js
68571//! version : 0.5.31
68572//! Copyright (c) JS Foundation and other contributors
68573//! license : MIT
68574//! github.com/moment/moment-timezone
68575
68576(function (root, factory) {
68577	"use strict";
68578
68579	/*global define*/
68580	if (typeof module === 'object' && module.exports) {
68581		module.exports = factory(require('moment')); // Node
68582	} else if (typeof define === 'function' && define.amd) {
68583		define(['moment'], factory);                 // AMD
68584	} else {
68585		factory(root.moment);                        // Browser
68586	}
68587}(this, function (moment) {
68588	"use strict";
68589
68590	// Resolves es6 module loading issue
68591	if (moment.version === undefined && moment.default) {
68592		moment = moment.default;
68593	}
68594
68595	// Do not load moment-timezone a second time.
68596	// if (moment.tz !== undefined) {
68597	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
68598	// 	return moment;
68599	// }
68600
68601	var VERSION = "0.5.31",
68602		zones = {},
68603		links = {},
68604		countries = {},
68605		names = {},
68606		guesses = {},
68607		cachedGuess;
68608
68609	if (!moment || typeof moment.version !== 'string') {
68610		logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/');
68611	}
68612
68613	var momentVersion = moment.version.split('.'),
68614		major = +momentVersion[0],
68615		minor = +momentVersion[1];
68616
68617	// Moment.js version check
68618	if (major < 2 || (major === 2 && minor < 6)) {
68619		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
68620	}
68621
68622	/************************************
68623		Unpacking
68624	************************************/
68625
68626	function charCodeToInt(charCode) {
68627		if (charCode > 96) {
68628			return charCode - 87;
68629		} else if (charCode > 64) {
68630			return charCode - 29;
68631		}
68632		return charCode - 48;
68633	}
68634
68635	function unpackBase60(string) {
68636		var i = 0,
68637			parts = string.split('.'),
68638			whole = parts[0],
68639			fractional = parts[1] || '',
68640			multiplier = 1,
68641			num,
68642			out = 0,
68643			sign = 1;
68644
68645		// handle negative numbers
68646		if (string.charCodeAt(0) === 45) {
68647			i = 1;
68648			sign = -1;
68649		}
68650
68651		// handle digits before the decimal
68652		for (i; i < whole.length; i++) {
68653			num = charCodeToInt(whole.charCodeAt(i));
68654			out = 60 * out + num;
68655		}
68656
68657		// handle digits after the decimal
68658		for (i = 0; i < fractional.length; i++) {
68659			multiplier = multiplier / 60;
68660			num = charCodeToInt(fractional.charCodeAt(i));
68661			out += num * multiplier;
68662		}
68663
68664		return out * sign;
68665	}
68666
68667	function arrayToInt (array) {
68668		for (var i = 0; i < array.length; i++) {
68669			array[i] = unpackBase60(array[i]);
68670		}
68671	}
68672
68673	function intToUntil (array, length) {
68674		for (var i = 0; i < length; i++) {
68675			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
68676		}
68677
68678		array[length - 1] = Infinity;
68679	}
68680
68681	function mapIndices (source, indices) {
68682		var out = [], i;
68683
68684		for (i = 0; i < indices.length; i++) {
68685			out[i] = source[indices[i]];
68686		}
68687
68688		return out;
68689	}
68690
68691	function unpack (string) {
68692		var data = string.split('|'),
68693			offsets = data[2].split(' '),
68694			indices = data[3].split(''),
68695			untils  = data[4].split(' ');
68696
68697		arrayToInt(offsets);
68698		arrayToInt(indices);
68699		arrayToInt(untils);
68700
68701		intToUntil(untils, indices.length);
68702
68703		return {
68704			name       : data[0],
68705			abbrs      : mapIndices(data[1].split(' '), indices),
68706			offsets    : mapIndices(offsets, indices),
68707			untils     : untils,
68708			population : data[5] | 0
68709		};
68710	}
68711
68712	/************************************
68713		Zone object
68714	************************************/
68715
68716	function Zone (packedString) {
68717		if (packedString) {
68718			this._set(unpack(packedString));
68719		}
68720	}
68721
68722	Zone.prototype = {
68723		_set : function (unpacked) {
68724			this.name       = unpacked.name;
68725			this.abbrs      = unpacked.abbrs;
68726			this.untils     = unpacked.untils;
68727			this.offsets    = unpacked.offsets;
68728			this.population = unpacked.population;
68729		},
68730
68731		_index : function (timestamp) {
68732			var target = +timestamp,
68733				untils = this.untils,
68734				i;
68735
68736			for (i = 0; i < untils.length; i++) {
68737				if (target < untils[i]) {
68738					return i;
68739				}
68740			}
68741		},
68742
68743		countries : function () {
68744			var zone_name = this.name;
68745			return Object.keys(countries).filter(function (country_code) {
68746				return countries[country_code].zones.indexOf(zone_name) !== -1;
68747			});
68748		},
68749
68750		parse : function (timestamp) {
68751			var target  = +timestamp,
68752				offsets = this.offsets,
68753				untils  = this.untils,
68754				max     = untils.length - 1,
68755				offset, offsetNext, offsetPrev, i;
68756
68757			for (i = 0; i < max; i++) {
68758				offset     = offsets[i];
68759				offsetNext = offsets[i + 1];
68760				offsetPrev = offsets[i ? i - 1 : i];
68761
68762				if (offset < offsetNext && tz.moveAmbiguousForward) {
68763					offset = offsetNext;
68764				} else if (offset > offsetPrev && tz.moveInvalidForward) {
68765					offset = offsetPrev;
68766				}
68767
68768				if (target < untils[i] - (offset * 60000)) {
68769					return offsets[i];
68770				}
68771			}
68772
68773			return offsets[max];
68774		},
68775
68776		abbr : function (mom) {
68777			return this.abbrs[this._index(mom)];
68778		},
68779
68780		offset : function (mom) {
vendor: 3,253 bytes, lines 68781-68914
68781			logError("zone.offset has been deprecated in favor of zone.utcOffset");
68782			return this.offsets[this._index(mom)];
68783		},
68784
68785		utcOffset : function (mom) {
68786			return this.offsets[this._index(mom)];
68787		}
68788	};
68789
68790	/************************************
68791		Country object
68792	************************************/
68793
68794	function Country (country_name, zone_names) {
68795		this.name = country_name;
68796		this.zones = zone_names;
68797	}
68798
68799	/************************************
68800		Current Timezone
68801	************************************/
68802
68803	function OffsetAt(at) {
68804		var timeString = at.toTimeString();
68805		var abbr = timeString.match(/\([a-z ]+\)/i);
68806		if (abbr && abbr[0]) {
68807			// 17:56:31 GMT-0600 (CST)
68808			// 17:56:31 GMT-0600 (Central Standard Time)
68809			abbr = abbr[0].match(/[A-Z]/g);
68810			abbr = abbr ? abbr.join('') : undefined;
68811		} else {
68812			// 17:56:31 CST
68813			// 17:56:31 GMT+0800 (台北標準時間)
68814			abbr = timeString.match(/[A-Z]{3,5}/g);
68815			abbr = abbr ? abbr[0] : undefined;
68816		}
68817
68818		if (abbr === 'GMT') {
68819			abbr = undefined;
68820		}
68821
68822		this.at = +at;
68823		this.abbr = abbr;
68824		this.offset = at.getTimezoneOffset();
68825	}
68826
68827	function ZoneScore(zone) {
68828		this.zone = zone;
68829		this.offsetScore = 0;
68830		this.abbrScore = 0;
68831	}
68832
68833	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
68834		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
68835		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
68836			this.abbrScore++;
68837		}
68838	};
68839
68840	function findChange(low, high) {
68841		var mid, diff;
68842
68843		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
68844			mid = new OffsetAt(new Date(low.at + diff));
68845			if (mid.offset === low.offset) {
68846				low = mid;
68847			} else {
68848				high = mid;
68849			}
68850		}
68851
68852		return low;
68853	}
68854
68855	function userOffsets() {
68856		var startYear = new Date().getFullYear() - 2,
68857			last = new OffsetAt(new Date(startYear, 0, 1)),
68858			offsets = [last],
68859			change, next, i;
68860
68861		for (i = 1; i < 48; i++) {
68862			next = new OffsetAt(new Date(startYear, i, 1));
68863			if (next.offset !== last.offset) {
68864				change = findChange(last, next);
68865				offsets.push(change);
68866				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
68867			}
68868			last = next;
68869		}
68870
68871		for (i = 0; i < 4; i++) {
68872			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
68873			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
68874		}
68875
68876		return offsets;
68877	}
68878
68879	function sortZoneScores (a, b) {
68880		if (a.offsetScore !== b.offsetScore) {
68881			return a.offsetScore - b.offsetScore;
68882		}
68883		if (a.abbrScore !== b.abbrScore) {
68884			return a.abbrScore - b.abbrScore;
68885		}
68886		if (a.zone.population !== b.zone.population) {
68887			return b.zone.population - a.zone.population;
68888		}
68889		return b.zone.name.localeCompare(a.zone.name);
68890	}
68891
68892	function addToGuesses (name, offsets) {
68893		var i, offset;
68894		arrayToInt(offsets);
68895		for (i = 0; i < offsets.length; i++) {
68896			offset = offsets[i];
68897			guesses[offset] = guesses[offset] || {};
68898			guesses[offset][name] = true;
68899		}
68900	}
68901
68902	function guessesForUserOffsets (offsets) {
68903		var offsetsLength = offsets.length,
68904			filteredGuesses = {},
68905			out = [],
68906			i, j, guessesOffset;
68907
68908		for (i = 0; i < offsetsLength; i++) {
68909			guessesOffset = guesses[offsets[i].offset] || {};
68910			for (j in guessesOffset) {
68911				if (guessesOffset.hasOwnProperty(j)) {
68912					filteredGuesses[j] = true;
68913				}
68914			}
vendor: 4,401 bytes, lines 68914-69117
68914
68915		}
68916
68917		for (i in filteredGuesses) {
68918			if (filteredGuesses.hasOwnProperty(i)) {
68919				out.push(names[i]);
68920			}
68921		}
68922
68923		return out;
68924	}
68925
68926	function rebuildGuess () {
68927
68928		// use Intl API when available and returning valid time zone
68929		try {
68930			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
68931			if (intlName && intlName.length > 3) {
68932				var name = names[normalizeName(intlName)];
68933				if (name) {
68934					return name;
68935				}
68936				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
68937			}
68938		} catch (e) {
68939			// Intl unavailable, fall back to manual guessing.
68940		}
68941
68942		var offsets = userOffsets(),
68943			offsetsLength = offsets.length,
68944			guesses = guessesForUserOffsets(offsets),
68945			zoneScores = [],
68946			zoneScore, i, j;
68947
68948		for (i = 0; i < guesses.length; i++) {
68949			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
68950			for (j = 0; j < offsetsLength; j++) {
68951				zoneScore.scoreOffsetAt(offsets[j]);
68952			}
68953			zoneScores.push(zoneScore);
68954		}
68955
68956		zoneScores.sort(sortZoneScores);
68957
68958		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
68959	}
68960
68961	function guess (ignoreCache) {
68962		if (!cachedGuess || ignoreCache) {
68963			cachedGuess = rebuildGuess();
68964		}
68965		return cachedGuess;
68966	}
68967
68968	/************************************
68969		Global Methods
68970	************************************/
68971
68972	function normalizeName (name) {
68973		return (name || '').toLowerCase().replace(/\//g, '_');
68974	}
68975
68976	function addZone (packed) {
68977		var i, name, split, normalized;
68978
68979		if (typeof packed === "string") {
68980			packed = [packed];
68981		}
68982
68983		for (i = 0; i < packed.length; i++) {
68984			split = packed[i].split('|');
68985			name = split[0];
68986			normalized = normalizeName(name);
68987			zones[normalized] = packed[i];
68988			names[normalized] = name;
68989			addToGuesses(normalized, split[2].split(' '));
68990		}
68991	}
68992
68993	function getZone (name, caller) {
68994
68995		name = normalizeName(name);
68996
68997		var zone = zones[name];
68998		var link;
68999
69000		if (zone instanceof Zone) {
69001			return zone;
69002		}
69003
69004		if (typeof zone === 'string') {
69005			zone = new Zone(zone);
69006			zones[name] = zone;
69007			return zone;
69008		}
69009
69010		// Pass getZone to prevent recursion more than 1 level deep
69011		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
69012			zone = zones[name] = new Zone();
69013			zone._set(link);
69014			zone.name = names[name];
69015			return zone;
69016		}
69017
69018		return null;
69019	}
69020
69021	function getNames () {
69022		var i, out = [];
69023
69024		for (i in names) {
69025			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
69026				out.push(names[i]);
69027			}
69028		}
69029
69030		return out.sort();
69031	}
69032
69033	function getCountryNames () {
69034		return Object.keys(countries);
69035	}
69036
69037	function addLink (aliases) {
69038		var i, alias, normal0, normal1;
69039
69040		if (typeof aliases === "string") {
69041			aliases = [aliases];
69042		}
69043
69044		for (i = 0; i < aliases.length; i++) {
69045			alias = aliases[i].split('|');
69046
69047			normal0 = normalizeName(alias[0]);
69048			normal1 = normalizeName(alias[1]);
69049
69050			links[normal0] = normal1;
69051			names[normal0] = alias[0];
69052
69053			links[normal1] = normal0;
69054			names[normal1] = alias[1];
69055		}
69056	}
69057
69058	function addCountries (data) {
69059		var i, country_code, country_zones, split;
69060		if (!data || !data.length) return;
69061		for (i = 0; i < data.length; i++) {
69062			split = data[i].split('|');
69063			country_code = split[0].toUpperCase();
69064			country_zones = split[1].split(' ');
69065			countries[country_code] = new Country(
69066				country_code,
69067				country_zones
69068			);
69069		}
69070	}
69071
69072	function getCountry (name) {
69073		name = name.toUpperCase();
69074		return countries[name] || null;
69075	}
69076
69077	function zonesForCountry(country, with_offset) {
69078		country = getCountry(country);
69079
69080		if (!country) return null;
69081
69082		var zones = country.zones.sort();
69083
69084		if (with_offset) {
69085			return zones.map(function (zone_name) {
69086				var zone = getZone(zone_name);
69087				return {
69088					name: zone_name,
69089					offset: zone.utcOffset(new Date())
69090				};
69091			});
69092		}
69093
69094		return zones;
69095	}
69096
69097	function loadData (data) {
69098		addZone(data.zones);
69099		addLink(data.links);
69100		addCountries(data.countries);
69101		tz.dataVersion = data.version;
69102	}
69103
69104	function zoneExists (name) {
69105		if (!zoneExists.didShowError) {
69106			zoneExists.didShowError = true;
69107				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
69108		}
69109		return !!getZone(name);
69110	}
69111
69112	function needsOffset (m) {
69113		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
69114		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
69115	}
69116
69117	function 
vendor: 5,778 bytes, lines 69117-69273
69117logError (message) {
69118		if (typeof console !== 'undefined' && typeof console.error === 'function') {
69119			console.error(message);
69120		}
69121	}
69122
69123	/************************************
69124		moment.tz namespace
69125	************************************/
69126
69127	function tz (input) {
69128		var args = Array.prototype.slice.call(arguments, 0, -1),
69129			name = arguments[arguments.length - 1],
69130			zone = getZone(name),
69131			out  = moment.utc.apply(null, args);
69132
69133		if (zone && !moment.isMoment(input) && needsOffset(out)) {
69134			out.add(zone.parse(out), 'minutes');
69135		}
69136
69137		out.tz(name);
69138
69139		return out;
69140	}
69141
69142	tz.version      = VERSION;
69143	tz.dataVersion  = '';
69144	tz._zones       = zones;
69145	tz._links       = links;
69146	tz._names       = names;
69147	tz._countries	= countries;
69148	tz.add          = addZone;
69149	tz.link         = addLink;
69150	tz.load         = loadData;
69151	tz.zone         = getZone;
69152	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
69153	tz.guess        = guess;
69154	tz.names        = getNames;
69155	tz.Zone         = Zone;
69156	tz.unpack       = unpack;
69157	tz.unpackBase60 = unpackBase60;
69158	tz.needsOffset  = needsOffset;
69159	tz.moveInvalidForward   = true;
69160	tz.moveAmbiguousForward = false;
69161	tz.countries    = getCountryNames;
69162	tz.zonesForCountry = zonesForCountry;
69163
69164	/************************************
69165		Interface with Moment.js
69166	************************************/
69167
69168	var fn = moment.fn;
69169
69170	moment.tz = tz;
69171
69172	moment.defaultZone = null;
69173
69174	moment.updateOffset = function (mom, keepTime) {
69175		var zone = moment.defaultZone,
69176			offset;
69177
69178		if (mom._z === undefined) {
69179			if (zone && needsOffset(mom) && !mom._isUTC) {
69180				mom._d = moment.utc(mom._a)._d;
69181				mom.utc().add(zone.parse(mom), 'minutes');
69182			}
69183			mom._z = zone;
69184		}
69185		if (mom._z) {
69186			offset = mom._z.utcOffset(mom);
69187			if (Math.abs(offset) < 16) {
69188				offset = offset / 60;
69189			}
69190			if (mom.utcOffset !== undefined) {
69191				var z = mom._z;
69192				mom.utcOffset(-offset, keepTime);
69193				mom._z = z;
69194			} else {
69195				mom.zone(offset, keepTime);
69196			}
69197		}
69198	};
69199
69200	fn.tz = function (name, keepTime) {
69201		if (name) {
69202			if (typeof name !== 'string') {
69203				throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']');
69204			}
69205			this._z = getZone(name);
69206			if (this._z) {
69207				moment.updateOffset(this, keepTime);
69208			} else {
69209				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
69210			}
69211			return this;
69212		}
69213		if (this._z) { return this._z.name; }
69214	};
69215
69216	function abbrWrap (old) {
69217		return function () {
69218			if (this._z) { return this._z.abbr(this); }
69219			return old.call(this);
69220		};
69221	}
69222
69223	function resetZoneWrap (old) {
69224		return function () {
69225			this._z = null;
69226			return old.apply(this, arguments);
69227		};
69228	}
69229
69230	function resetZoneWrap2 (old) {
69231		return function () {
69232			if (arguments.length > 0) this._z = null;
69233			return old.apply(this, arguments);
69234		};
69235	}
69236
69237	fn.zoneName  = abbrWrap(fn.zoneName);
69238	fn.zoneAbbr  = abbrWrap(fn.zoneAbbr);
69239	fn.utc       = resetZoneWrap(fn.utc);
69240	fn.local     = resetZoneWrap(fn.local);
69241	fn.utcOffset = resetZoneWrap2(fn.utcOffset);
69242
69243	moment.tz.setDefault = function(name) {
69244		if (major < 2 || (major === 2 && minor < 9)) {
69245			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
69246		}
69247		moment.defaultZone = name ? getZone(name) : null;
69248		return moment;
69249	};
69250
69251	// Cloning a moment should include the _z property.
69252	var momentProperties = moment.momentProperties;
69253	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
69254		// moment 2.8.1+
69255		momentProperties.push('_z');
69256		momentProperties.push('_a');
69257	} else if (momentProperties) {
69258		// moment 2.7.0
69259		momentProperties._z = null;
69260	}
69261
69262	loadData({
69263		"version": "2020a",
69264		"zones": [
69265			"Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5",
69266			"Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5",
69267			"Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5",
69268			"Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
69269			"Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6",
69270			"Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4",
69271			"Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5",
69272			"Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
69273			"Africa/Casablanca|LMT +00 +01|u.k 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e
6927300 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|32e5",
69274			"Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3",
69275			"Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|012323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e
6927500 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|20e4",
69276			"Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5",
69277			"Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0|",
69278			"Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5",
69279			"Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5",
69280			"Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5",
69281			"Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|0121|-2le00 4i6N0 2q00|",
69282			"Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
69283			"Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
69284			"Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
69285			"America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
69286			"America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
69287			"America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3",
69288			"America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
69289			"America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
69290			"America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
69291			"America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
69292			"America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|",
69293			"America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
69294			"America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|",
69295			"America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
69296			"America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|",
69297			"America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|",
69298			"America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|",
69299			"America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|",
69300			"America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|",
69301			"America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4",
69302			"America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
69303			"America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2",
69304			"America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3",
69305			"America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
69306			"America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
69307			"America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
69308			"America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3",
69309			"America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2",
69310			"America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
69311			"America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5",
69312			"America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
69313			"America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
69314			"America/Campo_Grande|LMT -04 -03|3C.s 40 30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4",
69315			"America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG
693150 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
69316			"America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5",
69317			"America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3",
69318			"America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5",
69319			"America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
69320			"America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4",
69321			"America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5",
69322			"America/Creston|MST PST|70 80|010|-29DR0 43B0|53e2",
69323			"America/Cuiaba|LMT -04 -03|3I.k 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4",
69324			"America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8",
69325			"America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3",
69326			"America/Dawson|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|01010230405656565656565656565656565656565656565656565656565656565656565656565656565656565657|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|13e2",
69327			"America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
69328			"America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|0123425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 JxX1 SMX 1cN0 1cL0 aW10 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5",
69329			"America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|0121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 XQp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5",
69330			"America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3",
69331			"America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5",
69332			"America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5",
69333			"America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
69334			"America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69335			"America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5",
69336			"America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
69337			"America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3",
69338			"America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|01023232323232324523232323232323232323232323232323232323232676767676767676767676767676767676767676767676867676
693387676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2",
69339			"America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|01212121212121212121212121212121212121212121212121212121212121212121212121232121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
69340			"America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5",
69341			"America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5",
69342			"America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4",
69343			"America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
69344			"America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
69345			"America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4",
69346			"America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69347			"America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69348			"America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69349			"America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010401054541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 8wn0 1cN0 1cL0 1cN0 1cK0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69350			"America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69351			"America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69352			"America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69353			"America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2",
69354			"America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2",
69355			"America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4",
69356			"America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3",
69357			"America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 1nX1 e0X 9vd0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69358			"America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69359			"America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5",
69360			"America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6",
69361			"America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
69362			"America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4",
69363			"America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5",
69364			"America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5",
69365			"America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4",
69366			"America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
69367			"America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4",
69368			"America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2",
69369			"America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5",
69370			"America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|01203030303030303030303030303030304545450454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
69371			"America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6",
69372			"America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
69373			"America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3",
69374			"America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5",
69375			"America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
69376			"America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5",
69377			"America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4",
69378			"America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
69379			"America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2",
69380			"America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2",
69381			"America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2",
69382			"America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69383			"America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69384			"America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69385			"America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 de
69385L0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
69386			"America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
69387			"America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4",
69388			"America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5",
69389			"America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
69390			"America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4",
69391			"America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4",
69392			"America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5",
69393			"America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|",
69394			"America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842",
69395			"America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2",
69396			"America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5",
69397			"America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4",
69398			"America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229",
69399			"America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4",
69400			"America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|62e5",
69401			"America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5",
69402			"America/Sao_Paulo|LMT -03 -02|36.s 30 20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6",
69403			"America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452",
69404			"America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
69405			"America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
69406			"America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3",
69407			"America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5",
69408			"America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656",
69409			"America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
69410			"America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
69411			"America/Whitehorse|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|01010230405656565656565656565656565656565656565656565656565656565656565656565656565656565657|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|23e3",
69412			"America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4",
69413			"America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642",
69414			"America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
69415			"Antarctica/Casey|-00 +08 +11|0 -80 -b0|01212121|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10|10",
69416			"Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70",
69417			"Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80",
69418			"Antarctica/Macquarie|AEST AEDT -00 +11|-a0 -b0 0 -b0|0102010101010101010101010101010101010101010101010101010101010101010101010101010101010101013|-29E80 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1",
69419			"Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60",
69420			"Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|010202020202
6942002020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5",
69421			"Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
69422			"Antarctica/Rothera|-00 -03|0 30|01|gOo0|130",
69423			"Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20",
69424			"Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40",
69425			"Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25",
69426			"Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4",
69427			"Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5",
69428			"Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5",
69429			"Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5",
69430			"Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3",
69431			"Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4",
69432			"Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4",
69433			"Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4",
69434			"Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
69435			"Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
69436			"Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4",
69437			"Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
69438			"Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6",
69439			"Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|",
69440			"Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5",
69441			"Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4",
69442			"Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4",
69443			"Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6",
69444			"Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4",
69445			"Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3",
69446			"Asia/Shanghai|CST CDT|-80 -90|01010101010101010101010101010|-23uw0 18n0 OjB0 Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6",
69447			"Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5",
69448			"Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6",
69449			"Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5",
69450			"Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4",
69451			"Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5",
69452			"Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4",
69453			"Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312
69453121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
69454			"Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|0101010101010101010101010101010123232323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXd0 gM0 8Q00 IM0 1wM0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0|18e5",
69455			"Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101012323232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXd0 gM0 8Q00 IM0 1wM0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0|25e4",
69456			"Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5",
69457			"Asia/Hong_Kong|LMT HKT HKST HKWT JST|-7A.G -80 -90 -8u -90|0123412121212121212121212121212121212121212121212121212121212121212121|-2CFH0 1taO0 Hc0 xUu 9tBu 11z0 1tDu Rc0 1wo0 11A0 1cM0 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5",
69458			"Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3",
69459			"Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
69460			"Europe/Istanbul|IMT EET EEST +03 +04|-1U.U -20 -30 -30 -40|0121212121212121212121212121212121212121212121234312121212121212121212121212121212121212121212121212121212121212123|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSN0 CL0 mp0 1Vz0 1gN0 8yn0 1yp0 ML0 1kp0 17b
694600 1ip0 17b0 1fB0 19X0 1ip0 19X0 1ip0 17b0 qdB0 38L0 1jd0 Tz0 l6O0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
69461			"Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6",
69462			"Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4",
69463			"Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|012121212121321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 bXd0 gM0 8Q00 IM0 1wM0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4",
69464			"Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5",
69465			"Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4",
69466			"Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6",
69467			"Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5",
69468			"Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5",
69469			"Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2",
69470			"Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
69471			"Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5",
69472			"Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4",
69473			"Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4",
69474			"Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
69475			"Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5",
69476			"Asia/Manila|PST PDT JST|-80 -90 -90|010201010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6",
69477			"Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4",
69478			"Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4",
69479			"Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5",
69480			"Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5",
69481			"Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4",
69482			"Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4",
69483			"Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5",
69484			"Asia/Qostanay|LMT +04 +05 +06|-4e.s -40 -50 -60|012323232323232323232123232323232323232323232323|-1Pc4e.s eUoe.s 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
69485			"Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|01232323232323232323232323232323232323232323232|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4",
69486			"Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5",
69487			"Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4",
69488			"Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4",
69489			"Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -a0 -9u|012343434343151515151515134343|-2um8r.Q 97XV.Q 1m1zu 6CM0 Fz0 1kN0 14n0 1kN0 14L0 1zd0 On0 69B0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6",
69490			"Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
69491			"Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5",
69492			"Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5",
69493			"Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5",
69494			"Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6",
69495			"Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3",
69496			"Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6",
69497			"Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5",
69498			"Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5",
69499			"Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2",
69500			"Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
69501			"Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4",
69502			"Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5",
69503			"Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5",
69504			"Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4",
69505			"Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
69506			"Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
69507			"Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4",
69508			"Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3",
69509			"Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4",
69510			"Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4",
69511			"Atlantic/South_Georgia|-02|20|0||30",
69512			"Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2",
69513			"Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5",
69514			"Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5",
69515			"Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5",
69516			"Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3",
69517			"Australia/Currie|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|746",
69518			"Australia/Darwin|ACST ACDT|-9u -au|010101010|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4",
69519			"Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293kI xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368",
69520			"Australia/Hobart|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4",
69521			"Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 
695211cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347",
69522			"Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10",
69523			"Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5",
69524			"Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293jX xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5",
69525			"CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
69526			"Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|30e2",
69527			"CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69528			"EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
69529			"Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
69530			"EST|EST|50|0||",
69531			"EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69532			"Etc/GMT-0|GMT|0|0||",
69533			"Etc/GMT-1|+01|-10|0||",
69534			"Pacific/Port_Moresby|+10|-a0|0||25e4",
69535			"Etc/GMT-11|+11|-b0|0||",
69536			"Pacific/Tarawa|+12|-c0|0||29e3",
69537			"Etc/GMT-13|+13|-d0|0||",
69538			"Etc/GMT-14|+14|-e0|0||",
69539			"Etc/GMT-2|+02|-20|0||",
69540			"Etc/GMT-3|+03|-30|0||",
69541			"Etc/GMT-4|+04|-40|0||",
69542			"Etc/GMT-5|+05|-50|0||",
69543			"Etc/GMT-6|+06|-60|0||",
69544			"Indian/Christmas|+07|-70|0||21e2",
69545			"Etc/GMT-8|+08|-80|0||",
69546			"Pacific/Palau|+09|-90|0||21e3",
69547			"Etc/GMT+1|-01|10|0||",
69548			"Etc/GMT+10|-10|a0|0||",
69549			"Etc/GMT+11|-11|b0|0||",
69550			"Etc/GMT+12|-12|c0|0||",
69551			"Etc/GMT+3|-03|30|0||",
69552			"Etc/GMT+4|-04|40|0||",
69553			"Etc/GMT+5|-05|50|0||",
69554			"Etc/GMT+6|-06|60|0||",
69555			"Etc/GMT+7|-07|70|0||",
69556			"Etc/GMT+8|-08|80|0||",
69557			"Etc/GMT+9|-09|90|0||",
69558			"Etc/UTC|UTC|0|0||",
69559			"Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 U
69559o0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5",
69560			"Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3",
69561			"Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5",
69562			"Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5",
69563			"Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6",
69564			"Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
69565			"Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5",
69566			"Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5",
69567			"Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5",
69568			"Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5",
69569			"Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
69570			"Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4",
69571			"Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4",
69572			"Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
69573			"Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3",
69574			"Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
69575			"Europe/Kaliningrad|CET CEST EET EEST MSK MSD +03|-10 -20 -20 -30 -30 -40 -30|01010101010101232454545454545454543232323232323232323232323232323232323232323262|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 390 7A0 1en0 12N0 1pbb0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4",
69576			"Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5",
69577			"Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
69578			"Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5",
69579			"Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
69580			"Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5",
69581			"Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
69582			"Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5",
69583			"Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3",
69584			"Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6",
69585			"Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco8.l cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6",
69586			"Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -2
695860 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4",
69587			"Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5",
69588			"Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5",
69589			"Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|",
69590			"Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4",
69591			"Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
69592			"Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5",
69593			"Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4",
69594			"Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
69595			"Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5",
69596			"Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4",
69597			"Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1ao0 1co0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5",
69598			"Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
69599			"Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0|10e5",
69600			"Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
69601			"Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4",
69602			"HST|HST|a0|0||",
69603			"Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2",
69604			"Indian/Cocos|+0630|-6u|0||596",
69605			"Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130",
69606			"Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3",
69607			"Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4",
69608			"Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4",
69609			"Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4",
69610			"Pacific/Kwajalein|+11 +10 +09 -12 +12|-b0 -a0 -90 c0 -c0|012034|-1kln0 akp0 6Up0 12ry0 Wan0|14e3",
69611			"MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
69612			"MST|MST|70|0||",
69613			"MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69614			"Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600",
69615			"Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545454545454545454545454545454545454|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|37e3",
69616			"Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4",
69617			"Pacific/Chuuk|+10 +09|-a0 -90|01010|-2ewy0 axB0 RVX0 axd0|49e3",
69618			"Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
69619			"Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1",
69620			"Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483",
69621			"Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|0121212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00|88e4",
69622			"Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3",
69623			"Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125",
69624			"Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4",
69625			"Pacific/Guam|GST +09 GDT ChST|-a0 -90 -b0 -a0|01020202020202020203|-18jK0 6pB0 AhB0 3QL0 g2p0 3p91 WOX rX0 1zd0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4",
69626			"Pacific/Honolulu|HST HDT HWT HPT HST|au 9u 9u 9u a0|0102304|-1thLu 8x0 lef0 8wWu iAu 46p0|37e4",
69627			"Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2",
69628			"Pacific/Kosrae|+11 +09 +10 +12|-b0 -90 -a0 -c0|01021030|-2ewz0 axC0 HBy0 akp0 axd0 WOK0 1bdz0|66e2",
69629			"Pacific/Majuro|+11 +09 +10 +12|-b0 -90 -a0 -c0|0102103|-2ewz0 axC0 HBy0 akp0 6RB0 12um0|28e3",
69630			"Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2",
69631			"Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2",
69632			"Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E QCnB.E 7mqu 1lnbu|10e3",
69633			"Pacific/Niue|-1120 -1130 -11|bk bu b0|012|-KfME 17y0a|12e2",
69634			"Pacific/Norfolk|+1112 +1130 +1230 +11 +12|-bc -bu -cu -b0 -c0|012134343434343434343434343434343434343434|-Kgbc W01G Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|25e4",
69635			"Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3",
69636			"Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56",
69637			"Pacific/Pohnpei|+11 +09 +10|-b0 -90 -a0|010210|-2ewz0 axC0 HBy0 akp0 axd0|34e3",
69638			"Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3",
69639			"Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4",
69640			"Pacific/Tongatapu|+1220 +13 +14|-ck -d0 -e0|0121212121|-1aB0k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3",
69641			"PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
69642			"WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|"
69643		],
69644		"links": [
69645			"Africa/Abidjan|Africa/Bamako",
69646			"Africa/Abidjan|Africa/Banjul",
69647			"Africa/Abidjan|Africa/Conakry",
69648			"Africa/Abidjan|Africa/Dakar",
69649			"Africa/Abidjan|Africa/Freetown",
69650			"Africa/Abidjan|Africa/Lome",
69651			"Africa/Abidjan|Africa/Nouakchott",
69652			"Africa/Abidjan|Africa/Ouagadougou",
69653			"Africa/Abidjan|Africa/Timbuktu",
69654			"Africa/Abidjan|Atlantic/St_Helena",
69655			"Africa/Cairo|Egypt",
69656			"Africa/Johannesburg|Africa/Maseru",
69657			"Africa/Johannesburg|Africa/Mbabane",
69658			"Africa/Lagos|Africa/Bangui",
69659			"Africa/Lagos|Africa/Brazzaville",
69660			"Africa/Lagos|Africa/Douala",
69661			"Africa/Lagos|Africa/Kinshasa",
69662			"Africa/Lagos|Africa/Libreville",
69663			"Africa/Lagos|Africa/Luanda",
69664			"Africa/Lagos|Africa/Malabo",
69665			"Africa/Lagos|Africa/Niamey",
69666			"Africa/Lagos|Africa/Porto-Novo",
69667			"Africa/Maputo|Africa/Blantyre",
69668			"Africa/Maputo|Africa/Bujumbura",
69669			"Africa/Maputo|Africa/Gaborone",
69670			"Africa/Maputo|Africa/Harare",
69671			"Africa/Maputo|Africa/Kigali",
69672			"Africa/Maputo|Africa/Lubumbashi",
69673			"Africa/Maputo|Africa/Lusaka",
69674			"Africa/Nairobi|Africa/Addis_Ababa",
69675			"Africa/Nairobi|Africa/Asmara",
69676			"Africa/Nairobi|Africa/Asmera",
69677			"Africa/Nairobi|Africa/Dar_es_Salaam",
69678			"Africa/Nairobi|Africa/Djibouti",
69679			"Africa/Nairobi|Africa/Kampala",
69680			"Africa/Nairobi|Africa/Mogadishu",
69681			"Africa/Nairobi|Indian/Antananarivo",
69682			"Africa/Nairobi|Indian/Comoro",
69683			"Africa/Nairobi|Indian/Mayotte",
69684			"Africa/Tripoli|Libya",
69685			"America/Adak|America/Atka",
69686			"America/Adak|US/Aleutian",
69687			"America/Anchorage|US/Alaska",
69688			"America/Argentina/Buenos_Aires|America/Buenos_Aires",
69689			"America/Argentina/Catamarca|America/Argentina/ComodRivadavia",
69690			"America/Argentina/Catamarca|America/Catamarca",
69691			"America/Argentina/Cordoba|America/Cordoba",
69692			"America/Argentina/Cordoba|America/Rosario",
69693			"America/Argentina/Jujuy|America/Jujuy",
69694			"America/Argentina/Mendoza|America/Mendoza",
69695			"America/Atikokan|America/Coral_Harbour",
69696			"America/Chicago|US/Central",
69697			"America/Curacao|America/Aruba",
69698			"America/Curacao|America/Kralendijk",
69699			"America/Curacao|America/Lower_Princes",
69700			"America/Denver|America/Shiprock",
69701			"America/Denver|Navajo",
69702			"America/Denver|US/Mountain",
69703			"America/Detroit|US/Michigan",
69704			"America/Edmonton|Canada/Mountain",
69705			"America/Fort_Wayne|America/Indiana/Indianapolis",
69706			"America/Fort_Wayne|America/Indianapolis",
69707			"America/Fort_Wayne|US/East-Indiana",
69708			"America/Godthab|America/Nuuk",
69709			"America/Halifax|Canada/Atlantic",
69710			"America/Havana|Cuba",
69711			"America/Indiana/Knox|America/Knox_IN",
69712			"America/Indiana/Knox|US/Indiana-Starke",
69713			"America/Jamaica|Jamaica",
69714			"America/Kentucky/Louisville|America/Louisville",
69715			"America/Los_Angeles|US/Pacific",
69716			"America/Los_Angeles|US/Pacific-New",
69717			"America/Manaus|Brazil/West",
69718			"America/Mazatlan|Mexico/BajaSur",
69719			"America/Mexico_City|Mexico/General",
69720			"America/New_York|US/Eastern",
69721			"America/Noronha|Brazil/DeNoronha",
69722			"America/Panama|America/Cayman",
69723			"America/Phoenix|US/Arizona",
69724			"America/Port_of_Spain|America/Anguilla",
69725			"America/Port_of_Spain|America/Antigua",
69726			"America/Port_of_Spain|America/Dominica",
69727			"America/Port_of_Spain|America/Grenada",
69728			"America/Port_of_Spain|America/Guadeloupe",
69729			"America/Port_of_Spain|America/Marigot",
69730			"America/Port_of_Spain|America/Montserrat",
69731			"America/Port_of_Spain|America/St_Barthelemy",
69732			"America/Port_of_Spain|America/St_Kitts",
69733			"America/Port_of_Spain|America/St_Lucia",
69734			"America/Port_of_Spain|America/St_Thomas",
69735			"America/Port_of_Spain|America/St_Vincent",
69736			"America/Port_of_Spain|America/Tortola",
69737			"America/Port_of_Spain|America/Virgin",
69738			"America/Regina|Canada/Saskatchewan",
69739			"America/Rio_Branco|America/Porto_Acre",
69740			"America/Rio_Branco|Brazil/Acre",
69741			"America/Santiago|Chile/Continental",
69742			"America/Sao_Paulo|Brazil/East",
69743			"America/St_Johns|Canada/Newfoundland",
69744			"America/Tijuana|America/Ensenada",
69745			"America/Tijuana|America/Santa_Isabel",
69746			"America/Tijuana|Mexico/BajaNorte",
69747			"America/Toronto|America/Montreal",
69748			"America/Toronto|Canada/Eastern",
69749			"America/Vancouver|Canada/Pacific",
69750			"America/Whitehorse|Canada/Yukon",
69751			"America/Winnipeg|Canada/Central",
69752			"Asia/Ashgabat|Asia/Ashkhabad",
69753			"Asia/Bangkok|Asia/Phnom_Penh",
69754			"Asia/Bangkok|Asia/Vientiane",
69755			"Asia/Dhaka|Asia/Dacca",
69756			"Asia/Dubai|Asia/Muscat",
69757			"Asia/Ho_Chi_Minh|Asia/Saigon",
69758			"Asia/Hong_Kong|Hongkong",
69759			"Asia/Jerusalem|Asia/Tel_Aviv",
69760			"Asia/Jerusalem|Israel",
69761			"Asia/Kathmandu|Asia/Katmandu",
69762			"Asia/Kolkata|Asia/Calcutta",
69763			"Asia/Kuala_Lumpur|Asia/Singapore",
69764			"Asia/Kuala_Lumpur|Singapore",
69765			"Asia/Macau|Asia/Macao",
69766			"Asia/Makassar|Asia/Ujung_Pandang",
69767			"Asia/Nicosia|Europe/Nicosia",
69768			"Asia/Qatar|Asia/Bahrain",
69769			"Asia/Rangoon|Asia/Yangon",
69770			"Asia/Riyadh|Asia/Aden",
69771			"Asia/Riyadh|Asia/Kuwait",
69772			"Asia/Seoul|ROK",
69773			"Asia/Shanghai|Asia/Chongqing",
69774			"Asia/Shanghai|Asia/Chungking",
69775			"Asia/Shanghai|Asia/Harbin",
69776			"Asia/Shanghai|PRC",
69777			"Asia/Taipei|ROC",
69778			"Asia/Tehran|Iran",
69779			"Asia/Thimphu|Asia/Thimbu",
69780			"Asia/Tokyo|Japan",
69781			"Asia/Ulaanbaatar|Asia/Ulan_Bator",
69782			"Asia/Urumqi|Asia/Kashgar",
69783			"Atlantic/Faroe|Atlantic/Faeroe",
69784			"Atlantic/Reykjavik|Iceland",
69785			"Atlantic/South_Georgia|Etc/GMT+2",
69786			"Australia/Adelaide|Australia/South",
69787			"Australia/Brisbane|Australia/Queensland",
69788			"Australia/Broken_Hill|Australia/Yancowinna",
69789			"Australia/Darwin|Australia/North",
69790			"Australia/Hobart|Australia/Tasmania",
69791			"Australia/Lord_Howe|Australia/LHI",
69792			"Australia/Melbourne|Australia/Victoria",
69793			"Australia/Perth|Australia/West",
69794			"Australia/Sydney|Australia/ACT",
69795			"Australia/Sydney|Australia/Canberra",
69796			"Australia/Sydney|Australia/NSW",
69797			"Etc/GMT-0|Etc/GMT",
69798			"Etc/GMT-0|Etc/GMT+0",
69799			"Etc/GMT-0|Etc/GMT0",
69800			"Etc/GMT-0|Etc/Greenwich",
69801			"Etc/GMT-0|GMT",
69802			"Etc/GMT-0|GMT+0",
69803			"Etc/GMT-0|GMT-0",
69804			"Etc/GMT-0|GMT0",
69805			"Etc/GMT-0|Greenwich",
69806			"Etc/UTC|Etc/UCT",
69807			"Etc/UTC|Etc/Universal",
69808			"Etc/UTC|Etc/Zulu",
69809			"Etc/UTC|UCT",
69810			"Etc/UTC|UTC",
69811			"Etc/UTC|Universal",
69812			"Etc/UTC|Zulu",
69813			"Europe/Belgrade|Europe/Ljubljana",
69814			"Europe/Belgrade|Europe/Podgorica",
69815			"Europe/Belgrade|Europe/Sarajevo",
69816			"Europe/Belgrade|Europe/Skopje",
69817			"Europe/Belgrade|Europe/Zagreb",
69818			"Europe/Chisinau|Europe/Tiraspol",
69819			"Europe/Dublin|Eire",
69820			"Europe/Helsinki|Europe/Mariehamn",
69821			"Europe/Istanbul|Asia/Istanbul",
69822			"Europe/Istanbul|Turkey",
69823			"Europe/Lisbon|Portugal",
69824			"Europe/London|Europe/Belfast",
69825			"Europe/London|Europe/Guernsey",
69826			"Europe/London|Europe/Isle_of_Man",
69827			"Europe/London|Europe/Jersey",
69828			"Europe/London|GB",
69829			"Europe/London|GB-Eire",
69830			"Europe/Moscow|W-SU",
69831			"Europe/Oslo|Arctic/Longyearbyen",
69832			"Europe/Oslo|Atlantic/Jan_Mayen",
69833			"Europe/Prague|Europe/Bratislava",
69834			"Europe/Rome|Europe/San_Marino",
69835			"Europe/Rome|Europe/Vatican",
69836			"Europe/Warsaw|Poland",
69837			"Europe/Zurich|Europe/Busingen",
69838			"Europe/Zurich|Europe/Vaduz",
69839			"Indian/Christmas|Etc/GMT-7",
69840			"Pacific/Auckland|Antarctica/McMurdo",
69841			"Pacific/Auckland|Antarctica/South_Pole",
69842			"Pacific/Auckland|NZ",
69843			"Pacific/Chatham|NZ-CHAT",
69844			"Pacific/Chuuk|Pacific/Truk",
69845			"Pacific/Chuuk|Pacific/Yap",
69846			"Pacific/Easter|Chile/EasterIsland",
69847			"Pacific/Guam|Pacific/Saipan",
69848			"Pacific/Honolulu|Pacific/Johnston",
69849			"Pacific/Honolulu|US/Hawaii",
69850			"Pacific/Kwajalein|Kwajalein",
69851			"Pacific/Pago_Pago|Pacific/Midway",
69852			"Pacific/Pago_Pago|Pacific/Samoa",
69853			"Pacific/Pago_Pago|US/Samoa",
69854			"Pacific/Palau|Etc/GMT-9",
69855			"Pacific/Pohnpei|Pacific/Ponape",
69856			"Pacific/Port_Moresby|Etc/GMT-10",
69857			"Pacific/Tarawa|Etc/GMT-12",
69858			"Pacific/Tarawa|Pacific/Funafuti",
69859			"Pacific/Tarawa|Pacific/Wake",
69860			"Pacific/Tarawa|Pacific/Wallis"
69861		],
69862		"countries": [
69863			"AD|Europe/Andorra",
69864			"AE|Asia/Dubai",
69865			"AF|Asia/Kabul",
69866			"AG|America/Port_of_Spain America/Antigua",
69867			"AI|America/Port_of_Spain America/Anguilla",
69868			"AL|Europe/Tirane",
69869			"AM|Asia/Yerevan",
69870			"AO|Africa/Lagos Africa/Luanda",
69871			"AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo",
69872			"AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia",
69873			"AS|Pacific/Pago_Pago",
69874			"AT|Europe/Vienna",
69875			"AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Currie Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla",
69876			"AW|America/Curacao America/Aruba",
69877			"AX|Europe/Helsinki Europe/Mariehamn",
69878			"AZ|Asia/Baku",
69879			"BA|Europe/Belgrade Europe/Sarajevo",
69880			"BB|America/Barbados",
69881			"BD|Asia/Dhaka",
69882			"BE|Europe/Brussels",
69883			"BF|Africa/Abidjan Africa/Ouagadougou",
69884			"BG|Europe/Sofia",
69885			"BH|Asia/Qatar Asia/Bahrain",
69886			"BI|Africa/Maputo Africa/Bujumbura",
69887			"BJ|Africa/Lagos Africa/Porto-Novo",
69888			"BL|America/Port_of_Spain America/St_Barthelemy",
69889			"BM|Atlantic/Bermuda",
69890			"BN|Asia/Brunei",
69891			"BO|America/La_Paz",
69892			"BQ|America/Curacao America/Kralendijk",
69893			"BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco",
69894			"BS|America/Nassau",
69895			"BT|Asia/Thimphu",
69896			"BW|Africa/Maputo Africa/Gaborone",
69897			"BY|Europe/Minsk",
69898			"BZ|America/Belize",
69899			"CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Vancouver America/Whitehorse America/Dawson",
69900			"CC|Indian/Cocos",
69901			"CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi",
69902			"CF|Africa/Lagos Africa/Bangui",
69903			"CG|Africa/Lagos Africa/Brazzaville",
69904			"CH|Europe/Zurich",
69905			"CI|Africa/Abidjan",
69906			"CK|Pacific/Rarotonga",
69907			"CL|America/Santiago America/Punta_Arenas Pacific/Easter",
69908			"CM|Africa/Lagos Africa/Douala",
69909			"CN|Asia/Shanghai Asia/Urumqi",
69910			"CO|America/Bogota",
69911			"CR|America/Costa_Rica",
69912			"CU|America/Havana",
69913			"CV|Atlantic/Cape_Verde",
69914			"CW|America/Curacao",
69915			"CX|Indian/Christmas",
69916			"CY|Asia/Nicosia Asia/Famagusta",
69917			"CZ|Europe/Prague",
69918			"DE|Europe/Zurich Europe/Berlin Europe/Busingen",
69919			"DJ|Africa/Nairobi Africa/Djibouti",
69920			"DK|Europe/Copenhagen",
69921			"DM|America/Port_of_Spain America/Dominica",
69922			"DO|America/Santo_Domingo",
69923			"DZ|Africa/Algiers",
69924			"EC|America/Guayaquil Pacific/Galapagos",
69925			"EE|Europe/Tallinn",
69926			"EG|Africa/Cairo",
69927			"EH|Africa/El_Aaiun",
69928			"ER|Africa/Nairobi Africa/Asmara",
69929			"ES|Europe/Madrid Africa/Ceuta Atlantic/Canary",
69930			"ET|Africa/Nairobi Africa/Addis_Ababa",
69931			"FI|Europe/Helsinki",
69932			"FJ|Pacific/Fiji",
69933			"FK|Atlantic/Stanley",
69934			"FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae",
69935			"FO|Atlantic/Faroe",
69936			"FR|Europe/Paris",
69937			"GA|Africa/Lagos Africa/Libreville",
69938			"GB|Europe/London",
69939			"GD|America/Port_of_Spain America/Grenada",
69940			"GE|Asia/Tbilisi",
69941			"GF|America/Cayenne",
69942			"GG|Europe/London Europe/Guernsey",
69943			"GH|Africa/Accra",
69944			"GI|Europe/Gibraltar",
69945			"GL|America/Godthab America/Danmarkshavn America/Scoresbysund America/Thule",
69946			"GM|Africa/Abidjan Africa/Banjul",
69947			"GN|Africa/Abidjan Africa/Conakry",
69948			"GP|America/Port_of_Spain America/Guadeloupe",
69949			"GQ|Africa/Lagos Africa/Malabo",
69950			"GR|Europe/Athens",
69951			"GS|Atlantic/South_Georgia",
69952			"GT|America/Guatemala",
69953			"GU|Pacific/Guam",
69954			"GW|Africa/Bissau",
69955			"GY|America/Guyana",
69956			"HK|Asia/Hong_Kong",
69957			"HN|America/Tegucigalpa",
69958			"HR|Europe/Belgrade Europe/Zagreb",
69959			"HT|America/Port-au-Prince",
69960			"HU|Europe/Budapest",
69961			"ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura",
69962			"IE|Europe/Dublin",
69963			"IL|Asia/Jerusalem",
69964			"IM|Europe/London Europe/Isle_of_Man",
69965			"IN|Asia/Kolkata",
69966			"IO|Indian/Chagos",
69967			"IQ|Asia/Baghdad",
69968			"IR|Asia/Tehran",
69969			"IS|Atlantic/Reykjavik",
69970			"IT|Europe/Rome",
69971			"JE|Europe/London Europe/Jersey",
69972			"JM|America/Jamaica",
69973			"JO|Asia/Amman",
69974			"JP|Asia/Tokyo",
69975			"KE|Africa/Nairobi",
69976			"KG|Asia/Bishkek",
69977			"KH|Asia/Bangkok Asia/Phnom_Penh",
69978			"KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati",
69979			"KM|Africa/Nairobi Indian/Comoro",
69980			"KN|America/Port_of_Spain America/St_Kitts",
69981			"KP|Asia/Pyongyang",
69982			"KR|Asia/Seoul",
69983			"KW|Asia/Riyadh Asia/Kuwait",
69984			"KY|America/Panama America/Cayman",
69985			"KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral",
69986			"LA|Asia/Bangkok Asia/Vientiane",
69987			"LB|Asia/Beirut",
69988			"LC|America/Port_of_Spain America/St_Lucia",
69989			"LI|Europe/Zurich Europe/Vaduz",
69990			"LK|Asia/Colombo",
69991			"LR|Africa/Monrovia",
69992			"LS|Africa/Johannesburg Africa/Maseru",
69993			"LT|Europe/Vilnius",
69994			"LU|Europe/Luxembourg",
69995			"LV|Europe/Riga",
69996			"LY|Africa/Tripoli",
69997			"MA|Africa/Casablanca",
69998			"MC|Europe/Monaco",
69999			"MD|Europe/Chisinau",
70000			"ME|Europe/Belgrade Europe/Podgorica",
70001			"MF|America/Port_of_Spain America/Marigot",
70002			"MG|Africa/Nairobi Indian/Antananarivo",
70003			"MH|Pacific/Majuro Pacific/Kwajalein",
70004			"MK|Europe/Belgrade Europe/Skopje",
70005			"ML|Africa/Abidjan Africa/Bamako",
70006			"MM|Asia/Yangon",
70007			"MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan",
70008			"MO|Asia/Macau",
70009			"MP|Pacific/Guam Pacific/Saipan",
70010			"MQ|America/Martinique",
70011			"MR|Africa/Abidjan Africa/Nouakchott",
70012			"MS|America/Port_of_Spain America/Montserrat",
70013			"MT|Europe/Malta",
70014			"MU|Indian/Mauritius",
70015			"MV|Indian/Maldives",
70016			"MW|Africa/Maputo Africa/Blantyre",
70017			"MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas",
70018			"MY|Asia/Kuala_Lumpur Asia/Kuching",
70019			"MZ|Africa/Maputo",
70020			"NA|Africa/Windhoek",
70021			"NC|Pacific/Noumea",
70022			"NE|Africa/Lagos Africa/Niamey",
70023			"NF|Pacific/Norfolk",
70024			"NG|Africa/Lagos",
70025			"NI|America/Managua",
70026			"NL|Europe/Amsterdam",
70027			"NO|Europe/Oslo",
70028			"NP|Asia/Kathmandu",
70029			"NR|Pacific/Nauru",
70030			"NU|Pacific/Niue",
70031			"NZ|Pacific/Auckland Pacific/Chatham",
70032			"OM|Asia/Dubai Asia/Muscat",
70033			"PA|America/Panama",
70034			"PE|America/Lima",
70035			"PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier",
70036			"PG|Pacific/Port_Moresby Pacific/Bougainville",
70037			"PH|Asia/Manila",
70038			"PK|Asia/Karachi",
70039			"PL|Europe/Warsaw",
70040			"PM|America/Miquelon",
70041			"PN|Pacific/Pitcairn",
70042			"PR|America/Puerto_Rico",
70043			"PS|Asia/Gaza Asia/Hebron",
70044			"PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores",
70045			"PW|Pacific/Palau",
70046			"PY|America/Asuncion",
70047			"QA|Asia/Qatar",
70048			"RE|Indian/Reunion",
70049			"RO|Europe/Bucharest",
70050			"RS|Europe/Belgrade",
70051			"RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Astrakhan Europe/Volgograd Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr",
70052			"RW|Africa/Maputo Africa/Kigali",
70053			"SA|Asia/Riyadh",
70054			"SB|Pacific/Guadalcanal",
70055			"SC|Indian/Mahe",
70056			"SD|Africa/Khartoum",
70057			"SE|Europe/Stockholm",
70058			"SG|Asia/Singapore",
70059			"SH|Africa/Abidjan Atlantic/St_Helena",
70060			"SI|Europe/Belgrade Europe/Ljubljana",
70061			"SJ|Europe/Oslo Arctic/Longyearbyen",
70062			"SK|Europe/Prague Europe/Bratislava",
70063			"SL|Africa/Abidjan Africa/Freetown",
70064			"SM|Europe/Rome Europe/San_Marino",
70065			"SN|Africa/Abidjan Africa/Dakar",
70066			"SO|Africa/Nairobi Africa/Mogadishu",
70067			"SR|America/Paramaribo",
70068			"SS|Africa/Juba",
70069			"ST|Africa/Sao_Tome",
70070			"SV|America/El_Salvador",
70071			"SX|America/Curacao America/Lower_Princes",
70072			"SY|Asia/Damascus",
70073			"SZ|Africa/Johannesburg Africa/Mbabane",
70074			"TC|America/Grand_Turk",
70075			"TD|Africa/Ndjamena",
70076			"TF|Indian/Reunion Indian/Kerguelen",
70077			"TG|Africa/Abidjan Africa/Lome",
70078			"TH|Asia/Bangkok",
70079			"TJ|Asia/Dushanbe",
70080			"TK|Pacific/Fakaofo",
70081			"TL|Asia/Dili",
70082			"TM|Asia/Ashgabat",
70083			"TN|Africa/Tunis",
70084			"TO|Pacific/Tongatapu",
70085			"TR|Europe/Istanbul",
70086			"TT|America/Port_of_Spain",
70087			"TV|Pacific/Funafuti",
70088			"TW|Asia/Taipei",
70089			"TZ|Africa/Nairobi Africa/Dar_es_Salaam",
70090			"UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye",
70091			"UG|Africa/Nairobi Africa/Kampala",
70092			"UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway",
vendor: 5,109 bytes, lines 70093-70123
70093			"US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu",
70094			"UY|America/Montevideo",
70095			"UZ|Asia/Samarkand Asia/Tashkent",
70096			"VA|Europe/Rome Europe/Vatican",
70097			"VC|America/Port_of_Spain America/St_Vincent",
70098			"VE|America/Caracas",
70099			"VG|America/Port_of_Spain America/Tortola",
70100			"VI|America/Port_of_Spain America/St_Thomas",
70101			"VN|Asia/Bangkok Asia/Ho_Chi_Minh",
70102			"VU|Pacific/Efate",
70103			"WF|Pacific/Wallis",
70104			"WS|Pacific/Apia",
70105			"YE|Asia/Riyadh Asia/Aden",
70106			"YT|Africa/Nairobi Indian/Mayotte",
70107			"ZA|Africa/Johannesburg",
70108			"ZM|Africa/Maputo Africa/Lusaka",
70109			"ZW|Africa/Maputo Africa/Harare"
70110		]
70111	});
70112
70113
70114	return moment;
70115}));
70116
70117/**
70118 * Minified by jsDelivr using Terser v3.14.1.
70119 * Original file: /npm/[email protected]/lib/unorm.js
70120 * 
70121 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
70122 */
70123!function(t){"use strict";for(var r=[null,0,{}],e=10,n=44032,i=4352,o=4449,s=4519,u=19,f=21,a=28,h=f*a,c=u*h,l=function(t,r){this.codepoint=t,this.feature=r},p={},C=[],d=0;d<=255;++d)C[d]=0;var g=[function(t,e,n){return e<60||13311<e&&e<42607?new l(e,r):t(e,n)},function(t,r,n){var i=p[r];return i||(i=t(r,n)).feature&&++C[r>>8&255]>e&&(p[r]=i),i},function(t,r,e){return e?t(r,e):new l(r,null)},function(t,r,e){var p;if(r<i||i+u<=r&&r<n||n+c<r)return t(r,e);if(i<=r&&r<i+u){var C={},d=(r-i)*f;for(p=0;p<f;++p)C[o+p]=n+a*(p+d);return new l(r,[,,C])}var g=r-n,v=g%a,w=[];if(0!==v)w[0]=[n+g-v,s+v];else for(w[0]=[i+Math.floor(g/h),o+Math.floor(g%h/a)],w[2]={},p=1;p<a;++p)w[2][s+p]=r+p;return new l(r,w)},function(t,e,n){var i=65280&e,o=(l.udata[i]||{})[e];return new l(e,o||r)}];l.fromCharCode=g.reduceRight(function(t,r){return function(e,n){return r(t,e,n)}},null),l.isHighSurrogate=function(t){return t>=55296&&t<=56319},l.isLowSurrogate=function(t){return t>=56320&&t<=57343},l.prototype.prepFeature=function(){this.feature||(this.feature=l.fromCharCode(this.codepoint,!0).feature)},l.prototype.toString=function(){if(this.codepoint<65536)return String.fromCharCode(this.codepoint);var t=this.codepoint-65536;return String.fromCharCode(Math.floor(t/1024)+55296,t%1024+56320)},l.prototype.getDecomp=function(){return this.prepFeature(),this.feature[0]||null},l.prototype.isCompatibility=function(){return this.prepFeature(),!!this.feature[1]&&256&this.feature[1]},l.prototype.isExclude=function(){return this.prepFeature(),!!this.feature[1]&&512&this.feature[1]},l.prototype.getCanonicalClass=function(){return this.prepFeature(),this.feature[1]?255&this.feature[1]:0},l.prototype.getComposite=function(t){if(this.prepFeature(),!this.feature[2])return null;var r=this.feature[2][t.codepoint];return r?l.fromCharCode(r):null};var v=function(t){this.str=t,this.cursor=0};v.prototype.next=function(){if(this.str&&this.cursor<this.str.length){var t,r=this.str.charCodeAt(this.cursor++);return l.isHighSurrogate(r)&&this.cursor<this.str.length&&l.isLowSurrogate(t=this.str.charCodeAt(this.cursor))&&(r=1024*(r-55296)+(t-56320)+65536,++this.cursor),l.fromCharCode(r)}return this.str=null,null};var w=function(t,r){this.it=t,this.canonical=r,this.resBuf=[]};w.prototype.next=function(){if(0===this.resBuf.length){var t=this.it.next();if(!t)return null;this.resBuf=function t(r,e){var n=e.getDecomp();if(!n||r&&e.isCompatibility())return[e];for(var i=[],o=0;o<n.length;++o){var s=t(r,l.fromCharCode(n[o]));i=i.concat(s)}return i}(this.canonical,t)}return this.resBuf.shift()};var m=function(t){this.it=t,this.resBuf=[]};m.prototype.next=function(){var t;if(0===this.resBuf.length)do{var r=this.it.next();if(!r)break;t=r.getCanonicalClass();var e=this.resBuf.length;if(0!==t)for(;e>0;--e){if(this.resBuf[e-1].getCanonicalClass()<=t)break}this.resBuf.splice(e,0,r)}while(0!==t);return this.resBuf.shift()};var B=function(t){this.it=t,this.procBuf=[],this.resBuf=[],this.lastClass=null};B.prototype.next=function(){for(;0===this.resBuf.length;){var t=this.it.next();if(!t){this.resBuf=this.procBuf,this.procBuf=[];break}if(0===this.procBuf.length)this.lastClass=t.getCanonicalClass(),this.procBuf.push(t);else{var r=this.procBuf[0].getComposite(t),e=t.getCanonicalClass();r&&(this.lastClass<e||0===this.lastClass)?this.procBuf[0]=r:(0===e&&(this.resBuf=this.procBuf,this.procBuf=[]),this.lastClass=e,this.procBuf.push(t))}}return this.resBuf.shift()};var y=function(t,r){for(var e,n=function(t,r){switch(t){case"NFD":return new m(new w(new v(r),!0));case"NFKD":return new m(new w(new v(r),!1));case"NFC":return new B(new m(new w(new v(r),!0)));case"NFKC":return new B(new m(new w(new v(r),!1)))}
70123throw t+" is invalid"}(t,r),i="";e=n.next();)i+=e.toString();return i};l
vendor: 30,878 bytes, line 70123
70123.udata={0:{60:[,,{824:8814}],61:[,,{824:8800}],62:[,,{824:8815}],65:[,,{768:192,769:193,770:194,771:195,772:256,774:258,775:550,776:196,777:7842,778:197,780:461,783:512,785:514,803:7840,805:7680,808:260}],66:[,,{775:7682,803:7684,817:7686}],67:[,,{769:262,770:264,775:266,780:268,807:199}],68:[,,{775:7690,780:270,803:7692,807:7696,813:7698,817:7694}],69:[,,{768:200,769:201,770:202,771:7868,772:274,774:276,775:278,776:203,777:7866,780:282,783:516,785:518,803:7864,807:552,808:280,813:7704,816:7706}],70:[,,{775:7710}],71:[,,{769:500,770:284,772:7712,774:286,775:288,780:486,807:290}],72:[,,{770:292,775:7714,776:7718,780:542,803:7716,807:7720,814:7722}],73:[,,{768:204,769:205,770:206,771:296,772:298,774:300,775:304,776:207,777:7880,780:463,783:520,785:522,803:7882,808:302,816:7724}],74:[,,{770:308}],75:[,,{769:7728,780:488,803:7730,807:310,817:7732}],76:[,,{769:313,780:317,803:7734,807:315,813:7740,817:7738}],77:[,,{769:7742,775:7744,803:7746}],78:[,,{768:504,769:323,771:209,775:7748,780:327,803:7750,807:325,813:7754,817:7752}],79:[,,{768:210,769:211,770:212,771:213,772:332,774:334,775:558,776:214,777:7886,779:336,780:465,783:524,785:526,795:416,803:7884,808:490}],80:[,,{769:7764,775:7766}],82:[,,{769:340,775:7768,780:344,783:528,785:530,803:7770,807:342,817:7774}],83:[,,{769:346,770:348,775:7776,780:352,803:7778,806:536,807:350}],84:[,,{775:7786,780:356,803:7788,806:538,807:354,813:7792,817:7790}],85:[,,{768:217,769:218,770:219,771:360,772:362,774:364,776:220,777:7910,778:366,779:368,780:467,783:532,785:534,795:431,803:7908,804:7794,808:370,813:7798,816:7796}],86:[,,{771:7804,803:7806}],87:[,,{768:7808,769:7810,770:372,775:7814,776:7812,803:7816}],88:[,,{775:7818,776:7820}],89:[,,{768:7922,769:221,770:374,771:7928,772:562,775:7822,776:376,777:7926,803:7924}],90:[,,{769:377,770:7824,775:379,780:381,803:7826,817:7828}],97:[,,{768:224,769:225,770:226,771:227,772:257,774:259,775:551,776:228,777:7843,778:229,780:462,783:513,785:515,803:7841,805:7681,808:261}],98:[,,{775:7683,803:7685,817:7687}],99:[,,{769:263,770:265,775:267,780:269,807:231}],100:[,,{775:7691,780:271,803:7693,807:7697,813:7699,817:7695}],101:[,,{768:232,769:233,770:234,771:7869,772:275,774:277,775:279,776:235,777:7867,780:283,783:517,785:519,803:7865,807:553,808:281,813:7705,816:7707}],102:[,,{775:7711}],103:[,,{769:501,770:285,772:7713,774:287,775:289,780:487,807:291}],104:[,,{770:293,775:7715,776:7719,780:543,803:7717,807:7721,814:7723,817:7830}],105:[,,{768:236,769:237,770:238,771:297,772:299,774:301,776:239,777:7881,780:464,783:521,785:523,803:7883,808:303,816:7725}],106:[,,{770:309,780:496}],107:[,,{769:7729,780:489,803:7731,807:311,817:7733}],108:[,,{769:314,780:318,803:7735,807:316,813:7741,817:7739}],109:[,,{769:7743,775:7745,803:7747}],110:[,,{768:505,769:324,771:241,775:7749,780:328,803:7751,807:326,813:7755,817:7753}],111:[,,{768:242,769:243,770:244,771:245,772:333,774:335,775:559,776:246,777:7887,779:337,780:466,783:525,785:527,795:417,803:7885,808:491}],112:[,,{769:7765,775:7767}],114:[,,{769:341,775:7769,780:345,783:529,785:531,803:7771,807:343,817:7775}],115:[,,{769:347,770:349,775:7777,780:353,803:7779,806:537,807:351}],116:[,,{775:7787,776:7831,780:357,803:7789,806:539,807:355,813:7793,817:7791}],117:[,,{768:249,769:250,770:251,771:361,772:363,774:365,776:252,777:7911,778:367,779:369,780:468,783:533,785:535,795:432,803:7909,804:7795,808:371,813:7799,816:7797}],118:[,,{771:7805,803:7807}],119:[,,{768:7809,769:7811,770:373,775:7815,776:7813,778:7832,803:7817}],120:[,,{775:7819,776:7821}],121:[,,{768:7923,769:253,770:375,771:7929,772:563,775:7823,776:255,777:7927,778:7833,803:7925}],122:[,,{769:378,770:7825,775:380,780:382,803:7827,817:7829}],160:[[32],256],168:[[32,776],256,{768:8173,769:901,834:8129}],170:[[97],256],175:[[32,772],256],178:[[50],256],179:[[51],256],180:[[32,769],256],181:[[956],256],184:[[32,807],256],185:[[49],256],186:[[111],256],188:[[49,8260,52],256],189:[[49,8260,50],256],190:[[51,8260,52],256],192:[[65,768]],193:[[65,769]],194:[[65,770],,{768:7846,769:7844,771:7850,777:7848}],195:[[65,771]],196:[[65,776],,{772:478}],197:[[65,778],,{769:506}],198:[,,{769:508,772:482}],199:[[67,807],,{769:7688}],200:[[69,768]],201:[[69,769]],202:[[69,770],,{768:7872,769:7870,771:7876,777:7874}],203:[[69,776]],204:[[73,768]],205:[[73,769]],206:[[73,770]],207:[[73,776],,{769:7726}],209:[[78,771]],210:[[79,768]],211:[[79,769]],212:[[79,770],,{768:7890,769:7888,771:7894,777:7892}],213:[[79,771],,{769:7756,772:556,776:7758}],214:[[79,776],,{772:554}],216:[,,{769:510}],217:[[85,768]],218:[[85,769]],219:[[85,770]],220:[[85,776],,{768:475,769:471,772:469,780:473}],221:[[89,769]],224:[[97,768]],225:[[97,769]],226:[[97,770],,{768:7847,769:7845,771:7851,777:7849}],227:[[97,771]],228:[[97,776],,{772:479}],229:[[97,778],,{769:507}],230:[,,{769:509,772:483}],231:[[99,807],,{769:7689}],232:[[101,768]],233:[[101,769]],234:[[101,770],,{768:7873,769:7871,771:7877,777:7875}],235:[[101,776]],236:[[105,768]],237:[[105,769]],238:[[105,770]],239:[[105,776],,{769:7727}],241:[[110,771]],242:[[111,768]],243:[[111,769]],244:[[111,770],,{768:7891,769:7889,771:7895,777:7893}],245:[[111,771],,{769:7757,772:557,776:7759}],246:[[111,776],,{772:555}],248:[,,{769:511}],249:[[117,768]],250:[[117,769]],251:[[117,770]],252:[[117,776],,{768:476,769:472,772:470,780:474}],253:[[121,769]],255:[[121,776]]},256:{256:[[65,772]],257:[[97,772]],258:[[65,774],,{768:7856,769:7854,771:7860,777:7858}],259:[[97,774],,{768:7857,769:7855,771:7861,777:7859}],260:[[65,808]],261:[[97,808]],262:[[67,769]],263:[[99,769]],264:[[67,770]],265:[[99,770]],266:[[67,775]],267:[[99,775]],268:[[67,780]],269:[[99,780]],270:[[68,780]],271:[[100,780]],274:[[69,772],,{768:7700,769:7702}],275:[[101,772],,{768:7701,769:7703}],276:[[69,774]],277:[[101,774]],278:[[69,775]],279:[[101,775]],280:[[69,808]],281:[[101,808]],282:[[69,780]],283:[[101,780]],284:[[71,770]],285:[[103,770]],286:[[71,774]],287:[[103,774]],288:[[71,775]],289:[[103,775]],290:[[71,807]],291:[[103,807]],292:[[72,770]],293:[[104,770]],296:[[73,771]],297:[[105,771]],298:[[73,772]],299:[[105,772]],300:[[73,774]],301:[[105,774]],302:[[73,808]],303:[[105,808]],304:[[73,775]],306:[[73,74],256],307:[[105,106],256],308:[[74,770]],309:[[106,770]],310:[[75,807]],311:[[107,807]],313:[[76,769]],314:[[108,769]],315:[[76,807]],316:[[108,807]],317:[[76,780]],318:[[108,780]],319:[[76,183],256],320:[[108,183],256],323:[[78,769]],324:[[110,769]],325:[[78,807]],326:[[110,807]],327:[[78,780]],328:[[110,780]],329:[[700,110],256],332:[[79,772],,{768:7760,769:7762}],333:[[111,772],,{768:7761,769:7763}],334:[[79,774]],335:[[111,774]],336:[[79,779]],337:[[111,779]],340:[[82,769]],341:[[114,769]],342:[[82,807]],343:[[114,807]],344:[[82,780]],345:[[114,780]],346:[[83,769],,{775:7780}],347:[[115,769],,{775:7781}],348:[[83,770]],349:[[115,770]],350:[[83,807]],351:[[115,807]],352:[[83,780],,{775:7782}],353:[[115,780],,{775:7783}],354:[[84,807]],355:[[116,807]],356:[[84,780]],357:[[116,780]],360:[[85,771],,{769:7800}],361:[[117,771],,{769:7801}],362:[[85,772],,{776:7802}],363:[[117,772],,{776:7803}],364:[[85,774]],365:[[117,774]],366:[[85,778]],367:[[117,778]],368:[[85,779]],369:[[117,779]],370:[[85,808]],371:[[117,808]],372:[[87,770]],373:[[119,770]],374:[[89,770]],375:[[121,770]],376:[[89,776]],377:[[90,769]],378:[[122,769]],379:[[90,775]],380:[[122,775]],381:[[90,780]],382:[[122,780]],383:[[115],256,{775:7835}],416:[[79,795],,{768:7900,769:7898,771:7904,777:7902,803:7906}],417:[[111,795],,{768:7901,769:7899,771:7905,777:7903,803:7907}],431:[[85,795],,{768:7914,769:7912,771:7918,777:7916,803:7920}],432:[[117,795],,{768:7915,769:7913,771:7919,777:7917,803:7921}],439:[,,{780:494}],452:[[68,381],256],453:[[68,382],256],454:[[100,382],256],455:[[76,74],256],456:[[76,106],256],457:[[108,106],256],458:[[78,74],256],459:[[78,106],256],460:[[110,106],256],461:[[65,780]],462:[[97,780]],463:[[73,780]],464:[[105,780]],465:[[79,780]],466:[[111,780]],467:[[85,780]],468:[[117,780]],469:[[220,772]],470:[[252,772]],471:[[220,769]],472:[[252,769]],473:[[220,780]],474:[[252,780]],475:[[220,768]],476:[[252,768]],478:[[196,772]],479:[[228,772]],480:[[550,772]],481:[[551,772]],482:[[198,772]],483:[[230,772]],486:[[71,780]],487:[[103,780]],488:[[75,780]],489:[[107,780]],490:[[79,808],,{772:492}],491:[[111,808],,{772:493}],492:[[490,772]],493:[[491,772]],494:[[439,780]],495:[[658,780]],496:[[106,780]],497:[[68,90],256],498:[[68,122],256],499:[[100,122],256],500:[[71,769]],501:[[103,769]],504:[[78,768]],505:[[110,768]],506:[[197,769]],507:[[229,769]],508:[[198,769]],509:[[230,769]],510:[[216,769]],511:[[248,769]],66045:[,220]},512:{512:[[65,783]],513:[[97,783]],514:[[65,785]],515:[[97,785]],516:[[69,783]],517:[[101,783]],518:[[69,785]],519:[[101,785]],520:[[73,783]],521:[[105,783]],522:[[73,785]],523:[[105,785]],524:[[79,783]],525:[[111,783]],526:[[79,785]],527:[[111,785]],528:[[82,783]],529:[[114,783]],530:[[82,785]],531:[[114,785]],532:[[85,783]],533:[[117,783]],534:[[85,785]],535:[[117,785]],536:[[83,806]],537:[[115,806]],538:[[84,806]],539:[[116,806]],542:[[72,780]],543:[[104,780]],550:[[65,775],,{772:480}],551:[[97,775],,{772:481}],552:[[69,807],,{774:7708}],553:[[101,807],,{774:7709}],554:[[214,772]],555:[[246,772]],556:[[213,772]],557:[[245,772]],558:[[79,775],,{772:560}],559:[[111,775],,{772:561}],560:[[558,772]],561:[[559,772]],562:[[89,772]],563:[[121,772]],658:[,,{780:495}],688:[[104],256],689:[[614],256],690:[[106],256],691:[[114],256],692:[[633],256],693:[[635],256],694:[[641],256],695:[[119],256],696:[[121],256],728:[[32,774],256],729:[[32,775],256],730:[[32,778],256],731:[[32,808],256],732:[[32,771],256],733:[[32,779],256],736:[[611],256],737:[[108],256],738:[[115],256],739:[[120],256],740:[[661],256],66272:[,220]},768:{768:[,230],769:[,230],770:[,230],771:[,230],772:[,230],773:[,230],774:[,230],775:[,230],776:[,230,{769:836}],777:[,230],778:[,230],779:[,230],780:[,230],781:[,230],782:[,230],783:[,230],784:[,230],785:[,230],786:[,230],787:[,230],788:[,230],789:[,232],790:[,220],791:[,220],792:[,220],793:[,220],794:[,232],795:[,216],796:[,220],797:[,220],798:[,220],799:[,220],800:[,220],801:[,202],802:[,202],803:[,220],804:[,220],805:[,220],806:[,220],807:[,202],808:[,202],809:[,220],810:[,220],811:[,220],812:[,220],813:[,220],814:[,220],815:[,220],816:[,220],817:[,220],818:[,220],819:[,220],820:[,1],821:[,1],822:[,1],823:[,1],824:[,1],825:[,220],826:[,220],827:[,220],828:[,220],829:[,230],830:[,230],831:[,230],832:[[768],230],833:[[769],230],834:[,230],835:[[787],230],836:[[776,769],230],837:[,240],838:[,230],839:[,220],840:[,220],841:[,220],842:[,230],843:[,230],844:[,230],845:[,220],846:[,220],848:[,230],849:[,230],850:[,230],851:[,220],852:[,220],853:[,220],854:[,220],855:[,230],856:[,232],857:[,220],858:[,220],859:[,230],860:[,233],861:[,234],862:[,234],863:[,233],864:[,234],865:[,234],866:[,233],867:[,230],868:[,230],869:[,230],870:[,230],871:[,230],872:[,230],873:[,230],874:[,230],875:[,230],876:[,230],877:[,230],878:[,230],879:[,230],884:[[697]],890:[[32,837],256],894:[[59]],900:[[32,769],256],901:[[168,769]],902:[[913,769]],903:[[183]],904:[[917,769]],905:[[919,769]],906:[[921,769]],908:[[927,769]],910:[[933,769]],911:[[937,769]],912:[[970,769]],913:[,,{768:8122,769:902,772:8121,774:8120,787:7944,788:7945,837:8124}],917:[,,{768:8136,769:904,787:7960,788:7961}],919:[,,{768:8138,769:905,787:7976,788:7977,837:8140}],921:[,,{768:8154,769:906,772:8153,774:8152,776:938,787:7992,788:7993}],927:[,,{768:8184,769:908,787:8008,788:8009}],929:[,,{788:8172}],933:[,,{768:8170,769:910,772:8169,774:8168,776:939,788:8025}],937:[,,{768:8186,769:911,787:8040,788:8041,837:8188}],938:[[921,776]],939:[[933,776]],940:[[945,769],,{837:8116}],941:[[949,769]],942:[[951,769],,{837:8132}],943:[[953,769]],944:[[971,769]],945:[,,{768:8048,769:940,772:8113,774:8112,787:7936,788:7937,834:8118,837:8115}],949:[,,{768:8050,769:941,787:7952,788:7953}],951:[,,{768:8052,769:942,787:7968,788:7969,834:8134,837:8131}],953:[,,{768:8054,769:943,772:8145,774:8144,776:970,787:7984,788:7985,834:8150}],959:[,,{768:8056,769:972,787:8e3,788:8001}],961:[,,{787:8164,788:8165}],965:[,,{768:8058,769:973,772:8161,774:8160,776:971,787:8016,788:8017,834:8166}],969:[,,{768:8060,769:974,787:8032,788:8033,834:8182,837:8179}],970:[[953,776],,{768:8146,769:912,834:8151}],971:[[965,776],,{768:8162,769:944,834:8167}],972:[[959,769]],973:[[965,769]],974:[[969,769],,{837:8180}],976:[[946],256],977:[[952],256],978:[[933],256,{769:979,776:980}],979:[[978,769]],980:[[978,776]],981:[[966],256],982:[[960],256],1008:[[954],256],1009:[[961],256],1010:[[962],256],1012:[[920],256],1013:[[949],256],1017:[[931],256],66422:[,230],66423:[,230],66424:[,230],66425:[,230],66426:[,230]},1024:{1024:[[1045,768]],1025:[[1045,776]],1027:[[1043,769]],1030:[,,{776:1031}],1031:[[1030,776]],1036:[[1050,769]],1037:[[1048,768]],1038:[[1059,774]],1040:[,,{774:1232,776:1234}],1043:[,,{769:1027}],1045:[,,{768:1024,774:1238,776:1025}],1046:[,,{774:1217,776:1244}],1047:[,,{776:1246}],1048:[,,{768:1037,772:1250,774:1049,776:1252}],1049:[[1048,774]],1050:[,,{769:1036}],1054:[,,{776:1254}],1059:[,,{772:1262,774:1038,776:1264,779:1266}],1063:[,,{776:1268}],1067:[,,{776:1272}],1069:[,,{776:1260}],1072:[,,{774:1233,776:1235}],1075:[,,{769:1107}],1077:[,,{768:1104,774:1239,776:1105}],1078:[,,{774:1218,776:1245}],1079:[,,{776:1247}],1080:[,,{768:1117,772:1251,774:1081,776:1253}],1081:[[1080,774]],1082:[,,{769:1116}],1086:[,,{776:1255}],1091:[,,{772:1263,774:1118,776:1265,779:1267}],1095:[,,{776:1269}],1099:[,,{776:1273}],1101:[,,{776:1261}],1104:[[1077,768]],1105:[[1077,776]],1107:[[1075,769]],1110:[,,{776:1111}],1111:[[1110,776]],1116:[[1082,769]],1117:[[1080,768]],1118:[[1091,774]],1140:[,,{783:1142}],1141:[,,{783:1143}],1142:[[1140,783]],1143:[[1141,783]],1155:[,230],1156:[,230],1157:[,230],1158:[,230],1159:[,230],1217:[[1046,774]],1218:[[1078,774]],1232:[[1040,774]],1233:[[1072,774]],1234:[[1040,776]],1235:[[1072,776]],1238:[[1045,774]],1239:[[1077,774]],1240:[,,{776:1242}],1241:[,,{776:1243}],1242:[[1240,776]],1243:[[1241,776]],1244:[[1046,776]],1245:[[1078,776]],1246:[[1047,776]],1247:[[1079,776]],1250:[[1048,772]],1251:[[1080,772]],1252:[[1048,776]],1253:[[1080,776]],1254:[[1054,776]],1255:[[1086,776]],1256:[,,{776:1258}],1257:[,,{776:1259}],1258:[[1256,776]],1259:[[1257,776]],1260:[[1069,776]],1261:[[1101,776]],1262:[[1059,772]],1263:[[1091,772]],1264:[[1059,776]],1265:[[1091,776]],1266:[[1059,779]],1267:[[1091,779]],1268:[[1063,776]],1269:[[1095,776]],1272:[[1067,776]],1273:[[1099,776]]},1280:{1415:[[1381,1410],256],1425:[,220],1426:[,230],1427:[,230],1428:[,230],1429:[,230],1430:[,220],1431:[,230],1432:[,230],1433:[,230],1434:[,222],1435:[,220],1436:[,230],1437:[,230],1438:[,230],1439:[,230],1440:[,230],1441:[,230],1442:[,220],1443:[,220],1444:[,220],1445:[,220],1446:[,220],1447:[,220],1448:[,230],1449:[,230],1450:[,220],1451:[,230],1452:[,230],1453:[,222],1454:[,228],1455:[,230],1456:[,10],1457:[,11],1458:[,12],1459:[,13],1460:[,14],1461:[,15],1462:[,16],1463:[,17],1464:[,18],1465:[,19],1466:[,19],1467:[,20],1468:[,21],1469:[,22],1471:[,23],1473:[,24],1474:[,25],1476:[,230],1477:[,220],1479:[,18]},1536:{1552:[,230],1553:[,230],1554:[,230],1555:[,230],1556:[,230],1557:[,230],1558:[,230],1559:[,230],1560:[,30],1561:[,31],1562:[,32],1570:[[1575,1619]],1571:[[1575,1620]],1572:[[1608,1620]],1573:[[1575,1621]],1574:[[1610,1620]],1575:[,,{1619:1570,1620:1571,1621:1573}],1608:[,,{1620:1572}],1610:[,,{1620:1574}],1611:[,27],1612:[,28],1613:[,29],1614:[,30],1615:[,31],1616:[,32],1617:[,33],1618:[,34],1619:[,230],1620:[,230],1621:[,220],1622:[,220],1623:[,230],1624:[,230],1625:[,230],1626:[,230],1627:[,230],1628:[,220],1629:[,230],1630:[,230],1631:[,220],1648:[,35],1653:[[1575,1652],256],1654:[[1608,1652],256],1655:[[1735,1652],256],1656:[[1610,1652],256],1728:[[1749,1620]],1729:[,,{1620:1730}],1730:[[1729,1620]],1746:[,,{1620:1747}],1747:[[1746,1620]],1749:[,,{1620:1728}],1750:[,230],1751:[,230],1752:[,230],1753:[,230],1754:[,230],1755:[,230],1756:[,230],1759:[,230],1760:[,230],1761:[,230],1762:[,230],1763:[,220],1764:[,230],1767:[,230],1768:[,230],1770:[,220],1771:[,230],1772:[,230],1773:[,220]},1792:{1809:[,36],1840:[,230],1841:[,220],1842:[,230],1843:[,230],1844:[,220],1845:[,230],1846:[,230],1847:[,220],1848:[,220],1849:[,220],1850:[,230],1851:[,220],1852:[,220],1853:[,230],1854:[,220],1855:[,230],1856:[,230],1857:[,230],1858:[,220],1859:[,230],1860:[,220],1861:[,230],1862:[,220],1863:[,230],1864:[,220],1865:[,230],1866:[,230],2027:[,230],2028:[,230],2029:[,230],2030:[,230],2031:[,230],2032:[,230],2033:[,230],2034:[,220],2035:[,230]},2048:{2070:[,230],2071:[,230],2072:[,230],2073:[,230],2075:[,230],2076:[,230],2077:[,230],2078:[,230],2079:[,230],2080:[,230],2081:[,230],2082:[,230],2083:[,230],2085:[,230],2086:[,230],2087:[,230],2089:[,230],2090:[,230],2091:[,230],2092:[,230],2093:[,230],2137:[,220],2138:[,220],2139:[,220],2276:[,230],2277:[,230],2278:[,220],2279:[,230],2280:[,230],2281:[,220],2282:[,230],2283:[,230],2284:[,230],2285:[,220],2286:[,220],2287:[,220],2288:[,27],2289:[,28],2290:[,29],2291:[,230],2292:[,230],2293:[,230],2294:[,220],2295:[,230],2296:[,230],2297:[,220],2298:[,220],2299:[,230],2300:[,230],2301:[,230],2302:[,230],2303:[,230]},2304:{2344:[,,{2364:2345}],2345:[[2344,2364]],2352:[,,{2364:2353}],2353:[[2352,2364]],2355:[,,{2364:2356}],2356:[[2355,2364]],2364:[,7],2381:[,9],2385:[,230],2386:[,220],2387:[,230],2388:[,230],2392:[[2325,2364],512],2393:[[2326,2364],512],2394:[[2327,2364],512],2395:[[2332,2364],512],2396:[[2337,2364],512],2397:[[2338,2364],512],2398:[[2347,2364],512],2399:[[2351,2364],512],2492:[,7],2503:[,,{2494:2507,2519:2508}],2507:[[2503,2494]],2508:[[2503,2519]],2509:[,9],2524:[[2465,2492],512],2525:[[2466,2492],512],2527:[[2479,2492],512]},2560:{2611:[[2610,2620],512],2614:[[2616,2620],512],2620:[,7],2637:[,9],2649:[[2582,2620],512],2650:[[2583,2620],512],2651:[[2588,2620],512],2654:[[2603,2620],512],2748:[,7],2765:[,9],68109:[,220],68111:[,230],68152:[,230],68153:[,1],68154:[,220],68159:[,9],68325:[,230],68326:[,220]},2816:{2876:[,7],2887:[,,{2878:2891,2902:2888,2903:2892}],2888:[[2887,2902]],2891:[[2887,2878]],2892:[[2887,2903]],2893:[,9],2908:[[2849,2876],512],2909:[[2850,2876],512],2962:[,,{3031:2964}],2964:[[2962,3031]],3014:[,,{3006:3018,3031:3020}],3015:[,,{3006:3019}],3018:[[3014,3006]],3019:[[3015,3006]],3020:[[3014,3031]],3021:[,9]},3072:{3142:[,,{3158:3144}],3144:[[3142,3158]],3149:[,9],3157:[,84],3158:[,91],3260:[,7],3263:[,,{3285:3264}],3264:[[3263,3285]],3270:[,,{3266:3274,3285:3271,3286:3272}],3271:[[3270,3285]],3272:[[3270,3286]],3274:[[3270,3266],,{3285:3275}],3275:[[3274,3285]],3277:[,9]},3328:{3398:[,,{3390:3402,3415:3404}],3399:[,,{3390:3403}],3402:[[3398,3390]],3403:[[3399,3390]],3404:[[3398,3415]],3405:[,9],3530:[,9],3545:[,,{3530:3546,3535:3548,3551:3550}],3546:[[3545,3530]],3548:[[3545,3535],,{3530:3549}],3549:[[3548,3530]],3550:[[3545,3551]]},3584:{3635:[[3661,3634],256],3640:[,103],3641:[,103],3642:[,9],3656:[,107],3657:[,107],3658:[,107],3659:[,107],3763:[[3789,3762],256],3768:[,118],3769:[,118],3784:[,122],3785:[,122],3786:[,122],3787:[,122],3804:[[3755,3737],256],3805:[[3755,3745],256]},3840:{3852:[[3851],256],3864:[,220],3865:[,220],3893:[,220],3895:[,220],3897:[,216],3907:[[3906,4023],512],3917:[[3916,4023],512],3922:[[3921,4023],512],3927:[[3926,4023],512],3932:[[3931,4023],512],3945:[[3904,4021],512],3953:[,129],3954:[,130],3955:[[3953,3954],512],3956:[,132],3957:[[3953,3956],512],3958:[[4018,3968],512],3959:[[4018,3969],256],3960:[[4019,3968],512],3961:[[4019,3969],256],3962:[,130],3963:[,130],3964:[,130],3965:[,130],3968:[,130],3969:[[3953,3968],512],3970:[,230],3971:[,230],3972:[,9],3974:[,230],3975:[,230],3987:[[3986,4023],512],3997:[[3996,4023],512],4002:[[4001,4023],512],4007:[[4006,4023],512],4012:[[4011,4023],512],4025:[[3984,4021],512],4038:[,220]},4096:{4133:[,,{4142:4134}],4134:[[4133,4142]],4151:[,7],4153:[,9],4154:[,9],4237:[,220],4348:[[4316],256],69702:[,9],69759:[,9],69785:[,,{69818:69786}],69786:[[69785,69818]],69787:[,,{69818:69788}],69788:[[69787,69818]],69797:[,,{69818:69803}],69803:[[69797,69818]],69817:[,9],69818:[,7]},4352:{69888:[,230],69889:[,230],69890:[,230],69934:[[69937,69927]],69935:[[69938,69927]],69937:[,,{69927:69934}],69938:[,,{69927:69935}],69939:[,9],69940:[,9],70003:[,7],70080:[,9]},4608:{70197:[,9],70198:[,7],70377:[,7],70378:[,9]},4864:{4957:[,230],4958:[,230],4959:[,230],70460:[,7],70471:[,,{70462:70475,70487:70476}],70475:[[70471,70462]],70476:[[70471,70487]],70477:[,9],70502:[,230],70503:[,230],70504:[,230],70505:[,230],70506:[,230],70507:[,230],70508:[,230],70512:[,230],70513:[,230],70514:[,230],70515:[,230],70516:[,230]},5120:{70841:[,,{70832:70844,70842:70843,70845:70846}],70843:[[70841,70842]],70844:[[70841,70832]],70846:[[70841,70845]],70850:[,9],70851:[,7]},5376:{71096:[,,{71087:71098}],71097:[,,{71087:71099}],71098:[[71096,71087]],71099:[[71097,71087]],71103:[,9],71104:[,7]},5632:{71231:[,9],71350:[,9],71351:[,7]},5888:{5908:[,9],5940:[,9],6098:[,9],6109:[,230]},6144:{6313:[,228]},6400:{6457:[,222],6458:[,230],6459:[,220]},6656:{6679:[,230],6680:[,220],6752:[,9],6773:[,230],6774:[,230],6775:[,230],6776:[,230],6777:[,230],6778:[,230],6779:[,230],6780:[,230],6783:[,220],6832:[,230],6833:[,230],6834:[,230],6835:[,230],6836:[,230],6837:[,220],6838:[,220],6839:[,220],6840:[,220],6841:[,220],6842:[,220],6843:[,230],6844:[,230],6845:[,220]},6912:{6917:[,,{6965:6918}],6918:[[6917,6965]],6919:[,,{6965:6920}],6920:[[6919,6965]],6921:[,,{6965:6922}],6922:[[6921,6965]],6923:[,,{6965:6924}],6924:[[6923,6965]],6925:[,,{6965:6926}],6926:[[6925,6965]],6929:[,,{6965:6930}],6930:[[6929,6965]],6964:[,7],6970:[,,{6965:6971}],6971:[[6970,6965]],6972:[,,{6965:6973}],6973:[[6972,6965]],6974:[,,{6965:6976}],6975:[,,{6965:6977}],6976:[[6974,6965]],6977:[[6975,6965]],6978:[,,{6965:6979}],6979:[[6978,6965]],6980:[,9],7019:[,230],7020:[,220],7021:[,230],7022:[,230],7023:[,230],7024:[,230],7025:[,230],7026:[,230],7027:[,230],7082:[,9],7083:[,9],7142:[,7],7154:[,9],7155:[,9]},7168:{7223:[,7],7376:[,230],7377:[,230],7378:[,230],7380:[,1],7381:[,220],7382:[,220],7383:[,220],7384:[,220],7385:[,220],7386:[,230],7387:[,230],7388:[,220],7389:[,220],7390:[,220],7391:[,220],7392:[,230],7394:[,1],7395:[,1],7396:[,1],7397:[,1],7398:[,1],7399:[,1],7400:[,1],7405:[,220],7412:[,230],7416:[,230],7417:[,230]},7424:{7468:[[65],256],7469:[[198],256],7470:[[66],256],7472:[[68],256],7473:[[69],256],7474:[[398],256],7475:[[71],256],7476:[[72],256],7477:[[73],256],7478:[[74],256],7479:[[75],256],7480:[[76],256],7481:[[77],256],7482:[[78],256],7484:[[79],256],7485:[[546],256],7486:[[80],256],7487:[[82],256],7488:[[84],256],7489:[[85],256],7490:[[87],256],7491:[[97],256],7492:[[592],256],7493:[[593],256],7494:[[7426],256],7495:[[98],256],7496:[[100],256],7497:[[101],256],7498:[[601],256],7499:[[603],256],7500:[[604],256],7501:[[103],256],7503:[[107],256],7504:[[109],256],7505:[[331],256],7506:[[111],256],7507:[[596],256],7508:[[7446],256],7509:[[7447],256],7510:[[112],256],7511:[[116],256],7512:[[117],256],7513:[[7453],256],7514:[[623],256],7515:[[118],256],7516:[[7461],256],7517:[[946],256],7518:[[947],256],7519:[[948],256],7520:[[966],256],7521:[[967],256],7522:[[105],256],7523:[[114],256],7524:[[117],256],7525:[[118],256],7526:[[946],256],7527:[[947],256],7528:[[961],256],7529:[[966],256],7530:[[967],256],7544:[[1085],256],7579:[[594],256],7580:[[99],256],7581:[[597],256],7582:[[240],256],7583:[[604],256],7584:[[102],256],7585:[[607],256],7586:[[609],256],7587:[[613],256],7588:[[616],256],7589:[[617],256],7590:[[618],256],7591:[[7547],256],7592:[[669],256],7593:[[621],256],7594:[[7557],256],7595:[[671],256],7596:[[625],256],7597:[[624],256],7598:[[626],256],7599:[[627],256],7600:[[628],256],7601:[[629],256],7602:[[632],256],7603:[[642],256],7604:[[643],256],7605:[[427],256],7606:[[649],256],7607:[[650],256],7608:[[7452],256],7609:[[651],256],7610:[[652],256],7611:[[122],256],7612:[[656],256],7613:[[657],256],7614:[[658],256],7615:[[952],256],7616:[,230],7617:[,230],7618:[,220],7619:[,230],7620:[,230],7621:[,230],7622:[,230],7623:[,230],7624:[,230],7625:[,230],7626:[,220],7627:[,230],7628:[,230],7629:[,234],7630:[,214],7631:[,220],7632:[,202],7633:[,230],7634:[,230],7635:[,230],7636:[,230],7637:[,230],7638:[,230],7639:[,230],7640:[,230],7641:[,230],7642:[,230],7643:[,230],7644:[,230],7645:[,230],7646:[,230],7647:[,230],7648:[,230],7649:[,230],7650:[,230],7651:[,230],7652:[,230],7653:[,230],7654:[,230],7655:[,230],7656:[,230],7657:[,230],7658:[,230],7659:[,230],7660:[,230],7661:[,230],7662:[,230],7663:[,230],7664:[,230],7665:[,230],7666:[,230],7667:[,230],7668:[,230],7669:[,230],7676:[,233],7677:[,220],7678:[,230],7679:[,220]},7680:{7680:[[65,805]],7681:[[97,805]],7682:[[66,775]],7683:[[98,775]],7684:[[66,803]],7685:[[98,803]],7686:[[66,817]],7687:[[98,817]],7688:[[199,769]],7689:[[231,769]],7690:[[68,775]],7691:[[100,775]],7692:[[68,803]],7693:[[100,803]],7694:[[68,817]],7695:[[100,817]],7696:[[68,807]],7697:[[100,807]],7698:[[68,813]],7699:[[100,813]],7700:[[274,768]],7701:[[275,768]],7702:[[274,769]],7703:[[275,769]],7704:[[69,813]],7705:[[101,813]],7706:[[69,816]],7707:[[101,816]],7708:[[552,774]],7709:[[553,774]],7710:[[70,775]],7711:[[102,775]],7712:[[71,772]],7713:[[103,772]],7714:[[72,775]],7715:[[104,775]],7716:[[72,803]],7717:[[104,803]],7718:[[72,776]],7719:[[104,776]],7720:[[72,807]],7721:[[104,807]],7722:[[72,814]],7723:[[104,814]],7724:[[73,816]],7725:[[105,816]],7726:[[207,769]],7727:[[239,769]],7728:[[75,769]],7729:[[107,769]],7730:[[75,803]],7731:[[107,803]],7732:[[75,817]],7733:[[107,817]],7734:[[76,803],,{772:7736}],7735:[[108,803],,{772:7737}],7736:[[7734,772]],7737:[[7735,772]],7738:[[76,817]],7739:[[108,817]],7740:[[76,813]],7741:[[108,813]],7742:[[77,769]],7743:[[109,769]],7744:[[77,775]],7745:[[109,775]],7746:[[77,803]],7747:[[109,803]],7748:[[78,775]],7749:[[110,775]],7750:[[78,803]],7751:[[110,803]],7752:[[78,817]],7753:[[110,817]],7754:[[78,813]],7755:[[110,813]],7756:[[213,769]],7757:[[245,769]],7758:[[213,776]],7759:[[245,776]],7760:[[332,768]],7761:[[333,768]],7762:[[332,769]],7763:[[333,769]],7764:[[80,769]],7765:[[112,769]],7766:[[80,775]],7767:[[112,775]],7768:[[82,775]],7769:[[114,775]],7770:[[82,803],,{772:7772}],7771:[[114,803],,{772:7773}],7772:[[7770,772]],7773:[[7771,772]],7774:[[82,817]],7775:[[114,817]],7776:[[83,775]],7777:[[115,775]],7778:[[83,803],,{775:7784}],7779:[[115,803],,{775:7785}],7780:[[346,775]],7781:[[347,775]],7782:[[352,775]],7783:[[353,775]],7784:[[7778,775]],7785:[[7779,775]],7786:[[84,775]],7787:[[116,775]],7788:[[84,803]],7789:[[116,803]],7790:[[84,817]],7791:[[116,817]],7792:[[84,813]],7793:[[116,813]],7794:[[85,804]],7795:[[117,804]],7796:[[85,816]],7797:[[117,816]],7798:[[85,813]],7799:[[117,813]],7800:[[360,769]],7801:[[361,769]],7802:[[362,776]],7803:[[363,776]],7804:[[86,771]],7805:[[118,771]],7806:[[86,803]],7807:[[118,803]],7808:[[87,768]],7809:[[119,768]],7810:[[87,769]],7811:[[119,769]],7812:[[87,776]],7813:[[119,776]],7814:[[87,775]],7815:[[119,775]],7816:[[87,803]],7817:[[119,803]],7818:[[88,775]],7819:[[120,775]],7820:[[88,776]],7821:[[120,776]],7822:[[89,775]],7823:[[121,775]],7824:[[90,770]],7825:[[122,770]],7826:[[90,803]],7827:[[122,803]],7828:[[90,817]],7829:[[122,817]],7830:[[104,817]],7831:[[116,776]],7832:[[119,778]],7833:[[121,778]],7834:[[97,702],256],7835:[[383,775]],7840:[[65,803],,{770:7852,774:7862}],7841:[[97,803],,{770:7853,774:7863}],7842:[[65,777]],7843:[[97,777]],7844:[[194,769]],7845:[[226,769]],7846:[[194,768]],7847:[[226,768]],7848:[[194,777]],7849:[[226,777]],7850:[[194,771]],7851:[[226,771]],7852:[[7840,770]],7853:[[7841,770]],7854:[[258,769]],7855:[[259,769]],7856:[[258,768]],7857:[[259,768]],7858:[[258,777]],7859:[[259,777]],7860:[[258,771]],7861:[[259,771]],7862:[[7840,774]],7863:[[7841,774]],7864:[[69,803],,{770:7878}],7865:[[101,803],,{770:7879}],7866:[[69,777]],7867:[[101,777]],7868:[[69,771]],7869:[[101,771]],7870:[[202,769]],7871:[[234,769]],7872:[[202,768]],7873:[[234,768]],7874:[[202,777]],7875:[[234,777]],7876:[[202,771]],7877:[[234,771]],7878:[[7864,770]],7879:[[7865,770]],7880:[[73,777]],7881:[[105,777]],7882:[[73,803]],7883:[[105,803]],7884:[[79,803],,{770:7896}],7885:[[111,803],,{770:7897}],7886:[[79,777]],7887:[[111,777]],7888:[[212,769]],7889:[[244,769]],7890:[[212,768]],7891:[[244,768]],7892:[[212,777]],7893:[[244,777]],7894:[[212,771]],7895:[[244,771]],7896:[[7884,770]],7897:[[7885,770]],7898:[[416,769]],7899:[[417,769]],7900:[[416,768]],7901:[[417,768]],7902:[[416,777]],7903:[[417,777]],7904:[[416,771]],7905:[[417,771]],7906:[[416,803]],7907:[[417,803]],7908:[[85,803]],7909:[[117,803]],7910:[[85,777]],7911:[[117,777]],7912:[[431,769]],7913:[[432,769]],7914:[[431,768]],7915:[[432,768]],7916:[[431,777]],7917:[[432,777]],7918:[[431,771]],7919:[[432,771]],7920:[[431,803]],7921:[[432,803]],7922:[[89,768]],7923:[[121,768]],7924:[[89,803]],7925:[[121,803]],7926:[[89,777]],7927:[[121,777]],7928:[[89,771]],7929:[[121,771]]},7936:{7936:[[945,787],,{768:7938,769:7940,834:7942,837:8064}],7937:[[945,788],,{768:7939,769:7941,834:7943,837:8065}],7938:[[7936,768],,{837:8066}],7939:[[7937,768],,{837:8067}],7940:[[7936,769],,{837:8068}],7941:[[7937,769],,{837:8069}],7942:[[7936,834],,{837:8070}],7943:[[7937,834],,{837:8071}],7944:[[913,787],,{768:7946,769:7948,834:7950,837:8072}],7945:[[913,788],,{768:7947,769:7949,834:7951,837:8073}],7946:[[7944,768],,{837:8074}],7947:[[7945,768],,{837:8075}],7948:[[7944,769],,{837:8076}],7949:[[7945,769],,{837:8077}],7950:[[7944,834],,{837:8078}],7951:[[7945,834],,{837:8079}],7952:[[949,787],,{768:7954,769:7956}],7953:[[949,788],,{768:7955,769:7957}],7954:[[7952,768]],7955:[[7953,768]],7956:[[7952,769]],7957:[[7953,769]],7960:[[917,787],,{768:7962,769:7964}],7961:[[917,788],,{768:7963,769:7965}],7962:[[7960,768]],7963:[[7961,768]],7964:[[7960,769]],7965:[[7961,769]],7968:[[951,787],,{768:7970,769:7972,834:7974,837:8080}],7969:[[951,788],,{768:7971,769:7973,834:7975,837:8081}],7970:[[7968,768],,{837:8082}],7971:[[7969,768],,{837:8083}],7972:[[7968,769],,{837:8084}],7973:[[7969,769],,{837:8085}],7974:[[7968,834],,{837:8086}],7975:[[7969,834],,{837:8087}],7976:[[919,787],,{768:7978,769:7980,834:7982,837:8088}],7977:[[919,788],,{768:7979,769:7981,834:7983,837:8089}],7978:[[7976,768],,{837:8090}],7979:[[7977,768],,{837:8091}],7980:[[7976,769],,{837:8092}],7981:[[7977,769],,{837:8093}],7982:[[7976,834],,{837:8094}],7983:[[7977,834],,{837:8095}],7984:[[953,787],,{768:7986,769:7988,834:7990}],7985:[[953,788],,{768:7987,769:7989,834:7991}],7986:[[7984,768]],7987:[[7985,768]],7988:[[7984,769]],7989:[[7985,769]],7990:[[7984,834]],7991:[[7985,834]],7992:[[921,787],,{768:7994,769:7996,834:7998}],7993:[[921,788],,{768:7995,769:7997,834:7999}],7994:[[7992,768]],7995:[[7993,768]],7996:[[7992,769]],7997:[[7993,769]],7998:[[7992,834]],7999:[[7993,834]],8
70123000
vendor: 25,898 bytes, line 70123
70123:[[959,787],,{768:8002,769:8004}],8001:[[959,788],,{768:8003,769:8005}],8002:[[8e3,768]],8003:[[8001,768]],8004:[[8e3,769]],8005:[[8001,769]],8008:[[927,787],,{768:8010,769:8012}],8009:[[927,788],,{768:8011,769:8013}],8010:[[8008,768]],8011:[[8009,768]],8012:[[8008,769]],8013:[[8009,769]],8016:[[965,787],,{768:8018,769:8020,834:8022}],8017:[[965,788],,{768:8019,769:8021,834:8023}],8018:[[8016,768]],8019:[[8017,768]],8020:[[8016,769]],8021:[[8017,769]],8022:[[8016,834]],8023:[[8017,834]],8025:[[933,788],,{768:8027,769:8029,834:8031}],8027:[[8025,768]],8029:[[8025,769]],8031:[[8025,834]],8032:[[969,787],,{768:8034,769:8036,834:8038,837:8096}],8033:[[969,788],,{768:8035,769:8037,834:8039,837:8097}],8034:[[8032,768],,{837:8098}],8035:[[8033,768],,{837:8099}],8036:[[8032,769],,{837:8100}],8037:[[8033,769],,{837:8101}],8038:[[8032,834],,{837:8102}],8039:[[8033,834],,{837:8103}],8040:[[937,787],,{768:8042,769:8044,834:8046,837:8104}],8041:[[937,788],,{768:8043,769:8045,834:8047,837:8105}],8042:[[8040,768],,{837:8106}],8043:[[8041,768],,{837:8107}],8044:[[8040,769],,{837:8108}],8045:[[8041,769],,{837:8109}],8046:[[8040,834],,{837:8110}],8047:[[8041,834],,{837:8111}],8048:[[945,768],,{837:8114}],8049:[[940]],8050:[[949,768]],8051:[[941]],8052:[[951,768],,{837:8130}],8053:[[942]],8054:[[953,768]],8055:[[943]],8056:[[959,768]],8057:[[972]],8058:[[965,768]],8059:[[973]],8060:[[969,768],,{837:8178}],8061:[[974]],8064:[[7936,837]],8065:[[7937,837]],8066:[[7938,837]],8067:[[7939,837]],8068:[[7940,837]],8069:[[7941,837]],8070:[[7942,837]],8071:[[7943,837]],8072:[[7944,837]],8073:[[7945,837]],8074:[[7946,837]],8075:[[7947,837]],8076:[[7948,837]],8077:[[7949,837]],8078:[[7950,837]],8079:[[7951,837]],8080:[[7968,837]],8081:[[7969,837]],8082:[[7970,837]],8083:[[7971,837]],8084:[[7972,837]],8085:[[7973,837]],8086:[[7974,837]],8087:[[7975,837]],8088:[[7976,837]],8089:[[7977,837]],8090:[[7978,837]],8091:[[7979,837]],8092:[[7980,837]],8093:[[7981,837]],8094:[[7982,837]],8095:[[7983,837]],8096:[[8032,837]],8097:[[8033,837]],8098:[[8034,837]],8099:[[8035,837]],8100:[[8036,837]],8101:[[8037,837]],8102:[[8038,837]],8103:[[8039,837]],8104:[[8040,837]],8105:[[8041,837]],8106:[[8042,837]],8107:[[8043,837]],8108:[[8044,837]],8109:[[8045,837]],8110:[[8046,837]],8111:[[8047,837]],8112:[[945,774]],8113:[[945,772]],8114:[[8048,837]],8115:[[945,837]],8116:[[940,837]],8118:[[945,834],,{837:8119}],8119:[[8118,837]],8120:[[913,774]],8121:[[913,772]],8122:[[913,768]],8123:[[902]],8124:[[913,837]],8125:[[32,787],256],8126:[[953]],8127:[[32,787],256,{768:8141,769:8142,834:8143}],8128:[[32,834],256],8129:[[168,834]],8130:[[8052,837]],8131:[[951,837]],8132:[[942,837]],8134:[[951,834],,{837:8135}],8135:[[8134,837]],8136:[[917,768]],8137:[[904]],8138:[[919,768]],8139:[[905]],8140:[[919,837]],8141:[[8127,768]],8142:[[8127,769]],8143:[[8127,834]],8144:[[953,774]],8145:[[953,772]],8146:[[970,768]],8147:[[912]],8150:[[953,834]],8151:[[970,834]],8152:[[921,774]],8153:[[921,772]],8154:[[921,768]],8155:[[906]],8157:[[8190,768]],8158:[[8190,769]],8159:[[8190,834]],8160:[[965,774]],8161:[[965,772]],8162:[[971,768]],8163:[[944]],8164:[[961,787]],8165:[[961,788]],8166:[[965,834]],8167:[[971,834]],8168:[[933,774]],8169:[[933,772]],8170:[[933,768]],8171:[[910]],8172:[[929,788]],8173:[[168,768]],8174:[[901]],8175:[[96]],8178:[[8060,837]],8179:[[969,837]],8180:[[974,837]],8182:[[969,834],,{837:8183}],8183:[[8182,837]],8184:[[927,768]],8185:[[908]],8186:[[937,768]],8187:[[911]],8188:[[937,837]],8189:[[180]],8190:[[32,788],256,{768:8157,769:8158,834:8159}]},8192:{8192:[[8194]],8193:[[8195]],8194:[[32],256],8195:[[32],256],8196:[[32],256],8197:[[32],256],8198:[[32],256],8199:[[32],256],8200:[[32],256],8201:[[32],256],8202:[[32],256],8209:[[8208],256],8215:[[32,819],256],8228:[[46],256],8229:[[46,46],256],8230:[[46,46,46],256],8239:[[32],256],8243:[[8242,8242],256],8244:[[8242,8242,8242],256],8246:[[8245,8245],256],8247:[[8245,8245,8245],256],8252:[[33,33],256],8254:[[32,773],256],8263:[[63,63],256],8264:[[63,33],256],8265:[[33,63],256],8279:[[8242,8242,8242,8242],256],8287:[[32],256],8304:[[48],256],8305:[[105],256],8308:[[52],256],8309:[[53],256],8310:[[54],256],8311:[[55],256],8312:[[56],256],8313:[[57],256],8314:[[43],256],8315:[[8722],256],8316:[[61],256],8317:[[40],256],8318:[[41],256],8319:[[110],256],8320:[[48],256],8321:[[49],256],8322:[[50],256],8323:[[51],256],8324:[[52],256],8325:[[53],256],8326:[[54],256],8327:[[55],256],8328:[[56],256],8329:[[57],256],8330:[[43],256],8331:[[8722],256],8332:[[61],256],8333:[[40],256],8334:[[41],256],8336:[[97],256],8337:[[101],256],8338:[[111],256],8339:[[120],256],8340:[[601],256],8341:[[104],256],8342:[[107],256],8343:[[108],256],8344:[[109],256],8345:[[110],256],8346:[[112],256],8347:[[115],256],8348:[[116],256],8360:[[82,115],256],8400:[,230],8401:[,230],8402:[,1],8403:[,1],8404:[,230],8405:[,230],8406:[,230],8407:[,230],8408:[,1],8409:[,1],8410:[,1],8411:[,230],8412:[,230],8417:[,230],8421:[,1],8422:[,1],8423:[,230],8424:[,220],8425:[,230],8426:[,1],8427:[,1],8428:[,220],8429:[,220],8430:[,220],8431:[,220],8432:[,230]},8448:{8448:[[97,47,99],256],8449:[[97,47,115],256],8450:[[67],256],8451:[[176,67],256],8453:[[99,47,111],256],8454:[[99,47,117],256],8455:[[400],256],8457:[[176,70],256],8458:[[103],256],8459:[[72],256],8460:[[72],256],8461:[[72],256],8462:[[104],256],8463:[[295],256],8464:[[73],256],8465:[[73],256],8466:[[76],256],8467:[[108],256],8469:[[78],256],8470:[[78,111],256],8473:[[80],256],8474:[[81],256],8475:[[82],256],8476:[[82],256],8477:[[82],256],8480:[[83,77],256],8481:[[84,69,76],256],8482:[[84,77],256],8484:[[90],256],8486:[[937]],8488:[[90],256],8490:[[75]],8491:[[197]],8492:[[66],256],8493:[[67],256],8495:[[101],256],8496:[[69],256],8497:[[70],256],8499:[[77],256],8500:[[111],256],8501:[[1488],256],8502:[[1489],256],8503:[[1490],256],8504:[[1491],256],8505:[[105],256],8507:[[70,65,88],256],8508:[[960],256],8509:[[947],256],8510:[[915],256],8511:[[928],256],8512:[[8721],256],8517:[[68],256],8518:[[100],256],8519:[[101],256],8520:[[105],256],8521:[[106],256],8528:[[49,8260,55],256],8529:[[49,8260,57],256],8530:[[49,8260,49,48],256],8531:[[49,8260,51],256],8532:[[50,8260,51],256],8533:[[49,8260,53],256],8534:[[50,8260,53],256],8535:[[51,8260,53],256],8536:[[52,8260,53],256],8537:[[49,8260,54],256],8538:[[53,8260,54],256],8539:[[49,8260,56],256],8540:[[51,8260,56],256],8541:[[53,8260,56],256],8542:[[55,8260,56],256],8543:[[49,8260],256],8544:[[73],256],8545:[[73,73],256],8546:[[73,73,73],256],8547:[[73,86],256],8548:[[86],256],8549:[[86,73],256],8550:[[86,73,73],256],8551:[[86,73,73,73],256],8552:[[73,88],256],8553:[[88],256],8554:[[88,73],256],8555:[[88,73,73],256],8556:[[76],256],8557:[[67],256],8558:[[68],256],8559:[[77],256],8560:[[105],256],8561:[[105,105],256],8562:[[105,105,105],256],8563:[[105,118],256],8564:[[118],256],8565:[[118,105],256],8566:[[118,105,105],256],8567:[[118,105,105,105],256],8568:[[105,120],256],8569:[[120],256],8570:[[120,105],256],8571:[[120,105,105],256],8572:[[108],256],8573:[[99],256],8574:[[100],256],8575:[[109],256],8585:[[48,8260,51],256],8592:[,,{824:8602}],8594:[,,{824:8603}],8596:[,,{824:8622}],8602:[[8592,824]],8603:[[8594,824]],8622:[[8596,824]],8653:[[8656,824]],8654:[[8660,824]],8655:[[8658,824]],8656:[,,{824:8653}],8658:[,,{824:8655}],8660:[,,{824:8654}]},8704:{8707:[,,{824:8708}],8708:[[8707,824]],8712:[,,{824:8713}],8713:[[8712,824]],8715:[,,{824:8716}],8716:[[8715,824]],8739:[,,{824:8740}],8740:[[8739,824]],8741:[,,{824:8742}],8742:[[8741,824]],8748:[[8747,8747],256],8749:[[8747,8747,8747],256],8751:[[8750,8750],256],8752:[[8750,8750,8750],256],8764:[,,{824:8769}],8769:[[8764,824]],8771:[,,{824:8772}],8772:[[8771,824]],8773:[,,{824:8775}],8775:[[8773,824]],8776:[,,{824:8777}],8777:[[8776,824]],8781:[,,{824:8813}],8800:[[61,824]],8801:[,,{824:8802}],8802:[[8801,824]],8804:[,,{824:8816}],8805:[,,{824:8817}],8813:[[8781,824]],8814:[[60,824]],8815:[[62,824]],8816:[[8804,824]],8817:[[8805,824]],8818:[,,{824:8820}],8819:[,,{824:8821}],8820:[[8818,824]],8821:[[8819,824]],8822:[,,{824:8824}],8823:[,,{824:8825}],8824:[[8822,824]],8825:[[8823,824]],8826:[,,{824:8832}],8827:[,,{824:8833}],8828:[,,{824:8928}],8829:[,,{824:8929}],8832:[[8826,824]],8833:[[8827,824]],8834:[,,{824:8836}],8835:[,,{824:8837}],8836:[[8834,824]],8837:[[8835,824]],8838:[,,{824:8840}],8839:[,,{824:8841}],8840:[[8838,824]],8841:[[8839,824]],8849:[,,{824:8930}],8850:[,,{824:8931}],8866:[,,{824:8876}],8872:[,,{824:8877}],8873:[,,{824:8878}],8875:[,,{824:8879}],8876:[[8866,824]],8877:[[8872,824]],8878:[[8873,824]],8879:[[8875,824]],8882:[,,{824:8938}],8883:[,,{824:8939}],8884:[,,{824:8940}],8885:[,,{824:8941}],8928:[[8828,824]],8929:[[8829,824]],8930:[[8849,824]],8931:[[8850,824]],8938:[[8882,824]],8939:[[8883,824]],8940:[[8884,824]],8941:[[8885,824]]},8960:{9001:[[12296]],9002:[[12297]]},9216:{9312:[[49],256],9313:[[50],256],9314:[[51],256],9315:[[52],256],9316:[[53],256],9317:[[54],256],9318:[[55],256],9319:[[56],256],9320:[[57],256],9321:[[49,48],256],9322:[[49,49],256],9323:[[49,50],256],9324:[[49,51],256],9325:[[49,52],256],9326:[[49,53],256],9327:[[49,54],256],9328:[[49,55],256],9329:[[49,56],256],9330:[[49,57],256],9331:[[50,48],256],9332:[[40,49,41],256],9333:[[40,50,41],256],9334:[[40,51,41],256],9335:[[40,52,41],256],9336:[[40,53,41],256],9337:[[40,54,41],256],9338:[[40,55,41],256],9339:[[40,56,41],256],9340:[[40,57,41],256],9341:[[40,49,48,41],256],9342:[[40,49,49,41],256],9343:[[40,49,50,41],256],9344:[[40,49,51,41],256],9345:[[40,49,52,41],256],9346:[[40,49,53,41],256],9347:[[40,49,54,41],256],9348:[[40,49,55,41],256],9349:[[40,49,56,41],256],9350:[[40,49,57,41],256],9351:[[40,50,48,41],256],9352:[[49,46],256],9353:[[50,46],256],9354:[[51,46],256],9355:[[52,46],256],9356:[[53,46],256],9357:[[54,46],256],9358:[[55,46],256],9359:[[56,46],256],9360:[[57,46],256],9361:[[49,48,46],256],9362:[[49,49,46],256],9363:[[49,50,46],256],9364:[[49,51,46],256],9365:[[49,52,46],256],9366:[[49,53,46],256],9367:[[49,54,46],256],9368:[[49,55,46],256],9369:[[49,56,46],256],9370:[[49,57,46],256],9371:[[50,48,46],256],9372:[[40,97,41],256],9373:[[40,98,41],256],9374:[[40,99,41],256],9375:[[40,100,41],256],9376:[[40,101,41],256],9377:[[40,102,41],256],9378:[[40,103,41],256],9379:[[40,104,41],256],9380:[[40,105,41],256],9381:[[40,106,41],256],9382:[[40,107,41],256],9383:[[40,108,41],256],9384:[[40,109,41],256],9385:[[40,110,41],256],9386:[[40,111,41],256],9387:[[40,112,41],256],9388:[[40,113,41],256],9389:[[40,114,41],256],9390:[[40,115,41],256],9391:[[40,116,41],256],9392:[[40,117,41],256],9393:[[40,118,41],256],9394:[[40,119,41],256],9395:[[40,120,41],256],9396:[[40,121,41],256],9397:[[40,122,41],256],9398:[[65],256],9399:[[66],256],9400:[[67],256],9401:[[68],256],9402:[[69],256],9403:[[70],256],9404:[[71],256],9405:[[72],256],9406:[[73],256],9407:[[74],256],9408:[[75],256],9409:[[76],256],9410:[[77],256],9411:[[78],256],9412:[[79],256],9413:[[80],256],9414:[[81],256],9415:[[82],256],9416:[[83],256],9417:[[84],256],9418:[[85],256],9419:[[86],256],9420:[[87],256],9421:[[88],256],9422:[[89],256],9423:[[90],256],9424:[[97],256],9425:[[98],256],9426:[[99],256],9427:[[100],256],9428:[[101],256],9429:[[102],256],9430:[[103],256],9431:[[104],256],9432:[[105],256],9433:[[106],256],9434:[[107],256],9435:[[108],256],9436:[[109],256],9437:[[110],256],9438:[[111],256],9439:[[112],256],9440:[[113],256],9441:[[114],256],9442:[[115],256],9443:[[116],256],9444:[[117],256],9445:[[118],256],9446:[[119],256],9447:[[120],256],9448:[[121],256],9449:[[122],256],9450:[[48],256]},10752:{10764:[[8747,8747,8747,8747],256],10868:[[58,58,61],256],10869:[[61,61],256],10870:[[61,61,61],256],10972:[[10973,824],512]},11264:{11388:[[106],256],11389:[[86],256],11503:[,230],11504:[,230],11505:[,230]},11520:{11631:[[11617],256],11647:[,9],11744:[,230],11745:[,230],11746:[,230],11747:[,230],11748:[,230],11749:[,230],11750:[,230],11751:[,230],11752:[,230],11753:[,230],11754:[,230],11755:[,230],11756:[,230],11757:[,230],11758:[,230],11759:[,230],11760:[,230],11761:[,230],11762:[,230],11763:[,230],11764:[,230],11765:[,230],11766:[,230],11767:[,230],11768:[,230],11769:[,230],11770:[,230],11771:[,230],11772:[,230],11773:[,230],11774:[,230],11775:[,230]},11776:{11935:[[27597],256],12019:[[40863],256]},12032:{12032:[[19968],256],12033:[[20008],256],12034:[[20022],256],12035:[[20031],256],12036:[[20057],256],12037:[[20101],256],12038:[[20108],256],12039:[[20128],256],12040:[[20154],256],12041:[[20799],256],12042:[[20837],256],12043:[[20843],256],12044:[[20866],256],12045:[[20886],256],12046:[[20907],256],12047:[[20960],256],12048:[[20981],256],12049:[[20992],256],12050:[[21147],256],12051:[[21241],256],12052:[[21269],256],12053:[[21274],256],12054:[[21304],256],12055:[[21313],256],12056:[[21340],256],12057:[[21353],256],12058:[[21378],256],12059:[[21430],256],12060:[[21448],256],12061:[[21475],256],12062:[[22231],256],12063:[[22303],256],12064:[[22763],256],12065:[[22786],256],12066:[[22794],256],12067:[[22805],256],12068:[[22823],256],12069:[[22899],256],12070:[[23376],256],12071:[[23424],256],12072:[[23544],256],12073:[[23567],256],12074:[[23586],256],12075:[[23608],256],12076:[[23662],256],12077:[[23665],256],12078:[[24027],256],12079:[[24037],256],12080:[[24049],256],12081:[[24062],256],12082:[[24178],256],12083:[[24186],256],12084:[[24191],256],12085:[[24308],256],12086:[[24318],256],12087:[[24331],256],12088:[[24339],256],12089:[[24400],256],12090:[[24417],256],12091:[[24435],256],12092:[[24515],256],12093:[[25096],256],12094:[[25142],256],12095:[[25163],256],12096:[[25903],256],12097:[[25908],256],12098:[[25991],256],12099:[[26007],256],12100:[[26020],256],12101:[[26041],256],12102:[[26080],256],12103:[[26085],256],12104:[[26352],256],12105:[[26376],256],12106:[[26408],256],12107:[[27424],256],12108:[[27490],256],12109:[[27513],256],12110:[[27571],256],12111:[[27595],256],12112:[[27604],256],12113:[[27611],256],12114:[[27663],256],12115:[[27668],256],12116:[[27700],256],12117:[[28779],256],12118:[[29226],256],12119:[[29238],256],12120:[[29243],256],12121:[[29247],256],12122:[[29255],256],12123:[[29273],256],12124:[[29275],256],12125:[[29356],256],12126:[[29572],256],12127:[[29577],256],12128:[[29916],256],12129:[[29926],256],12130:[[29976],256],12131:[[29983],256],12132:[[29992],256],12133:[[3e4],256],12134:[[30091],256],12135:[[30098],256],12136:[[30326],256],12137:[[30333],256],12138:[[30382],256],12139:[[30399],256],12140:[[30446],256],12141:[[30683],256],12142:[[30690],256],12143:[[30707],256],12144:[[31034],256],12145:[[31160],256],12146:[[31166],256],12147:[[31348],256],12148:[[31435],256],12149:[[31481],256],12150:[[31859],256],12151:[[31992],256],12152:[[32566],256],12153:[[32593],256],12154:[[32650],256],12155:[[32701],256],12156:[[32769],256],12157:[[32780],256],12158:[[32786],256],12159:[[32819],256],12160:[[32895],256],12161:[[32905],256],12162:[[33251],256],12163:[[33258],256],12164:[[33267],256],12165:[[33276],256],12166:[[33292],256],12167:[[33307],256],12168:[[33311],256],12169:[[33390],256],12170:[[33394],256],12171:[[33400],256],12172:[[34381],256],12173:[[34411],256],12174:[[34880],256],12175:[[34892],256],12176:[[34915],256],12177:[[35198],256],12178:[[35211],256],12179:[[35282],256],12180:[[35328],256],12181:[[35895],256],12182:[[35910],256],12183:[[35925],256],12184:[[35960],256],12185:[[35997],256],12186:[[36196],256],12187:[[36208],256],12188:[[36275],256],12189:[[36523],256],12190:[[36554],256],12191:[[36763],256],12192:[[36784],256],12193:[[36789],256],12194:[[37009],256],12195:[[37193],256],12196:[[37318],256],12197:[[37324],256],12198:[[37329],256],12199:[[38263],256],12200:[[38272],256],12201:[[38428],256],12202:[[38582],256],12203:[[38585],256],12204:[[38632],256],12205:[[38737],256],12206:[[38750],256],12207:[[38754],256],12208:[[38761],256],12209:[[38859],256],12210:[[38893],256],12211:[[38899],256],12212:[[38913],256],12213:[[39080],256],12214:[[39131],256],12215:[[39135],256],12216:[[39318],256],12217:[[39321],256],12218:[[39340],256],12219:[[39592],256],12220:[[39640],256],12221:[[39647],256],12222:[[39717],256],12223:[[39727],256],12224:[[39730],256],12225:[[39740],256],12226:[[39770],256],12227:[[40165],256],12228:[[40565],256],12229:[[40575],256],12230:[[40613],256],12231:[[40635],256],12232:[[40643],256],12233:[[40653],256],12234:[[40657],256],12235:[[40697],256],12236:[[40701],256],12237:[[40718],256],12238:[[40723],256],12239:[[40736],256],12240:[[40763],256],12241:[[40778],256],12242:[[40786],256],12243:[[40845],256],12244:[[40860],256],12245:[[40864],256]},12288:{12288:[[32],256],12330:[,218],12331:[,228],12332:[,232],12333:[,222],12334:[,224],12335:[,224],12342:[[12306],256],12344:[[21313],256],12345:[[21316],256],12346:[[21317],256],12358:[,,{12441:12436}],12363:[,,{12441:12364}],12364:[[12363,12441]],12365:[,,{12441:12366}],12366:[[12365,12441]],12367:[,,{12441:12368}],12368:[[12367,12441]],12369:[,,{12441:12370}],12370:[[12369,12441]],12371:[,,{12441:12372}],12372:[[12371,12441]],12373:[,,{12441:12374}],12374:[[12373,12441]],12375:[,,{12441:12376}],12376:[[12375,12441]],12377:[,,{12441:12378}],12378:[[12377,12441]],12379:[,,{12441:12380}],12380:[[12379,12441]],12381:[,,{12441:12382}],12382:[[12381,12441]],12383:[,,{12441:12384}],12384:[[12383,12441]],12385:[,,{12441:12386}],12386:[[12385,12441]],12388:[,,{12441:12389}],12389:[[12388,12441]],12390:[,,{12441:12391}],12391:[[12390,12441]],12392:[,,{12441:12393}],12393:[[12392,12441]],12399:[,,{12441:12400,12442:12401}],12400:[[12399,12441]],12401:[[12399,12442]],12402:[,,{12441:12403,12442:12404}],12403:[[12402,12441]],12404:[[12402,12442]],12405:[,,{12441:12406,12442:12407}],12406:[[12405,12441]],12407:[[12405,12442]],12408:[,,{12441:12409,12442:12410}],12409:[[12408,12441]],12410:[[12408,12442]],12411:[,,{12441:12412,12442:12413}],12412:[[12411,12441]],12413:[[12411,12442]],12436:[[12358,12441]],12441:[,8],12442:[,8],12443:[[32,12441],256],12444:[[32,12442],256],12445:[,,{12441:12446}],12446:[[12445,12441]],12447:[[12424,12426],256],12454:[,,{12441:12532}],12459:[,,{12441:12460}],12460:[[12459,12441]],12461:[,,{12441:12462}],12462:[[12461,12441]],12463:[,,{12441:12464}],12464:[[12463,12441]],12465:[,,{12441:12466}],12466:[[12465,12441]],12467:[,,{12441:12468}],12468:[[12467,12441]],12469:[,,{12441:12470}],12470:[[12469,12441]],12471:[,,{12441:12472}],12472:[[12471,12441]],12473:[,,{12441:12474}],12474:[[12473,12441]],12475:[,,{12441:12476}],12476:[[12475,12441]],12477:[,,{12441:12478}],12478:[[12477,12441]],12479:[,,{12441:12480}],12480:[[12479,12441]],12481:[,,{12441:12482}],12482:[[12481,12441]],12484:[,,{12441:12485}],12485:[[12484,12441]],12486:[,,{12441:12487}],12487:[[12486,12441]],12488:[,,{12441:12489}],12489:[[12488,12441]],12495:[,,{12441:12496,12442:12497}],12496:[[12495,12441]],12497:[[12495,12442]],12498:[,,{12441:12499,12442:12500}],12499:[[12498,12441]],12500:[[12498,12442]],12501:[,,{12441:12502,12442:12503}],12502:[[12501,12441]],12503:[[12501,12442]],12504:[,,{12441:12505,12442:12506}],12505:[[12504,12441]],12506:[[12504,12442]],12507:[,,{12441:12508,12442:12509}],12508:[[12507,12441]],12509:[[12507,12442]],12527:[,,{12441:12535}],12528:[,,{12441:12536}],12529:[,,{12441:12537}],12530:[,,{12441:12538}],12532:[[12454,12441]],12535:[[12527,12441]],12536:[[12528,12441]],12537:[[12529,12441]],12538:[[12530,12441]],12541:[,,{12441:12542}],12542:[[12541,12441]],12543:[[12467,12488],256]},12544:{12593:[[4352],256],12594:[[4353],256],12595:[[4522],256],12596:[[4354],256],12597:[[4524],256],12598:[[4525],256],12599:[[4355],256],12600:[[4356],256],12601:[[4357],256],12602:[[4528],256],12603:[[4529],256],12604:[[4530],256],12605:[[4531],256],12606:[[4532],256],12607:[[4533],256],12608:[[4378],256],12609:[[4358],256],12610:[[4359],256],12611:[[4360],256],12612:[[4385],256],12613:[[4361],256],12614:[[4362],256],12615:[[4363],256],12616:[[4364],256],12617:[[4365],256],12618:[[4366],256],12619:[[4367],256],12620:[[4368],256],12621:[[4369],256],12622:[[4370],256],12623:[[4449],256],12624:[[4450],256],12625:[[4451],256],12626:[[4452],256],12627:[[4453],256],12628:[[4454],256],12629:[[4455],256],12630:[[4456],256],12631:[[4457],256],12632:[[4458],256],12633:[[4459],256],12634:[[4460],256],12635:[[4461],256],12636:[[4462],256],12637:[[4463],256],12638:[[4464],256],12639:[[4465],256],12640:[[4466],256],12641:[[4467],256],12642:[[4468],256],12643:[[4469],256],12644:[[4448],256],12645:[[4372],256],12646:[[4373],256],12647:[[4551],256],12648:[[4552],256],12649:[[4556],256],12650:[[4558],256],12651:[[4563],256],12652:[[4567],256],12653:[[4569],256],12654:[[4380],256],12655:[[4573],256],12656:[[4575],256],12657:[[4381],256],12658:[[4382],256],12659:[[4384],256],12660:[[4386],256],12661:[[4387],256],12662:[[4391],256],12663:[[4393],256],12664:[[4395],256],12665:[[4396],256],12666:[[4397],256],12667:[[4398],256],12668:[[4399],256],12669:[[4402],256],12670:[[4406],256],12671:[[4416],256],12672:[[4423],256],12673:[[4428],256],12674:[[4593],256],12675:[[4594],256],12676:[[4439],256],12677:[[4440],256],12678:[[4441],256],12679:[[4484],256],12680:[[4485],256],12681:[[4488],256],12682:[[4497],256],12683:[[4498],256],12684:[[4500],256],12685:[[4510],256],12686:[[4513],256],12690:[[19968],256],12691:[[20108],256],12692:[[19977],256],12693:[[22235],256],12694:[[19978],256],12695:[[20013],256],12696:[[19979],256],12697:[[30002],256],12698:[[20057],256],12699:[[19993],256],12700:[[19969],256],12701:[[22825],256],12702:[[22320],256],12703:[[20154],256]},12800:{12800:[[40,4352,41],256],12801:[[40,4354,41],256],12802:[[40,4355,41],256],12803:[[40,4357,41],256],12804:[[40,4358,41],256],12805:[[40,4359,41],256],12806:[[40,4361,41],256],12807:[[40,4363,41],256],12808:[[40,4364,41],256],12809:[[40,4366,41],256],12810:[[40,4367,41],256],12811:[[40,4368,41],256],12812:[[40,4369,41],256],12813:[[40,4370,41],256],12814:[[40,4352,4449,41],256],12815:[[40,4354,4449,41],256],12816:[[40,4355,4449,41],256],12817:[[40,4357,4449,41],256],12818:[[40,4358,4449,41],256],12819:[[40,4359,4449,41],256],12820:[[40,4361,4449,41],256],12821:[[40,4363,4449,41],256],12822:[[40,4364,4449,41],256],12823:[[40,4366,4449,41],256],12824:[[40,4367,4449,41],256],12825:[[40,4368,4449,41],256],12826:[[40,4369,4449,41],256],12827:[[40,4370,4449,41],256],12828:[[40,4364,4462,41],256],12829:[[40,4363,4457,4364,4453,4523,41],256],12830:[[40,4363,4457,4370,4462,41],256],12832:[[40,19968,41],256],12833:[[40,20108,41],256],12834:[[40,19977,41],256],12835:[[40,22235,41],256],12836:[[40,20116,41],256],12837:[[40,20845,41],256],12838:[[40,19971,41],256],12839:[[40,20843,41],256],12840:[[40,20061,41],256],12841:[[40,21313,41],256],12842:[[40,26376,41],256],12843:[[40,28779,41],256],12844:[[40,27700,41],256],12845:[[40,26408,41],256],12846:[[40,37329,41],256],12847:[[40,22303,41],256],12848:[[40,26085,41],256],12849:[[40,26666,41],256],12850:[[40,26377,41],256],12851:[[40,31038,41],256],12852:[[40,21517,41],256],12853:[[40,29305,41],256],12854:[[40,36001,41],256],12855:[[40,31069,41],256],12856:[[40,21172,41],256],12857:[[40,20195,41],256],12858:[[40,21628,41],256],12859:[[40,23398,41],256],12860:[[40,30435,41],256],12861:[[40,20225,41],256],12862:[[40,36039,41],256],12863:[[40,21332,41],256],12864:[[40,31085,41],256],12865:[[40,20241,41],256],12866:[[40,33258,41],256],12867:[[40,33267,41],256],12868:[[21839],256],12869:[[24188],256],12870:[[25991],256],12871:[[31631],256],12880:[[80,84,69],256],12881:[[50,49],256],12882:[[50,50],256],12883:[[50,51],256],12884:[[50,52],256],12885:[[50,53],256],12886:[[50,54],256],12887:[[50,55],256],12888:[[50,56],256],12889:[[50,57],256],12890:[[51,48],256],12891:[[51,49],256],12892:[[51,50],256],12893:[[51,51],256],12894:[[51,52],256],12895:[[51,53],256],12896:[[4352],256],12897:[[4354],256],12898:[[4355],256],12899:[[4357],256],12900:[[4358],256],12901:[[4359],256],12902:[[4361],256],12903:[[4363],256],12904:[[4364],256],12905:[[4366],256],12906:[[4367],256],12907:[[4368],256],12908:[[4369],256],12909:[[4370],256],12910:[[4352,4449],256],12911:[[4354,4449],256],12912:[[4355,4449],256],12913:[[4357,4449],256],12914:[[4358,4449],256],12915:[[4359,4449],256],12916:[[4361,4449],256],12917:[[4363,4449],256],12918:[[4364,4449],256],12919:[[4366,4449],256],12920:[[4367,4449],256],12921:[[4368,4449],256],12922:[[4369,4449],256],12923:[[4370,4449],256],12924:[[4366,4449,4535,4352,4457],256],12925:[[4364,4462,4363,4468],256],12926:[[4363,4462],256],12928:[[19968],256],12929:[[20108],256],12930:[[19977],256],12931:[[22235],256],12932:[[20116],256],12933:[[20845],256],12934:[[19971],256],12935:[[20843],256],12936:[[20061],256],12937:[[21313],256],12938:[[26376],256],12939:[[28779],256],12940:[[27700],256],12941:[[26408],256],12942:[[37329],256],12943:[[22303],256],12944:[[26085],256],12945:[[26666],256],12946:[[26377],256],12947:[[31038],256],12948:[[21517],256],12949:[[29305],256],12950:[[36001],256],12951:[[31069],256],12952:[[21172],256],12953:[[31192],256],12954:[[30007],256],12955:[[22899],256],12956:[[36969],256],12957:[[20778],256],12958:[[21360],256],12959:[[27880],256],12960:[[38917],256],12961:[[20241],256],12962:[[20889],256],12963:[[27491],256],12964:[[19978],256],12965:[[20013],256],12966:[[19979],256],12967:[[24038],256],12968:[[21491],256],12969:[[21307],256],12970:[[23447],256],12971:[[23398],256],12972:[[30435],256],12973:[[20225],256],12974:[[36039],256],12975:[[21332],256],12976:[[22812],256],12977:[[51,54],256],12978:[[51,55],256],12979:[[51,56],256],12980:[[51,57],256],12981:[[52,48],256],12982:[[52,49],256],12983:[[52,50],256],12984:[[52,51],256],12985:[[52,52],256],12986:[[52,53],256],12987:[[52,54],256],12988:[[52,55],256],12989:[[52,56],256],12990:[[52,57],256],12991:[[53,48],256],12992:[[49,26376],256],12993:[[50,26376],256],12994:[[51,26376],256],12995:[[52,26376],256],12996:[[53,26376],256],12997:[[54,26376],256],12998:[[55,26376],256],12999:[[56,26376],256],13
70123000:[[57,26376],256],13001:[[49,48,26376],256],13002:[[49,49,26376],256],13003:[[49,50,26376],256],13004:[[72,103],256],13005:[[101,114,103],256],13006:[[101,86],256],13007:[[76,84,68],256],13008:[[12450],256],13009:[[12452],256],13010:[[12454],256],13011:[[12456],256],13012:[[12458],256],13013:[[12459],256],13014:[[12461],256],13015:[[12463],256],13016:[[12465],256],13017:[[12467],256],13018:[[12469],256],13019:[[12471],256],13020:[[12473],256],13021:[[12475],256],13022:[[12477],256],13023:[[12479],256],13024:[[12481],256],13025:[[12484],256],13026:[[12486],256],13027:[[12488],256],13028:[[12490],256],13029:[[12491],256],13030:[[12492],256],13031:[[12493],256],13032:[[12494],256],13033:[[12495],256],13034:[[12498],256],13035:[[12501],256],13036:[[12504],256],13037:[[12507],256],13038:[[12510],256],13039:[[12511],256],13040:[[12512],256],13041:[[12513],256],13042:[[12514],256],13043:[[12516],256],13044:[[12518],256],13045:[[12520],256],13046:[[12521],256],13047:[[12522],256],13048:[[12523],256],13049:[[12524],256],13050:[[12525],256],13051:[[12527],256],13052:[[12528],256],13053:[[12529],256],13054:[[12530],256]},13056:{13056:[[12450,12497,12540,12488],256],13057:[[12450,12523,12501,12449],256],13058:[[12450,12531,12506,12450],256],13059:[[12450,12540,12523],256],13060:[[12452,12491,12531,12464],256],13061:[[12452,12531,12481],256],13062:[[12454,12457,12531],256],13063:[[12456,12473,12463,12540,12489],256],13064:[[12456,12540,12459,12540],256],13065:[[12458,12531,12473],256],13066:[[12458,12540,12512],256],13067:[[12459,12452,12522],256],13068:[[12459,12521,12483,12488],256],13069:[[12459,12525,12522,12540],256],13070:[[12460,12525,12531],256],13071:[[12460,12531,12510],256],13072:[[12462,12460],256],13073:[[12462,12491,12540],256],13074:[[12461,12517,12522,12540],256],13075:[[12462,12523,12480,12540],256],13076:[[12461,12525],256],13077:[[12461,12525,12464,12521,12512],256],13078:[[12461,12525,12513,12540,12488,12523],256],13079:[[12461,12525,12527,12483,12488],256],13080:[[12464,12521,12512],256],13081:[[12464,12521,12512,12488,12531],256],13082:[[12463,12523,12476,12452,12525],256],13083:[[12463,12525,12540,12493],256],13084:[[12465,12540,12473],256],13085:[[12467,12523,12490],256],13086:[[12467,12540,12509],256],13087:[[12469,12452,12463,12523],256],13088:[[12469,12531,12481,12540,12512],256],13089:[[12471,12522,12531,12464],256],13090:[[12475,12531,12481],256],13091:[[12475,12531,12488],256],13092:[[12480,12540,12473],256],13093:[[12487,12471],256],13094:[[12489,12523],256],13095:[[12488,12531],256],13096:[[12490,12494],256],13097:[[12494,12483,12488],256],13098:[[12495,12452,12484],256],13099:[[12497,12540,12475,12531,12488],256],13100:[[12497,12540,12484],256],13101:[[12496,12540,12524,12523],256],13102:[[12500,12450,12473,12488,12523],256],13103:[[12500,12463,12523],256],13104:[[12500,12467],256],13105:[[12499,12523],256],13106:[[12501,12449,12521,12483,12489],256],13107:[[12501,12451,12540,12488],256],13108:[[12502,12483,12471,12455,12523],256],13109:[[12501,12521,12531],256],13110:[[12504,12463,12479,12540,12523],256],13111:[[12506,12477],256],13112:[[12506,12491,12498],256],13113:[[12504,12523,12484],256],13114:[[12506,12531,12473],256],13115:[[12506,12540,12472],256],13116:[[12505,12540,12479],256],13117:[[12509,12452,12531,12488],256],13118:[[12508,12523,12488],256],13119:[[12507,12531],256],13120:[[12509,12531,12489],256],13121:[[12507,12540,12523],256],13122:[[12507,12540,12531],256],13123:[[12510,12452,12463,12525],256],13124:[[12510,12452,12523],256],13125:[[12510,12483,12495],256],13126:[[12510,12523,12463],256],13127:[[12510,12531,12471,12519,12531],256],13128:[[12511,12463,12525,12531],256],13129:[[12511,12522],256],13130:[[12511,12522,12496,12540,12523],256],13131:[[12513,12460],256],13132:[[12513,12460,12488,12531],256],13133:[[12513,12540,12488,12523],256],13134:[[12516,12540,12489],256],13135:[[12516,12540,12523],256],13136:[[12518,12450,12531],256],13137:[[12522,12483,12488,12523],256],13138:[[12522,12521],256],13139:[[12523,12500,12540],256],13140:[[12523,12540,12502,12523],256],13141:[[12524,12512],256],13142:[[12524,12531,12488,12466,12531],256],13143:[[12527,12483,12488],256],13144:[[48,28857],256],13145:[[49,28857],256],13146:[[50,28857],256],13147:[[51,28857],256],13148:[[52,28857],256],13149:[[53,28857],256],13150:[[54,28857],256],13151:[[55,28857],256],13152:[[56,28857],256],13153:[[57,28857],256],13154:[[49,48,28857],256],13155:[[49,49,28857],256],13156:[[49,50,28857],256],13157:[[49,51,28857],256],13158:[[49,52,28857],256],13159:[[49,53,28857],256],13160:[[49,54,28857],256],13161:[[49,55,28857],256],13162:[[49,56,28857],256],13163:[[49,57,28857],256],13164:[[50,48,28857],256],13165:[[50,49,28857],256],13166:[[50,50,28857],256],13167:[[50,51,28857],256],13168:[[50,52,28857],256],13169:[[104,80,97],256],13170:[[100,97],256],13171:[[65,85],256],13172:[[98,97,114],256],13173:[[111,86],256],13174:[[112,99],256],13175:[[100,109],256],13176:[[100,109,178],256],13177:[[100,109,179],256],13178:[[73,85],256],13179:[[24179,25104],256],13180:[[26157,21644],256],13181:[[22823,27491],256],13182:[[26126,27835],256],13183:[[26666,24335,20250,31038],256],13184:[[112,65],256],13185:[[110,65],256],13186:[[956,65],256],13187:[[109,65],256],13188:[[107,65],256],13189:[[75,66],256],13190:[[77,66],256],13191:[[71,66],256],13192:[[99,97,108],256],13193:[[107,99,97,108],256],13194:[[112,70],256],13195:[[110,70],256],13196:[[956,70],256],13197:[[956,103],256],13198:[[109,103],256],13199:[[107,103],256],13200:[[72,122],256],13201:[[107,72,122],256],13202:[[77,72,122],256],13203:[[71,72,122],256],13204:[[84,72,122],256],13205:[[956,8467],256],13206:[[109,8467],256],13207:[[100,8467],256],13208:[[107,8467],256],13209:[[102,109],256],13210:[[110,109],256],13211:[[956,109],256],13212:[[109,109],256],13213:[[99,109],256],13214:[[107,109],256],13215:[[109,109,178],256],13216:[[99,109,178],256],13217:[[109,178],256],13218:[[107,109,178],256],13219:[[109,109,179],256],13220:[[99,109,179],256],13221:[[109,179],256],13222:[[107,109,179],256],13223:[[109,8725,115],256],13224:[[109,8725,115,178],256],13225:[[80,97],256],13226:[[107,80,97],256],13227:[[77,80,97],256],13228:[[71,80,97],256],13229:[[114,97,100],256],13230:[[114,97,100,8725,115],256],13231:[[114,97,100,8725,115,178],256],13232:[[112,115],256],13233:[[110,115],256],13234:[[956,115],256],13235:[[109,115],256],13236:[[112,86],256],13237:[[110,86],256],13238:[[956,86],256],13239:[[109,86],256],13240:[[107,86],256],13241:[[77,86],256],13242:[[112,87],256],13243:[[110,87],256],13244:[[956,87],256],13245:[[109,87],256],13246:[[107,87],256],13247:[[77,87],256],13248:[[107,937],256],13249:[[77,937],256],13250:[[97,46,109,46],256],13251:[[66,113],256],13252:[[99,99],256],13253:[[99,100],256],13254:[[67,8725,107,103],256],13255:[[67,111,46],256],13256:[[100,66],256],13257:[[71,121],256],13258:[[104,97],256],13259:[[72,80],256],13260:[[105,110],256],13261:[[75,75],256],13262:[[7
vendor: 6,453 bytes, line 70123
701235,77],256],13263:[[107,116],256],13264:[[108,109],256],13265:[[108,110],256],13266:[[108,111,103],256],13267:[[108,120],256],13268:[[109,98],256],13269:[[109,105,108],256],13270:[[109,111,108],256],13271:[[80,72],256],13272:[[112,46,109,46],256],13273:[[80,80,77],256],13274:[[80,82],256],13275:[[115,114],256],13276:[[83,118],256],13277:[[87,98],256],13278:[[86,8725,109],256],13279:[[65,8725,109],256],13280:[[49,26085],256],13281:[[50,26085],256],13282:[[51,26085],256],13283:[[52,26085],256],13284:[[53,26085],256],13285:[[54,26085],256],13286:[[55,26085],256],13287:[[56,26085],256],13288:[[57,26085],256],13289:[[49,48,26085],256],13290:[[49,49,26085],256],13291:[[49,50,26085],256],13292:[[49,51,26085],256],13293:[[49,52,26085],256],13294:[[49,53,26085],256],13295:[[49,54,26085],256],13296:[[49,55,26085],256],13297:[[49,56,26085],256],13298:[[49,57,26085],256],13299:[[50,48,26085],256],13300:[[50,49,26085],256],13301:[[50,50,26085],256],13302:[[50,51,26085],256],13303:[[50,52,26085],256],13304:[[50,53,26085],256],13305:[[50,54,26085],256],13306:[[50,55,26085],256],13307:[[50,56,26085],256],13308:[[50,57,26085],256],13309:[[51,48,26085],256],13310:[[51,49,26085],256],13311:[[103,97,108],256]},27136:{92912:[,1],92913:[,1],92914:[,1],92915:[,1],92916:[,1]},27392:{92976:[,230],92977:[,230],92978:[,230],92979:[,230],92980:[,230],92981:[,230],92982:[,230]},42496:{42607:[,230],42612:[,230],42613:[,230],42614:[,230],42615:[,230],42616:[,230],42617:[,230],42618:[,230],42619:[,230],42620:[,230],42621:[,230],42652:[[1098],256],42653:[[1100],256],42655:[,230],42736:[,230],42737:[,230]},42752:{42864:[[42863],256],43000:[[294],256],43001:[[339],256]},43008:{43014:[,9],43204:[,9],43232:[,230],43233:[,230],43234:[,230],43235:[,230],43236:[,230],43237:[,230],43238:[,230],43239:[,230],43240:[,230],43241:[,230],43242:[,230],43243:[,230],43244:[,230],43245:[,230],43246:[,230],43247:[,230],43248:[,230],43249:[,230]},43264:{43307:[,220],43308:[,220],43309:[,220],43347:[,9],43443:[,7],43456:[,9]},43520:{43696:[,230],43698:[,230],43699:[,230],43700:[,220],43703:[,230],43704:[,230],43710:[,230],43711:[,230],43713:[,230],43766:[,9]},43776:{43868:[[42791],256],43869:[[43831],256],43870:[[619],256],43871:[[43858],256],44013:[,9]},48128:{113822:[,1]},53504:{119134:[[119127,119141],512],119135:[[119128,119141],512],119136:[[119135,119150],512],119137:[[119135,119151],512],119138:[[119135,119152],512],119139:[[119135,119153],512],119140:[[119135,119154],512],119141:[,216],119142:[,216],119143:[,1],119144:[,1],119145:[,1],119149:[,226],119150:[,216],119151:[,216],119152:[,216],119153:[,216],119154:[,216],119163:[,220],119164:[,220],119165:[,220],119166:[,220],119167:[,220],119168:[,220],119169:[,220],119170:[,220],119173:[,230],119174:[,230],119175:[,230],119176:[,230],119177:[,230],119178:[,220],119179:[,220],119210:[,230],119211:[,230],119212:[,230],119213:[,230],119227:[[119225,119141],512],119228:[[119226,119141],512],119229:[[119227,119150],512],119230:[[119228,119150],512],119231:[[119227,119151],512],119232:[[119228,119151],512]},53760:{119362:[,230],119363:[,230],119364:[,230]},54272:{119808:[[65],256],119809:[[66],256],119810:[[67],256],119811:[[68],256],119812:[[69],256],119813:[[70],256],119814:[[71],256],119815:[[72],256],119816:[[73],256],119817:[[74],256],119818:[[75],256],119819:[[76],256],119820:[[77],256],119821:[[78],256],119822:[[79],256],119823:[[80],256],119824:[[81],256],119825:[[82],256],119826:[[83],256],119827:[[84],256],119828:[[85],256],119829:[[86],256],119830:[[87],256],119831:[[88],256],119832:[[89],256],119833:[[90],256],119834:[[97],256],119835:[[98],256],119836:[[99],256],119837:[[100],256],119838:[[101],256],119839:[[102],256],119840:[[103],256],119841:[[104],256],119842:[[105],256],119843:[[106],256],119844:[[107],256],119845:[[108],256],119846:[[109],256],119847:[[110],256],119848:[[111],256],119849:[[112],256],119850:[[113],256],119851:[[114],256],119852:[[115],256],119853:[[116],256],119854:[[117],256],119855:[[118],256],119856:[[119],256],119857:[[120],256],119858:[[121],256],119859:[[122],256],119860:[[65],256],119861:[[66],256],119862:[[67],256],119863:[[68],256],119864:[[69],256],119865:[[70],256],119866:[[71],256],119867:[[72],256],119868:[[73],256],119869:[[74],256],119870:[[75],256],119871:[[76],256],119872:[[77],256],119873:[[78],256],119874:[[79],256],119875:[[80],256],119876:[[81],256],119877:[[82],256],119878:[[83],256],119879:[[84],256],119880:[[85],256],119881:[[86],256],119882:[[87],256],119883:[[88],256],119884:[[89],256],119885:[[90],256],119886:[[97],256],119887:[[98],256],119888:[[99],256],119889:[[100],256],119890:[[101],256],119891:[[102],256],119892:[[103],256],119894:[[105],256],119895:[[106],256],119896:[[107],256],119897:[[108],256],119898:[[109],256],119899:[[110],256],119900:[[111],256],119901:[[112],256],119902:[[113],256],119903:[[114],256],119904:[[115],256],119905:[[116],256],119906:[[117],256],119907:[[118],256],119908:[[119],256],119909:[[120],256],119910:[[121],256],119911:[[122],256],119912:[[65],256],119913:[[66],256],119914:[[67],256],119915:[[68],256],119916:[[69],256],119917:[[70],256],119918:[[71],256],119919:[[72],256],119920:[[73],256],119921:[[74],256],119922:[[75],256],119923:[[76],256],119924:[[77],256],119925:[[78],256],119926:[[79],256],119927:[[80],256],119928:[[81],256],119929:[[82],256],119930:[[83],256],119931:[[84],256],119932:[[85],256],119933:[[86],256],119934:[[87],256],119935:[[88],256],119936:[[89],256],119937:[[90],256],119938:[[97],256],119939:[[98],256],119940:[[99],256],119941:[[100],256],119942:[[101],256],119943:[[102],256],119944:[[103],256],119945:[[104],256],119946:[[105],256],119947:[[106],256],119948:[[107],256],119949:[[108],256],119950:[[109],256],119951:[[110],256],119952:[[111],256],119953:[[112],256],119954:[[113],256],119955:[[114],256],119956:[[115],256],119957:[[116],256],119958:[[117],256],119959:[[118],256],119960:[[119],256],119961:[[120],256],119962:[[121],256],119963:[[122],256],119964:[[65],256],119966:[[67],256],119967:[[68],256],119970:[[71],256],119973:[[74],256],119974:[[75],256],119977:[[78],256],119978:[[79],256],119979:[[80],256],119980:[[81],256],119982:[[83],256],119983:[[84],256],119984:[[85],256],119985:[[86],256],119986:[[87],256],119987:[[88],256],119988:[[89],256],119989:[[90],256],119990:[[97],256],119991:[[98],256],119992:[[99],256],119993:[[100],256],119995:[[102],256],119997:[[104],256],119998:[[105],256],119999:[[106],256],120000
vendor: 32,798 bytes, line 70123
70123:[[107],256],120001:[[108],256],120002:[[109],256],120003:[[110],256],120005:[[112],256],120006:[[113],256],120007:[[114],256],120008:[[115],256],120009:[[116],256],120010:[[117],256],120011:[[118],256],120012:[[119],256],120013:[[120],256],120014:[[121],256],120015:[[122],256],120016:[[65],256],120017:[[66],256],120018:[[67],256],120019:[[68],256],120020:[[69],256],120021:[[70],256],120022:[[71],256],120023:[[72],256],120024:[[73],256],120025:[[74],256],120026:[[75],256],120027:[[76],256],120028:[[77],256],120029:[[78],256],120030:[[79],256],120031:[[80],256],120032:[[81],256],120033:[[82],256],120034:[[83],256],120035:[[84],256],120036:[[85],256],120037:[[86],256],120038:[[87],256],120039:[[88],256],120040:[[89],256],120041:[[90],256],120042:[[97],256],120043:[[98],256],120044:[[99],256],120045:[[100],256],120046:[[101],256],120047:[[102],256],120048:[[103],256],120049:[[104],256],120050:[[105],256],120051:[[106],256],120052:[[107],256],120053:[[108],256],120054:[[109],256],120055:[[110],256],120056:[[111],256],120057:[[112],256],120058:[[113],256],120059:[[114],256],120060:[[115],256],120061:[[116],256],120062:[[117],256],120063:[[118],256]},54528:{120064:[[119],256],120065:[[120],256],120066:[[121],256],120067:[[122],256],120068:[[65],256],120069:[[66],256],120071:[[68],256],120072:[[69],256],120073:[[70],256],120074:[[71],256],120077:[[74],256],120078:[[75],256],120079:[[76],256],120080:[[77],256],120081:[[78],256],120082:[[79],256],120083:[[80],256],120084:[[81],256],120086:[[83],256],120087:[[84],256],120088:[[85],256],120089:[[86],256],120090:[[87],256],120091:[[88],256],120092:[[89],256],120094:[[97],256],120095:[[98],256],120096:[[99],256],120097:[[100],256],120098:[[101],256],120099:[[102],256],120100:[[103],256],120101:[[104],256],120102:[[105],256],120103:[[106],256],120104:[[107],256],120105:[[108],256],120106:[[109],256],120107:[[110],256],120108:[[111],256],120109:[[112],256],120110:[[113],256],120111:[[114],256],120112:[[115],256],120113:[[116],256],120114:[[117],256],120115:[[118],256],120116:[[119],256],120117:[[120],256],120118:[[121],256],120119:[[122],256],120120:[[65],256],120121:[[66],256],120123:[[68],256],120124:[[69],256],120125:[[70],256],120126:[[71],256],120128:[[73],256],120129:[[74],256],120130:[[75],256],120131:[[76],256],120132:[[77],256],120134:[[79],256],120138:[[83],256],120139:[[84],256],120140:[[85],256],120141:[[86],256],120142:[[87],256],120143:[[88],256],120144:[[89],256],120146:[[97],256],120147:[[98],256],120148:[[99],256],120149:[[100],256],120150:[[101],256],120151:[[102],256],120152:[[103],256],120153:[[104],256],120154:[[105],256],120155:[[106],256],120156:[[107],256],120157:[[108],256],120158:[[109],256],120159:[[110],256],120160:[[111],256],120161:[[112],256],120162:[[113],256],120163:[[114],256],120164:[[115],256],120165:[[116],256],120166:[[117],256],120167:[[118],256],120168:[[119],256],120169:[[120],256],120170:[[121],256],120171:[[122],256],120172:[[65],256],120173:[[66],256],120174:[[67],256],120175:[[68],256],120176:[[69],256],120177:[[70],256],120178:[[71],256],120179:[[72],256],120180:[[73],256],120181:[[74],256],120182:[[75],256],120183:[[76],256],120184:[[77],256],120185:[[78],256],120186:[[79],256],120187:[[80],256],120188:[[81],256],120189:[[82],256],120190:[[83],256],120191:[[84],256],120192:[[85],256],120193:[[86],256],120194:[[87],256],120195:[[88],256],120196:[[89],256],120197:[[90],256],120198:[[97],256],120199:[[98],256],120200:[[99],256],120201:[[100],256],120202:[[101],256],120203:[[102],256],120204:[[103],256],120205:[[104],256],120206:[[105],256],120207:[[106],256],120208:[[107],256],120209:[[108],256],120210:[[109],256],120211:[[110],256],120212:[[111],256],120213:[[112],256],120214:[[113],256],120215:[[114],256],120216:[[115],256],120217:[[116],256],120218:[[117],256],120219:[[118],256],120220:[[119],256],120221:[[120],256],120222:[[121],256],120223:[[122],256],120224:[[65],256],120225:[[66],256],120226:[[67],256],120227:[[68],256],120228:[[69],256],120229:[[70],256],120230:[[71],256],120231:[[72],256],120232:[[73],256],120233:[[74],256],120234:[[75],256],120235:[[76],256],120236:[[77],256],120237:[[78],256],120238:[[79],256],120239:[[80],256],120240:[[81],256],120241:[[82],256],120242:[[83],256],120243:[[84],256],120244:[[85],256],120245:[[86],256],120246:[[87],256],120247:[[88],256],120248:[[89],256],120249:[[90],256],120250:[[97],256],120251:[[98],256],120252:[[99],256],120253:[[100],256],120254:[[101],256],120255:[[102],256],120256:[[103],256],120257:[[104],256],120258:[[105],256],120259:[[106],256],120260:[[107],256],120261:[[108],256],120262:[[109],256],120263:[[110],256],120264:[[111],256],120265:[[112],256],120266:[[113],256],120267:[[114],256],120268:[[115],256],120269:[[116],256],120270:[[117],256],120271:[[118],256],120272:[[119],256],120273:[[120],256],120274:[[121],256],120275:[[122],256],120276:[[65],256],120277:[[66],256],120278:[[67],256],120279:[[68],256],120280:[[69],256],120281:[[70],256],120282:[[71],256],120283:[[72],256],120284:[[73],256],120285:[[74],256],120286:[[75],256],120287:[[76],256],120288:[[77],256],120289:[[78],256],120290:[[79],256],120291:[[80],256],120292:[[81],256],120293:[[82],256],120294:[[83],256],120295:[[84],256],120296:[[85],256],120297:[[86],256],120298:[[87],256],120299:[[88],256],120300:[[89],256],120301:[[90],256],120302:[[97],256],120303:[[98],256],120304:[[99],256],120305:[[100],256],120306:[[101],256],120307:[[102],256],120308:[[103],256],120309:[[104],256],120310:[[105],256],120311:[[106],256],120312:[[107],256],120313:[[108],256],120314:[[109],256],120315:[[110],256],120316:[[111],256],120317:[[112],256],120318:[[113],256],120319:[[114],256]},54784:{120320:[[115],256],120321:[[116],256],120322:[[117],256],120323:[[118],256],120324:[[119],256],120325:[[120],256],120326:[[121],256],120327:[[122],256],120328:[[65],256],120329:[[66],256],120330:[[67],256],120331:[[68],256],120332:[[69],256],120333:[[70],256],120334:[[71],256],120335:[[72],256],120336:[[73],256],120337:[[74],256],120338:[[75],256],120339:[[76],256],120340:[[77],256],120341:[[78],256],120342:[[79],256],120343:[[80],256],120344:[[81],256],120345:[[82],256],120346:[[83],256],120347:[[84],256],120348:[[85],256],120349:[[86],256],120350:[[87],256],120351:[[88],256],120352:[[89],256],120353:[[90],256],120354:[[97],256],120355:[[98],256],120356:[[99],256],120357:[[100],256],120358:[[101],256],120359:[[102],256],120360:[[103],256],120361:[[104],256],120362:[[105],256],120363:[[106],256],120364:[[107],256],120365:[[108],256],120366:[[109],256],120367:[[110],256],120368:[[111],256],120369:[[112],256],120370:[[113],256],120371:[[114],256],120372:[[115],256],120373:[[116],256],120374:[[117],256],120375:[[118],256],120376:[[119],256],120377:[[120],256],120378:[[121],256],120379:[[122],256],120380:[[65],256],120381:[[66],256],120382:[[67],256],120383:[[68],256],120384:[[69],256],120385:[[70],256],120386:[[71],256],120387:[[72],256],120388:[[73],256],120389:[[74],256],120390:[[75],256],120391:[[76],256],120392:[[77],256],120393:[[78],256],120394:[[79],256],120395:[[80],256],120396:[[81],256],120397:[[82],256],120398:[[83],256],120399:[[84],256],120400:[[85],256],120401:[[86],256],120402:[[87],256],120403:[[88],256],120404:[[89],256],120405:[[90],256],120406:[[97],256],120407:[[98],256],120408:[[99],256],120409:[[100],256],120410:[[101],256],120411:[[102],256],120412:[[103],256],120413:[[104],256],120414:[[105],256],120415:[[106],256],120416:[[107],256],120417:[[108],256],120418:[[109],256],120419:[[110],256],120420:[[111],256],120421:[[112],256],120422:[[113],256],120423:[[114],256],120424:[[115],256],120425:[[116],256],120426:[[117],256],120427:[[118],256],120428:[[119],256],120429:[[120],256],120430:[[121],256],120431:[[122],256],120432:[[65],256],120433:[[66],256],120434:[[67],256],120435:[[68],256],120436:[[69],256],120437:[[70],256],120438:[[71],256],120439:[[72],256],120440:[[73],256],120441:[[74],256],120442:[[75],256],120443:[[76],256],120444:[[77],256],120445:[[78],256],120446:[[79],256],120447:[[80],256],120448:[[81],256],120449:[[82],256],120450:[[83],256],120451:[[84],256],120452:[[85],256],120453:[[86],256],120454:[[87],256],120455:[[88],256],120456:[[89],256],120457:[[90],256],120458:[[97],256],120459:[[98],256],120460:[[99],256],120461:[[100],256],120462:[[101],256],120463:[[102],256],120464:[[103],256],120465:[[104],256],120466:[[105],256],120467:[[106],256],120468:[[107],256],120469:[[108],256],120470:[[109],256],120471:[[110],256],120472:[[111],256],120473:[[112],256],120474:[[113],256],120475:[[114],256],120476:[[115],256],120477:[[116],256],120478:[[117],256],120479:[[118],256],120480:[[119],256],120481:[[120],256],120482:[[121],256],120483:[[122],256],120484:[[305],256],120485:[[567],256],120488:[[913],256],120489:[[914],256],120490:[[915],256],120491:[[916],256],120492:[[917],256],120493:[[918],256],120494:[[919],256],120495:[[920],256],120496:[[921],256],120497:[[922],256],120498:[[923],256],120499:[[924],256],120500:[[925],256],120501:[[926],256],120502:[[927],256],120503:[[928],256],120504:[[929],256],120505:[[1012],256],120506:[[931],256],120507:[[932],256],120508:[[933],256],120509:[[934],256],120510:[[935],256],120511:[[936],256],120512:[[937],256],120513:[[8711],256],120514:[[945],256],120515:[[946],256],120516:[[947],256],120517:[[948],256],120518:[[949],256],120519:[[950],256],120520:[[951],256],120521:[[952],256],120522:[[953],256],120523:[[954],256],120524:[[955],256],120525:[[956],256],120526:[[957],256],120527:[[958],256],120528:[[959],256],120529:[[960],256],120530:[[961],256],120531:[[962],256],120532:[[963],256],120533:[[964],256],120534:[[965],256],120535:[[966],256],120536:[[967],256],120537:[[968],256],120538:[[969],256],120539:[[8706],256],120540:[[1013],256],120541:[[977],256],120542:[[1008],256],120543:[[981],256],120544:[[1009],256],120545:[[982],256],120546:[[913],256],120547:[[914],256],120548:[[915],256],120549:[[916],256],120550:[[917],256],120551:[[918],256],120552:[[919],256],120553:[[920],256],120554:[[921],256],120555:[[922],256],120556:[[923],256],120557:[[924],256],120558:[[925],256],120559:[[926],256],120560:[[927],256],120561:[[928],256],120562:[[929],256],120563:[[1012],256],120564:[[931],256],120565:[[932],256],120566:[[933],256],120567:[[934],256],120568:[[935],256],120569:[[936],256],120570:[[937],256],120571:[[8711],256],120572:[[945],256],120573:[[946],256],120574:[[947],256],120575:[[948],256]},55040:{120576:[[949],256],120577:[[950],256],120578:[[951],256],120579:[[952],256],120580:[[953],256],120581:[[954],256],120582:[[955],256],120583:[[956],256],120584:[[957],256],120585:[[958],256],120586:[[959],256],120587:[[960],256],120588:[[961],256],120589:[[962],256],120590:[[963],256],120591:[[964],256],120592:[[965],256],120593:[[966],256],120594:[[967],256],120595:[[968],256],120596:[[969],256],120597:[[8706],256],120598:[[1013],256],120599:[[977],256],120600:[[1008],256],120601:[[981],256],120602:[[1009],256],120603:[[982],256],120604:[[913],256],120605:[[914],256],120606:[[915],256],120607:[[916],256],120608:[[917],256],120609:[[918],256],120610:[[919],256],120611:[[920],256],120612:[[921],256],120613:[[922],256],120614:[[923],256],120615:[[924],256],120616:[[925],256],120617:[[926],256],120618:[[927],256],120619:[[928],256],120620:[[929],256],120621:[[1012],256],120622:[[931],256],120623:[[932],256],120624:[[933],256],120625:[[934],256],120626:[[935],256],120627:[[936],256],120628:[[937],256],120629:[[8711],256],120630:[[945],256],120631:[[946],256],120632:[[947],256],120633:[[948],256],120634:[[949],256],120635:[[950],256],120636:[[951],256],120637:[[952],256],120638:[[953],256],120639:[[954],256],120640:[[955],256],120641:[[956],256],120642:[[957],256],120643:[[958],256],120644:[[959],256],120645:[[960],256],120646:[[961],256],120647:[[962],256],120648:[[963],256],120649:[[964],256],120650:[[965],256],120651:[[966],256],120652:[[967],256],120653:[[968],256],120654:[[969],256],120655:[[8706],256],120656:[[1013],256],120657:[[977],256],120658:[[1008],256],120659:[[981],256],120660:[[1009],256],120661:[[982],256],120662:[[913],256],120663:[[914],256],120664:[[915],256],120665:[[916],256],120666:[[917],256],120667:[[918],256],120668:[[919],256],120669:[[920],256],120670:[[921],256],120671:[[922],256],120672:[[923],256],120673:[[924],256],120674:[[925],256],120675:[[926],256],120676:[[927],256],120677:[[928],256],120678:[[929],256],120679:[[1012],256],120680:[[931],256],120681:[[932],256],120682:[[933],256],120683:[[934],256],120684:[[935],256],120685:[[936],256],120686:[[937],256],120687:[[8711],256],120688:[[945],256],120689:[[946],256],120690:[[947],256],120691:[[948],256],120692:[[949],256],120693:[[950],256],120694:[[951],256],120695:[[952],256],120696:[[953],256],120697:[[954],256],120698:[[955],256],120699:[[956],256],120700:[[957],256],120701:[[958],256],120702:[[959],256],120703:[[960],256],120704:[[961],256],120705:[[962],256],120706:[[963],256],120707:[[964],256],120708:[[965],256],120709:[[966],256],120710:[[967],256],120711:[[968],256],120712:[[969],256],120713:[[8706],256],120714:[[1013],256],120715:[[977],256],120716:[[1008],256],120717:[[981],256],120718:[[1009],256],120719:[[982],256],120720:[[913],256],120721:[[914],256],120722:[[915],256],120723:[[916],256],120724:[[917],256],120725:[[918],256],120726:[[919],256],120727:[[920],256],120728:[[921],256],120729:[[922],256],120730:[[923],256],120731:[[924],256],120732:[[925],256],120733:[[926],256],120734:[[927],256],120735:[[928],256],120736:[[929],256],120737:[[1012],256],120738:[[931],256],120739:[[932],256],120740:[[933],256],120741:[[934],256],120742:[[935],256],120743:[[936],256],120744:[[937],256],120745:[[8711],256],120746:[[945],256],120747:[[946],256],120748:[[947],256],120749:[[948],256],120750:[[949],256],120751:[[950],256],120752:[[951],256],120753:[[952],256],120754:[[953],256],120755:[[954],256],120756:[[955],256],120757:[[956],256],120758:[[957],256],120759:[[958],256],120760:[[959],256],120761:[[960],256],120762:[[961],256],120763:[[962],256],120764:[[963],256],120765:[[964],256],120766:[[965],256],120767:[[966],256],120768:[[967],256],120769:[[968],256],120770:[[969],256],120771:[[8706],256],120772:[[1013],256],120773:[[977],256],120774:[[1008],256],120775:[[981],256],120776:[[1009],256],120777:[[982],256],120778:[[988],256],120779:[[989],256],120782:[[48],256],120783:[[49],256],120784:[[50],256],120785:[[51],256],120786:[[52],256],120787:[[53],256],120788:[[54],256],120789:[[55],256],120790:[[56],256],120791:[[57],256],120792:[[48],256],120793:[[49],256],120794:[[50],256],120795:[[51],256],120796:[[52],256],120797:[[53],256],120798:[[54],256],120799:[[55],256],120800:[[56],256],120801:[[57],256],120802:[[48],256],120803:[[49],256],120804:[[50],256],120805:[[51],256],120806:[[52],256],120807:[[53],256],120808:[[54],256],120809:[[55],256],120810:[[56],256],120811:[[57],256],120812:[[48],256],120813:[[49],256],120814:[[50],256],120815:[[51],256],120816:[[52],256],120817:[[53],256],120818:[[54],256],120819:[[55],256],120820:[[56],256],120821:[[57],256],120822:[[48],256],120823:[[49],256],120824:[[50],256],120825:[[51],256],120826:[[52],256],120827:[[53],256],120828:[[54],256],120829:[[55],256],120830:[[56],256],120831:[[57],256]},59392:{125136:[,220],125137:[,220],125138:[,220],125139:[,220],125140:[,220],125141:[,220],125142:[,220]},60928:{126464:[[1575],256],126465:[[1576],256],126466:[[1580],256],126467:[[1583],256],126469:[[1608],256],126470:[[1586],256],126471:[[1581],256],126472:[[1591],256],126473:[[1610],256],126474:[[1603],256],126475:[[1604],256],126476:[[1605],256],126477:[[1606],256],126478:[[1587],256],126479:[[1593],256],126480:[[1601],256],126481:[[1589],256],126482:[[1602],256],126483:[[1585],256],126484:[[1588],256],126485:[[1578],256],126486:[[1579],256],126487:[[1582],256],126488:[[1584],256],126489:[[1590],256],126490:[[1592],256],126491:[[1594],256],126492:[[1646],256],126493:[[1722],256],126494:[[1697],256],126495:[[1647],256],126497:[[1576],256],126498:[[1580],256],126500:[[1607],256],126503:[[1581],256],126505:[[1610],256],126506:[[1603],256],126507:[[1604],256],126508:[[1605],256],126509:[[1606],256],126510:[[1587],256],126511:[[1593],256],126512:[[1601],256],126513:[[1589],256],126514:[[1602],256],126516:[[1588],256],126517:[[1578],256],126518:[[1579],256],126519:[[1582],256],126521:[[1590],256],126523:[[1594],256],126530:[[1580],256],126535:[[1581],256],126537:[[1610],256],126539:[[1604],256],126541:[[1606],256],126542:[[1587],256],126543:[[1593],256],126545:[[1589],256],126546:[[1602],256],126548:[[1588],256],126551:[[1582],256],126553:[[1590],256],126555:[[1594],256],126557:[[1722],256],126559:[[1647],256],126561:[[1576],256],126562:[[1580],256],126564:[[1607],256],126567:[[1581],256],126568:[[1591],256],126569:[[1610],256],126570:[[1603],256],126572:[[1605],256],126573:[[1606],256],126574:[[1587],256],126575:[[1593],256],126576:[[1601],256],126577:[[1589],256],126578:[[1602],256],126580:[[1588],256],126581:[[1578],256],126582:[[1579],256],126583:[[1582],256],126585:[[1590],256],126586:[[1592],256],126587:[[1594],256],126588:[[1646],256],126590:[[1697],256],126592:[[1575],256],126593:[[1576],256],126594:[[1580],256],126595:[[1583],256],126596:[[1607],256],126597:[[1608],256],126598:[[1586],256],126599:[[1581],256],126600:[[1591],256],126601:[[1610],256],126603:[[1604],256],126604:[[1605],256],126605:[[1606],256],126606:[[1587],256],126607:[[1593],256],126608:[[1601],256],126609:[[1589],256],126610:[[1602],256],126611:[[1585],256],126612:[[1588],256],126613:[[1578],256],126614:[[1579],256],126615:[[1582],256],126616:[[1584],256],126617:[[1590],256],126618:[[1592],256],126619:[[1594],256],126625:[[1576],256],126626:[[1580],256],126627:[[1583],256],126629:[[1608],256],126630:[[1586],256],126631:[[1581],256],126632:[[1591],256],126633:[[1610],256],126635:[[1604],256],126636:[[1605],256],126637:[[1606],256],126638:[[1587],256],126639:[[1593],256],126640:[[1601],256],126641:[[1589],256],126642:[[1602],256],126643:[[1585],256],126644:[[1588],256],126645:[[1578],256],126646:[[1579],256],126647:[[1582],256],126648:[[1584],256],126649:[[1590],256],126650:[[1592],256],126651:[[1594],256]},61696:{127232:[[48,46],256],127233:[[48,44],256],127234:[[49,44],256],127235:[[50,44],256],127236:[[51,44],256],127237:[[52,44],256],127238:[[53,44],256],127239:[[54,44],256],127240:[[55,44],256],127241:[[56,44],256],127242:[[57,44],256],127248:[[40,65,41],256],127249:[[40,66,41],256],127250:[[40,67,41],256],127251:[[40,68,41],256],127252:[[40,69,41],256],127253:[[40,70,41],256],127254:[[40,71,41],256],127255:[[40,72,41],256],127256:[[40,73,41],256],127257:[[40,74,41],256],127258:[[40,75,41],256],127259:[[40,76,41],256],127260:[[40,77,41],256],127261:[[40,78,41],256],127262:[[40,79,41],256],127263:[[40,80,41],256],127264:[[40,81,41],256],127265:[[40,82,41],256],127266:[[40,83,41],256],127267:[[40,84,41],256],127268:[[40,85,41],256],127269:[[40,86,41],256],127270:[[40,87,41],256],127271:[[40,88,41],256],127272:[[40,89,41],256],127273:[[40,90,41],256],127274:[[12308,83,12309],256],127275:[[67],256],127276:[[82],256],127277:[[67,68],256],127278:[[87,90],256],127280:[[65],256],127281:[[66],256],127282:[[67],256],127283:[[68],256],127284:[[69],256],127285:[[70],256],127286:[[71],256],127287:[[72],256],127288:[[73],256],127289:[[74],256],127290:[[75],256],127291:[[76],256],127292:[[77],256],127293:[[78],256],127294:[[79],256],127295:[[80],256],127296:[[81],256],127297:[[82],256],127298:[[83],256],127299:[[84],256],127300:[[85],256],127301:[[86],256],127302:[[87],256],127303:[[88],256],127304:[[89],256],127305:[[90],256],127306:[[72,86],256],127307:[[77,86],256],127308:[[83,68],256],127309:[[83,83],256],127310:[[80,80,86],256],127311:[[87,67],256],127338:[[77,67],256],127339:[[77,68],256],127376:[[68,74],256]},61952:{127488:[[12411,12363],256],127489:[[12467,12467],256],127490:[[12469],256],127504:[[25163],256],127505:[[23383],256],127506:[[21452],256],127507:[[12487],256],127508:[[20108],256],127509:[[22810],256],127510:[[35299],256],127511:[[22825],256],127512:[[20132],256],127513:[[26144],256],127514:[[28961],256],127515:[[26009],256],127516:[[21069],256],127517:[[24460],256],127518:[[20877],256],127519:[[26032],256],127520:[[21021],256],127521:[[32066],256],127522:[[29983],256],127523:[[36009],256],127524:[[22768],256],127525:[[21561],256],127526:[[28436],256],127527:[[25237],256],127528:[[25429],256],127529:[[19968],256],127530:[[19977],256],127531:[[36938],256],127532:[[24038],256],127533:[[20013],256],127534:[[21491],256],127535:[[25351],256],127536:[[36208],256],127537:[[25171],256],127538:[[31105],256],127539:[[31354],256],127540:[[21512],256],127541:[[28288],256],127542:[[26377],256],127543:[[26376],256],127544:[[30003],256],127545:[[21106],256],127546:[[21942],256],127552:[[12308,26412,12309],256],127553:[[12308,19977,12309],256],127554:[[12308,20108,12309],256],127555:[[12308,23433,12309],256],127556:[[12308,28857,12309],256],127557:[[12308,25171,12309],256],127558:[[12308,30423,12309],256],127559:[[12308,21213,12309],256],127560:[[12308,25943,12309],256],127568:[[24471],256],127569:[[21487],256]},63488:{194560:[[20029]],194561:[[20024]],194562:[[20033]],194563:[[131362]],194564:[[20320]],194565:[[20398]],194566:[[20411]],194567:[[20482]],194568:[[20602]],194569:[[20633]],194570:[[20711]],194571:[[20687]],194572:[[13470]],194573:[[132666]],194574:[[20813]],194575:[[20820]],194576:[[20836]],194577:[[20855]],194578:[[132380]],194579:[[13497]],194580:[[20839]],194581:[[20877]],194582:[[132427]],194583:[[20887]],194584:[[20900]],194585:[[20172]],194586:[[20908]],194587:[[20917]],194588:[[168415]],194589:[[20981]],194590:[[20995]],194591:[[13535]],194592:[[21051]],194593:[[21062]],194594:[[21106]],194595:[[21111]],194596:[[13589]],194597:[[21191]],194598:[[21193]],194599:[[21220]],194600:[[21242]],194601:[[21253]],194602:[[21254]],194603:[[21271]],194604:[[21321]],194605:[[21329]],194606:[[21338]],194607:[[21363]],194608:[[21373]],194609:[[21375]],194610:[[21375]],194611:[[21375]],194612:[[133676]],194613:[[28784]],194614:[[21450]],194615:[[21471]],194616:[[133987]],194617:[[21483]],194618:[[21489]],194619:[[21510]],194620:[[21662]],194621:[[21560]],194622:[[21576]],194623:[[21608]],194624:[[21666]],194625:[[21750]],194626:[[21776]],194627:[[21843]],194628:[[21859]],194629:[[21892]],194630:[[21892]],194631:[[21913]],194632:[[21931]],194633:[[21939]],194634:[[21954]],194635:[[22294]],194636:[[22022]],194637:[[22295]],194638:[[22097]],194639:[[22132]],194640:[[20999]],194641:[[22766]],194642:[[22478]],194643:[[22516]],194644:[[22541]],194645:[[22411]],194646:[[22578]],194647:[[22577]],194648:[[22700]],194649:[[136420]],194650:[[22770]],194651:[[22775]],194652:[[22790]],194653:[[22810]],194654:[[22818]],194655:[[22882]],194656:[[136872]],194657:[[136938]],194658:[[23020]],194659:[[23067]],194660:[[23079]],194661:[[23e3]],194662:[[23142]],194663:[[14062]],194664:[[14076]],194665:[[23304]],194666:[[23358]],194667:[[23358]],194668:[[137672]],194669:[[23491]],194670:[[23512]],194671:[[23527]],194672:[[23539]],194673:[[138008]],194674:[[23551]],194675:[[23558]],194676:[[24403]],194677:[[23586]],194678:[[14209]],194679:[[23648]],194680:[[23662]],194681:[[23744]],194682:[[23693]],194683:[[138724]],194684:[[23875]],194685:[[138726]],194686:[[23918]],194687:[[23915]],194688:[[23932]],194689:[[24033]],194690:[[24034]],194691:[[14383]],194692:[[24061]],194693:[[24104]],194694:[[24125]],194695:[[24169]],194696:[[14434]],194697:[[139651]],194698:[[14460]],194699:[[24240]],194700:[[24243]],194701:[[24246]],194702:[[24266]],194703:[[172946]],194704:[[24318]],194705:[[140081]],194706:[[140081]],194707:[[33281]],194708:[[24354]],194709:[[24354]],194710:[[14535]],194711:[[144056]],194712:[[156122]],194713:[[24418]],194714:[[24427]],194715:[[14563]],194716:[[24474]],194717:[[24525]],194718:[[24535]],194719:[[24569]],194720:[[24705]],194721:[[14650]],194722:[[14620]],194723:[[24724]],194724:[[141012]],194725:[[24775]],194726:[[24904]],194727:[[24908]],194728:[[24910]],194729:[[24908]],194730:[[24954]],194731:[[24974]],194732:[[25010]],194733:[[24996]],194734:[[25007]],194735:[[25054]],194736:[[25074]],194737:[[25078]],194738:[[25104]],194739:[[25115]],194740:[[25181]],194741:[[25265]],194742:[[25300]],194743:[[25424]],194744:[[142092]],194745:[[25405]],194746:[[25340]],194747:[[25448]],194748:[[25475]],194749:[[25572]],194750:[[142321]],194751:[[25634]],194752:[[25541]],194753:[[25513]],194754:[[14894]],194755:[[25705]],194756:[[25726]],194757:[[25757]],194758:[[25719]],194759:[[14956]],194760:[[25935]],194761:[[25964]],194762:[[143370]],194763:[[26083]],194764:[[26360]],194765:[[26185]],194766:[[15129]],194767:[[26257]],194768:[[15112]],194769:[[15076]],194770:[[20882]],194771:[[20885]],194772:[[26368]],194773:[[26268]],194774:[[32941]],194775:[[17369]],194776:[[26391]],194777:[[26395]],194778:[[26401]],194779:[[26462]],194780:[[26451]],194781:[[144323]],194782:[[15177]],194783:[[26618]],194784:[[26501]],194785:[[26706]],194786:[[26757]],194787:[[144493]],194788:[[26766]],194789:[[26655]],194790:[[26900]],194791:[[15261]],194792:[[26946]],194793:[[27043]],194794:[[27114]],194795:[[27304]],194796:[[145059]],194797:[[27355]],194798:[[15384]],194799:[[27425]],194800:[[145575]],194801:[[27476]],194802:[[15438]],194803:[[27506]],194804:[[27551]],194805:[[27578]],194806:[[27579]],194807:[[146061]],194808:[[138507]],194809:[[146170]],194810:[[27726]],194811:[[146620]],194812:[[27839]],194813:[[27853]],194814:[[27751]],194815:[[27926]]},63744:{63744:[[35912]],63745:[[26356]],63746:[[36554]],63747:[[36040]],63748:[[28369]],63749:[[20018]],63750:[[21477]],63751:[[40860]],63752:[[40860]],63753:[[22865]],63754:[[37329]],63755:[[21895]],63756:[[22856]],63757:[[25078]],63758:[[30313]],63759:[[32645]],63760:[[34367]],63761:[[34746]],63762:[[35064]],63763:[[37007]],63764:[[27138]],63765:[[27931]],63766:[[28889]],63767:[[29662]],63768:[[33853]],63769:[[37226]],63770:[[39409]],63771:[[20098]],63772:[[21365]],63773:[[27396]],63774:[[29211]],63775:[[34349]],63776:[[40478]],63777:[[23888]],63778:[[28651]],63779:[[34253]],63780:[[35172]],63781:[[25289]],63782:[[33240]],63783:[[34847]],63784:[[24266]],63785:[[26391]],63786:[[28010]],63787:[[29436]],63788:[[37070]],63789:[[20358]],63790:[[20919]],63791:[[21214]],63792:[[25796]],63793:[[27347]],63794:[[29200]],63795:[[30439]],63796:[[32769]],63797:[[34310]],63798:[[34396]],63799:[[36335]],63800:[[38706]],63801:[[39791]],63802:[[40442]],63803:[[30860]],63804:[[31103]],63805:[[32160]],63806:[[33737]],63807:[[37636]],63808:[[40575]],63809:[[35542]],63810:[[22751]],63811:[[24324]],63812:[[31840]],63813:[[32894]],63814:[[29282]],63815:[[30922]],63816:[[36034]],63817:[[38647]],63818:[[22744]],63819:[[23650]],63820:[[27155]],63821:[[28122]],63822:[[28431]],63823:[[32047]],63824:[[32311]],63825:[[38475]],63826:[[21202]],63827:[[32907]],63828:[[20956]],63829:[[20940]],63830:[[31260]],63831:[[32190]],63832:[[33777]],63833:[[38517]],63834:[[35712]],63835:[[25295]],63836:[[27138]],63837:[[35582]],63838:[[20025]],63839:[[23527]],63840:[[24594]],63841:[[29575]],63842:[[30064]],63843:[[21271]],63844:[[30971]],63845:[[20415]],63846:[[24489]],63847:[[19981]],63848:[[27852]],63849:[[25976]],63850:[[32034]],63851:[[21443]],63852:[[22622]],63853:[[30465]],63854:[[33865]],63855:[[35498]],63856:[[27578]],63857:[[36784]],63858:[[27784]],63859:[[25342]],63860:[[33509]],63861:[[25504]],63862:[[30053]],63863:[[20142]],63864:[[20841]],63865:[[20937]],63866:[[26753]],63867:[[31975]],63868:[[33391]],63869:[[35538]],63870:[[37327]],63871:[[21237]],63872:[[21570]],63873:[[22899]],63874:[[24300]],63875:[[26053]],63876:[[28670]],63877:[[31018]],63878:[[38317]],63879:[[39530]],63880:[[40599]],63881:[[40654]],63882:[[21147]],63883:[[26310]],63884:[[27511]],63885:[[36706]],63886:[[24180]],63887:[[24976]],63888:[[25088]],63889:[[25754]],63890:[[28451]],63891:[[29001]],63892:[[29833]],63893:[[31178]],63894:[[32244]],63895:[[32879]],63896:[[36646]],63897:[[34030]],63898:[[36899]],63899:[[37706]],63900:[[21015]],63901:[[21155]],63902:[[21693]],63903:[[28872]],63904:[[35010]],63905:[[35498]],63906:[[24265]],63907:[[24565]],63908:[[25467]],63909:[[27566]],63910:[[31806]],63911:[[29557]],63912:[[20196]],63913:[[22265]],63914:[[23527]],63915:[[23994]],63916:[[24604]],63917:[[29618]],63918:[[29801]],63919:[[32666]],63920:[[32838]],63921:[[37428]],63922:[[38646]],63923:[[38728]],63924:[[38936]],63925:[[20363]],63926:[[31150]],63927:[[37300]],63928:[[38584]],63929:[[24801]],63930:[[20102]],63931:[[20698]],63932:[[23534]],63933:[[23615]],63934:[[26009]],63935:[[27138]],63936:[[29134]],63937:[[30274]],63938:[[34044]],63939:[[36988]],63940:[[40845]],63941:[[26248]],63942:[[38446]],63943:[[21129]],63944:[[26491]],63945:[[26611]],63946:[[27969]],63947:[[28316]],63948:[[29705]],63949:[[30041]],63950:[[30827]],63951:[[32016]],63952:[[39006]],63953:[[20845]],63954:[[25134]],63955:[[38520]],63956:[[20523]],63957:[[23833]],63958:[[28138]],63959:[[36650]],63960:[[24459]],63961:[[24900]],63962:[[26647]],63963:[[29575]],63964:[[38534]],63965:[[21033]],63966:[[21519]],63967:[[23653]],63968:[[26131]],63969:[[26446]],63970:[[26792]],63971:[[27877]],63972:[[29702]],63973:[[30178]],63974:[[32633]],63975:[[35023]],63976:[[35041]],63977:[[37324]],63978:[[38626]],63979:[[21311]],63980:[[28346]],63981:[[21533]],63982:[[29136]],63983:[[29848]],63984:[[34298]],63985:[[38563]],63986:[[40023]],63987:[[40607]],63988:[[26519]],63989:[[28107]],63990:[[33256]],63991:[[31435]],63992:[[31520]],63993:[[31890]],63994:[[29376]],63995:[[28825]],63996:[[35672]],63997:[[20160]],63998:[[33590]],63999:[[21050]],194816:[[27966]],194817:[[28023]],194818:[[27969]],194819:[[28009]],194820:[[28024]],194821:[[28037]],194822:[[146718]],194823:[[27956]],194824:[[28207]],194825:[[28270]],194826:[[15667]],194827:[[28363]],194828:[[28359]],194829:[[147153]],194830:[[28153]],194831:[[28526]],194832:[[147294]],194833:[[147342]],194834:[[28614]],194835:[[28729]],194836:[[28702]],194837:[[28699]],194838:[[15766]],194839:[[28746]],194840:[[28797]],194841:[[28791]],194842:[[28845]],194843:[[132389]],194844:[[28997]],194845:[[148067]],194846:[[29084]],194847:[[148395]],194848:[[29224]],194849:[[29237]],194850:[[29264]],194851:[[149e3]],194852:[[29312]],194853:[[29333]],194854:[[149301]],194855:[[149524]],194856:[[29562]],194857:[[29579]],194858:[[16044]],194859:[[29605]],194860:[[16056]],194861:[[16056]],194862:[[29767]],194863:[[29788]],194864:[[29809]],194865:[[29829]],194866:[[29898]],194867:[[16155]],194868:[[29988]],194869:[[150582]],194870:[[30014]],194871:[[150674]],194872:[[30064]],194873:[[139679]],194874:[[30224]],194875:[[151457]],194876:[[151480]],194877:[[151620]],194878:[[16380]],194879:[[16392]],194880:[[30452]],194881:[[151795]],194882:[[151794]],194883:[[151833]],194884:[[151859]],194885:[[30494]],194886:[[30495]],194887:[[30495]],194888:[[30538]],194889:[[16441]],194890:[[30603]],194891:[[16454]],194892:[[16534]],194893:[[152605]],194894:[[30798]],194895:[[30860]],194896:[[30924]],194897:[[16611]],194898:[[153126]],194899:[[31062]],194900:[[153242]],194901:[[153285]],194902:[[31119]],194903:[[31211]],194904:[[16687]],194905:[[31296]],194906:[[31306]],194907:[[31311]],194908:[[153980]],194909:[[154279]],194910:[[154279]],194911:[[31470]],194912:[[16898]],194913:[[154539]],194914:[[31686]],194915:[[31689]],194916:[[16935]],194917:[[154752]],194918:[[31954]],194919:[[17056]],194920:[[31976]],194921:[[31971]],194922:[[32e3]],194923:[[155526]],194924:[[32099]],194925:[[17153]],194926:[[32199]],194927:[[32258]],194928:[[32325]],194929:[[17204]],194930:[[156200]],194931:[[156231]],194932:[[17241]],194933:[[156377]],194934:[[32634]],194935:[[156478]],194936:[[32661]],194937:[[32762]],194938:[[32773]],194939:[[156890]],194940:[[156963]],194941:[[32864]],194942:[[157096]],194943:[[32880]],194944:[[144223]],194945:[[17365]],194946:[[32946]],194947:[[33027]],194948:[[17419]],194949:[[33086]],194950:[[23221]],194951:[[157607]],194952:[[157621]],194953:[[144275]],194954:[[144284]],194955:[[33281]],194956:[[33284]],194957:[[36766]],194958:[[17515]],194959:[[33425]],194960:[[33419]],194961:[[33437]],194962:[[21171]],194963:[[33457]],194964:[[33459]],194965:[[33469]],194966:[[33510]],194967:[[158524]],194968:[[33509]],194969:[[33565]],194970:[[33635]],194971:[[33709]],194972:[[33571]],194973:[[33725]],194974:[[33767]],194975:[[33879]],194976:[[33619]],194977:[[33738]],194978:[[33740]],194979:[[33756]],194980:[[158774]],194981:[[159083]],194982:[[158933]],194983:[[17707]],194984:[[34033]],194985:[[34035]],194986:[[34070]],194987:[[160714]],194988:[[34148]],194989:[[159532]],194990:[[17757]],194991:[[17761]],194992:[[159665]],194993:[[159954]],194994:[[17771]],194995:[[34384]],194996:[[34396]],194997:[[34407]],194998:[[34409]],194999:[[34473]],195
70123000:[[34440]],195001:[[34574]],195002:[[34530]],195003:[[34681]],195004:[[34600]],195005:[[34667]],195006:[[34694]],195007:[[17879]],195008:[[34785]],195009:[[34817]],195010:[[17913]],195011:[[34912]],195012:[[34915]],195013:[[161383]],195014:[[35031]],195015:[[35038]],195016:[[17973]],195017:[[35066]],195018:[[13499]],195019:[[161966]],195020:[[162150]],195021:[[18110]],195022:[[18119]],195023:[[35488]],195024:[[35565]],195025:[[35722]],195026:[[35925]],195027:[[162984]],195028:[[36011]],195029:[[36033]],195030:[[36123]],195031:[[36215]],195032:[[163631]],195033:[[133124]],195034:[[36299]],195035:[[36284]],195036:[[36336]],195037:[[133342]],195038:[[36564]],195039:[[36664]],195040:[[165330]],195041:[[165357]],195042:[[37012]],195043:[[37105]],195044:[[37137]],195045:[[165678]],195046:[[37147]],195047:[[37432]],195048:[[37591]],195049:[[37592]],195050:[[37500]],195051:[[37881]],195052:[[37909]],195053:[[166906]],195054:[[38283]],195055:[[18837]],195056:[[38327]],195057:[[167287]],195058:[[18918]],195059:[[38595]],195060:[[23986]],195061:[[38691]],195062:[[168261]],195063:[[168474]],195064:[[19054]],195065:[[19062]],195066:[[38880]],195067:[[168970]],195068:[[19122]],195069:[[169110]],195070:[[38923]],195071:[[38923]]},64000:{64000
vendor: 27,897 bytes, line 70123
70123:[[20999]],64001:[[24230]],64002:[[25299]],64003:[[31958]],64004:[[23429]],64005:[[27934]],64006:[[26292]],64007:[[36667]],64008:[[34892]],64009:[[38477]],64010:[[35211]],64011:[[24275]],64012:[[20800]],64013:[[21952]],64016:[[22618]],64018:[[26228]],64021:[[20958]],64022:[[29482]],64023:[[30410]],64024:[[31036]],64025:[[31070]],64026:[[31077]],64027:[[31119]],64028:[[38742]],64029:[[31934]],64030:[[32701]],64032:[[34322]],64034:[[35576]],64037:[[36920]],64038:[[37117]],64042:[[39151]],64043:[[39164]],64044:[[39208]],64045:[[40372]],64046:[[37086]],64047:[[38583]],64048:[[20398]],64049:[[20711]],64050:[[20813]],64051:[[21193]],64052:[[21220]],64053:[[21329]],64054:[[21917]],64055:[[22022]],64056:[[22120]],64057:[[22592]],64058:[[22696]],64059:[[23652]],64060:[[23662]],64061:[[24724]],64062:[[24936]],64063:[[24974]],64064:[[25074]],64065:[[25935]],64066:[[26082]],64067:[[26257]],64068:[[26757]],64069:[[28023]],64070:[[28186]],64071:[[28450]],64072:[[29038]],64073:[[29227]],64074:[[29730]],64075:[[30865]],64076:[[31038]],64077:[[31049]],64078:[[31048]],64079:[[31056]],64080:[[31062]],64081:[[31069]],64082:[[31117]],64083:[[31118]],64084:[[31296]],64085:[[31361]],64086:[[31680]],64087:[[32244]],64088:[[32265]],64089:[[32321]],64090:[[32626]],64091:[[32773]],64092:[[33261]],64093:[[33401]],64094:[[33401]],64095:[[33879]],64096:[[35088]],64097:[[35222]],64098:[[35585]],64099:[[35641]],64100:[[36051]],64101:[[36104]],64102:[[36790]],64103:[[36920]],64104:[[38627]],64105:[[38911]],64106:[[38971]],64107:[[24693]],64108:[[148206]],64109:[[33304]],64112:[[20006]],64113:[[20917]],64114:[[20840]],64115:[[20352]],64116:[[20805]],64117:[[20864]],64118:[[21191]],64119:[[21242]],64120:[[21917]],64121:[[21845]],64122:[[21913]],64123:[[21986]],64124:[[22618]],64125:[[22707]],64126:[[22852]],64127:[[22868]],64128:[[23138]],64129:[[23336]],64130:[[24274]],64131:[[24281]],64132:[[24425]],64133:[[24493]],64134:[[24792]],64135:[[24910]],64136:[[24840]],64137:[[24974]],64138:[[24928]],64139:[[25074]],64140:[[25140]],64141:[[25540]],64142:[[25628]],64143:[[25682]],64144:[[25942]],64145:[[26228]],64146:[[26391]],64147:[[26395]],64148:[[26454]],64149:[[27513]],64150:[[27578]],64151:[[27969]],64152:[[28379]],64153:[[28363]],64154:[[28450]],64155:[[28702]],64156:[[29038]],64157:[[30631]],64158:[[29237]],64159:[[29359]],64160:[[29482]],64161:[[29809]],64162:[[29958]],64163:[[30011]],64164:[[30237]],64165:[[30239]],64166:[[30410]],64167:[[30427]],64168:[[30452]],64169:[[30538]],64170:[[30528]],64171:[[30924]],64172:[[31409]],64173:[[31680]],64174:[[31867]],64175:[[32091]],64176:[[32244]],64177:[[32574]],64178:[[32773]],64179:[[33618]],64180:[[33775]],64181:[[34681]],64182:[[35137]],64183:[[35206]],64184:[[35222]],64185:[[35519]],64186:[[35576]],64187:[[35531]],64188:[[35585]],64189:[[35582]],64190:[[35565]],64191:[[35641]],64192:[[35722]],64193:[[36104]],64194:[[36664]],64195:[[36978]],64196:[[37273]],64197:[[37494]],64198:[[38524]],64199:[[38627]],64200:[[38742]],64201:[[38875]],64202:[[38911]],64203:[[38923]],64204:[[38971]],64205:[[39698]],64206:[[40860]],64207:[[141386]],64208:[[141380]],64209:[[144341]],64210:[[15261]],64211:[[16408]],64212:[[16441]],64213:[[152137]],64214:[[154832]],64215:[[163539]],64216:[[40771]],64217:[[40846]],195072:[[38953]],195073:[[169398]],195074:[[39138]],195075:[[19251]],195076:[[39209]],195077:[[39335]],195078:[[39362]],195079:[[39422]],195080:[[19406]],195081:[[170800]],195082:[[39698]],195083:[[4e4]],195084:[[40189]],195085:[[19662]],195086:[[19693]],195087:[[40295]],195088:[[172238]],195089:[[19704]],195090:[[172293]],195091:[[172558]],195092:[[172689]],195093:[[40635]],195094:[[19798]],195095:[[40697]],195096:[[40702]],195097:[[40709]],195098:[[40719]],195099:[[40726]],195100:[[40763]],195101:[[173568]]},64256:{64256:[[102,102],256],64257:[[102,105],256],64258:[[102,108],256],64259:[[102,102,105],256],64260:[[102,102,108],256],64261:[[383,116],256],64262:[[115,116],256],64275:[[1396,1398],256],64276:[[1396,1381],256],64277:[[1396,1387],256],64278:[[1406,1398],256],64279:[[1396,1389],256],64285:[[1497,1460],512],64286:[,26],64287:[[1522,1463],512],64288:[[1506],256],64289:[[1488],256],64290:[[1491],256],64291:[[1492],256],64292:[[1499],256],64293:[[1500],256],64294:[[1501],256],64295:[[1512],256],64296:[[1514],256],64297:[[43],256],64298:[[1513,1473],512],64299:[[1513,1474],512],64300:[[64329,1473],512],64301:[[64329,1474],512],64302:[[1488,1463],512],64303:[[1488,1464],512],64304:[[1488,1468],512],64305:[[1489,1468],512],64306:[[1490,1468],512],64307:[[1491,1468],512],64308:[[1492,1468],512],64309:[[1493,1468],512],64310:[[1494,1468],512],64312:[[1496,1468],512],64313:[[1497,1468],512],64314:[[1498,1468],512],64315:[[1499,1468],512],64316:[[1500,1468],512],64318:[[1502,1468],512],64320:[[1504,1468],512],64321:[[1505,1468],512],64323:[[1507,1468],512],64324:[[1508,1468],512],64326:[[1510,1468],512],64327:[[1511,1468],512],64328:[[1512,1468],512],64329:[[1513,1468],512],64330:[[1514,1468],512],64331:[[1493,1465],512],64332:[[1489,1471],512],64333:[[1499,1471],512],64334:[[1508,1471],512],64335:[[1488,1500],256],64336:[[1649],256],64337:[[1649],256],64338:[[1659],256],64339:[[1659],256],64340:[[1659],256],64341:[[1659],256],64342:[[1662],256],64343:[[1662],256],64344:[[1662],256],64345:[[1662],256],64346:[[1664],256],64347:[[1664],256],64348:[[1664],256],64349:[[1664],256],64350:[[1658],256],64351:[[1658],256],64352:[[1658],256],64353:[[1658],256],64354:[[1663],256],64355:[[1663],256],64356:[[1663],256],64357:[[1663],256],64358:[[1657],256],64359:[[1657],256],64360:[[1657],256],64361:[[1657],256],64362:[[1700],256],64363:[[1700],256],64364:[[1700],256],64365:[[1700],256],64366:[[1702],256],64367:[[1702],256],64368:[[1702],256],64369:[[1702],256],64370:[[1668],256],64371:[[1668],256],64372:[[1668],256],64373:[[1668],256],64374:[[1667],256],64375:[[1667],256],64376:[[1667],256],64377:[[1667],256],64378:[[1670],256],64379:[[1670],256],64380:[[1670],256],64381:[[1670],256],64382:[[1671],256],64383:[[1671],256],64384:[[1671],256],64385:[[1671],256],64386:[[1677],256],64387:[[1677],256],64388:[[1676],256],64389:[[1676],256],64390:[[1678],256],64391:[[1678],256],64392:[[1672],256],64393:[[1672],256],64394:[[1688],256],64395:[[1688],256],64396:[[1681],256],64397:[[1681],256],64398:[[1705],256],64399:[[1705],256],64400:[[1705],256],64401:[[1705],256],64402:[[1711],256],64403:[[1711],256],64404:[[1711],256],64405:[[1711],256],64406:[[1715],256],64407:[[1715],256],64408:[[1715],256],64409:[[1715],256],64410:[[1713],256],64411:[[1713],256],64412:[[1713],256],64413:[[1713],256],64414:[[1722],256],64415:[[1722],256],64416:[[1723],256],64417:[[1723],256],64418:[[1723],256],64419:[[1723],256],64420:[[1728],256],64421:[[1728],256],64422:[[1729],256],64423:[[1729],256],64424:[[1729],256],64425:[[1729],256],64426:[[1726],256],64427:[[1726],256],64428:[[1726],256],64429:[[1726],256],64430:[[1746],256],64431:[[1746],256],64432:[[1747],256],64433:[[1747],256],64467:[[1709],256],64468:[[1709],256],64469:[[1709],256],64470:[[1709],256],64471:[[1735],256],64472:[[1735],256],64473:[[1734],256],64474:[[1734],256],64475:[[1736],256],64476:[[1736],256],64477:[[1655],256],64478:[[1739],256],64479:[[1739],256],64480:[[1733],256],64481:[[1733],256],64482:[[1737],256],64483:[[1737],256],64484:[[1744],256],64485:[[1744],256],64486:[[1744],256],64487:[[1744],256],64488:[[1609],256],64489:[[1609],256],64490:[[1574,1575],256],64491:[[1574,1575],256],64492:[[1574,1749],256],64493:[[1574,1749],256],64494:[[1574,1608],256],64495:[[1574,1608],256],64496:[[1574,1735],256],64497:[[1574,1735],256],64498:[[1574,1734],256],64499:[[1574,1734],256],64500:[[1574,1736],256],64501:[[1574,1736],256],64502:[[1574,1744],256],64503:[[1574,1744],256],64504:[[1574,1744],256],64505:[[1574,1609],256],64506:[[1574,1609],256],64507:[[1574,1609],256],64508:[[1740],256],64509:[[1740],256],64510:[[1740],256],64511:[[1740],256]},64512:{64512:[[1574,1580],256],64513:[[1574,1581],256],64514:[[1574,1605],256],64515:[[1574,1609],256],64516:[[1574,1610],256],64517:[[1576,1580],256],64518:[[1576,1581],256],64519:[[1576,1582],256],64520:[[1576,1605],256],64521:[[1576,1609],256],64522:[[1576,1610],256],64523:[[1578,1580],256],64524:[[1578,1581],256],64525:[[1578,1582],256],64526:[[1578,1605],256],64527:[[1578,1609],256],64528:[[1578,1610],256],64529:[[1579,1580],256],64530:[[1579,1605],256],64531:[[1579,1609],256],64532:[[1579,1610],256],64533:[[1580,1581],256],64534:[[1580,1605],256],64535:[[1581,1580],256],64536:[[1581,1605],256],64537:[[1582,1580],256],64538:[[1582,1581],256],64539:[[1582,1605],256],64540:[[1587,1580],256],64541:[[1587,1581],256],64542:[[1587,1582],256],64543:[[1587,1605],256],64544:[[1589,1581],256],64545:[[1589,1605],256],64546:[[1590,1580],256],64547:[[1590,1581],256],64548:[[1590,1582],256],64549:[[1590,1605],256],64550:[[1591,1581],256],64551:[[1591,1605],256],64552:[[1592,1605],256],64553:[[1593,1580],256],64554:[[1593,1605],256],64555:[[1594,1580],256],64556:[[1594,1605],256],64557:[[1601,1580],256],64558:[[1601,1581],256],64559:[[1601,1582],256],64560:[[1601,1605],256],64561:[[1601,1609],256],64562:[[1601,1610],256],64563:[[1602,1581],256],64564:[[1602,1605],256],64565:[[1602,1609],256],64566:[[1602,1610],256],64567:[[1603,1575],256],64568:[[1603,1580],256],64569:[[1603,1581],256],64570:[[1603,1582],256],64571:[[1603,1604],256],64572:[[1603,1605],256],64573:[[1603,1609],256],64574:[[1603,1610],256],64575:[[1604,1580],256],64576:[[1604,1581],256],64577:[[1604,1582],256],64578:[[1604,1605],256],64579:[[1604,1609],256],64580:[[1604,1610],256],64581:[[1605,1580],256],64582:[[1605,1581],256],64583:[[1605,1582],256],64584:[[1605,1605],256],64585:[[1605,1609],256],64586:[[1605,1610],256],64587:[[1606,1580],256],64588:[[1606,1581],256],64589:[[1606,1582],256],64590:[[1606,1605],256],64591:[[1606,1609],256],64592:[[1606,1610],256],64593:[[1607,1580],256],64594:[[1607,1605],256],64595:[[1607,1609],256],64596:[[1607,1610],256],64597:[[1610,1580],256],64598:[[1610,1581],256],64599:[[1610,1582],256],64600:[[1610,1605],256],64601:[[1610,1609],256],64602:[[1610,1610],256],64603:[[1584,1648],256],64604:[[1585,1648],256],64605:[[1609,1648],256],64606:[[32,1612,1617],256],64607:[[32,1613,1617],256],64608:[[32,1614,1617],256],64609:[[32,1615,1617],256],64610:[[32,1616,1617],256],64611:[[32,1617,1648],256],64612:[[1574,1585],256],64613:[[1574,1586],256],64614:[[1574,1605],256],64615:[[1574,1606],256],64616:[[1574,1609],256],64617:[[1574,1610],256],64618:[[1576,1585],256],64619:[[1576,1586],256],64620:[[1576,1605],256],64621:[[1576,1606],256],64622:[[1576,1609],256],64623:[[1576,1610],256],64624:[[1578,1585],256],64625:[[1578,1586],256],64626:[[1578,1605],256],64627:[[1578,1606],256],64628:[[1578,1609],256],64629:[[1578,1610],256],64630:[[1579,1585],256],64631:[[1579,1586],256],64632:[[1579,1605],256],64633:[[1579,1606],256],64634:[[1579,1609],256],64635:[[1579,1610],256],64636:[[1601,1609],256],64637:[[1601,1610],256],64638:[[1602,1609],256],64639:[[1602,1610],256],64640:[[1603,1575],256],64641:[[1603,1604],256],64642:[[1603,1605],256],64643:[[1603,1609],256],64644:[[1603,1610],256],64645:[[1604,1605],256],64646:[[1604,1609],256],64647:[[1604,1610],256],64648:[[1605,1575],256],64649:[[1605,1605],256],64650:[[1606,1585],256],64651:[[1606,1586],256],64652:[[1606,1605],256],64653:[[1606,1606],256],64654:[[1606,1609],256],64655:[[1606,1610],256],64656:[[1609,1648],256],64657:[[1610,1585],256],64658:[[1610,1586],256],64659:[[1610,1605],256],64660:[[1610,1606],256],64661:[[1610,1609],256],64662:[[1610,1610],256],64663:[[1574,1580],256],64664:[[1574,1581],256],64665:[[1574,1582],256],64666:[[1574,1605],256],64667:[[1574,1607],256],64668:[[1576,1580],256],64669:[[1576,1581],256],64670:[[1576,1582],256],64671:[[1576,1605],256],64672:[[1576,1607],256],64673:[[1578,1580],256],64674:[[1578,1581],256],64675:[[1578,1582],256],64676:[[1578,1605],256],64677:[[1578,1607],256],64678:[[1579,1605],256],64679:[[1580,1581],256],64680:[[1580,1605],256],64681:[[1581,1580],256],64682:[[1581,1605],256],64683:[[1582,1580],256],64684:[[1582,1605],256],64685:[[1587,1580],256],64686:[[1587,1581],256],64687:[[1587,1582],256],64688:[[1587,1605],256],64689:[[1589,1581],256],64690:[[1589,1582],256],64691:[[1589,1605],256],64692:[[1590,1580],256],64693:[[1590,1581],256],64694:[[1590,1582],256],64695:[[1590,1605],256],64696:[[1591,1581],256],64697:[[1592,1605],256],64698:[[1593,1580],256],64699:[[1593,1605],256],64700:[[1594,1580],256],64701:[[1594,1605],256],64702:[[1601,1580],256],64703:[[1601,1581],256],64704:[[1601,1582],256],64705:[[1601,1605],256],64706:[[1602,1581],256],64707:[[1602,1605],256],64708:[[1603,1580],256],64709:[[1603,1581],256],64710:[[1603,1582],256],64711:[[1603,1604],256],64712:[[1603,1605],256],64713:[[1604,1580],256],64714:[[1604,1581],256],64715:[[1604,1582],256],64716:[[1604,1605],256],64717:[[1604,1607],256],64718:[[1605,1580],256],64719:[[1605,1581],256],64720:[[1605,1582],256],64721:[[1605,1605],256],64722:[[1606,1580],256],64723:[[1606,1581],256],64724:[[1606,1582],256],64725:[[1606,1605],256],64726:[[1606,1607],256],64727:[[1607,1580],256],64728:[[1607,1605],256],64729:[[1607,1648],256],64730:[[1610,1580],256],64731:[[1610,1581],256],64732:[[1610,1582],256],64733:[[1610,1605],256],64734:[[1610,1607],256],64735:[[1574,1605],256],64736:[[1574,1607],256],64737:[[1576,1605],256],64738:[[1576,1607],256],64739:[[1578,1605],256],64740:[[1578,1607],256],64741:[[1579,1605],256],64742:[[1579,1607],256],64743:[[1587,1605],256],64744:[[1587,1607],256],64745:[[1588,1605],256],64746:[[1588,1607],256],64747:[[1603,1604],256],64748:[[1603,1605],256],64749:[[1604,1605],256],64750:[[1606,1605],256],64751:[[1606,1607],256],64752:[[1610,1605],256],64753:[[1610,1607],256],64754:[[1600,1614,1617],256],64755:[[1600,1615,1617],256],64756:[[1600,1616,1617],256],64757:[[1591,1609],256],64758:[[1591,1610],256],64759:[[1593,1609],256],64760:[[1593,1610],256],64761:[[1594,1609],256],64762:[[1594,1610],256],64763:[[1587,1609],256],64764:[[1587,1610],256],64765:[[1588,1609],256],64766:[[1588,1610],256],64767:[[1581,1609],256]},64768:{64768:[[1581,1610],256],64769:[[1580,1609],256],64770:[[1580,1610],256],64771:[[1582,1609],256],64772:[[1582,1610],256],64773:[[1589,1609],256],64774:[[1589,1610],256],64775:[[1590,1609],256],64776:[[1590,1610],256],64777:[[1588,1580],256],64778:[[1588,1581],256],64779:[[1588,1582],256],64780:[[1588,1605],256],64781:[[1588,1585],256],64782:[[1587,1585],256],64783:[[1589,1585],256],64784:[[1590,1585],256],64785:[[1591,1609],256],64786:[[1591,1610],256],64787:[[1593,1609],256],64788:[[1593,1610],256],64789:[[1594,1609],256],64790:[[1594,1610],256],64791:[[1587,1609],256],64792:[[1587,1610],256],64793:[[1588,1609],256],64794:[[1588,1610],256],64795:[[1581,1609],256],64796:[[1581,1610],256],64797:[[1580,1609],256],64798:[[1580,1610],256],64799:[[1582,1609],256],64800:[[1582,1610],256],64801:[[1589,1609],256],64802:[[1589,1610],256],64803:[[1590,1609],256],64804:[[1590,1610],256],64805:[[1588,1580],256],64806:[[1588,1581],256],64807:[[1588,1582],256],64808:[[1588,1605],256],64809:[[1588,1585],256],64810:[[1587,1585],256],64811:[[1589,1585],256],64812:[[1590,1585],256],64813:[[1588,1580],256],64814:[[1588,1581],256],64815:[[1588,1582],256],64816:[[1588,1605],256],64817:[[1587,1607],256],64818:[[1588,1607],256],64819:[[1591,1605],256],64820:[[1587,1580],256],64821:[[1587,1581],256],64822:[[1587,1582],256],64823:[[1588,1580],256],64824:[[1588,1581],256],64825:[[1588,1582],256],64826:[[1591,1605],256],64827:[[1592,1605],256],64828:[[1575,1611],256],64829:[[1575,1611],256],64848:[[1578,1580,1605],256],64849:[[1578,1581,1580],256],64850:[[1578,1581,1580],256],64851:[[1578,1581,1605],256],64852:[[1578,1582,1605],256],64853:[[1578,1605,1580],256],64854:[[1578,1605,1581],256],64855:[[1578,1605,1582],256],64856:[[1580,1605,1581],256],64857:[[1580,1605,1581],256],64858:[[1581,1605,1610],256],64859:[[1581,1605,1609],256],64860:[[1587,1581,1580],256],64861:[[1587,1580,1581],256],64862:[[1587,1580,1609],256],64863:[[1587,1605,1581],256],64864:[[1587,1605,1581],256],64865:[[1587,1605,1580],256],64866:[[1587,1605,1605],256],64867:[[1587,1605,1605],256],64868:[[1589,1581,1581],256],64869:[[1589,1581,1581],256],64870:[[1589,1605,1605],256],64871:[[1588,1581,1605],256],64872:[[1588,1581,1605],256],64873:[[1588,1580,1610],256],64874:[[1588,1605,1582],256],64875:[[1588,1605,1582],256],64876:[[1588,1605,1605],256],64877:[[1588,1605,1605],256],64878:[[1590,1581,1609],256],64879:[[1590,1582,1605],256],64880:[[1590,1582,1605],256],64881:[[1591,1605,1581],256],64882:[[1591,1605,1581],256],64883:[[1591,1605,1605],256],64884:[[1591,1605,1610],256],64885:[[1593,1580,1605],256],64886:[[1593,1605,1605],256],64887:[[1593,1605,1605],256],64888:[[1593,1605,1609],256],64889:[[1594,1605,1605],256],64890:[[1594,1605,1610],256],64891:[[1594,1605,1609],256],64892:[[1601,1582,1605],256],64893:[[1601,1582,1605],256],64894:[[1602,1605,1581],256],64895:[[1602,1605,1605],256],64896:[[1604,1581,1605],256],64897:[[1604,1581,1610],256],64898:[[1604,1581,1609],256],64899:[[1604,1580,1580],256],64900:[[1604,1580,1580],256],64901:[[1604,1582,1605],256],64902:[[1604,1582,1605],256],64903:[[1604,1605,1581],256],64904:[[1604,1605,1581],256],64905:[[1605,1581,1580],256],64906:[[1605,1581,1605],256],64907:[[1605,1581,1610],256],64908:[[1605,1580,1581],256],64909:[[1605,1580,1605],256],64910:[[1605,1582,1580],256],64911:[[1605,1582,1605],256],64914:[[1605,1580,1582],256],64915:[[1607,1605,1580],256],64916:[[1607,1605,1605],256],64917:[[1606,1581,1605],256],64918:[[1606,1581,1609],256],64919:[[1606,1580,1605],256],64920:[[1606,1580,1605],256],64921:[[1606,1580,1609],256],64922:[[1606,1605,1610],256],64923:[[1606,1605,1609],256],64924:[[1610,1605,1605],256],64925:[[1610,1605,1605],256],64926:[[1576,1582,1610],256],64927:[[1578,1580,1610],256],64928:[[1578,1580,1609],256],64929:[[1578,1582,1610],256],64930:[[1578,1582,1609],256],64931:[[1578,1605,1610],256],64932:[[1578,1605,1609],256],64933:[[1580,1605,1610],256],64934:[[1580,1581,1609],256],64935:[[1580,1605,1609],256],64936:[[1587,1582,1609],256],64937:[[1589,1581,1610],256],64938:[[1588,1581,1610],256],64939:[[1590,1581,1610],256],64940:[[1604,1580,1610],256],64941:[[1604,1605,1610],256],64942:[[1610,1581,1610],256],64943:[[1610,1580,1610],256],64944:[[1610,1605,1610],256],64945:[[1605,1605,1610],256],64946:[[1602,1605,1610],256],64947:[[1606,1581,1610],256],64948:[[1602,1605,1581],256],64949:[[1604,1581,1605],256],64950:[[1593,1605,1610],256],64951:[[1603,1605,1610],256],64952:[[1606,1580,1581],256],64953:[[1605,1582,1610],256],64954:[[1604,1580,1605],256],64955:[[1603,1605,1605],256],64956:[[1604,1580,1605],256],64957:[[1606,1580,1581],256],64958:[[1580,1581,1610],256],64959:[[1581,1580,1610],256],64960:[[1605,1580,1610],256],64961:[[1601,1605,1610],256],64962:[[1576,1581,1610],256],64963:[[1603,1605,1605],256],64964:[[1593,1580,1605],256],64965:[[1589,1605,1605],256],64966:[[1587,1582,1610],256],64967:[[1606,1580,1610],256],65008:[[1589,1604,1746],256],65009:[[1602,1604,1746],256],65010:[[1575,1604,1604,1607],256],65011:[[1575,1603,1576,1585],256],65012:[[1605,1581,1605,1583],256],65013:[[1589,1604,1593,1605],256],65014:[[1585,1587,1608,1604],256],65015:[[1593,1604,1610,1607],256],65016:[[1608,1587,1604,1605],256],65017:[[1589,1604,1609],256],65018:[[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605],256],65019:[[1580,1604,32,1580,1604,1575,1604,1607],256],65020:[[1585,1740,1575,1604],256]},65024:{65040:[[44],256],65041:[[12289],256],65042:[[12290],256],65043:[[58],256],65044:[[59],256],65045:[[33],256],65046:[[63],256],65047:[[12310],256],65048:[[12311],256],65049:[[8230],256],65056:[,230],65057:[,230],65058:[,230],65059:[,230],65060:[,230],65061:[,230],65062:[,230],65063:[,220],65064:[,220],65065:[,220],65066:[,220],65067:[,220],65068:[,220],65069:[,220],65072:[[8229],256],65073:[[8212],256],65074:[[8211],256],65075:[[95],256],65076:[[95],256],65077:[[40],256],65078:[[41],256],65079:[[123],256],65080:[[125],256],65081:[[12308],256],65082:[[12309],256],65083:[[12304],256],65084:[[12305],256],65085:[[12298],256],65086:[[12299],256],65087:[[12296],256],65088:[[12297],256],65089:[[12300],256],65090:[[12301],256],65091:[[12302],256],65092:[[12303],256],65095:[[91],256],65096:[[93],256],65097:[[8254],256],65098:[[8254],256],65099:[[8254],256],65100:[[8254],256],65101:[[95],256],65102:[[95],256],65103:[[95],256],65104:[[44],256],65105:[[12289],256],65106:[[46],256],65108:[[59],256],65109:[[58],256],65110:[[63],256],65111:[[33],256],65112:[[8212],256],65113:[[40],256],65114:[[41],256],65115:[[123],256],65116:[[125],256],65117:[[12308],256],65118:[[12309],256],65119:[[35],256],65120:[[38],256],65121:[[42],256],65122:[[43],256],65123:[[45],256],65124:[[60],256],65125:[[62],256],65126:[[61],256],65128:[[92],256],65129:[[36],256],65130:[[37],256],65131:[[64],256],65136:[[32,1611],256],65137:[[1600,1611],256],65138:[[32,1612],256],65140:[[32,1613],256],65142:[[32,1614],256],65143:[[1600,1614],256],65144:[[32,1615],256],65145:[[1600,1615],256],65146:[[32,1616],256],65147:[[1600,1616],256],65148:[[32,1617],256],65149:[[1600,1617],256],65150:[[32,1618],256],65151:[[1600,1618],256],65152:[[1569],256],65153:[[1570],256],65154:[[1570],256],65155:[[1571],256],65156:[[1571],256],65157:[[1572],256],65158:[[1572],256],65159:[[1573],256],65160:[[1573],256],65161:[[1574],256],65162:[[1574],256],65163:[[1574],256],65164:[[1574],256],65165:[[1575],256],65166:[[1575],256],65167:[[1576],256],65168:[[1576],256],65169:[[1576],256],65170:[[1576],256],65171:[[1577],256],65172:[[1577],256],65173:[[1578],256],65174:[[1578],256],65175:[[1578],256],65176:[[1578],256],65177:[[1579],256],65178:[[1579],256],65179:[[1579],256],65180:[[1579],256],65181:[[1580],256],65182:[[1580],256],65183:[[1580],256],65184:[[1580],256],65185:[[1581],256],65186:[[1581],256],65187:[[1581],256],65188:[[1581],256],65189:[[1582],256],65190:[[1582],256],65191:[[1582],256],65192:[[1582],256],65193:[[1583],256],65194:[[1583],256],65195:[[1584],256],65196:[[1584],256],65197:[[1585],256],65198:[[1585],256],65199:[[1586],256],65200:[[1586],256],65201:[[1587],256],65202:[[1587],256],65203:[[1587],256],65204:[[1587],256],65205:[[1588],256],65206:[[1588],256],65207:[[1588],256],65208:[[1588],256],65209:[[1589],256],65210:[[1589],256],65211:[[1589],256],65212:[[1589],256],65213:[[1590],256],65214:[[1590],256],65215:[[1590],256],65216:[[1590],256],65217:[[1591],256],65218:[[1591],256],65219:[[1591],256],65220:[[1591],256],65221:[[1592],256],65222:[[1592],256],65223:[[1592],256],65224:[[1592],256],65225:[[1593],256],65226:[[1593],256],65227:[[1593],256],65228:[[1593],256],65229:[[1594],256],65230:[[1594],256],65231:[[1594],256],65232:[[1594],256],65233:[[1601],256],65234:[[1601],256],65235:[[1601],256],65236:[[1601],256],65237:[[1602],256],65238:[[1602],256],65239:[[1602],256],65240:[[1602],256],65241:[[1603],256],65242:[[1603],256],65243:[[1603],256],65244:[[1603],256],65245:[[1604],256],65246:[[1604],256],65247:[[1604],256],65248:[[1604],256],65249:[[1605],256],65250:[[1605],256],65251:[[1605],256],65252:[[1605],256],65253:[[1606],256],65254:[[1606],256],65255:[[1606],256],65256:[[1606],256],65257:[[1607],256],65258:[[1607],256],65259:[[1607],256],65260:[[1607],256],65261:[[1608],256],65262:[[1608],256],65263:[[1609],256],65264:[[1609],256],65265:[[1610],256],65266:[[1610],256],65267:[[1610],256],65268:[[1610],256],65269:[[1604,1570],256],65270:[[1604,1570],256],65271:[[1604,1571],256],65272:[[1604,1571],256],65273:[[1604,1573],256],65274:[[1604,1573],256],65275:[[1604,1575],256],65276:[[1604,1575],256]},65280:{65281:[[33],256],65282:[[34],256],65283:[[35],256],65284:[[36],256],65285:[[37],256],65286:[[38],256],65287:[[39],256],65288:[[40],256],65289:[[41],256],65290:[[42],256],65291:[[43],256],65292:[[44],256],65293:[[45],256],65294:[[46],256],65295:[[47],256],65296:[[48],256],65297:[[49],256],65298:[[50],256],65299:[[51],256],65300:[[52],256],65301:[[53],256],65302:[[54],256],65303:[[55],256],65304:[[56],256],65305:[[57],256],65306:[[58],256],65307:[[59],256],65308:[[60],256],65309:[[61],256],65310:[[62],256],65311:[[63],256],65312:[[64],256],65313:[[65],256],65314:[[66],256],65315:[[67],256],65316:[[68],256],65317:[[69],256],65318:[[70],256],65319:[[71],256],65320:[[72],256],65321:[[73],256],65322:[[74],256],65323:[[75],256],65324:[[76],256],65325:[[77],256],65326:[[78],256],65327:[[79],256],65328:[[80],256],65329:[[81],256],65330:[[82],256],65331:[[83],256],65332:[[84],256],65333:[[85],256],65334:[[86],256],65335:[[87],256],65336:[[88],256],65337:[[89],256],65338:[[90],256],65339:[[91],256],65340:[[92],256],65341:[[93],256],65342:[[94],256],65343:[[95],256],65344:[[96],256],65345:[[97],256],65346:[[98],256],65347:[[99],256],65348:[[100],256],65349:[[101],256],65350:[[102],256],65351:[[103],256],65352:[[104],256],65353:[[105],256],65354:[[106],256],65355:[[107],256],65356:[[108],256],65357:[[109],256],65358:[[110],256],65359:[[111],256],65360:[[112],256],65361:[[113],256],65362:[[114],256],65363:[[115],256],65364:[[116],256],65365:[[117],256],65366:[[118],256],65367:[[119],256],65368:[[120],256],65369:[[121],256],65370:[[122],256],65371:[[123],256],65372:[[124],256],65373:[[125],256],65374:[[126],256],65375:[[10629],256],65376:[[10630],256],65377:[[12290],256],65378:[[12300],256],65379:[[12301],256],65380:[[12289],256],65381:[[12539],256],65382:[[12530],256],65383:[[12449],256],65384:[[12451],256],65385:[[12453],256],65386:[[12455],256],65387:[[12457],256],65388:[[12515],256],65389:[[12517],256],65390:[[12519],256],65391:[[12483],256],65392:[[12540],256],65393:[[12450],256],65394:[[12452],256],65395:[[12454],256],65396:[[12456],256],65397:[[12458],256],65398:[[12459],256],65399:[[12461],256],65400:[[12463],256],65401:[[12465],256],65402:[[12467],256],65403:[[12469],256],65404:[[12471],256],65405:[[12473],256],65406:[[12475],256],65407:[[12477],256],65408:[[12479],256],65409:[[12481],256],65410:[[12484],256],65411:[[12486],256],65412:[[12488],256],65413:[[12490],256],65414:[[12491],256],65415:[[12492],256],65416:[[12493],256],65417:[[12494],256],65418:[[12495],256],65419:[[12498],256],65420:[[12501],256],65421:[[12504],256],65422:[[12507],256],65423:[[12510],256],65424:[[12511],256],65425:[[12512],256],65426:[[12513],256],65427:[[12514],256],65428:[[12516],256],65429:[[12518],256],65430:[[12520],256],65431:[[12521],256],65432:[[12522],256],65433:[[12523],256],65434:[[12524],256],65435:[[12525],256],65436:[[12527],256],65437:[[12531],256],65438:[[12441],256],65439:[[12442],256],65440:[[12644],256],65441:[[12593],256],65442:[[12594],256],65443:[[12595],256],65444:[[12596],256],65445:[[12597],256],65446:[[12598],256],65447:[[12599],256],65448:[[12600],256],65449:[[12601],256],65450:[[12602],256],65451:[[12603],256],65452:[[12604],256],65453:[[12605],256],65454:[[12606],256],65455:[[12607],256],65456:[[12608],256],65457:[[12609],256],65458:[[12610],256],65459:[[12611],256],65460:[[12612],256],65461:[[12613],256],65462:[[12614],256],65463:[[12615],256],65464:[[12616],256],65465:[[12617],256],65466:[[12618],256],65467:[[12619],256],65468:[[12620],256],65469:[[12621],256],65470:[[12622],256],65474:[[12623],256],65475:[[12624],256],65476:[[12625],256],65477:[[12626],256],65478:[[12627],256],65479:[[12628],256],65482:[[12629],256],65483:[[12630],256],65484:[[12631],256],65485:[[12632],256],65486:[[12633],256],65487:[[12634],256],65490:[[12635],256],65491:[[12636],256],65492:[[12637],256],65493:[[12638],256],65494:[[12639],256],65495:[[12640],256],65498:[[12641],256],65499:[[12642],256],65500:[[12643],256],65504:[[162],256],65505:[[163],256],65506:[[172],256],65507:[[175],256],65508:[[166],256],65509:[[165],256],65510:[[8361],256],65512:[[9474],256],65513:[[8592],256],65514:[[8593],256],65515:[[8594],256],65516:[[8595],256],65517:[[9632],256],65518:[[9675],256]}};var 
70123F={nfc:function(t){return y("NFC",t)},nfd:function(t){return y("NFD",t)},nfkc:function(t){return y("NFKC",t)},nfkd:function(t){return y("NFKD",t)}};"object"==typeof module?module.exports=F:"function"==typeof define&&define.amd?define("unorm",function(){return F}
vendor: 528 bytes, lines 70123-70124
70123):t.unorm=F,F.shimApplied=!1,String.prototype.normalize||(Object.defineProperty(String.prototype,"normalize",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=""+this,r=void 0===arguments[0]?"NFC":arguments[0];if(null==this)throw new TypeError("Cannot call method on "+Object.prototype.toString.call(this));if("NFC"===r)return F.nfc(t);if("NFD"===r)return F.nfd(t);if("NFKC"===r)return F.nfkc(t);if("NFKD"===r)return F.nfkd(t);throw new RangeError("Invalid normalization form: "+r)}}),F.shimApplied=!0)}(this);
70124

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